Skip to contentSkip to conversation

omap3: Various fixes and improvements for IGEP v2 board.

PATCH Superseded Enric Balletbo i Serra 2 participants 11 messages Oct 1, 2010 – Oct 5, 2010

Subsystems (3)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover omap3: Various fixes and improvements for IGEP v2 board.

Hello,

This is the version 3 of patch series to fix and improve the IGEP v2 board support.

Changes since v2:
- [1/6] check the result value of gpio_request and gpio_direction_*
- [2/6] align the igep2_gpio_leds with tabs.
- cc linux-arm-kernel

Kind regards,

Enric

#1 lore raw

PATCH v3 1/6 omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.

GPIO for various devices are missing from the board initialization. This patch adds support for the VBUS and over current gpios. Without this patch, input/outputs from these two sources are ignored.

---
 arch/arm/mach-omap2/board-igep0020.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +16 -0
index 175f043..07dbdb7 100644
@@ -274,6 +274,22 @@ 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
+	 */
+	if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
+	    (gpio_direction_input(gpio + 1) < 0))
+		pr_err("IGEP2: Could not obtain gpio for EHCI NOC");
+
+	/*
+	 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
+	 * (out, active low)
+	 */
+	if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
+	    (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
+		pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
+
 	return 0;
 };
 
Signature · 1 line
1.7.0.4
#2 lore raw

PATCH v3 1/6 omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.

Hi,

Quoted 14 lines · ext Enric Balletbo i Serra

GPIO for various devices are missing from the board initialization. This patch adds support for the VBUS and over current gpios. Without this patch, input/outputs from these two sources are ignored.

---
 arch/arm/mach-omap2/board-igep0020.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +0 -0
index 175f043..07dbdb7 100644

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 283

Quoted 10 lines
arch/arm/mach-omap2/board-igep0020.c +7 -0
@@ -274,6 +274,22 @@ 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
+	 */
+	if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
+	    (gpio_direction_input(gpio + 1) < 0))
+		pr_err("IGEP2: Could not obtain gpio for EHCI NOC");

Shouldb't you return error if it can't request the GPIO?

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 291

Quoted 8 lines
arch/arm/mach-omap2/board-igep0020.c +8 -0
+
+	/*
+	 * TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
+	 * (out, active low)
+	 */
+	if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
+	    (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
+		pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");

Same here.

Quoted 11 lines
arch/arm/mach-omap2/board-igep0020.c +1 -0
+
 	return 0;
 };
 
Signature · 6 lines
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#3 lore raw

PATCH v3 1/6 omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.

2010/10/2 David Cohen <[email protected]>:

Quoted 20 lines

Hi,

Quoted 17 lines · ext Enric Balletbo i Serra

GPIO for various devices are missing from the board initialization. This patch adds support for the VBUS and over current gpios. ?Without this patch, input/outputs from these two sources are ignored.

---
?arch/arm/mach-omap2/board-igep0020.c | ? 16 ++++++++++++++++ ?1 files changed, 16 insertions(+), 0 deletions(-)

arch/arm/mach-omap2/board-igep0020.c +0 -0
index 175f043..07dbdb7 100644
@@ -274,6 +274,22 @@ static int igep2_twl_gpio_setup(struct device *dev,
 ? ? ? igep2_vmmc1_supply.dev = mmc[0].dev;
 ? ? ? igep2_vmmc2_supply.dev = mmc[1].dev;
 
Quoted 9 lines

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 283

Quoted 7 lines
arch/arm/mach-omap2/board-igep0020.c +7 -0
+ ? ? /*
+ ? ? ?* REVISIT: need ehci-omap hooks for external VBUS
+ ? ? ?* power switch and overcurrent detect
+ ? ? ?*/
+ ? ? if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
+ ? ? ? ? (gpio_direction_input(gpio + 1) < 0))
+ ? ? ? ? ? ? pr_err("IGEP2: Could not obtain gpio for EHCI NOC");

Shouldb't you return error if it can't request the GPIO?

I'm not sure what happens if I return and error, I see only prints a debug message. Maybe the twl4030-gpio maintainer can explain if I need return and error or not.

Other omap boards just don't check the gpio_request call and always return 0. I don't consider this a critical error so maybe should be better replace the pr_err with a pr_warning.

Quoted 10 lines

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 291

Quoted 9 lines
arch/arm/mach-omap2/board-igep0020.c +8 -0
+
+ ? ? /*
+ ? ? ?* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
+ ? ? ?* (out, active low)
+ ? ? ?*/
+ ? ? if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
+ ? ? ? ? (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
+ ? ? ? ? ? ? pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
Quoted 6 lines

Same here.

Quoted 4 lines
arch/arm/mach-omap2/board-igep0020.c +1 -0
+
 ? ? ? return 0;
 ?};
 

Kind regards,
Enric

#4 lore raw

PATCH v3 1/6 omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.

Quoted 31 lines · ext Enric Balletb? i Serra

2010/10/2 David Cohen <[email protected]>:

Quoted 20 lines

Hi,

Quoted 17 lines · ext Enric Balletbo i Serra

GPIO for various devices are missing from the board initialization. This patch adds support for the VBUS and over current gpios. ?Without this patch, input/outputs from these two sources are ignored.

---
?arch/arm/mach-omap2/board-igep0020.c | ? 16 ++++++++++++++++ ?1 files changed, 16 insertions(+), 0 deletions(-)

arch/arm/mach-omap2/board-igep0020.c +0 -0
index 175f043..07dbdb7 100644
@@ -274,6 +274,22 @@ static int igep2_twl_gpio_setup(struct device *dev,
 ? ? ? igep2_vmmc1_supply.dev = mmc[0].dev;
 ? ? ? igep2_vmmc2_supply.dev = mmc[1].dev;
 
Quoted 9 lines

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 283

Quoted 7 lines
arch/arm/mach-omap2/board-igep0020.c +7 -0
+ ? ? /*
+ ? ? ?* REVISIT: need ehci-omap hooks for external VBUS
+ ? ? ?* power switch and overcurrent detect
+ ? ? ?*/
+ ? ? if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
+ ? ? ? ? (gpio_direction_input(gpio + 1) < 0))
+ ? ? ? ? ? ? pr_err("IGEP2: Could not obtain gpio for EHCI NOC");

Shouldb't you return error if it can't request the GPIO?

Quoted 7 lines

I'm not sure what happens if I return and error, I see only prints a debug message. Maybe the twl4030-gpio maintainer can explain if I need return and error or not.

Other omap boards just don't check the gpio_request call and always return 0. I don't consider this a critical error so maybe should be better replace the pr_err with a pr_warning.

I checked some board files and it seems they're not verifying gpio_request() results most of the times. But if you check board-omap3pandor.c, it's been done in a better way.

Br,

David

#5 lore raw

PATCH v3 1/6 omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.

Hello,

2010/10/5 David Cohen <[email protected]>:

Quoted 36 lines · ext Enric Balletb? i Serra
Quoted 35 lines

2010/10/2 David Cohen <[email protected]>:

Quoted 20 lines

Hi,

Quoted 17 lines · ext Enric Balletbo i Serra

GPIO for various devices are missing from the board initialization. This patch adds support for the VBUS and over current gpios. ?Without this patch, input/outputs from these two sources are ignored.

---
?arch/arm/mach-omap2/board-igep0020.c | ? 16 ++++++++++++++++ ?1 files changed, 16 insertions(+), 0 deletions(-)

arch/arm/mach-omap2/board-igep0020.c +0 -0
index 175f043..07dbdb7 100644
@@ -274,6 +274,22 @@ static int igep2_twl_gpio_setup(struct device *dev,
 ? ? ? igep2_vmmc1_supply.dev = mmc[0].dev;
 ? ? ? igep2_vmmc2_supply.dev = mmc[1].dev;
 
Quoted 9 lines

arch/arm/mach-omap2/board-igep0020.c static int igep2_twl_gpio_setup(struct device *dev, · line 283

Quoted 7 lines
arch/arm/mach-omap2/board-igep0020.c +7 -0
+ ? ? /*
+ ? ? ?* REVISIT: need ehci-omap hooks for external VBUS
+ ? ? ?* power switch and overcurrent detect
+ ? ? ?*/
+ ? ? if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
+ ? ? ? ? (gpio_direction_input(gpio + 1) < 0))
+ ? ? ? ? ? ? pr_err("IGEP2: Could not obtain gpio for EHCI NOC");

Shouldb't you return error if it can't request the GPIO?

I'm not sure what happens if I return and error, I see only prints a debug message. Maybe the twl4030-gpio maintainer can explain if I need return and error or not.

Quoted 8 lines
Quoted 3 lines

Other omap boards just don't check the gpio_request call and always return 0. I don't consider this a critical error so maybe should be better replace the pr_err with a pr_warning.

I checked some board files and it seems they're not verifying gpio_request() results most of the times. But if you check board-omap3pandor.c, it's been done in a better way.

I think so, looks a better way. I'll introduce this in a future patch,

There are many GPIO's in board-igep* so I think should be better introduce these changes in a new patch. Thanks for you comments.

Best regards,

Enric

#6 lore raw

PATCH v3 2/6 omap3: fix and improve the LED handling on IGEP v2 board.

In reply to Enric Balletbo i Serra

The IGEP v2 board has four leds, this patch allows control all of these LEDs using the LED class if CONFIG_LEDS_GPIO is selected or using the General Purpose Input/Output (GPIO) interface if CONFIG_LEDS_GPIO is not selected.

---
 arch/arm/mach-omap2/board-igep0020.c |  156 +++++++++++++++++++---------------
 1 files changed, 87 insertions(+), 69 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +87 -69
index 07dbdb7..83a30ce 100644
@@ -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)
 {
@@ -290,14 +361,26 @@ static int igep2_twl_gpio_setup(struct device *dev,
 	    (gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
 		pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
 
+	/* 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,
 };
 
@@ -371,47 +454,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,
 };
@@ -441,7 +483,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,
@@ -502,34 +544,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)) {
Signature · 1 line
1.7.0.4
#7 lore raw

PATCH v3 3/6 omap3: Introduce function to detect the IGEP v2 hardware revision.

In reply to Enric Balletbo i Serra

There are currently two versions of IGEP v2 board, this patch introduces a function to detect the hardware revision of IGEP board.

--------------------------
| Id. | Hw Rev. | GPIO 28 |
--------------------------

 |  0  |   B/C   |   high   |
 |  1  |   C     |   low    |

--------------------------

---
 arch/arm/mach-omap2/board-igep0020.c |   47 ++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +47 -0
index 83a30ce..ddb46a3 100644
@@ -45,6 +45,49 @@
 #define IGEP2_GPIO_WIFI_NPD 	94
 #define IGEP2_GPIO_WIFI_NRESET 	95
 
+/*
+ * IGEP2 Hardware Revision Table
+ *
+ *  --------------------------
+ * | Id. | Hw Rev. | HW0 (28) |
+ *  --------------------------
+ * |  0  |   B/C   |   high   |
+ * |  1  |   C     |   low    |
+ *  --------------------------
+ */
+
+#define IGEP2_BOARD_HWREV_B	0
+#define IGEP2_BOARD_HWREV_C	1
+
+static u8 hwrev;
+
+static void __init igep2_get_revision(void)
+{
+	u8 ret;
+
+	omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT);
+
+	if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) &&
+	    (gpio_direction_input(IGEP2_GPIO_LED1_RED) == 0)) {
+		ret = gpio_get_value(IGEP2_GPIO_LED1_RED);
+		if (hwrev == 0) {
+			pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n");
+			hwrev = IGEP2_BOARD_HWREV_C;
+		} else if (hwrev ==  1) {
+			pr_info("IGEP2: Hardware Revision B/C (B compatible)\n");
+			hwrev = IGEP2_BOARD_HWREV_B;
+		} else {
+			pr_err("IGEP2: Unknow Hardware Revision\n");
+			hwrev = -1;
+		}
+	} else {
+		pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");
+		pr_err("IGEP2: Unknow Hardware Revision\n");
+	}
+
+	gpio_free(IGEP2_GPIO_LED1_RED);
+}
+
 #if defined(CONFIG_MTD_ONENAND_OMAP2) || \
 	defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
 
@@ -537,6 +580,10 @@ static struct omap_board_mux board_mux[] __initdata = {
 static void __init igep2_init(void)
 {
 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+
+	/* Get IGEP2 hardware revision */
+	igep2_get_revision();
+
 	igep2_i2c_init();
 	platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices));
 	omap_serial_init();
Signature · 1 line
1.7.0.4
#8 lore raw

PATCH v3 4/6 omap3: Fix handling some GPIO's for WLAN-BT combo on IGEP v2.

In reply to Enric Balletbo i Serra

Some GPIO's used by WLAN-BT combo on IGEP v2 depends on hardware revision. This patch handles these GPIO's.

----------------------------------------------------------
| Hw Rev. | WIFI_NPD | WIFI_NRESET | BT_NRESET |
----------------------------------------------------------

 |  B                  | gpio94  |   gpio95    |     -      |
 |  B/C (B-compatible) | gpio94  |   gpio95    |  gpio137   |
 |  C                  | gpio138 |   gpio139   |  gpio137   |

----------------------------------------------------------

---
 arch/arm/mach-omap2/board-igep0020.c |   94 ++++++++++++++++++++++++----------
 1 files changed, 67 insertions(+), 27 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +67 -27
index ddb46a3..ad4bcb1 100644
@@ -38,22 +38,28 @@
 #define IGEP2_SMSC911X_CS       5
 #define IGEP2_SMSC911X_GPIO     176
 #define IGEP2_GPIO_USBH_NRESET  24
-#define IGEP2_GPIO_LED0_GREEN 	26
-#define IGEP2_GPIO_LED0_RED 	27
-#define IGEP2_GPIO_LED1_RED   	28
-#define IGEP2_GPIO_DVI_PUP	170
-#define IGEP2_GPIO_WIFI_NPD 	94
-#define IGEP2_GPIO_WIFI_NRESET 	95
+#define IGEP2_GPIO_LED0_GREEN   26
+#define IGEP2_GPIO_LED0_RED     27
+#define IGEP2_GPIO_LED1_RED     28
+#define IGEP2_GPIO_DVI_PUP      170
+
+#define IGEP2_RB_GPIO_WIFI_NPD     94
+#define IGEP2_RB_GPIO_WIFI_NRESET  95
+#define IGEP2_RB_GPIO_BT_NRESET    137
+#define IGEP2_RC_GPIO_WIFI_NPD     138
+#define IGEP2_RC_GPIO_WIFI_NRESET  139
+#define IGEP2_RC_GPIO_BT_NRESET    137
 
 /*
  * IGEP2 Hardware Revision Table
  *
- *  --------------------------
- * | Id. | Hw Rev. | HW0 (28) |
- *  --------------------------
- * |  0  |   B/C   |   high   |
- * |  1  |   C     |   low    |
- *  --------------------------
+ *  --------------------------------------------------------------------------
+ * | Id. | Hw Rev.            | HW0 (28) | WIFI_NPD | WIFI_NRESET | BT_NRESET |
+ *  --------------------------------------------------------------------------
+ * |  0  | B                  |   high   |  gpio94  |   gpio95    |     -     |
+ * |  0  | B/C (B-compatible) |   high   |  gpio94  |   gpio95    |  gpio137  |
+ * |  1  | C                  |   low    |  gpio138 |   gpio139   |  gpio137  |
+ *  --------------------------------------------------------------------------
  */
 
 #define IGEP2_BOARD_HWREV_B	0
@@ -295,12 +301,14 @@ static struct omap2_hsmmc_info mmc[] = {
 		.gpio_cd	= -EINVAL,
 		.gpio_wp	= -EINVAL,
 	},
+#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
 	{
 		.mmc		= 2,
 		.wires		= 4,
 		.gpio_cd	= -EINVAL,
 		.gpio_wp	= -EINVAL,
 	},
+#endif
 	{}      /* Terminator */
 };
 
@@ -577,6 +585,48 @@ static struct omap_board_mux board_mux[] __initdata = {
 #define board_mux	NULL
 #endif
 
+#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
+
+static void __init igep2_wlan_bt_init(void)
+{
+	unsigned npd, wreset, btreset;
+
+	/* GPIO's for WLAN-BT combo depends on hardware revision */
+	if (hwrev == IGEP2_BOARD_HWREV_B) {
+		npd = IGEP2_RB_GPIO_WIFI_NPD;
+		wreset = IGEP2_RB_GPIO_WIFI_NRESET;
+		btreset = IGEP2_RB_GPIO_BT_NRESET;
+	} else if (hwrev == IGEP2_BOARD_HWREV_B) {
+		npd = IGEP2_RC_GPIO_WIFI_NPD;
+		wreset = IGEP2_RC_GPIO_WIFI_NRESET;
+		btreset = IGEP2_RC_GPIO_BT_NRESET;
+	} else
+		return;
+
+	/* Set GPIO's for  WLAN-BT combo module */
+	if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) &&
+	    (gpio_direction_output(npd, 1) == 0)) {
+		gpio_export(npd, 0);
+	} else
+		pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n");
+
+	if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) &&
+	    (gpio_direction_output(wreset, 1) == 0)) {
+		gpio_export(wreset, 0);
+		gpio_set_value(wreset, 0);
+		udelay(10);
+		gpio_set_value(wreset, 1);
+	} else
+		pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n");
+
+	if ((gpio_request(btreset, "GPIO_BT_NRESET") == 0) &&
+	    (gpio_direction_output(btreset, 1) == 0)) {
+		gpio_export(btreset, 0);
+	} else
+		pr_warning("IGEP2: Could not obtain gpio GPIO_BT_NRESET\n");
+}
+#endif
+
 static void __init igep2_init(void)
 {
 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
@@ -595,22 +645,12 @@ static void __init igep2_init(void)
 	igep2_display_init();
 	igep2_init_smsc911x();
 
-	/* 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)) {
-		gpio_export(IGEP2_GPIO_WIFI_NPD, 0);
-/* 		gpio_set_value(IGEP2_GPIO_WIFI_NPD, 0); */
-	} else
-		pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NPD\n");
+	/*
+	 * WLAN-BT combo module from MuRata wich has a Marvell WLAN
+	 * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
+	 */
+	igep2_wlan_bt_init();
 
-	if ((gpio_request(IGEP2_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
-	    (gpio_direction_output(IGEP2_GPIO_WIFI_NRESET, 1) == 0)) {
-		gpio_export(IGEP2_GPIO_WIFI_NRESET, 0);
-		gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 0);
-		udelay(10);
-		gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 1);
-	} else
-		pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NRESET\n");
 }
 
 MACHINE_START(IGEP0020, "IGEP v2 board")
Signature · 1 line
1.7.0.4
#9 lore raw

PATCH v3 5/6 omap3: Add i2c eeprom driver to read EDID on IGEP v2.

In reply to Enric Balletbo i Serra

Add i2c eeprom driver to access monitor EDID binary information from user space, something that is required by 'decode-edid' and 'parse-edid'.

---
 arch/arm/mach-omap2/board-igep0020.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +17 -7
index ad4bcb1..e253ebc 100644
@@ -541,7 +541,7 @@ static struct twl4030_platform_data igep2_twldata = {
 
 };
 
-static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
+static struct i2c_board_info __initdata igep2_i2c1_boardinfo[] = {
 	{
 		I2C_BOARD_INFO("twl4030", 0x48),
 		.flags		= I2C_CLIENT_WAKE,
@@ -550,13 +550,23 @@ static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
 	},
 };
 
+static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
+	{
+		I2C_BOARD_INFO("eeprom", 0x50),
+	},
+};
+
 static int __init igep2_i2c_init(void)
 {
-	omap_register_i2c_bus(1, 2600, igep2_i2c_boardinfo,
-			ARRAY_SIZE(igep2_i2c_boardinfo));
-	/* Bus 3 is attached to the DVI port where devices like the pico DLP
-	 * projector don't work reliably with 400kHz */
-	omap_register_i2c_bus(3, 100, NULL, 0);
+	omap_register_i2c_bus(1, 2600, igep2_i2c1_boardinfo,
+			ARRAY_SIZE(igep2_i2c1_boardinfo));
+	/*
+	 * Bus 3 is attached to the DVI port where devices like the pico DLP
+	 * projector don't work reliably with 400kHz
+	 */
+	omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
+			 ARRAY_SIZE(igep2_i2c3_boardinfo));
+
 	return 0;
 }
 
@@ -633,7 +643,7 @@ static void __init igep2_init(void)
 
 	/* Get IGEP2 hardware revision */
 	igep2_get_revision();
-
+	/* Register I2C busses and drivers */
 	igep2_i2c_init();
 	platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices));
 	omap_serial_init();
Signature · 1 line
1.7.0.4
#10 lore raw

PATCH v3 6/6 omap3: Remove VMMC2 regulator on IGEP v2.

In reply to Enric Balletbo i Serra

VMMC2 regulator is configured but it's not used for the IGEP v2, so remove this regulator from board.

---
 arch/arm/mach-omap2/board-igep0020.c |   26 +++-----------------------
 1 files changed, 3 insertions(+), 23 deletions(-)
arch/arm/mach-omap2/board-igep0020.c +3 -23
index e253ebc..19187ae 100644
@@ -260,10 +260,6 @@ static struct regulator_consumer_supply igep2_vmmc1_supply = {
 	.supply		= "vmmc",
 };
 
-static struct regulator_consumer_supply igep2_vmmc2_supply = {
-	.supply		= "vmmc",
-};
-
 /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
 static struct regulator_init_data igep2_vmmc1 = {
 	.constraints = {
@@ -279,21 +275,6 @@ static struct regulator_init_data igep2_vmmc1 = {
 	.consumer_supplies      = &igep2_vmmc1_supply,
 };
 
-/* VMMC2 for OMAP VDD_MMC2 (i/o) and MMC2 WIFI */
-static struct regulator_init_data igep2_vmmc2 = {
-	.constraints = {
-		.min_uV			= 1850000,
-		.max_uV			= 3150000,
-		.valid_modes_mask	= REGULATOR_MODE_NORMAL
-					| REGULATOR_MODE_STANDBY,
-		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
-					| REGULATOR_CHANGE_MODE
-					| REGULATOR_CHANGE_STATUS,
-	},
-	.num_consumer_supplies  = 1,
-	.consumer_supplies      = &igep2_vmmc2_supply,
-};
-
 static struct omap2_hsmmc_info mmc[] = {
 	{
 		.mmc		= 1,
@@ -390,11 +371,11 @@ static int igep2_twl_gpio_setup(struct device *dev,
 	mmc[0].gpio_cd = gpio + 0;
 	omap2_hsmmc_init(mmc);
 
-	/* link regulators to MMC adapters ... we "know" the
+	/*
+	 * link regulators to MMC adapters ... we "know" the
 	 * regulators will be set up only *after* we return.
-	*/
+	 */
 	igep2_vmmc1_supply.dev = mmc[0].dev;
-	igep2_vmmc2_supply.dev = mmc[1].dev;
 
 	/*
 	 * REVISIT: need ehci-omap hooks for external VBUS
@@ -536,7 +517,6 @@ static struct twl4030_platform_data igep2_twldata = {
 	.codec		= &igep2_codec_data,
 	.gpio		= &igep2_twl4030_gpio_pdata,
 	.vmmc1          = &igep2_vmmc1,
-	.vmmc2		= &igep2_vmmc2,
 	.vpll2		= &igep2_vpll2,
 
 };
Signature · 1 line
1.7.0.4