>>-----Original Message-----
>>From: [email protected] 
>>[mailto:[email protected]] On Behalf Of
>>Shubhrajyoti D
>>Sent: Tuesday, August 24, 2010 10:58 AM
>>To: [email protected]
>>Cc: Datta, Shubhrajyoti
>>Subject: [PATCH v2] omap: 4430sdp board support for the the GPIO keys
>>
>>omap 4430sdp board support for the GPIO keys.
>>The proximity sensor is connected to GPIO and is registered as a
>>GPIO key.
>>- Making the default state of the sensor off at bootup
>>
>>Signed-off-by: Shubhrajyoti D <[email protected]>
>>---
>> arch/arm/mach-omap2/board-4430sdp.c |   61 
>> +++++++++++++++++++++++++++++++++++
>> 1 files changed, 61 insertions(+), 0 deletions(-)
>>
>>diff --git a/arch/arm/mach-omap2/board-4430sdp.c 
>>b/arch/arm/mach-omap2/board-4430sdp.c
>>index 9447644..85b0e0c 100644
>>--- a/arch/arm/mach-omap2/board-4430sdp.c
>>+++ b/arch/arm/mach-omap2/board-4430sdp.c
>>@@ -20,6 +20,7 @@
>> #include <linux/usb/otg.h>
>> #include <linux/spi/spi.h>
>> #include <linux/i2c/twl.h>
>>+#include <linux/gpio_keys.h>
>> #include <linux/regulator/machine.h>
>> #include <linux/leds.h>
>>
>>@@ -40,6 +41,8 @@
>> #define ETH_KS8851_IRQ                       34
>> #define ETH_KS8851_POWER_ON          48
>> #define ETH_KS8851_QUART             138
>>+#define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO     184
>>+#define OMAP4_SFH7741_ENABLE_GPIO            188
>>
>> static struct gpio_led sdp4430_gpio_leds[] = {
>>      {
>>@@ -77,11 +80,47 @@ static struct gpio_led sdp4430_gpio_leds[] = {
>>
>> };
>>
>>+static struct gpio_keys_button sdp4430_gpio_keys[] = {
>>+     {
>>+             .desc                   = "Proximity Sensor",
>>+             .type                   = EV_SW,
>>+             .code                   = SW_FRONT_PROXIMITY,
>>+             .gpio                   = OMAP4_SFH7741_SENSOR_OUTPUT_GPIO,
>>+             .active_low             = 0,
>>+     }
>>+};
>>+
>> static struct gpio_led_platform_data sdp4430_led_data = {
>>      .leds   = sdp4430_gpio_leds,
>>      .num_leds       = ARRAY_SIZE(sdp4430_gpio_leds),
>> };
>>
>>+static int omap_prox_activate(struct device *dev)
>>+{
>>+     gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 1);
>>+     return 0;
>>+}
>>+
>>+static void omap_prox_deactivate(struct device *dev)
>>+{
>>+     gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 0);
>>+}
>>+
>>+static struct gpio_keys_platform_data sdp4430_gpio_keys_data = {
>>+     .buttons        = sdp4430_gpio_keys,
>>+     .nbuttons       = ARRAY_SIZE(sdp4430_gpio_keys),
>>+     .enable         = omap_prox_activate,
>>+     .disable        = omap_prox_deactivate,
>>+};
>>+
>>+static struct platform_device sdp4430_gpio_keys_device = {
>>+     .name   = "gpio-keys",
>>+     .id     = -1,
>>+     .dev    = {
>>+             .platform_data  = &sdp4430_gpio_keys_data,
>>+     },
>>+};
>>+
>> static struct platform_device sdp4430_leds_gpio = {
>>      .name   = "leds-gpio",
>>      .id     = -1,
>>@@ -161,6 +200,7 @@ static struct platform_device sdp4430_lcd_device = {
>>
>> static struct platform_device *sdp4430_devices[] __initdata = {
>>      &sdp4430_lcd_device,
>>+     &sdp4430_gpio_keys_device,
>>      &sdp4430_leds_gpio,
>> };
>>
>>@@ -426,6 +466,26 @@ static int __init omap4_i2c_init(void)
>>      omap_register_i2c_bus(4, 400, NULL, 0);
>>      return 0;
>> }
>>+
>>+static void __init omap_sfh7741prox_init(void)
>>+{
>>+     int  error;
>>+
>>+     error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "sfh7741");
>>+     if (error < 0) {
>>+             pr_err("%s:failed to request GPIO %d, error %d\n",
>>+                     __func__, OMAP4_SFH7741_ENABLE_GPIO, error);
>>+             return;
>>+     }
>>+
>>+     error = gpio_direction_output(OMAP4_SFH7741_ENABLE_GPIO , 0);
>>+     if (error < 0) {
>>+             pr_err("%s: GPIO configuration failed: GPIO %d,error %d\n",
>>+                      __func__, OMAP4_SFH7741_ENABLE_GPIO, error);
>>+             gpio_free(OMAP4_SFH7741_ENABLE_GPIO);
>>+     }
>>+}
>>+
>> static void __init omap_4430sdp_init(void)
>> {
>>      int status;
>>@@ -448,6 +508,7 @@ static void __init omap_4430sdp_init(void)
>>              spi_register_board_info(sdp4430_spi_board_info,
>>                              ARRAY_SIZE(sdp4430_spi_board_info));
>>      }
>>+     omap_sfh7741prox_init();

Hello Shubro,

I believe you are calling omap_sfh7741prox_init at the end of omap_4430sdp_init
which means your sdp4430_gpio_keys_device is registered much before this.
This could mean that the probe of your gpio-keys driver could get called before
omap_sfh7741prox_init. Assume this is the case and your probe calls into 
pdata->enable
or pdata->disable which is omap_prox_activate/omap_prox_deactivate as per this
patch, these API's will try accessing gpio APIs for OMAP4_SFH7741_ENABLE_GPIO 
without
a gpio_request happening for this pin as omap_sfh7741prox_init is called later.
Maybe such a case might never arise. But I would say you should do a 
request_gpio for
OMAP4_SFH7741_ENABLE_GPIO before the driver probe is called.

Regards
Thara
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to