* [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board.
@ 2010-10-01 19:45 Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on " Enric Balletbo i Serra
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap
Hello,
This is the second version of a patch series to fix and improve the IGEP v2 support,
in this version I only added proper patch descriptions.
Please consider to add in next merge window, thanks.
Kind regards,
Enric
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-01 19:59 ` Tony Lindgren
2010-10-01 19:45 ` [PATCHv2 2/6] omap3: fix and improve the LED handling " Enric Balletbo i Serra
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: 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.
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 175f043..1052a63 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -274,6 +274,20 @@ 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);
+
return 0;
};
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv2 2/6] omap3: fix and improve the LED handling on IGEP v2 board.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on " Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-01 20:02 ` Tony Lindgren
2010-10-01 19:45 ` [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision Enric Balletbo i Serra
` (4 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: 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.
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 156 +++++++++++++++++++---------------
1 files changed, 87 insertions(+), 69 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 1052a63..9f25d0d 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)
{
@@ -288,14 +359,26 @@ static int igep2_twl_gpio_setup(struct device *dev,
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,
};
@@ -369,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,
};
@@ -439,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,
@@ -500,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
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on " Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 2/6] omap3: fix and improve the LED handling " Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-04 4:49 ` Varadarajan, Charulatha
2010-10-01 19:45 ` [PATCHv2 4/6] omap3: Fix handling some GPIO's for WLAN-BT combo on IGEP v2 Enric Balletbo i Serra
` (3 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: 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 |
--------------------------
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 47 ++++++++++++++++++++++++++++++++++
1 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 9f25d0d..a386425 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -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)
@@ -535,6 +578,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();
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv2 4/6] omap3: Fix handling some GPIO's for WLAN-BT combo on IGEP v2.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
` (2 preceding siblings ...)
2010-10-01 19:45 ` [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID " Enric Balletbo i Serra
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: 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 |
----------------------------------------------------------
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 94 ++++++++++++++++++++++++----------
1 files changed, 67 insertions(+), 27 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index a386425..ec7da7f 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -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 */
};
@@ -575,6 +583,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);
@@ -593,22 +643,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")
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID on IGEP v2.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
` (3 preceding siblings ...)
2010-10-01 19:45 ` [PATCHv2 4/6] omap3: Fix handling some GPIO's for WLAN-BT combo on IGEP v2 Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-04 4:51 ` Varadarajan, Charulatha
2010-10-01 19:45 ` [PATCHv2 6/6] omap3: Remove VMMC2 regulator " Enric Balletbo i Serra
2010-10-01 20:07 ` [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Tony Lindgren
6 siblings, 1 reply; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: 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'.
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 24 +++++++++++++++++-------
1 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index ec7da7f..c5eaa43 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -539,7 +539,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,
@@ -548,13 +548,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;
}
@@ -631,7 +641,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();
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCHv2 6/6] omap3: Remove VMMC2 regulator on IGEP v2.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
` (4 preceding siblings ...)
2010-10-01 19:45 ` [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID " Enric Balletbo i Serra
@ 2010-10-01 19:45 ` Enric Balletbo i Serra
2010-10-01 20:07 ` [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Tony Lindgren
6 siblings, 0 replies; 12+ messages in thread
From: Enric Balletbo i Serra @ 2010-10-01 19:45 UTC (permalink / raw)
To: linux-omap; +Cc: Enric Balletbo i Serra
VMMC2 regulator is configured but it's not used for the IGEP v2, so
remove this regulator from board.
Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
---
arch/arm/mach-omap2/board-igep0020.c | 26 +++-----------------------
1 files changed, 3 insertions(+), 23 deletions(-)
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index c5eaa43..fa450b1 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -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
@@ -534,7 +515,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,
};
--
1.7.0.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on IGEP v2 board.
2010-10-01 19:45 ` [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on " Enric Balletbo i Serra
@ 2010-10-01 19:59 ` Tony Lindgren
0 siblings, 0 replies; 12+ messages in thread
From: Tony Lindgren @ 2010-10-01 19:59 UTC (permalink / raw)
To: Enric Balletbo i Serra; +Cc: linux-omap
* Enric Balletbo i Serra <eballetbo@gmail.com> [101001 12:37]:
> 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.
>
> Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> ---
> arch/arm/mach-omap2/board-igep0020.c | 14 ++++++++++++++
> 1 files changed, 14 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
> index 175f043..1052a63 100644
> --- a/arch/arm/mach-omap2/board-igep0020.c
> +++ b/arch/arm/mach-omap2/board-igep0020.c
> @@ -274,6 +274,20 @@ 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);
> +
> return 0;
> };
Please check the result value.. gpio_request can fail.
Tony
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv2 2/6] omap3: fix and improve the LED handling on IGEP v2 board.
2010-10-01 19:45 ` [PATCHv2 2/6] omap3: fix and improve the LED handling " Enric Balletbo i Serra
@ 2010-10-01 20:02 ` Tony Lindgren
0 siblings, 0 replies; 12+ messages in thread
From: Tony Lindgren @ 2010-10-01 20:02 UTC (permalink / raw)
To: Enric Balletbo i Serra; +Cc: linux-omap
* Enric Balletbo i Serra <eballetbo@gmail.com> [101001 12:38]:
> 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.
>
> Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> ---
> arch/arm/mach-omap2/board-igep0020.c | 156 +++++++++++++++++++---------------
> 1 files changed, 87 insertions(+), 69 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
> index 1052a63..9f25d0d 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 */
> + },
> +};
Please align the igep2_gpio_leds with tabs like you
do already below.
Regards,
Tony
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board.
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
` (5 preceding siblings ...)
2010-10-01 19:45 ` [PATCHv2 6/6] omap3: Remove VMMC2 regulator " Enric Balletbo i Serra
@ 2010-10-01 20:07 ` Tony Lindgren
6 siblings, 0 replies; 12+ messages in thread
From: Tony Lindgren @ 2010-10-01 20:07 UTC (permalink / raw)
To: Enric Balletbo i Serra; +Cc: linux-omap
* Enric Balletbo i Serra <eballetbo@gmail.com> [101001 12:37]:
>
> Hello,
>
> This is the second version of a patch series to fix and improve the IGEP v2 support,
> in this version I only added proper patch descriptions.
>
> Please consider to add in next merge window, thanks.
Looks good except for the few comments I made to the patches.
Can you please repost one more time with linux-arm-kernel Cc'd?
That way I don't need to repost your patches before merging.
Regards,
Tony
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision.
2010-10-01 19:45 ` [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision Enric Balletbo i Serra
@ 2010-10-04 4:49 ` Varadarajan, Charulatha
0 siblings, 0 replies; 12+ messages in thread
From: Varadarajan, Charulatha @ 2010-10-04 4:49 UTC (permalink / raw)
To: Enric Balletbo i Serra, linux-omap@vger.kernel.org
> -----Original Message-----
> From: linux-omap-owner@vger.kernel.org
> [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Enric
> Balletbo i Serra
> Sent: Saturday, October 02, 2010 1:16 AM
> To: linux-omap@vger.kernel.org
> Cc: Enric Balletbo i Serra
> Subject: [PATCHv2 3/6] omap3: Introduce function to detect
> the IGEP v2 hardware revision.
>
> 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 |
> --------------------------
>
> Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> ---
> arch/arm/mach-omap2/board-igep0020.c | 47
> ++++++++++++++++++++++++++++++++++
> 1 files changed, 47 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-igep0020.c
> b/arch/arm/mach-omap2/board-igep0020.c
> index 9f25d0d..a386425 100644
> --- a/arch/arm/mach-omap2/board-igep0020.c
> +++ b/arch/arm/mach-omap2/board-igep0020.c
> @@ -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");
typo - Unknow
> + hwrev = -1;
> + }
> + } else {
> + pr_warning("IGEP2: Could not obtain gpio
> GPIO_HW0_REV\n");
> + pr_err("IGEP2: Unknow Hardware Revision\n");
Need both the prints?
> + }
typo - Unknow
> +
> + gpio_free(IGEP2_GPIO_LED1_RED);
> +}
> +
> #if defined(CONFIG_MTD_ONENAND_OMAP2) || \
> defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
>
> @@ -535,6 +578,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();
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID on IGEP v2.
2010-10-01 19:45 ` [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID " Enric Balletbo i Serra
@ 2010-10-04 4:51 ` Varadarajan, Charulatha
0 siblings, 0 replies; 12+ messages in thread
From: Varadarajan, Charulatha @ 2010-10-04 4:51 UTC (permalink / raw)
To: Enric Balletbo i Serra, linux-omap@vger.kernel.org
> -----Original Message-----
> From: linux-omap-owner@vger.kernel.org
> [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of Enric
> Balletbo i Serra
> Sent: Saturday, October 02, 2010 1:16 AM
> To: linux-omap@vger.kernel.org
> Cc: Enric Balletbo i Serra
> Subject: [PATCHv2 5/6] omap3: Add i2c eeprom driver to read
> EDID on IGEP v2.
>
> Add i2c eeprom driver to access monitor EDID binary information
> from user space, something that is required by 'decode-edid' and
> 'parse-edid'.
>
> Signed-off-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> ---
> arch/arm/mach-omap2/board-igep0020.c | 24 +++++++++++++++++-------
> 1 files changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-igep0020.c
> b/arch/arm/mach-omap2/board-igep0020.c
> index ec7da7f..c5eaa43 100644
> --- a/arch/arm/mach-omap2/board-igep0020.c
> +++ b/arch/arm/mach-omap2/board-igep0020.c
> @@ -539,7 +539,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,
> @@ -548,13 +548,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));
Check for return value.
> + /*
> + * 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));
Check for return value.
> +
> return 0;
> }
>
> @@ -631,7 +641,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();
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2010-10-04 4:51 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-01 19:45 [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 1/6] omap3: Add external VBUS power switch and overcurrent detect on " Enric Balletbo i Serra
2010-10-01 19:59 ` Tony Lindgren
2010-10-01 19:45 ` [PATCHv2 2/6] omap3: fix and improve the LED handling " Enric Balletbo i Serra
2010-10-01 20:02 ` Tony Lindgren
2010-10-01 19:45 ` [PATCHv2 3/6] omap3: Introduce function to detect the IGEP v2 hardware revision Enric Balletbo i Serra
2010-10-04 4:49 ` Varadarajan, Charulatha
2010-10-01 19:45 ` [PATCHv2 4/6] omap3: Fix handling some GPIO's for WLAN-BT combo on IGEP v2 Enric Balletbo i Serra
2010-10-01 19:45 ` [PATCHv2 5/6] omap3: Add i2c eeprom driver to read EDID " Enric Balletbo i Serra
2010-10-04 4:51 ` Varadarajan, Charulatha
2010-10-01 19:45 ` [PATCHv2 6/6] omap3: Remove VMMC2 regulator " Enric Balletbo i Serra
2010-10-01 20:07 ` [PATCHv2 0/6] omap3: Various fixes and improvements for IGEP v2 board Tony Lindgren
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.