summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Zobel <dzobel1@motorola.com>2013-12-16 12:45:23 -0600
committerJames Wylder <jwylder@motorola.com>2014-03-05 17:46:59 -0600
commit9613c207efd912c864b16fa48cb26e279fdcfa57 (patch)
tree85f4c58a8710143f424a6a5d73157d1d233cbbd7
parent25372d59ec0eddc27d6025be01e0f402657c96c6 (diff)
downloadolio-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.dts11
-rw-r--r--arch/arm/mach-omap2/Makefile1
-rw-r--r--arch/arm/mach-omap2/board-minnow.c1
-rw-r--r--drivers/mfd/Makefile1
-rw-r--r--drivers/mfd/cpcap-core.c32
-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.c6
-rw-r--r--include/linux/spi/cpcap.h1
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(&reg_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);