diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2012-11-09 00:41:24 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-11-10 03:29:55 -0500 |
commit | 6102752eb354cca8fb751d8bace2c1ad4efffdde (patch) | |
tree | ea1ea70a1f859c3899526e5c3c479d7c027c3d77 /drivers/input/keyboard | |
parent | 1eee4af30e9261114e6e4e3576f130780124d7be (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.c | 77 |
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 | ||
56 | struct spear_kbd { | 56 | struct 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 | |||
289 | err_free_irq: | ||
290 | free_irq(kbd->irq, kbd); | ||
291 | err_put_clk: | ||
292 | clk_put(kbd->clk); | ||
293 | err_iounmap: | ||
294 | iounmap(kbd->io_base); | ||
295 | err_release_mem_region: | ||
296 | release_mem_region(res->start, resource_size(res)); | ||
297 | err_free_mem: | ||
298 | input_free_device(input_dev); | ||
299 | kfree(kbd); | ||
300 | |||
301 | return error; | ||
302 | } | 280 | } |
303 | 281 | ||
304 | static int __devexit spear_kbd_remove(struct platform_device *pdev) | 282 | static 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 | ||