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

Commit 84767d00 authored by Roman Moravcik's avatar Roman Moravcik Committed by Dmitry Torokhov
Browse files

Input: gpio_keys - add support for switches (EV_SW)

parent bc95f366
Loading
Loading
Loading
Loading
+12 −7
Original line number Original line Diff line number Diff line
@@ -35,11 +35,14 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
	struct input_dev *input = platform_get_drvdata(pdev);
	struct input_dev *input = platform_get_drvdata(pdev);


	for (i = 0; i < pdata->nbuttons; i++) {
	for (i = 0; i < pdata->nbuttons; i++) {
		int gpio = pdata->buttons[i].gpio;
		struct gpio_keys_button *button = &pdata->buttons[i];
		int gpio = button->gpio;

		if (irq == gpio_to_irq(gpio)) {
		if (irq == gpio_to_irq(gpio)) {
			int state = (gpio_get_value(gpio) ? 1 : 0) ^ (pdata->buttons[i].active_low);
			unsigned int type = button->type ?: EV_KEY;
			int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;


			input_report_key(input, pdata->buttons[i].keycode, state);
			input_event(input, type, button->code, !!state);
			input_sync(input);
			input_sync(input);
		}
		}
	}
	}
@@ -71,19 +74,21 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
	input->id.version = 0x0100;
	input->id.version = 0x0100;


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


		set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
		set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
		error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM,
		error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM,
				     pdata->buttons[i].desc ? pdata->buttons[i].desc : "gpio_keys",
				     button->desc ? button->desc : "gpio_keys",
				     pdev);
				     pdev);
		if (error) {
		if (error) {
			printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n",
			printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n",
				irq, error);
				irq, error);
			goto fail;
			goto fail;
		}
		}
		set_bit(code, input->keybit);

		input_set_capability(input, type, button->code);
	}
	}


	error = input_register_device(input);
	error = input_register_device(input);
+2 −1
Original line number Original line Diff line number Diff line
@@ -3,10 +3,11 @@


struct gpio_keys_button {
struct gpio_keys_button {
	/* Configuration parameters */
	/* Configuration parameters */
	int keycode;
	int code;		/* input event code (KEY_*, SW_*) */
	int gpio;
	int gpio;
	int active_low;
	int active_low;
	char *desc;
	char *desc;
	int type;		/* input event type (EV_KEY, EV_SW) */
};
};


struct gpio_keys_platform_data {
struct gpio_keys_platform_data {