Re: [PATCH 3/3] s5pv210: Aquila: add definitions for sdhci devices

2010-06-10 Thread Ben Dooks
On Wed, Jun 09, 2010 at 11:39:05AM +0200, Marek Szyprowski wrote:
 This patch add support for SDHCI blocks on Samsung Aquila board. The
 following host controllers are defined:
 1. Internal MoviNAND device (permanently wired to the controller)
 2. Internal WiFI SDIO device (card is activated by power regualor)
 3. External MMC/SD socket (card detection is provided by external
 gpio interrupt)
 
 Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com
 Signed-off-by: Kyungmin Park kyungmin.p...@samsung.com
 ---
  arch/arm/mach-s5pv210/Kconfig   |4 ++
  arch/arm/mach-s5pv210/mach-aquila.c |   66 
 +++
  2 files changed, 70 insertions(+), 0 deletions(-)
 
 diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig
 index b7a2f38..dcc9d74 100644
 --- a/arch/arm/mach-s5pv210/Kconfig
 +++ b/arch/arm/mach-s5pv210/Kconfig
 @@ -57,7 +57,11 @@ config MACH_AQUILA
   select CPU_S5PV210
   select ARCH_SPARSEMEM_ENABLE
   select S5PV210_SETUP_FB_24BPP
 + select S5PV210_SETUP_SDHCI
   select S3C_DEV_FB
 + select S3C_DEV_HSMMC
 + select S3C_DEV_HSMMC1
 + select S3C_DEV_HSMMC2
   select S5PC110_DEV_ONENAND
   help
 Machine support for the Samsung Aquila target based on S5PC110 SoC
 diff --git a/arch/arm/mach-s5pv210/mach-aquila.c 
 b/arch/arm/mach-s5pv210/mach-aquila.c
 index fb9dbb2..1b7fe79 100644
 --- a/arch/arm/mach-s5pv210/mach-aquila.c
 +++ b/arch/arm/mach-s5pv210/mach-aquila.c
 @@ -13,6 +13,7 @@
  #include linux/init.h
  #include linux/serial_core.h
  #include linux/fb.h
 +#include linux/gpio.h
  
  #include asm/mach/arch.h
  #include asm/mach/map.h
 @@ -22,12 +23,15 @@
  #include mach/map.h
  #include mach/regs-clock.h
  #include mach/regs-fb.h
 +#include mach/regs-gpio.h
  
  #include plat/regs-serial.h
  #include plat/s5pv210.h
  #include plat/devs.h
  #include plat/cpu.h
  #include plat/fb.h
 +#include plat/gpio-cfg.h
 +#include plat/sdhci.h
  
  /* Following are default values for UCON, ULCON and UFCON UART registers */
  #define S5PV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL |\
 @@ -116,9 +120,66 @@ static struct s3c_fb_platdata aquila_lcd_pdata 
 __initdata = {
   .setup_gpio = s5pv210_fb_gpio_setup_24bpp,
  };
  
 +/* MoviNAND */
 +static struct s3c_sdhci_platdata aquila_hsmmc0_data __initdata = {
 + .max_width  = 4,
 + .cd_type= S3C_SDHCI_CD_PERMANENT,
 +};
 +
 +/* Wireless LAN */
 +static struct s3c_sdhci_platdata aquila_hsmmc1_data __initdata = {
 + .max_width  = 4,
 + .cd_type= S3C_SDHCI_CD_EXTERNAL,
 + /* ext_cd_{init,cleanup} callbacks will be added later */
 +};
 +
 +/* External Flash */
 +#define AQUILA_EXT_FLASH_IRQ IRQ_EINT(28)/* S5PV210_GPH3(4) */
 +#define AQUILA_EXT_FLASH_EN  S5PV210_MP05(4)
 +#define AQUILA_EXT_FLASH_CD  S5PV210_GPH3(4)
 +
 +static irqreturn_t aquila_ext_flash_card_detect_isr(int irq, void *dev_id)
 +{
 + void (*notify_func)(struct platform_device *, int state) = dev_id;
 + notify_func(s3c_device_hsmmc2, !gpio_get_value(AQUILA_EXT_FLASH_CD));
 + return IRQ_HANDLED;
 +}

hmm, not very nice this.

I'd much prefer to see a gpio-based handler in either the sdhci core or
at-least in the driver's directory since I'm sure that his is (a) something
Thomas Abrahama has already published patches for (which do need work) and
(b) probably going to be needed by other boards and/or other architectures.

 +static int aquila_ext_flash_card_detect_init(
 + void (*notify_func)(struct platform_device *, int state))
 +{
 + gpio_request(AQUILA_EXT_FLASH_EN, FLASH_EN);
 + gpio_direction_output(AQUILA_EXT_FLASH_EN, 1);
 +
 + if (request_irq(AQUILA_EXT_FLASH_IRQ, aquila_ext_flash_card_detect_isr,
 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
 + SDHCI card detect, notify_func))
 + printk(KERN_ERR Error: cannot request irq for External 
 Flash\n);
 + return 0;
 +}
 +
 +static int aquila_ext_flash_card_detect_cleanup(
 + void (*notify_func)(struct platform_device *, int state))
 +{
 + free_irq(AQUILA_EXT_FLASH_IRQ, notify_func);
 + gpio_direction_output(AQUILA_EXT_FLASH_EN, 0);
 + gpio_free(AQUILA_EXT_FLASH_EN);
 + return 0;
 +}
 +
 +static struct s3c_sdhci_platdata aquila_hsmmc2_data __initdata = {
 + .max_width  = 4,
 + .cd_type= S3C_SDHCI_CD_EXTERNAL,
 + .ext_cd_init= aquila_ext_flash_card_detect_init,
 + .ext_cd_cleanup = aquila_ext_flash_card_detect_cleanup,
 +};
 +
  static struct platform_device *aquila_devices[] __initdata = {
   s3c_device_fb,
   s5pc110_device_onenand,
 + s3c_device_hsmmc0,
 + s3c_device_hsmmc1,
 + s3c_device_hsmmc2,
  };
  
  static void __init aquila_map_io(void)
 @@ -130,6 +191,11 @@ static void __init aquila_map_io(void)
  
  static void __init 

[PATCH 3/3] s5pv210: Aquila: add definitions for sdhci devices

2010-06-09 Thread Marek Szyprowski
This patch add support for SDHCI blocks on Samsung Aquila board. The
following host controllers are defined:
1. Internal MoviNAND device (permanently wired to the controller)
2. Internal WiFI SDIO device (card is activated by power regualor)
3. External MMC/SD socket (card detection is provided by external
gpio interrupt)

Signed-off-by: Marek Szyprowski m.szyprow...@samsung.com
Signed-off-by: Kyungmin Park kyungmin.p...@samsung.com
---
 arch/arm/mach-s5pv210/Kconfig   |4 ++
 arch/arm/mach-s5pv210/mach-aquila.c |   66 +++
 2 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig
index b7a2f38..dcc9d74 100644
--- a/arch/arm/mach-s5pv210/Kconfig
+++ b/arch/arm/mach-s5pv210/Kconfig
@@ -57,7 +57,11 @@ config MACH_AQUILA
select CPU_S5PV210
select ARCH_SPARSEMEM_ENABLE
select S5PV210_SETUP_FB_24BPP
+   select S5PV210_SETUP_SDHCI
select S3C_DEV_FB
+   select S3C_DEV_HSMMC
+   select S3C_DEV_HSMMC1
+   select S3C_DEV_HSMMC2
select S5PC110_DEV_ONENAND
help
  Machine support for the Samsung Aquila target based on S5PC110 SoC
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c 
b/arch/arm/mach-s5pv210/mach-aquila.c
index fb9dbb2..1b7fe79 100644
--- a/arch/arm/mach-s5pv210/mach-aquila.c
+++ b/arch/arm/mach-s5pv210/mach-aquila.c
@@ -13,6 +13,7 @@
 #include linux/init.h
 #include linux/serial_core.h
 #include linux/fb.h
+#include linux/gpio.h
 
 #include asm/mach/arch.h
 #include asm/mach/map.h
@@ -22,12 +23,15 @@
 #include mach/map.h
 #include mach/regs-clock.h
 #include mach/regs-fb.h
+#include mach/regs-gpio.h
 
 #include plat/regs-serial.h
 #include plat/s5pv210.h
 #include plat/devs.h
 #include plat/cpu.h
 #include plat/fb.h
+#include plat/gpio-cfg.h
+#include plat/sdhci.h
 
 /* Following are default values for UCON, ULCON and UFCON UART registers */
 #define S5PV210_UCON_DEFAULT   (S3C2410_UCON_TXILEVEL |\
@@ -116,9 +120,66 @@ static struct s3c_fb_platdata aquila_lcd_pdata __initdata 
= {
.setup_gpio = s5pv210_fb_gpio_setup_24bpp,
 };
 
+/* MoviNAND */
+static struct s3c_sdhci_platdata aquila_hsmmc0_data __initdata = {
+   .max_width  = 4,
+   .cd_type= S3C_SDHCI_CD_PERMANENT,
+};
+
+/* Wireless LAN */
+static struct s3c_sdhci_platdata aquila_hsmmc1_data __initdata = {
+   .max_width  = 4,
+   .cd_type= S3C_SDHCI_CD_EXTERNAL,
+   /* ext_cd_{init,cleanup} callbacks will be added later */
+};
+
+/* External Flash */
+#define AQUILA_EXT_FLASH_IRQ   IRQ_EINT(28)/* S5PV210_GPH3(4) */
+#define AQUILA_EXT_FLASH_ENS5PV210_MP05(4)
+#define AQUILA_EXT_FLASH_CDS5PV210_GPH3(4)
+
+static irqreturn_t aquila_ext_flash_card_detect_isr(int irq, void *dev_id)
+{
+   void (*notify_func)(struct platform_device *, int state) = dev_id;
+   notify_func(s3c_device_hsmmc2, !gpio_get_value(AQUILA_EXT_FLASH_CD));
+   return IRQ_HANDLED;
+}
+
+static int aquila_ext_flash_card_detect_init(
+   void (*notify_func)(struct platform_device *, int state))
+{
+   gpio_request(AQUILA_EXT_FLASH_EN, FLASH_EN);
+   gpio_direction_output(AQUILA_EXT_FLASH_EN, 1);
+
+   if (request_irq(AQUILA_EXT_FLASH_IRQ, aquila_ext_flash_card_detect_isr,
+   IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+   SDHCI card detect, notify_func))
+   printk(KERN_ERR Error: cannot request irq for External 
Flash\n);
+   return 0;
+}
+
+static int aquila_ext_flash_card_detect_cleanup(
+   void (*notify_func)(struct platform_device *, int state))
+{
+   free_irq(AQUILA_EXT_FLASH_IRQ, notify_func);
+   gpio_direction_output(AQUILA_EXT_FLASH_EN, 0);
+   gpio_free(AQUILA_EXT_FLASH_EN);
+   return 0;
+}
+
+static struct s3c_sdhci_platdata aquila_hsmmc2_data __initdata = {
+   .max_width  = 4,
+   .cd_type= S3C_SDHCI_CD_EXTERNAL,
+   .ext_cd_init= aquila_ext_flash_card_detect_init,
+   .ext_cd_cleanup = aquila_ext_flash_card_detect_cleanup,
+};
+
 static struct platform_device *aquila_devices[] __initdata = {
s3c_device_fb,
s5pc110_device_onenand,
+   s3c_device_hsmmc0,
+   s3c_device_hsmmc1,
+   s3c_device_hsmmc2,
 };
 
 static void __init aquila_map_io(void)
@@ -130,6 +191,11 @@ static void __init aquila_map_io(void)
 
 static void __init aquila_machine_init(void)
 {
+   /* SDHCI */
+   s3c_sdhci0_set_platdata(aquila_hsmmc0_data);
+   s3c_sdhci1_set_platdata(aquila_hsmmc1_data);
+   s3c_sdhci2_set_platdata(aquila_hsmmc2_data);
+
/* FB */
s3c_fb_set_platdata(aquila_lcd_pdata);
 
-- 
1.7.1.240.g225c

--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info