diff mbox

[Maverick] UBUNTU : SAUCE - ARM: Support for vbus, overcurrent and LEDs on IGEPv2

Message ID 1285969856.12798.31.camel@black
State Accepted
Delegated to: Leann Ogasawara
Headers show

Commit Message

Mathieu Poirier Oct. 1, 2010, 9:50 p.m. UTC
>From 210c9482650eb6cb24488303e50e3c49babb3d3a Mon Sep 17 00:00:00 2001
From: Enric Balletbo i Serra <eballetbo@gmail.com>
Date: Fri, 1 Oct 2010 15:23:31 -0600
Subject: [PATCH] Support for vbus, overcurrent and LEDs on IGEPv2

This patch adds support for the VBUS and over current
GPIOs along with the four LEDs present on the IGEPv2 board.

Initialisation of the LEDs is done with the LED class if
CONFIG_LEDS_GPIO is selected or the General Purpose
Input/Output (GPIO) interface if CONFIG_LEDS_GPIO is not
selected.

https://bugs.launchpad.net/bugs/651589

Signed-off-by: <eballetbo@gmail.com>
Signed-off-by: <mathieu.poirier@canonical.com>
---
 arch/arm/mach-omap2/board-igep0020.c |  170 ++++++++++++++++++++--------------
 1 files changed, 101 insertions(+), 69 deletions(-)

Comments

Leann Ogasawara Oct. 1, 2010, 10:18 p.m. UTC | #1
Hi Mathieu,

Since this is for Maverick, this needs the appropriate SRU justification
written up in the bug report.  It's also a good rule of thumb to post
the SRU justification to the body of the email as well.  Also, has this
patch been submitted upstream?  If so, it would be good to add a
reference to the upstream submission in the commit message for tracking
purposes.

Thanks,
Leann

On Fri, 2010-10-01 at 15:50 -0600, Mathieu Poirier wrote:
> >From 210c9482650eb6cb24488303e50e3c49babb3d3a Mon Sep 17 00:00:00 2001
> From: Enric Balletbo i Serra <eballetbo@gmail.com>
> Date: Fri, 1 Oct 2010 15:23:31 -0600
> Subject: [PATCH] Support for vbus, overcurrent and LEDs on IGEPv2
> 
> This patch adds support for the VBUS and over current
> GPIOs along with the four LEDs present on the IGEPv2 board.
> 
> Initialisation of the LEDs is done with the LED class if
> CONFIG_LEDS_GPIO is selected or the General Purpose
> Input/Output (GPIO) interface if CONFIG_LEDS_GPIO is not
> selected.
> 
> https://bugs.launchpad.net/bugs/651589
> 
> Signed-off-by: <eballetbo@gmail.com>
> Signed-off-by: <mathieu.poirier@canonical.com>
> ---
>  arch/arm/mach-omap2/board-igep0020.c |  170 ++++++++++++++++++++--------------
>  1 files changed, 101 insertions(+), 69 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
> index d55c57b..21bb77f 100644
> --- a/arch/arm/mach-omap2/board-igep0020.c
> +++ b/arch/arm/mach-omap2/board-igep0020.c
> @@ -261,6 +261,77 @@ static struct omap2_hsmmc_info mmc[] = {
>  	{}      /* Terminator */
>  };
>  
> +#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
> +#include <linux/leds.h>
> +
> +static struct gpio_led igep2_gpio_leds[] = {
> +	[0] = {
> +		.name = "gpio-led:red:d0",
> +		.gpio = IGEP2_GPIO_LED0_RED,
> +		.default_trigger = "default-off"
> +	},
> +	[1] = {
> +		.name = "gpio-led:green:d0",
> +		.gpio = IGEP2_GPIO_LED0_GREEN,
> +		.default_trigger = "default-off",
> +	},
> +	[2] = {
> +		.name = "gpio-led:red:d1",
> +		.gpio = IGEP2_GPIO_LED1_RED,
> +		.default_trigger = "default-off",
> +	},
> +	[3] = {
> +		.name = "gpio-led:green:d1",
> +		.default_trigger = "heartbeat",
> +		.gpio = -EINVAL, /* gets replaced */
> +	},
> +};
> +
> +static struct gpio_led_platform_data igep2_led_pdata = {
> +	.leds           = igep2_gpio_leds,
> +	.num_leds       = ARRAY_SIZE(igep2_gpio_leds),
> +};
> +
> +static struct platform_device igep2_led_device = {
> +	 .name   = "leds-gpio",
> +	 .id     = -1,
> +	 .dev    = {
> +		 .platform_data  =  &igep2_led_pdata,
> +	},
> +};
> +
> +static void __init igep2_leds_init(void)
> +{
> +	platform_device_register(&igep2_led_device);
> +}
> +
> +#else
> +static inline void igep2_leds_init(void)
> +{
> +	if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
> +	    (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
> +		gpio_export(IGEP2_GPIO_LED0_RED, 0);
> +		gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
> +	} else
> +		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
> +
> +	if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
> +	    (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
> +		gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
> +		gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
> +	} else
> +		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
> +
> +	if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
> +	    (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
> +		gpio_export(IGEP2_GPIO_LED1_RED, 0);
> +		gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
> +	} else
> +		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
> +
> +}
> +#endif
> +
>  static int igep2_twl_gpio_setup(struct device *dev,
>  		unsigned gpio, unsigned ngpio)
>  {
> @@ -274,14 +345,40 @@ static int igep2_twl_gpio_setup(struct device *dev,
>  	igep2_vmmc1_supply.dev = mmc[0].dev;
>  	igep2_vmmc2_supply.dev = mmc[1].dev;
>  
> +	/*
> +	 * REVISIT: need ehci-omap hooks for external VBUS
> +	 * power switch and overcurrent detect
> +	 */
> +	gpio_request(gpio + 1, "GPIO_EHCI_NOC");
> +	gpio_direction_input(gpio + 1);
> +
> +	/*
> +	 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
> +	 * (out, active low)
> +	 */
> +	gpio_request(gpio + TWL4030_GPIO_MAX, 0);
> +	gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
> +
> +	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
> +#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
> +	if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
> +	    && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) {
> +		gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
> +		gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0);
> +	} else
> +		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n");
> +#else
> +	igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
> +#endif
> +
>  	return 0;
>  };
>  
> -static struct twl4030_gpio_platform_data igep2_gpio_data = {
> +static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = {
>  	.gpio_base	= OMAP_MAX_GPIO_LINES,
>  	.irq_base	= TWL4030_GPIO_IRQ_BASE,
>  	.irq_end	= TWL4030_GPIO_IRQ_END,
> -	.use_leds	= false,
> +	.use_leds	= true,
>  	.setup		= igep2_twl_gpio_setup,
>  };
>  
> @@ -355,47 +452,6 @@ static void __init igep2_display_init(void)
>  		pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
>  }
>  
> -#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
> -#include <linux/leds.h>
> -
> -static struct gpio_led igep2_gpio_leds[] = {
> -	{
> -		.name = "led0:red",
> -		.gpio = IGEP2_GPIO_LED0_RED,
> -	},
> -	{
> -		.name = "led0:green",
> -		.default_trigger = "heartbeat",
> -		.gpio = IGEP2_GPIO_LED0_GREEN,
> -	},
> -	{
> -		.name = "led1:red",
> -		.gpio = IGEP2_GPIO_LED1_RED,
> -	},
> -};
> -
> -static struct gpio_led_platform_data igep2_led_pdata = {
> -	.leds           = igep2_gpio_leds,
> -	.num_leds       = ARRAY_SIZE(igep2_gpio_leds),
> -};
> -
> -static struct platform_device igep2_led_device = {
> -	 .name   = "leds-gpio",
> -	 .id     = -1,
> -	 .dev    = {
> -		 .platform_data  =  &igep2_led_pdata,
> -	},
> -};
> -
> -static void __init igep2_init_led(void)
> -{
> -	platform_device_register(&igep2_led_device);
> -}
> -
> -#else
> -static inline void igep2_init_led(void) {}
> -#endif
> -
>  static struct platform_device *igep2_devices[] __initdata = {
>  	&igep2_dss_device,
>  };
> @@ -425,7 +481,7 @@ static struct twl4030_platform_data igep2_twldata = {
>  	/* platform_data for children goes here */
>  	.usb		= &igep2_usb_data,
>  	.codec		= &igep2_codec_data,
> -	.gpio		= &igep2_gpio_data,
> +	.gpio		= &igep2_twl4030_gpio_pdata,
>  	.vmmc1          = &igep2_vmmc1,
>  	.vmmc2		= &igep2_vmmc2,
>  	.vpll2		= &igep2_vpll2,
> @@ -486,34 +542,10 @@ static void __init igep2_init(void)
>  	usb_ehci_init(&ehci_pdata);
>  
>  	igep2_flash_init();
> -	igep2_init_led();
> +	igep2_leds_init();
>  	igep2_display_init();
>  	igep2_init_smsc911x();
>  
> -	/* GPIO userspace leds */
> -#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
> -	if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) &&
> -	    (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
> -		gpio_export(IGEP2_GPIO_LED0_RED, 0);
> -		gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
> -	} else
> -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
> -
> -	if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) &&
> -	    (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
> -		gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
> -		gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
> -	} else
> -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
> -
> -	if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) &&
> -	    (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
> -		gpio_export(IGEP2_GPIO_LED1_RED, 0);
> -		gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
> -	} else
> -		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
> -#endif
> -
>  	/* GPIO W-LAN + Bluetooth combo module */
>  	if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
>  	    (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) {
> -- 
> 1.7.0.4
> 
> 
> 
>
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index d55c57b..21bb77f 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -261,6 +261,77 @@  static struct omap2_hsmmc_info mmc[] = {
 	{}      /* Terminator */
 };
 
+#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
+#include <linux/leds.h>
+
+static struct gpio_led igep2_gpio_leds[] = {
+	[0] = {
+		.name = "gpio-led:red:d0",
+		.gpio = IGEP2_GPIO_LED0_RED,
+		.default_trigger = "default-off"
+	},
+	[1] = {
+		.name = "gpio-led:green:d0",
+		.gpio = IGEP2_GPIO_LED0_GREEN,
+		.default_trigger = "default-off",
+	},
+	[2] = {
+		.name = "gpio-led:red:d1",
+		.gpio = IGEP2_GPIO_LED1_RED,
+		.default_trigger = "default-off",
+	},
+	[3] = {
+		.name = "gpio-led:green:d1",
+		.default_trigger = "heartbeat",
+		.gpio = -EINVAL, /* gets replaced */
+	},
+};
+
+static struct gpio_led_platform_data igep2_led_pdata = {
+	.leds           = igep2_gpio_leds,
+	.num_leds       = ARRAY_SIZE(igep2_gpio_leds),
+};
+
+static struct platform_device igep2_led_device = {
+	 .name   = "leds-gpio",
+	 .id     = -1,
+	 .dev    = {
+		 .platform_data  =  &igep2_led_pdata,
+	},
+};
+
+static void __init igep2_leds_init(void)
+{
+	platform_device_register(&igep2_led_device);
+}
+
+#else
+static inline void igep2_leds_init(void)
+{
+	if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
+	    (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
+		gpio_export(IGEP2_GPIO_LED0_RED, 0);
+		gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
+	} else
+		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
+
+	if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
+	    (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
+		gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
+		gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
+	} else
+		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
+
+	if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
+	    (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
+		gpio_export(IGEP2_GPIO_LED1_RED, 0);
+		gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
+	} else
+		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
+
+}
+#endif
+
 static int igep2_twl_gpio_setup(struct device *dev,
 		unsigned gpio, unsigned ngpio)
 {
@@ -274,14 +345,40 @@  static int igep2_twl_gpio_setup(struct device *dev,
 	igep2_vmmc1_supply.dev = mmc[0].dev;
 	igep2_vmmc2_supply.dev = mmc[1].dev;
 
+	/*
+	 * REVISIT: need ehci-omap hooks for external VBUS
+	 * power switch and overcurrent detect
+	 */
+	gpio_request(gpio + 1, "GPIO_EHCI_NOC");
+	gpio_direction_input(gpio + 1);
+
+	/*
+	 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
+	 * (out, active low)
+	 */
+	gpio_request(gpio + TWL4030_GPIO_MAX, 0);
+	gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
+
+	/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
+#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
+	if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
+	    && (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) {
+		gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
+		gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0);
+	} else
+		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n");
+#else
+	igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
+#endif
+
 	return 0;
 };
 
-static struct twl4030_gpio_platform_data igep2_gpio_data = {
+static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = {
 	.gpio_base	= OMAP_MAX_GPIO_LINES,
 	.irq_base	= TWL4030_GPIO_IRQ_BASE,
 	.irq_end	= TWL4030_GPIO_IRQ_END,
-	.use_leds	= false,
+	.use_leds	= true,
 	.setup		= igep2_twl_gpio_setup,
 };
 
@@ -355,47 +452,6 @@  static void __init igep2_display_init(void)
 		pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
 }
 
-#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
-#include <linux/leds.h>
-
-static struct gpio_led igep2_gpio_leds[] = {
-	{
-		.name = "led0:red",
-		.gpio = IGEP2_GPIO_LED0_RED,
-	},
-	{
-		.name = "led0:green",
-		.default_trigger = "heartbeat",
-		.gpio = IGEP2_GPIO_LED0_GREEN,
-	},
-	{
-		.name = "led1:red",
-		.gpio = IGEP2_GPIO_LED1_RED,
-	},
-};
-
-static struct gpio_led_platform_data igep2_led_pdata = {
-	.leds           = igep2_gpio_leds,
-	.num_leds       = ARRAY_SIZE(igep2_gpio_leds),
-};
-
-static struct platform_device igep2_led_device = {
-	 .name   = "leds-gpio",
-	 .id     = -1,
-	 .dev    = {
-		 .platform_data  =  &igep2_led_pdata,
-	},
-};
-
-static void __init igep2_init_led(void)
-{
-	platform_device_register(&igep2_led_device);
-}
-
-#else
-static inline void igep2_init_led(void) {}
-#endif
-
 static struct platform_device *igep2_devices[] __initdata = {
 	&igep2_dss_device,
 };
@@ -425,7 +481,7 @@  static struct twl4030_platform_data igep2_twldata = {
 	/* platform_data for children goes here */
 	.usb		= &igep2_usb_data,
 	.codec		= &igep2_codec_data,
-	.gpio		= &igep2_gpio_data,
+	.gpio		= &igep2_twl4030_gpio_pdata,
 	.vmmc1          = &igep2_vmmc1,
 	.vmmc2		= &igep2_vmmc2,
 	.vpll2		= &igep2_vpll2,
@@ -486,34 +542,10 @@  static void __init igep2_init(void)
 	usb_ehci_init(&ehci_pdata);
 
 	igep2_flash_init();
-	igep2_init_led();
+	igep2_leds_init();
 	igep2_display_init();
 	igep2_init_smsc911x();
 
-	/* GPIO userspace leds */
-#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
-	if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) &&
-	    (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
-		gpio_export(IGEP2_GPIO_LED0_RED, 0);
-		gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
-	} else
-		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
-
-	if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) &&
-	    (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
-		gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
-		gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
-	} else
-		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
-
-	if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) &&
-	    (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
-		gpio_export(IGEP2_GPIO_LED1_RED, 0);
-		gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
-	} else
-		pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
-#endif
-
 	/* GPIO W-LAN + Bluetooth combo module */
 	if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
 	    (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) {