aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2012-11-09 00:41:24 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2012-11-10 03:29:55 -0500
commit6102752eb354cca8fb751d8bace2c1ad4efffdde (patch)
treeea1ea70a1f859c3899526e5c3c479d7c027c3d77 /drivers/input/keyboard
parent1eee4af30e9261114e6e4e3576f130780124d7be (diff)
Input: spear-keyboard - switch to using managed resources
This patch frees spear-keyboard driver from burden of freeing resources :) devm_* derivatives of multiple routines are used while allocating resources, which would be freed automatically by kernel. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/keyboard')
-rw-r--r--drivers/input/keyboard/spear-keyboard.c77
1 files changed, 23 insertions, 54 deletions
diff --git a/drivers/input/keyboard/spear-keyboard.c b/drivers/input/keyboard/spear-keyboard.c
index 7685b476d6c1..da914fea0c1c 100644
--- a/drivers/input/keyboard/spear-keyboard.c
+++ b/drivers/input/keyboard/spear-keyboard.c
@@ -55,7 +55,6 @@
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;
@@ -204,12 +203,16 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
204 return irq; 203 return irq;
205 } 204 }
206 205
207 kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); 206 kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL);
208 input_dev = input_allocate_device(); 207 if (!kbd) {
209 if (!kbd || !input_dev) { 208 dev_err(&pdev->dev, "not enough memory for driver data\n");
210 dev_err(&pdev->dev, "out of memory\n"); 209 return -ENOMEM;
211 error = -ENOMEM; 210 }
212 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;
213 } 216 }
214 217
215 kbd->input = input_dev; 218 kbd->input = input_dev;
@@ -218,37 +221,25 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
218 if (!pdata) { 221 if (!pdata) {
219 error = spear_kbd_parse_dt(pdev, kbd); 222 error = spear_kbd_parse_dt(pdev, kbd);
220 if (error) 223 if (error)
221 goto err_free_mem; 224 return error;
222 } else { 225 } else {
223 kbd->mode = pdata->mode; 226 kbd->mode = pdata->mode;
224 kbd->rep = pdata->rep; 227 kbd->rep = pdata->rep;
225 kbd->suspended_rate = pdata->suspended_rate; 228 kbd->suspended_rate = pdata->suspended_rate;
226 } 229 }
227 230
228 kbd->res = request_mem_region(res->start, resource_size(res), 231 kbd->io_base = devm_request_and_ioremap(&pdev->dev, res);
229 pdev->name);
230 if (!kbd->res) {
231 dev_err(&pdev->dev, "keyboard region already claimed\n");
232 error = -EBUSY;
233 goto err_free_mem;
234 }
235
236 kbd->io_base = ioremap(res->start, resource_size(res));
237 if (!kbd->io_base) { 232 if (!kbd->io_base) {
238 dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); 233 dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n");
239 error = -ENOMEM; 234 return -ENOMEM;
240 goto err_release_mem_region;
241 } 235 }
242 236
243 kbd->clk = clk_get(&pdev->dev, NULL); 237 kbd->clk = devm_clk_get(&pdev->dev, NULL);
244 if (IS_ERR(kbd->clk)) { 238 if (IS_ERR(kbd->clk))
245 error = PTR_ERR(kbd->clk); 239 return PTR_ERR(kbd->clk);
246 goto err_iounmap;
247 }
248 240
249 input_dev->name = "Spear Keyboard"; 241 input_dev->name = "Spear Keyboard";
250 input_dev->phys = "keyboard/input0"; 242 input_dev->phys = "keyboard/input0";
251 input_dev->dev.parent = &pdev->dev;
252 input_dev->id.bustype = BUS_HOST; 243 input_dev->id.bustype = BUS_HOST;
253 input_dev->id.vendor = 0x0001; 244 input_dev->id.vendor = 0x0001;
254 input_dev->id.product = 0x0001; 245 input_dev->id.product = 0x0001;
@@ -260,7 +251,7 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
260 kbd->keycodes, input_dev); 251 kbd->keycodes, input_dev);
261 if (error) { 252 if (error) {
262 dev_err(&pdev->dev, "Failed to build keymap\n"); 253 dev_err(&pdev->dev, "Failed to build keymap\n");
263 goto err_put_clk; 254 return error;
264 } 255 }
265 256
266 if (kbd->rep) 257 if (kbd->rep)
@@ -269,49 +260,27 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev)
269 260
270 input_set_drvdata(input_dev, kbd); 261 input_set_drvdata(input_dev, kbd);
271 262
272 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);
273 if (error) { 265 if (error) {
274 dev_err(&pdev->dev, "request_irq fail\n"); 266 dev_err(&pdev->dev, "request_irq failed\n");
275 goto err_put_clk; 267 return error;
276 } 268 }
277 269
278 error = input_register_device(input_dev); 270 error = input_register_device(input_dev);
279 if (error) { 271 if (error) {
280 dev_err(&pdev->dev, "Unable to register keyboard device\n"); 272 dev_err(&pdev->dev, "Unable to register keyboard device\n");
281 goto err_free_irq; 273 return error;
282 } 274 }
283 275
284 device_init_wakeup(&pdev->dev, 1); 276 device_init_wakeup(&pdev->dev, 1);
285 platform_set_drvdata(pdev, kbd); 277 platform_set_drvdata(pdev, kbd);
286 278
287 return 0; 279 return 0;
288
289err_free_irq:
290 free_irq(kbd->irq, kbd);
291err_put_clk:
292 clk_put(kbd->clk);
293err_iounmap:
294 iounmap(kbd->io_base);
295err_release_mem_region:
296 release_mem_region(res->start, resource_size(res));
297err_free_mem:
298 input_free_device(input_dev);
299 kfree(kbd);
300
301 return error;
302} 280}
303 281
304static int __devexit spear_kbd_remove(struct platform_device *pdev) 282static int __devexit spear_kbd_remove(struct platform_device *pdev)
305{ 283{
306 struct spear_kbd *kbd = platform_get_drvdata(pdev);
307
308 free_irq(kbd->irq, kbd);
309 input_unregister_device(kbd->input);
310 clk_put(kbd->clk);
311 iounmap(kbd->io_base);
312 release_mem_region(kbd->res->start, resource_size(kbd->res));
313 kfree(kbd);
314
315 device_init_wakeup(&pdev->dev, 0); 284 device_init_wakeup(&pdev->dev, 0);
316 platform_set_drvdata(pdev, NULL); 285 platform_set_drvdata(pdev, NULL);
317 286