mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-28 05:53:54 +00:00
af65f28a3a
Low level functions for DisplayTop (Display Topology). Signed-off-by: Stefan Bosch <stefan_b@posteo.net>
185 lines
4.6 KiB
C
185 lines
4.6 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2016 Nexell Co., Ltd.
|
|
*
|
|
* Author: junghyun, kim <jhkim@nexell.co.kr>
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/io.h>
|
|
|
|
#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);
|
|
}
|