mfd: mc13xxx: Simplify probe() & remove()
[deliverable/linux.git] / drivers / mfd / mc13xxx-core.c
index dbbf8ee3f592369fdd5aa968148e7aa307246580..06e64b6fcb89d66aaa7299bb1384acc26b47884b 100644 (file)
@@ -158,9 +158,6 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)
 {
        int ret;
 
-       if (offset > MC13XXX_NUMREGS)
-               return -EINVAL;
-
        ret = regmap_read(mc13xxx->regmap, offset, val);
        dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
 
@@ -172,7 +169,7 @@ int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)
 {
        dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val);
 
-       if (offset > MC13XXX_NUMREGS || val > 0xffffff)
+       if (val >= BIT(24))
                return -EINVAL;
 
        return regmap_write(mc13xxx->regmap, offset, val);
@@ -639,42 +636,36 @@ static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
 }
 #endif
 
-int mc13xxx_common_init(struct mc13xxx *mc13xxx,
-               struct mc13xxx_platform_data *pdata, int irq)
+int mc13xxx_common_init(struct device *dev)
 {
+       struct mc13xxx_platform_data *pdata = dev_get_platdata(dev);
+       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
        int ret;
        u32 revision;
 
-       mc13xxx_lock(mc13xxx);
+       mc13xxx->dev = dev;
 
        ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);
        if (ret)
-               goto err_revision;
+               return ret;
 
        mc13xxx->variant->print_revision(mc13xxx, revision);
 
        /* mask all irqs */
        ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff);
        if (ret)
-               goto err_mask;
+               return ret;
 
        ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff);
        if (ret)
-               goto err_mask;
+               return ret;
 
-       ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread,
+       ret = request_threaded_irq(mc13xxx->irq, NULL, mc13xxx_irq_thread,
                        IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx);
-
-       if (ret) {
-err_mask:
-err_revision:
-               mc13xxx_unlock(mc13xxx);
+       if (ret)
                return ret;
-       }
 
-       mc13xxx->irq = irq;
-
-       mc13xxx_unlock(mc13xxx);
+       mutex_init(&mc13xxx->lock);
 
        if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)
                mc13xxx->flags = pdata->flags;
@@ -710,13 +701,17 @@ err_revision:
 }
 EXPORT_SYMBOL_GPL(mc13xxx_common_init);
 
-void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx)
+int mc13xxx_common_exit(struct device *dev)
 {
+       struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
+
        free_irq(mc13xxx->irq, mc13xxx);
+       mfd_remove_devices(dev);
+       mutex_destroy(&mc13xxx->lock);
 
-       mfd_remove_devices(mc13xxx->dev);
+       return 0;
 }
-EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup);
+EXPORT_SYMBOL_GPL(mc13xxx_common_exit);
 
 MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC");
 MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");
This page took 0.028569 seconds and 5 git commands to generate.