RE: [PATCH v2] omap: 4430sdp board support for the the GPIO keys

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




>>-----Original Message-----
>>From: linux-omap-owner@xxxxxxxxxxxxxxx [mailto:linux-omap-owner@xxxxxxxxxxxxxxx] On Behalf Of
>>Shubhrajyoti D
>>Sent: Tuesday, August 24, 2010 10:58 AM
>>To: linux-omap@xxxxxxxxxxxxxxx
>>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 <shubhrajyoti@xxxxxx>
>>---
>> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux