aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Shiyan <shc_work@mail.ru>2013-12-14 08:03:12 -0500
committerLee Jones <lee.jones@linaro.org>2014-01-21 03:28:10 -0500
commitdb9ef449aaa550389008c2020fba02e4440ce24b (patch)
treeaf101d60af6701be60d1d7659248f509b99fa222
parente5a3da2143962edff6c8a66dec43654c2951804f (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.c36
-rw-r--r--drivers/mfd/mc13xxx-i2c.c18
-rw-r--r--drivers/mfd/mc13xxx-spi.c19
-rw-r--r--drivers/mfd/mc13xxx.h6
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
639int mc13xxx_common_init(struct mc13xxx *mc13xxx, 639int 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) {
666err_mask:
667err_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}
708EXPORT_SYMBOL_GPL(mc13xxx_common_init); 702EXPORT_SYMBOL_GPL(mc13xxx_common_init);
709 703
710void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx) 704int 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}
716EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup); 714EXPORT_SYMBOL_GPL(mc13xxx_common_exit);
717 715
718MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); 716MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC");
719MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); 717MODULE_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
97static int mc13xxx_i2c_remove(struct i2c_client *client) 91static 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
106static struct i2c_driver mc13xxx_i2c_driver = { 96static 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 = {
129static int mc13xxx_spi_probe(struct spi_device *spi) 128static 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, &regmap_mc13xxx_bus, 143 mc13xxx->regmap = devm_regmap_init(&spi->dev, &regmap_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
169static int mc13xxx_spi_remove(struct spi_device *spi) 166static 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
178static struct spi_driver mc13xxx_spi_driver = { 171static 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
46int mc13xxx_common_init(struct mc13xxx *mc13xxx, 46int mc13xxx_common_init(struct device *dev);
47 struct mc13xxx_platform_data *pdata, int irq); 47int mc13xxx_common_exit(struct device *dev);
48
49void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx);
50 48
51#endif /* __DRIVERS_MFD_MC13XXX_H */ 49#endif /* __DRIVERS_MFD_MC13XXX_H */