Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alexander Shiyan and committed by
Lee Jones
db9ef449 e5a3da21

+31 -52
+19 -21
drivers/mfd/mc13xxx-core.c
··· 636 636 } 637 637 #endif 638 638 639 - int mc13xxx_common_init(struct mc13xxx *mc13xxx, 640 - struct mc13xxx_platform_data *pdata, int irq) 639 + int mc13xxx_common_init(struct device *dev) 641 640 { 641 + struct mc13xxx_platform_data *pdata = dev_get_platdata(dev); 642 + struct mc13xxx *mc13xxx = dev_get_drvdata(dev); 642 643 int ret; 643 644 u32 revision; 644 645 645 - mc13xxx_lock(mc13xxx); 646 + mc13xxx->dev = dev; 646 647 647 648 ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision); 648 649 if (ret) 649 - goto err_revision; 650 + return ret; 650 651 651 652 mc13xxx->variant->print_revision(mc13xxx, revision); 652 653 653 654 /* mask all irqs */ 654 655 ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff); 655 656 if (ret) 656 - goto err_mask; 657 + return ret; 657 658 658 659 ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff); 659 660 if (ret) 660 - goto err_mask; 661 - 662 - ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread, 663 - IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); 664 - 665 - if (ret) { 666 - err_mask: 667 - err_revision: 668 - mc13xxx_unlock(mc13xxx); 669 661 return ret; 670 - } 671 662 672 - mc13xxx->irq = irq; 663 + ret = request_threaded_irq(mc13xxx->irq, NULL, mc13xxx_irq_thread, 664 + IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); 665 + if (ret) 666 + return ret; 673 667 674 - mc13xxx_unlock(mc13xxx); 668 + mutex_init(&mc13xxx->lock); 675 669 676 670 if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata) 677 671 mc13xxx->flags = pdata->flags; ··· 701 707 } 702 708 EXPORT_SYMBOL_GPL(mc13xxx_common_init); 703 709 704 - void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx) 710 + int mc13xxx_common_exit(struct device *dev) 705 711 { 706 - free_irq(mc13xxx->irq, mc13xxx); 712 + struct mc13xxx *mc13xxx = dev_get_drvdata(dev); 707 713 708 - mfd_remove_devices(mc13xxx->dev); 714 + free_irq(mc13xxx->irq, mc13xxx); 715 + mfd_remove_devices(dev); 716 + mutex_destroy(&mc13xxx->lock); 717 + 718 + return 0; 709 719 } 710 - EXPORT_SYMBOL_GPL(mc13xxx_common_cleanup); 720 + EXPORT_SYMBOL_GPL(mc13xxx_common_exit); 711 721 712 722 MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); 713 723 MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>");
+4 -14
drivers/mfd/mc13xxx-i2c.c
··· 10 10 #include <linux/slab.h> 11 11 #include <linux/module.h> 12 12 #include <linux/platform_device.h> 13 - #include <linux/mutex.h> 14 13 #include <linux/mfd/core.h> 15 14 #include <linux/mfd/mc13xxx.h> 16 15 #include <linux/of.h> ··· 59 60 const struct i2c_device_id *id) 60 61 { 61 62 struct mc13xxx *mc13xxx; 62 - struct mc13xxx_platform_data *pdata = dev_get_platdata(&client->dev); 63 63 int ret; 64 64 65 65 mc13xxx = devm_kzalloc(&client->dev, sizeof(*mc13xxx), GFP_KERNEL); ··· 67 69 68 70 dev_set_drvdata(&client->dev, mc13xxx); 69 71 70 - mc13xxx->dev = &client->dev; 71 - mutex_init(&mc13xxx->lock); 72 + mc13xxx->irq = client->irq; 72 73 73 74 mc13xxx->regmap = devm_regmap_init_i2c(client, 74 75 &mc13xxx_regmap_i2c_config); 75 76 if (IS_ERR(mc13xxx->regmap)) { 76 77 ret = PTR_ERR(mc13xxx->regmap); 77 - dev_err(mc13xxx->dev, "Failed to initialize register map: %d\n", 78 - ret); 78 + dev_err(&client->dev, "Failed to initialize regmap: %d\n", ret); 79 79 return ret; 80 80 } 81 81 ··· 85 89 mc13xxx->variant = (void *)id->driver_data; 86 90 } 87 91 88 - ret = mc13xxx_common_init(mc13xxx, pdata, client->irq); 89 - 90 - return ret; 92 + return mc13xxx_common_init(&client->dev); 91 93 } 92 94 93 95 static int mc13xxx_i2c_remove(struct i2c_client *client) 94 96 { 95 - struct mc13xxx *mc13xxx = dev_get_drvdata(&client->dev); 96 - 97 - mc13xxx_common_cleanup(mc13xxx); 98 - 99 - return 0; 97 + return mc13xxx_common_exit(&client->dev); 100 98 } 101 99 102 100 static struct i2c_driver mc13xxx_i2c_driver = {
+6 -13
drivers/mfd/mc13xxx-spi.c
··· 13 13 #include <linux/slab.h> 14 14 #include <linux/module.h> 15 15 #include <linux/platform_device.h> 16 - #include <linux/mutex.h> 17 16 #include <linux/interrupt.h> 18 17 #include <linux/mfd/core.h> 19 18 #include <linux/mfd/mc13xxx.h> ··· 128 129 static int mc13xxx_spi_probe(struct spi_device *spi) 129 130 { 130 131 struct mc13xxx *mc13xxx; 131 - struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); 132 132 int ret; 133 133 134 134 mc13xxx = devm_kzalloc(&spi->dev, sizeof(*mc13xxx), GFP_KERNEL); 135 135 if (!mc13xxx) 136 136 return -ENOMEM; 137 137 138 - spi_set_drvdata(spi, mc13xxx); 138 + dev_set_drvdata(&spi->dev, mc13xxx); 139 + 139 140 spi->mode = SPI_MODE_0 | SPI_CS_HIGH; 140 141 141 - mc13xxx->dev = &spi->dev; 142 - mutex_init(&mc13xxx->lock); 142 + mc13xxx->irq = spi->irq; 143 143 144 144 mc13xxx->regmap = devm_regmap_init(&spi->dev, &regmap_mc13xxx_bus, 145 145 &spi->dev, 146 146 &mc13xxx_regmap_spi_config); 147 147 if (IS_ERR(mc13xxx->regmap)) { 148 148 ret = PTR_ERR(mc13xxx->regmap); 149 - dev_err(mc13xxx->dev, "Failed to initialize register map: %d\n", 150 - ret); 149 + dev_err(&spi->dev, "Failed to initialize regmap: %d\n", ret); 151 150 return ret; 152 151 } 153 152 ··· 160 163 mc13xxx->variant = (void *)id_entry->driver_data; 161 164 } 162 165 163 - return mc13xxx_common_init(mc13xxx, pdata, spi->irq); 166 + return mc13xxx_common_init(&spi->dev); 164 167 } 165 168 166 169 static int mc13xxx_spi_remove(struct spi_device *spi) 167 170 { 168 - struct mc13xxx *mc13xxx = spi_get_drvdata(spi); 169 - 170 - mc13xxx_common_cleanup(mc13xxx); 171 - 172 - return 0; 171 + return mc13xxx_common_exit(&spi->dev); 173 172 } 174 173 175 174 static struct spi_driver mc13xxx_spi_driver = {
+2 -4
drivers/mfd/mc13xxx.h
··· 43 43 int adcflags; 44 44 }; 45 45 46 - int mc13xxx_common_init(struct mc13xxx *mc13xxx, 47 - struct mc13xxx_platform_data *pdata, int irq); 48 - 49 - void mc13xxx_common_cleanup(struct mc13xxx *mc13xxx); 46 + int mc13xxx_common_init(struct device *dev); 47 + int mc13xxx_common_exit(struct device *dev); 50 48 51 49 #endif /* __DRIVERS_MFD_MC13XXX_H */