// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2016 Nexell Co., Ltd. * * Author: junghyun, kim */ #include #include #include "s5pxx18_soc_disptop.h" static struct { struct nx_disp_top_register_set *pregister; } __g_module_variables = { NULL, }; int nx_disp_top_initialize(void) { static int binit; u32 i; if (binit == 0) { for (i = 0; i < NUMBER_OF_DISPTOP_MODULE; i++) __g_module_variables.pregister = NULL; binit = 1; } return 1; } u32 nx_disp_top_get_number_of_module(void) { return NUMBER_OF_DISPTOP_MODULE; } u32 nx_disp_top_get_physical_address(void) { static const u32 physical_addr[] = PHY_BASEADDR_DISPTOP_LIST; return (u32)(physical_addr[0] + PHY_BASEADDR_DISPLAYTOP_MODULE_OFFSET); } u32 nx_disp_top_get_size_of_register_set(void) { return sizeof(struct nx_disp_top_register_set); } void nx_disp_top_set_base_address(void *base_address) { __g_module_variables.pregister = (struct nx_disp_top_register_set *)base_address; } void *nx_disp_top_get_base_address(void) { return (void *)__g_module_variables.pregister; } void nx_disp_top_set_resconvmux(int benb, u32 sel) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = (benb << 31) | (sel << 0); writel((u32)regvalue, &pregister->resconv_mux_ctrl); } void nx_disp_top_set_hdmimux(int benb, u32 sel) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = (benb << 31) | (sel << 0); writel((u32)regvalue, &pregister->interconv_mux_ctrl); } void nx_disp_top_set_mipimux(int benb, u32 sel) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = (benb << 31) | (sel << 0); writel((u32)regvalue, &pregister->mipi_mux_ctrl); } void nx_disp_top_set_lvdsmux(int benb, u32 sel) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = (benb << 31) | (sel << 0); writel((u32)regvalue, &pregister->lvds_mux_ctrl); } void nx_disp_top_set_primary_mux(u32 sel) { register struct nx_disp_top_register_set *pregister; pregister = __g_module_variables.pregister; writel((u32)sel, &pregister->tftmpu_mux); } void nx_disp_top_hdmi_set_vsync_start(u32 sel) { register struct nx_disp_top_register_set *pregister; pregister = __g_module_variables.pregister; writel((u32)sel, &pregister->hdmisyncctrl0); } void nx_disp_top_hdmi_set_vsync_hsstart_end(u32 start, u32 end) { register struct nx_disp_top_register_set *pregister; pregister = __g_module_variables.pregister; writel((u32)(end << 16) | (start << 0), &pregister->hdmisyncctrl3); } void nx_disp_top_hdmi_set_hactive_start(u32 sel) { register struct nx_disp_top_register_set *pregister; pregister = __g_module_variables.pregister; writel((u32)sel, &pregister->hdmisyncctrl1); } void nx_disp_top_hdmi_set_hactive_end(u32 sel) { register struct nx_disp_top_register_set *pregister; pregister = __g_module_variables.pregister; writel((u32)sel, &pregister->hdmisyncctrl2); } void nx_disp_top_set_hdmifield(u32 enable, u32 init_val, u32 vsynctoggle, u32 hsynctoggle, u32 vsyncclr, u32 hsyncclr, u32 field_use, u32 muxsel) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = ((enable & 0x01) << 0) | ((init_val & 0x01) << 1) | ((vsynctoggle & 0x3fff) << 2) | ((hsynctoggle & 0x3fff) << 17); writel(regvalue, &pregister->hdmifieldctrl); regvalue = ((field_use & 0x01) << 31) | ((muxsel & 0x01) << 30) | ((hsyncclr) << 15) | ((vsyncclr) << 0); writel(regvalue, &pregister->greg0); } void nx_disp_top_set_padclock(u32 mux_index, u32 padclk_cfg) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = readl(&pregister->greg1); if (padmux_secondary_mlc == mux_index) { regvalue = regvalue & (~(0x7 << 3)); regvalue = regvalue | (padclk_cfg << 3); } else if (padmux_resolution_conv == mux_index) { regvalue = regvalue & (~(0x7 << 6)); regvalue = regvalue | (padclk_cfg << 6); } else { regvalue = regvalue & (~(0x7 << 0)); regvalue = regvalue | (padclk_cfg << 0); } writel(regvalue, &pregister->greg1); } void nx_disp_top_set_lcdif_enb(int enb) { register struct nx_disp_top_register_set *pregister; u32 regvalue; pregister = __g_module_variables.pregister; regvalue = readl(&pregister->greg1); regvalue = regvalue & (~(0x1 << 9)); regvalue = regvalue | ((enb & 0x1) << 9); writel(regvalue, &pregister->greg1); }