Loading drivers/extcon/extcon-max14577.c +5 −11 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ // Chanwoo Choi <cw00.choi@samsung.com> // Krzysztof Kozlowski <krzk@kernel.org> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -673,7 +674,10 @@ static int max14577_muic_probe(struct platform_device *pdev) platform_set_drvdata(pdev, info); mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max14577_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max14577_muic_irq_work); if (ret) return ret; switch (max14577->dev_type) { case MAXIM_DEVICE_TYPE_MAX77836: Loading Loading @@ -766,15 +770,6 @@ static int max14577_muic_probe(struct platform_device *pdev) return ret; } static int max14577_muic_remove(struct platform_device *pdev) { struct max14577_muic_info *info = platform_get_drvdata(pdev); cancel_work_sync(&info->irq_work); return 0; } static const struct platform_device_id max14577_muic_id[] = { { "max14577-muic", MAXIM_DEVICE_TYPE_MAX14577, }, { "max77836-muic", MAXIM_DEVICE_TYPE_MAX77836, }, Loading @@ -797,7 +792,6 @@ static struct platform_driver max14577_muic_driver = { .of_match_table = of_max14577_muic_dt_match, }, .probe = max14577_muic_probe, .remove = max14577_muic_remove, .id_table = max14577_muic_id, }; Loading drivers/extcon/extcon-max77693.c +5 −12 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ // Copyright (C) 2012 Samsung Electrnoics // Chanwoo Choi <cw00.choi@samsung.com> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -1127,7 +1128,10 @@ static int max77693_muic_probe(struct platform_device *pdev) platform_set_drvdata(pdev, info); mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max77693_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max77693_muic_irq_work); if (ret) return ret; /* Support irq domain for MAX77693 MUIC device */ for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { Loading Loading @@ -1254,22 +1258,11 @@ static int max77693_muic_probe(struct platform_device *pdev) return ret; } static int max77693_muic_remove(struct platform_device *pdev) { struct max77693_muic_info *info = platform_get_drvdata(pdev); cancel_work_sync(&info->irq_work); input_unregister_device(info->dock); return 0; } static struct platform_driver max77693_muic_driver = { .driver = { .name = DEV_NAME, }, .probe = max77693_muic_probe, .remove = max77693_muic_remove, }; module_platform_driver(max77693_muic_driver); Loading drivers/extcon/extcon-max8997.c +15 −30 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ // Copyright (C) 2012 Samsung Electronics // Donggeun Kim <dg77.kim@samsung.com> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -650,19 +651,22 @@ static int max8997_muic_probe(struct platform_device *pdev) mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max8997_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max8997_muic_irq_work); if (ret) return ret; for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { struct max8997_muic_irq *muic_irq = &muic_irqs[i]; unsigned int virq = 0; virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq); if (!virq) { ret = -EINVAL; goto err_irq; } if (!virq) return -EINVAL; muic_irq->virq = virq; ret = request_threaded_irq(virq, NULL, ret = devm_request_threaded_irq(&pdev->dev, virq, NULL, max8997_muic_irq_handler, IRQF_NO_SUSPEND, muic_irq->name, info); Loading @@ -670,7 +674,7 @@ static int max8997_muic_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed: irq request (IRQ: %d, error :%d)\n", muic_irq->irq, ret); goto err_irq; return ret; } } Loading @@ -678,14 +682,13 @@ static int max8997_muic_probe(struct platform_device *pdev) info->edev = devm_extcon_dev_allocate(&pdev->dev, max8997_extcon_cable); if (IS_ERR(info->edev)) { dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); ret = PTR_ERR(info->edev); goto err_irq; return PTR_ERR(info->edev); } ret = devm_extcon_dev_register(&pdev->dev, info->edev); if (ret) { dev_err(&pdev->dev, "failed to register extcon device\n"); goto err_irq; return ret; } if (pdata && pdata->muic_pdata) { Loading Loading @@ -756,23 +759,6 @@ static int max8997_muic_probe(struct platform_device *pdev) delay_jiffies); return 0; err_irq: while (--i >= 0) free_irq(muic_irqs[i].virq, info); return ret; } static int max8997_muic_remove(struct platform_device *pdev) { struct max8997_muic_info *info = platform_get_drvdata(pdev); int i; for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) free_irq(muic_irqs[i].virq, info); cancel_work_sync(&info->irq_work); return 0; } static struct platform_driver max8997_muic_driver = { Loading @@ -780,7 +766,6 @@ static struct platform_driver max8997_muic_driver = { .name = DEV_NAME, }, .probe = max8997_muic_probe, .remove = max8997_muic_remove, }; module_platform_driver(max8997_muic_driver); Loading include/linux/devm-helpers.h +25 −0 Original line number Diff line number Diff line Loading @@ -51,4 +51,29 @@ static inline int devm_delayed_work_autocancel(struct device *dev, return devm_add_action(dev, devm_delayed_work_drop, w); } static inline void devm_work_drop(void *res) { cancel_work_sync(res); } /** * devm_work_autocancel - Resource-managed work allocation * @dev: Device which lifetime work is bound to * @w: Work to be added (and automatically cancelled) * @worker: Worker function * * Initialize work which is automatically cancelled when driver is detached. * A few drivers need to queue work which must be cancelled before driver * is detached to avoid accessing removed resources. * devm_work_autocancel() can be used to omit the explicit * cancelleation when driver is detached. */ static inline int devm_work_autocancel(struct device *dev, struct work_struct *w, work_func_t worker) { INIT_WORK(w, worker); return devm_add_action(dev, devm_work_drop, w); } #endif Loading
drivers/extcon/extcon-max14577.c +5 −11 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ // Chanwoo Choi <cw00.choi@samsung.com> // Krzysztof Kozlowski <krzk@kernel.org> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -673,7 +674,10 @@ static int max14577_muic_probe(struct platform_device *pdev) platform_set_drvdata(pdev, info); mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max14577_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max14577_muic_irq_work); if (ret) return ret; switch (max14577->dev_type) { case MAXIM_DEVICE_TYPE_MAX77836: Loading Loading @@ -766,15 +770,6 @@ static int max14577_muic_probe(struct platform_device *pdev) return ret; } static int max14577_muic_remove(struct platform_device *pdev) { struct max14577_muic_info *info = platform_get_drvdata(pdev); cancel_work_sync(&info->irq_work); return 0; } static const struct platform_device_id max14577_muic_id[] = { { "max14577-muic", MAXIM_DEVICE_TYPE_MAX14577, }, { "max77836-muic", MAXIM_DEVICE_TYPE_MAX77836, }, Loading @@ -797,7 +792,6 @@ static struct platform_driver max14577_muic_driver = { .of_match_table = of_max14577_muic_dt_match, }, .probe = max14577_muic_probe, .remove = max14577_muic_remove, .id_table = max14577_muic_id, }; Loading
drivers/extcon/extcon-max77693.c +5 −12 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ // Copyright (C) 2012 Samsung Electrnoics // Chanwoo Choi <cw00.choi@samsung.com> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -1127,7 +1128,10 @@ static int max77693_muic_probe(struct platform_device *pdev) platform_set_drvdata(pdev, info); mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max77693_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max77693_muic_irq_work); if (ret) return ret; /* Support irq domain for MAX77693 MUIC device */ for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { Loading Loading @@ -1254,22 +1258,11 @@ static int max77693_muic_probe(struct platform_device *pdev) return ret; } static int max77693_muic_remove(struct platform_device *pdev) { struct max77693_muic_info *info = platform_get_drvdata(pdev); cancel_work_sync(&info->irq_work); input_unregister_device(info->dock); return 0; } static struct platform_driver max77693_muic_driver = { .driver = { .name = DEV_NAME, }, .probe = max77693_muic_probe, .remove = max77693_muic_remove, }; module_platform_driver(max77693_muic_driver); Loading
drivers/extcon/extcon-max8997.c +15 −30 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ // Copyright (C) 2012 Samsung Electronics // Donggeun Kim <dg77.kim@samsung.com> #include <linux/devm-helpers.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/i2c.h> Loading Loading @@ -650,19 +651,22 @@ static int max8997_muic_probe(struct platform_device *pdev) mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max8997_muic_irq_work); ret = devm_work_autocancel(&pdev->dev, &info->irq_work, max8997_muic_irq_work); if (ret) return ret; for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { struct max8997_muic_irq *muic_irq = &muic_irqs[i]; unsigned int virq = 0; virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq); if (!virq) { ret = -EINVAL; goto err_irq; } if (!virq) return -EINVAL; muic_irq->virq = virq; ret = request_threaded_irq(virq, NULL, ret = devm_request_threaded_irq(&pdev->dev, virq, NULL, max8997_muic_irq_handler, IRQF_NO_SUSPEND, muic_irq->name, info); Loading @@ -670,7 +674,7 @@ static int max8997_muic_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed: irq request (IRQ: %d, error :%d)\n", muic_irq->irq, ret); goto err_irq; return ret; } } Loading @@ -678,14 +682,13 @@ static int max8997_muic_probe(struct platform_device *pdev) info->edev = devm_extcon_dev_allocate(&pdev->dev, max8997_extcon_cable); if (IS_ERR(info->edev)) { dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); ret = PTR_ERR(info->edev); goto err_irq; return PTR_ERR(info->edev); } ret = devm_extcon_dev_register(&pdev->dev, info->edev); if (ret) { dev_err(&pdev->dev, "failed to register extcon device\n"); goto err_irq; return ret; } if (pdata && pdata->muic_pdata) { Loading Loading @@ -756,23 +759,6 @@ static int max8997_muic_probe(struct platform_device *pdev) delay_jiffies); return 0; err_irq: while (--i >= 0) free_irq(muic_irqs[i].virq, info); return ret; } static int max8997_muic_remove(struct platform_device *pdev) { struct max8997_muic_info *info = platform_get_drvdata(pdev); int i; for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) free_irq(muic_irqs[i].virq, info); cancel_work_sync(&info->irq_work); return 0; } static struct platform_driver max8997_muic_driver = { Loading @@ -780,7 +766,6 @@ static struct platform_driver max8997_muic_driver = { .name = DEV_NAME, }, .probe = max8997_muic_probe, .remove = max8997_muic_remove, }; module_platform_driver(max8997_muic_driver); Loading
include/linux/devm-helpers.h +25 −0 Original line number Diff line number Diff line Loading @@ -51,4 +51,29 @@ static inline int devm_delayed_work_autocancel(struct device *dev, return devm_add_action(dev, devm_delayed_work_drop, w); } static inline void devm_work_drop(void *res) { cancel_work_sync(res); } /** * devm_work_autocancel - Resource-managed work allocation * @dev: Device which lifetime work is bound to * @w: Work to be added (and automatically cancelled) * @worker: Worker function * * Initialize work which is automatically cancelled when driver is detached. * A few drivers need to queue work which must be cancelled before driver * is detached to avoid accessing removed resources. * devm_work_autocancel() can be used to omit the explicit * cancelleation when driver is detached. */ static inline int devm_work_autocancel(struct device *dev, struct work_struct *w, work_func_t worker) { INIT_WORK(w, worker); return devm_add_action(dev, devm_work_drop, w); } #endif