diff options
author | Alexander Shiyan <shc_work@mail.ru> | 2013-12-14 08:03:12 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2014-01-21 03:28:10 -0500 |
commit | db9ef449aaa550389008c2020fba02e4440ce24b (patch) | |
tree | af101d60af6701be60d1d7659248f509b99fa222 | |
parent | e5a3da2143962edff6c8a66dec43654c2951804f (diff) |
mfd: mc13xxx: Simplify probe() & remove()
This patch simplifies probe() and remove() functions by moving
some initialisation code out from the I2C/SPI init() and exit()
functions and into the core driver.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r-- | drivers/mfd/mc13xxx-core.c | 36 | ||||
-rw-r--r-- | drivers/mfd/mc13xxx-i2c.c | 18 | ||||
-rw-r--r-- | drivers/mfd/mc13xxx-spi.c | 19 | ||||
-rw-r--r-- | drivers/mfd/mc13xxx.h | 6 |
4 files changed, 29 insertions, 50 deletions
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c index b0c7cb04af85..06e64b6fcb89 100644 --- a/drivers/mfd/mc13xxx-core.c +++ b/drivers/mfd/mc13xxx-core.c | |||
@@ -636,42 +636,36 @@ static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx) | |||
636 | } | 636 | } |
637 | #endif | 637 | #endif |
638 | 638 | ||
639 | int mc13xxx_common_init(struct mc13xxx *mc13xxx, | 639 | int mc13xxx_common_init(struct device *dev) |
640 | struct mc13xxx_platform_data *pdata, int irq) | ||
641 | { | 640 | { |
641 | struct mc13xxx_platform_data *pdata = dev_get_platdata(dev); | ||
642 | struct mc13xxx *mc13xxx = dev_get_drvdata(dev); | ||
642 | int ret; | 643 | int ret; |
643 | u32 revision; | 644 | u32 revision; |
644 | 645 | ||
645 | mc13xxx_lock(mc13xxx); | 646 | mc13xxx->dev = dev; |
646 | 647 | ||
647 | ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision); | 648 | ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision); |
648 | if (ret) | 649 | if (ret) |
649 | goto err_revision; | 650 | return ret; |
650 | 651 | ||
651 | mc13xxx->variant->print_revision(mc13xxx, revision); | 652 | mc13xxx->variant->print_revision(mc13xxx, revision); |
652 | 653 | ||
653 | /* mask all irqs */ | 654 | /* mask all irqs */ |
654 | ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff); | 655 | ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff); |
655 | if (ret) | 656 | if (ret) |
656 | goto err_mask; | 657 | return ret; |
657 | 658 | ||
658 | ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff); | 659 | ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff); |
659 | if (ret) | 660 | if (ret) |
660 | goto err_mask; | 661 | return ret; |
661 | 662 | ||
662 | ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread, | 663 | ret = request_threaded_irq(mc13xxx->irq, NULL, mc13xxx_irq_thread, |
663 | IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); | 664 | IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); |
664 | 665 | if (ret) | |
665 | if (ret) { | ||
666 | err_mask: | ||
667 | err_revision: | ||
668 | mc13xxx_unlock(mc13xxx); | ||
669 | return ret; | 666 | return ret; |
670 | } | ||
671 | |||
672 | mc13xxx->irq = irq; | ||
673 | 667 | ||
674 | mc13xxx_unlock(mc13xxx); | 668 | mutex_init(&mc13xxx->lock); |
675 | 669 | ||
676 | if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata) | 670 | if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata) |
677 | mc13xxx->flags = pdata->flags; | 671 | mc13xxx->flags = pdata->flags; |
@@ -707,13 +701,17 @@ err_revision: | |||
707 | } | 701 | } |
708 | EXPORT_SYMBOL_GPL(mc13xxx_common_init); | 702 | EXPORT_SYMBOL_GPL(mc13xxx_common_init); |
709 | 703 | ||
710 | void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx) | 704 | int mc13xxx_common_exit(struct device *dev) |
711 | { | 705 | { |
706 | struct mc13xxx *mc13xxx = dev_get_drvdata(dev); | ||
707 | |||
712 | free_irq(mc13xxx->irq, mc13xxx); | 708 | free_irq(mc13xxx->irq, mc13xxx); |
709 | mfd_remove_devices(dev); | ||
710 | mutex_destroy(&mc13xxx->lock); | ||
713 | 711 | ||
714 | mfd_remove_devices(mc13xxx->dev); | 712 | return 0; |
715 | } | 713 | } |
716 | EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup); | 714 | EXPORT_SYMBOL_GPL(mc13xxx_common_exit); |
717 | 715 | ||
718 | MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); | 716 | MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); |
719 | MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); | 717 | MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); |
diff --git a/drivers/mfd/mc13xxx-i2c.c b/drivers/mfd/mc13xxx-i2c.c index 898bd335cd8e..ae3addb153a2 100644 --- a/drivers/mfd/mc13xxx-i2c.c +++ b/drivers/mfd/mc13xxx-i2c.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/slab.h> | 10 | #include <linux/slab.h> |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/mutex.h> | ||
14 | #include <linux/mfd/core.h> | 13 | #include <linux/mfd/core.h> |
15 | #include <linux/mfd/mc13xxx.h> | 14 | #include <linux/mfd/mc13xxx.h> |
16 | #include <linux/of.h> | 15 | #include <linux/of.h> |
@@ -60,7 +59,6 @@ static int mc13xxx_i2c_probe(struct i2c_client *client, | |||
60 | const struct i2c_device_id *id) | 59 | const struct i2c_device_id *id) |
61 | { | 60 | { |
62 | struct mc13xxx *mc13xxx; | 61 | struct mc13xxx *mc13xxx; |
63 | struct mc13xxx_platform_data *pdata = dev_get_platdata(&client->dev); | ||
64 | int ret; | 62 | int ret; |
65 | 63 | ||
66 | mc13xxx = devm_kzalloc(&client->dev, sizeof(*mc13xxx), GFP_KERNEL); | 64 | mc13xxx = devm_kzalloc(&client->dev, sizeof(*mc13xxx), GFP_KERNEL); |
@@ -69,15 +67,13 @@ static int mc13xxx_i2c_probe(struct i2c_client *client, | |||
69 | 67 | ||
70 | dev_set_drvdata(&client->dev, mc13xxx); | 68 | dev_set_drvdata(&client->dev, mc13xxx); |
71 | 69 | ||
72 | mc13xxx->dev = &client->dev; | 70 | mc13xxx->irq = client->irq; |
73 | mutex_init(&mc13xxx->lock); | ||
74 | 71 | ||
75 | mc13xxx->regmap = devm_regmap_init_i2c(client, | 72 | mc13xxx->regmap = devm_regmap_init_i2c(client, |
76 | &mc13xxx_regmap_i2c_config); | 73 | &mc13xxx_regmap_i2c_config); |
77 | if (IS_ERR(mc13xxx->regmap)) { | 74 | if (IS_ERR(mc13xxx->regmap)) { |
78 | ret = PTR_ERR(mc13xxx->regmap); | 75 | ret = PTR_ERR(mc13xxx->regmap); |
79 | dev_err(mc13xxx->dev, "Failed to initialize register map: %d\n", | 76 | dev_err(&client->dev, "Failed to initialize regmap: %d\n", ret); |
80 | ret); | ||
81 | return ret; | 77 | return ret; |
82 | } | 78 | } |
83 | 79 | ||
@@ -89,18 +85,12 @@ static int mc13xxx_i2c_probe(struct i2c_client *client, | |||
89 | mc13xxx->variant = (void *)id->driver_data; | 85 | mc13xxx->variant = (void *)id->driver_data; |
90 | } | 86 | } |
91 | 87 | ||
92 | ret = mc13xxx_common_init(mc13xxx, pdata, client->irq); | 88 | return mc13xxx_common_init(&client->dev); |
93 | |||
94 | return ret; | ||
95 | } | 89 | } |
96 | 90 | ||
97 | static int mc13xxx_i2c_remove(struct i2c_client *client) | 91 | static int mc13xxx_i2c_remove(struct i2c_client *client) |
98 | { | 92 | { |
99 | struct mc13xxx *mc13xxx = dev_get_drvdata(&client->dev); | 93 | return mc13xxx_common_exit(&client->dev); |
100 | |||
101 | mc13xxx_common_cleanup(mc13xxx); | ||
102 | |||
103 | return 0; | ||
104 | } | 94 | } |
105 | 95 | ||
106 | static struct i2c_driver mc13xxx_i2c_driver = { | 96 | static struct i2c_driver mc13xxx_i2c_driver = { |
diff --git a/drivers/mfd/mc13xxx-spi.c b/drivers/mfd/mc13xxx-spi.c index cbcc86d9b6e7..38ab67829791 100644 --- a/drivers/mfd/mc13xxx-spi.c +++ b/drivers/mfd/mc13xxx-spi.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | #include <linux/mutex.h> | ||
17 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
18 | #include <linux/mfd/core.h> | 17 | #include <linux/mfd/core.h> |
19 | #include <linux/mfd/mc13xxx.h> | 18 | #include <linux/mfd/mc13xxx.h> |
@@ -129,26 +128,24 @@ static struct regmap_bus regmap_mc13xxx_bus = { | |||
129 | static int mc13xxx_spi_probe(struct spi_device *spi) | 128 | static int mc13xxx_spi_probe(struct spi_device *spi) |
130 | { | 129 | { |
131 | struct mc13xxx *mc13xxx; | 130 | struct mc13xxx *mc13xxx; |
132 | struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); | ||
133 | int ret; | 131 | int ret; |
134 | 132 | ||
135 | mc13xxx = devm_kzalloc(&spi->dev, sizeof(*mc13xxx), GFP_KERNEL); | 133 | mc13xxx = devm_kzalloc(&spi->dev, sizeof(*mc13xxx), GFP_KERNEL); |
136 | if (!mc13xxx) | 134 | if (!mc13xxx) |
137 | return -ENOMEM; | 135 | return -ENOMEM; |
138 | 136 | ||
139 | spi_set_drvdata(spi, mc13xxx); | 137 | dev_set_drvdata(&spi->dev, mc13xxx); |
138 | |||
140 | spi->mode = SPI_MODE_0 | SPI_CS_HIGH; | 139 | spi->mode = SPI_MODE_0 | SPI_CS_HIGH; |
141 | 140 | ||
142 | mc13xxx->dev = &spi->dev; | 141 | mc13xxx->irq = spi->irq; |
143 | mutex_init(&mc13xxx->lock); | ||
144 | 142 | ||
145 | mc13xxx->regmap = devm_regmap_init(&spi->dev, ®map_mc13xxx_bus, | 143 | mc13xxx->regmap = devm_regmap_init(&spi->dev, ®map_mc13xxx_bus, |
146 | &spi->dev, | 144 | &spi->dev, |
147 | &mc13xxx_regmap_spi_config); | 145 | &mc13xxx_regmap_spi_config); |
148 | if (IS_ERR(mc13xxx->regmap)) { | 146 | if (IS_ERR(mc13xxx->regmap)) { |
149 | ret = PTR_ERR(mc13xxx->regmap); | 147 | ret = PTR_ERR(mc13xxx->regmap); |
150 | dev_err(mc13xxx->dev, "Failed to initialize register map: %d\n", | 148 | dev_err(&spi->dev, "Failed to initialize regmap: %d\n", ret); |
151 | ret); | ||
152 | return ret; | 149 | return ret; |
153 | } | 150 | } |
154 | 151 | ||
@@ -163,16 +160,12 @@ static int mc13xxx_spi_probe(struct spi_device *spi) | |||
163 | mc13xxx->variant = (void *)id_entry->driver_data; | 160 | mc13xxx->variant = (void *)id_entry->driver_data; |
164 | } | 161 | } |
165 | 162 | ||
166 | return mc13xxx_common_init(mc13xxx, pdata, spi->irq); | 163 | return mc13xxx_common_init(&spi->dev); |
167 | } | 164 | } |
168 | 165 | ||
169 | static int mc13xxx_spi_remove(struct spi_device *spi) | 166 | static int mc13xxx_spi_remove(struct spi_device *spi) |
170 | { | 167 | { |
171 | struct mc13xxx *mc13xxx = spi_get_drvdata(spi); | 168 | return mc13xxx_common_exit(&spi->dev); |
172 | |||
173 | mc13xxx_common_cleanup(mc13xxx); | ||
174 | |||
175 | return 0; | ||
176 | } | 169 | } |
177 | 170 | ||
178 | static struct spi_driver mc13xxx_spi_driver = { | 171 | static struct spi_driver mc13xxx_spi_driver = { |
diff --git a/drivers/mfd/mc13xxx.h b/drivers/mfd/mc13xxx.h index 460ec5c7b18c..ae7f1659f5d1 100644 --- a/drivers/mfd/mc13xxx.h +++ b/drivers/mfd/mc13xxx.h | |||
@@ -43,9 +43,7 @@ struct mc13xxx { | |||
43 | int adcflags; | 43 | int adcflags; |
44 | }; | 44 | }; |
45 | 45 | ||
46 | int mc13xxx_common_init(struct mc13xxx *mc13xxx, | 46 | int mc13xxx_common_init(struct device *dev); |
47 | struct mc13xxx_platform_data *pdata, int irq); | 47 | int mc13xxx_common_exit(struct device *dev); |
48 | |||
49 | void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx); | ||
50 | 48 | ||
51 | #endif /* __DRIVERS_MFD_MC13XXX_H */ | 49 | #endif /* __DRIVERS_MFD_MC13XXX_H */ |