diff options
-rw-r--r-- | drivers/input/keyboard/gpio_keys.c | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index b236709a2c01..8941a8ba89bf 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -73,6 +73,57 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id) | |||
73 | return IRQ_HANDLED; | 73 | return IRQ_HANDLED; |
74 | } | 74 | } |
75 | 75 | ||
76 | static int __devinit gpio_keys_setup_key(struct device *dev, | ||
77 | struct gpio_button_data *bdata, | ||
78 | struct gpio_keys_button *button) | ||
79 | { | ||
80 | char *desc = button->desc ? button->desc : "gpio_keys"; | ||
81 | int irq, error; | ||
82 | |||
83 | setup_timer(&bdata->timer, gpio_keys_timer, (unsigned long)bdata); | ||
84 | INIT_WORK(&bdata->work, gpio_keys_report_event); | ||
85 | |||
86 | error = gpio_request(button->gpio, desc); | ||
87 | if (error < 0) { | ||
88 | dev_err(dev, "failed to request GPIO %d, error %d\n", | ||
89 | button->gpio, error); | ||
90 | goto fail2; | ||
91 | } | ||
92 | |||
93 | error = gpio_direction_input(button->gpio); | ||
94 | if (error < 0) { | ||
95 | dev_err(dev, "failed to configure" | ||
96 | " direction for GPIO %d, error %d\n", | ||
97 | button->gpio, error); | ||
98 | goto fail3; | ||
99 | } | ||
100 | |||
101 | irq = gpio_to_irq(button->gpio); | ||
102 | if (irq < 0) { | ||
103 | error = irq; | ||
104 | dev_err(dev, "Unable to get irq number for GPIO %d, error %d\n", | ||
105 | button->gpio, error); | ||
106 | goto fail3; | ||
107 | } | ||
108 | |||
109 | error = request_irq(irq, gpio_keys_isr, | ||
110 | IRQF_SHARED | | ||
111 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | ||
112 | desc, bdata); | ||
113 | if (error) { | ||
114 | dev_err(dev, "Unable to claim irq %d; error %d\n", | ||
115 | irq, error); | ||
116 | goto fail3; | ||
117 | } | ||
118 | |||
119 | return 0; | ||
120 | |||
121 | fail3: | ||
122 | gpio_free(button->gpio); | ||
123 | fail2: | ||
124 | return error; | ||
125 | } | ||
126 | |||
76 | static int __devinit gpio_keys_probe(struct platform_device *pdev) | 127 | static int __devinit gpio_keys_probe(struct platform_device *pdev) |
77 | { | 128 | { |
78 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | 129 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; |
@@ -112,52 +163,14 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
112 | for (i = 0; i < pdata->nbuttons; i++) { | 163 | for (i = 0; i < pdata->nbuttons; i++) { |
113 | struct gpio_keys_button *button = &pdata->buttons[i]; | 164 | struct gpio_keys_button *button = &pdata->buttons[i]; |
114 | struct gpio_button_data *bdata = &ddata->data[i]; | 165 | struct gpio_button_data *bdata = &ddata->data[i]; |
115 | int irq; | ||
116 | unsigned int type = button->type ?: EV_KEY; | 166 | unsigned int type = button->type ?: EV_KEY; |
117 | 167 | ||
118 | bdata->input = input; | 168 | bdata->input = input; |
119 | bdata->button = button; | 169 | bdata->button = button; |
120 | setup_timer(&bdata->timer, | ||
121 | gpio_keys_timer, (unsigned long)bdata); | ||
122 | INIT_WORK(&bdata->work, gpio_keys_report_event); | ||
123 | |||
124 | error = gpio_request(button->gpio, button->desc ?: "gpio_keys"); | ||
125 | if (error < 0) { | ||
126 | dev_err(dev, "failed to request GPIO %d, error %d\n", | ||
127 | button->gpio, error); | ||
128 | goto fail2; | ||
129 | } | ||
130 | 170 | ||
131 | error = gpio_direction_input(button->gpio); | 171 | error = gpio_keys_setup_key(dev, bdata, button); |
132 | if (error < 0) { | 172 | if (error) |
133 | dev_err(dev, "failed to configure" | ||
134 | " direction for GPIO %d, error %d\n", | ||
135 | button->gpio, error); | ||
136 | gpio_free(button->gpio); | ||
137 | goto fail2; | 173 | goto fail2; |
138 | } | ||
139 | |||
140 | irq = gpio_to_irq(button->gpio); | ||
141 | if (irq < 0) { | ||
142 | error = irq; | ||
143 | dev_err(dev, "Unable to get irq number " | ||
144 | "for GPIO %d, error %d\n", | ||
145 | button->gpio, error); | ||
146 | gpio_free(button->gpio); | ||
147 | goto fail2; | ||
148 | } | ||
149 | |||
150 | error = request_irq(irq, gpio_keys_isr, | ||
151 | IRQF_SHARED | | ||
152 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | ||
153 | button->desc ? button->desc : "gpio_keys", | ||
154 | bdata); | ||
155 | if (error) { | ||
156 | dev_err(dev, "Unable to claim irq %d; error %d\n", | ||
157 | irq, error); | ||
158 | gpio_free(button->gpio); | ||
159 | goto fail2; | ||
160 | } | ||
161 | 174 | ||
162 | if (button->wakeup) | 175 | if (button->wakeup) |
163 | wakeup = 1; | 176 | wakeup = 1; |