diff options
Diffstat (limited to 'drivers/video/samsung_duallcd/s3cfb_mdnie.c')
-rw-r--r-- | drivers/video/samsung_duallcd/s3cfb_mdnie.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/drivers/video/samsung_duallcd/s3cfb_mdnie.c b/drivers/video/samsung_duallcd/s3cfb_mdnie.c new file mode 100644 index 0000000..0fa2f60 --- /dev/null +++ b/drivers/video/samsung_duallcd/s3cfb_mdnie.c @@ -0,0 +1,205 @@ +/* linux/drivers/video/samsung/s3cfb_mdnie.c + * + * Register interface file for Samsung mDNIe driver + * + * Copyright (c) 2009 Samsung Electronics + * http://www.samsungsemi.com/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + + +#include "s3cfb.h" +#include "s3cfb_ielcd.h" +#include "s3cfb_mdnie.h" +#include "mdnie.h" + + +#define s3c_mdnie_readl(addr) __raw_readl((s3c_mdnie_base + addr)) +#define s3c_mdnie_writel(addr, val) __raw_writel(val, (s3c_mdnie_base + addr)) +#define s3c_mdnie_write(addr, val) __raw_writel(val, (s3c_mdnie_base + addr*4)) + + +static struct resource *s3c_mdnie_mem; +static void __iomem *s3c_mdnie_base; + + +int mdnie_write(unsigned int addr, unsigned int val) +{ + s3c_mdnie_write(addr, val); + + return 0; +} + +/* should be fixed with arch */ +#if defined(CONFIG_CPU_EXYNOS4210) +int s3c_mdnie_mask(void) +{ + s3c_mdnie_writel(S3C_MDNIE_rR40, 0x27); + + return 0; +} + +int s3c_mdnie_unmask(void) +{ + s3c_mdnie_writel(S3C_MDNIE_rR40, 0x0); + + return 0; +} + +int s3c_mdnie_set_size(unsigned int hsize, unsigned int vsize) +{ + unsigned int size; + + size = s3c_mdnie_readl(S3C_MDNIE_rR34); + size &= ~S3C_MDNIE_SIZE_MASK; + size |= hsize; + s3c_mdnie_writel(S3C_MDNIE_rR34, size); + + size = s3c_mdnie_readl(S3C_MDNIE_rR35); + size &= ~S3C_MDNIE_SIZE_MASK; + size |= vsize; + s3c_mdnie_writel(S3C_MDNIE_rR35, size); + + s3c_mdnie_unmask(); + + return 0; +} +#else +int s3c_mdnie_mask(void) +{ +#if 0 + unsigned int mask; + mask = s3c_mdnie_readl(S3C_MDNIE_rR1); + mask |= S3C_MDNIE_REG_MASK; + s3c_mdnie_writel(S3C_MDNIE_rR1, mask); +#endif + return 0; +} + +int s3c_mdnie_unmask(void) +{ +#if 0 + unsigned int mask; + mask = s3c_mdnie_readl(S3C_MDNIE_rR1); + mask &= ~S3C_MDNIE_REG_MASK; + s3c_mdnie_writel(S3C_MDNIE_rR1, mask); +#endif + return 0; +} + +int s3c_mdnie_set_size(unsigned int hsize, unsigned int vsize) +{ + unsigned int size; + + /* Bank0 Select */ + s3c_mdnie_writel(S3C_MDNIE_rR0, 0x0); + + /* Input Data Unmask */ + s3c_mdnie_writel(S3C_MDNIE_rR1, 0x077); + + /* LCD width */ + size = s3c_mdnie_readl(S3C_MDNIE_rR3); + size &= ~S3C_MDNIE_SIZE_MASK; + size |= hsize; + s3c_mdnie_writel(S3C_MDNIE_rR3, size); + + /* LCD height */ + size = s3c_mdnie_readl(S3C_MDNIE_rR4); + size &= ~S3C_MDNIE_SIZE_MASK; + size |= vsize; + s3c_mdnie_writel(S3C_MDNIE_rR4, size); + + /* unmask all */ + s3c_mdnie_writel(S3C_MDNIE_rR28, 0); + + return 0; +} +#endif + +int s3c_mdnie_select_mode(int algo, int mcm, int lpa) +{ + s3c_mdnie_writel(S3C_MDNIE_rR1, 0x0000); + s3c_mdnie_writel(S3C_MDNIE_rR36, 0x0000); + s3c_mdnie_writel(S3C_MDNIE_rR37, 0x0FFF); + s3c_mdnie_writel(S3C_MDNIE_rR38, 0x005c); + + s3c_mdnie_writel(S3C_MDNIE_rR39, 0x0ff0); + s3c_mdnie_writel(S3C_MDNIE_rR43, 0x0064); + s3c_mdnie_writel(S3C_MDNIE_rR45, 0x0364); + + return 0; +} + +int s3c_mdnie_init_global(struct s3cfb_global *s3cfb_ctrl) +{ + s3c_mdnie_set_size(s3cfb_ctrl->lcd->width, s3cfb_ctrl->lcd->height); + + /* mDNIe_Set_Mode(current_mDNIe_UI, current_mDNIe_OutDoor_OnOff); */ + /* set_mdnie_value(g_mdnie); */ + + s3c_ielcd_logic_start(); + s3c_ielcd_init_global(s3cfb_ctrl); + + return 0; +} + +int s3c_mdnie_display_on(struct s3cfb_global *ctrl) +{ + s3c_ielcd_display_on(); + + if (!IS_ERR_OR_NULL(g_mdnie)) + g_mdnie->enable = TRUE; + + return 0; +} + +int s3c_mdnie_display_off(void) +{ + if (!IS_ERR_OR_NULL(g_mdnie)) + g_mdnie->enable = FALSE; + + return s3c_ielcd_display_off(); +} + +int s3c_mdnie_off(void) +{ + if (!IS_ERR_OR_NULL(g_mdnie)) + g_mdnie->enable = FALSE; + + s3c_ielcd_logic_stop(); + + return 0; +} + +int s3c_mdnie_hw_init(void) +{ + s3c_mdnie_mem = request_mem_region(S3C_MDNIE_PHY_BASE, S3C_MDNIE_MAP_SIZE, "mdnie"); + if (s3c_mdnie_mem == NULL) { + printk(KERN_ERR "mDNIe failed to reserved memory region\n"); + return -ENOENT; + } + + s3c_mdnie_base = ioremap(S3C_MDNIE_PHY_BASE, S3C_MDNIE_MAP_SIZE); + if (s3c_mdnie_base == NULL) { + printk(KERN_ERR "mDNIe failed ioremap\n"); + return -ENOENT; + } + + printk(KERN_INFO "%s : 0x%p\n", __func__, s3c_mdnie_base); + + return 0; +} + +int s3c_mdnie_setup(void) +{ + s3c_mdnie_hw_init(); + s3c_ielcd_hw_init(); + + return 0; +} + +MODULE_DESCRIPTION("EXYNOS mDNIe Device Driver"); +MODULE_LICENSE("GPL"); |