diff for duplicates of <201102221423.45932.marc@cpdesign.com.au> diff --git a/a/1.txt b/N1/1.txt index c8ac7ab..3a1250a 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -31,3 +31,32 @@ Cheers Marc [1] https://patchwork.kernel.org/patch/449541/ + +-------------- next part -------------- +A non-text attachment was scrubbed... +Name: v4-1-4-mc13xxx-core-Prepare-for-separate-spi-and-i2c-backends..patch +Type: text/x-patch +Size: 11185 bytes +Desc: not available +URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0004.bin> +-------------- next part -------------- +A non-text attachment was scrubbed... +Name: v4-2-4-mc13xxx-core-Kconfig-Config-menu-driven-by-specific-IC-type.patch +Type: text/x-patch +Size: 2740 bytes +Desc: not available +URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0005.bin> +-------------- next part -------------- +A non-text attachment was scrubbed... +Name: v4-3-4-mc13xxx-core-Move-spi-specific-code-into-separate-module..patch +Type: text/x-patch +Size: 10876 bytes +Desc: not available +URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0006.bin> +-------------- next part -------------- +A non-text attachment was scrubbed... +Name: v4-4-4-mc13xxx-core-Add-i2c-driver.patch +Type: text/x-patch +Size: 5118 bytes +Desc: not available +URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0007.bin> diff --git a/a/2.hdr b/a/2.hdr deleted file mode 100644 index 839ea8a..0000000 --- a/a/2.hdr +++ /dev/null @@ -1,6 +0,0 @@ -Content-Type: text/x-patch; - charset="UTF-8"; - name="v4-1-4-mc13xxx-core-Prepare-for-separate-spi-and-i2c-backends..patch" -Content-Transfer-Encoding: quoted-printable -Content-Disposition: attachment; - filename="v4-1-4-mc13xxx-core-Prepare-for-separate-spi-and-i2c-backends..patch" diff --git a/a/2.txt b/a/2.txt deleted file mode 100644 index fbe0bde..0000000 --- a/a/2.txt +++ /dev/null @@ -1,385 +0,0 @@ -From patchwork Tue Jan 4 05:34:56 2011 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v4,1/4] mc13xxx-core: Prepare for separate spi and i2c backends. -Date: Tue, 04 Jan 2011 05:34:56 -0000 -From: Marc Reilly <marc@cpdesign.com.au> -X-Patchwork-Id: 449541 -Message-Id: <1294119299-18352-2-git-send-email-marc@cpdesign.com.au> -To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de -Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org, - Marc Reilly <marc@cpdesign.com.au> - -This patch abstracts the bus specific operations from the driver core. -Read and write handlers are introduced and generic initialization is -consolidated into mc13xxx_comon_init. The irq member is removed because -it is unused. - -Signed-off-by: Marc Reilly <marc@cpdesign.com.au> - ---- -drivers/mfd/mc13xxx-core.c | 158 +++++++++++++++++++++++++----------------- - include/linux/mfd/mc13xxx.h | 5 ++ - 2 files changed, 99 insertions(+), 64 deletions(-) - -diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c -index a2ac2ed..d1f1d7b 100644 ---- a/drivers/mfd/mc13xxx-core.c -+++ b/drivers/mfd/mc13xxx-core.c -@@ -19,10 +19,22 @@ - #include <linux/mfd/core.h> - #include <linux/mfd/mc13xxx.h> - -+enum mc13xxx_id { -+ MC13XXX_ID_MC13783, -+ MC13XXX_ID_MC13892, -+ MC13XXX_ID_INVALID, -+}; -+ - struct mc13xxx { - struct spi_device *spidev; -+ -+ struct device *dev; -+ enum mc13xxx_id ictype; -+ - struct mutex lock; -- int irq; -+ -+ int (*read_dev)(struct mc13xxx *, unsigned int, u32 *); -+ int (*write_dev)(struct mc13xxx *, unsigned int, u32); - - irq_handler_t irqhandler[MC13XXX_NUM_IRQ]; - void *irqdata[MC13XXX_NUM_IRQ]; -@@ -150,36 +162,32 @@ EXPORT_SYMBOL(mc13783_to_mc13xxx); - void mc13xxx_lock(struct mc13xxx *mc13xxx) - { - if (!mutex_trylock(&mc13xxx->lock)) { -- dev_dbg(&mc13xxx->spidev->dev, "wait for %s from %pf\n", -+ dev_dbg(mc13xxx->dev, "wait for %s from %pf\n", - __func__, __builtin_return_address(0)); - - mutex_lock(&mc13xxx->lock); - } -- dev_dbg(&mc13xxx->spidev->dev, "%s from %pf\n", -+ dev_dbg(mc13xxx->dev, "%s from %pf\n", - __func__, __builtin_return_address(0)); - } - EXPORT_SYMBOL(mc13xxx_lock); - - void mc13xxx_unlock(struct mc13xxx *mc13xxx) - { -- dev_dbg(&mc13xxx->spidev->dev, "%s from %pf\n", -+ dev_dbg(mc13xxx->dev, "%s from %pf\n", - __func__, __builtin_return_address(0)); - mutex_unlock(&mc13xxx->lock); - } - EXPORT_SYMBOL(mc13xxx_unlock); - - #define MC13XXX_REGOFFSET_SHIFT 25 --int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val) -+static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx, -+ unsigned int offset, u32 *val) - { - struct spi_transfer t; - struct spi_message m; - int ret; - -- BUG_ON(!mutex_is_locked(&mc13xxx->lock)); -- -- if (offset > MC13XXX_NUMREGS) -- return -EINVAL; -- - *val = offset << MC13XXX_REGOFFSET_SHIFT; - - memset(&t, 0, sizeof(t)); -@@ -201,26 +209,33 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val) - - *val &= 0xffffff; - -- dev_vdbg(&mc13xxx->spidev->dev, "[0x%02x] -> 0x%06x\n", offset, *val); -- - return 0; - } --EXPORT_SYMBOL(mc13xxx_reg_read); - --int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val) -+int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val) - { -- u32 buf; -- struct spi_transfer t; -- struct spi_message m; - int ret; - - BUG_ON(!mutex_is_locked(&mc13xxx->lock)); - -- dev_vdbg(&mc13xxx->spidev->dev, "[0x%02x] <- 0x%06x\n", offset, val); -- -- if (offset > MC13XXX_NUMREGS || val > 0xffffff) -+ if (offset > MC13XXX_NUMREGS) - return -EINVAL; - -+ ret = mc13xxx->read_dev(mc13xxx, offset, val); -+ dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val); -+ -+ return ret; -+} -+EXPORT_SYMBOL(mc13xxx_reg_read); -+ -+static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, -+ u32 val) -+{ -+ u32 buf; -+ struct spi_transfer t; -+ struct spi_message m; -+ int ret; -+ - buf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val; - - memset(&t, 0, sizeof(t)); -@@ -241,6 +256,18 @@ int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val) - - return 0; - } -+ -+int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val) -+{ -+ BUG_ON(!mutex_is_locked(&mc13xxx->lock)); -+ -+ dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val); -+ -+ if (offset > MC13XXX_NUMREGS || val > 0xffffff) -+ return -EINVAL; -+ -+ return mc13xxx->write_dev(mc13xxx, offset, val); -+} - EXPORT_SYMBOL(mc13xxx_reg_write); - - int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset, -@@ -445,7 +472,7 @@ static int mc13xxx_irq_handle(struct mc13xxx *mc13xxx, - if (handled == IRQ_HANDLED) - num_handled++; - } else { -- dev_err(&mc13xxx->spidev->dev, -+ dev_err(mc13xxx->dev, - "BUG: irq %u but no handler\n", - baseirq + irq); - -@@ -481,25 +508,23 @@ static irqreturn_t mc13xxx_irq_thread(int irq, void *data) - return IRQ_RETVAL(handled); - } - --enum mc13xxx_id { -- MC13XXX_ID_MC13783, -- MC13XXX_ID_MC13892, -- MC13XXX_ID_INVALID, --}; -- - const char *mc13xxx_chipname[] = { - [MC13XXX_ID_MC13783] = "mc13783", - [MC13XXX_ID_MC13892] = "mc13892", - }; - - #define maskval(reg, mask) (((reg) & (mask)) >> __ffs(mask)) --static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id) -+static int mc13xxx_identify(struct mc13xxx *mc13xxx) - { - u32 icid; - u32 revision; -- const char *name; - int ret; - -+ /* -+ * Get the generation ID from register 46, as apparently some older -+ * IC revisions only have this info at this location. Newer ICs seem to -+ * have both. -+ */ - ret = mc13xxx_reg_read(mc13xxx, 46, &icid); - if (ret) - return ret; -@@ -508,26 +533,23 @@ static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id) - - switch (icid) { - case 2: -- *id = MC13XXX_ID_MC13783; -- name = "mc13783"; -+ mc13xxx->ictype = MC13XXX_ID_MC13783; - break; - case 7: -- *id = MC13XXX_ID_MC13892; -- name = "mc13892"; -+ mc13xxx->ictype = MC13XXX_ID_MC13892; - break; - default: -- *id = MC13XXX_ID_INVALID; -+ mc13xxx->ictype = MC13XXX_ID_INVALID; - break; - } - -- if (*id == MC13XXX_ID_MC13783 || *id == MC13XXX_ID_MC13892) { -+ if (mc13xxx->ictype == MC13XXX_ID_MC13783 || -+ mc13xxx->ictype == MC13XXX_ID_MC13892) { - ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision); -- if (ret) -- return ret; - -- dev_info(&mc13xxx->spidev->dev, "%s: rev: %d.%d, " -+ dev_info(mc13xxx->dev, "%s: rev: %d.%d, " - "fin: %d, fab: %d, icid: %d/%d\n", -- mc13xxx_chipname[*id], -+ mc13xxx_chipname[mc13xxx->ictype], - maskval(revision, MC13XXX_REVISION_REVFULL), - maskval(revision, MC13XXX_REVISION_REVMETAL), - maskval(revision, MC13XXX_REVISION_FIN), -@@ -536,26 +558,12 @@ static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id) - maskval(revision, MC13XXX_REVISION_ICIDCODE)); - } - -- if (*id != MC13XXX_ID_INVALID) { -- const struct spi_device_id *devid = -- spi_get_device_id(mc13xxx->spidev); -- if (!devid || devid->driver_data != *id) -- dev_warn(&mc13xxx->spidev->dev, "device id doesn't " -- "match auto detection!\n"); -- } -- -- return 0; -+ return (mc13xxx->ictype == MC13XXX_ID_INVALID) ? -ENODEV : 0; - } - - static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx) - { -- const struct spi_device_id *devid = -- spi_get_device_id(mc13xxx->spidev); -- -- if (!devid) -- return NULL; -- -- return mc13xxx_chipname[devid->driver_data]; -+ return mc13xxx_chipname[mc13xxx->ictype]; - } - - #include <linux/mfd/mc13783.h> -@@ -563,7 +571,7 @@ static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx) - int mc13xxx_get_flags(struct mc13xxx *mc13xxx) - { - struct mc13xxx_platform_data *pdata = -- dev_get_platdata(&mc13xxx->spidev->dev); -+ dev_get_platdata(mc13xxx->dev); - - return pdata->flags; - } -@@ -601,7 +609,7 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode, - }; - init_completion(&adcdone_data.done); - -- dev_dbg(&mc13xxx->spidev->dev, "%s\n", __func__); -+ dev_dbg(mc13xxx->dev, "%s\n", __func__); - - mc13xxx_lock(mc13xxx); - -@@ -643,7 +651,7 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode, - return -EINVAL; - } - -- dev_dbg(&mc13783->mc13xxx.spidev->dev, "%s: request irq\n", __func__); -+ dev_dbg(mc13783->mc13xxx.dev, "%s: request irq\n", __func__); - mc13xxx_irq_request(mc13xxx, MC13783_IRQ_ADCDONE, - mc13783_handler_adcdone, __func__, &adcdone_data); - mc13xxx_irq_ack(mc13xxx, MC13783_IRQ_ADCDONE); -@@ -701,7 +709,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx, - if (!cell.name) - return -ENOMEM; - -- return mfd_add_devices(&mc13xxx->spidev->dev, -1, &cell, 1, NULL, 0); -+ return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0); - } - - static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) -@@ -713,7 +721,6 @@ static int mc13xxx_probe(struct spi_device *spi) - { - struct mc13xxx *mc13xxx; - struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); -- enum mc13xxx_id id; - int ret; - - mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); -@@ -725,13 +732,36 @@ static int mc13xxx_probe(struct spi_device *spi) - spi->bits_per_word = 32; - spi_setup(spi); - -+ mc13xxx->dev = &spi->dev; - mc13xxx->spidev = spi; -+ mc13xxx->read_dev = mc13xxx_spi_reg_read; -+ mc13xxx->write_dev = mc13xxx_spi_reg_write; -+ -+ ret = mc13xxx_common_init(mc13xxx, pdata, spi->irq); -+ -+ if (ret) { -+ dev_set_drvdata(&spi->dev, NULL); -+ } else { -+ const struct spi_device_id *devid = -+ spi_get_device_id(mc13xxx->spidev); -+ if (!devid || devid->driver_data != mc13xxx->ictype) -+ dev_warn(mc13xxx->dev, -+ "device id doesn't match auto detection!\n"); -+ } -+ -+ return ret; -+} -+ -+int mc13xxx_common_init(struct mc13xxx *mc13xxx, -+ struct mc13xxx_platform_data *pdata, int irq) -+{ -+ int ret; - - mutex_init(&mc13xxx->lock); - mc13xxx_lock(mc13xxx); - -- ret = mc13xxx_identify(mc13xxx, &id); -- if (ret || id == MC13XXX_ID_INVALID) -+ ret = mc13xxx_identify(mc13xxx); -+ if (ret) - goto err_revision; - - /* mask all irqs */ -@@ -743,14 +773,13 @@ static int mc13xxx_probe(struct spi_device *spi) - if (ret) - goto err_mask; - -- ret = request_threaded_irq(spi->irq, NULL, mc13xxx_irq_thread, -+ ret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread, - IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx); - - if (ret) { - err_mask: - err_revision: - mutex_unlock(&mc13xxx->lock); -- dev_set_drvdata(&spi->dev, NULL); - kfree(mc13xxx); - return ret; - } -@@ -786,6 +815,7 @@ err_revision: - - return 0; - } -+EXPORT_SYMBOL_GPL(mc13xxx_common_init); - - static int __devexit mc13xxx_remove(struct spi_device *spi) - { -diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h -index a1d391b..f5d277d 100644 ---- a/include/linux/mfd/mc13xxx.h -+++ b/include/linux/mfd/mc13xxx.h -@@ -21,6 +21,11 @@ int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val); - int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset, - u32 mask, u32 val); - -+struct mc13xxx_platform_data; -+ -+int mc13xxx_common_init(struct mc13xxx *mc13xxx, -+ struct mc13xxx_platform_data *pdata, int irq); -+ - int mc13xxx_get_flags(struct mc13xxx *mc13xxx); - - int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq, diff --git a/a/3.hdr b/a/3.hdr deleted file mode 100644 index 8a504e8..0000000 --- a/a/3.hdr +++ /dev/null @@ -1,6 +0,0 @@ -Content-Type: text/x-patch; - charset="UTF-8"; - name="v4-2-4-mc13xxx-core-Kconfig-Config-menu-driven-by-specific-IC-type.patch" -Content-Transfer-Encoding: quoted-printable -Content-Disposition: attachment; - filename="v4-2-4-mc13xxx-core-Kconfig-Config-menu-driven-by-specific-IC-type.patch" diff --git a/a/3.txt b/a/3.txt deleted file mode 100644 index 9985121..0000000 --- a/a/3.txt +++ /dev/null @@ -1,78 +0,0 @@ -From patchwork Tue Jan 4 05:34:57 2011 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v4, - 2/4] mc13xxx-core: Kconfig: Config menu driven by specific IC type -Date: Tue, 04 Jan 2011 05:34:57 -0000 -From: Marc Reilly <marc@cpdesign.com.au> -X-Patchwork-Id: 449531 -Message-Id: <1294119299-18352-3-git-send-email-marc@cpdesign.com.au> -To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de -Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org, - Marc Reilly <marc@cpdesign.com.au> - -This patch makes config items for the mc13892 and mc13783 distinct and -splits introduces a separate config item for spi interface support in -preparation for a separate i2c and spi backend. - -The mc13xxx generic core is therefore selected by the spi (or i2c) item: -having it the other way around doesn't work for other drivers that will -need to distinguish between mc13783 and mc13892 (at build time). - -Signed-off-by: Marc Reilly <marc@cpdesign.com.au> - ---- -drivers/mfd/Kconfig | 34 +++++++++++++++++++++++++--------- - 1 files changed, 25 insertions(+), 9 deletions(-) - -diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 3a1493b..9ce1d42 100644 ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -425,20 +425,36 @@ config MFD_PCF50633 - so that function-specific drivers can bind to them. - - config MFD_MC13783 -- tristate -- --config MFD_MC13XXX -- tristate "Support Freescale MC13783 and MC13892" - depends on SPI_MASTER -- select MFD_CORE -- select MFD_MC13783 -+ select MFD_MC13XXX_SPI -+ tristate "Support for Freescale MC13783 PMIC" - help -- Support for the Freescale (Atlas) PMIC and audio CODECs -- MC13783 and MC13892. -- This driver provides common support for accessing the device, -+ Support for the Freescale MC13783 PMIC and audio CODEC. -+ This driver provides common support for accessing the device, - additional drivers must be enabled in order to use the - functionality of the device. - -+config MFD_MC13892 -+ depends on SPI_MASTER || I2C -+ select MFD_MC13XXX -+ tristate "Support for Freescale MC13892 PMIC" -+ help -+ Enable support for the Freescale MC13892 PMIC. -+ As the MC13892 can connect by either I2C or SPI bus, you will -+ also need to select which of these you would like to support. -+ Additional drivers must be enabled in order to use the -+ functionality of the device. -+ -+config MFD_MC13XXX -+ tristate -+ depends on SPI_MASTER || I2C -+ select MFD_CORE -+ -+config MFD_MC13XXX_SPI -+ tristate "Support Freescale MC13783 and MC13892 via SPI interface" -+ select MFD_MC13XXX -+ depends on SPI_MASTER && (MFD_MC13783 || MFD_MC13892) -+ - config PCF50633_ADC - tristate "Support for NXP PCF50633 ADC" - depends on MFD_PCF50633 diff --git a/a/4.hdr b/a/4.hdr deleted file mode 100644 index 46dd2e2..0000000 --- a/a/4.hdr +++ /dev/null @@ -1,6 +0,0 @@ -Content-Type: text/x-patch; - charset="UTF-8"; - name="v4-3-4-mc13xxx-core-Move-spi-specific-code-into-separate-module..patch" -Content-Transfer-Encoding: quoted-printable -Content-Disposition: attachment; - filename="v4-3-4-mc13xxx-core-Move-spi-specific-code-into-separate-module..patch" diff --git a/a/4.txt b/a/4.txt deleted file mode 100644 index 66f139d..0000000 --- a/a/4.txt +++ /dev/null @@ -1,452 +0,0 @@ -From patchwork Tue Jan 4 05:34:58 2011 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v4,3/4] mc13xxx-core: Move spi specific code into separate module. -Date: Tue, 04 Jan 2011 05:34:58 -0000 -From: Marc Reilly <marc@cpdesign.com.au> -X-Patchwork-Id: 449561 -Message-Id: <1294119299-18352-4-git-send-email-marc@cpdesign.com.au> -To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de -Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org, - Marc Reilly <marc@cpdesign.com.au> - -This patch moves all spi specific code into a new module. The mc13xxx -struct moves to the include file by necessity. - -Signed-off-by: Marc Reilly <marc@cpdesign.com.au> - ---- -drivers/mfd/Makefile | 1 + - drivers/mfd/mc13xxx-core.c | 166 ------------------------------------------ - drivers/mfd/mc13xxx-spi.c | 168 +++++++++++++++++++++++++++++++++++++++++++ - include/linux/mfd/mc13xxx.h | 21 ++++++ - 4 files changed, 190 insertions(+), 166 deletions(-) - create mode 100644 drivers/mfd/mc13xxx-spi.c - -diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile -index f54b365..492e881 100644 ---- a/drivers/mfd/Makefile -+++ b/drivers/mfd/Makefile -@@ -42,6 +42,7 @@ obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o - obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o - - obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o -+obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o - - obj-$(CONFIG_MFD_CORE) += mfd-core.o - -diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c -index d1f1d7b..3201041 100644 ---- a/drivers/mfd/mc13xxx-core.c -+++ b/drivers/mfd/mc13xxx-core.c -@@ -15,31 +15,9 @@ - #include <linux/platform_device.h> - #include <linux/mutex.h> - #include <linux/interrupt.h> --#include <linux/spi/spi.h> - #include <linux/mfd/core.h> - #include <linux/mfd/mc13xxx.h> - --enum mc13xxx_id { -- MC13XXX_ID_MC13783, -- MC13XXX_ID_MC13892, -- MC13XXX_ID_INVALID, --}; -- --struct mc13xxx { -- struct spi_device *spidev; -- -- struct device *dev; -- enum mc13xxx_id ictype; -- -- struct mutex lock; -- -- int (*read_dev)(struct mc13xxx *, unsigned int, u32 *); -- int (*write_dev)(struct mc13xxx *, unsigned int, u32); -- -- irq_handler_t irqhandler[MC13XXX_NUM_IRQ]; -- void *irqdata[MC13XXX_NUM_IRQ]; --}; -- - struct mc13783 { - struct mc13xxx mc13xxx; - -@@ -180,38 +158,6 @@ void mc13xxx_unlock(struct mc13xxx *mc13xxx) - } - EXPORT_SYMBOL(mc13xxx_unlock); - --#define MC13XXX_REGOFFSET_SHIFT 25 --static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx, -- unsigned int offset, u32 *val) --{ -- struct spi_transfer t; -- struct spi_message m; -- int ret; -- -- *val = offset << MC13XXX_REGOFFSET_SHIFT; -- -- memset(&t, 0, sizeof(t)); -- -- t.tx_buf = val; -- t.rx_buf = val; -- t.len = sizeof(u32); -- -- spi_message_init(&m); -- spi_message_add_tail(&t, &m); -- -- ret = spi_sync(mc13xxx->spidev, &m); -- -- /* error in message.status implies error return from spi_sync */ -- BUG_ON(!ret && m.status); -- -- if (ret) -- return ret; -- -- *val &= 0xffffff; -- -- return 0; --} -- - int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val) - { - int ret; -@@ -228,35 +174,6 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val) - } - EXPORT_SYMBOL(mc13xxx_reg_read); - --static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, -- u32 val) --{ -- u32 buf; -- struct spi_transfer t; -- struct spi_message m; -- int ret; -- -- buf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val; -- -- memset(&t, 0, sizeof(t)); -- -- t.tx_buf = &buf; -- t.rx_buf = &buf; -- t.len = sizeof(u32); -- -- spi_message_init(&m); -- spi_message_add_tail(&t, &m); -- -- ret = spi_sync(mc13xxx->spidev, &m); -- -- BUG_ON(!ret && m.status); -- -- if (ret) -- return ret; -- -- return 0; --} -- - int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val) - { - BUG_ON(!mutex_is_locked(&mc13xxx->lock)); -@@ -717,41 +634,6 @@ static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) - return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0); - } - --static int mc13xxx_probe(struct spi_device *spi) --{ -- struct mc13xxx *mc13xxx; -- struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); -- int ret; -- -- mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); -- if (!mc13xxx) -- return -ENOMEM; -- -- dev_set_drvdata(&spi->dev, mc13xxx); -- spi->mode = SPI_MODE_0 | SPI_CS_HIGH; -- spi->bits_per_word = 32; -- spi_setup(spi); -- -- mc13xxx->dev = &spi->dev; -- mc13xxx->spidev = spi; -- mc13xxx->read_dev = mc13xxx_spi_reg_read; -- mc13xxx->write_dev = mc13xxx_spi_reg_write; -- -- ret = mc13xxx_common_init(mc13xxx, pdata, spi->irq); -- -- if (ret) { -- dev_set_drvdata(&spi->dev, NULL); -- } else { -- const struct spi_device_id *devid = -- spi_get_device_id(mc13xxx->spidev); -- if (!devid || devid->driver_data != mc13xxx->ictype) -- dev_warn(mc13xxx->dev, -- "device id doesn't match auto detection!\n"); -- } -- -- return ret; --} -- - int mc13xxx_common_init(struct mc13xxx *mc13xxx, - struct mc13xxx_platform_data *pdata, int irq) - { -@@ -817,54 +699,6 @@ err_revision: - } - EXPORT_SYMBOL_GPL(mc13xxx_common_init); - --static int __devexit mc13xxx_remove(struct spi_device *spi) --{ -- struct mc13xxx *mc13xxx = dev_get_drvdata(&spi->dev); -- -- free_irq(mc13xxx->spidev->irq, mc13xxx); -- -- mfd_remove_devices(&spi->dev); -- -- kfree(mc13xxx); -- -- return 0; --} -- --static const struct spi_device_id mc13xxx_device_id[] = { -- { -- .name = "mc13783", -- .driver_data = MC13XXX_ID_MC13783, -- }, { -- .name = "mc13892", -- .driver_data = MC13XXX_ID_MC13892, -- }, { -- /* sentinel */ -- } --}; -- --static struct spi_driver mc13xxx_driver = { -- .id_table = mc13xxx_device_id, -- .driver = { -- .name = "mc13xxx", -- .bus = &spi_bus_type, -- .owner = THIS_MODULE, -- }, -- .probe = mc13xxx_probe, -- .remove = __devexit_p(mc13xxx_remove), --}; -- --static int __init mc13xxx_init(void) --{ -- return spi_register_driver(&mc13xxx_driver); --} --subsys_initcall(mc13xxx_init); -- --static void __exit mc13xxx_exit(void) --{ -- spi_unregister_driver(&mc13xxx_driver); --} --module_exit(mc13xxx_exit); -- - MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); - MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); - MODULE_LICENSE("GPL v2"); -diff --git a/drivers/mfd/mc13xxx-spi.c b/drivers/mfd/mc13xxx-spi.c -new file mode 100644 -index 0000000..d8ffff7 ---- /dev/null -+++ b/drivers/mfd/mc13xxx-spi.c -@@ -0,0 +1,168 @@ -+/* -+ * Copyright 2009-2010 Pengutronix -+ * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de> -+ * -+ * loosely based on an earlier driver that has -+ * Copyright 2009 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de> -+ * -+ * This program is free software; you can redistribute it and/or modify it under -+ * the terms of the GNU General Public License version 2 as published by the -+ * Free Software Foundation. -+ */ -+ -+#include <linux/slab.h> -+#include <linux/module.h> -+#include <linux/platform_device.h> -+#include <linux/mutex.h> -+#include <linux/interrupt.h> -+#include <linux/spi/spi.h> -+#include <linux/mfd/core.h> -+#include <linux/mfd/mc13xxx.h> -+ -+#define MC13XXX_REGOFFSET_SHIFT 25 -+static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx, -+ unsigned int offset, u32 *val) -+{ -+ struct spi_transfer t; -+ struct spi_message m; -+ int ret; -+ -+ *val = offset << MC13XXX_REGOFFSET_SHIFT; -+ -+ memset(&t, 0, sizeof(t)); -+ -+ t.tx_buf = val; -+ t.rx_buf = val; -+ t.len = sizeof(u32); -+ -+ spi_message_init(&m); -+ spi_message_add_tail(&t, &m); -+ -+ ret = spi_sync(mc13xxx->spidev, &m); -+ -+ /* error in message.status implies error return from spi_sync */ -+ BUG_ON(!ret && m.status); -+ -+ if (ret) -+ return ret; -+ -+ *val &= 0xffffff; -+ -+ return 0; -+} -+ -+static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, -+ u32 val) -+{ -+ u32 buf; -+ struct spi_transfer t; -+ struct spi_message m; -+ int ret; -+ -+ buf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val; -+ -+ memset(&t, 0, sizeof(t)); -+ -+ t.tx_buf = &buf; -+ t.rx_buf = &buf; -+ t.len = sizeof(u32); -+ -+ spi_message_init(&m); -+ spi_message_add_tail(&t, &m); -+ -+ ret = spi_sync(mc13xxx->spidev, &m); -+ -+ BUG_ON(!ret && m.status); -+ -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+static int mc13xxx_spi_probe(struct spi_device *spi) -+{ -+ struct mc13xxx *mc13xxx; -+ struct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev); -+ int ret; -+ -+ mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); -+ if (!mc13xxx) -+ return -ENOMEM; -+ -+ dev_set_drvdata(&spi->dev, mc13xxx); -+ spi->mode = SPI_MODE_0 | SPI_CS_HIGH; -+ spi->bits_per_word = 32; -+ spi_setup(spi); -+ -+ mc13xxx->dev = &spi->dev; -+ mc13xxx->spidev = spi; -+ mc13xxx->read_dev = mc13xxx_spi_reg_read; -+ mc13xxx->write_dev = mc13xxx_spi_reg_write; -+ -+ ret = mc13xxx_common_init(mc13xxx, pdata, spi->irq); -+ -+ if (ret) { -+ dev_set_drvdata(&spi->dev, NULL); -+ } else { -+ const struct spi_device_id *devid = -+ spi_get_device_id(mc13xxx->spidev); -+ if (!devid || devid->driver_data != mc13xxx->ictype) -+ dev_warn(mc13xxx->dev, -+ "device id doesn't match auto detection!\n"); -+ } -+ -+ return ret; -+} -+ -+static int __devexit mc13xxx_spi_remove(struct spi_device *spi) -+{ -+ struct mc13xxx *mc13xxx = dev_get_drvdata(&spi->dev); -+ -+ free_irq(mc13xxx->spidev->irq, mc13xxx); -+ -+ mfd_remove_devices(&spi->dev); -+ -+ kfree(mc13xxx); -+ -+ return 0; -+} -+ -+static const struct spi_device_id mc13xxx_device_id[] = { -+ { -+ .name = "mc13783", -+ .driver_data = MC13XXX_ID_MC13783, -+ }, { -+ .name = "mc13892", -+ .driver_data = MC13XXX_ID_MC13892, -+ }, { -+ /* sentinel */ -+ } -+}; -+ -+static struct spi_driver mc13xxx_spi_driver = { -+ .id_table = mc13xxx_device_id, -+ .driver = { -+ .name = "mc13xxx", -+ .bus = &spi_bus_type, -+ .owner = THIS_MODULE, -+ }, -+ .probe = mc13xxx_spi_probe, -+ .remove = __devexit_p(mc13xxx_spi_remove), -+}; -+ -+static int __init mc13xxx_spi_init(void) -+{ -+ return spi_register_driver(&mc13xxx_spi_driver); -+} -+subsys_initcall(mc13xxx_spi_init); -+ -+static void __exit mc13xxx_spi_exit(void) -+{ -+ spi_unregister_driver(&mc13xxx_spi_driver); -+} -+module_exit(mc13xxx_spi_exit); -+ -+MODULE_DESCRIPTION("Core driver for Freescale MC13XXX PMIC"); -+MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); -+MODULE_LICENSE("GPL v2"); -diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h -index f5d277d..ab7deb3 100644 ---- a/include/linux/mfd/mc13xxx.h -+++ b/include/linux/mfd/mc13xxx.h -@@ -66,6 +66,27 @@ int mc13xxx_get_flags(struct mc13xxx *mc13xxx); - - #define MC13XXX_NUM_IRQ 46 - -+enum mc13xxx_id { -+ MC13XXX_ID_MC13783, -+ MC13XXX_ID_MC13892, -+ MC13XXX_ID_INVALID, -+}; -+ -+struct mc13xxx { -+ struct spi_device *spidev; -+ -+ struct device *dev; -+ enum mc13xxx_id ictype; -+ -+ struct mutex lock; -+ -+ int (*read_dev)(struct mc13xxx *, unsigned int, u32 *); -+ int (*write_dev)(struct mc13xxx *, unsigned int, u32); -+ -+ irq_handler_t irqhandler[MC13XXX_NUM_IRQ]; -+ void *irqdata[MC13XXX_NUM_IRQ]; -+}; -+ - struct regulator_init_data; - - struct mc13xxx_regulator_init_data { diff --git a/a/5.hdr b/a/5.hdr deleted file mode 100644 index 34efcfe..0000000 --- a/a/5.hdr +++ /dev/null @@ -1,6 +0,0 @@ -Content-Type: text/x-patch; - charset="UTF-8"; - name="v4-4-4-mc13xxx-core-Add-i2c-driver.patch" -Content-Transfer-Encoding: quoted-printable -Content-Disposition: attachment; - filename="v4-4-4-mc13xxx-core-Add-i2c-driver.patch" diff --git a/a/5.txt b/a/5.txt deleted file mode 100644 index 6a2f4b2..0000000 --- a/a/5.txt +++ /dev/null @@ -1,188 +0,0 @@ -From patchwork Tue Jan 4 05:34:59 2011 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v4,4/4] mc13xxx-core: Add i2c driver -Date: Tue, 04 Jan 2011 05:34:59 -0000 -From: Marc Reilly <marc@cpdesign.com.au> -X-Patchwork-Id: 449551 -Message-Id: <1294119299-18352-5-git-send-email-marc@cpdesign.com.au> -To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de -Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org, - Marc Reilly <marc@cpdesign.com.au> - -Signed-off-by: Marc Reilly <marc@cpdesign.com.au> - ---- -drivers/mfd/Kconfig | 5 ++ - drivers/mfd/Makefile | 1 + - drivers/mfd/mc13xxx-i2c.c | 115 +++++++++++++++++++++++++++++++++++++++++++ - include/linux/mfd/mc13xxx.h | 5 ++- - 4 files changed, 125 insertions(+), 1 deletions(-) - create mode 100644 drivers/mfd/mc13xxx-i2c.c - -diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 9ce1d42..fbbbdaa 100644 ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -455,6 +455,11 @@ config MFD_MC13XXX_SPI - select MFD_MC13XXX - depends on SPI_MASTER && (MFD_MC13783 || MFD_MC13892) - -+config MFD_MC13XXX_I2C -+ tristate "Support Freescale MC13892 via I2C interface" -+ select MFD_MC13XXX -+ depends on I2C && MFD_MC13892 -+ - config PCF50633_ADC - tristate "Support for NXP PCF50633 ADC" - depends on MFD_PCF50633 -diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile -index 492e881..b7d774f 100644 ---- a/drivers/mfd/Makefile -+++ b/drivers/mfd/Makefile -@@ -43,6 +43,7 @@ obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o - - obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o - obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o -+obj-$(CONFIG_MFD_MC13XXX_I2C) += mc13xxx-i2c.o - - obj-$(CONFIG_MFD_CORE) += mfd-core.o - -diff --git a/drivers/mfd/mc13xxx-i2c.c b/drivers/mfd/mc13xxx-i2c.c -new file mode 100644 -index 0000000..b3f2f2b ---- /dev/null -+++ b/drivers/mfd/mc13xxx-i2c.c -@@ -0,0 +1,115 @@ -+/* -+ * Copyright 2009-2010 Creative Product Design -+ * Marc Reilly marc@cpdesign.com.au -+ * -+ * This program is free software; you can redistribute it and/or modify it under -+ * the terms of the GNU General Public License version 2 as published by the -+ * Free Software Foundation. -+ */ -+ -+#include <linux/slab.h> -+#include <linux/module.h> -+#include <linux/platform_device.h> -+#include <linux/mutex.h> -+#include <linux/mfd/core.h> -+#include <linux/mfd/mc13xxx.h> -+#include <linux/i2c.h> -+ -+static int mc13xxx_i2c_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, -+ u32 *val) -+{ -+ int ret; -+ unsigned char buf[3] = {0, 0, 0}; -+ -+ ret = i2c_smbus_read_i2c_block_data(mc13xxx->i2cclient, -+ offset, 3, buf); -+ *val = buf[0] << 16 | buf[1] << 8 | buf[2]; -+ -+ return ret == 3 ? 0 : ret; -+} -+ -+static int mc13xxx_i2c_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, -+ u32 val) -+{ -+ int ret; -+ unsigned char buf[3]; -+ -+ buf[0] = (val >> 16) & 0xff; -+ buf[1] = (val >> 8) & 0xff; -+ buf[2] = val & 0xff; -+ -+ ret = i2c_smbus_write_i2c_block_data(mc13xxx->i2cclient, -+ offset, 3, buf); -+ -+ return ret; -+} -+ -+static int mc13xxx_i2c_probe(struct i2c_client *client, -+ const struct i2c_device_id *id) -+{ -+ struct mc13xxx *mc13xxx; -+ struct mc13xxx_platform_data *pdata = dev_get_platdata(&client->dev); -+ int ret; -+ -+ mc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL); -+ if (!mc13xxx) -+ return -ENOMEM; -+ -+ dev_set_drvdata(&client->dev, mc13xxx); -+ mc13xxx->dev = &client->dev; -+ mc13xxx->i2cclient = client; -+ mc13xxx->read_dev = mc13xxx_i2c_reg_read; -+ mc13xxx->write_dev = mc13xxx_i2c_reg_write; -+ -+ ret = mc13xxx_common_init(mc13xxx, pdata, client->irq); -+ -+ if (ret == 0 && (id->driver_data != mc13xxx->ictype)) -+ dev_warn(mc13xxx->dev, -+ "device id doesn't match auto detection!\n"); -+ -+ return ret; -+} -+ -+static int __devexit mc13xxx_i2c_remove(struct i2c_client *client) -+{ -+ struct mc13xxx *mc13xxx = dev_get_drvdata(&client->dev); -+ -+ free_irq(client->irq, mc13xxx); -+ -+ mfd_remove_devices(&client->dev); -+ -+ kfree(mc13xxx); -+ -+ return 0; -+} -+ -+static const struct i2c_device_id mc13xxx_i2c_idtable[] = { -+ {"mc13892", MC13XXX_ID_MC13892}, -+ { } -+}; -+ -+static struct i2c_driver mc13xxx_i2c_driver = { -+ .driver = { -+ .owner = THIS_MODULE, -+ .name = "mc13xxx-i2c" -+ }, -+ .id_table = mc13xxx_i2c_idtable, -+ .probe = mc13xxx_i2c_probe, -+ .remove = __devexit_p(mc13xxx_i2c_remove), -+}; -+ -+static int __init mc13xxx_i2c_init(void) -+{ -+ return i2c_add_driver(&mc13xxx_i2c_driver); -+} -+subsys_initcall(mc13xxx_i2c_init); -+ -+static void __exit mc13xxx_i2c_exit(void) -+{ -+ i2c_del_driver(&mc13xxx_i2c_driver); -+} -+module_exit(mc13xxx_i2c_exit); -+ -+MODULE_DESCRIPTION("i2c driver for Freescale MC13XXX PMIC"); -+MODULE_AUTHOR("Marc Reilly <marc@cpdesign.com.au"); -+MODULE_LICENSE("GPL v2"); -diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h -index ab7deb3..c5ab08b 100644 ---- a/include/linux/mfd/mc13xxx.h -+++ b/include/linux/mfd/mc13xxx.h -@@ -73,7 +73,10 @@ enum mc13xxx_id { - }; - - struct mc13xxx { -- struct spi_device *spidev; -+ union { -+ struct spi_device *spidev; -+ struct i2c_client *i2cclient; -+ }; - - struct device *dev; - enum mc13xxx_id ictype; diff --git a/a/6.hdr b/a/6.hdr deleted file mode 100644 index 4b86001..0000000 --- a/a/6.hdr +++ /dev/null @@ -1,4 +0,0 @@ -Content-Type: text/plain; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: inline diff --git a/a/6.txt b/a/6.txt deleted file mode 100644 index 8133cf0..0000000 --- a/a/6.txt +++ /dev/null @@ -1,4 +0,0 @@ -_______________________________________________ -linux-arm-kernel mailing list -linux-arm-kernel@lists.infradead.org -http://lists.infradead.org/mailman/listinfo/linux-arm-kernel diff --git a/a/content_digest b/N1/content_digest index 50875ec..07994ca 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,16 +1,11 @@ "ref\01294119299-18352-1-git-send-email-marc@cpdesign.com.au\0" "ref\0201102122111.30525.marc@cpdesign.com.au\0" "ref\020110221163347.GG10686@sortiz-mobl\0" - "From\0Marc Reilly <marc@cpdesign.com.au>\0" - "Subject\0Re: mc13xxx-core, support for i2c, V4\0" + "From\0marc@cpdesign.com.au (Marc Reilly)\0" + "Subject\0mc13xxx-core, support for i2c, V4\0" "Date\0Tue, 22 Feb 2011 14:23:45 +1100\0" - "To\0Samuel Ortiz <sameo@linux.intel.com>\0" - "Cc\0Grant Likely <grant.likely@secretlab.ca>" - spi-devel-general@lists.sourceforge.net - linux-i2c@vger.kernel.org - linux-arm-kernel@lists.infradead.org - " u.kleine-koenig@pengutronix.de\0" - "\01:1\0" + "To\0linux-arm-kernel@lists.infradead.org\0" + "\00:1\0" "b\0" "Hi Samuel,\n" "\n" @@ -44,1127 +39,35 @@ "Cheers\n" "Marc\n" "\n" - [1] https://patchwork.kernel.org/patch/449541/ - "\01:2\0" - "fn\0v4-1-4-mc13xxx-core-Prepare-for-separate-spi-and-i2c-backends..patch\0" - "b\0" - "From patchwork Tue Jan 4 05:34:56 2011\n" - "Content-Type: text/plain; charset=\"utf-8\"\n" - "MIME-Version: 1.0\n" - "Content-Transfer-Encoding: 7bit\n" - "Subject: [v4,1/4] mc13xxx-core: Prepare for separate spi and i2c backends.\n" - "Date: Tue, 04 Jan 2011 05:34:56 -0000\n" - "From: Marc Reilly <marc@cpdesign.com.au>\n" - "X-Patchwork-Id: 449541\n" - "Message-Id: <1294119299-18352-2-git-send-email-marc@cpdesign.com.au>\n" - "To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de\n" - "Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org,\n" - " Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "This patch abstracts the bus specific operations from the driver core.\n" - "Read and write handlers are introduced and generic initialization is\n" - "consolidated into mc13xxx_comon_init. The irq member is removed because\n" - "it is unused.\n" - "\n" - "Signed-off-by: Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "---\n" - "drivers/mfd/mc13xxx-core.c | 158 +++++++++++++++++++++++++-----------------\n" - " include/linux/mfd/mc13xxx.h | 5 ++\n" - " 2 files changed, 99 insertions(+), 64 deletions(-)\n" - "\n" - "diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c\n" - "index a2ac2ed..d1f1d7b 100644\n" - "--- a/drivers/mfd/mc13xxx-core.c\n" - "+++ b/drivers/mfd/mc13xxx-core.c\n" - "@@ -19,10 +19,22 @@\n" - " #include <linux/mfd/core.h>\n" - " #include <linux/mfd/mc13xxx.h>\n" - " \n" - "+enum mc13xxx_id {\n" - "+\tMC13XXX_ID_MC13783,\n" - "+\tMC13XXX_ID_MC13892,\n" - "+\tMC13XXX_ID_INVALID,\n" - "+};\n" - "+\n" - " struct mc13xxx {\n" - " \tstruct spi_device *spidev;\n" - "+\n" - "+\tstruct device *dev;\n" - "+\tenum mc13xxx_id ictype;\n" - "+\n" - " \tstruct mutex lock;\n" - "-\tint irq;\n" - "+\n" - "+\tint (*read_dev)(struct mc13xxx *, unsigned int, u32 *);\n" - "+\tint (*write_dev)(struct mc13xxx *, unsigned int, u32);\n" - " \n" - " \tirq_handler_t irqhandler[MC13XXX_NUM_IRQ];\n" - " \tvoid *irqdata[MC13XXX_NUM_IRQ];\n" - "@@ -150,36 +162,32 @@ EXPORT_SYMBOL(mc13783_to_mc13xxx);\n" - " void mc13xxx_lock(struct mc13xxx *mc13xxx)\n" - " {\n" - " \tif (!mutex_trylock(&mc13xxx->lock)) {\n" - "-\t\tdev_dbg(&mc13xxx->spidev->dev, \"wait for %s from %pf\\n\",\n" - "+\t\tdev_dbg(mc13xxx->dev, \"wait for %s from %pf\\n\",\n" - " \t\t\t\t__func__, __builtin_return_address(0));\n" - " \n" - " \t\tmutex_lock(&mc13xxx->lock);\n" - " \t}\n" - "-\tdev_dbg(&mc13xxx->spidev->dev, \"%s from %pf\\n\",\n" - "+\tdev_dbg(mc13xxx->dev, \"%s from %pf\\n\",\n" - " \t\t\t__func__, __builtin_return_address(0));\n" - " }\n" - " EXPORT_SYMBOL(mc13xxx_lock);\n" - " \n" - " void mc13xxx_unlock(struct mc13xxx *mc13xxx)\n" - " {\n" - "-\tdev_dbg(&mc13xxx->spidev->dev, \"%s from %pf\\n\",\n" - "+\tdev_dbg(mc13xxx->dev, \"%s from %pf\\n\",\n" - " \t\t\t__func__, __builtin_return_address(0));\n" - " \tmutex_unlock(&mc13xxx->lock);\n" - " }\n" - " EXPORT_SYMBOL(mc13xxx_unlock);\n" - " \n" - " #define MC13XXX_REGOFFSET_SHIFT 25\n" - "-int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)\n" - "+static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx,\n" - "+\t\t\t\tunsigned int offset, u32 *val)\n" - " {\n" - " \tstruct spi_transfer t;\n" - " \tstruct spi_message m;\n" - " \tint ret;\n" - " \n" - "-\tBUG_ON(!mutex_is_locked(&mc13xxx->lock));\n" - "-\n" - "-\tif (offset > MC13XXX_NUMREGS)\n" - "-\t\treturn -EINVAL;\n" - "-\n" - " \t*val = offset << MC13XXX_REGOFFSET_SHIFT;\n" - " \n" - " \tmemset(&t, 0, sizeof(t));\n" - "@@ -201,26 +209,33 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)\n" - " \n" - " \t*val &= 0xffffff;\n" - " \n" - "-\tdev_vdbg(&mc13xxx->spidev->dev, \"[0x%02x] -> 0x%06x\\n\", offset, *val);\n" - "-\n" - " \treturn 0;\n" - " }\n" - "-EXPORT_SYMBOL(mc13xxx_reg_read);\n" - " \n" - "-int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)\n" - "+int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)\n" - " {\n" - "-\tu32 buf;\n" - "-\tstruct spi_transfer t;\n" - "-\tstruct spi_message m;\n" - " \tint ret;\n" - " \n" - " \tBUG_ON(!mutex_is_locked(&mc13xxx->lock));\n" - " \n" - "-\tdev_vdbg(&mc13xxx->spidev->dev, \"[0x%02x] <- 0x%06x\\n\", offset, val);\n" - "-\n" - "-\tif (offset > MC13XXX_NUMREGS || val > 0xffffff)\n" - "+\tif (offset > MC13XXX_NUMREGS)\n" - " \t\treturn -EINVAL;\n" - " \n" - "+\tret = mc13xxx->read_dev(mc13xxx, offset, val);\n" - "+\tdev_vdbg(mc13xxx->dev, \"[0x%02x] -> 0x%06x\\n\", offset, *val);\n" - "+\n" - "+\treturn ret;\n" - "+}\n" - "+EXPORT_SYMBOL(mc13xxx_reg_read);\n" - "+\n" - "+static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "+\t\tu32 val)\n" - "+{\n" - "+\tu32 buf;\n" - "+\tstruct spi_transfer t;\n" - "+\tstruct spi_message m;\n" - "+\tint ret;\n" - "+\n" - " \tbuf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val;\n" - " \n" - " \tmemset(&t, 0, sizeof(t));\n" - "@@ -241,6 +256,18 @@ int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)\n" - " \n" - " \treturn 0;\n" - " }\n" - "+\n" - "+int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)\n" - "+{\n" - "+\tBUG_ON(!mutex_is_locked(&mc13xxx->lock));\n" - "+\n" - "+\tdev_vdbg(mc13xxx->dev, \"[0x%02x] <- 0x%06x\\n\", offset, val);\n" - "+\n" - "+\tif (offset > MC13XXX_NUMREGS || val > 0xffffff)\n" - "+\t\treturn -EINVAL;\n" - "+\n" - "+\treturn mc13xxx->write_dev(mc13xxx, offset, val);\n" - "+}\n" - " EXPORT_SYMBOL(mc13xxx_reg_write);\n" - " \n" - " int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "@@ -445,7 +472,7 @@ static int mc13xxx_irq_handle(struct mc13xxx *mc13xxx,\n" - " \t\t\tif (handled == IRQ_HANDLED)\n" - " \t\t\t\tnum_handled++;\n" - " \t\t} else {\n" - "-\t\t\tdev_err(&mc13xxx->spidev->dev,\n" - "+\t\t\tdev_err(mc13xxx->dev,\n" - " \t\t\t\t\t\"BUG: irq %u but no handler\\n\",\n" - " \t\t\t\t\tbaseirq + irq);\n" - " \n" - "@@ -481,25 +508,23 @@ static irqreturn_t mc13xxx_irq_thread(int irq, void *data)\n" - " \treturn IRQ_RETVAL(handled);\n" - " }\n" - " \n" - "-enum mc13xxx_id {\n" - "-\tMC13XXX_ID_MC13783,\n" - "-\tMC13XXX_ID_MC13892,\n" - "-\tMC13XXX_ID_INVALID,\n" - "-};\n" - "-\n" - " const char *mc13xxx_chipname[] = {\n" - " \t[MC13XXX_ID_MC13783] = \"mc13783\",\n" - " \t[MC13XXX_ID_MC13892] = \"mc13892\",\n" - " };\n" - " \n" - " #define maskval(reg, mask)\t(((reg) & (mask)) >> __ffs(mask))\n" - "-static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id)\n" - "+static int mc13xxx_identify(struct mc13xxx *mc13xxx)\n" - " {\n" - " \tu32 icid;\n" - " \tu32 revision;\n" - "-\tconst char *name;\n" - " \tint ret;\n" - " \n" - "+\t/*\n" - "+\t * Get the generation ID from register 46, as apparently some older\n" - "+\t * IC revisions only have this info at this location. Newer ICs seem to\n" - "+\t * have both.\n" - "+\t */\n" - " \tret = mc13xxx_reg_read(mc13xxx, 46, &icid);\n" - " \tif (ret)\n" - " \t\treturn ret;\n" - "@@ -508,26 +533,23 @@ static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id)\n" - " \n" - " \tswitch (icid) {\n" - " \tcase 2:\n" - "-\t\t*id = MC13XXX_ID_MC13783;\n" - "-\t\tname = \"mc13783\";\n" - "+\t\tmc13xxx->ictype = MC13XXX_ID_MC13783;\n" - " \t\tbreak;\n" - " \tcase 7:\n" - "-\t\t*id = MC13XXX_ID_MC13892;\n" - "-\t\tname = \"mc13892\";\n" - "+\t\tmc13xxx->ictype = MC13XXX_ID_MC13892;\n" - " \t\tbreak;\n" - " \tdefault:\n" - "-\t\t*id = MC13XXX_ID_INVALID;\n" - "+\t\tmc13xxx->ictype = MC13XXX_ID_INVALID;\n" - " \t\tbreak;\n" - " \t}\n" - " \n" - "-\tif (*id == MC13XXX_ID_MC13783 || *id == MC13XXX_ID_MC13892) {\n" - "+\tif (mc13xxx->ictype == MC13XXX_ID_MC13783 ||\n" - "+\t\t\tmc13xxx->ictype == MC13XXX_ID_MC13892) {\n" - " \t\tret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);\n" - "-\t\tif (ret)\n" - "-\t\t\treturn ret;\n" - " \n" - "-\t\tdev_info(&mc13xxx->spidev->dev, \"%s: rev: %d.%d, \"\n" - "+\t\tdev_info(mc13xxx->dev, \"%s: rev: %d.%d, \"\n" - " \t\t\t\t\"fin: %d, fab: %d, icid: %d/%d\\n\",\n" - "-\t\t\t\tmc13xxx_chipname[*id],\n" - "+\t\t\t\tmc13xxx_chipname[mc13xxx->ictype],\n" - " \t\t\t\tmaskval(revision, MC13XXX_REVISION_REVFULL),\n" - " \t\t\t\tmaskval(revision, MC13XXX_REVISION_REVMETAL),\n" - " \t\t\t\tmaskval(revision, MC13XXX_REVISION_FIN),\n" - "@@ -536,26 +558,12 @@ static int mc13xxx_identify(struct mc13xxx *mc13xxx, enum mc13xxx_id *id)\n" - " \t\t\t\tmaskval(revision, MC13XXX_REVISION_ICIDCODE));\n" - " \t}\n" - " \n" - "-\tif (*id != MC13XXX_ID_INVALID) {\n" - "-\t\tconst struct spi_device_id *devid =\n" - "-\t\t\tspi_get_device_id(mc13xxx->spidev);\n" - "-\t\tif (!devid || devid->driver_data != *id)\n" - "-\t\t\tdev_warn(&mc13xxx->spidev->dev, \"device id doesn't \"\n" - "-\t\t\t\t\t\"match auto detection!\\n\");\n" - "-\t}\n" - "-\n" - "-\treturn 0;\n" - "+\treturn (mc13xxx->ictype == MC13XXX_ID_INVALID) ? -ENODEV : 0;\n" - " }\n" - " \n" - " static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx)\n" - " {\n" - "-\tconst struct spi_device_id *devid =\n" - "-\t\tspi_get_device_id(mc13xxx->spidev);\n" - "-\n" - "-\tif (!devid)\n" - "-\t\treturn NULL;\n" - "-\n" - "-\treturn mc13xxx_chipname[devid->driver_data];\n" - "+\treturn mc13xxx_chipname[mc13xxx->ictype];\n" - " }\n" - " \n" - " #include <linux/mfd/mc13783.h>\n" - "@@ -563,7 +571,7 @@ static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx)\n" - " int mc13xxx_get_flags(struct mc13xxx *mc13xxx)\n" - " {\n" - " \tstruct mc13xxx_platform_data *pdata =\n" - "-\t\tdev_get_platdata(&mc13xxx->spidev->dev);\n" - "+\t\tdev_get_platdata(mc13xxx->dev);\n" - " \n" - " \treturn pdata->flags;\n" - " }\n" - "@@ -601,7 +609,7 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,\n" - " \t};\n" - " \tinit_completion(&adcdone_data.done);\n" - " \n" - "-\tdev_dbg(&mc13xxx->spidev->dev, \"%s\\n\", __func__);\n" - "+\tdev_dbg(mc13xxx->dev, \"%s\\n\", __func__);\n" - " \n" - " \tmc13xxx_lock(mc13xxx);\n" - " \n" - "@@ -643,7 +651,7 @@ int mc13783_adc_do_conversion(struct mc13783 *mc13783, unsigned int mode,\n" - " \t\treturn -EINVAL;\n" - " \t}\n" - " \n" - "-\tdev_dbg(&mc13783->mc13xxx.spidev->dev, \"%s: request irq\\n\", __func__);\n" - "+\tdev_dbg(mc13783->mc13xxx.dev, \"%s: request irq\\n\", __func__);\n" - " \tmc13xxx_irq_request(mc13xxx, MC13783_IRQ_ADCDONE,\n" - " \t\t\tmc13783_handler_adcdone, __func__, &adcdone_data);\n" - " \tmc13xxx_irq_ack(mc13xxx, MC13783_IRQ_ADCDONE);\n" - "@@ -701,7 +709,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,\n" - " \tif (!cell.name)\n" - " \t\treturn -ENOMEM;\n" - " \n" - "-\treturn mfd_add_devices(&mc13xxx->spidev->dev, -1, &cell, 1, NULL, 0);\n" - "+\treturn mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0);\n" - " }\n" - " \n" - " static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)\n" - "@@ -713,7 +721,6 @@ static int mc13xxx_probe(struct spi_device *spi)\n" - " {\n" - " \tstruct mc13xxx *mc13xxx;\n" - " \tstruct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev);\n" - "-\tenum mc13xxx_id id;\n" - " \tint ret;\n" - " \n" - " \tmc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL);\n" - "@@ -725,13 +732,36 @@ static int mc13xxx_probe(struct spi_device *spi)\n" - " \tspi->bits_per_word = 32;\n" - " \tspi_setup(spi);\n" - " \n" - "+\tmc13xxx->dev = &spi->dev;\n" - " \tmc13xxx->spidev = spi;\n" - "+\tmc13xxx->read_dev = mc13xxx_spi_reg_read;\n" - "+\tmc13xxx->write_dev = mc13xxx_spi_reg_write;\n" - "+\n" - "+\tret = mc13xxx_common_init(mc13xxx, pdata, spi->irq);\n" - "+\n" - "+\tif (ret) {\n" - "+\t\tdev_set_drvdata(&spi->dev, NULL);\n" - "+\t} else {\n" - "+\t\tconst struct spi_device_id *devid =\n" - "+\t\t\tspi_get_device_id(mc13xxx->spidev);\n" - "+\t\tif (!devid || devid->driver_data != mc13xxx->ictype)\n" - "+\t\t\tdev_warn(mc13xxx->dev,\n" - "+\t\t\t\t\"device id doesn't match auto detection!\\n\");\n" - "+\t}\n" - "+\n" - "+\treturn ret;\n" - "+}\n" - "+\n" - "+int mc13xxx_common_init(struct mc13xxx *mc13xxx,\n" - "+\t\tstruct mc13xxx_platform_data *pdata, int irq)\n" - "+{\n" - "+\tint ret;\n" - " \n" - " \tmutex_init(&mc13xxx->lock);\n" - " \tmc13xxx_lock(mc13xxx);\n" - " \n" - "-\tret = mc13xxx_identify(mc13xxx, &id);\n" - "-\tif (ret || id == MC13XXX_ID_INVALID)\n" - "+\tret = mc13xxx_identify(mc13xxx);\n" - "+\tif (ret)\n" - " \t\tgoto err_revision;\n" - " \n" - " \t/* mask all irqs */\n" - "@@ -743,14 +773,13 @@ static int mc13xxx_probe(struct spi_device *spi)\n" - " \tif (ret)\n" - " \t\tgoto err_mask;\n" - " \n" - "-\tret = request_threaded_irq(spi->irq, NULL, mc13xxx_irq_thread,\n" - "+\tret = request_threaded_irq(irq, NULL, mc13xxx_irq_thread,\n" - " \t\t\tIRQF_ONESHOT | IRQF_TRIGGER_HIGH, \"mc13xxx\", mc13xxx);\n" - " \n" - " \tif (ret) {\n" - " err_mask:\n" - " err_revision:\n" - " \t\tmutex_unlock(&mc13xxx->lock);\n" - "-\t\tdev_set_drvdata(&spi->dev, NULL);\n" - " \t\tkfree(mc13xxx);\n" - " \t\treturn ret;\n" - " \t}\n" - "@@ -786,6 +815,7 @@ err_revision:\n" - " \n" - " \treturn 0;\n" - " }\n" - "+EXPORT_SYMBOL_GPL(mc13xxx_common_init);\n" - " \n" - " static int __devexit mc13xxx_remove(struct spi_device *spi)\n" - " {\n" - "diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h\n" - "index a1d391b..f5d277d 100644\n" - "--- a/include/linux/mfd/mc13xxx.h\n" - "+++ b/include/linux/mfd/mc13xxx.h\n" - "@@ -21,6 +21,11 @@ int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val);\n" - " int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,\n" - " \t\tu32 mask, u32 val);\n" - " \n" - "+struct mc13xxx_platform_data;\n" - "+\n" - "+int mc13xxx_common_init(struct mc13xxx *mc13xxx,\n" - "+\t\tstruct mc13xxx_platform_data *pdata, int irq);\n" - "+\n" - " int mc13xxx_get_flags(struct mc13xxx *mc13xxx);\n" - " \n" - int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq, - "\01:3\0" - "fn\0v4-2-4-mc13xxx-core-Kconfig-Config-menu-driven-by-specific-IC-type.patch\0" - "b\0" - "From patchwork Tue Jan 4 05:34:57 2011\n" - "Content-Type: text/plain; charset=\"utf-8\"\n" - "MIME-Version: 1.0\n" - "Content-Transfer-Encoding: 7bit\n" - "Subject: [v4,\n" - " 2/4] mc13xxx-core: Kconfig: Config menu driven by specific IC type\n" - "Date: Tue, 04 Jan 2011 05:34:57 -0000\n" - "From: Marc Reilly <marc@cpdesign.com.au>\n" - "X-Patchwork-Id: 449531\n" - "Message-Id: <1294119299-18352-3-git-send-email-marc@cpdesign.com.au>\n" - "To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de\n" - "Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org,\n" - " Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "This patch makes config items for the mc13892 and mc13783 distinct and\n" - "splits introduces a separate config item for spi interface support in\n" - "preparation for a separate i2c and spi backend.\n" - "\n" - "The mc13xxx generic core is therefore selected by the spi (or i2c) item:\n" - "having it the other way around doesn't work for other drivers that will\n" - "need to distinguish between mc13783 and mc13892 (at build time).\n" - "\n" - "Signed-off-by: Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "---\n" - "drivers/mfd/Kconfig | 34 +++++++++++++++++++++++++---------\n" - " 1 files changed, 25 insertions(+), 9 deletions(-)\n" - "\n" - "diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig\n" - "index 3a1493b..9ce1d42 100644\n" - "--- a/drivers/mfd/Kconfig\n" - "+++ b/drivers/mfd/Kconfig\n" - "@@ -425,20 +425,36 @@ config MFD_PCF50633\n" - " \t so that function-specific drivers can bind to them.\n" - " \n" - " config MFD_MC13783\n" - "-\ttristate\n" - "-\n" - "-config MFD_MC13XXX\n" - "-\ttristate \"Support Freescale MC13783 and MC13892\"\n" - " \tdepends on SPI_MASTER\n" - "-\tselect MFD_CORE\n" - "-\tselect MFD_MC13783\n" - "+\tselect MFD_MC13XXX_SPI\n" - "+\ttristate \"Support for Freescale MC13783 PMIC\"\n" - " \thelp\n" - "-\t Support for the Freescale (Atlas) PMIC and audio CODECs\n" - "-\t MC13783 and MC13892.\n" - "-\t This driver provides common support for accessing the device,\n" - "+\t Support for the Freescale MC13783 PMIC and audio CODEC.\n" - "+\t This driver provides common support for accessing the device,\n" - " \t additional drivers must be enabled in order to use the\n" - " \t functionality of the device.\n" - " \n" - "+config MFD_MC13892\n" - "+\tdepends on SPI_MASTER || I2C\n" - "+\tselect MFD_MC13XXX\n" - "+\ttristate \"Support for Freescale MC13892 PMIC\"\n" - "+\thelp\n" - "+\t Enable support for the Freescale MC13892 PMIC.\n" - "+\t As the MC13892 can connect by either I2C or SPI bus, you will\n" - "+\t also need to select which of these you would like to support.\n" - "+\t Additional drivers must be enabled in order to use the\n" - "+\t functionality of the device.\n" - "+\n" - "+config MFD_MC13XXX\n" - "+\ttristate\n" - "+\tdepends on SPI_MASTER || I2C\n" - "+\tselect MFD_CORE\n" - "+\n" - "+config MFD_MC13XXX_SPI\n" - "+\ttristate \"Support Freescale MC13783 and MC13892 via SPI interface\"\n" - "+\tselect MFD_MC13XXX\n" - "+\tdepends on SPI_MASTER && (MFD_MC13783 || MFD_MC13892)\n" - "+\n" - " config PCF50633_ADC\n" - " \ttristate \"Support for NXP PCF50633 ADC\"\n" - " \tdepends on MFD_PCF50633" - "\01:4\0" - "fn\0v4-3-4-mc13xxx-core-Move-spi-specific-code-into-separate-module..patch\0" - "b\0" - "From patchwork Tue Jan 4 05:34:58 2011\n" - "Content-Type: text/plain; charset=\"utf-8\"\n" - "MIME-Version: 1.0\n" - "Content-Transfer-Encoding: 7bit\n" - "Subject: [v4,3/4] mc13xxx-core: Move spi specific code into separate module.\n" - "Date: Tue, 04 Jan 2011 05:34:58 -0000\n" - "From: Marc Reilly <marc@cpdesign.com.au>\n" - "X-Patchwork-Id: 449561\n" - "Message-Id: <1294119299-18352-4-git-send-email-marc@cpdesign.com.au>\n" - "To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de\n" - "Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org,\n" - " Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "This patch moves all spi specific code into a new module. The mc13xxx\n" - "struct moves to the include file by necessity.\n" - "\n" - "Signed-off-by: Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "---\n" - "drivers/mfd/Makefile | 1 +\n" - " drivers/mfd/mc13xxx-core.c | 166 ------------------------------------------\n" - " drivers/mfd/mc13xxx-spi.c | 168 +++++++++++++++++++++++++++++++++++++++++++\n" - " include/linux/mfd/mc13xxx.h | 21 ++++++\n" - " 4 files changed, 190 insertions(+), 166 deletions(-)\n" - " create mode 100644 drivers/mfd/mc13xxx-spi.c\n" - "\n" - "diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile\n" - "index f54b365..492e881 100644\n" - "--- a/drivers/mfd/Makefile\n" - "+++ b/drivers/mfd/Makefile\n" - "@@ -42,6 +42,7 @@ obj-$(CONFIG_TWL4030_CODEC)\t+= twl4030-codec.o\n" - " obj-$(CONFIG_TWL6030_PWM)\t+= twl6030-pwm.o\n" - " \n" - " obj-$(CONFIG_MFD_MC13XXX)\t+= mc13xxx-core.o\n" - "+obj-$(CONFIG_MFD_MC13XXX_SPI)\t+= mc13xxx-spi.o\n" - " \n" - " obj-$(CONFIG_MFD_CORE)\t\t+= mfd-core.o\n" - " \n" - "diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c\n" - "index d1f1d7b..3201041 100644\n" - "--- a/drivers/mfd/mc13xxx-core.c\n" - "+++ b/drivers/mfd/mc13xxx-core.c\n" - "@@ -15,31 +15,9 @@\n" - " #include <linux/platform_device.h>\n" - " #include <linux/mutex.h>\n" - " #include <linux/interrupt.h>\n" - "-#include <linux/spi/spi.h>\n" - " #include <linux/mfd/core.h>\n" - " #include <linux/mfd/mc13xxx.h>\n" - " \n" - "-enum mc13xxx_id {\n" - "-\tMC13XXX_ID_MC13783,\n" - "-\tMC13XXX_ID_MC13892,\n" - "-\tMC13XXX_ID_INVALID,\n" - "-};\n" - "-\n" - "-struct mc13xxx {\n" - "-\tstruct spi_device *spidev;\n" - "-\n" - "-\tstruct device *dev;\n" - "-\tenum mc13xxx_id ictype;\n" - "-\n" - "-\tstruct mutex lock;\n" - "-\n" - "-\tint (*read_dev)(struct mc13xxx *, unsigned int, u32 *);\n" - "-\tint (*write_dev)(struct mc13xxx *, unsigned int, u32);\n" - "-\n" - "-\tirq_handler_t irqhandler[MC13XXX_NUM_IRQ];\n" - "-\tvoid *irqdata[MC13XXX_NUM_IRQ];\n" - "-};\n" - "-\n" - " struct mc13783 {\n" - " \tstruct mc13xxx mc13xxx;\n" - " \n" - "@@ -180,38 +158,6 @@ void mc13xxx_unlock(struct mc13xxx *mc13xxx)\n" - " }\n" - " EXPORT_SYMBOL(mc13xxx_unlock);\n" - " \n" - "-#define MC13XXX_REGOFFSET_SHIFT 25\n" - "-static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx,\n" - "-\t\t\t\tunsigned int offset, u32 *val)\n" - "-{\n" - "-\tstruct spi_transfer t;\n" - "-\tstruct spi_message m;\n" - "-\tint ret;\n" - "-\n" - "-\t*val = offset << MC13XXX_REGOFFSET_SHIFT;\n" - "-\n" - "-\tmemset(&t, 0, sizeof(t));\n" - "-\n" - "-\tt.tx_buf = val;\n" - "-\tt.rx_buf = val;\n" - "-\tt.len = sizeof(u32);\n" - "-\n" - "-\tspi_message_init(&m);\n" - "-\tspi_message_add_tail(&t, &m);\n" - "-\n" - "-\tret = spi_sync(mc13xxx->spidev, &m);\n" - "-\n" - "-\t/* error in message.status implies error return from spi_sync */\n" - "-\tBUG_ON(!ret && m.status);\n" - "-\n" - "-\tif (ret)\n" - "-\t\treturn ret;\n" - "-\n" - "-\t*val &= 0xffffff;\n" - "-\n" - "-\treturn 0;\n" - "-}\n" - "-\n" - " int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)\n" - " {\n" - " \tint ret;\n" - "@@ -228,35 +174,6 @@ int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)\n" - " }\n" - " EXPORT_SYMBOL(mc13xxx_reg_read);\n" - " \n" - "-static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "-\t\tu32 val)\n" - "-{\n" - "-\tu32 buf;\n" - "-\tstruct spi_transfer t;\n" - "-\tstruct spi_message m;\n" - "-\tint ret;\n" - "-\n" - "-\tbuf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val;\n" - "-\n" - "-\tmemset(&t, 0, sizeof(t));\n" - "-\n" - "-\tt.tx_buf = &buf;\n" - "-\tt.rx_buf = &buf;\n" - "-\tt.len = sizeof(u32);\n" - "-\n" - "-\tspi_message_init(&m);\n" - "-\tspi_message_add_tail(&t, &m);\n" - "-\n" - "-\tret = spi_sync(mc13xxx->spidev, &m);\n" - "-\n" - "-\tBUG_ON(!ret && m.status);\n" - "-\n" - "-\tif (ret)\n" - "-\t\treturn ret;\n" - "-\n" - "-\treturn 0;\n" - "-}\n" - "-\n" - " int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)\n" - " {\n" - " \tBUG_ON(!mutex_is_locked(&mc13xxx->lock));\n" - "@@ -717,41 +634,6 @@ static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)\n" - " \treturn mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0);\n" - " }\n" - " \n" - "-static int mc13xxx_probe(struct spi_device *spi)\n" - "-{\n" - "-\tstruct mc13xxx *mc13xxx;\n" - "-\tstruct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev);\n" - "-\tint ret;\n" - "-\n" - "-\tmc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL);\n" - "-\tif (!mc13xxx)\n" - "-\t\treturn -ENOMEM;\n" - "-\n" - "-\tdev_set_drvdata(&spi->dev, mc13xxx);\n" - "-\tspi->mode = SPI_MODE_0 | SPI_CS_HIGH;\n" - "-\tspi->bits_per_word = 32;\n" - "-\tspi_setup(spi);\n" - "-\n" - "-\tmc13xxx->dev = &spi->dev;\n" - "-\tmc13xxx->spidev = spi;\n" - "-\tmc13xxx->read_dev = mc13xxx_spi_reg_read;\n" - "-\tmc13xxx->write_dev = mc13xxx_spi_reg_write;\n" - "-\n" - "-\tret = mc13xxx_common_init(mc13xxx, pdata, spi->irq);\n" - "-\n" - "-\tif (ret) {\n" - "-\t\tdev_set_drvdata(&spi->dev, NULL);\n" - "-\t} else {\n" - "-\t\tconst struct spi_device_id *devid =\n" - "-\t\t\tspi_get_device_id(mc13xxx->spidev);\n" - "-\t\tif (!devid || devid->driver_data != mc13xxx->ictype)\n" - "-\t\t\tdev_warn(mc13xxx->dev,\n" - "-\t\t\t\t\"device id doesn't match auto detection!\\n\");\n" - "-\t}\n" - "-\n" - "-\treturn ret;\n" - "-}\n" - "-\n" - " int mc13xxx_common_init(struct mc13xxx *mc13xxx,\n" - " \t\tstruct mc13xxx_platform_data *pdata, int irq)\n" - " {\n" - "@@ -817,54 +699,6 @@ err_revision:\n" - " }\n" - " EXPORT_SYMBOL_GPL(mc13xxx_common_init);\n" - " \n" - "-static int __devexit mc13xxx_remove(struct spi_device *spi)\n" - "-{\n" - "-\tstruct mc13xxx *mc13xxx = dev_get_drvdata(&spi->dev);\n" - "-\n" - "-\tfree_irq(mc13xxx->spidev->irq, mc13xxx);\n" - "-\n" - "-\tmfd_remove_devices(&spi->dev);\n" - "-\n" - "-\tkfree(mc13xxx);\n" - "-\n" - "-\treturn 0;\n" - "-}\n" - "-\n" - "-static const struct spi_device_id mc13xxx_device_id[] = {\n" - "-\t{\n" - "-\t\t.name = \"mc13783\",\n" - "-\t\t.driver_data = MC13XXX_ID_MC13783,\n" - "-\t}, {\n" - "-\t\t.name = \"mc13892\",\n" - "-\t\t.driver_data = MC13XXX_ID_MC13892,\n" - "-\t}, {\n" - "-\t\t/* sentinel */\n" - "-\t}\n" - "-};\n" - "-\n" - "-static struct spi_driver mc13xxx_driver = {\n" - "-\t.id_table = mc13xxx_device_id,\n" - "-\t.driver = {\n" - "-\t\t.name = \"mc13xxx\",\n" - "-\t\t.bus = &spi_bus_type,\n" - "-\t\t.owner = THIS_MODULE,\n" - "-\t},\n" - "-\t.probe = mc13xxx_probe,\n" - "-\t.remove = __devexit_p(mc13xxx_remove),\n" - "-};\n" - "-\n" - "-static int __init mc13xxx_init(void)\n" - "-{\n" - "-\treturn spi_register_driver(&mc13xxx_driver);\n" - "-}\n" - "-subsys_initcall(mc13xxx_init);\n" - "-\n" - "-static void __exit mc13xxx_exit(void)\n" - "-{\n" - "-\tspi_unregister_driver(&mc13xxx_driver);\n" - "-}\n" - "-module_exit(mc13xxx_exit);\n" - "-\n" - " MODULE_DESCRIPTION(\"Core driver for Freescale MC13XXX PMIC\");\n" - " MODULE_AUTHOR(\"Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>\");\n" - " MODULE_LICENSE(\"GPL v2\");\n" - "diff --git a/drivers/mfd/mc13xxx-spi.c b/drivers/mfd/mc13xxx-spi.c\n" - "new file mode 100644\n" - "index 0000000..d8ffff7\n" - "--- /dev/null\n" - "+++ b/drivers/mfd/mc13xxx-spi.c\n" - "@@ -0,0 +1,168 @@\n" - "+/*\n" - "+ * Copyright 2009-2010 Pengutronix\n" - "+ * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>\n" - "+ *\n" - "+ * loosely based on an earlier driver that has\n" - "+ * Copyright 2009 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>\n" - "+ *\n" - "+ * This program is free software; you can redistribute it and/or modify it under\n" - "+ * the terms of the GNU General Public License version 2 as published by the\n" - "+ * Free Software Foundation.\n" - "+ */\n" - "+\n" - "+#include <linux/slab.h>\n" - "+#include <linux/module.h>\n" - "+#include <linux/platform_device.h>\n" - "+#include <linux/mutex.h>\n" - "+#include <linux/interrupt.h>\n" - "+#include <linux/spi/spi.h>\n" - "+#include <linux/mfd/core.h>\n" - "+#include <linux/mfd/mc13xxx.h>\n" - "+\n" - "+#define MC13XXX_REGOFFSET_SHIFT 25\n" - "+static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx,\n" - "+\t\t\t\tunsigned int offset, u32 *val)\n" - "+{\n" - "+\tstruct spi_transfer t;\n" - "+\tstruct spi_message m;\n" - "+\tint ret;\n" - "+\n" - "+\t*val = offset << MC13XXX_REGOFFSET_SHIFT;\n" - "+\n" - "+\tmemset(&t, 0, sizeof(t));\n" - "+\n" - "+\tt.tx_buf = val;\n" - "+\tt.rx_buf = val;\n" - "+\tt.len = sizeof(u32);\n" - "+\n" - "+\tspi_message_init(&m);\n" - "+\tspi_message_add_tail(&t, &m);\n" - "+\n" - "+\tret = spi_sync(mc13xxx->spidev, &m);\n" - "+\n" - "+\t/* error in message.status implies error return from spi_sync */\n" - "+\tBUG_ON(!ret && m.status);\n" - "+\n" - "+\tif (ret)\n" - "+\t\treturn ret;\n" - "+\n" - "+\t*val &= 0xffffff;\n" - "+\n" - "+\treturn 0;\n" - "+}\n" - "+\n" - "+static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "+\t\tu32 val)\n" - "+{\n" - "+\tu32 buf;\n" - "+\tstruct spi_transfer t;\n" - "+\tstruct spi_message m;\n" - "+\tint ret;\n" - "+\n" - "+\tbuf = 1 << 31 | offset << MC13XXX_REGOFFSET_SHIFT | val;\n" - "+\n" - "+\tmemset(&t, 0, sizeof(t));\n" - "+\n" - "+\tt.tx_buf = &buf;\n" - "+\tt.rx_buf = &buf;\n" - "+\tt.len = sizeof(u32);\n" - "+\n" - "+\tspi_message_init(&m);\n" - "+\tspi_message_add_tail(&t, &m);\n" - "+\n" - "+\tret = spi_sync(mc13xxx->spidev, &m);\n" - "+\n" - "+\tBUG_ON(!ret && m.status);\n" - "+\n" - "+\tif (ret)\n" - "+\t\treturn ret;\n" - "+\n" - "+\treturn 0;\n" - "+}\n" - "+\n" - "+static int mc13xxx_spi_probe(struct spi_device *spi)\n" - "+{\n" - "+\tstruct mc13xxx *mc13xxx;\n" - "+\tstruct mc13xxx_platform_data *pdata = dev_get_platdata(&spi->dev);\n" - "+\tint ret;\n" - "+\n" - "+\tmc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL);\n" - "+\tif (!mc13xxx)\n" - "+\t\treturn -ENOMEM;\n" - "+\n" - "+\tdev_set_drvdata(&spi->dev, mc13xxx);\n" - "+\tspi->mode = SPI_MODE_0 | SPI_CS_HIGH;\n" - "+\tspi->bits_per_word = 32;\n" - "+\tspi_setup(spi);\n" - "+\n" - "+\tmc13xxx->dev = &spi->dev;\n" - "+\tmc13xxx->spidev = spi;\n" - "+\tmc13xxx->read_dev = mc13xxx_spi_reg_read;\n" - "+\tmc13xxx->write_dev = mc13xxx_spi_reg_write;\n" - "+\n" - "+\tret = mc13xxx_common_init(mc13xxx, pdata, spi->irq);\n" - "+\n" - "+\tif (ret) {\n" - "+\t\tdev_set_drvdata(&spi->dev, NULL);\n" - "+\t} else {\n" - "+\t\tconst struct spi_device_id *devid =\n" - "+\t\t\tspi_get_device_id(mc13xxx->spidev);\n" - "+\t\tif (!devid || devid->driver_data != mc13xxx->ictype)\n" - "+\t\t\tdev_warn(mc13xxx->dev,\n" - "+\t\t\t\t\"device id doesn't match auto detection!\\n\");\n" - "+\t}\n" - "+\n" - "+\treturn ret;\n" - "+}\n" - "+\n" - "+static int __devexit mc13xxx_spi_remove(struct spi_device *spi)\n" - "+{\n" - "+\tstruct mc13xxx *mc13xxx = dev_get_drvdata(&spi->dev);\n" - "+\n" - "+\tfree_irq(mc13xxx->spidev->irq, mc13xxx);\n" - "+\n" - "+\tmfd_remove_devices(&spi->dev);\n" - "+\n" - "+\tkfree(mc13xxx);\n" - "+\n" - "+\treturn 0;\n" - "+}\n" - "+\n" - "+static const struct spi_device_id mc13xxx_device_id[] = {\n" - "+\t{\n" - "+\t\t.name = \"mc13783\",\n" - "+\t\t.driver_data = MC13XXX_ID_MC13783,\n" - "+\t}, {\n" - "+\t\t.name = \"mc13892\",\n" - "+\t\t.driver_data = MC13XXX_ID_MC13892,\n" - "+\t}, {\n" - "+\t\t/* sentinel */\n" - "+\t}\n" - "+};\n" - "+\n" - "+static struct spi_driver mc13xxx_spi_driver = {\n" - "+\t.id_table = mc13xxx_device_id,\n" - "+\t.driver = {\n" - "+\t\t.name = \"mc13xxx\",\n" - "+\t\t.bus = &spi_bus_type,\n" - "+\t\t.owner = THIS_MODULE,\n" - "+\t},\n" - "+\t.probe = mc13xxx_spi_probe,\n" - "+\t.remove = __devexit_p(mc13xxx_spi_remove),\n" - "+};\n" - "+\n" - "+static int __init mc13xxx_spi_init(void)\n" - "+{\n" - "+\treturn spi_register_driver(&mc13xxx_spi_driver);\n" - "+}\n" - "+subsys_initcall(mc13xxx_spi_init);\n" - "+\n" - "+static void __exit mc13xxx_spi_exit(void)\n" - "+{\n" - "+\tspi_unregister_driver(&mc13xxx_spi_driver);\n" - "+}\n" - "+module_exit(mc13xxx_spi_exit);\n" - "+\n" - "+MODULE_DESCRIPTION(\"Core driver for Freescale MC13XXX PMIC\");\n" - "+MODULE_AUTHOR(\"Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>\");\n" - "+MODULE_LICENSE(\"GPL v2\");\n" - "diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h\n" - "index f5d277d..ab7deb3 100644\n" - "--- a/include/linux/mfd/mc13xxx.h\n" - "+++ b/include/linux/mfd/mc13xxx.h\n" - "@@ -66,6 +66,27 @@ int mc13xxx_get_flags(struct mc13xxx *mc13xxx);\n" - " \n" - " #define MC13XXX_NUM_IRQ\t\t46\n" - " \n" - "+enum mc13xxx_id {\n" - "+\tMC13XXX_ID_MC13783,\n" - "+\tMC13XXX_ID_MC13892,\n" - "+\tMC13XXX_ID_INVALID,\n" - "+};\n" - "+\n" - "+struct mc13xxx {\n" - "+\tstruct spi_device *spidev;\n" - "+\n" - "+\tstruct device *dev;\n" - "+\tenum mc13xxx_id ictype;\n" - "+\n" - "+\tstruct mutex lock;\n" - "+\n" - "+\tint (*read_dev)(struct mc13xxx *, unsigned int, u32 *);\n" - "+\tint (*write_dev)(struct mc13xxx *, unsigned int, u32);\n" - "+\n" - "+\tirq_handler_t irqhandler[MC13XXX_NUM_IRQ];\n" - "+\tvoid *irqdata[MC13XXX_NUM_IRQ];\n" - "+};\n" - "+\n" - " struct regulator_init_data;\n" - " \n" - struct mc13xxx_regulator_init_data { - "\01:5\0" - "fn\0v4-4-4-mc13xxx-core-Add-i2c-driver.patch\0" - "b\0" - "From patchwork Tue Jan 4 05:34:59 2011\n" - "Content-Type: text/plain; charset=\"utf-8\"\n" - "MIME-Version: 1.0\n" - "Content-Transfer-Encoding: 7bit\n" - "Subject: [v4,4/4] mc13xxx-core: Add i2c driver\n" - "Date: Tue, 04 Jan 2011 05:34:59 -0000\n" - "From: Marc Reilly <marc@cpdesign.com.au>\n" - "X-Patchwork-Id: 449551\n" - "Message-Id: <1294119299-18352-5-git-send-email-marc@cpdesign.com.au>\n" - "To: linux-arm-kernel@lists.infradead.org, u.kleine-koenig@pengutronix.de\n" - "Cc: spi-devel-general@lists.sourceforge.net, linux-i2c@vger.kernel.org,\n" - " Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "Signed-off-by: Marc Reilly <marc@cpdesign.com.au>\n" - "\n" - "---\n" - "drivers/mfd/Kconfig | 5 ++\n" - " drivers/mfd/Makefile | 1 +\n" - " drivers/mfd/mc13xxx-i2c.c | 115 +++++++++++++++++++++++++++++++++++++++++++\n" - " include/linux/mfd/mc13xxx.h | 5 ++-\n" - " 4 files changed, 125 insertions(+), 1 deletions(-)\n" - " create mode 100644 drivers/mfd/mc13xxx-i2c.c\n" - "\n" - "diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig\n" - "index 9ce1d42..fbbbdaa 100644\n" - "--- a/drivers/mfd/Kconfig\n" - "+++ b/drivers/mfd/Kconfig\n" - "@@ -455,6 +455,11 @@ config MFD_MC13XXX_SPI\n" - " \tselect MFD_MC13XXX\n" - " \tdepends on SPI_MASTER && (MFD_MC13783 || MFD_MC13892)\n" - " \n" - "+config MFD_MC13XXX_I2C\n" - "+\ttristate \"Support Freescale MC13892 via I2C interface\"\n" - "+\tselect MFD_MC13XXX\n" - "+\tdepends on I2C && MFD_MC13892\n" - "+\n" - " config PCF50633_ADC\n" - " \ttristate \"Support for NXP PCF50633 ADC\"\n" - " \tdepends on MFD_PCF50633\n" - "diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile\n" - "index 492e881..b7d774f 100644\n" - "--- a/drivers/mfd/Makefile\n" - "+++ b/drivers/mfd/Makefile\n" - "@@ -43,6 +43,7 @@ obj-$(CONFIG_TWL6030_PWM)\t+= twl6030-pwm.o\n" - " \n" - " obj-$(CONFIG_MFD_MC13XXX)\t+= mc13xxx-core.o\n" - " obj-$(CONFIG_MFD_MC13XXX_SPI)\t+= mc13xxx-spi.o\n" - "+obj-$(CONFIG_MFD_MC13XXX_I2C)\t+= mc13xxx-i2c.o\n" - " \n" - " obj-$(CONFIG_MFD_CORE)\t\t+= mfd-core.o\n" - " \n" - "diff --git a/drivers/mfd/mc13xxx-i2c.c b/drivers/mfd/mc13xxx-i2c.c\n" - "new file mode 100644\n" - "index 0000000..b3f2f2b\n" - "--- /dev/null\n" - "+++ b/drivers/mfd/mc13xxx-i2c.c\n" - "@@ -0,0 +1,115 @@\n" - "+/*\n" - "+ * Copyright 2009-2010 Creative Product Design\n" - "+ * Marc Reilly marc@cpdesign.com.au\n" - "+ *\n" - "+ * This program is free software; you can redistribute it and/or modify it under\n" - "+ * the terms of the GNU General Public License version 2 as published by the\n" - "+ * Free Software Foundation.\n" - "+ */\n" - "+\n" - "+#include <linux/slab.h>\n" - "+#include <linux/module.h>\n" - "+#include <linux/platform_device.h>\n" - "+#include <linux/mutex.h>\n" - "+#include <linux/mfd/core.h>\n" - "+#include <linux/mfd/mc13xxx.h>\n" - "+#include <linux/i2c.h>\n" - "+\n" - "+static int mc13xxx_i2c_reg_read(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "+\t\tu32 *val)\n" - "+{\n" - "+\tint ret;\n" - "+\tunsigned char buf[3] = {0, 0, 0};\n" - "+\n" - "+\tret = i2c_smbus_read_i2c_block_data(mc13xxx->i2cclient,\n" - "+\t\t\toffset, 3, buf);\n" - "+\t*val = buf[0] << 16 | buf[1] << 8 | buf[2];\n" - "+\n" - "+\treturn ret == 3 ? 0 : ret;\n" - "+}\n" - "+\n" - "+static int mc13xxx_i2c_reg_write(struct mc13xxx *mc13xxx, unsigned int offset,\n" - "+\t\tu32 val)\n" - "+{\n" - "+\tint ret;\n" - "+\tunsigned char buf[3];\n" - "+\n" - "+\tbuf[0] = (val >> 16) & 0xff;\n" - "+\tbuf[1] = (val >> 8) & 0xff;\n" - "+\tbuf[2] = val & 0xff;\n" - "+\n" - "+\tret = i2c_smbus_write_i2c_block_data(mc13xxx->i2cclient,\n" - "+\t\t\toffset, 3, buf);\n" - "+\n" - "+\treturn ret;\n" - "+}\n" - "+\n" - "+static int mc13xxx_i2c_probe(struct i2c_client *client,\n" - "+\t\tconst struct i2c_device_id *id)\n" - "+{\n" - "+\tstruct mc13xxx *mc13xxx;\n" - "+\tstruct mc13xxx_platform_data *pdata = dev_get_platdata(&client->dev);\n" - "+\tint ret;\n" - "+\n" - "+\tmc13xxx = kzalloc(sizeof(*mc13xxx), GFP_KERNEL);\n" - "+\tif (!mc13xxx)\n" - "+\t\treturn -ENOMEM;\n" - "+\n" - "+\tdev_set_drvdata(&client->dev, mc13xxx);\n" - "+\tmc13xxx->dev = &client->dev;\n" - "+\tmc13xxx->i2cclient = client;\n" - "+\tmc13xxx->read_dev = mc13xxx_i2c_reg_read;\n" - "+\tmc13xxx->write_dev = mc13xxx_i2c_reg_write;\n" - "+\n" - "+\tret = mc13xxx_common_init(mc13xxx, pdata, client->irq);\n" - "+\n" - "+\tif (ret == 0 && (id->driver_data != mc13xxx->ictype))\n" - "+\t\tdev_warn(mc13xxx->dev,\n" - "+\t\t\t\t\"device id doesn't match auto detection!\\n\");\n" - "+\n" - "+\treturn ret;\n" - "+}\n" - "+\n" - "+static int __devexit mc13xxx_i2c_remove(struct i2c_client *client)\n" - "+{\n" - "+\tstruct mc13xxx *mc13xxx = dev_get_drvdata(&client->dev);\n" - "+\n" - "+\tfree_irq(client->irq, mc13xxx);\n" - "+\n" - "+\tmfd_remove_devices(&client->dev);\n" - "+\n" - "+\tkfree(mc13xxx);\n" - "+\n" - "+\treturn 0;\n" - "+}\n" - "+\n" - "+static const struct i2c_device_id mc13xxx_i2c_idtable[] = {\n" - "+\t{\"mc13892\", MC13XXX_ID_MC13892},\n" - "+\t{ }\n" - "+};\n" - "+\n" - "+static struct i2c_driver mc13xxx_i2c_driver = {\n" - "+\t.driver = {\n" - "+\t\t.owner = THIS_MODULE,\n" - "+\t\t.name = \"mc13xxx-i2c\"\n" - "+\t},\n" - "+\t.id_table = mc13xxx_i2c_idtable,\n" - "+\t.probe = mc13xxx_i2c_probe,\n" - "+\t.remove = __devexit_p(mc13xxx_i2c_remove),\n" - "+};\n" - "+\n" - "+static int __init mc13xxx_i2c_init(void)\n" - "+{\n" - "+\treturn i2c_add_driver(&mc13xxx_i2c_driver);\n" - "+}\n" - "+subsys_initcall(mc13xxx_i2c_init);\n" - "+\n" - "+static void __exit mc13xxx_i2c_exit(void)\n" - "+{\n" - "+\ti2c_del_driver(&mc13xxx_i2c_driver);\n" - "+}\n" - "+module_exit(mc13xxx_i2c_exit);\n" - "+\n" - "+MODULE_DESCRIPTION(\"i2c driver for Freescale MC13XXX PMIC\");\n" - "+MODULE_AUTHOR(\"Marc Reilly <marc@cpdesign.com.au\");\n" - "+MODULE_LICENSE(\"GPL v2\");\n" - "diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h\n" - "index ab7deb3..c5ab08b 100644\n" - "--- a/include/linux/mfd/mc13xxx.h\n" - "+++ b/include/linux/mfd/mc13xxx.h\n" - "@@ -73,7 +73,10 @@ enum mc13xxx_id {\n" - " };\n" - " \n" - " struct mc13xxx {\n" - "-\tstruct spi_device *spidev;\n" - "+\tunion {\n" - "+\t\tstruct spi_device *spidev;\n" - "+\t\tstruct i2c_client *i2cclient;\n" - "+\t};\n" - " \n" - " \tstruct device *dev;\n" - " \tenum mc13xxx_id ictype;" - "\01:6\0" - "b\0" - "_______________________________________________\n" - "linux-arm-kernel mailing list\n" - "linux-arm-kernel@lists.infradead.org\n" - http://lists.infradead.org/mailman/listinfo/linux-arm-kernel + "[1] https://patchwork.kernel.org/patch/449541/\n" + "\n" + "-------------- next part --------------\n" + "A non-text attachment was scrubbed...\n" + "Name: v4-1-4-mc13xxx-core-Prepare-for-separate-spi-and-i2c-backends..patch\n" + "Type: text/x-patch\n" + "Size: 11185 bytes\n" + "Desc: not available\n" + "URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0004.bin>\n" + "-------------- next part --------------\n" + "A non-text attachment was scrubbed...\n" + "Name: v4-2-4-mc13xxx-core-Kconfig-Config-menu-driven-by-specific-IC-type.patch\n" + "Type: text/x-patch\n" + "Size: 2740 bytes\n" + "Desc: not available\n" + "URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0005.bin>\n" + "-------------- next part --------------\n" + "A non-text attachment was scrubbed...\n" + "Name: v4-3-4-mc13xxx-core-Move-spi-specific-code-into-separate-module..patch\n" + "Type: text/x-patch\n" + "Size: 10876 bytes\n" + "Desc: not available\n" + "URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0006.bin>\n" + "-------------- next part --------------\n" + "A non-text attachment was scrubbed...\n" + "Name: v4-4-4-mc13xxx-core-Add-i2c-driver.patch\n" + "Type: text/x-patch\n" + "Size: 5118 bytes\n" + "Desc: not available\n" + URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110222/eec38aa9/attachment-0007.bin> -0a0043dc0c68669eaa9f410a5009ff64964d9decff9a34bd10b751e790223b5d +ced72d6558ee7a33b388e8866c09996517dd0b2a85778e3a1c6bfdc76e8bddf7
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.