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

Configure Feed

Select the types of activity you want to include in your feed.

Input: ads7846 - switch to devm initialization

This simplies the code a lot and fixes some potential resource leaks in
the error return paths.

Signed-off-by: Daniel Mack <daniel@zonque.org>
Link: https://lore.kernel.org/r/20210907200726.2034962-4-daniel@zonque.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Daniel Mack and committed by
Dmitry Torokhov
845ef3a7 937f5d5e

+47 -89
+47 -89
drivers/input/touchscreen/ads7846.c
··· 101 101 struct spi_device *spi; 102 102 struct regulator *reg; 103 103 104 - #if IS_ENABLED(CONFIG_HWMON) 105 - struct device *hwmon; 106 - #endif 107 - 108 104 u16 model; 109 105 u16 vref_mv; 110 106 u16 vref_delay_usecs; ··· 550 554 551 555 static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts) 552 556 { 557 + struct device *hwmon; 558 + 553 559 /* hwmon sensors need a reference voltage */ 554 560 switch (ts->model) { 555 561 case 7846: ··· 572 574 break; 573 575 } 574 576 575 - ts->hwmon = hwmon_device_register_with_groups(&spi->dev, spi->modalias, 576 - ts, ads7846_attr_groups); 577 + hwmon = devm_hwmon_device_register_with_groups(&spi->dev, 578 + spi->modalias, ts, 579 + ads7846_attr_groups); 577 580 578 - return PTR_ERR_OR_ZERO(ts->hwmon); 579 - } 580 - 581 - static void ads784x_hwmon_unregister(struct spi_device *spi, 582 - struct ads7846 *ts) 583 - { 584 - if (ts->hwmon) 585 - hwmon_device_unregister(ts->hwmon); 581 + return PTR_ERR_OR_ZERO(hwmon); 586 582 } 587 583 588 584 #else ··· 584 592 struct ads7846 *ts) 585 593 { 586 594 return 0; 587 - } 588 - 589 - static inline void ads784x_hwmon_unregister(struct spi_device *spi, 590 - struct ads7846 *ts) 591 - { 592 595 } 593 596 #endif 594 597 ··· 1006 1019 ts->get_pendown_state = pdata->get_pendown_state; 1007 1020 } else if (gpio_is_valid(pdata->gpio_pendown)) { 1008 1021 1009 - err = gpio_request_one(pdata->gpio_pendown, GPIOF_IN, 1010 - "ads7846_pendown"); 1022 + err = devm_gpio_request_one(&spi->dev, pdata->gpio_pendown, 1023 + GPIOF_IN, "ads7846_pendown"); 1011 1024 if (err) { 1012 1025 dev_err(&spi->dev, 1013 1026 "failed to request/setup pendown GPIO%d: %d\n", ··· 1204 1217 } 1205 1218 #endif 1206 1219 1220 + static void ads7846_regulator_disable(void *regulator) 1221 + { 1222 + regulator_disable(regulator); 1223 + } 1224 + 1207 1225 static int ads7846_probe(struct spi_device *spi) 1208 1226 { 1209 1227 const struct ads7846_platform_data *pdata; ··· 1243 1251 if (err < 0) 1244 1252 return err; 1245 1253 1246 - ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); 1247 - packet = kzalloc(sizeof(struct ads7846_packet), GFP_KERNEL); 1248 - input_dev = input_allocate_device(); 1249 - if (!ts || !packet || !input_dev) { 1250 - err = -ENOMEM; 1251 - goto err_free_mem; 1252 - } 1254 + ts = devm_kzalloc(dev, sizeof(struct ads7846), GFP_KERNEL); 1255 + if (!ts) 1256 + return -ENOMEM; 1257 + 1258 + packet = devm_kzalloc(dev, sizeof(struct ads7846_packet), GFP_KERNEL); 1259 + if (!packet) 1260 + return -ENOMEM; 1261 + 1262 + input_dev = devm_input_allocate_device(dev); 1263 + if (!input_dev) 1264 + return -ENOMEM; 1253 1265 1254 1266 spi_set_drvdata(spi, ts); 1255 1267 ··· 1267 1271 pdata = dev_get_platdata(dev); 1268 1272 if (!pdata) { 1269 1273 pdata = ads7846_probe_dt(dev); 1270 - if (IS_ERR(pdata)) { 1271 - err = PTR_ERR(pdata); 1272 - goto err_free_mem; 1273 - } 1274 + if (IS_ERR(pdata)) 1275 + return PTR_ERR(pdata); 1274 1276 } 1275 1277 1276 1278 ts->model = pdata->model ? : 7846; ··· 1290 1296 1291 1297 err = ads7846_setup_pendown(spi, ts, pdata); 1292 1298 if (err) 1293 - goto err_free_mem; 1299 + return err; 1294 1300 1295 1301 if (pdata->penirq_recheck_delay_usecs) 1296 1302 ts->penirq_recheck_delay_usecs = ··· 1303 1309 1304 1310 input_dev->name = ts->name; 1305 1311 input_dev->phys = ts->phys; 1306 - input_dev->dev.parent = dev; 1307 1312 1308 1313 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 1309 1314 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); ··· 1336 1343 1337 1344 ads7846_setup_spi_msg(ts, pdata); 1338 1345 1339 - ts->reg = regulator_get(dev, "vcc"); 1346 + ts->reg = devm_regulator_get(dev, "vcc"); 1340 1347 if (IS_ERR(ts->reg)) { 1341 1348 err = PTR_ERR(ts->reg); 1342 1349 dev_err(dev, "unable to get regulator: %d\n", err); 1343 - goto err_free_gpio; 1350 + return err; 1344 1351 } 1345 1352 1346 1353 err = regulator_enable(ts->reg); 1347 1354 if (err) { 1348 1355 dev_err(dev, "unable to enable regulator: %d\n", err); 1349 - goto err_put_regulator; 1356 + return err; 1350 1357 } 1358 + 1359 + err = devm_add_action_or_reset(dev, ads7846_regulator_disable, ts->reg); 1360 + if (err) 1361 + return err; 1351 1362 1352 1363 irq_flags = pdata->irq_flags ? : IRQF_TRIGGER_FALLING; 1353 1364 irq_flags |= IRQF_ONESHOT; 1354 1365 1355 - err = request_threaded_irq(spi->irq, ads7846_hard_irq, ads7846_irq, 1356 - irq_flags, dev->driver->name, ts); 1366 + err = devm_request_threaded_irq(dev, spi->irq, 1367 + ads7846_hard_irq, ads7846_irq, 1368 + irq_flags, dev->driver->name, ts); 1357 1369 if (err && !pdata->irq_flags) { 1358 1370 dev_info(dev, 1359 1371 "trying pin change workaround on irq %d\n", spi->irq); 1360 1372 irq_flags |= IRQF_TRIGGER_RISING; 1361 - err = request_threaded_irq(spi->irq, 1362 - ads7846_hard_irq, ads7846_irq, 1363 - irq_flags, dev->driver->name, ts); 1373 + err = devm_request_threaded_irq(dev, spi->irq, 1374 + ads7846_hard_irq, ads7846_irq, 1375 + irq_flags, dev->driver->name, 1376 + ts); 1364 1377 } 1365 1378 1366 1379 if (err) { 1367 1380 dev_dbg(dev, "irq %d busy?\n", spi->irq); 1368 - goto err_disable_regulator; 1381 + return err; 1369 1382 } 1370 1383 1371 1384 err = ads784x_hwmon_register(spi, ts); 1372 1385 if (err) 1373 - goto err_free_irq; 1386 + return err; 1374 1387 1375 1388 dev_info(dev, "touchscreen, irq %d\n", spi->irq); 1376 1389 ··· 1389 1390 else 1390 1391 (void) ads7846_read12_ser(dev, READ_12BIT_SER(vaux)); 1391 1392 1392 - err = sysfs_create_group(&dev->kobj, &ads784x_attr_group); 1393 + err = devm_device_add_group(dev, &ads784x_attr_group); 1393 1394 if (err) 1394 - goto err_remove_hwmon; 1395 + return err; 1395 1396 1396 1397 err = input_register_device(input_dev); 1397 1398 if (err) 1398 - goto err_remove_attr_group; 1399 + return err; 1399 1400 1400 1401 device_init_wakeup(dev, pdata->wakeup); 1401 1402 ··· 1407 1408 devm_kfree(dev, (void *)pdata); 1408 1409 1409 1410 return 0; 1410 - 1411 - err_remove_attr_group: 1412 - sysfs_remove_group(&dev->kobj, &ads784x_attr_group); 1413 - err_remove_hwmon: 1414 - ads784x_hwmon_unregister(spi, ts); 1415 - err_free_irq: 1416 - free_irq(spi->irq, ts); 1417 - err_disable_regulator: 1418 - regulator_disable(ts->reg); 1419 - err_put_regulator: 1420 - regulator_put(ts->reg); 1421 - err_free_gpio: 1422 - if (!ts->get_pendown_state) 1423 - gpio_free(ts->gpio_pendown); 1424 - err_free_mem: 1425 - input_free_device(input_dev); 1426 - kfree(packet); 1427 - kfree(ts); 1428 - return err; 1429 1411 } 1430 1412 1431 1413 static int ads7846_remove(struct spi_device *spi) 1432 1414 { 1433 1415 struct ads7846 *ts = spi_get_drvdata(spi); 1434 1416 1435 - sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group); 1436 - 1437 - ads7846_disable(ts); 1438 - free_irq(ts->spi->irq, ts); 1439 - 1440 - input_unregister_device(ts->input); 1441 - 1442 - ads784x_hwmon_unregister(spi, ts); 1443 - 1444 - regulator_put(ts->reg); 1445 - 1446 - if (!ts->get_pendown_state) { 1447 - /* 1448 - * If we are not using specialized pendown method we must 1449 - * have been relying on gpio we set up ourselves. 1450 - */ 1451 - gpio_free(ts->gpio_pendown); 1452 - } 1453 - 1454 - kfree(ts->packet); 1455 - kfree(ts); 1456 - 1457 - dev_dbg(&spi->dev, "unregistered touchscreen\n"); 1417 + ads7846_stop(ts); 1458 1418 1459 1419 return 0; 1460 1420 }