/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/kernel.h>
#include <linux/string.h>
#include <asm/io.h>
#include <mach/io.h>
#include <linux/rk_screen.h>
#include "rk2928_lvds.h"

static void rk_output_lvds(rk_screen *screen)
{
	LVDSWrReg(m_PDN_CBG(1)|m_PD_PLL(0)|m_PDN(1)|m_OEN(0) 	\
					|m_DS(DS_10PF)|m_MSBSEL(DATA_D0_MSB) 	\
					|m_OUT_FORMAT(screen->lvds_format) 		\
					|m_LCDC_SEL(screen->lcdc_id));

       printk("%s>>connect to lcdc output interface%d\n",__func__,screen->lcdc_id);
}

static void rk_output_lvttl(rk_screen *screen)
{
	LVDSWrReg(m_PDN_CBG(0)|m_PD_PLL(1)|m_PDN(0)|m_OEN(1) 	\
					|m_DS(DS_10PF)|m_MSBSEL(DATA_D0_MSB) 	\
					|m_OUT_FORMAT(screen->lvds_format) 		\
					|m_LCDC_SEL(screen->lcdc_id));
        printk("%s>>connect to lcdc output interface%d\n",__func__,screen->lcdc_id);
}

static void rk_output_disable(void)
{
	LVDSWrReg(m_PDN_CBG(0)|m_PD_PLL(1)|m_PDN(0)|m_OEN(0));
        printk("%s: reg = 0x%x\n",  __func__, LVDSRdReg());
}

static int rk_lvds_set_param(rk_screen *screen,bool enable )
{
	if(OUT_ENABLE == enable){
		switch(screen->type){
			case SCREEN_LVDS:
					rk_output_lvds(screen);
                                        
					break;
			case SCREEN_RGB:
					rk_output_lvttl(screen);
					break;
			default:
				printk("%s>>>>LVDS not support this screen type %d,power down LVDS\n",__func__,screen->type);
					rk_output_disable();
					break;
		}
	}else{
		rk_output_disable();
	}
	return 0;
}

int rk_lvds_register(rk_screen *screen)
{
	if(screen->sscreen_set == NULL)
		screen->sscreen_set = rk_lvds_set_param;

	rk_lvds_set_param(screen , OUT_ENABLE);

	return 0;
}