aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/spear-keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/keyboard/spear-keyboard.c')
-rw-r--r--drivers/input/keyboard/spear-keyboard.c98
1 files changed, 41 insertions, 57 deletions
diff --git a/drivers/input/keyboard/spear-keyboard.c b/drivers/input/keyboard/spear-keyboard.c
index c7ca97f44bfb..695d237417d6 100644
--- a/drivers/input/keyboard/spear-keyboard.c
+++ b/drivers/input/keyboard/spear-keyboard.c
@@ -55,15 +55,15 @@
55 55
56struct spear_kbd { 56struct spear_kbd {
57 struct input_dev *input; 57 struct input_dev *input;
58 struct resource *res;
59 void __iomem *io_base; 58 void __iomem *io_base;
60 struct clk *clk; 59 struct clk *clk;
61 unsigned int irq; 60 unsigned int irq;
62 unsigned int mode; 61 unsigned int mode;
62 unsigned int suspended_rate;
63 unsigned short last_key; 63 unsigned short last_key;
64 unsigned short keycodes[NUM_ROWS * NUM_COLS]; 64 unsigned short keycodes[NUM_ROWS * NUM_COLS];
65 bool rep; 65 bool rep;
66 unsigned int suspended_rate; 66 bool irq_wake_enabled;
67 u32 mode_ctl_reg; 67 u32 mode_ctl_reg;
68}; 68};
69 69
@@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev)
146} 146}
147 147
148#ifdef CONFIG_OF 148#ifdef CONFIG_OF
149static int __devinit spear_kbd_parse_dt(struct platform_device *pdev, 149static int spear_kbd_parse_dt(struct platform_device *pdev,
150 struct spear_kbd *kbd) 150 struct spear_kbd *kbd)
151{ 151{
152 struct device_node *np = pdev->dev.of_node; 152 struct device_node *np = pdev->dev.of_node;
@@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev,
181} 181}
182#endif 182#endif
183 183
184static int __devinit spear_kbd_probe(struct platform_device *pdev) 184static int spear_kbd_probe(struct platform_device *pdev)
185{ 185{
186 struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev); 186 struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev);
187 const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL; 187 const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL;
@@ -203,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
203 return irq; 203 return irq;
204 } 204 }
205 205
206 kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); 206 kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL);
207 input_dev = input_allocate_device(); 207 if (!kbd) {
208 if (!kbd || !input_dev) { 208 dev_err(&pdev->dev, "not enough memory for driver data\n");
209 dev_err(&pdev->dev, "out of memory\n"); 209 return -ENOMEM;
210 error = -ENOMEM; 210 }
211 goto err_free_mem; 211
212 input_dev = devm_input_allocate_device(&pdev->dev);
213 if (!input_dev) {
214 dev_err(&pdev->dev, "unable to allocate input device\n");
215 return -ENOMEM;
212 } 216 }
213 217
214 kbd->input = input_dev; 218 kbd->input = input_dev;
@@ -217,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
217 if (!pdata) { 221 if (!pdata) {
218 error = spear_kbd_parse_dt(pdev, kbd); 222 error = spear_kbd_parse_dt(pdev, kbd);
219 if (error) 223 if (error)
220 goto err_free_mem; 224 return error;
221 } else { 225 } else {
222 kbd->mode = pdata->mode; 226 kbd->mode = pdata->mode;
223 kbd->rep = pdata->rep; 227 kbd->rep = pdata->rep;
224 kbd->suspended_rate = pdata->suspended_rate; 228 kbd->suspended_rate = pdata->suspended_rate;
225 } 229 }
226 230
227 kbd->res = request_mem_region(res->start, resource_size(res), 231 kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);
228 pdev->name);
229 if (!kbd->res) {
230 dev_err(&pdev->dev, "keyboard region already claimed\n");
231 error = -EBUSY;
232 goto err_free_mem;
233 }
234
235 kbd->io_base = ioremap(res->start, resource_size(res));
236 if (!kbd->io_base) { 232 if (!kbd->io_base) {
237 dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); 233 dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n");
238 error = -ENOMEM; 234 return -ENOMEM;
239 goto err_release_mem_region;
240 } 235 }
241 236
242 kbd->clk = clk_get(&pdev->dev, NULL); 237 kbd->clk = devm_clk_get(&pdev->dev, NULL);
243 if (IS_ERR(kbd->clk)) { 238 if (IS_ERR(kbd->clk))
244 error = PTR_ERR(kbd->clk); 239 return PTR_ERR(kbd->clk);
245 goto err_iounmap;
246 }
247 240
248 input_dev->name = "Spear Keyboard"; 241 input_dev->name = "Spear Keyboard";
249 input_dev->phys = "keyboard/input0"; 242 input_dev->phys = "keyboard/input0";
250 input_dev->dev.parent = &pdev->dev;
251 input_dev->id.bustype = BUS_HOST; 243 input_dev->id.bustype = BUS_HOST;
252 input_dev->id.vendor = 0x0001; 244 input_dev->id.vendor = 0x0001;
253 input_dev->id.product = 0x0001; 245 input_dev->id.product = 0x0001;
@@ -259,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
259 kbd->keycodes, input_dev); 251 kbd->keycodes, input_dev);
260 if (error) { 252 if (error) {
261 dev_err(&pdev->dev, "Failed to build keymap\n"); 253 dev_err(&pdev->dev, "Failed to build keymap\n");
262 goto err_put_clk; 254 return error;
263 } 255 }
264 256
265 if (kbd->rep) 257 if (kbd->rep)
@@ -268,48 +260,36 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
268 260
269 input_set_drvdata(input_dev, kbd); 261 input_set_drvdata(input_dev, kbd);
270 262
271 error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); 263 error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0,
264 "keyboard", kbd);
272 if (error) { 265 if (error) {
273 dev_err(&pdev->dev, "request_irq fail\n"); 266 dev_err(&pdev->dev, "request_irq failed\n");
274 goto err_put_clk; 267 return error;
275 } 268 }
276 269
270 error = clk_prepare(kbd->clk);
271 if (error)
272 return error;
273
277 error = input_register_device(input_dev); 274 error = input_register_device(input_dev);
278 if (error) { 275 if (error) {
279 dev_err(&pdev->dev, "Unable to register keyboard device\n"); 276 dev_err(&pdev->dev, "Unable to register keyboard device\n");
280 goto err_free_irq; 277 clk_unprepare(kbd->clk);
278 return error;
281 } 279 }
282 280
283 device_init_wakeup(&pdev->dev, 1); 281 device_init_wakeup(&pdev->dev, 1);
284 platform_set_drvdata(pdev, kbd); 282 platform_set_drvdata(pdev, kbd);
285 283
286 return 0; 284 return 0;
287
288err_free_irq:
289 free_irq(kbd->irq, kbd);
290err_put_clk:
291 clk_put(kbd->clk);
292err_iounmap:
293 iounmap(kbd->io_base);
294err_release_mem_region:
295 release_mem_region(res->start, resource_size(res));
296err_free_mem:
297 input_free_device(input_dev);
298 kfree(kbd);
299
300 return error;
301} 285}
302 286
303static int __devexit spear_kbd_remove(struct platform_device *pdev) 287static int spear_kbd_remove(struct platform_device *pdev)
304{ 288{
305 struct spear_kbd *kbd = platform_get_drvdata(pdev); 289 struct spear_kbd *kbd = platform_get_drvdata(pdev);
306 290
307 free_irq(kbd->irq, kbd);
308 input_unregister_device(kbd->input); 291 input_unregister_device(kbd->input);
309 clk_put(kbd->clk); 292 clk_unprepare(kbd->clk);
310 iounmap(kbd->io_base);
311 release_mem_region(kbd->res->start, resource_size(kbd->res));
312 kfree(kbd);
313 293
314 device_init_wakeup(&pdev->dev, 0); 294 device_init_wakeup(&pdev->dev, 0);
315 platform_set_drvdata(pdev, NULL); 295 platform_set_drvdata(pdev, NULL);
@@ -333,7 +313,8 @@ static int spear_kbd_suspend(struct device *dev)
333 mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG); 313 mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG);
334 314
335 if (device_may_wakeup(&pdev->dev)) { 315 if (device_may_wakeup(&pdev->dev)) {
336 enable_irq_wake(kbd->irq); 316 if (!enable_irq_wake(kbd->irq))
317 kbd->irq_wake_enabled = true;
337 318
338 /* 319 /*
339 * reprogram the keyboard operating frequency as on some 320 * reprogram the keyboard operating frequency as on some
@@ -379,7 +360,10 @@ static int spear_kbd_resume(struct device *dev)
379 mutex_lock(&input_dev->mutex); 360 mutex_lock(&input_dev->mutex);
380 361
381 if (device_may_wakeup(&pdev->dev)) { 362 if (device_may_wakeup(&pdev->dev)) {
382 disable_irq_wake(kbd->irq); 363 if (kbd->irq_wake_enabled) {
364 kbd->irq_wake_enabled = false;
365 disable_irq_wake(kbd->irq);
366 }
383 } else { 367 } else {
384 if (input_dev->users) 368 if (input_dev->users)
385 clk_enable(kbd->clk); 369 clk_enable(kbd->clk);
@@ -407,7 +391,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table);
407 391
408static struct platform_driver spear_kbd_driver = { 392static struct platform_driver spear_kbd_driver = {
409 .probe = spear_kbd_probe, 393 .probe = spear_kbd_probe,
410 .remove = __devexit_p(spear_kbd_remove), 394 .remove = spear_kbd_remove,
411 .driver = { 395 .driver = {
412 .name = "keyboard", 396 .name = "keyboard",
413 .owner = THIS_MODULE, 397 .owner = THIS_MODULE,