Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: ep93xx_keypad - switch to using managed resources

By using managed resources (devm) we are able to streamline error handling
in probe and remove most of the custom remove method.

Acked-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Link: https://lore.kernel.org/r/YWZGKWgdarGtvtYA@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+37 -81
+37 -81
drivers/input/keyboard/ep93xx_keypad.c
··· 219 219 static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, 220 220 ep93xx_keypad_suspend, ep93xx_keypad_resume); 221 221 222 + static void ep93xx_keypad_release_gpio_action(void *_pdev) 223 + { 224 + struct platform_device *pdev = _pdev; 225 + 226 + ep93xx_keypad_release_gpio(pdev); 227 + } 228 + 222 229 static int ep93xx_keypad_probe(struct platform_device *pdev) 223 230 { 224 231 struct ep93xx_keypad *keypad; ··· 234 227 struct resource *res; 235 228 int err; 236 229 237 - keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL); 230 + keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); 238 231 if (!keypad) 239 232 return -ENOMEM; 240 233 241 234 keypad->pdata = dev_get_platdata(&pdev->dev); 242 - if (!keypad->pdata) { 243 - err = -EINVAL; 244 - goto failed_free; 245 - } 235 + if (!keypad->pdata) 236 + return -EINVAL; 246 237 247 238 keymap_data = keypad->pdata->keymap_data; 248 - if (!keymap_data) { 249 - err = -EINVAL; 250 - goto failed_free; 251 - } 239 + if (!keymap_data) 240 + return -EINVAL; 252 241 253 242 keypad->irq = platform_get_irq(pdev, 0); 254 - if (keypad->irq < 0) { 255 - err = keypad->irq; 256 - goto failed_free; 257 - } 243 + if (keypad->irq < 0) 244 + return keypad->irq; 258 245 259 246 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 260 - if (!res) { 261 - err = -ENXIO; 262 - goto failed_free; 263 - } 247 + if (!res) 248 + return -ENXIO; 264 249 265 - res = request_mem_region(res->start, resource_size(res), pdev->name); 266 - if (!res) { 267 - err = -EBUSY; 268 - goto failed_free; 269 - } 270 - 271 - keypad->mmio_base = ioremap(res->start, resource_size(res)); 272 - if (keypad->mmio_base == NULL) { 273 - err = -ENXIO; 274 - goto failed_free_mem; 275 - } 250 + keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); 251 + if (IS_ERR(keypad->mmio_base)) 252 + return PTR_ERR(keypad->mmio_base); 276 253 277 254 err = ep93xx_keypad_acquire_gpio(pdev); 278 255 if (err) 279 - goto failed_free_io; 256 + return err; 280 257 281 - keypad->clk = clk_get(&pdev->dev, NULL); 282 - if (IS_ERR(keypad->clk)) { 283 - err = PTR_ERR(keypad->clk); 284 - goto failed_free_gpio; 285 - } 258 + err = devm_add_action_or_reset(&pdev->dev, 259 + ep93xx_keypad_release_gpio_action, pdev); 260 + if (err) 261 + return err; 286 262 287 - input_dev = input_allocate_device(); 288 - if (!input_dev) { 289 - err = -ENOMEM; 290 - goto failed_put_clk; 291 - } 263 + keypad->clk = devm_clk_get(&pdev->dev, NULL); 264 + if (IS_ERR(keypad->clk)) 265 + return PTR_ERR(keypad->clk); 266 + 267 + input_dev = devm_input_allocate_device(&pdev->dev); 268 + if (!input_dev) 269 + return -ENOMEM; 292 270 293 271 keypad->input_dev = input_dev; 294 272 ··· 281 289 input_dev->id.bustype = BUS_HOST; 282 290 input_dev->open = ep93xx_keypad_open; 283 291 input_dev->close = ep93xx_keypad_close; 284 - input_dev->dev.parent = &pdev->dev; 285 292 286 293 err = matrix_keypad_build_keymap(keymap_data, NULL, 287 294 EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, 288 295 keypad->keycodes, input_dev); 289 296 if (err) 290 - goto failed_free_dev; 297 + return err; 291 298 292 299 if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) 293 300 __set_bit(EV_REP, input_dev->evbit); 294 301 input_set_drvdata(input_dev, keypad); 295 302 296 - err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, 297 - 0, pdev->name, keypad); 303 + err = devm_request_irq(&pdev->dev, keypad->irq, 304 + ep93xx_keypad_irq_handler, 305 + 0, pdev->name, keypad); 298 306 if (err) 299 - goto failed_free_dev; 307 + return err; 300 308 301 309 err = input_register_device(input_dev); 302 310 if (err) 303 - goto failed_free_irq; 311 + return err; 304 312 305 313 platform_set_drvdata(pdev, keypad); 306 314 ··· 310 318 dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err); 311 319 312 320 return 0; 313 - 314 - failed_free_irq: 315 - free_irq(keypad->irq, keypad); 316 - failed_free_dev: 317 - input_free_device(input_dev); 318 - failed_put_clk: 319 - clk_put(keypad->clk); 320 - failed_free_gpio: 321 - ep93xx_keypad_release_gpio(pdev); 322 - failed_free_io: 323 - iounmap(keypad->mmio_base); 324 - failed_free_mem: 325 - release_mem_region(res->start, resource_size(res)); 326 - failed_free: 327 - kfree(keypad); 328 - return err; 329 321 } 330 322 331 323 static int ep93xx_keypad_remove(struct platform_device *pdev) 332 324 { 333 - struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); 334 - struct resource *res; 335 - 336 325 dev_pm_clear_wake_irq(&pdev->dev); 337 - 338 - free_irq(keypad->irq, keypad); 339 - 340 - if (keypad->enabled) 341 - clk_disable(keypad->clk); 342 - clk_put(keypad->clk); 343 - 344 - input_unregister_device(keypad->input_dev); 345 - 346 - ep93xx_keypad_release_gpio(pdev); 347 - 348 - iounmap(keypad->mmio_base); 349 - 350 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 351 - release_mem_region(res->start, resource_size(res)); 352 - 353 - kfree(keypad); 354 326 355 327 return 0; 356 328 }