diff options
| author | Doug Zobel <dzobel1@motorola.com> | 2013-12-16 12:45:23 -0600 |
|---|---|---|
| committer | James Wylder <jwylder@motorola.com> | 2014-03-05 17:46:59 -0600 |
| commit | 9613c207efd912c864b16fa48cb26e279fdcfa57 (patch) | |
| tree | 85f4c58a8710143f424a6a5d73157d1d233cbbd7 | |
| parent | 25372d59ec0eddc27d6025be01e0f402657c96c6 (diff) | |
| download | olio-linux-3.10-9613c207efd912c864b16fa48cb26e279fdcfa57.tar.xz olio-linux-3.10-9613c207efd912c864b16fa48cb26e279fdcfa57.zip | |
IKXCLOCK-32 cpcap: dts: Re-enable CPCAP via device_tree
CPCAP driver registration trigger is moved to device_tree so
it can be controlled by hardware revision. The whole CPCAP
driver is not ported to the new device_tree format because it
is obsolete hardware that will be deprecated in the near
future. HW specific configuration has been moved from
board file to drivers/mfd/cpcap-minnow.c for the time being
Change-Id: If465ef99e9313ad2e833545fb8e463f49b0209c4
Conflicts:
drivers/mfd/cpcap-minnow.c
Change-Id: I7935263d3d7003d3435b57377c9304ef48377f09
Reviewed-on: http://gerrit.pcs.mot.com/599815
SLTApproved: Slta Waiver <sltawvr@motorola.com>
Tested-by: Jira Key <jirakey@motorola.com>
Reviewed-by: Jee Su Chang <w20740@motorola.com>
Submit-Approved: Jira Key <jirakey@motorola.com>
| -rw-r--r-- | arch/arm/boot/dts/omap3-casper-p1.dts | 11 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/board-minnow.c | 1 | ||||
| -rw-r--r-- | drivers/mfd/Makefile | 1 | ||||
| -rw-r--r-- | drivers/mfd/cpcap-core.c | 32 | ||||
| -rw-r--r-- | drivers/mfd/cpcap-minnow.c (renamed from arch/arm/mach-omap2/board-minnow-spi.c) | 60 | ||||
| -rw-r--r-- | drivers/mfd/cpcap-regacc.c | 6 | ||||
| -rw-r--r-- | include/linux/spi/cpcap.h | 1 |
8 files changed, 66 insertions, 47 deletions
diff --git a/arch/arm/boot/dts/omap3-casper-p1.dts b/arch/arm/boot/dts/omap3-casper-p1.dts index 95fa27c6a76..416860afd79 100644 --- a/arch/arm/boot/dts/omap3-casper-p1.dts +++ b/arch/arm/boot/dts/omap3-casper-p1.dts @@ -35,3 +35,14 @@ }; }; +&mcspi1 { + clock-frequency = <3000000>; + cpcap { + compatible = "mot,cpcap"; + reg = <0>; /* CS 0 */ + spi-max-frequency = <3000000>; + spi-cs-high; + + irq-gpio = <0>; + }; +}; diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 9fe571fe9de..82101b07e8f 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -254,7 +254,6 @@ obj-$(CONFIG_MACH_TOUCHBOOK) += board-omap3touchbook.o obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o obj-$(CONFIG_MACH_OMAP4_PANDA) += board-omap4panda.o obj-$(CONFIG_MACH_MINNOW) += board-minnow.o \ - board-minnow-spi.o \ board-minnow-wireless.o \ board-minnow-sensors.o \ board-minnow-cpcap-client.o diff --git a/arch/arm/mach-omap2/board-minnow.c b/arch/arm/mach-omap2/board-minnow.c index 72d43c88d1a..7f6f8f29748 100644 --- a/arch/arm/mach-omap2/board-minnow.c +++ b/arch/arm/mach-omap2/board-minnow.c @@ -48,7 +48,6 @@ static void __init minnow_init(void) omap_sdrc_init(JEDEC_JESD209A_sdrc_params, JEDEC_JESD209A_sdrc_params); omap3_enable_usim_buffer(); /* Needed for GPIOs in USIM block */ omap_minnow_display_init(); - minnow_spi_init(); minnow_bt_init(); minnow_sensors_init(); minnow_cpcap_client_init(); diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 254ffaabdb4..c0704d70b97 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -163,6 +163,7 @@ cpcap-objs := cpcap-core.o \ cpcap-usb-det.o \ cpcap-key.o \ cpcap-adc.o \ + cpcap-minnow.o \ cpcap-uc.o obj-$(CONFIG_MFD_CPCAP) += cpcap.o diff --git a/drivers/mfd/cpcap-core.c b/drivers/mfd/cpcap-core.c index b248c9d0d4a..dde418c0346 100644 --- a/drivers/mfd/cpcap-core.c +++ b/drivers/mfd/cpcap-core.c @@ -20,6 +20,8 @@ #include <linux/miscdevice.h> #include <linux/module.h> #include <linux/platform_device.h> +#include <linux/gpio.h> +#include <linux/irq.h> #include <linux/regulator/machine.h> #include <linux/spi/spi.h> #include <linux/spi/cpcap.h> @@ -351,10 +353,10 @@ int cpcap_device_register(struct platform_device *pdev) static int cpcap_probe(struct spi_device *spi) { - int retval = -EINVAL; + int i, retval = -EINVAL; struct cpcap_device *cpcap; struct cpcap_platform_data *data; - int i; + unsigned int irq; struct cpcap_driver_info *info; cpcap = kzalloc(sizeof(*cpcap), GFP_KERNEL); @@ -362,12 +364,32 @@ static int cpcap_probe(struct spi_device *spi) return -ENOMEM; cpcap->spi = spi; - data = spi->controller_data; + data = cpcap_get_plat_data(cpcap); + if (data == NULL) { + dev_info(&(spi->dev), "No platform data found for CPCAP\n"); + goto free_mem; + } + + /* fixup struct spi_device for backward compatibility */ + spi->controller_data = data; spi_set_drvdata(spi, cpcap); + /* setup IRQ GPIO (previously done in board file) */ + retval = gpio_request(data->irq_gpio, "cpcap-irq"); + if (retval) + goto free_mem; + + retval = gpio_direction_input(data->irq_gpio); + if (retval) + goto free_gpio; + + irq = gpio_to_irq(data->irq_gpio); + irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING); + spi->irq = irq; + retval = cpcap_regacc_init(cpcap); if (retval < 0) - goto free_mem; + goto free_gpio; retval = cpcap_irq_init(cpcap); if (retval < 0) goto free_cpcap_irq; @@ -430,6 +452,8 @@ static int cpcap_probe(struct spi_device *spi) free_cpcap_irq: cpcap_irq_shutdown(cpcap); +free_gpio: + gpio_free(data->irq_gpio); free_mem: kfree(cpcap); return retval; diff --git a/arch/arm/mach-omap2/board-minnow-spi.c b/drivers/mfd/cpcap-minnow.c index 5d0f2815c8d..ef180cb3326 100644 --- a/arch/arm/mach-omap2/board-minnow-spi.c +++ b/drivers/mfd/cpcap-minnow.c @@ -8,9 +8,15 @@ * published by the Free Software Foundation. */ +/* This is converted from the boardfile. Instead of migrating the + driver to the new device_tree format, this code is left in place + to hardcode device settings. This is driver is for obsolete hardware + and will be removed in the future + */ + #include <linux/kernel.h> #include <linux/device.h> -#include <linux/gpio.h> +#include <linux/of.h> #include <linux/irq.h> #include <linux/platform_device.h> #include <linux/power_supply.h> @@ -20,8 +26,6 @@ #include <linux/spi/cpcap.h> #include <linux/spi/spi.h> -#include "mux.h" - struct cpcap_spi_init_data minnow_cpcap_spi_init[CPCAP_REG_SIZE + 1] = { {CPCAP_REG_ASSIGN1, 0x0101}, {CPCAP_REG_ASSIGN2, 0x0000}, @@ -114,8 +118,6 @@ unsigned short cpcap_regulator_off_mode_values[CPCAP_NUM_REGULATORS] = { [CPCAP_VAUDIO] = 0x0000, }; -#define CPCAP_GPIO 1 - struct regulator_consumer_supply cpcap_sw4_consumers[] = { REGULATOR_SUPPLY("sw4", NULL /* DSP */), }; @@ -444,25 +446,14 @@ static struct cpcap_platform_data minnow_cpcap_data = { .usb_changed = NULL, .is_umts = 0, .hwcfg = {CPCAP_HWCFG0_NONE, CPCAP_HWCFG1_STBY_GPIO}, - .irq_gpio = CPCAP_GPIO, -}; - -static struct spi_board_info minnow_spi_board_info[] __initdata = { - /* CPCAP must be 1st object beacuse it is modified in spi_init() */ - { - .modalias = "cpcap", - .bus_num = 1, - .chip_select = 1, - .max_speed_hz = 3000000, - .controller_data = &minnow_cpcap_data, - .mode = SPI_CS_HIGH, - }, + .irq_gpio = 0, }; -void __init minnow_spi_init(void) +#ifdef CONFIG_OF +struct cpcap_platform_data *cpcap_get_plat_data(struct cpcap_device *cpcap) { - int irq; - int ret; + struct device_node *np = cpcap->spi->dev.of_node; + unsigned int prop; int i; for (i = 0; i < CPCAP_REG_SIZE; i++) { @@ -471,21 +462,16 @@ void __init minnow_spi_init(void) } minnow_cpcap_data.init_len = i; - ret = gpio_request(CPCAP_GPIO, "cpcap-irq"); - if (ret) - return; - ret = gpio_direction_input(CPCAP_GPIO); - if (ret) { - gpio_free(CPCAP_GPIO); - return; - } - - irq = gpio_to_irq(CPCAP_GPIO); - irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING); - minnow_spi_board_info[0].irq = irq; + if (!of_property_read_u32(np, "irq-gpio", &prop)) + minnow_cpcap_data.irq_gpio = prop; - spi_register_board_info(minnow_spi_board_info, - ARRAY_SIZE(minnow_spi_board_info)); - - /* regulator_has_full_constraints(); */ + return &minnow_cpcap_data; } +#else +static inline +struct cpcap_platform_data *cpcap_get_plat_data(struct cpcap_device *cpcap) +{ + return NULL; +} +#endif + diff --git a/drivers/mfd/cpcap-regacc.c b/drivers/mfd/cpcap-regacc.c index e85b241ab61..1a616014188 100644 --- a/drivers/mfd/cpcap-regacc.c +++ b/drivers/mfd/cpcap-regacc.c @@ -316,8 +316,7 @@ int cpcap_regacc_read(struct cpcap_device *cpcap, enum cpcap_reg reg, { int retval = -EINVAL; struct spi_device *spi = cpcap->spi; -/* Temporarily disable SPI for CPCAP driver for minnow bringup */ -return 0; + if (IS_CPCAP(reg) && (value_ptr != 0)) { mutex_lock(®_access); @@ -339,8 +338,7 @@ int cpcap_regacc_write(struct cpcap_device *cpcap, unsigned short old_value = 0; struct cpcap_platform_data *data; struct spi_device *spi = cpcap->spi; -/* Temporarily disable SPI for CPCAP driver for minnow bringup */ -return 0; + data = (struct cpcap_platform_data *)spi->controller_data; if (IS_CPCAP(reg) && diff --git a/include/linux/spi/cpcap.h b/include/linux/spi/cpcap.h index 9a00b1f5ccb..6612619fe22 100644 --- a/include/linux/spi/cpcap.h +++ b/include/linux/spi/cpcap.h @@ -841,6 +841,7 @@ unsigned char cpcap_uc_status(struct cpcap_device *cpcap, enum cpcap_macro macro); int cpcap_disable_offmode_wakeups(bool disable); +struct cpcap_platform_data *cpcap_get_plat_data(struct cpcap_device *cpcap); #ifdef CONFIG_PM_DBG_DRV void cpcap_irq_pm_dbg_suspend(void); |