1 #include <linux/kernel.h>
2 #include <linux/init.h>
3 #include <linux/platform_device.h>
4 #include <linux/slab.h>
6 #include <linux/types.h>
8 #include <linux/rk_fb.h>
10 #include <linux/delay.h>
12 #include <mach/board.h>
13 #include <mach/hardware.h>
15 #include <mach/gpio.h>
16 #include <mach/iomux.h>
18 #include "rk3026_lvds.h"
20 #define lvds_readl(offset) readl_relaxed(RK30_GRF_BASE + offset)
21 #define lvds_writel(v,offset) do{ writel_relaxed(v, RK30_GRF_BASE + offset);dsb();} while (0)
23 static void rk3026_output_lvds(rk_screen *screen)
27 #if defined(CONFIG_LCDC0_RK3188)
28 val |= LVDS_DATA_SEL(0);
30 val |= LVDS_DATA_SEL(1);
33 if(screen->lvds_format == 0 || screen->lvds_format == 1)
34 val |= LVDS_CBS_COL_SEL(2); //24bit lvds
36 val |= LVDS_CBS_COL_SEL(1); //16bit lvds
38 val |= ((LVDS_OUTPUT_FORMAT(screen->lvds_format))|LVDS_INPUT_FORMAT(1)|LVDS_OUTPUT_LOAD_SEL(0)|
39 LVDS_CBG_PWD_EN(1)|LVDS_PLL_PWD_EN(0)|LVDS_OUTPUT_EN(0)|LVDS_SWING_SEL(0));
41 val |= ((m_DATA_SEL|m_CBS_COL_SEL|m_OUTPUT_FORMAT|m_INPUT_FORMAT|m_OUTPUT_LOAD_SEL|
42 m_CBG_PWD_EN|m_PLL_PWD_EN|m_OUTPUT_EN|m_SWING_SEL)<<16);
44 lvds_writel(val,CRU_LVDS_CON0);
49 static void rk3026_output_lvttl(rk_screen *screen)
54 val |= (LVDS_CBG_PWD_EN(0)|LVDS_PLL_PWD_EN(1)|LVDS_OUTPUT_EN(1));
55 val |= ((m_CBG_PWD_EN|m_PLL_PWD_EN|m_OUTPUT_EN)<<16);
57 lvds_writel(val,CRU_LVDS_CON0);
62 static void rk3026_output_disable(void)
67 val |= (LVDS_CBG_PWD_EN(1)|LVDS_PLL_PWD_EN(0)|LVDS_OUTPUT_EN(0)|LVDS_CBS_COL_SEL(0));
68 val |= ((m_CBG_PWD_EN|m_PLL_PWD_EN|m_OUTPUT_EN|m_CBS_COL_SEL)<<16);
70 lvds_writel(val,CRU_LVDS_CON0);
75 static int rk3026_lvds_set_param(rk_screen *screen,bool enable)
78 if(OUT_ENABLE == enable){
81 rk3026_output_lvds(screen);
84 rk3026_output_lvttl(screen);
87 printk("%s>>>>LVDS not support this screen type %d,power down LVDS\n",__func__,screen->type);
88 rk3026_output_disable();
92 rk3026_output_disable();
98 static int rk3026_lvds_probe(struct platform_device *pdev)
100 rk_screen *screen = NULL;
101 screen = rk_fb_get_prmry_screen();
104 dev_err(&pdev->dev,"the fb prmry screen is null!\n");
108 rk3026_lvds_set_param(screen,OUT_ENABLE);
114 static int rk3026_lvds_remove(struct platform_device *pdev)
119 static void rk3026_lvds_shutdown(struct platform_device *pdev)
124 static struct platform_driver rk3026_lvds_driver = {
126 .name = "rk3026-lvds",
127 .owner = THIS_MODULE,
129 .probe = rk3026_lvds_probe,
130 .remove = rk3026_lvds_remove,
131 .shutdown = rk3026_lvds_shutdown,
134 static int __init rk3026_lvds_init(void)
136 return platform_driver_register(&rk3026_lvds_driver);
138 fs_initcall(rk3026_lvds_init);
139 static void __exit rk3026_lvds_exit(void)
141 platform_driver_unregister(&rk3026_lvds_driver);
143 module_exit(rk3026_lvds_exit);