Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a2e3911 authored by Herbert Valerio Riedel's avatar Herbert Valerio Riedel Committed by Dmitry Torokhov
Browse files

Input: gpio-keys - request and configure GPIOs



Currently, gpio_keys.c assumes the GPIOs to be already properly configured;
this patch changes gpio-keys to perform explicit calls to gpio_request() and
gpio_configure_input().

This matches the behaviour of leds-gpio.

Signed-off-by: default avatarHerbert Valerio Riedel <hvr@gnu.org>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 8bf4215e
Loading
Loading
Loading
Loading
+28 −10
Original line number Diff line number Diff line
@@ -75,16 +75,32 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)

	for (i = 0; i < pdata->nbuttons; i++) {
		struct gpio_keys_button *button = &pdata->buttons[i];
		int irq = gpio_to_irq(button->gpio);
		int irq;
		unsigned int type = button->type ?: EV_KEY;

		error = gpio_request(button->gpio, button->desc ?: "gpio_keys");
		if (error < 0) {
			pr_err("gpio-keys: failed to request GPIO %d,"
				" error %d\n", button->gpio, error);
			goto fail;
		}

		error = gpio_direction_input(button->gpio);
		if (error < 0) {
			pr_err("gpio-keys: failed to configure input"
				" direction for GPIO %d, error %d\n",
				button->gpio, error);
			gpio_free(button->gpio);
			goto fail;
		}

		irq = gpio_to_irq(button->gpio);
		if (irq < 0) {
			error = irq;
			printk(KERN_ERR
				"gpio-keys: "
				"Unable to get irq number for GPIO %d,"
				"error %d\n",
			pr_err("gpio-keys: Unable to get irq number"
				" for GPIO %d, error %d\n",
				button->gpio, error);
			gpio_free(button->gpio);
			goto fail;
		}

@@ -94,9 +110,9 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
				    button->desc ? button->desc : "gpio_keys",
				    pdev);
		if (error) {
			printk(KERN_ERR
				"gpio-keys: Unable to claim irq %d; error %d\n",
			pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
				irq, error);
			gpio_free(button->gpio);
			goto fail;
		}

@@ -108,8 +124,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)

	error = input_register_device(input);
	if (error) {
		printk(KERN_ERR
			"gpio-keys: Unable to register input device, "
		pr_err("gpio-keys: Unable to register input device, "
			"error: %d\n", error);
		goto fail;
	}
@@ -119,8 +134,10 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
	return 0;

 fail:
	while (--i >= 0)
	while (--i >= 0) {
		free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
		gpio_free(pdata->buttons[i].gpio);
	}

	platform_set_drvdata(pdev, NULL);
	input_free_device(input);
@@ -139,6 +156,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
	for (i = 0; i < pdata->nbuttons; i++) {
		int irq = gpio_to_irq(pdata->buttons[i].gpio);
		free_irq(irq, pdev);
		gpio_free(pdata->buttons[i].gpio);
	}

	input_unregister_device(input);