ARM: EXYNOS4: Add platform device and helper functions for FIMD
authorJonghun Han <jonghun.han@samsung.com>
Thu, 21 Jul 2011 06:46:26 +0000 (15:46 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Thu, 21 Jul 2011 08:28:51 +0000 (17:28 +0900)
This patch adds platform device s5p_device_fimd0 for EXYNOS4 FIMD0.
EXYNOS4 has two FIMDs(FIMD0, FIMD1). FIMD1 will be added later.
Some definitions used to enable EXYNOS4 FIMD0 are added.

Signed-off-by: Jonghun Han <jonghun.han@samsung.com>
Signed-off-by: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/mach-exynos4/Kconfig
arch/arm/mach-exynos4/Makefile
arch/arm/mach-exynos4/cpu.c
arch/arm/mach-exynos4/setup-fimd0.c [new file with mode: 0644]
arch/arm/plat-s5p/Kconfig
arch/arm/plat-s5p/Makefile
arch/arm/plat-s5p/dev-fimd0.c [new file with mode: 0644]
arch/arm/plat-samsung/include/plat/devs.h
arch/arm/plat-samsung/include/plat/fb-core.h
arch/arm/plat-samsung/include/plat/fb.h

index b735705c8b475f67916f9bcf7c7820fece706dc1..75982b53e5279eb22c5e78dbb59fa6bb29bc9ea8 100644 (file)
@@ -26,6 +26,11 @@ config EXYNOS4_DEV_AHCI
        help
          Compile in platform device definitions for AHCI
 
+config EXYNOS4_SETUP_FIMD0
+       bool
+       help
+         Common setup code for FIMD0.
+
 config EXYNOS4_DEV_PD
        bool
        help
@@ -109,6 +114,7 @@ menu "EXYNOS4 Machines"
 config MACH_SMDKC210
        bool "SMDKC210"
        select CPU_EXYNOS4210
+       select S5P_DEV_FIMD0
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select S3C_DEV_I2C1
@@ -118,6 +124,7 @@ config MACH_SMDKC210
        select S3C_DEV_HSMMC3
        select EXYNOS4_DEV_PD
        select EXYNOS4_DEV_SYSMMU
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_SDHCI
        help
@@ -126,6 +133,7 @@ config MACH_SMDKC210
 config MACH_SMDKV310
        bool "SMDKV310"
        select CPU_EXYNOS4210
+       select S5P_DEV_FIMD0
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select S3C_DEV_I2C1
@@ -137,6 +145,7 @@ config MACH_SMDKV310
        select SAMSUNG_DEV_KEYPAD
        select EXYNOS4_DEV_PD
        select EXYNOS4_DEV_SYSMMU
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_KEYPAD
        select EXYNOS4_SETUP_SDHCI
index 2a0b68220b2f793cbad340224ea6fe1c2624d247..e8b33aba14d8ce3ab74bb8f2db69fe0d9266d86a 100644 (file)
@@ -41,6 +41,7 @@ obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)      += dev-sysmmu.o
 obj-$(CONFIG_EXYNOS4_DEV_DWMCI)        += dev-dwmci.o
 
 obj-$(CONFIG_EXYNOS4_SETUP_FIMC)       += setup-fimc.o
+obj-$(CONFIG_EXYNOS4_SETUP_FIMD0)      += setup-fimd0.o
 obj-$(CONFIG_EXYNOS4_SETUP_I2C1)       += setup-i2c1.o
 obj-$(CONFIG_EXYNOS4_SETUP_I2C2)       += setup-i2c2.o
 obj-$(CONFIG_EXYNOS4_SETUP_I2C3)       += setup-i2c3.o
index b0370f79ce7e3cd7a4104c857e0f699a16e9e580..2d8a40c9e6e5a69c49cf48f642bd38aa7bff30f5 100644 (file)
@@ -25,6 +25,7 @@
 #include <plat/adc-core.h>
 #include <plat/sdhci.h>
 #include <plat/devs.h>
+#include <plat/fb-core.h>
 #include <plat/fimc-core.h>
 #include <plat/iic-core.h>
 
@@ -153,6 +154,8 @@ void __init exynos4_map_io(void)
        s3c_i2c0_setname("s3c2440-i2c");
        s3c_i2c1_setname("s3c2440-i2c");
        s3c_i2c2_setname("s3c2440-i2c");
+
+       s5p_fb_setname(0, "exynos4-fb");
 }
 
 void __init exynos4_init_clocks(int xtal)
diff --git a/arch/arm/mach-exynos4/setup-fimd0.c b/arch/arm/mach-exynos4/setup-fimd0.c
new file mode 100644 (file)
index 0000000..07a6dbe
--- /dev/null
@@ -0,0 +1,43 @@
+/* linux/arch/arm/mach-exynos4/setup-fimd0.c
+ *
+ * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * Base Exynos4 FIMD 0 configuration
+ *
+ * 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 <linux/fb.h>
+#include <linux/gpio.h>
+
+#include <plat/gpio-cfg.h>
+#include <plat/regs-fb-v4.h>
+
+#include <mach/map.h>
+
+void exynos4_fimd0_gpio_setup_24bpp(void)
+{
+       unsigned int reg;
+
+       s3c_gpio_cfgrange_nopull(EXYNOS4_GPF0(0), 8, S3C_GPIO_SFN(2));
+       s3c_gpio_cfgrange_nopull(EXYNOS4_GPF1(0), 8, S3C_GPIO_SFN(2));
+       s3c_gpio_cfgrange_nopull(EXYNOS4_GPF2(0), 8, S3C_GPIO_SFN(2));
+       s3c_gpio_cfgrange_nopull(EXYNOS4_GPF3(0), 4, S3C_GPIO_SFN(2));
+
+       /*
+        * Set DISPLAY_CONTROL register for Display path selection.
+        *
+        * DISPLAY_CONTROL[1:0]
+        * ---------------------
+        *  00 | MIE
+        *  01 | MDINE
+        *  10 | FIMD : selected
+        *  11 | FIMD
+        */
+       reg = __raw_readl(S3C_VA_SYS + 0x0210);
+       reg |= (1 << 1);
+       __raw_writel(reg, S3C_VA_SYS + 0x0210);
+}
index 7f9ff2afffd93d4fcb897901e7fc8f100f847878..7537ad57c7db051b1f70cc6bd4efdef76d94d624 100644 (file)
@@ -71,6 +71,11 @@ config S5P_DEV_FIMC3
        help
          Compile in platform device definitions for FIMC controller 3
 
+config S5P_DEV_FIMD0
+       bool
+       help
+         Compile in platform device definitions for FIMD controller 0
+
 config S5P_DEV_ONENAND
        bool
        help
index e234cc4d49a0334a1b806e3b0f942968e8d846e2..eec7e24c1a036251166d2531dfc4c64a437ec833 100644 (file)
@@ -30,6 +30,7 @@ obj-$(CONFIG_S5P_DEV_FIMC0)   += dev-fimc0.o
 obj-$(CONFIG_S5P_DEV_FIMC1)    += dev-fimc1.o
 obj-$(CONFIG_S5P_DEV_FIMC2)    += dev-fimc2.o
 obj-$(CONFIG_S5P_DEV_FIMC3)    += dev-fimc3.o
+obj-$(CONFIG_S5P_DEV_FIMD0)    += dev-fimd0.o
 obj-$(CONFIG_S5P_DEV_ONENAND)  += dev-onenand.o
 obj-$(CONFIG_S5P_DEV_CSIS0)    += dev-csis0.o
 obj-$(CONFIG_S5P_DEV_CSIS1)    += dev-csis1.o
diff --git a/arch/arm/plat-s5p/dev-fimd0.c b/arch/arm/plat-s5p/dev-fimd0.c
new file mode 100644 (file)
index 0000000..f728bb5
--- /dev/null
@@ -0,0 +1,67 @@
+/* linux/arch/arm/plat-s5p/dev-fimd0.c
+ *
+ * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * Core file for Samsung Display Controller (FIMD) driver
+ *
+ * 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 <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/fb.h>
+#include <linux/gfp.h>
+#include <linux/dma-mapping.h>
+
+#include <mach/irqs.h>
+#include <mach/map.h>
+
+#include <plat/fb.h>
+#include <plat/devs.h>
+#include <plat/cpu.h>
+
+static struct resource s5p_fimd0_resource[] = {
+       [0] = {
+               .start  = S5P_PA_FIMD0,
+               .end    = S5P_PA_FIMD0 + SZ_32K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_FIMD0_VSYNC,
+               .end    = IRQ_FIMD0_VSYNC,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = IRQ_FIMD0_FIFO,
+               .end    = IRQ_FIMD0_FIFO,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = IRQ_FIMD0_SYSTEM,
+               .end    = IRQ_FIMD0_SYSTEM,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static u64 fimd0_dmamask = DMA_BIT_MASK(32);
+
+struct platform_device s5p_device_fimd0 = {
+       .name           = "s5p-fb",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(s5p_fimd0_resource),
+       .resource       = s5p_fimd0_resource,
+       .dev            = {
+               .dma_mask               = &fimd0_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+void __init s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd)
+{
+       s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
+                       &s5p_device_fimd0);
+}
index 540969047a7b8a5f5a7ae7fd95fcfe10c4861cd5..3ceaf86ba458055d7715e2b437f2ae9d66ecdfec 100644 (file)
@@ -50,6 +50,7 @@ extern struct platform_device s3c64xx_device_ac97;
 extern struct platform_device s3c_device_ts;
 
 extern struct platform_device s3c_device_fb;
+extern struct platform_device s5p_device_fimd0;
 extern struct platform_device s3c_device_ohci;
 extern struct platform_device s3c_device_lcd;
 extern struct platform_device s3c_device_wdt;
index bca383efcf6deb03fbd8786e2d6851796be38c0a..6abcbf139ceedf5976cf657d1da73e93b4d8d8c2 100644 (file)
@@ -26,4 +26,19 @@ static inline void s3c_fb_setname(char *name)
 #endif
 }
 
+/* Re-define device name depending on support. */
+static inline void s5p_fb_setname(int id, char *name)
+{
+       switch (id) {
+#ifdef CONFIG_S5P_DEV_FIMD0
+       case 0:
+               s5p_device_fimd0.name = name;
+       break;
+#endif
+       default:
+               printk(KERN_ERR "%s: invalid device id(%d)\n", __func__, id);
+       break;
+       }
+}
+
 #endif /* __ASM_PLAT_FB_CORE_H */
index cb3ca3adc68569013e00ea62d4c08da28ec5e3ba..01f10e4d00c71e5f799140bffbeaba650b212592 100644 (file)
@@ -73,6 +73,14 @@ struct s3c_fb_platdata {
  */
 extern void s3c_fb_set_platdata(struct s3c_fb_platdata *pd);
 
+/**
+ * s5p_fimd0_set_platdata() - Setup the FB device with platform data.
+ * @pd: The platform data to set. The data is copied from the passed structure
+ *      so the machine data can mark the data __initdata so that any unused
+ *      machines will end up dumping their data at runtime.
+ */
+extern void s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd);
+
 /**
  * s3c64xx_fb_gpio_setup_24bpp() - S3C64XX setup function for 24bpp LCD
  *
@@ -94,4 +102,11 @@ extern void s5pc100_fb_gpio_setup_24bpp(void);
  */
 extern void s5pv210_fb_gpio_setup_24bpp(void);
 
+/**
+ * exynos4_fimd0_gpio_setup_24bpp() - Exynos4 setup function for 24bpp LCD0
+ *
+ * Initialise the GPIO for an 24bpp LCD display on the RGB interface 0.
+ */
+extern void exynos4_fimd0_gpio_setup_24bpp(void);
+
 #endif /* __PLAT_S3C_FB_H */