aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/samsung/s3cfb_mdnie_kona.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/samsung/s3cfb_mdnie_kona.c')
-rw-r--r--drivers/video/samsung/s3cfb_mdnie_kona.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/drivers/video/samsung/s3cfb_mdnie_kona.c b/drivers/video/samsung/s3cfb_mdnie_kona.c
new file mode 100644
index 0000000..1fc7fcd
--- /dev/null
+++ b/drivers/video/samsung/s3cfb_mdnie_kona.c
@@ -0,0 +1,120 @@
+/* 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_kona.h"
+#include "s3cfb_mdnie_kona.h"
+#include "mdnie_kona.h"
+
+
+#define s3c_mdnie_read(addr) __raw_readl(s3c_mdnie_base + addr*4)
+#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)
+{
+ return s3c_mdnie_write(addr, val);
+}
+
+int mdnie_mask(void)
+{
+ return s3c_mdnie_write(MDNIE_REG_MASK, 0x9FFF);
+}
+
+int mdnie_unmask(void)
+{
+ return s3c_mdnie_write(MDNIE_REG_MASK, 0);
+}
+
+int mdnie_set_size(unsigned int hsize, unsigned int vsize)
+{
+ unsigned int reg;
+
+ /* Bank0 Select : DO NOT REMOVE THIS LINE */
+ s3c_mdnie_write(MDNIE_REG_BANK_SEL, 0);
+
+#if defined(CONFIG_CPU_EXYNOS4212) || defined(CONFIG_CPU_EXYNOS4412)
+ /* Input Data Unmask */
+ reg = s3c_mdnie_read(S3C_MDNIE_rR1);
+ reg &= ~S3C_MDNIE_INPUT_DATA_ENABLE;
+ s3c_mdnie_write(S3C_MDNIE_rR1, reg);
+#endif
+
+ /* LCD width */
+ reg = s3c_mdnie_read(MDNIE_REG_WIDTH);
+ reg &= ~S3C_MDNIE_SIZE_MASK;
+ reg |= S3C_MDNIE_HSIZE(hsize);
+ s3c_mdnie_write(MDNIE_REG_WIDTH, reg);
+
+ /* LCD height */
+ reg = s3c_mdnie_read(MDNIE_REG_HEIGHT);
+ reg &= ~S3C_MDNIE_SIZE_MASK;
+ reg |= S3C_MDNIE_VSIZE(vsize);
+ s3c_mdnie_write(MDNIE_REG_HEIGHT, reg);
+
+ mdnie_unmask();
+
+ return 0;
+}
+
+int mdnie_display_on(struct s3cfb_global *ctrl)
+{
+ mdnie_set_size(ctrl->lcd->width, ctrl->lcd->height);
+
+ ielcd_init_global(ctrl);
+
+ ielcd_display_on();
+
+ if (!IS_ERR_OR_NULL(g_mdnie))
+ g_mdnie->enable = TRUE;
+
+ return 0;
+}
+
+int mdnie_display_off(void)
+{
+ if (!IS_ERR_OR_NULL(g_mdnie))
+ g_mdnie->enable = FALSE;
+
+ return ielcd_display_off();
+}
+
+static int mdnie_hw_init(void)
+{
+ s3c_mdnie_mem = request_mem_region(S3C_MDNIE_PHY_BASE, S3C_MDNIE_MAP_SIZE, "mdnie");
+ if (IS_ERR_OR_NULL(s3c_mdnie_mem)) {
+ pr_err("%s: fail to request_mem_region\n", __func__);
+ return -ENOENT;
+ }
+
+ s3c_mdnie_base = ioremap(S3C_MDNIE_PHY_BASE, S3C_MDNIE_MAP_SIZE);
+ if (IS_ERR_OR_NULL(s3c_mdnie_base)) {
+ pr_err("%s: fail to ioremap\n", __func__);
+ return -ENOENT;
+ }
+
+ return 0;
+}
+
+void mdnie_setup(void)
+{
+ mdnie_hw_init();
+ ielcd_hw_init();
+}
+
+MODULE_DESCRIPTION("EXYNOS mDNIe Device Driver");
+MODULE_LICENSE("GPL");