Skip to content

Commit e733911

Browse files
committed
Input: kxtj9 - switch to using managed resources
Using devm API allows to clean up error handling and drop the remove() method. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent b873f73 commit e733911

File tree

1 file changed

+28
-58
lines changed

1 file changed

+28
-58
lines changed

drivers/input/misc/kxtj9.c

Lines changed: 28 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -292,15 +292,14 @@ static void kxtj9_init_input_device(struct kxtj9_data *tj9,
292292

293293
input_dev->name = "kxtj9_accel";
294294
input_dev->id.bustype = BUS_I2C;
295-
input_dev->dev.parent = &tj9->client->dev;
296295
}
297296

298297
static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
299298
{
300299
struct input_dev *input_dev;
301300
int err;
302301

303-
input_dev = input_allocate_device();
302+
input_dev = devm_input_allocate_device(&tj9->client->dev);
304303
if (!input_dev) {
305304
dev_err(&tj9->client->dev, "input device allocate failed\n");
306305
return -ENOMEM;
@@ -319,7 +318,6 @@ static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
319318
dev_err(&tj9->client->dev,
320319
"unable to register input polled device %s: %d\n",
321320
tj9->input_dev->name, err);
322-
input_free_device(tj9->input_dev);
323321
return err;
324322
}
325323

@@ -424,8 +422,8 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
424422
{
425423
int err;
426424
struct input_polled_dev *poll_dev;
427-
poll_dev = input_allocate_polled_device();
428425

426+
poll_dev = devm_input_allocate_polled_device(&tj9->client->dev);
429427
if (!poll_dev) {
430428
dev_err(&tj9->client->dev,
431429
"Failed to allocate polled device\n");
@@ -446,31 +444,28 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
446444
if (err) {
447445
dev_err(&tj9->client->dev,
448446
"Unable to register polled device, err=%d\n", err);
449-
input_free_polled_device(poll_dev);
450447
return err;
451448
}
452449

453450
return 0;
454451
}
455452

456-
static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
457-
{
458-
input_unregister_polled_device(tj9->poll_dev);
459-
input_free_polled_device(tj9->poll_dev);
460-
}
461-
462453
#else
463454

464455
static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
465456
{
466457
return -ENOSYS;
467458
}
468459

469-
static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
460+
#endif
461+
462+
static void kxtj9_platform_exit(void *data)
470463
{
471-
}
464+
struct kxtj9_data *tj9 = data;
472465

473-
#endif
466+
if (tj9->pdata.exit)
467+
tj9->pdata.exit();
468+
}
474469

475470
static int kxtj9_verify(struct kxtj9_data *tj9)
476471
{
@@ -494,7 +489,7 @@ static int kxtj9_verify(struct kxtj9_data *tj9)
494489
}
495490

496491
static int kxtj9_probe(struct i2c_client *client,
497-
const struct i2c_device_id *id)
492+
const struct i2c_device_id *id)
498493
{
499494
const struct kxtj9_platform_data *pdata =
500495
dev_get_platdata(&client->dev);
@@ -512,7 +507,7 @@ static int kxtj9_probe(struct i2c_client *client,
512507
return -EINVAL;
513508
}
514509

515-
tj9 = kzalloc(sizeof(*tj9), GFP_KERNEL);
510+
tj9 = devm_kzalloc(&client->dev, sizeof(*tj9), GFP_KERNEL);
516511
if (!tj9) {
517512
dev_err(&client->dev,
518513
"failed to allocate memory for module data\n");
@@ -525,13 +520,17 @@ static int kxtj9_probe(struct i2c_client *client,
525520
if (pdata->init) {
526521
err = pdata->init();
527522
if (err < 0)
528-
goto err_free_mem;
523+
return err;
529524
}
530525

526+
err = devm_add_action_or_reset(&client->dev, kxtj9_platform_exit, tj9);
527+
if (err)
528+
return err;
529+
531530
err = kxtj9_verify(tj9);
532531
if (err < 0) {
533532
dev_err(&client->dev, "device not recognized\n");
534-
goto err_pdata_exit;
533+
return err;
535534
}
536535

537536
i2c_set_clientdata(client, tj9);
@@ -546,59 +545,31 @@ static int kxtj9_probe(struct i2c_client *client,
546545

547546
err = kxtj9_setup_input_device(tj9);
548547
if (err)
549-
goto err_pdata_exit;
548+
return err;
550549

551-
err = request_threaded_irq(client->irq, NULL, kxtj9_isr,
552-
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
553-
"kxtj9-irq", tj9);
550+
err = devm_request_threaded_irq(&client->dev, client->irq,
551+
NULL, kxtj9_isr,
552+
IRQF_TRIGGER_RISING |
553+
IRQF_ONESHOT,
554+
"kxtj9-irq", tj9);
554555
if (err) {
555556
dev_err(&client->dev, "request irq failed: %d\n", err);
556-
goto err_destroy_input;
557+
return err;
557558
}
558559

559-
err = sysfs_create_group(&client->dev.kobj, &kxtj9_attribute_group);
560+
err = devm_device_add_group(&client->dev,
561+
&kxtj9_attribute_group);
560562
if (err) {
561563
dev_err(&client->dev, "sysfs create failed: %d\n", err);
562-
goto err_free_irq;
564+
return err;
563565
}
564566

565567
} else {
566568
err = kxtj9_setup_polled_device(tj9);
567569
if (err)
568-
goto err_pdata_exit;
569-
}
570-
571-
return 0;
572-
573-
err_free_irq:
574-
free_irq(client->irq, tj9);
575-
err_destroy_input:
576-
input_unregister_device(tj9->input_dev);
577-
err_pdata_exit:
578-
if (tj9->pdata.exit)
579-
tj9->pdata.exit();
580-
err_free_mem:
581-
kfree(tj9);
582-
return err;
583-
}
584-
585-
static int kxtj9_remove(struct i2c_client *client)
586-
{
587-
struct kxtj9_data *tj9 = i2c_get_clientdata(client);
588-
589-
if (client->irq) {
590-
sysfs_remove_group(&client->dev.kobj, &kxtj9_attribute_group);
591-
free_irq(client->irq, tj9);
592-
input_unregister_device(tj9->input_dev);
593-
} else {
594-
kxtj9_teardown_polled_device(tj9);
570+
return err;
595571
}
596572

597-
if (tj9->pdata.exit)
598-
tj9->pdata.exit();
599-
600-
kfree(tj9);
601-
602573
return 0;
603574
}
604575

@@ -647,7 +618,6 @@ static struct i2c_driver kxtj9_driver = {
647618
.pm = &kxtj9_pm_ops,
648619
},
649620
.probe = kxtj9_probe,
650-
.remove = kxtj9_remove,
651621
.id_table = kxtj9_id,
652622
};
653623

0 commit comments

Comments
 (0)