aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/samsung_duallcd/s3cfb_mdnie.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/samsung_duallcd/s3cfb_mdnie.c')
-rw-r--r--drivers/video/samsung_duallcd/s3cfb_mdnie.c205
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");