@@ -139,6 +139,11 @@ static const struct kobj_type mox_kobj_ktype = {
.default_groups = mox_rwtm_groups,
};
+static void mox_devm_kobj_release(void *kobj)
+{
+ kobject_put(kobj);
+}
+
static int mox_kobj_create(struct mox_rwtm *rwtm)
{
struct kobject *kobj = &rwtm->kobj;
@@ -146,11 +151,11 @@ static int mox_kobj_create(struct mox_rwtm *rwtm)
kobject_init(kobj, &mox_kobj_ktype);
- ret = kobject_add(kobj, firmware_kobj, "turris-mox-rwtm");
+ ret = devm_add_action_or_reset(rwtm->dev, mox_devm_kobj_release, kobj);
if (ret)
- kobject_put(kobj);
+ return ret;
- return ret;
+ return kobject_add(kobj, firmware_kobj, "turris-mox-rwtm");
}
static int mox_get_status(enum mbox_cmd cmd, u32 retval)
@@ -453,6 +458,11 @@ static inline void rwtm_register_debugfs(struct mox_rwtm *rwtm)
}
#endif
+static void rwtm_devm_mbox_release(void *mbox)
+{
+ mbox_free_channel(mbox);
+}
+
static int turris_mox_rwtm_probe(struct platform_device *pdev)
{
struct mox_rwtm *rwtm;
@@ -488,9 +498,13 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret != -EPROBE_DEFER)
dev_err(dev, "Cannot request mailbox channel: %i\n",
ret);
- goto put_kobj;
+ return ret;
}
+ ret = devm_add_action_or_reset(dev, rwtm_devm_mbox_release, rwtm->mbox);
+ if (ret < 0)
+ return ret;
+
init_completion(&rwtm->cmd_done);
ret = mox_get_board_info(rwtm);
@@ -501,7 +515,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
if (ret < 0) {
dev_notice(dev,
"Firmware does not support the GET_RANDOM command\n");
- goto free_channel;
+ return ret;
}
rwtm->hwrng.name = DRIVER_NAME "_hwrng";
@@ -511,7 +525,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
ret = devm_hwrng_register(dev, &rwtm->hwrng);
if (ret < 0) {
dev_err(dev, "Cannot register HWRNG: %i\n", ret);
- goto free_channel;
+ return ret;
}
rwtm_register_debugfs(rwtm);
@@ -519,20 +533,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
dev_info(dev, "HWRNG successfully registered\n");
return 0;
-
-free_channel:
- mbox_free_channel(rwtm->mbox);
-put_kobj:
- kobject_put(&rwtm->kobj);
- return ret;
-}
-
-static void turris_mox_rwtm_remove(struct platform_device *pdev)
-{
- struct mox_rwtm *rwtm = platform_get_drvdata(pdev);
-
- kobject_put(&rwtm->kobj);
- mbox_free_channel(rwtm->mbox);
}
static const struct of_device_id turris_mox_rwtm_match[] = {
@@ -545,7 +545,6 @@ MODULE_DEVICE_TABLE(of, turris_mox_rwtm_match);
static struct platform_driver turris_mox_rwtm_driver = {
.probe = turris_mox_rwtm_probe,
- .remove_new = turris_mox_rwtm_remove,
.driver = {
.name = DRIVER_NAME,
.of_match_table = turris_mox_rwtm_match,
Use devm resource management for driver's kobject and mailbox. This allows us to get rid of driver's .remove() method and gotos in .probe(). Signed-off-by: Marek Behún <kabel@kernel.org> --- drivers/firmware/turris-mox-rwtm.c | 41 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 21 deletions(-)