2010-12-03 15:37:16

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 00/20] ux500: platform data, TC3589x keypad driver

These set of patches add platform data to most of our mainlined
input drivers. Also included herein is

- Changing TC35892 MFD core to also plug in more variants
- revised version for the TC3589X keypad driver
- Minor i2c fixes, cleanups
- Minor arch specific code cleanups

(Apologies in advance to the i2c people for including them into
this big list; but these patches preferably need to be in through
single route)

Rabin Vincent (1):
nomadik-gpio: allow sleep mode dir/pull to differ from normal mode

Sundar Iyer (19):
mfd/ab8500: remove spi support
mach-ux500: deprecate spi support for ab8500
mach-ux500: move keymaps to new file
mach-ux500: add STMPE1601 platform data
mfd/tc35892: rename tc35892 header to tc3589x
mfd/tc35892: rename tc35892 core driver to tc3589x
mfd/tc3589x: rename tc35892 structs/registers to tc359x
mfd/tc3589x: add block identifier for multiple child devices
input/tc3589x: add tc3589x keypad support
mfd/tc3589x: fix random interrupt misses
mfd/tc3589x: undo gpio module reset during chip init
mfd/tc3589x: add suspend/resume support
plat-nomadik/gpio: add expander gpio pins enumeration
mach-ux500: add touchscreen interfaces platform data
i2c/nomadik: add adapter name for updated sanity checkings
mach-ux500: add TC35893 keypad platform data
mach-ux500: explicit enable MTU TCR in the kernel
mach-ux500: clean up checkpatch spits
i2c/nomadik: some checkpatch warnings

arch/arm/mach-ux500/Makefile | 2 +
arch/arm/mach-ux500/board-mop500-keypads.c | 229 ++++++++++
arch/arm/mach-ux500/board-mop500-touchscreen.c | 170 ++++++++
arch/arm/mach-ux500/board-mop500.c | 164 +-------
arch/arm/mach-ux500/board-mop500.h | 3 +-
arch/arm/mach-ux500/clock.c | 167 +++-----
arch/arm/mach-ux500/devices-db8500.c | 2 +-
arch/arm/mach-ux500/include/mach/gpio.h | 28 ++
.../mach-ux500/include/mach/irqs-board-mop500.h | 13 +-
arch/arm/plat-nomadik/gpio.c | 50 ++-
arch/arm/plat-nomadik/include/plat/pincfg.h | 70 +++-
drivers/gpio/Kconfig | 8 +-
drivers/gpio/Makefile | 2 +-
drivers/gpio/tc35892-gpio.c | 389 -----------------
drivers/gpio/tc3589x-gpio.c | 389 +++++++++++++++++
drivers/i2c/busses/i2c-nomadik.c | 35 +-
drivers/input/keyboard/Kconfig | 10 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/tc3589x-keypad.c | 440 ++++++++++++++++++++
drivers/mfd/Kconfig | 14 +-
drivers/mfd/Makefile | 4 +-
drivers/mfd/ab8500-spi.c | 143 -------
drivers/mfd/tc35892.c | 345 ---------------
drivers/mfd/tc3589x.c | 438 +++++++++++++++++++
include/linux/mfd/tc35892.h | 136 ------
include/linux/mfd/tc3589x.h | 195 +++++++++
26 files changed, 2130 insertions(+), 1317 deletions(-)
create mode 100644 arch/arm/mach-ux500/board-mop500-keypads.c
create mode 100644 arch/arm/mach-ux500/board-mop500-touchscreen.c
delete mode 100644 drivers/gpio/tc35892-gpio.c
create mode 100644 drivers/gpio/tc3589x-gpio.c
create mode 100644 drivers/input/keyboard/tc3589x-keypad.c
delete mode 100644 drivers/mfd/ab8500-spi.c
delete mode 100644 drivers/mfd/tc35892.c
create mode 100644 drivers/mfd/tc3589x.c
delete mode 100644 include/linux/mfd/tc35892.h
create mode 100644 include/linux/mfd/tc3589x.h

--
1.7.2.dirty


2010-12-03 15:06:47

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 04/20] nomadik-gpio: allow sleep mode dir/pull to differ from normal mode

From: Rabin Vincent <[email protected]>

In the nomadik GPIO pin configuration, allow the sleep mode direction
and pull configurations to differ from the ones for the normal state.
PIN_SLPM_PULL_*, PIN_SLPM_INPUT, PIN_SLPM_OUTPUT* macros are provided
for this.

Since the hardware does not allow seperate configurations for sleep mode
and normal mode, this is implemented by having software remux the
configurations as necessary.

Reviewed-by: Srinidhi KASAGAR <[email protected]>
Signed-off-by: Rabin Vincent <[email protected]>
Signed-off-by: Mian Yousaf Kaukab <[email protected]>
---
arch/arm/plat-nomadik/gpio.c | 50 +++++++++++++++++--
arch/arm/plat-nomadik/include/plat/pincfg.h | 70 +++++++++++++++++++++------
2 files changed, 99 insertions(+), 21 deletions(-)

diff --git a/arch/arm/plat-nomadik/gpio.c b/arch/arm/plat-nomadik/gpio.c
index 85e6fd2..5fc8e4d 100644
--- a/arch/arm/plat-nomadik/gpio.c
+++ b/arch/arm/plat-nomadik/gpio.c
@@ -119,7 +119,7 @@ static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip,
}

static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
- pin_cfg_t cfg)
+ pin_cfg_t cfg, bool sleep)
{
static const char *afnames[] = {
[NMK_GPIO_ALT_GPIO] = "GPIO",
@@ -145,11 +145,34 @@ static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
int output = PIN_DIR(cfg);
int val = PIN_VAL(cfg);

- dev_dbg(nmk_chip->chip.dev, "pin %d: af %s, pull %s, slpm %s (%s%s)\n",
- pin, afnames[af], pullnames[pull], slpmnames[slpm],
+ dev_dbg(nmk_chip->chip.dev, "pin %d [%#lx]: af %s, pull %s, slpm %s (%s%s)\n",
+ pin, cfg, afnames[af], pullnames[pull], slpmnames[slpm],
output ? "output " : "input",
output ? (val ? "high" : "low") : "");

+ if (sleep) {
+ int slpm_pull = PIN_SLPM_PULL(cfg);
+ int slpm_output = PIN_SLPM_DIR(cfg);
+ int slpm_val = PIN_SLPM_VAL(cfg);
+
+ /*
+ * The SLPM_* values are normal values + 1 to allow zero to
+ * mean "same as normal".
+ */
+ if (slpm_pull)
+ pull = slpm_pull - 1;
+ if (slpm_output)
+ output = slpm_output - 1;
+ if (slpm_val)
+ val = slpm_val - 1;
+
+ dev_dbg(nmk_chip->chip.dev, "pin %d: sleep pull %s, dir %s, val %s\n",
+ pin,
+ slpm_pull ? pullnames[pull] : "same",
+ slpm_output ? (output ? "output" : "input") : "same",
+ slpm_val ? (val ? "high" : "low") : "same");
+ }
+
if (output)
__nmk_gpio_make_output(nmk_chip, offset, val);
else {
@@ -175,7 +198,7 @@ static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
* side-effects. The gpio can be manipulated later using standard GPIO API
* calls.
*/
-int nmk_config_pin(pin_cfg_t cfg)
+int nmk_config_pin(pin_cfg_t cfg, bool sleep)
{
struct nmk_gpio_chip *nmk_chip;
int gpio = PIN_NUM(cfg);
@@ -186,7 +209,7 @@ int nmk_config_pin(pin_cfg_t cfg)
return -EINVAL;

spin_lock_irqsave(&nmk_chip->lock, flags);
- __nmk_config_pin(nmk_chip, gpio - nmk_chip->chip.base, cfg);
+ __nmk_config_pin(nmk_chip, gpio - nmk_chip->chip.base, cfg, sleep);
spin_unlock_irqrestore(&nmk_chip->lock, flags);

return 0;
@@ -207,7 +230,7 @@ int nmk_config_pins(pin_cfg_t *cfgs, int num)
int i;

for (i = 0; i < num; i++) {
- int ret = nmk_config_pin(cfgs[i]);
+ ret = nmk_config_pin(cfgs[i], false);
if (ret)
break;
}
@@ -216,6 +239,21 @@ int nmk_config_pins(pin_cfg_t *cfgs, int num)
}
EXPORT_SYMBOL(nmk_config_pins);

+int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num)
+{
+ int ret = 0;
+ int i;
+
+ for (i = 0; i < num; i++) {
+ ret = nmk_config_pin(cfgs[i], true);
+ if (ret)
+ break;
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL(nmk_config_pins_sleep);
+
/**
* nmk_gpio_set_slpm() - configure the sleep mode of a pin
* @gpio: pin number
diff --git a/arch/arm/plat-nomadik/include/plat/pincfg.h b/arch/arm/plat-nomadik/include/plat/pincfg.h
index 8c5ae3f..05a3936 100644
--- a/arch/arm/plat-nomadik/include/plat/pincfg.h
+++ b/arch/arm/plat-nomadik/include/plat/pincfg.h
@@ -19,16 +19,22 @@
* bit 9..10 - Alternate Function Selection
* bit 11..12 - Pull up/down state
* bit 13 - Sleep mode behaviour
- * bit 14 - (sleep mode) Direction
- * bit 15 - (sleep mode) Value (if output)
+ * bit 14 - Direction
+ * bit 15 - Value (if output)
+ * bit 16..18 - SLPM pull up/down state
+ * bit 19..20 - SLPM direction
+ * bit 21..22 - SLPM Value (if output)
*
* to facilitate the definition, the following macros are provided
*
* PIN_CFG_DEFAULT - default config (0):
* pull up/down = disabled
* sleep mode = input/wakeup
- * (sleep mode) direction = input
- * (sleep mode) value = low
+ * direction = input
+ * value = low
+ * SLPM direction = same as normal
+ * SLPM pull = same as normal
+ * SLPM value = same as normal
*
* PIN_CFG - default config with alternate function
* PIN_CFG_PULL - default config with alternate function and pull up/down
@@ -75,30 +81,64 @@ typedef unsigned long pin_cfg_t;
#define PIN_VAL_LOW (0 << PIN_VAL_SHIFT)
#define PIN_VAL_HIGH (1 << PIN_VAL_SHIFT)

-/* Shortcuts. Use these instead of separate DIR and VAL. */
-#define PIN_INPUT PIN_DIR_INPUT
+#define PIN_SLPM_PULL_SHIFT 16
+#define PIN_SLPM_PULL_MASK (0x7 << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL(x) \
+ (((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_NONE \
+ ((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_UP \
+ ((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_DOWN \
+ ((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT)
+
+#define PIN_SLPM_DIR_SHIFT 19
+#define PIN_SLPM_DIR_MASK (0x3 << PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR(x) \
+ (((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR_INPUT ((1 + 0) << PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR_OUTPUT ((1 + 1) << PIN_SLPM_DIR_SHIFT)
+
+#define PIN_SLPM_VAL_SHIFT 21
+#define PIN_SLPM_VAL_MASK (0x3 << PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL(x) \
+ (((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL_LOW ((1 + 0) << PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL_HIGH ((1 + 1) << PIN_SLPM_VAL_SHIFT)
+
+/* Shortcuts. Use these instead of separate DIR, PULL, and VAL. */
+#define PIN_INPUT_PULLDOWN (PIN_DIR_INPUT | PIN_PULL_DOWN)
+#define PIN_INPUT_PULLUP (PIN_DIR_INPUT | PIN_PULL_UP)
+#define PIN_INPUT_NOPULL (PIN_DIR_INPUT | PIN_PULL_NONE)
#define PIN_OUTPUT_LOW (PIN_DIR_OUTPUT | PIN_VAL_LOW)
#define PIN_OUTPUT_HIGH (PIN_DIR_OUTPUT | PIN_VAL_HIGH)

-/*
- * These are the same as the ones above, but should make more sense to the
- * reader when seen along with a setting a pin to AF mode.
- */
-#define PIN_SLPM_INPUT PIN_INPUT
-#define PIN_SLPM_OUTPUT_LOW PIN_OUTPUT_LOW
-#define PIN_SLPM_OUTPUT_HIGH PIN_OUTPUT_HIGH
+#define PIN_SLPM_INPUT_PULLDOWN (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN)
+#define PIN_SLPM_INPUT_PULLUP (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP)
+#define PIN_SLPM_INPUT_NOPULL (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE)
+#define PIN_SLPM_OUTPUT_LOW (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW)
+#define PIN_SLPM_OUTPUT_HIGH (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH)

-#define PIN_CFG_DEFAULT (PIN_PULL_NONE | PIN_SLPM_INPUT)
+#define PIN_CFG_DEFAULT (0)

#define PIN_CFG(num, alt) \
(PIN_CFG_DEFAULT |\
(PIN_NUM(num) | PIN_##alt))

+#define PIN_CFG_INPUT(num, alt, pull) \
+ (PIN_CFG_DEFAULT |\
+ (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull))
+
+#define PIN_CFG_OUTPUT(num, alt, val) \
+ (PIN_CFG_DEFAULT |\
+ (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val))
+
#define PIN_CFG_PULL(num, alt, pull) \
((PIN_CFG_DEFAULT & ~PIN_PULL_MASK) |\
(PIN_NUM(num) | PIN_##alt | PIN_PULL_##pull))

-extern int nmk_config_pin(pin_cfg_t cfg);
+extern int nmk_config_pin(pin_cfg_t cfg, bool sleep);
extern int nmk_config_pins(pin_cfg_t *cfgs, int num);
+extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num);

#endif
--
1.7.2.dirty

2010-12-03 15:06:44

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 06/20] mfd/tc35892: rename tc35892 header to tc3589x

Rename the header file to include further variants within
the same mfd core driver

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/gpio/tc35892-gpio.c | 2 +-
drivers/mfd/tc35892.c | 2 +-
include/linux/mfd/{tc35892.h => tc3589x.h} | 0
3 files changed, 2 insertions(+), 2 deletions(-)
rename include/linux/mfd/{tc35892.h => tc3589x.h} (100%)

diff --git a/drivers/gpio/tc35892-gpio.c b/drivers/gpio/tc35892-gpio.c
index 7e10c93..027b857 100644
--- a/drivers/gpio/tc35892-gpio.c
+++ b/drivers/gpio/tc35892-gpio.c
@@ -13,7 +13,7 @@
#include <linux/gpio.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
-#include <linux/mfd/tc35892.h>
+#include <linux/mfd/tc3589x.h>

/*
* These registers are modified under the irq bus lock and cached to avoid
diff --git a/drivers/mfd/tc35892.c b/drivers/mfd/tc35892.c
index e619e2a..f230235 100644
--- a/drivers/mfd/tc35892.c
+++ b/drivers/mfd/tc35892.c
@@ -12,7 +12,7 @@
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/mfd/core.h>
-#include <linux/mfd/tc35892.h>
+#include <linux/mfd/tc3589x.h>

/**
* tc35892_reg_read() - read a single TC35892 register
diff --git a/include/linux/mfd/tc35892.h b/include/linux/mfd/tc3589x.h
similarity index 100%
rename from include/linux/mfd/tc35892.h
rename to include/linux/mfd/tc3589x.h
--
1.7.2.dirty

2010-12-03 15:06:53

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 11/20] mfd/tc3589x: fix random interrupt misses

On the TC35892, a random delayed interrupt clear (GPIO IC) write locks up the
child interrupts. In such a case, the original interrupt is active and not yet
acknowledged. Re-check the IRQST bit for any pending interrupts and handle
those.

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/mfd/tc3589x.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index 5672d56..e173f33 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -158,6 +158,7 @@ static irqreturn_t tc3589x_irq(int irq, void *data)
struct tc3589x *tc3589x = data;
int status;

+again:
status = tc3589x_reg_read(tc3589x, TC3589x_IRQST);
if (status < 0)
return IRQ_NONE;
@@ -172,9 +173,12 @@ static irqreturn_t tc3589x_irq(int irq, void *data)
/*
* A dummy read or write (to any register) appears to be necessary to
* have the last interrupt clear (for example, GPIO IC write) take
- * effect.
+ * effect. In such a case, recheck for any interrupt which is still
+ * pending.
*/
- tc3589x_reg_read(tc3589x, TC3589x_IRQST);
+ status = tc3589x_reg_read(tc3589x, TC3589x_IRQST);
+ if (status)
+ goto again;

return IRQ_HANDLED;
}
--
1.7.2.dirty

2010-12-03 15:07:09

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 07/20] mfd/tc35892: rename tc35892 core driver to tc3589x

Rename the tc35892 core/gpio drivers to tc3589x to include
new variants in the same mfd core

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/gpio/Kconfig | 8 ++++----
drivers/gpio/Makefile | 2 +-
drivers/gpio/{tc35892-gpio.c => tc3589x-gpio.c} | 0
drivers/mfd/Kconfig | 6 +++---
drivers/mfd/Makefile | 2 +-
drivers/mfd/{tc35892.c => tc3589x.c} | 0
6 files changed, 9 insertions(+), 9 deletions(-)
rename drivers/gpio/{tc35892-gpio.c => tc3589x-gpio.c} (100%)
rename drivers/mfd/{tc35892.c => tc3589x.c} (100%)

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 3143ac7..082495b 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -230,11 +230,11 @@ config GPIO_STMPE
This enables support for the GPIOs found on the STMPE I/O
Expanders.

-config GPIO_TC35892
- bool "TC35892 GPIOs"
- depends on MFD_TC35892
+config GPIO_TC3589X
+ bool "TC3589X GPIOs"
+ depends on MFD_TC3589X
help
- This enables support for the GPIOs found on the TC35892
+ This enables support for the GPIOs found on the TC3589X
I/O Expander.

config GPIO_TWL4030
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index bdf3dde..39bfd7a 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -24,7 +24,7 @@ obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
obj-$(CONFIG_GPIO_PCH) += pch_gpio.o
obj-$(CONFIG_GPIO_PL061) += pl061.o
obj-$(CONFIG_GPIO_STMPE) += stmpe-gpio.o
-obj-$(CONFIG_GPIO_TC35892) += tc35892-gpio.o
+obj-$(CONFIG_GPIO_TC3589X) += tc3589x-gpio.o
obj-$(CONFIG_GPIO_TIMBERDALE) += timbgpio.o
obj-$(CONFIG_GPIO_TWL4030) += twl4030-gpio.o
obj-$(CONFIG_GPIO_UCB1400) += ucb1400_gpio.o
diff --git a/drivers/gpio/tc35892-gpio.c b/drivers/gpio/tc3589x-gpio.c
similarity index 100%
rename from drivers/gpio/tc35892-gpio.c
rename to drivers/gpio/tc3589x-gpio.c
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index c856aa7..a4c2e3e 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -218,12 +218,12 @@ config MFD_STMPE
Keypad: stmpe-keypad
Touchscreen: stmpe-ts

-config MFD_TC35892
- bool "Support Toshiba TC35892"
+config MFD_TC3589X
+ bool "Support Toshiba TC35892 and variants"
depends on I2C=y && GENERIC_HARDIRQS
select MFD_CORE
help
- Support for the Toshiba TC35892 I/O Expander.
+ Support for the Toshiba TC35892 and variants I/O Expander.

This driver provides common support for accessing the device,
additional drivers must be enabled in order to use the
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 67c8bcb..e42e0889 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -16,7 +16,7 @@ obj-$(CONFIG_MFD_DAVINCI_VOICECODEC) += davinci_voicecodec.o
obj-$(CONFIG_MFD_DM355EVM_MSP) += dm355evm_msp.o

obj-$(CONFIG_MFD_STMPE) += stmpe.o
-obj-$(CONFIG_MFD_TC35892) += tc35892.o
+obj-$(CONFIG_MFD_TC3589X) += tc3589x.o
obj-$(CONFIG_MFD_T7L66XB) += t7l66xb.o tmio_core.o
obj-$(CONFIG_MFD_TC6387XB) += tc6387xb.o tmio_core.o
obj-$(CONFIG_MFD_TC6393XB) += tc6393xb.o tmio_core.o
diff --git a/drivers/mfd/tc35892.c b/drivers/mfd/tc3589x.c
similarity index 100%
rename from drivers/mfd/tc35892.c
rename to drivers/mfd/tc3589x.c
--
1.7.2.dirty

2010-12-03 15:07:28

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 18/20] mach-ux500: explicit enable MTU TCR in the kernel

PRCM_TCR enables the various timers in the system. This must be achieved
before any of the MTUs are usable for kernel usage. Explicit enabling of
this in the kernel makes it independent of bootloader actions.

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/clock.c | 49 ++++++++-----------------------------------
1 files changed, 9 insertions(+), 40 deletions(-)

diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
index 531de5c..6657b05 100644
--- a/arch/arm/mach-ux500/clock.c
+++ b/arch/arm/mach-ux500/clock.c
@@ -132,7 +132,7 @@ static unsigned long clk_mtu_get_rate(struct clk *clk)
{
void __iomem *addr = __io_address(UX500_PRCMU_BASE)
+ PRCM_TCR;
- u32 tcr = readl(addr);
+ u32 tcr;
int mtu = (int) clk->data;
/*
* One of these is selected eventually
@@ -143,6 +143,14 @@ static unsigned long clk_mtu_get_rate(struct clk *clk)
unsigned long mturate;
unsigned long retclk;

+ /*
+ * On a startup, always conifgure the TCR to the doze mode;
+ * bootloaders do it for us. Do this in the kernel too.
+ */
+ writel(PRCM_TCR_DOZE_MODE, addr);
+
+ tcr = readl(addr);
+
/* Get the rate from the parent as a default */
if (clk->parent_periph)
mturate = clk_get_rate(clk->parent_periph);
@@ -152,45 +160,6 @@ static unsigned long clk_mtu_get_rate(struct clk *clk)
/* We need to be connected SOMEWHERE */
BUG();

- /*
- * Are we in doze mode?
- * In this mode the parent peripheral or the fixed 32768 Hz
- * clock is fed into the block.
- */
- if (!(tcr & PRCM_TCR_DOZE_MODE)) {
- /*
- * Here we're using the clock input from the APE ULP
- * clock domain. But first: are the timers stopped?
- */
- if (tcr & PRCM_TCR_STOPPED) {
- clk32k = 0;
- mturate = 0;
- } else {
- /* Else default mode: 0 and 2.4 MHz */
- clk32k = 0;
- if (cpu_is_u5500())
- /* DB5500 divides by 8 */
- mturate /= 8;
- else if (cpu_is_u8500ed()) {
- /*
- * This clocking setting must not be used
- * in the ED chip, it is simply not
- * connected anywhere!
- */
- mturate = 0;
- BUG();
- } else
- /*
- * In this mode the ulp38m4 clock is divided
- * by a factor 16, on the DB8500 typically
- * 38400000 / 16 ~ 2.4 MHz.
- * TODO: Replace the constant with a reference
- * to the ULP source once this is modeled.
- */
- mturate = 38400000 / 16;
- }
- }
-
/* Return the clock selected for this MTU */
if (tcr & (1 << mtu))
retclk = clk32k;
--
1.7.2.dirty

2010-12-03 15:07:26

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 20/20] i2c/nomadik: some checkpatch warnings

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/i2c/busses/i2c-nomadik.c | 34 +++++++++++++++++-----------------
1 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
index baa8ff7..3ead1b6 100644
--- a/drivers/i2c/busses/i2c-nomadik.c
+++ b/drivers/i2c/busses/i2c-nomadik.c
@@ -62,11 +62,11 @@
/* Master controller (MCR) register */
#define I2C_MCR_OP (0x1 << 0) /* Operation */
#define I2C_MCR_A7 (0x7f << 1) /* 7-bit address */
-#define I2C_MCR_EA10 (0x7 << 8) /* 10-bit Extended address */
+#define I2C_MCR_EA10 (0x7 << 8) /* 10-bit Extended address */
#define I2C_MCR_SB (0x1 << 11) /* Extended address */
#define I2C_MCR_AM (0x3 << 12) /* Address type */
-#define I2C_MCR_STOP (0x1 << 14) /* Stop condition */
-#define I2C_MCR_LENGTH (0x7ff << 15) /* Transaction length */
+#define I2C_MCR_STOP (0x1 << 14) /* Stop condition */
+#define I2C_MCR_LENGTH (0x7ff << 15) /* Transaction length */

/* Status register (SR) */
#define I2C_SR_OP (0x3 << 0) /* Operation */
@@ -76,7 +76,7 @@
#define I2C_SR_LENGTH (0x7ff << 9) /* Transfer length */

/* Interrupt mask set/clear (IMSCR) bits */
-#define I2C_IT_TXFE (0x1 << 0)
+#define I2C_IT_TXFE (0x1 << 0)
#define I2C_IT_TXFNE (0x1 << 1)
#define I2C_IT_TXFF (0x1 << 2)
#define I2C_IT_TXFOVR (0x1 << 3)
@@ -154,15 +154,15 @@ struct i2c_nmk_client {
*/
struct nmk_i2c_dev {
struct platform_device *pdev;
- struct i2c_adapter adap;
- int irq;
+ struct i2c_adapter adap;
+ int irq;
void __iomem *virtbase;
struct clk *clk;
struct nmk_i2c_controller cfg;
struct i2c_nmk_client cli;
- int stop;
+ int stop;
struct completion xfer_complete;
- int result;
+ int result;
};

/* controller's abort causes */
@@ -275,7 +275,7 @@ static int init_hw(struct nmk_i2c_dev *dev)
}

/* enable peripheral, master mode operation */
-#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE)
+#define DEFAULT_I2C_REG_CR ((1 << 1) | I2C_CR_PE)

/**
* load_i2c_mcr_reg() - load the MCR register
@@ -519,13 +519,13 @@ static int write_i2c(struct nmk_i2c_dev *dev)
*
* NOTE:
* READ TRANSFER : We impose a restriction of the first message to be the
- * index message for any read transaction.
- * - a no index is coded as '0',
- * - 2byte big endian index is coded as '3'
- * !!! msg[0].buf holds the actual index.
- * This is compatible with generic messages of smbus emulator
- * that send a one byte index.
- * eg. a I2C transation to read 2 bytes from index 0
+ * index message for any read transaction.
+ * - a no index is coded as '0',
+ * - 2byte big endian index is coded as '3'
+ * !!! msg[0].buf holds the actual index.
+ * This is compatible with generic messages of smbus emulator
+ * that send a one byte index.
+ * eg. a I2C transation to read 2 bytes from index 0
* idx = 0;
* msg[0].addr = client->addr;
* msg[0].flags = 0x0;
@@ -841,7 +841,7 @@ static int __devinit nmk_i2c_probe(struct platform_device *pdev)
}

if (request_mem_region(res->start, resource_size(res),
- DRIVER_NAME "I/O region") == NULL) {
+ DRIVER_NAME "I/O region") == NULL) {
ret = -EBUSY;
goto err_no_region;
}
--
1.7.2.dirty

2010-12-03 15:08:25

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 03/20] mach-ux500: move keymaps to new file

Move keylayouts to a dedicated file and plug these keylayouts
for input platform data. This will make addition of new and custom
keylayouts localized.

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/Makefile | 1 +
arch/arm/mach-ux500/board-mop500-keypads.c | 134 ++++++++++++++++++++++++++++
arch/arm/mach-ux500/board-mop500.c | 113 +-----------------------
arch/arm/mach-ux500/board-mop500.h | 1 +
arch/arm/mach-ux500/devices-db8500.c | 2 +-
5 files changed, 139 insertions(+), 112 deletions(-)
create mode 100644 arch/arm/mach-ux500/board-mop500-keypads.c

diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
index 0612013..e1d3822 100644
--- a/arch/arm/mach-ux500/Makefile
+++ b/arch/arm/mach-ux500/Makefile
@@ -13,3 +13,4 @@ obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
obj-$(CONFIG_REGULATOR_AB8500) += board-mop500-regulators.o
obj-$(CONFIG_U5500_MODEM_IRQ) += modem_irq.o
obj-$(CONFIG_U5500_MBOX) += mbox.o
+obj-$(CONFIG_INPUT_KEYBOARD) += board-mop500-keypads.o
diff --git a/arch/arm/mach-ux500/board-mop500-keypads.c b/arch/arm/mach-ux500/board-mop500-keypads.c
new file mode 100644
index 0000000..c1218c5
--- /dev/null
+++ b/arch/arm/mach-ux500/board-mop500-keypads.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License Terms: GNU General Public License v2
+ *
+ * Keypad layouts for various boards
+ */
+
+#include <linux/i2c.h>
+#include <linux/gpio.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/stmpe.h>
+#include <linux/input/matrix_keypad.h>
+
+#include <plat/pincfg.h>
+#include <plat/ske.h>
+
+#include <mach/devices.h>
+#include <mach/hardware.h>
+
+#include "devices-db8500.h"
+#include "board-mop500.h"
+
+/* STMPE/SKE keypad use this key layout */
+static const unsigned int mop500_keymap[] = {
+ KEY(2, 5, KEY_END),
+ KEY(4, 1, KEY_POWER),
+ KEY(3, 5, KEY_VOLUMEDOWN),
+ KEY(1, 3, KEY_3),
+ KEY(5, 2, KEY_RIGHT),
+ KEY(5, 0, KEY_9),
+
+ KEY(0, 5, KEY_MENU),
+ KEY(7, 6, KEY_ENTER),
+ KEY(4, 5, KEY_0),
+ KEY(6, 7, KEY_2),
+ KEY(3, 4, KEY_UP),
+ KEY(3, 3, KEY_DOWN),
+
+ KEY(6, 4, KEY_SEND),
+ KEY(6, 2, KEY_BACK),
+ KEY(4, 2, KEY_VOLUMEUP),
+ KEY(5, 5, KEY_1),
+ KEY(4, 3, KEY_LEFT),
+ KEY(3, 2, KEY_7),
+};
+
+static const struct matrix_keymap_data mop500_keymap_data = {
+ .keymap = mop500_keymap,
+ .keymap_size = ARRAY_SIZE(mop500_keymap),
+};
+
+/*
+ * Nomadik SKE keypad
+ */
+#define ROW_PIN_I0 164
+#define ROW_PIN_I1 163
+#define ROW_PIN_I2 162
+#define ROW_PIN_I3 161
+#define ROW_PIN_I4 156
+#define ROW_PIN_I5 155
+#define ROW_PIN_I6 154
+#define ROW_PIN_I7 153
+#define COL_PIN_O0 168
+#define COL_PIN_O1 167
+#define COL_PIN_O2 166
+#define COL_PIN_O3 165
+#define COL_PIN_O4 160
+#define COL_PIN_O5 159
+#define COL_PIN_O6 158
+#define COL_PIN_O7 157
+
+#define SKE_KPD_MAX_ROWS 8
+#define SKE_KPD_MAX_COLS 8
+
+static int ske_kp_rows[] = {
+ ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3,
+ ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7,
+};
+
+/*
+ * ske_set_gpio_row: request and set gpio rows
+ */
+static int ske_set_gpio_row(int gpio)
+{
+ int ret;
+
+ ret = gpio_request(gpio, "ske-kp");
+ if (ret < 0) {
+ pr_err("ske_set_gpio_row: gpio request failed\n");
+ return ret;
+ }
+
+ ret = gpio_direction_output(gpio, 1);
+ if (ret < 0) {
+ pr_err("ske_set_gpio_row: gpio direction failed\n");
+ gpio_free(gpio);
+ }
+
+ return ret;
+}
+
+/*
+ * ske_kp_init - enable the gpio configuration
+ */
+static int ske_kp_init(void)
+{
+ int ret, i;
+
+ for (i = 0; i < SKE_KPD_MAX_ROWS; i++) {
+ ret = ske_set_gpio_row(ske_kp_rows[i]);
+ if (ret < 0) {
+ pr_err("ske_kp_init: failed init\n");
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static struct ske_keypad_platform_data ske_keypad_board = {
+ .init = ske_kp_init,
+ .keymap_data = &mop500_keymap_data,
+ .no_autorepeat = true,
+ .krow = SKE_KPD_MAX_ROWS, /* 8x8 matrix */
+ .kcol = SKE_KPD_MAX_COLS,
+ .debounce_ms = 40, /* in millsecs */
+};
+
+void mop500_keypad_init(void)
+{
+ db8500_add_ske_keypad(&ske_keypad_board);
+}
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 28bc18b..9b5e66e 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -19,15 +19,12 @@
#include <linux/amba/pl022.h>
#include <linux/spi/spi.h>
#include <linux/mfd/ab8500.h>
-#include <linux/mfd/tc35892.h>
-#include <linux/input/matrix_keypad.h>

#include <asm/mach-types.h>
#include <asm/mach/arch.h>

#include <plat/pincfg.h>
#include <plat/i2c.h>
-#include <plat/ske.h>

#include <mach/hardware.h>
#include <mach/setup.h>
@@ -172,116 +169,8 @@ static void __init mop500_i2c_init(void)
db8500_add_i2c3(&u8500_i2c3_data);
}

-static const unsigned int ux500_keymap[] = {
- KEY(2, 5, KEY_END),
- KEY(4, 1, KEY_POWER),
- KEY(3, 5, KEY_VOLUMEDOWN),
- KEY(1, 3, KEY_3),
- KEY(5, 2, KEY_RIGHT),
- KEY(5, 0, KEY_9),
-
- KEY(0, 5, KEY_MENU),
- KEY(7, 6, KEY_ENTER),
- KEY(4, 5, KEY_0),
- KEY(6, 7, KEY_2),
- KEY(3, 4, KEY_UP),
- KEY(3, 3, KEY_DOWN),
-
- KEY(6, 4, KEY_SEND),
- KEY(6, 2, KEY_BACK),
- KEY(4, 2, KEY_VOLUMEUP),
- KEY(5, 5, KEY_1),
- KEY(4, 3, KEY_LEFT),
- KEY(3, 2, KEY_7),
-};
-
-static const struct matrix_keymap_data ux500_keymap_data = {
- .keymap = ux500_keymap,
- .keymap_size = ARRAY_SIZE(ux500_keymap),
-};
-
-/*
- * Nomadik SKE keypad
- */
-#define ROW_PIN_I0 164
-#define ROW_PIN_I1 163
-#define ROW_PIN_I2 162
-#define ROW_PIN_I3 161
-#define ROW_PIN_I4 156
-#define ROW_PIN_I5 155
-#define ROW_PIN_I6 154
-#define ROW_PIN_I7 153
-#define COL_PIN_O0 168
-#define COL_PIN_O1 167
-#define COL_PIN_O2 166
-#define COL_PIN_O3 165
-#define COL_PIN_O4 160
-#define COL_PIN_O5 159
-#define COL_PIN_O6 158
-#define COL_PIN_O7 157
-
-#define SKE_KPD_MAX_ROWS 8
-#define SKE_KPD_MAX_COLS 8
-
-static int ske_kp_rows[] = {
- ROW_PIN_I0, ROW_PIN_I1, ROW_PIN_I2, ROW_PIN_I3,
- ROW_PIN_I4, ROW_PIN_I5, ROW_PIN_I6, ROW_PIN_I7,
-};
-
-/*
- * ske_set_gpio_row: request and set gpio rows
- */
-static int ske_set_gpio_row(int gpio)
-{
- int ret;
-
- ret = gpio_request(gpio, "ske-kp");
- if (ret < 0) {
- pr_err("ske_set_gpio_row: gpio request failed\n");
- return ret;
- }
-
- ret = gpio_direction_output(gpio, 1);
- if (ret < 0) {
- pr_err("ske_set_gpio_row: gpio direction failed\n");
- gpio_free(gpio);
- }
-
- return ret;
-}
-
-/*
- * ske_kp_init - enable the gpio configuration
- */
-static int ske_kp_init(void)
-{
- int ret, i;
-
- for (i = 0; i < SKE_KPD_MAX_ROWS; i++) {
- ret = ske_set_gpio_row(ske_kp_rows[i]);
- if (ret < 0) {
- pr_err("ske_kp_init: failed init\n");
- return ret;
- }
- }
-
- return 0;
-}
-
-static struct ske_keypad_platform_data ske_keypad_board = {
- .init = ske_kp_init,
- .keymap_data = &ux500_keymap_data,
- .no_autorepeat = true,
- .krow = SKE_KPD_MAX_ROWS, /* 8x8 matrix */
- .kcol = SKE_KPD_MAX_COLS,
- .debounce_ms = 40, /* in millsecs */
-};
-
-
-
/* add any platform devices here - TODO */
static struct platform_device *platform_devs[] __initdata = {
- &ux500_ske_keypad_device,
};

static void __init mop500_spi_init(void)
@@ -310,6 +199,8 @@ static void __init u8500_init_machine(void)
mop500_spi_init();
mop500_uart_init();

+ mop500_keypad_init();
+
platform_device_register(&ab8500_device);

i2c_register_board_info(0, mop500_i2c0_devices,
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index 3a338e6..3104ae2 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -16,5 +16,6 @@

extern void mop500_sdi_init(void);
extern void mop500_sdi_tc35892_init(void);
+extern void mop500_keypad_init(void);

#endif
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c
index 1edcf82..e78445c 100644
--- a/arch/arm/mach-ux500/devices-db8500.c
+++ b/arch/arm/mach-ux500/devices-db8500.c
@@ -164,7 +164,7 @@ struct resource keypad_resources[] = {
},
};

-struct platform_device ux500_ske_keypad_device = {
+struct platform_device u8500_ske_keypad_device = {
.name = "nmk-ske-keypad",
.id = -1,
.num_resources = ARRAY_SIZE(keypad_resources),
--
1.7.2.dirty

2010-12-03 15:06:42

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 05/20] mach-ux500: add STMPE1601 platform data

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/board-mop500-keypads.c | 32 ++++++++++++++++++++
arch/arm/mach-ux500/board-mop500.c | 3 ++
.../mach-ux500/include/mach/irqs-board-mop500.h | 13 +++++++-
3 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-ux500/board-mop500-keypads.c b/arch/arm/mach-ux500/board-mop500-keypads.c
index c1218c5..4acc4f1 100644
--- a/arch/arm/mach-ux500/board-mop500-keypads.c
+++ b/arch/arm/mach-ux500/board-mop500-keypads.c
@@ -128,7 +128,39 @@ static struct ske_keypad_platform_data ske_keypad_board = {
.debounce_ms = 40, /* in millsecs */
};

+/*
+ * STMPE1601
+ */
+static struct stmpe_keypad_platform_data stmpe1601_keypad_data = {
+ .debounce_ms = 64,
+ .scan_count = 8,
+ .no_autorepeat = true,
+ .keymap_data = &mop500_keymap_data,
+};
+
+static struct stmpe_platform_data stmpe1601_data = {
+ .id = 1,
+ .blocks = STMPE_BLOCK_KEYPAD,
+ .irq_trigger = IRQF_TRIGGER_FALLING,
+ .irq_base = MOP500_STMPE1601_IRQ(0),
+ .keypad = &stmpe1601_keypad_data,
+ .autosleep = true,
+ .autosleep_timeout = 1024,
+};
+
+static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
+ {
+ I2C_BOARD_INFO("stmpe1601", 0x40),
+ .irq = NOMADIK_GPIO_TO_IRQ(218),
+ .platform_data = &stmpe1601_data,
+ .flags = I2C_CLIENT_WAKE,
+ },
+};
+
void mop500_keypad_init(void)
{
db8500_add_ske_keypad(&ske_keypad_board);
+
+ i2c_register_board_info(0, mop500_i2c0_devices_stuib,
+ ARRAY_SIZE(mop500_i2c0_devices_stuib));
}
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 9b5e66e..8f4a955 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -19,6 +19,7 @@
#include <linux/amba/pl022.h>
#include <linux/spi/spi.h>
#include <linux/mfd/ab8500.h>
+#include <linux/mfd/tc35892.h>

#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -71,6 +72,8 @@ static pin_cfg_t mop500_pins[] = {
GPIO168_KP_O0,

GPIO217_GPIO, /* GPIO_EXP_INT */
+
+ GPIO218_GPIO | PIN_INPUT_PULLUP, /* STMPE1601 IRQ */
};

static struct ab8500_platform_data ab8500_platdata = {
diff --git a/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h b/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h
index 7ee8aaa..c89ae0d 100644
--- a/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h
+++ b/arch/arm/mach-ux500/include/mach/irqs-board-mop500.h
@@ -14,6 +14,7 @@
#define MOP500_AB8500_IRQ_END (MOP500_AB8500_IRQ_BASE \
+ AB8500_NR_IRQS)

+/* TC35892 */
#define TC35892_NR_INTERNAL_IRQS 8
#define TC35892_INT_GPIO(x) (TC35892_NR_INTERNAL_IRQS + (x))
#define TC35892_NR_GPIOS 24
@@ -24,8 +25,18 @@
#define MOP500_EGPIO_IRQ_BASE MOP500_AB8500_IRQ_END
#define MOP500_EGPIO_IRQ_END (MOP500_EGPIO_IRQ_BASE \
+ MOP500_EGPIO_NR_IRQS)
+/* STMPE1601 irqs */
+#define STMPE_NR_INTERNAL_IRQS 9
+#define STMPE_INT_GPIO(x) (STMPE_NR_INTERNAL_IRQS + (x))
+#define STMPE_NR_GPIOS 24
+#define STMPE_NR_IRQS STMPE_INT_GPIO(STMPE_NR_GPIOS)

-#define MOP500_IRQ_END MOP500_EGPIO_IRQ_END
+#define MOP500_STMPE1601_IRQBASE MOP500_EGPIO_IRQ_END
+#define MOP500_STMPE1601_IRQ(x) (MOP500_STMPE1601_IRQBASE + (x))
+
+#define MOP500_NR_IRQS MOP500_STMPE1601_IRQ(STMPE_NR_INTERNAL_IRQS)
+
+#define MOP500_IRQ_END MOP500_NR_IRQS

#if MOP500_IRQ_END > IRQ_BOARD_END
#undef IRQ_BOARD_END
--
1.7.2.dirty

2010-12-03 15:08:38

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 08/20] mfd/tc3589x: rename tc35892 structs/registers to tc359x

Most of the register layout, client IRQ numbers on the TC35892 is shared also
by other variants. Make this generic as tc3589x

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/board-mop500.c | 11 +-
drivers/gpio/tc3589x-gpio.c | 268 ++++++++++++++++++------------------
drivers/mfd/tc3589x.c | 222 +++++++++++++++---------------
include/linux/mfd/tc3589x.h | 202 ++++++++++++++--------------
4 files changed, 351 insertions(+), 352 deletions(-)

diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 8f4a955..6aaf382 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -19,7 +19,7 @@
#include <linux/amba/pl022.h>
#include <linux/spi/spi.h>
#include <linux/mfd/ab8500.h>
-#include <linux/mfd/tc35892.h>
+#include <linux/mfd/tc3589x.h>

#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -112,24 +112,24 @@ static struct pl022_ssp_controller ssp0_platform_data = {
* TC35892
*/

-static void mop500_tc35892_init(struct tc35892 *tc35892, unsigned int base)
+static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base)
{
mop500_sdi_tc35892_init();
}

-static struct tc35892_gpio_platform_data mop500_tc35892_gpio_data = {
+static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
.gpio_base = MOP500_EGPIO(0),
.setup = mop500_tc35892_init,
};

-static struct tc35892_platform_data mop500_tc35892_data = {
+static struct tc3589x_platform_data mop500_tc35892_data = {
.gpio = &mop500_tc35892_gpio_data,
.irq_base = MOP500_EGPIO_IRQ_BASE,
};

static struct i2c_board_info mop500_i2c0_devices[] = {
{
- I2C_BOARD_INFO("tc35892", 0x42),
+ I2C_BOARD_INFO("tc3589x", 0x42),
.irq = NOMADIK_GPIO_TO_IRQ(217),
.platform_data = &mop500_tc35892_data,
},
@@ -194,7 +194,6 @@ static void __init u8500_init_machine(void)

nmk_config_pins(mop500_pins, ARRAY_SIZE(mop500_pins));

- ux500_ske_keypad_device.dev.platform_data = &ske_keypad_board;
platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));

mop500_i2c_init();
diff --git a/drivers/gpio/tc3589x-gpio.c b/drivers/gpio/tc3589x-gpio.c
index 027b857..180d584 100644
--- a/drivers/gpio/tc3589x-gpio.c
+++ b/drivers/gpio/tc3589x-gpio.c
@@ -24,9 +24,9 @@ enum { REG_IBE, REG_IEV, REG_IS, REG_IE };
#define CACHE_NR_REGS 4
#define CACHE_NR_BANKS 3

-struct tc35892_gpio {
+struct tc3589x_gpio {
struct gpio_chip chip;
- struct tc35892 *tc35892;
+ struct tc3589x *tc3589x;
struct device *dev;
struct mutex irq_lock;

@@ -37,179 +37,179 @@ struct tc35892_gpio {
u8 oldregs[CACHE_NR_REGS][CACHE_NR_BANKS];
};

-static inline struct tc35892_gpio *to_tc35892_gpio(struct gpio_chip *chip)
+static inline struct tc3589x_gpio *to_tc3589x_gpio(struct gpio_chip *chip)
{
- return container_of(chip, struct tc35892_gpio, chip);
+ return container_of(chip, struct tc3589x_gpio, chip);
}

-static int tc35892_gpio_get(struct gpio_chip *chip, unsigned offset)
+static int tc3589x_gpio_get(struct gpio_chip *chip, unsigned offset)
{
- struct tc35892_gpio *tc35892_gpio = to_tc35892_gpio(chip);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
- u8 reg = TC35892_GPIODATA0 + (offset / 8) * 2;
+ struct tc3589x_gpio *tc3589x_gpio = to_tc3589x_gpio(chip);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
+ u8 reg = TC3589x_GPIODATA0 + (offset / 8) * 2;
u8 mask = 1 << (offset % 8);
int ret;

- ret = tc35892_reg_read(tc35892, reg);
+ ret = tc3589x_reg_read(tc3589x, reg);
if (ret < 0)
return ret;

return ret & mask;
}

-static void tc35892_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
+static void tc3589x_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
{
- struct tc35892_gpio *tc35892_gpio = to_tc35892_gpio(chip);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
- u8 reg = TC35892_GPIODATA0 + (offset / 8) * 2;
+ struct tc3589x_gpio *tc3589x_gpio = to_tc3589x_gpio(chip);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
+ u8 reg = TC3589x_GPIODATA0 + (offset / 8) * 2;
unsigned pos = offset % 8;
u8 data[] = {!!val << pos, 1 << pos};

- tc35892_block_write(tc35892, reg, ARRAY_SIZE(data), data);
+ tc3589x_block_write(tc3589x, reg, ARRAY_SIZE(data), data);
}

-static int tc35892_gpio_direction_output(struct gpio_chip *chip,
+static int tc3589x_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int val)
{
- struct tc35892_gpio *tc35892_gpio = to_tc35892_gpio(chip);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
- u8 reg = TC35892_GPIODIR0 + offset / 8;
+ struct tc3589x_gpio *tc3589x_gpio = to_tc3589x_gpio(chip);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
+ u8 reg = TC3589x_GPIODIR0 + offset / 8;
unsigned pos = offset % 8;

- tc35892_gpio_set(chip, offset, val);
+ tc3589x_gpio_set(chip, offset, val);

- return tc35892_set_bits(tc35892, reg, 1 << pos, 1 << pos);
+ return tc3589x_set_bits(tc3589x, reg, 1 << pos, 1 << pos);
}

-static int tc35892_gpio_direction_input(struct gpio_chip *chip,
+static int tc3589x_gpio_direction_input(struct gpio_chip *chip,
unsigned offset)
{
- struct tc35892_gpio *tc35892_gpio = to_tc35892_gpio(chip);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
- u8 reg = TC35892_GPIODIR0 + offset / 8;
+ struct tc3589x_gpio *tc3589x_gpio = to_tc3589x_gpio(chip);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
+ u8 reg = TC3589x_GPIODIR0 + offset / 8;
unsigned pos = offset % 8;

- return tc35892_set_bits(tc35892, reg, 1 << pos, 0);
+ return tc3589x_set_bits(tc3589x, reg, 1 << pos, 0);
}

-static int tc35892_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
+static int tc3589x_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
{
- struct tc35892_gpio *tc35892_gpio = to_tc35892_gpio(chip);
+ struct tc3589x_gpio *tc3589x_gpio = to_tc3589x_gpio(chip);

- return tc35892_gpio->irq_base + offset;
+ return tc3589x_gpio->irq_base + offset;
}

static struct gpio_chip template_chip = {
- .label = "tc35892",
+ .label = "tc3589x",
.owner = THIS_MODULE,
- .direction_input = tc35892_gpio_direction_input,
- .get = tc35892_gpio_get,
- .direction_output = tc35892_gpio_direction_output,
- .set = tc35892_gpio_set,
- .to_irq = tc35892_gpio_to_irq,
+ .direction_input = tc3589x_gpio_direction_input,
+ .get = tc3589x_gpio_get,
+ .direction_output = tc3589x_gpio_direction_output,
+ .set = tc3589x_gpio_set,
+ .to_irq = tc3589x_gpio_to_irq,
.can_sleep = 1,
};

-static int tc35892_gpio_irq_set_type(unsigned int irq, unsigned int type)
+static int tc3589x_gpio_irq_set_type(unsigned int irq, unsigned int type)
{
- struct tc35892_gpio *tc35892_gpio = get_irq_chip_data(irq);
- int offset = irq - tc35892_gpio->irq_base;
+ struct tc3589x_gpio *tc3589x_gpio = get_irq_chip_data(irq);
+ int offset = irq - tc3589x_gpio->irq_base;
int regoffset = offset / 8;
int mask = 1 << (offset % 8);

if (type == IRQ_TYPE_EDGE_BOTH) {
- tc35892_gpio->regs[REG_IBE][regoffset] |= mask;
+ tc3589x_gpio->regs[REG_IBE][regoffset] |= mask;
return 0;
}

- tc35892_gpio->regs[REG_IBE][regoffset] &= ~mask;
+ tc3589x_gpio->regs[REG_IBE][regoffset] &= ~mask;

if (type == IRQ_TYPE_LEVEL_LOW || type == IRQ_TYPE_LEVEL_HIGH)
- tc35892_gpio->regs[REG_IS][regoffset] |= mask;
+ tc3589x_gpio->regs[REG_IS][regoffset] |= mask;
else
- tc35892_gpio->regs[REG_IS][regoffset] &= ~mask;
+ tc3589x_gpio->regs[REG_IS][regoffset] &= ~mask;

if (type == IRQ_TYPE_EDGE_RISING || type == IRQ_TYPE_LEVEL_HIGH)
- tc35892_gpio->regs[REG_IEV][regoffset] |= mask;
+ tc3589x_gpio->regs[REG_IEV][regoffset] |= mask;
else
- tc35892_gpio->regs[REG_IEV][regoffset] &= ~mask;
+ tc3589x_gpio->regs[REG_IEV][regoffset] &= ~mask;

return 0;
}

-static void tc35892_gpio_irq_lock(unsigned int irq)
+static void tc3589x_gpio_irq_lock(unsigned int irq)
{
- struct tc35892_gpio *tc35892_gpio = get_irq_chip_data(irq);
+ struct tc3589x_gpio *tc3589x_gpio = get_irq_chip_data(irq);

- mutex_lock(&tc35892_gpio->irq_lock);
+ mutex_lock(&tc3589x_gpio->irq_lock);
}

-static void tc35892_gpio_irq_sync_unlock(unsigned int irq)
+static void tc3589x_gpio_irq_sync_unlock(unsigned int irq)
{
- struct tc35892_gpio *tc35892_gpio = get_irq_chip_data(irq);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
+ struct tc3589x_gpio *tc3589x_gpio = get_irq_chip_data(irq);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
static const u8 regmap[] = {
- [REG_IBE] = TC35892_GPIOIBE0,
- [REG_IEV] = TC35892_GPIOIEV0,
- [REG_IS] = TC35892_GPIOIS0,
- [REG_IE] = TC35892_GPIOIE0,
+ [REG_IBE] = TC3589x_GPIOIBE0,
+ [REG_IEV] = TC3589x_GPIOIEV0,
+ [REG_IS] = TC3589x_GPIOIS0,
+ [REG_IE] = TC3589x_GPIOIE0,
};
int i, j;

for (i = 0; i < CACHE_NR_REGS; i++) {
for (j = 0; j < CACHE_NR_BANKS; j++) {
- u8 old = tc35892_gpio->oldregs[i][j];
- u8 new = tc35892_gpio->regs[i][j];
+ u8 old = tc3589x_gpio->oldregs[i][j];
+ u8 new = tc3589x_gpio->regs[i][j];

if (new == old)
continue;

- tc35892_gpio->oldregs[i][j] = new;
- tc35892_reg_write(tc35892, regmap[i] + j * 8, new);
+ tc3589x_gpio->oldregs[i][j] = new;
+ tc3589x_reg_write(tc3589x, regmap[i] + j * 8, new);
}
}

- mutex_unlock(&tc35892_gpio->irq_lock);
+ mutex_unlock(&tc3589x_gpio->irq_lock);
}

-static void tc35892_gpio_irq_mask(unsigned int irq)
+static void tc3589x_gpio_irq_mask(unsigned int irq)
{
- struct tc35892_gpio *tc35892_gpio = get_irq_chip_data(irq);
- int offset = irq - tc35892_gpio->irq_base;
+ struct tc3589x_gpio *tc3589x_gpio = get_irq_chip_data(irq);
+ int offset = irq - tc3589x_gpio->irq_base;
int regoffset = offset / 8;
int mask = 1 << (offset % 8);

- tc35892_gpio->regs[REG_IE][regoffset] &= ~mask;
+ tc3589x_gpio->regs[REG_IE][regoffset] &= ~mask;
}

-static void tc35892_gpio_irq_unmask(unsigned int irq)
+static void tc3589x_gpio_irq_unmask(unsigned int irq)
{
- struct tc35892_gpio *tc35892_gpio = get_irq_chip_data(irq);
- int offset = irq - tc35892_gpio->irq_base;
+ struct tc3589x_gpio *tc3589x_gpio = get_irq_chip_data(irq);
+ int offset = irq - tc3589x_gpio->irq_base;
int regoffset = offset / 8;
int mask = 1 << (offset % 8);

- tc35892_gpio->regs[REG_IE][regoffset] |= mask;
+ tc3589x_gpio->regs[REG_IE][regoffset] |= mask;
}

-static struct irq_chip tc35892_gpio_irq_chip = {
- .name = "tc35892-gpio",
- .bus_lock = tc35892_gpio_irq_lock,
- .bus_sync_unlock = tc35892_gpio_irq_sync_unlock,
- .mask = tc35892_gpio_irq_mask,
- .unmask = tc35892_gpio_irq_unmask,
- .set_type = tc35892_gpio_irq_set_type,
+static struct irq_chip tc3589x_gpio_irq_chip = {
+ .name = "tc3589x-gpio",
+ .bus_lock = tc3589x_gpio_irq_lock,
+ .bus_sync_unlock = tc3589x_gpio_irq_sync_unlock,
+ .mask = tc3589x_gpio_irq_mask,
+ .unmask = tc3589x_gpio_irq_unmask,
+ .set_type = tc3589x_gpio_irq_set_type,
};

-static irqreturn_t tc35892_gpio_irq(int irq, void *dev)
+static irqreturn_t tc3589x_gpio_irq(int irq, void *dev)
{
- struct tc35892_gpio *tc35892_gpio = dev;
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
+ struct tc3589x_gpio *tc3589x_gpio = dev;
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
u8 status[CACHE_NR_BANKS];
int ret;
int i;

- ret = tc35892_block_read(tc35892, TC35892_GPIOMIS0,
+ ret = tc3589x_block_read(tc3589x, TC3589x_GPIOMIS0,
ARRAY_SIZE(status), status);
if (ret < 0)
return IRQ_NONE;
@@ -223,24 +223,24 @@ static irqreturn_t tc35892_gpio_irq(int irq, void *dev)
int bit = __ffs(stat);
int line = i * 8 + bit;

- handle_nested_irq(tc35892_gpio->irq_base + line);
+ handle_nested_irq(tc3589x_gpio->irq_base + line);
stat &= ~(1 << bit);
}

- tc35892_reg_write(tc35892, TC35892_GPIOIC0 + i, status[i]);
+ tc3589x_reg_write(tc3589x, TC3589x_GPIOIC0 + i, status[i]);
}

return IRQ_HANDLED;
}

-static int tc35892_gpio_irq_init(struct tc35892_gpio *tc35892_gpio)
+static int tc3589x_gpio_irq_init(struct tc3589x_gpio *tc3589x_gpio)
{
- int base = tc35892_gpio->irq_base;
+ int base = tc3589x_gpio->irq_base;
int irq;

- for (irq = base; irq < base + tc35892_gpio->chip.ngpio; irq++) {
- set_irq_chip_data(irq, tc35892_gpio);
- set_irq_chip_and_handler(irq, &tc35892_gpio_irq_chip,
+ for (irq = base; irq < base + tc3589x_gpio->chip.ngpio; irq++) {
+ set_irq_chip_data(irq, tc3589x_gpio);
+ set_irq_chip_and_handler(irq, &tc3589x_gpio_irq_chip,
handle_simple_irq);
set_irq_nested_thread(irq, 1);
#ifdef CONFIG_ARM
@@ -253,12 +253,12 @@ static int tc35892_gpio_irq_init(struct tc35892_gpio *tc35892_gpio)
return 0;
}

-static void tc35892_gpio_irq_remove(struct tc35892_gpio *tc35892_gpio)
+static void tc3589x_gpio_irq_remove(struct tc3589x_gpio *tc3589x_gpio)
{
- int base = tc35892_gpio->irq_base;
+ int base = tc3589x_gpio->irq_base;
int irq;

- for (irq = base; irq < base + tc35892_gpio->chip.ngpio; irq++) {
+ for (irq = base; irq < base + tc3589x_gpio->chip.ngpio; irq++) {
#ifdef CONFIG_ARM
set_irq_flags(irq, 0);
#endif
@@ -267,15 +267,15 @@ static void tc35892_gpio_irq_remove(struct tc35892_gpio *tc35892_gpio)
}
}

-static int __devinit tc35892_gpio_probe(struct platform_device *pdev)
+static int __devinit tc3589x_gpio_probe(struct platform_device *pdev)
{
- struct tc35892 *tc35892 = dev_get_drvdata(pdev->dev.parent);
- struct tc35892_gpio_platform_data *pdata;
- struct tc35892_gpio *tc35892_gpio;
+ struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
+ struct tc3589x_gpio_platform_data *pdata;
+ struct tc3589x_gpio *tc3589x_gpio;
int ret;
int irq;

- pdata = tc35892->pdata->gpio;
+ pdata = tc3589x->pdata->gpio;
if (!pdata)
return -ENODEV;

@@ -283,107 +283,107 @@ static int __devinit tc35892_gpio_probe(struct platform_device *pdev)
if (irq < 0)
return irq;

- tc35892_gpio = kzalloc(sizeof(struct tc35892_gpio), GFP_KERNEL);
- if (!tc35892_gpio)
+ tc3589x_gpio = kzalloc(sizeof(struct tc3589x_gpio), GFP_KERNEL);
+ if (!tc3589x_gpio)
return -ENOMEM;

- mutex_init(&tc35892_gpio->irq_lock);
+ mutex_init(&tc3589x_gpio->irq_lock);

- tc35892_gpio->dev = &pdev->dev;
- tc35892_gpio->tc35892 = tc35892;
+ tc3589x_gpio->dev = &pdev->dev;
+ tc3589x_gpio->tc3589x = tc3589x;

- tc35892_gpio->chip = template_chip;
- tc35892_gpio->chip.ngpio = tc35892->num_gpio;
- tc35892_gpio->chip.dev = &pdev->dev;
- tc35892_gpio->chip.base = pdata->gpio_base;
+ tc3589x_gpio->chip = template_chip;
+ tc3589x_gpio->chip.ngpio = tc3589x->num_gpio;
+ tc3589x_gpio->chip.dev = &pdev->dev;
+ tc3589x_gpio->chip.base = pdata->gpio_base;

- tc35892_gpio->irq_base = tc35892->irq_base + TC35892_INT_GPIO(0);
+ tc3589x_gpio->irq_base = tc3589x->irq_base + TC3589x_INT_GPIO(0);

/* Bring the GPIO module out of reset */
- ret = tc35892_set_bits(tc35892, TC35892_RSTCTRL,
- TC35892_RSTCTRL_GPIRST, 0);
+ ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL,
+ TC3589x_RSTCTRL_GPIRST, 0);
if (ret < 0)
goto out_free;

- ret = tc35892_gpio_irq_init(tc35892_gpio);
+ ret = tc3589x_gpio_irq_init(tc3589x_gpio);
if (ret)
goto out_free;

- ret = request_threaded_irq(irq, NULL, tc35892_gpio_irq, IRQF_ONESHOT,
- "tc35892-gpio", tc35892_gpio);
+ ret = request_threaded_irq(irq, NULL, tc3589x_gpio_irq, IRQF_ONESHOT,
+ "tc3589x-gpio", tc3589x_gpio);
if (ret) {
dev_err(&pdev->dev, "unable to get irq: %d\n", ret);
goto out_removeirq;
}

- ret = gpiochip_add(&tc35892_gpio->chip);
+ ret = gpiochip_add(&tc3589x_gpio->chip);
if (ret) {
dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret);
goto out_freeirq;
}

if (pdata->setup)
- pdata->setup(tc35892, tc35892_gpio->chip.base);
+ pdata->setup(tc3589x, tc3589x_gpio->chip.base);

- platform_set_drvdata(pdev, tc35892_gpio);
+ platform_set_drvdata(pdev, tc3589x_gpio);

return 0;

out_freeirq:
- free_irq(irq, tc35892_gpio);
+ free_irq(irq, tc3589x_gpio);
out_removeirq:
- tc35892_gpio_irq_remove(tc35892_gpio);
+ tc3589x_gpio_irq_remove(tc3589x_gpio);
out_free:
- kfree(tc35892_gpio);
+ kfree(tc3589x_gpio);
return ret;
}

-static int __devexit tc35892_gpio_remove(struct platform_device *pdev)
+static int __devexit tc3589x_gpio_remove(struct platform_device *pdev)
{
- struct tc35892_gpio *tc35892_gpio = platform_get_drvdata(pdev);
- struct tc35892 *tc35892 = tc35892_gpio->tc35892;
- struct tc35892_gpio_platform_data *pdata = tc35892->pdata->gpio;
+ struct tc3589x_gpio *tc3589x_gpio = platform_get_drvdata(pdev);
+ struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
+ struct tc3589x_gpio_platform_data *pdata = tc3589x->pdata->gpio;
int irq = platform_get_irq(pdev, 0);
int ret;

if (pdata->remove)
- pdata->remove(tc35892, tc35892_gpio->chip.base);
+ pdata->remove(tc3589x, tc3589x_gpio->chip.base);

- ret = gpiochip_remove(&tc35892_gpio->chip);
+ ret = gpiochip_remove(&tc3589x_gpio->chip);
if (ret < 0) {
- dev_err(tc35892_gpio->dev,
+ dev_err(tc3589x_gpio->dev,
"unable to remove gpiochip: %d\n", ret);
return ret;
}

- free_irq(irq, tc35892_gpio);
- tc35892_gpio_irq_remove(tc35892_gpio);
+ free_irq(irq, tc3589x_gpio);
+ tc3589x_gpio_irq_remove(tc3589x_gpio);

platform_set_drvdata(pdev, NULL);
- kfree(tc35892_gpio);
+ kfree(tc3589x_gpio);

return 0;
}

-static struct platform_driver tc35892_gpio_driver = {
- .driver.name = "tc35892-gpio",
+static struct platform_driver tc3589x_gpio_driver = {
+ .driver.name = "tc3589x-gpio",
.driver.owner = THIS_MODULE,
- .probe = tc35892_gpio_probe,
- .remove = __devexit_p(tc35892_gpio_remove),
+ .probe = tc3589x_gpio_probe,
+ .remove = __devexit_p(tc3589x_gpio_remove),
};

-static int __init tc35892_gpio_init(void)
+static int __init tc3589x_gpio_init(void)
{
- return platform_driver_register(&tc35892_gpio_driver);
+ return platform_driver_register(&tc3589x_gpio_driver);
}
-subsys_initcall(tc35892_gpio_init);
+subsys_initcall(tc3589x_gpio_init);

-static void __exit tc35892_gpio_exit(void)
+static void __exit tc3589x_gpio_exit(void)
{
- platform_driver_unregister(&tc35892_gpio_driver);
+ platform_driver_unregister(&tc3589x_gpio_driver);
}
-module_exit(tc35892_gpio_exit);
+module_exit(tc3589x_gpio_exit);

MODULE_LICENSE("GPL v2");
-MODULE_DESCRIPTION("TC35892 GPIO driver");
+MODULE_DESCRIPTION("TC3589x GPIO driver");
MODULE_AUTHOR("Hanumath Prasad, Rabin Vincent");
diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index f230235..7deff53 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -15,141 +15,141 @@
#include <linux/mfd/tc3589x.h>

/**
- * tc35892_reg_read() - read a single TC35892 register
- * @tc35892: Device to read from
+ * tc3589x_reg_read() - read a single TC3589x register
+ * @tc3589x: Device to read from
* @reg: Register to read
*/
-int tc35892_reg_read(struct tc35892 *tc35892, u8 reg)
+int tc3589x_reg_read(struct tc3589x *tc3589x, u8 reg)
{
int ret;

- ret = i2c_smbus_read_byte_data(tc35892->i2c, reg);
+ ret = i2c_smbus_read_byte_data(tc3589x->i2c, reg);
if (ret < 0)
- dev_err(tc35892->dev, "failed to read reg %#x: %d\n",
+ dev_err(tc3589x->dev, "failed to read reg %#x: %d\n",
reg, ret);

return ret;
}
-EXPORT_SYMBOL_GPL(tc35892_reg_read);
+EXPORT_SYMBOL_GPL(tc3589x_reg_read);

/**
- * tc35892_reg_read() - write a single TC35892 register
- * @tc35892: Device to write to
+ * tc3589x_reg_read() - write a single TC3589x register
+ * @tc3589x: Device to write to
* @reg: Register to read
* @data: Value to write
*/
-int tc35892_reg_write(struct tc35892 *tc35892, u8 reg, u8 data)
+int tc3589x_reg_write(struct tc3589x *tc3589x, u8 reg, u8 data)
{
int ret;

- ret = i2c_smbus_write_byte_data(tc35892->i2c, reg, data);
+ ret = i2c_smbus_write_byte_data(tc3589x->i2c, reg, data);
if (ret < 0)
- dev_err(tc35892->dev, "failed to write reg %#x: %d\n",
+ dev_err(tc3589x->dev, "failed to write reg %#x: %d\n",
reg, ret);

return ret;
}
-EXPORT_SYMBOL_GPL(tc35892_reg_write);
+EXPORT_SYMBOL_GPL(tc3589x_reg_write);

/**
- * tc35892_block_read() - read multiple TC35892 registers
- * @tc35892: Device to read from
+ * tc3589x_block_read() - read multiple TC3589x registers
+ * @tc3589x: Device to read from
* @reg: First register
* @length: Number of registers
* @values: Buffer to write to
*/
-int tc35892_block_read(struct tc35892 *tc35892, u8 reg, u8 length, u8 *values)
+int tc3589x_block_read(struct tc3589x *tc3589x, u8 reg, u8 length, u8 *values)
{
int ret;

- ret = i2c_smbus_read_i2c_block_data(tc35892->i2c, reg, length, values);
+ ret = i2c_smbus_read_i2c_block_data(tc3589x->i2c, reg, length, values);
if (ret < 0)
- dev_err(tc35892->dev, "failed to read regs %#x: %d\n",
+ dev_err(tc3589x->dev, "failed to read regs %#x: %d\n",
reg, ret);

return ret;
}
-EXPORT_SYMBOL_GPL(tc35892_block_read);
+EXPORT_SYMBOL_GPL(tc3589x_block_read);

/**
- * tc35892_block_write() - write multiple TC35892 registers
- * @tc35892: Device to write to
+ * tc3589x_block_write() - write multiple TC3589x registers
+ * @tc3589x: Device to write to
* @reg: First register
* @length: Number of registers
* @values: Values to write
*/
-int tc35892_block_write(struct tc35892 *tc35892, u8 reg, u8 length,
+int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
const u8 *values)
{
int ret;

- ret = i2c_smbus_write_i2c_block_data(tc35892->i2c, reg, length,
+ ret = i2c_smbus_write_i2c_block_data(tc3589x->i2c, reg, length,
values);
if (ret < 0)
- dev_err(tc35892->dev, "failed to write regs %#x: %d\n",
+ dev_err(tc3589x->dev, "failed to write regs %#x: %d\n",
reg, ret);

return ret;
}
-EXPORT_SYMBOL_GPL(tc35892_block_write);
+EXPORT_SYMBOL_GPL(tc3589x_block_write);

/**
- * tc35892_set_bits() - set the value of a bitfield in a TC35892 register
- * @tc35892: Device to write to
+ * tc3589x_set_bits() - set the value of a bitfield in a TC3589x register
+ * @tc3589x: Device to write to
* @reg: Register to write
* @mask: Mask of bits to set
* @values: Value to set
*/
-int tc35892_set_bits(struct tc35892 *tc35892, u8 reg, u8 mask, u8 val)
+int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val)
{
int ret;

- mutex_lock(&tc35892->lock);
+ mutex_lock(&tc3589x->lock);

- ret = tc35892_reg_read(tc35892, reg);
+ ret = tc3589x_reg_read(tc3589x, reg);
if (ret < 0)
goto out;

ret &= ~mask;
ret |= val;

- ret = tc35892_reg_write(tc35892, reg, ret);
+ ret = tc3589x_reg_write(tc3589x, reg, ret);

out:
- mutex_unlock(&tc35892->lock);
+ mutex_unlock(&tc3589x->lock);
return ret;
}
-EXPORT_SYMBOL_GPL(tc35892_set_bits);
+EXPORT_SYMBOL_GPL(tc3589x_set_bits);

static struct resource gpio_resources[] = {
{
- .start = TC35892_INT_GPIIRQ,
- .end = TC35892_INT_GPIIRQ,
+ .start = TC3589x_INT_GPIIRQ,
+ .end = TC3589x_INT_GPIIRQ,
.flags = IORESOURCE_IRQ,
},
};

-static struct mfd_cell tc35892_devs[] = {
+static struct mfd_cell tc3589x_devs[] = {
{
- .name = "tc35892-gpio",
+ .name = "tc3589x-gpio",
.num_resources = ARRAY_SIZE(gpio_resources),
.resources = &gpio_resources[0],
},
};

-static irqreturn_t tc35892_irq(int irq, void *data)
+static irqreturn_t tc3589x_irq(int irq, void *data)
{
- struct tc35892 *tc35892 = data;
+ struct tc3589x *tc3589x = data;
int status;

- status = tc35892_reg_read(tc35892, TC35892_IRQST);
+ status = tc3589x_reg_read(tc3589x, TC3589x_IRQST);
if (status < 0)
return IRQ_NONE;

while (status) {
int bit = __ffs(status);

- handle_nested_irq(tc35892->irq_base + bit);
+ handle_nested_irq(tc3589x->irq_base + bit);
status &= ~(1 << bit);
}

@@ -158,30 +158,30 @@ static irqreturn_t tc35892_irq(int irq, void *data)
* have the last interrupt clear (for example, GPIO IC write) take
* effect.
*/
- tc35892_reg_read(tc35892, TC35892_IRQST);
+ tc3589x_reg_read(tc3589x, TC3589x_IRQST);

return IRQ_HANDLED;
}

-static void tc35892_irq_dummy(unsigned int irq)
+static void tc3589x_irq_dummy(unsigned int irq)
{
/* No mask/unmask at this level */
}

-static struct irq_chip tc35892_irq_chip = {
- .name = "tc35892",
- .mask = tc35892_irq_dummy,
- .unmask = tc35892_irq_dummy,
+static struct irq_chip tc3589x_irq_chip = {
+ .name = "tc3589x",
+ .mask = tc3589x_irq_dummy,
+ .unmask = tc3589x_irq_dummy,
};

-static int tc35892_irq_init(struct tc35892 *tc35892)
+static int tc3589x_irq_init(struct tc3589x *tc3589x)
{
- int base = tc35892->irq_base;
+ int base = tc3589x->irq_base;
int irq;

- for (irq = base; irq < base + TC35892_NR_INTERNAL_IRQS; irq++) {
- set_irq_chip_data(irq, tc35892);
- set_irq_chip_and_handler(irq, &tc35892_irq_chip,
+ for (irq = base; irq < base + TC3589x_NR_INTERNAL_IRQS; irq++) {
+ set_irq_chip_data(irq, tc3589x);
+ set_irq_chip_and_handler(irq, &tc3589x_irq_chip,
handle_edge_irq);
set_irq_nested_thread(irq, 1);
#ifdef CONFIG_ARM
@@ -194,12 +194,12 @@ static int tc35892_irq_init(struct tc35892 *tc35892)
return 0;
}

-static void tc35892_irq_remove(struct tc35892 *tc35892)
+static void tc3589x_irq_remove(struct tc3589x *tc3589x)
{
- int base = tc35892->irq_base;
+ int base = tc3589x->irq_base;
int irq;

- for (irq = base; irq < base + TC35892_NR_INTERNAL_IRQS; irq++) {
+ for (irq = base; irq < base + TC3589x_NR_INTERNAL_IRQS; irq++) {
#ifdef CONFIG_ARM
set_irq_flags(irq, 0);
#endif
@@ -208,138 +208,138 @@ static void tc35892_irq_remove(struct tc35892 *tc35892)
}
}

-static int tc35892_chip_init(struct tc35892 *tc35892)
+static int tc3589x_chip_init(struct tc3589x *tc3589x)
{
int manf, ver, ret;

- manf = tc35892_reg_read(tc35892, TC35892_MANFCODE);
+ manf = tc3589x_reg_read(tc3589x, TC3589x_MANFCODE);
if (manf < 0)
return manf;

- ver = tc35892_reg_read(tc35892, TC35892_VERSION);
+ ver = tc3589x_reg_read(tc3589x, TC3589x_VERSION);
if (ver < 0)
return ver;

- if (manf != TC35892_MANFCODE_MAGIC) {
- dev_err(tc35892->dev, "unknown manufacturer: %#x\n", manf);
+ if (manf != TC3589x_MANFCODE_MAGIC) {
+ dev_err(tc3589x->dev, "unknown manufacturer: %#x\n", manf);
return -EINVAL;
}

- dev_info(tc35892->dev, "manufacturer: %#x, version: %#x\n", manf, ver);
+ dev_info(tc3589x->dev, "manufacturer: %#x, version: %#x\n", manf, ver);

/* Put everything except the IRQ module into reset */
- ret = tc35892_reg_write(tc35892, TC35892_RSTCTRL,
- TC35892_RSTCTRL_TIMRST
- | TC35892_RSTCTRL_ROTRST
- | TC35892_RSTCTRL_KBDRST
- | TC35892_RSTCTRL_GPIRST);
+ ret = tc3589x_reg_write(tc3589x, TC3589x_RSTCTRL,
+ TC3589x_RSTCTRL_TIMRST
+ | TC3589x_RSTCTRL_ROTRST
+ | TC3589x_RSTCTRL_KBDRST
+ | TC3589x_RSTCTRL_GPIRST);
if (ret < 0)
return ret;

/* Clear the reset interrupt. */
- return tc35892_reg_write(tc35892, TC35892_RSTINTCLR, 0x1);
+ return tc3589x_reg_write(tc3589x, TC3589x_RSTINTCLR, 0x1);
}

-static int __devinit tc35892_probe(struct i2c_client *i2c,
+static int __devinit tc3589x_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
- struct tc35892_platform_data *pdata = i2c->dev.platform_data;
- struct tc35892 *tc35892;
+ struct tc3589x_platform_data *pdata = i2c->dev.platform_data;
+ struct tc3589x *tc3589x;
int ret;

if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA
| I2C_FUNC_SMBUS_I2C_BLOCK))
return -EIO;

- tc35892 = kzalloc(sizeof(struct tc35892), GFP_KERNEL);
- if (!tc35892)
+ tc3589x = kzalloc(sizeof(struct tc3589x), GFP_KERNEL);
+ if (!tc3589x)
return -ENOMEM;

- mutex_init(&tc35892->lock);
+ mutex_init(&tc3589x->lock);

- tc35892->dev = &i2c->dev;
- tc35892->i2c = i2c;
- tc35892->pdata = pdata;
- tc35892->irq_base = pdata->irq_base;
- tc35892->num_gpio = id->driver_data;
+ tc3589x->dev = &i2c->dev;
+ tc3589x->i2c = i2c;
+ tc3589x->pdata = pdata;
+ tc3589x->irq_base = pdata->irq_base;
+ tc3589x->num_gpio = id->driver_data;

- i2c_set_clientdata(i2c, tc35892);
+ i2c_set_clientdata(i2c, tc3589x);

- ret = tc35892_chip_init(tc35892);
+ ret = tc3589x_chip_init(tc3589x);
if (ret)
goto out_free;

- ret = tc35892_irq_init(tc35892);
+ ret = tc3589x_irq_init(tc3589x);
if (ret)
goto out_free;

- ret = request_threaded_irq(tc35892->i2c->irq, NULL, tc35892_irq,
+ ret = request_threaded_irq(tc3589x->i2c->irq, NULL, tc3589x_irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
- "tc35892", tc35892);
+ "tc3589x", tc3589x);
if (ret) {
- dev_err(tc35892->dev, "failed to request IRQ: %d\n", ret);
+ dev_err(tc3589x->dev, "failed to request IRQ: %d\n", ret);
goto out_removeirq;
}

- ret = mfd_add_devices(tc35892->dev, -1, tc35892_devs,
- ARRAY_SIZE(tc35892_devs), NULL,
- tc35892->irq_base);
+ ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_devs,
+ ARRAY_SIZE(tc3589x_devs), NULL,
+ tc3589x->irq_base);
if (ret) {
- dev_err(tc35892->dev, "failed to add children\n");
+ dev_err(tc3589x->dev, "failed to add children\n");
goto out_freeirq;
}

return 0;

out_freeirq:
- free_irq(tc35892->i2c->irq, tc35892);
+ free_irq(tc3589x->i2c->irq, tc3589x);
out_removeirq:
- tc35892_irq_remove(tc35892);
+ tc3589x_irq_remove(tc3589x);
out_free:
- kfree(tc35892);
+ kfree(tc3589x);
return ret;
}

-static int __devexit tc35892_remove(struct i2c_client *client)
+static int __devexit tc3589x_remove(struct i2c_client *client)
{
- struct tc35892 *tc35892 = i2c_get_clientdata(client);
+ struct tc3589x *tc3589x = i2c_get_clientdata(client);

- mfd_remove_devices(tc35892->dev);
+ mfd_remove_devices(tc3589x->dev);

- free_irq(tc35892->i2c->irq, tc35892);
- tc35892_irq_remove(tc35892);
+ free_irq(tc3589x->i2c->irq, tc3589x);
+ tc3589x_irq_remove(tc3589x);

- kfree(tc35892);
+ kfree(tc3589x);

return 0;
}

-static const struct i2c_device_id tc35892_id[] = {
- { "tc35892", 24 },
+static const struct i2c_device_id tc3589x_id[] = {
+ { "tc3589x", 24 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, tc35892_id);
+MODULE_DEVICE_TABLE(i2c, tc3589x_id);

-static struct i2c_driver tc35892_driver = {
- .driver.name = "tc35892",
+static struct i2c_driver tc3589x_driver = {
+ .driver.name = "tc3589x",
.driver.owner = THIS_MODULE,
- .probe = tc35892_probe,
- .remove = __devexit_p(tc35892_remove),
- .id_table = tc35892_id,
+ .probe = tc3589x_probe,
+ .remove = __devexit_p(tc3589x_remove),
+ .id_table = tc3589x_id,
};

-static int __init tc35892_init(void)
+static int __init tc3589x_init(void)
{
- return i2c_add_driver(&tc35892_driver);
+ return i2c_add_driver(&tc3589x_driver);
}
-subsys_initcall(tc35892_init);
+subsys_initcall(tc3589x_init);

-static void __exit tc35892_exit(void)
+static void __exit tc3589x_exit(void)
{
- i2c_del_driver(&tc35892_driver);
+ i2c_del_driver(&tc3589x_driver);
}
-module_exit(tc35892_exit);
+module_exit(tc3589x_exit);

MODULE_LICENSE("GPL v2");
-MODULE_DESCRIPTION("TC35892 MFD core driver");
+MODULE_DESCRIPTION("TC3589x MFD core driver");
MODULE_AUTHOR("Hanumath Prasad, Rabin Vincent");
diff --git a/include/linux/mfd/tc3589x.h b/include/linux/mfd/tc3589x.h
index eff3094..ea19188 100644
--- a/include/linux/mfd/tc3589x.h
+++ b/include/linux/mfd/tc3589x.h
@@ -4,133 +4,133 @@
* License Terms: GNU General Public License, version 2
*/

-#ifndef __LINUX_MFD_TC35892_H
-#define __LINUX_MFD_TC35892_H
+#ifndef __LINUX_MFD_TC3589x_H
+#define __LINUX_MFD_TC3589x_H

#include <linux/device.h>

-#define TC35892_RSTCTRL_IRQRST (1 << 4)
-#define TC35892_RSTCTRL_TIMRST (1 << 3)
-#define TC35892_RSTCTRL_ROTRST (1 << 2)
-#define TC35892_RSTCTRL_KBDRST (1 << 1)
-#define TC35892_RSTCTRL_GPIRST (1 << 0)
-
-#define TC35892_IRQST 0x91
-
-#define TC35892_MANFCODE_MAGIC 0x03
-#define TC35892_MANFCODE 0x80
-#define TC35892_VERSION 0x81
-#define TC35892_IOCFG 0xA7
-
-#define TC35892_CLKMODE 0x88
-#define TC35892_CLKCFG 0x89
-#define TC35892_CLKEN 0x8A
-
-#define TC35892_RSTCTRL 0x82
-#define TC35892_EXTRSTN 0x83
-#define TC35892_RSTINTCLR 0x84
-
-#define TC35892_GPIOIS0 0xC9
-#define TC35892_GPIOIS1 0xCA
-#define TC35892_GPIOIS2 0xCB
-#define TC35892_GPIOIBE0 0xCC
-#define TC35892_GPIOIBE1 0xCD
-#define TC35892_GPIOIBE2 0xCE
-#define TC35892_GPIOIEV0 0xCF
-#define TC35892_GPIOIEV1 0xD0
-#define TC35892_GPIOIEV2 0xD1
-#define TC35892_GPIOIE0 0xD2
-#define TC35892_GPIOIE1 0xD3
-#define TC35892_GPIOIE2 0xD4
-#define TC35892_GPIORIS0 0xD6
-#define TC35892_GPIORIS1 0xD7
-#define TC35892_GPIORIS2 0xD8
-#define TC35892_GPIOMIS0 0xD9
-#define TC35892_GPIOMIS1 0xDA
-#define TC35892_GPIOMIS2 0xDB
-#define TC35892_GPIOIC0 0xDC
-#define TC35892_GPIOIC1 0xDD
-#define TC35892_GPIOIC2 0xDE
-
-#define TC35892_GPIODATA0 0xC0
-#define TC35892_GPIOMASK0 0xc1
-#define TC35892_GPIODATA1 0xC2
-#define TC35892_GPIOMASK1 0xc3
-#define TC35892_GPIODATA2 0xC4
-#define TC35892_GPIOMASK2 0xC5
-
-#define TC35892_GPIODIR0 0xC6
-#define TC35892_GPIODIR1 0xC7
-#define TC35892_GPIODIR2 0xC8
-
-#define TC35892_GPIOSYNC0 0xE6
-#define TC35892_GPIOSYNC1 0xE7
-#define TC35892_GPIOSYNC2 0xE8
-
-#define TC35892_GPIOWAKE0 0xE9
-#define TC35892_GPIOWAKE1 0xEA
-#define TC35892_GPIOWAKE2 0xEB
-
-#define TC35892_GPIOODM0 0xE0
-#define TC35892_GPIOODE0 0xE1
-#define TC35892_GPIOODM1 0xE2
-#define TC35892_GPIOODE1 0xE3
-#define TC35892_GPIOODM2 0xE4
-#define TC35892_GPIOODE2 0xE5
-
-#define TC35892_INT_GPIIRQ 0
-#define TC35892_INT_TI0IRQ 1
-#define TC35892_INT_TI1IRQ 2
-#define TC35892_INT_TI2IRQ 3
-#define TC35892_INT_ROTIRQ 5
-#define TC35892_INT_KBDIRQ 6
-#define TC35892_INT_PORIRQ 7
-
-#define TC35892_NR_INTERNAL_IRQS 8
-#define TC35892_INT_GPIO(x) (TC35892_NR_INTERNAL_IRQS + (x))
-
-struct tc35892 {
+#define TC3589x_RSTCTRL_IRQRST (1 << 4)
+#define TC3589x_RSTCTRL_TIMRST (1 << 3)
+#define TC3589x_RSTCTRL_ROTRST (1 << 2)
+#define TC3589x_RSTCTRL_KBDRST (1 << 1)
+#define TC3589x_RSTCTRL_GPIRST (1 << 0)
+
+#define TC3589x_IRQST 0x91
+
+#define TC3589x_MANFCODE_MAGIC 0x03
+#define TC3589x_MANFCODE 0x80
+#define TC3589x_VERSION 0x81
+#define TC3589x_IOCFG 0xA7
+
+#define TC3589x_CLKMODE 0x88
+#define TC3589x_CLKCFG 0x89
+#define TC3589x_CLKEN 0x8A
+
+#define TC3589x_RSTCTRL 0x82
+#define TC3589x_EXTRSTN 0x83
+#define TC3589x_RSTINTCLR 0x84
+
+#define TC3589x_GPIOIS0 0xC9
+#define TC3589x_GPIOIS1 0xCA
+#define TC3589x_GPIOIS2 0xCB
+#define TC3589x_GPIOIBE0 0xCC
+#define TC3589x_GPIOIBE1 0xCD
+#define TC3589x_GPIOIBE2 0xCE
+#define TC3589x_GPIOIEV0 0xCF
+#define TC3589x_GPIOIEV1 0xD0
+#define TC3589x_GPIOIEV2 0xD1
+#define TC3589x_GPIOIE0 0xD2
+#define TC3589x_GPIOIE1 0xD3
+#define TC3589x_GPIOIE2 0xD4
+#define TC3589x_GPIORIS0 0xD6
+#define TC3589x_GPIORIS1 0xD7
+#define TC3589x_GPIORIS2 0xD8
+#define TC3589x_GPIOMIS0 0xD9
+#define TC3589x_GPIOMIS1 0xDA
+#define TC3589x_GPIOMIS2 0xDB
+#define TC3589x_GPIOIC0 0xDC
+#define TC3589x_GPIOIC1 0xDD
+#define TC3589x_GPIOIC2 0xDE
+
+#define TC3589x_GPIODATA0 0xC0
+#define TC3589x_GPIOMASK0 0xc1
+#define TC3589x_GPIODATA1 0xC2
+#define TC3589x_GPIOMASK1 0xc3
+#define TC3589x_GPIODATA2 0xC4
+#define TC3589x_GPIOMASK2 0xC5
+
+#define TC3589x_GPIODIR0 0xC6
+#define TC3589x_GPIODIR1 0xC7
+#define TC3589x_GPIODIR2 0xC8
+
+#define TC3589x_GPIOSYNC0 0xE6
+#define TC3589x_GPIOSYNC1 0xE7
+#define TC3589x_GPIOSYNC2 0xE8
+
+#define TC3589x_GPIOWAKE0 0xE9
+#define TC3589x_GPIOWAKE1 0xEA
+#define TC3589x_GPIOWAKE2 0xEB
+
+#define TC3589x_GPIOODM0 0xE0
+#define TC3589x_GPIOODE0 0xE1
+#define TC3589x_GPIOODM1 0xE2
+#define TC3589x_GPIOODE1 0xE3
+#define TC3589x_GPIOODM2 0xE4
+#define TC3589x_GPIOODE2 0xE5
+
+#define TC3589x_INT_GPIIRQ 0
+#define TC3589x_INT_TI0IRQ 1
+#define TC3589x_INT_TI1IRQ 2
+#define TC3589x_INT_TI2IRQ 3
+#define TC3589x_INT_ROTIRQ 5
+#define TC3589x_INT_KBDIRQ 6
+#define TC3589x_INT_PORIRQ 7
+
+#define TC3589x_NR_INTERNAL_IRQS 8
+#define TC3589x_INT_GPIO(x) (TC3589x_NR_INTERNAL_IRQS + (x))
+
+struct tc3589x {
struct mutex lock;
struct device *dev;
struct i2c_client *i2c;

int irq_base;
int num_gpio;
- struct tc35892_platform_data *pdata;
+ struct tc3589x_platform_data *pdata;
};

-extern int tc35892_reg_write(struct tc35892 *tc35892, u8 reg, u8 data);
-extern int tc35892_reg_read(struct tc35892 *tc35892, u8 reg);
-extern int tc35892_block_read(struct tc35892 *tc35892, u8 reg, u8 length,
+extern int tc3589x_reg_write(struct tc3589x *tc3589x, u8 reg, u8 data);
+extern int tc3589x_reg_read(struct tc3589x *tc3589x, u8 reg);
+extern int tc3589x_block_read(struct tc3589x *tc3589x, u8 reg, u8 length,
u8 *values);
-extern int tc35892_block_write(struct tc35892 *tc35892, u8 reg, u8 length,
+extern int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
const u8 *values);
-extern int tc35892_set_bits(struct tc35892 *tc35892, u8 reg, u8 mask, u8 val);
+extern int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val);

/**
- * struct tc35892_gpio_platform_data - TC35892 GPIO platform data
- * @gpio_base: first gpio number assigned to TC35892. A maximum of
- * %TC35892_NR_GPIOS GPIOs will be allocated.
+ * struct tc3589x_gpio_platform_data - TC3589x GPIO platform data
+ * @gpio_base: first gpio number assigned to TC3589x. A maximum of
+ * %TC3589x_NR_GPIOS GPIOs will be allocated.
* @setup: callback for board-specific initialization
* @remove: callback for board-specific teardown
*/
-struct tc35892_gpio_platform_data {
+struct tc3589x_gpio_platform_data {
int gpio_base;
- void (*setup)(struct tc35892 *tc35892, unsigned gpio_base);
- void (*remove)(struct tc35892 *tc35892, unsigned gpio_base);
+ void (*setup)(struct tc3589x *tc3589x, unsigned gpio_base);
+ void (*remove)(struct tc3589x *tc3589x, unsigned gpio_base);
};

/**
- * struct tc35892_platform_data - TC35892 platform data
- * @irq_base: base IRQ number. %TC35892_NR_IRQS irqs will be used.
+ * struct tc3589x_platform_data - TC3589x platform data
+ * @irq_base: base IRQ number. %TC3589x_NR_IRQS irqs will be used.
* @gpio: GPIO-specific platform data
*/
-struct tc35892_platform_data {
+struct tc3589x_platform_data {
int irq_base;
- struct tc35892_gpio_platform_data *gpio;
+ struct tc3589x_gpio_platform_data *gpio;
};

-#define TC35892_NR_GPIOS 24
-#define TC35892_NR_IRQS TC35892_INT_GPIO(TC35892_NR_GPIOS)
+#define TC3589x_NR_GPIOS 24
+#define TC3589x_NR_IRQS TC3589x_INT_GPIO(TC3589x_NR_GPIOS)

#endif
--
1.7.2.dirty

2010-12-03 15:32:18

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 19/20] mach-ux500: clean up checkpatch spits

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/clock.c | 118 +++++++++++++++++++++---------------------
1 files changed, 59 insertions(+), 59 deletions(-)

diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
index 6657b05..ca01368 100644
--- a/arch/arm/mach-ux500/clock.c
+++ b/arch/arm/mach-ux500/clock.c
@@ -334,92 +334,92 @@ static DEFINE_PRCMU_CLK(uiccclk, 0x4, 1, UICCCLK); /* v1 */
*/

/* Peripheral Cluster #1 */
-static DEFINE_PRCC_CLK(1, i2c4, 10, 9, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, i2c4, 10, 9, &clk_i2cclk);
static DEFINE_PRCC_CLK(1, gpio0, 9, -1, NULL);
-static DEFINE_PRCC_CLK(1, slimbus0, 8, 8, &clk_slimclk);
-static DEFINE_PRCC_CLK(1, spi3_ed, 7, 7, NULL);
-static DEFINE_PRCC_CLK(1, spi3_v1, 7, -1, NULL);
-static DEFINE_PRCC_CLK(1, i2c2, 6, 6, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, slimbus0, 8, 8, &clk_slimclk);
+static DEFINE_PRCC_CLK(1, spi3_ed, 7, 7, NULL);
+static DEFINE_PRCC_CLK(1, spi3_v1, 7, -1, NULL);
+static DEFINE_PRCC_CLK(1, i2c2, 6, 6, &clk_i2cclk);
static DEFINE_PRCC_CLK(1, sdi0, 5, 5, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(1, msp1_ed, 4, 4, &clk_msp02clk);
-static DEFINE_PRCC_CLK(1, msp1_v1, 4, 4, &clk_msp1clk);
-static DEFINE_PRCC_CLK(1, msp0, 3, 3, &clk_msp02clk);
-static DEFINE_PRCC_CLK(1, i2c1, 2, 2, &clk_i2cclk);
-static DEFINE_PRCC_CLK(1, uart1, 1, 1, &clk_uartclk);
-static DEFINE_PRCC_CLK(1, uart0, 0, 0, &clk_uartclk);
+static DEFINE_PRCC_CLK(1, msp1_ed, 4, 4, &clk_msp02clk);
+static DEFINE_PRCC_CLK(1, msp1_v1, 4, 4, &clk_msp1clk);
+static DEFINE_PRCC_CLK(1, msp0, 3, 3, &clk_msp02clk);
+static DEFINE_PRCC_CLK(1, i2c1, 2, 2, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, uart1, 1, 1, &clk_uartclk);
+static DEFINE_PRCC_CLK(1, uart0, 0, 0, &clk_uartclk);

/* Peripheral Cluster #2 */

static DEFINE_PRCC_CLK(2, gpio1_ed, 12, -1, NULL);
-static DEFINE_PRCC_CLK(2, ssitx_ed, 11, -1, NULL);
-static DEFINE_PRCC_CLK(2, ssirx_ed, 10, -1, NULL);
-static DEFINE_PRCC_CLK(2, spi0_ed, 9, -1, NULL);
-static DEFINE_PRCC_CLK(2, sdi3_ed, 8, 6, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, sdi1_ed, 7, 5, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, msp2_ed, 6, 4, &clk_msp02clk);
-static DEFINE_PRCC_CLK(2, sdi4_ed, 4, 2, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, ssitx_ed, 11, -1, NULL);
+static DEFINE_PRCC_CLK(2, ssirx_ed, 10, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi0_ed, 9, -1, NULL);
+static DEFINE_PRCC_CLK(2, sdi3_ed, 8, 6, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, sdi1_ed, 7, 5, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, msp2_ed, 6, 4, &clk_msp02clk);
+static DEFINE_PRCC_CLK(2, sdi4_ed, 4, 2, &clk_sdmmcclk);
static DEFINE_PRCC_CLK(2, pwl_ed, 3, 1, NULL);
-static DEFINE_PRCC_CLK(2, spi1_ed, 2, -1, NULL);
-static DEFINE_PRCC_CLK(2, spi2_ed, 1, -1, NULL);
-static DEFINE_PRCC_CLK(2, i2c3_ed, 0, 0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(2, spi1_ed, 2, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi2_ed, 1, -1, NULL);
+static DEFINE_PRCC_CLK(2, i2c3_ed, 0, 0, &clk_i2cclk);

static DEFINE_PRCC_CLK(2, gpio1_v1, 11, -1, NULL);
-static DEFINE_PRCC_CLK(2, ssitx_v1, 10, 7, NULL);
-static DEFINE_PRCC_CLK(2, ssirx_v1, 9, 6, NULL);
-static DEFINE_PRCC_CLK(2, spi0_v1, 8, -1, NULL);
-static DEFINE_PRCC_CLK(2, sdi3_v1, 7, 5, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, sdi1_v1, 6, 4, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, msp2_v1, 5, 3, &clk_msp02clk);
-static DEFINE_PRCC_CLK(2, sdi4_v1, 4, 2, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, ssitx_v1, 10, 7, NULL);
+static DEFINE_PRCC_CLK(2, ssirx_v1, 9, 6, NULL);
+static DEFINE_PRCC_CLK(2, spi0_v1, 8, -1, NULL);
+static DEFINE_PRCC_CLK(2, sdi3_v1, 7, 5, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, sdi1_v1, 6, 4, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, msp2_v1, 5, 3, &clk_msp02clk);
+static DEFINE_PRCC_CLK(2, sdi4_v1, 4, 2, &clk_sdmmcclk);
static DEFINE_PRCC_CLK(2, pwl_v1, 3, 1, NULL);
-static DEFINE_PRCC_CLK(2, spi1_v1, 2, -1, NULL);
-static DEFINE_PRCC_CLK(2, spi2_v1, 1, -1, NULL);
-static DEFINE_PRCC_CLK(2, i2c3_v1, 0, 0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(2, spi1_v1, 2, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi2_v1, 1, -1, NULL);
+static DEFINE_PRCC_CLK(2, i2c3_v1, 0, 0, &clk_i2cclk);

/* Peripheral Cluster #3 */
-static DEFINE_PRCC_CLK(3, gpio2, 8, -1, NULL);
-static DEFINE_PRCC_CLK(3, sdi5, 7, 7, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(3, uart2, 6, 6, &clk_uartclk);
-static DEFINE_PRCC_CLK(3, ske, 5, 5, &clk_32khz);
-static DEFINE_PRCC_CLK(3, sdi2, 4, 4, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(3, i2c0, 3, 3, &clk_i2cclk);
-static DEFINE_PRCC_CLK(3, ssp1_ed, 2, 2, &clk_i2cclk);
-static DEFINE_PRCC_CLK(3, ssp0_ed, 1, 1, &clk_i2cclk);
-static DEFINE_PRCC_CLK(3, ssp1_v1, 2, 2, &clk_sspclk);
-static DEFINE_PRCC_CLK(3, ssp0_v1, 1, 1, &clk_sspclk);
-static DEFINE_PRCC_CLK(3, fsmc, 0, -1, NULL);
+static DEFINE_PRCC_CLK(3, gpio2, 8, -1, NULL);
+static DEFINE_PRCC_CLK(3, sdi5, 7, 7, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(3, uart2, 6, 6, &clk_uartclk);
+static DEFINE_PRCC_CLK(3, ske, 5, 5, &clk_32khz);
+static DEFINE_PRCC_CLK(3, sdi2, 4, 4, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(3, i2c0, 3, 3, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp1_ed, 2, 2, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp0_ed, 1, 1, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp1_v1, 2, 2, &clk_sspclk);
+static DEFINE_PRCC_CLK(3, ssp0_v1, 1, 1, &clk_sspclk);
+static DEFINE_PRCC_CLK(3, fsmc, 0, -1, NULL);

/* Peripheral Cluster #4 is in the always on domain */

/* Peripheral Cluster #5 */
-static DEFINE_PRCC_CLK(5, gpio3, 1, -1, NULL);
-static DEFINE_PRCC_CLK(5, usb_ed, 0, 0, &clk_i2cclk);
-static DEFINE_PRCC_CLK(5, usb_v1, 0, 0, NULL);
+static DEFINE_PRCC_CLK(5, gpio3, 1, -1, NULL);
+static DEFINE_PRCC_CLK(5, usb_ed, 0, 0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(5, usb_v1, 0, 0, NULL);

/* Peripheral Cluster #6 */

/* MTU ID in data */
static DEFINE_PRCC_CLK_CUSTOM(6, mtu1_v1, 8, -1, NULL, clk_mtu_get_rate, 1);
static DEFINE_PRCC_CLK_CUSTOM(6, mtu0_v1, 7, -1, NULL, clk_mtu_get_rate, 0);
-static DEFINE_PRCC_CLK(6, cfgreg_v1, 6, 6, NULL);
-static DEFINE_PRCC_CLK(6, dmc_ed, 6, 6, NULL);
-static DEFINE_PRCC_CLK(6, hash1, 5, -1, NULL);
-static DEFINE_PRCC_CLK(6, unipro_v1, 4, 1, &clk_uniproclk);
-static DEFINE_PRCC_CLK(6, cryp1_ed, 4, -1, NULL);
-static DEFINE_PRCC_CLK(6, pka, 3, -1, NULL);
-static DEFINE_PRCC_CLK(6, hash0, 2, -1, NULL);
-static DEFINE_PRCC_CLK(6, cryp0, 1, -1, NULL);
-static DEFINE_PRCC_CLK(6, rng_ed, 0, 0, &clk_i2cclk);
-static DEFINE_PRCC_CLK(6, rng_v1, 0, 0, &clk_rngclk);
+static DEFINE_PRCC_CLK(6, cfgreg_v1, 6, 6, NULL);
+static DEFINE_PRCC_CLK(6, dmc_ed, 6, 6, NULL);
+static DEFINE_PRCC_CLK(6, hash1, 5, -1, NULL);
+static DEFINE_PRCC_CLK(6, unipro_v1, 4, 1, &clk_uniproclk);
+static DEFINE_PRCC_CLK(6, cryp1_ed, 4, -1, NULL);
+static DEFINE_PRCC_CLK(6, pka, 3, -1, NULL);
+static DEFINE_PRCC_CLK(6, hash0, 2, -1, NULL);
+static DEFINE_PRCC_CLK(6, cryp0, 1, -1, NULL);
+static DEFINE_PRCC_CLK(6, rng_ed, 0, 0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(6, rng_v1, 0, 0, &clk_rngclk);

/* Peripheral Cluster #7 */

-static DEFINE_PRCC_CLK(7, tzpc0_ed, 4, -1, NULL);
+static DEFINE_PRCC_CLK(7, tzpc0_ed, 4, -1, NULL);
/* MTU ID in data */
static DEFINE_PRCC_CLK_CUSTOM(7, mtu1_ed, 3, -1, NULL, clk_mtu_get_rate, 1);
static DEFINE_PRCC_CLK_CUSTOM(7, mtu0_ed, 2, -1, NULL, clk_mtu_get_rate, 0);
-static DEFINE_PRCC_CLK(7, wdg_ed, 1, -1, NULL);
-static DEFINE_PRCC_CLK(7, cfgreg_ed, 0, -1, NULL);
+static DEFINE_PRCC_CLK(7, wdg_ed, 1, -1, NULL);
+static DEFINE_PRCC_CLK(7, cfgreg_ed, 0, -1, NULL);

static struct clk clk_dummy_apb_pclk;

@@ -522,7 +522,7 @@ static struct clk_lookup u8500_ed_clks[] = {

static struct clk_lookup u8500_v1_clks[] = {
/* Peripheral Cluster #1 */
- CLK(i2c4, "nmk-i2c.4", NULL),
+ CLK(i2c4, "nmk-i2c.4", NULL),
CLK(spi3_v1, "spi3", NULL),
CLK(msp1_v1, "msp1", NULL),

--
1.7.2.dirty

2010-12-03 15:32:17

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 01/20] mfd/ab8500: remove spi support

Since the Ab8500 v1.0, the SPI support is deprecated on the HW.

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/mfd/Kconfig | 8 +-
drivers/mfd/Makefile | 2 +-
drivers/mfd/ab8500-spi.c | 143 ----------------------------------------------
3 files changed, 5 insertions(+), 148 deletions(-)
delete mode 100644 drivers/mfd/ab8500-spi.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 3a7b891..c856aa7 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -496,13 +496,13 @@ config EZX_PCAP

config AB8500_CORE
bool "ST-Ericsson AB8500 Mixed Signal Power Management chip"
- depends on GENERIC_HARDIRQS && ABX500_CORE && SPI_MASTER && ARCH_U8500
+ depends on GENERIC_HARDIRQS && ABX500_CORE && ARCH_U8500
select MFD_CORE
help
Select this option to enable access to AB8500 power management
- chip. This connects to U8500 either on the SSP/SPI bus
- or the I2C bus via PRCMU. It also adds the irq_chip
- parts for handling the Mixed Signal chip events.
+ chip. This connects to U8500 either on the SSP/SPI bus (deprecated
+ since hardware version v1.0) or the I2C bus via PRCMU. It also adds
+ the irq_chip parts for handling the Mixed Signal chip events.
This chip embeds various other multimedia funtionalities as well.

config AB8500_I2C_CORE
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 04a7226..67c8bcb 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -70,7 +70,7 @@ obj-$(CONFIG_ABX500_CORE) += abx500-core.o
obj-$(CONFIG_AB3100_CORE) += ab3100-core.o
obj-$(CONFIG_AB3100_OTP) += ab3100-otp.o
obj-$(CONFIG_AB3550_CORE) += ab3550-core.o
-obj-$(CONFIG_AB8500_CORE) += ab8500-core.o ab8500-spi.o
+obj-$(CONFIG_AB8500_CORE) += ab8500-core.o
obj-$(CONFIG_AB8500_I2C_CORE) += ab8500-i2c.o
obj-$(CONFIG_AB8500_DEBUG) += ab8500-debugfs.o
obj-$(CONFIG_MFD_TIMBERDALE) += timberdale.o
diff --git a/drivers/mfd/ab8500-spi.c b/drivers/mfd/ab8500-spi.c
deleted file mode 100644
index b165342..0000000
--- a/drivers/mfd/ab8500-spi.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2010
- *
- * License Terms: GNU General Public License v2
- * Author: Srinidhi Kasagar <[email protected]>
- */
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/ab8500.h>
-
-/*
- * This funtion writes to any AB8500 registers using
- * SPI protocol & before it writes it packs the data
- * in the below 24 bit frame format
- *
- * *|------------------------------------|
- * *| 23|22...18|17.......10|9|8|7......0|
- * *| r/w bank adr data |
- * * ------------------------------------
- *
- * This function shouldn't be called from interrupt
- * context
- */
-static int ab8500_spi_write(struct ab8500 *ab8500, u16 addr, u8 data)
-{
- struct spi_device *spi = container_of(ab8500->dev, struct spi_device,
- dev);
- unsigned long spi_data = addr << 10 | data;
- struct spi_transfer xfer;
- struct spi_message msg;
-
- ab8500->tx_buf[0] = spi_data;
- ab8500->rx_buf[0] = 0;
-
- xfer.tx_buf = ab8500->tx_buf;
- xfer.rx_buf = NULL;
- xfer.len = sizeof(unsigned long);
-
- spi_message_init(&msg);
- spi_message_add_tail(&xfer, &msg);
-
- return spi_sync(spi, &msg);
-}
-
-static int ab8500_spi_read(struct ab8500 *ab8500, u16 addr)
-{
- struct spi_device *spi = container_of(ab8500->dev, struct spi_device,
- dev);
- unsigned long spi_data = 1 << 23 | addr << 10;
- struct spi_transfer xfer;
- struct spi_message msg;
- int ret;
-
- ab8500->tx_buf[0] = spi_data;
- ab8500->rx_buf[0] = 0;
-
- xfer.tx_buf = ab8500->tx_buf;
- xfer.rx_buf = ab8500->rx_buf;
- xfer.len = sizeof(unsigned long);
-
- spi_message_init(&msg);
- spi_message_add_tail(&xfer, &msg);
-
- ret = spi_sync(spi, &msg);
- if (!ret)
- /*
- * Only the 8 lowermost bytes are
- * defined with value, the rest may
- * vary depending on chip/board noise.
- */
- ret = ab8500->rx_buf[0] & 0xFFU;
-
- return ret;
-}
-
-static int __devinit ab8500_spi_probe(struct spi_device *spi)
-{
- struct ab8500 *ab8500;
- int ret;
-
- spi->bits_per_word = 24;
- ret = spi_setup(spi);
- if (ret < 0)
- return ret;
-
- ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL);
- if (!ab8500)
- return -ENOMEM;
-
- ab8500->dev = &spi->dev;
- ab8500->irq = spi->irq;
-
- ab8500->read = ab8500_spi_read;
- ab8500->write = ab8500_spi_write;
-
- spi_set_drvdata(spi, ab8500);
-
- ret = ab8500_init(ab8500);
- if (ret)
- kfree(ab8500);
-
- return ret;
-}
-
-static int __devexit ab8500_spi_remove(struct spi_device *spi)
-{
- struct ab8500 *ab8500 = spi_get_drvdata(spi);
-
- ab8500_exit(ab8500);
- kfree(ab8500);
-
- return 0;
-}
-
-static struct spi_driver ab8500_spi_driver = {
- .driver = {
- .name = "ab8500-spi",
- .owner = THIS_MODULE,
- },
- .probe = ab8500_spi_probe,
- .remove = __devexit_p(ab8500_spi_remove)
-};
-
-static int __init ab8500_spi_init(void)
-{
- return spi_register_driver(&ab8500_spi_driver);
-}
-subsys_initcall(ab8500_spi_init);
-
-static void __exit ab8500_spi_exit(void)
-{
- spi_unregister_driver(&ab8500_spi_driver);
-}
-module_exit(ab8500_spi_exit);
-
-MODULE_AUTHOR("Srinidhi KASAGAR <[email protected]");
-MODULE_DESCRIPTION("AB8500 SPI");
-MODULE_LICENSE("GPL v2");
--
1.7.2.dirty

2010-12-03 15:32:17

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 02/20] mach-ux500: deprecate spi support for ab8500

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/board-mop500.c | 36 +-----------------------------------
1 files changed, 1 insertions(+), 35 deletions(-)

diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index eccbc13..28bc18b 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -76,22 +76,6 @@ static pin_cfg_t mop500_pins[] = {
GPIO217_GPIO, /* GPIO_EXP_INT */
};

-static void ab4500_spi_cs_control(u32 command)
-{
- /* set the FRM signal, which is CS - TODO */
-}
-
-struct pl022_config_chip ab4500_chip_info = {
- .com_mode = INTERRUPT_TRANSFER,
- .iface = SSP_INTERFACE_MOTOROLA_SPI,
- /* we can act as master only */
- .hierarchy = SSP_MASTER,
- .slave_tx_disable = 0,
- .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM,
- .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC,
- .cs_control = ab4500_spi_cs_control,
-};
-
static struct ab8500_platform_data ab8500_platdata = {
.irq_base = MOP500_AB8500_IRQ_BASE,
};
@@ -114,19 +98,6 @@ struct platform_device ab8500_device = {
.resource = ab8500_resources,
};

-static struct spi_board_info ab8500_spi_devices[] = {
- {
- .modalias = "ab8500-spi",
- .controller_data = &ab4500_chip_info,
- .platform_data = &ab8500_platdata,
- .max_speed_hz = 12000000,
- .bus_num = 0,
- .chip_select = 0,
- .mode = SPI_MODE_3,
- .irq = IRQ_DB8500_AB8500,
- },
-};
-
static struct pl022_ssp_controller ssp0_platform_data = {
.bus_id = 0,
/* pl022 not yet supports dma */
@@ -339,12 +310,7 @@ static void __init u8500_init_machine(void)
mop500_spi_init();
mop500_uart_init();

- /* If HW is early drop (ED) or V1.0 then use SPI to access AB8500 */
- if (cpu_is_u8500ed() || cpu_is_u8500v10())
- spi_register_board_info(ab8500_spi_devices,
- ARRAY_SIZE(ab8500_spi_devices));
- else /* If HW is v.1.1 or later use I2C to access AB8500 */
- platform_device_register(&ab8500_device);
+ platform_device_register(&ab8500_device);

i2c_register_board_info(0, mop500_i2c0_devices,
ARRAY_SIZE(mop500_i2c0_devices));
--
1.7.2.dirty

2010-12-03 15:32:39

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 10/20] input/tc3589x: add tc3589x keypad support

Add support for the keypad controller module found on the
TC3589X devices. This driver default adds the support for
TC35893 device.

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/input/keyboard/Kconfig | 10 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/tc3589x-keypad.c | 440 +++++++++++++++++++++++++++++++
drivers/mfd/tc3589x.c | 28 ++-
include/linux/mfd/tc3589x.h | 52 ++++
5 files changed, 530 insertions(+), 1 deletions(-)
create mode 100644 drivers/input/keyboard/tc3589x-keypad.c

diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index ee85e5b..0231ad3 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -452,6 +452,16 @@ config KEYBOARD_SPEAR
To compile this driver as a module, choose M here: the
module will be called spear-keboard.

+config KEYBOARD_TC3589X
+ tristate "TC3589X Keypad support"
+ depends on MFD_TC3589X
+ help
+ Say Y here if you want to use the keypad controller on
+ TC35892/3 I/O expander
+
+ To compile this driver as a module, choose M here: the
+ module will be called tc3589x-keypad
+
config KEYBOARD_TNETV107X
tristate "TI TNETV107X keypad support"
depends on ARCH_DAVINCI_TNETV107X
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 8449c73..8ff1455 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -41,6 +41,7 @@ obj-$(CONFIG_KEYBOARD_SPEAR) += spear-keyboard.o
obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o
obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
+obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o
obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o
obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o
obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c
new file mode 100644
index 0000000..1bfd49a
--- /dev/null
+++ b/drivers/input/keyboard/tc3589x-keypad.c
@@ -0,0 +1,440 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Jayeeta Banerjee <[email protected]>
+ * Author: Sundar Iyer <[email protected]>
+ *
+ * License Terms: GNU General Public License, version 2
+ *
+ * TC35893 MFD Keypad Controller driver
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/matrix_keypad.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/mfd/tc3589x.h>
+
+/* Maximum supported keypad matrix row/columns size */
+#define TC3589x_MAX_KPROW 8
+#define TC3589x_MAX_KPCOL 12
+
+/* keypad related Constants */
+#define TC3589x_MAX_DEBOUNCE_SETTLE 0xFF
+#define DEDICATED_KEY_VAL 0xFF
+
+/* Pull up/down masks */
+#define TC3589x_NO_PULL_MASK 0x0
+#define TC3589x_PULL_DOWN_MASK 0x1
+#define TC3589x_PULL_UP_MASK 0x2
+#define TC3589x_PULLUP_ALL_MASK 0xAA
+#define TC3589x_IO_PULL_VAL(index, mask) ((mask)<<((index)%4)*2))
+
+/* Bit masks for IOCFG register */
+#define IOCFG_BALLCFG 0x01
+#define IOCFG_IG 0x08
+
+#define KP_EVCODE_COL_MASK 0x0F
+#define KP_EVCODE_ROW_MASK 0x70
+#define KP_RELEASE_EVT_MASK 0x80
+
+#define KP_ROW_SHIFT 4
+
+#define KP_NO_VALID_KEY_MASK 0x7F
+
+/* bit masks for RESTCTRL register */
+#define TC3589x_KBDRST 0x2
+#define TC3589x_IRQRST 0x10
+#define TC3589x_RESET_ALL 0x1B
+
+/* KBDMFS register bit mask */
+#define TC3589x_KBDMFS_EN 0x1
+
+/* CLKEN register bitmask */
+#define KPD_CLK_EN 0x1
+
+/* RSTINTCLR register bit mask */
+#define IRQ_CLEAR 0x1
+
+/* bit masks for keyboard interrupts*/
+#define TC3589x_EVT_LOSS_INT 0x8
+#define TC3589x_EVT_INT 0x4
+#define TC3589x_KBD_LOSS_INT 0x2
+#define TC3589x_KBD_INT 0x1
+
+/* bit masks for keyboard interrupt clear*/
+#define TC3589x_EVT_INT_CLR 0x2
+#define TC3589x_KBD_INT_CLR 0x1
+
+#define TC3589x_KBD_KEYMAP_SIZE 64
+
+/**
+ * struct tc_keypad - data structure used by keypad driver
+ * @input: pointer to input device object
+ * @board: keypad platform device
+ * @krow: number of rows
+ * @kcol: number of coloumns
+ * @keymap: matrix scan code table for keycodes
+ */
+struct tc_keypad {
+ struct tc3589x *tc3589x;
+ struct input_dev *input;
+ const struct tc3589x_keypad_platform_data *board;
+ unsigned int krow;
+ unsigned int kcol;
+ unsigned short keymap[TC3589x_KBD_KEYMAP_SIZE];
+};
+
+static int __devinit tc3589x_keypad_init_key_hardware(struct tc_keypad *keypad)
+{
+ int ret;
+ struct tc3589x *tc3589x = keypad->tc3589x;
+ u8 settle_time = keypad->board->settle_time;
+ u8 dbounce_period = keypad->board->debounce_period;
+ u8 rows = keypad->board->krow & 0xf; /* mask out the nibble */
+ u8 column = keypad->board->kcol & 0xf; /* mask out the nibble */
+
+ /* validate platform configurations */
+ if ((keypad->board->kcol > TC3589x_MAX_KPCOL) ||
+ (keypad->board->krow > TC3589x_MAX_KPROW) ||
+ (keypad->board->debounce_period > TC3589x_MAX_DEBOUNCE_SETTLE) ||
+ (keypad->board->settle_time > TC3589x_MAX_DEBOUNCE_SETTLE))
+ return -EINVAL;
+
+ /* configure KBDSIZE 4 LSbits for cols and 4 MSbits for rows */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDSIZE, 0x0,
+ (rows << KP_ROW_SHIFT) | column);
+ if (ret < 0)
+ return ret;
+
+ /* configure dedicated key config, no dedicated key selected */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBCFG_LSB,
+ 0x0, DEDICATED_KEY_VAL);
+ if (ret < 0)
+ return ret;
+
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBCFG_MSB,
+ 0x0, DEDICATED_KEY_VAL);
+ if (ret < 0)
+ return ret;
+
+ /* Configure settle time */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDSETTLE_REG,
+ 0x0, settle_time);
+ if (ret < 0)
+ return ret;
+
+ /* Configure debounce time */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDBOUNCE, 0x0, dbounce_period);
+ if (ret < 0)
+ return ret;
+
+ /* Start of initialise keypad GPIOs */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOCFG, 0x0, IOCFG_IG);
+ if (ret < 0)
+ return ret;
+
+ /* Configure pull-up resistors for all row GPIOs */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOPULLCFG0_LSB, 0x0,
+ TC3589x_PULLUP_ALL_MASK);
+ if (ret < 0)
+ return ret;
+
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOPULLCFG0_MSB, 0x0,
+ TC3589x_PULLUP_ALL_MASK);
+ if (ret < 0)
+ return ret;
+
+ /* Configure pull-up resistors for all column GPIOs */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOPULLCFG1_LSB, 0x0,
+ TC3589x_PULLUP_ALL_MASK);
+ if (ret < 0)
+ return ret;
+
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOPULLCFG1_MSB, 0x0,
+ TC3589x_PULLUP_ALL_MASK);
+ if (ret < 0)
+ return ret;
+
+ ret = tc3589x_set_bits(tc3589x, TC3589x_IOPULLCFG2_LSB, 0x0,
+ TC3589x_PULLUP_ALL_MASK);
+
+ return ret;
+}
+
+#define TC35893_DATA_REGS 4
+#define TC35893_KEYCODE_FIFO_EMPTY 0x7f
+#define TC35893_KEYCODE_FIFO_CLEAR 0xff
+
+static irqreturn_t tc3589x_keypad_irq(int irq, void *dev)
+{
+ struct tc_keypad *keypad = (struct tc_keypad *)dev;
+ struct tc3589x *tc3589x = keypad->tc3589x;
+ u8 i, row_index, col_index, kbd_code, up;
+ u8 code;
+
+ for (i = 0; i < (TC35893_DATA_REGS * 2); i++) {
+ kbd_code = tc3589x_reg_read(tc3589x, TC3589x_EVTCODE_FIFO);
+
+ /* loop till fifo is empty and no more keys are pressed */
+ if ((kbd_code == TC35893_KEYCODE_FIFO_EMPTY) ||
+ (kbd_code == TC35893_KEYCODE_FIFO_CLEAR))
+ continue;
+
+ /* valid key is found */
+ col_index = kbd_code & KP_EVCODE_COL_MASK;
+ row_index = (kbd_code & KP_EVCODE_ROW_MASK) >> KP_ROW_SHIFT;
+ code = MATRIX_SCAN_CODE(row_index, col_index, 0x3);
+ up = kbd_code & KP_RELEASE_EVT_MASK;
+
+ input_event(keypad->input, EV_MSC, MSC_SCAN, code);
+ input_report_key(keypad->input, keypad->keymap[code], !up);
+ input_sync(keypad->input);
+ }
+
+ /* clear IRQ */
+ tc3589x_set_bits(tc3589x, TC3589x_KBDIC,
+ 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR);
+ /* enable IRQ */
+ tc3589x_set_bits(tc3589x, TC3589x_KBDMSK,
+ 0x0, TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT);
+
+ return IRQ_HANDLED;
+}
+
+static int tc3589x_keypad_enable(struct tc3589x *tc3589x)
+{
+ int ret;
+
+ /* pull the keypad module out of reset */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x0);
+ if (ret < 0)
+ return ret;
+
+ /* configure KBDMFS */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMFS, 0x0, TC3589x_KBDMFS_EN);
+ if (ret < 0)
+ return ret;
+
+ /* enable the keypad clock */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x0, KPD_CLK_EN);
+ if (ret < 0)
+ return ret;
+
+ /* clear pending IRQs */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_RSTINTCLR, 0x0, 0x1);
+ if (ret < 0)
+ return ret;
+
+ /* enable the IRQs */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, 0x0,
+ TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT);
+
+ return ret;
+}
+
+static int tc3589x_keypad_disable(struct tc3589x *tc3589x)
+{
+ int ret;
+
+ /* clear IRQ */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDIC,
+ 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR);
+ if (ret < 0)
+ return ret;
+
+ /* disable all interrupts */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK,
+ ~(TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT), 0x0);
+ if (ret < 0)
+ return ret;
+
+ /* disable the keypad module */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x1, 0x0);
+ if (ret < 0)
+ return ret;
+
+ /* put the keypad module into reset */
+ ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x1);
+
+ return ret;
+}
+
+static int __devinit tc3589x_keypad_probe(struct platform_device *pdev)
+{
+ struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
+ struct tc_keypad *keypad;
+ struct input_dev *input;
+ const struct tc3589x_keypad_platform_data *plat;
+ int error, irq;
+
+ plat = tc3589x->pdata->keypad;
+ if (!plat) {
+ dev_err(&pdev->dev, "invalid keypad platform data\n");
+ return -EINVAL;
+ }
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
+
+ keypad = kzalloc(sizeof(struct tc_keypad), GFP_KERNEL);
+ input = input_allocate_device();
+ if (!keypad || !input) {
+ dev_err(&pdev->dev, "failed to allocate keypad memory\n");
+ error = -ENOMEM;
+ goto err_free_mem;
+ }
+
+ keypad->board = plat;
+ keypad->input = input;
+ keypad->tc3589x = tc3589x;
+
+ /* enable the keypad module */
+ error = tc3589x_keypad_enable(tc3589x);
+ if (error < 0) {
+ dev_err(&pdev->dev, "failed to enable keypad module\n");
+ goto err_free_mem;
+ }
+
+ error = tc3589x_keypad_init_key_hardware(keypad);
+ if (error < 0) {
+ dev_err(&pdev->dev, "failed to configure keypad module\n");
+ goto err_free_mem;
+ }
+
+ input->id.bustype = BUS_HOST;
+ input->name = pdev->name;
+ input->dev.parent = &pdev->dev;
+
+ input->keycode = keypad->keymap;
+ input->keycodesize = sizeof(keypad->keymap[0]);
+ input->keycodemax = ARRAY_SIZE(keypad->keymap);
+
+ input_set_capability(input, EV_MSC, MSC_SCAN);
+
+ __set_bit(EV_KEY, input->evbit);
+ if (!plat->no_autorepeat)
+ __set_bit(EV_REP, input->evbit);
+
+ matrix_keypad_build_keymap(plat->keymap_data, 0x3,
+ input->keycode, input->keybit);
+
+ error = request_threaded_irq(irq, NULL,
+ tc3589x_keypad_irq, plat->irqtype,
+ "tc3589x-keypad", keypad);
+ if (error < 0) {
+ dev_err(&pdev->dev,
+ "Could not allocate irq %d,error %d\n",
+ irq, error);
+ goto err_free_mem;
+ }
+
+ error = input_register_device(input);
+ if (error) {
+ dev_err(&pdev->dev, "Could not register input device\n");
+ goto err_free_irq;
+ }
+
+ device_init_wakeup(&pdev->dev, plat->enable_wakeup);
+ device_set_wakeup_capable(&pdev->dev, plat->enable_wakeup);
+
+ platform_set_drvdata(pdev, keypad);
+
+ return 0;
+
+err_free_irq:
+ free_irq(irq, keypad);
+err_free_mem:
+ input_free_device(input);
+ kfree(keypad);
+ return error;
+}
+
+static int __devexit tc3589x_keypad_remove(struct platform_device *pdev)
+{
+ struct tc_keypad *keypad = platform_get_drvdata(pdev);
+ struct tc3589x *tc3589x = keypad->tc3589x;
+ int irq = platform_get_irq(pdev, 0);
+
+ free_irq(irq, keypad);
+
+ input_unregister_device(keypad->input);
+
+ tc3589x_keypad_disable(tc3589x);
+
+ kfree(keypad);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int tc3589x_keypad_suspend(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct tc_keypad *keypad = platform_get_drvdata(pdev);
+ struct tc3589x *tc3589x = keypad->tc3589x;
+ int irq = platform_get_irq(pdev, 0);
+
+ /* disable the IRQ */
+ if (!device_may_wakeup(&pdev->dev))
+ tc3589x_keypad_disable(tc3589x);
+ else
+ enable_irq_wake(irq);
+
+ return 0;
+}
+
+static int tc3589x_keypad_resume(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ struct tc_keypad *keypad = platform_get_drvdata(pdev);
+ struct tc3589x *tc3589x = keypad->tc3589x;
+ int irq = platform_get_irq(pdev, 0);
+
+ /* enable the IRQ */
+ if (!device_may_wakeup(&pdev->dev))
+ tc3589x_keypad_enable(tc3589x);
+ else
+ disable_irq_wake(irq);
+
+ return 0;
+}
+
+static const struct dev_pm_ops tc3589x_keypad_dev_pm_ops = {
+ .suspend = tc3589x_keypad_suspend,
+ .resume = tc3589x_keypad_resume,
+};
+#endif
+
+static struct platform_driver tc3589x_keypad_driver = {
+ .driver.name = "tc3589x-keypad",
+ .driver.owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .driver.pm = &tc3589x_keypad_dev_pm_ops,
+#endif
+ .probe = tc3589x_keypad_probe,
+ .remove = __devexit_p(tc3589x_keypad_remove),
+};
+
+static int __init tc3589x_keypad_init(void)
+{
+ return platform_driver_register(&tc3589x_keypad_driver);
+}
+
+static void __exit tc3589x_keypad_exit(void)
+{
+ return platform_driver_unregister(&tc3589x_keypad_driver);
+}
+
+module_init(tc3589x_keypad_init);
+module_exit(tc3589x_keypad_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Jayeeta Banerjee/Sundar Iyer");
+MODULE_DESCRIPTION("TC35893 Keypad Driver");
diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index 0ed9669..5672d56 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -129,6 +129,14 @@ static struct resource gpio_resources[] = {
},
};

+static struct resource keypad_resources[] = {
+ {
+ .start = TC3589x_INT_KBDIRQ,
+ .end = TC3589x_INT_KBDIRQ,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
static struct mfd_cell tc3589x_dev_gpio[] = {
{
.name = "tc3589x-gpio",
@@ -137,6 +145,14 @@ static struct mfd_cell tc3589x_dev_gpio[] = {
},
};

+static struct mfd_cell tc3589x_dev_keypad[] = {
+ {
+ .name = "tc3589x-keypad",
+ .num_resources = ARRAY_SIZE(keypad_resources),
+ .resources = &keypad_resources[0],
+ },
+};
+
static irqreturn_t tc3589x_irq(int irq, void *data)
{
struct tc3589x *tc3589x = data;
@@ -256,8 +272,18 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
dev_info(tc3589x->dev, "added gpio block\n");
}

- return ret;
+ if (blocks & TC3589x_BLOCK_KEYPAD) {
+ ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
+ ARRAY_SIZE(tc3589x_dev_keypad), NULL,
+ tc3589x->irq_base);
+ if (ret) {
+ dev_err(tc3589x->dev, "failed to keypad child\n");
+ return ret;
+ }
+ dev_info(tc3589x->dev, "added keypad block\n");
+ }

+ return ret;
}

static int __devinit tc3589x_probe(struct i2c_client *i2c,
diff --git a/include/linux/mfd/tc3589x.h b/include/linux/mfd/tc3589x.h
index da00958..8550e00 100644
--- a/include/linux/mfd/tc3589x.h
+++ b/include/linux/mfd/tc3589x.h
@@ -20,6 +20,17 @@ enum tx3589x_block {
#define TC3589x_RSTCTRL_KBDRST (1 << 1)
#define TC3589x_RSTCTRL_GPIRST (1 << 0)

+/* Keyboard Configuration Registers */
+#define TC3589x_KBDSETTLE_REG 0x01
+#define TC3589x_KBDBOUNCE 0x02
+#define TC3589x_KBDSIZE 0x03
+#define TC3589x_KBCFG_LSB 0x04
+#define TC3589x_KBCFG_MSB 0x05
+#define TC3589x_KBDIC 0x08
+#define TC3589x_KBDMSK 0x09
+#define TC3589x_EVTCODE_FIFO 0x10
+#define TC3589x_KBDMFS 0x8F
+
#define TC3589x_IRQST 0x91

#define TC3589x_MANFCODE_MAGIC 0x03
@@ -35,6 +46,14 @@ enum tx3589x_block {
#define TC3589x_EXTRSTN 0x83
#define TC3589x_RSTINTCLR 0x84

+/* Pull up/down configuration registers */
+#define TC3589x_IOCFG 0xA7
+#define TC3589x_IOPULLCFG0_LSB 0xAA
+#define TC3589x_IOPULLCFG0_MSB 0xAB
+#define TC3589x_IOPULLCFG1_LSB 0xAC
+#define TC3589x_IOPULLCFG1_MSB 0xAD
+#define TC3589x_IOPULLCFG2_LSB 0xAE
+
#define TC3589x_GPIOIS0 0xC9
#define TC3589x_GPIOIS1 0xCA
#define TC3589x_GPIOIS2 0xCB
@@ -112,6 +131,37 @@ extern int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
const u8 *values);
extern int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val);

+/*
+ * Keypad related platform specific constants
+ * These values may be modified for fine tuning
+ */
+#define TC_KPD_ROWS 0x8
+#define TC_KPD_COLUMNS 0x8
+#define TC_KPD_DEBOUNCE_PERIOD 0xA3
+#define TC_KPD_SETTLE_TIME 0xA3
+
+/**
+ * struct tc35893_platform_data - data structure for platform specific data
+ * @keymap_data: matrix scan code table for keycodes
+ * @krow: mask for available rows, value is 0xFF
+ * @kcol: mask for available columns, value is 0xFF
+ * @debounce_period: platform specific debounce time
+ * @settle_time: platform specific settle down time
+ * @irqtype: type of interrupt, falling or rising edge
+ * @enable_wakeup: specifies if keypad event can wake up system from sleep
+ * @no_autorepeat: flag for auto repetition
+ */
+struct tc3589x_keypad_platform_data {
+ struct matrix_keymap_data *keymap_data;
+ u8 krow;
+ u8 kcol;
+ u8 debounce_period;
+ u8 settle_time;
+ unsigned long irqtype;
+ bool enable_wakeup;
+ bool no_autorepeat;
+};
+
/**
* struct tc3589x_gpio_platform_data - TC3589x GPIO platform data
* @gpio_base: first gpio number assigned to TC3589x. A maximum of
@@ -130,11 +180,13 @@ struct tc3589x_gpio_platform_data {
* @block: bitmask of blocks to enable (use TC3589x_BLOCK_*)
* @irq_base: base IRQ number. %TC3589x_NR_IRQS irqs will be used.
* @gpio: GPIO-specific platform data
+ * @keypad: keypad-specific platform data
*/
struct tc3589x_platform_data {
unsigned int block;
int irq_base;
struct tc3589x_gpio_platform_data *gpio;
+ struct tc3589x_keypad_platform_data *keypad;
};

#define TC3589x_NR_GPIOS 24
--
1.7.2.dirty

2010-12-03 15:32:54

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 15/20] mach-ux500: add touchscreen interfaces platform data

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/Makefile | 1 +
arch/arm/mach-ux500/board-mop500-touchscreen.c | 170 ++++++++++++++++++++++++
arch/arm/mach-ux500/board-mop500.c | 6 +-
arch/arm/mach-ux500/board-mop500.h | 2 +-
4 files changed, 177 insertions(+), 2 deletions(-)
create mode 100644 arch/arm/mach-ux500/board-mop500-touchscreen.c

diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
index e1d3822..e2af105 100644
--- a/arch/arm/mach-ux500/Makefile
+++ b/arch/arm/mach-ux500/Makefile
@@ -14,3 +14,4 @@ obj-$(CONFIG_REGULATOR_AB8500) += board-mop500-regulators.o
obj-$(CONFIG_U5500_MODEM_IRQ) += modem_irq.o
obj-$(CONFIG_U5500_MBOX) += mbox.o
obj-$(CONFIG_INPUT_KEYBOARD) += board-mop500-keypads.o
+obj-$(CONFIG_INPUT_TOUCHSCREEN) += board-mop500-touchscreen.o
diff --git a/arch/arm/mach-ux500/board-mop500-touchscreen.c b/arch/arm/mach-ux500/board-mop500-touchscreen.c
new file mode 100644
index 0000000..87cf2ac
--- /dev/null
+++ b/arch/arm/mach-ux500/board-mop500-touchscreen.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License Terms: GNU General Public License v2
+ *
+ * Author: Naveen Kumar G <[email protected]>
+ *
+ * Touchscreen interfaces for various boards
+ */
+#include <linux/i2c.h>
+#include <linux/gpio.h>
+#include <linux/interrupt.h>
+#include <linux/input/bu21013.h>
+#include <../drivers/staging/ste_rmi4/synaptics_i2c_rmi4.h>
+
+#include <mach/gpio.h>
+#include <mach/irqs.h>
+
+/*
+ * Synaptics RMI4 touchscreen interface on the NUIBs
+ */
+
+/*
+ * Descriptor structure.
+ * Describes the number of i2c devices on the bus that speak RMI.
+ */
+static struct synaptics_rmi4_platform_data rmi4_i2c_dev_platformdata = {
+ .name = "synaptics_rmi4_i2c0",
+ .irq_number = NOMADIK_GPIO_TO_IRQ(84),
+ .irq_type = (IRQF_TRIGGER_FALLING | IRQF_SHARED),
+ .x_flip = true,
+ .y_flip = false,
+ .regulator_en = true,
+};
+
+static struct i2c_board_info __initdata u8500_i2c3_devices_nuib[] = {
+ {
+ I2C_BOARD_INFO("synaptics_rmi4_i2c", 0x4B),
+ .platform_data = &rmi4_i2c_dev_platformdata,
+ },
+};
+
+/*
+ * BU21013 ROHM touchscreen interface on the STUIBs
+ */
+
+/* tracks number of bu21013 devices being enabled */
+static int bu21013_devices;
+
+#define TOUCH_GPIO_PIN 84
+
+#define TOUCH_XMAX 384
+#define TOUCH_YMAX 704
+
+#define PRCMU_CLOCK_OCR 0x1CC
+#define TSC_EXT_CLOCK_9_6MHZ 0x840000
+
+/**
+ * bu21013_gpio_board_init : configures the touch panel.
+ * @reset_pin: reset pin number
+ * This function can be used to configures
+ * the voltage and reset the touch panel controller.
+ */
+static int bu21013_gpio_board_init(int reset_pin)
+{
+ int retval = 0;
+
+ bu21013_devices++;
+ if (bu21013_devices == 1) {
+ retval = gpio_request(reset_pin, "touchp_reset");
+ if (retval) {
+ printk(KERN_ERR "Unable to request gpio reset_pin");
+ return retval;
+ }
+ retval = gpio_direction_output(reset_pin, 1);
+ if (retval < 0) {
+ printk(KERN_ERR "%s: gpio direction failed\n",
+ __func__);
+ return retval;
+ }
+ gpio_set_value(reset_pin, 1);
+ }
+
+ return retval;
+}
+
+/**
+ * bu21013_gpio_board_exit : deconfigures the touch panel controller
+ * @reset_pin: reset pin number
+ * This function can be used to deconfigures the chip selection
+ * for touch panel controller.
+ */
+static int bu21013_gpio_board_exit(int reset_pin)
+{
+ int retval = 0;
+
+ if (bu21013_devices == 1) {
+ retval = gpio_direction_output(reset_pin, 0);
+ if (retval < 0) {
+ printk(KERN_ERR "%s: gpio direction failed\n",
+ __func__);
+ return retval;
+ }
+ gpio_set_value(reset_pin, 0);
+ }
+ bu21013_devices--;
+
+ return retval;
+}
+
+/**
+ * bu21013_read_pin_val : get the interrupt pin value
+ * This function can be used to get the interrupt pin value for touch panel
+ * controller.
+ */
+static int bu21013_read_pin_val(void)
+{
+ return gpio_get_value(TOUCH_GPIO_PIN);
+}
+
+static struct bu21013_platform_device tsc_plat_device = {
+ .cs_en = bu21013_gpio_board_init,
+ .cs_dis = bu21013_gpio_board_exit,
+ .irq_read_val = bu21013_read_pin_val,
+ .irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN),
+ .cs_pin = EGPIO_PIN_13,
+ .x_max_res = 480,
+ .y_max_res = 864,
+ .touch_x_max = TOUCH_XMAX,
+ .touch_y_max = TOUCH_YMAX,
+ .ext_clk = true,
+ .x_flip = true,
+ .y_flip = false,
+};
+
+static struct bu21013_platform_device tsc_cntl2_plat_device = {
+ .cs_en = bu21013_gpio_board_init,
+ .cs_dis = bu21013_gpio_board_exit,
+ .irq_read_val = bu21013_read_pin_val,
+ .irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN),
+ .cs_pin = EGPIO_PIN_13,
+ .x_max_res = 480,
+ .y_max_res = 864,
+ .touch_x_max = TOUCH_XMAX,
+ .touch_y_max = TOUCH_YMAX,
+ .ext_clk = true,
+ .x_flip = true,
+ .y_flip = false,
+};
+
+static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = {
+ {
+ I2C_BOARD_INFO("bu21013_ts", 0x5C),
+ .platform_data = &tsc_plat_device,
+ },
+ {
+ I2C_BOARD_INFO("bu21013_ts", 0x5D),
+ .platform_data = &tsc_cntl2_plat_device,
+ },
+};
+
+void mop500_touchpanel_init(void)
+{
+ i2c_register_board_info(3, u8500_i2c3_devices_nuib,
+ ARRAY_SIZE(u8500_i2c3_devices_nuib));
+
+ i2c_register_board_info(3, u8500_i2c3_devices_stuib,
+ ARRAY_SIZE(u8500_i2c3_devices_stuib));
+}
+
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 703840b..63313c4 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -202,8 +202,12 @@ static void __init u8500_init_machine(void)
mop500_spi_init();
mop500_uart_init();

+#ifdef CONFIG_INPUT_KEYBOARD
mop500_keypad_init();
-
+#endif
+#ifdef CONFIG_INPUT_TOUCHSCREEN
+ mop500_touchpanel_init();
+#endif
platform_device_register(&ab8500_device);

i2c_register_board_info(0, mop500_i2c0_devices,
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h
index 3104ae2..bac81c5 100644
--- a/arch/arm/mach-ux500/board-mop500.h
+++ b/arch/arm/mach-ux500/board-mop500.h
@@ -17,5 +17,5 @@
extern void mop500_sdi_init(void);
extern void mop500_sdi_tc35892_init(void);
extern void mop500_keypad_init(void);
-
+extern void mop500_touchpanel_init(void);
#endif
--
1.7.2.dirty

2010-12-03 15:32:15

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 16/20] i2c/nomadik: add adapter name for updated sanity checkings

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/i2c/busses/i2c-nomadik.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
index 2bd3469..baa8ff7 100644
--- a/drivers/i2c/busses/i2c-nomadik.c
+++ b/drivers/i2c/busses/i2c-nomadik.c
@@ -872,6 +872,7 @@ static int __devinit nmk_i2c_probe(struct platform_device *pdev)
adap->owner = THIS_MODULE;
adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
adap->algo = &nmk_i2c_algo;
+ snprintf(adap->name, sizeof(adap->name), DRIVER_NAME);

/* fetch the controller id */
adap->nr = pdev->id;
--
1.7.2.dirty

2010-12-03 15:37:23

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 12/20] mfd/tc3589x: undo gpio module reset during chip init

Skip putting the GPIO module into a reset during the chip init. This makes
sure to preserve any existing GPIO configurations done by pre-kernel boot code.

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/mfd/tc3589x.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index e173f33..fd206fd 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -247,12 +247,15 @@ static int tc3589x_chip_init(struct tc3589x *tc3589x)

dev_info(tc3589x->dev, "manufacturer: %#x, version: %#x\n", manf, ver);

- /* Put everything except the IRQ module into reset */
+ /*
+ * Put everything except the IRQ module into reset;
+ * also spare the GPIO module for any pin initialization
+ * done during pre-kernel boot
+ */
ret = tc3589x_reg_write(tc3589x, TC3589x_RSTCTRL,
TC3589x_RSTCTRL_TIMRST
| TC3589x_RSTCTRL_ROTRST
- | TC3589x_RSTCTRL_KBDRST
- | TC3589x_RSTCTRL_GPIRST);
+ | TC3589x_RSTCTRL_KBDRST);
if (ret < 0)
return ret;

--
1.7.2.dirty

2010-12-03 15:37:25

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 13/20] mfd/tc3589x: add suspend/resume support

Signed-off-by: Sundar Iyer <[email protected]>
---
drivers/mfd/tc3589x.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index fd206fd..a7dd2b6 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -14,6 +14,9 @@
#include <linux/mfd/core.h>
#include <linux/mfd/tc3589x.h>

+#define TC3589x_CLKMODE_MODCTL_SLEEP 0x0
+#define TC3589x_CLKMODE_MODCTL_OPERATION (1 << 0)
+
/**
* tc3589x_reg_read() - read a single TC3589x register
* @tc3589x: Device to read from
@@ -365,6 +368,42 @@ static int __devexit tc3589x_remove(struct i2c_client *client)
return 0;
}

+#ifdef CONFIG_PM
+static int tc3589x_suspend(struct device *dev)
+{
+ struct tc3589x *tc35892 = dev_get_drvdata(dev);
+ struct i2c_client *client = tc3589x->i2c;
+ int ret = 0;
+
+ /* put the system to sleep mode */
+ if (!device_may_wakeup(&client->dev))
+ ret = tc3589x_reg_write(tc3589x, TC3589x_CLKMODE,
+ TC3589x_CLKMODE_MODCTL_SLEEP);
+
+ return ret;
+}
+
+static int tc3589x_resume(struct device *dev)
+{
+ struct tc3589x *tc3589x = dev_get_drvdata(dev);
+ struct i2c_client *client = tc3589x->i2c;
+ int ret = 0;
+
+ /* enable the system into operation */
+ if (!device_may_wakeup(&client->dev))
+ ret = tc3589x_reg_write(tc3589x, TC3589x_CLKMODE,
+ TC3589x_CLKMODE_MODCTL_OPERATION);
+
+ return ret;
+}
+
+
+static const struct dev_pm_ops tc3589x_dev_pm_ops = {
+ .suspend = tc3589x_suspend,
+ .resume = tc3589x_resume,
+};
+#endif
+
static const struct i2c_device_id tc3589x_id[] = {
{ "tc3589x", 24 },
{ }
@@ -374,6 +413,9 @@ MODULE_DEVICE_TABLE(i2c, tc3589x_id);
static struct i2c_driver tc3589x_driver = {
.driver.name = "tc3589x",
.driver.owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .driver.pm = &tc3589x_dev_pm_ops,
+#endif
.probe = tc3589x_probe,
.remove = __devexit_p(tc3589x_remove),
.id_table = tc3589x_id,
--
1.7.2.dirty

2010-12-03 15:37:20

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 17/20] mach-ux500: add TC35893 keypad platform data

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/board-mop500-keypads.c | 63 ++++++++++++++++++++++++++++
1 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-ux500/board-mop500-keypads.c b/arch/arm/mach-ux500/board-mop500-keypads.c
index 4acc4f1..663f0c3 100644
--- a/arch/arm/mach-ux500/board-mop500-keypads.c
+++ b/arch/arm/mach-ux500/board-mop500-keypads.c
@@ -11,6 +11,7 @@
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/mfd/stmpe.h>
+#include <linux/mfd/tc3589x.h>
#include <linux/input/matrix_keypad.h>

#include <plat/pincfg.h>
@@ -157,10 +158,72 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = {
},
};

+/*
+ * TC35893
+ */
+
+static const unsigned int nuib_keymap[] = {
+ KEY(3, 1, KEY_END),
+ KEY(4, 1, KEY_POWER),
+ KEY(6, 4, KEY_VOLUMEDOWN),
+ KEY(4, 2, KEY_EMAIL),
+ KEY(3, 3, KEY_RIGHT),
+ KEY(2, 5, KEY_BACKSPACE),
+
+ KEY(6, 7, KEY_MENU),
+ KEY(5, 0, KEY_ENTER),
+ KEY(4, 3, KEY_0),
+ KEY(3, 4, KEY_DOT),
+ KEY(5, 2, KEY_UP),
+ KEY(3, 5, KEY_DOWN),
+
+ KEY(4, 5, KEY_SEND),
+ KEY(0, 5, KEY_BACK),
+ KEY(6, 2, KEY_VOLUMEUP),
+ KEY(1, 3, KEY_SPACE),
+ KEY(7, 6, KEY_LEFT),
+ KEY(5, 5, KEY_SEARCH),
+};
+
+static struct matrix_keymap_data nuib_keymap_data = {
+ .keymap = nuib_keymap,
+ .keymap_size = ARRAY_SIZE(nuib_keymap),
+};
+
+static struct tc3589x_keypad_platform_data tc35893_data = {
+ .krow = TC_KPD_ROWS,
+ .kcol = TC_KPD_COLUMNS,
+ .debounce_period = TC_KPD_DEBOUNCE_PERIOD,
+ .settle_time = TC_KPD_SETTLE_TIME,
+ .irqtype = IRQF_TRIGGER_FALLING,
+ .enable_wakeup = true,
+ .keymap_data = &nuib_keymap_data,
+ .no_autorepeat = true,
+};
+
+static struct tc3589x_platform_data tc3589x_keypad_data = {
+ .block = TC3589x_BLOCK_KEYPAD,
+ .keypad = &tc35893_data,
+ .irq_base = MOP500_EGPIO_IRQ_BASE,
+};
+
+static struct i2c_board_info __initdata mop500_i2c0_devices_nuib[] = {
+ {
+ I2C_BOARD_INFO("tc3589x", 0x44),
+ .platform_data = &tc3589x_keypad_data,
+ .irq = NOMADIK_GPIO_TO_IRQ(218),
+ .flags = I2C_CLIENT_WAKE,
+ },
+};
+
void mop500_keypad_init(void)
{
db8500_add_ske_keypad(&ske_keypad_board);

i2c_register_board_info(0, mop500_i2c0_devices_stuib,
ARRAY_SIZE(mop500_i2c0_devices_stuib));
+
+ i2c_register_board_info(0, mop500_i2c0_devices_nuib,
+ ARRAY_SIZE(mop500_i2c0_devices_nuib));
+
}
--
1.7.2.dirty

2010-12-03 15:37:21

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 14/20] plat-nomadik/gpio: add expander gpio pins enumeration

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/include/mach/gpio.h | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-ux500/include/mach/gpio.h b/arch/arm/mach-ux500/include/mach/gpio.h
index d548a62..f28da77 100644
--- a/arch/arm/mach-ux500/include/mach/gpio.h
+++ b/arch/arm/mach-ux500/include/mach/gpio.h
@@ -8,6 +8,34 @@
#define ARCH_NR_GPIOS 350

#include <plat/gpio.h>
+#include <mach/irqs.h>
+
+enum {
+ EGPIO_PIN_0 = NOMADIK_NR_GPIO,
+ EGPIO_PIN_1,
+ EGPIO_PIN_2,
+ EGPIO_PIN_3,
+ EGPIO_PIN_4,
+ EGPIO_PIN_5,
+ EGPIO_PIN_6,
+ EGPIO_PIN_7,
+ EGPIO_PIN_8,
+ EGPIO_PIN_9,
+ EGPIO_PIN_10,
+ EGPIO_PIN_11,
+ EGPIO_PIN_12,
+ EGPIO_PIN_13,
+ EGPIO_PIN_14,
+ EGPIO_PIN_15,
+ EGPIO_PIN_16,
+ EGPIO_PIN_17,
+ EGPIO_PIN_18,
+ EGPIO_PIN_19,
+ EGPIO_PIN_20,
+ EGPIO_PIN_21,
+ EGPIO_PIN_22,
+ EGPIO_PIN_23,
+};

#define __GPIO_RESOURCE(soc, block) \
{ \
--
1.7.2.dirty

2010-12-03 15:37:18

by Sundar R IYER

[permalink] [raw]
Subject: [PATCH 09/20] mfd/tc3589x: add block identifier for multiple child devices

Add block identifier to be able to add multiple mfd clients
to the mfd core

Signed-off-by: Sundar Iyer <[email protected]>
---
arch/arm/mach-ux500/board-mop500.c | 1 +
drivers/mfd/tc3589x.c | 28 +++++++++++++++++++++++-----
include/linux/mfd/tc3589x.h | 7 +++++++
3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index 6aaf382..703840b 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -123,6 +123,7 @@ static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
};

static struct tc3589x_platform_data mop500_tc35892_data = {
+ .block = TC3589x_BLOCK_GPIO,
.gpio = &mop500_tc35892_gpio_data,
.irq_base = MOP500_EGPIO_IRQ_BASE,
};
diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index 7deff53..0ed9669 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -129,7 +129,7 @@ static struct resource gpio_resources[] = {
},
};

-static struct mfd_cell tc3589x_devs[] = {
+static struct mfd_cell tc3589x_dev_gpio[] = {
{
.name = "tc3589x-gpio",
.num_resources = ARRAY_SIZE(gpio_resources),
@@ -240,6 +240,26 @@ static int tc3589x_chip_init(struct tc3589x *tc3589x)
return tc3589x_reg_write(tc3589x, TC3589x_RSTINTCLR, 0x1);
}

+static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
+{
+ int ret = 0;
+ unsigned int blocks = tc3589x->pdata->block;
+
+ if (blocks & TC3589x_BLOCK_GPIO) {
+ ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
+ ARRAY_SIZE(tc3589x_dev_gpio), NULL,
+ tc3589x->irq_base);
+ if (ret) {
+ dev_err(tc3589x->dev, "failed to add gpio child\n");
+ return ret;
+ }
+ dev_info(tc3589x->dev, "added gpio block\n");
+ }
+
+ return ret;
+
+}
+
static int __devinit tc3589x_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
@@ -281,11 +301,9 @@ static int __devinit tc3589x_probe(struct i2c_client *i2c,
goto out_removeirq;
}

- ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_devs,
- ARRAY_SIZE(tc3589x_devs), NULL,
- tc3589x->irq_base);
+ ret = tc3589x_device_init(tc3589x);
if (ret) {
- dev_err(tc3589x->dev, "failed to add children\n");
+ dev_err(tc3589x->dev, "failed to add child devices\n");
goto out_freeirq;
}

diff --git a/include/linux/mfd/tc3589x.h b/include/linux/mfd/tc3589x.h
index ea19188..da00958 100644
--- a/include/linux/mfd/tc3589x.h
+++ b/include/linux/mfd/tc3589x.h
@@ -9,6 +9,11 @@

#include <linux/device.h>

+enum tx3589x_block {
+ TC3589x_BLOCK_GPIO = 1 << 0,
+ TC3589x_BLOCK_KEYPAD = 1 << 1,
+};
+
#define TC3589x_RSTCTRL_IRQRST (1 << 4)
#define TC3589x_RSTCTRL_TIMRST (1 << 3)
#define TC3589x_RSTCTRL_ROTRST (1 << 2)
@@ -122,10 +127,12 @@ struct tc3589x_gpio_platform_data {

/**
* struct tc3589x_platform_data - TC3589x platform data
+ * @block: bitmask of blocks to enable (use TC3589x_BLOCK_*)
* @irq_base: base IRQ number. %TC3589x_NR_IRQS irqs will be used.
* @gpio: GPIO-specific platform data
*/
struct tc3589x_platform_data {
+ unsigned int block;
int irq_base;
struct tc3589x_gpio_platform_data *gpio;
};
--
1.7.2.dirty

2010-12-05 18:38:51

by Trilok Soni

[permalink] [raw]
Subject: Re: [PATCH 10/20] input/tc3589x: add tc3589x keypad support

Hi Sundar,

> diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c
> new file mode 100644
> index 0000000..1bfd49a
> --- /dev/null
> +++ b/drivers/input/keyboard/tc3589x-keypad.c
> @@ -0,0 +1,440 @@
> +/*
> + * Copyright (C) ST-Ericsson SA 2010
> + *
> + * Author: Jayeeta Banerjee <[email protected]>
> + * Author: Sundar Iyer <[email protected]>
> + *
> + * License Terms: GNU General Public License, version 2
> + *
> + * TC35893 MFD Keypad Controller driver
> + */
> +
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/interrupt.h>
> +#include <linux/spinlock.h>

I haven't seen spinlock usage anywhere in this code.

> +#include <linux/input.h>
> +#include <linux/platform_device.h>
> +#include <linux/input/matrix_keypad.h>
> +#include <linux/i2c.h>
> +#include <linux/slab.h>
> +#include <linux/mfd/tc3589x.h>
> +
> +/* Maximum supported keypad matrix row/columns size */
> +#define TC3589x_MAX_KPROW 8
> +#define TC3589x_MAX_KPCOL 12
> +
> +/* keypad related Constants */
> +#define TC3589x_MAX_DEBOUNCE_SETTLE 0xFF
> +#define DEDICATED_KEY_VAL 0xFF
> +
> +/* Pull up/down masks */
> +#define TC3589x_NO_PULL_MASK 0x0
> +#define TC3589x_PULL_DOWN_MASK 0x1
> +#define TC3589x_PULL_UP_MASK 0x2
> +#define TC3589x_PULLUP_ALL_MASK 0xAA
> +#define TC3589x_IO_PULL_VAL(index, mask) ((mask)<<((index)%4)*2))
> +
> +/* Bit masks for IOCFG register */
> +#define IOCFG_BALLCFG 0x01
> +#define IOCFG_IG 0x08
> +
> +#define KP_EVCODE_COL_MASK 0x0F
> +#define KP_EVCODE_ROW_MASK 0x70
> +#define KP_RELEASE_EVT_MASK 0x80
> +
> +#define KP_ROW_SHIFT 4
> +
> +#define KP_NO_VALID_KEY_MASK 0x7F
> +
> +/* bit masks for RESTCTRL register */
> +#define TC3589x_KBDRST 0x2
> +#define TC3589x_IRQRST 0x10
> +#define TC3589x_RESET_ALL 0x1B
> +
> +/* KBDMFS register bit mask */
> +#define TC3589x_KBDMFS_EN 0x1
> +
> +/* CLKEN register bitmask */
> +#define KPD_CLK_EN 0x1
> +
> +/* RSTINTCLR register bit mask */
> +#define IRQ_CLEAR 0x1
> +
> +/* bit masks for keyboard interrupts*/
> +#define TC3589x_EVT_LOSS_INT 0x8
> +#define TC3589x_EVT_INT 0x4
> +#define TC3589x_KBD_LOSS_INT 0x2
> +#define TC3589x_KBD_INT 0x1
> +
> +/* bit masks for keyboard interrupt clear*/
> +#define TC3589x_EVT_INT_CLR 0x2
> +#define TC3589x_KBD_INT_CLR 0x1
> +
> +#define TC3589x_KBD_KEYMAP_SIZE 64
> +
> +/**
> + * struct tc_keypad - data structure used by keypad driver
> + * @input: pointer to input device object
> + * @board: keypad platform device
> + * @krow: number of rows
> + * @kcol: number of coloumns
> + * @keymap: matrix scan code table for keycodes
> + */
> +struct tc_keypad {
> + struct tc3589x *tc3589x;
> + struct input_dev *input;
> + const struct tc3589x_keypad_platform_data *board;
> + unsigned int krow;
> + unsigned int kcol;
> + unsigned short keymap[TC3589x_KBD_KEYMAP_SIZE];
> +};


> +
> +
> +static irqreturn_t tc3589x_keypad_irq(int irq, void *dev)
> +{
> + struct tc_keypad *keypad = (struct tc_keypad *)dev;

casting not required.

> + struct tc3589x *tc3589x = keypad->tc3589x;
> + u8 i, row_index, col_index, kbd_code, up;
> + u8 code;
> +
> + for (i = 0; i < (TC35893_DATA_REGS * 2); i++) {
> + kbd_code = tc3589x_reg_read(tc3589x, TC3589x_EVTCODE_FIFO);
> +
> + /* loop till fifo is empty and no more keys are pressed */
> + if ((kbd_code == TC35893_KEYCODE_FIFO_EMPTY) ||
> + (kbd_code == TC35893_KEYCODE_FIFO_CLEAR))
> + continue;
> +
> + /* valid key is found */
> + col_index = kbd_code & KP_EVCODE_COL_MASK;
> + row_index = (kbd_code & KP_EVCODE_ROW_MASK) >> KP_ROW_SHIFT;
> + code = MATRIX_SCAN_CODE(row_index, col_index, 0x3);

0x3 needs #define.

> + up = kbd_code & KP_RELEASE_EVT_MASK;
> +
> + input_event(keypad->input, EV_MSC, MSC_SCAN, code);
> + input_report_key(keypad->input, keypad->keymap[code], !up);
> + input_sync(keypad->input);
> + }
> +
> + /* clear IRQ */
> + tc3589x_set_bits(tc3589x, TC3589x_KBDIC,
> + 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR);
> + /* enable IRQ */
> + tc3589x_set_bits(tc3589x, TC3589x_KBDMSK,
> + 0x0, TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT);
> +
> + return IRQ_HANDLED;
> +}
> +

> +
> +static int __devinit tc3589x_keypad_probe(struct platform_device *pdev)
> +{
> + struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
> + struct tc_keypad *keypad;
> + struct input_dev *input;
> + const struct tc3589x_keypad_platform_data *plat;
> + int error, irq;
> +
> + plat = tc3589x->pdata->keypad;
> + if (!plat) {
> + dev_err(&pdev->dev, "invalid keypad platform data\n");
> + return -EINVAL;
> + }
> +
> + irq = platform_get_irq(pdev, 0);
> + if (irq < 0)
> + return irq;
> +
> + keypad = kzalloc(sizeof(struct tc_keypad), GFP_KERNEL);
> + input = input_allocate_device();
> + if (!keypad || !input) {
> + dev_err(&pdev->dev, "failed to allocate keypad memory\n");
> + error = -ENOMEM;
> + goto err_free_mem;
> + }
> +
> + keypad->board = plat;
> + keypad->input = input;
> + keypad->tc3589x = tc3589x;
> +
> + /* enable the keypad module */
> + error = tc3589x_keypad_enable(tc3589x);
> + if (error < 0) {
> + dev_err(&pdev->dev, "failed to enable keypad module\n");
> + goto err_free_mem;
> + }
> +
> + error = tc3589x_keypad_init_key_hardware(keypad);
> + if (error < 0) {
> + dev_err(&pdev->dev, "failed to configure keypad module\n");
> + goto err_free_mem;
> + }

Let's move this to open(..).

> +
> + input->id.bustype = BUS_HOST;

BUS_I2C ?

> + input->name = pdev->name;
> + input->dev.parent = &pdev->dev;
> +
> + input->keycode = keypad->keymap;
> + input->keycodesize = sizeof(keypad->keymap[0]);
> + input->keycodemax = ARRAY_SIZE(keypad->keymap);
> +
> + input_set_capability(input, EV_MSC, MSC_SCAN);
> +
> + __set_bit(EV_KEY, input->evbit);
> + if (!plat->no_autorepeat)
> + __set_bit(EV_REP, input->evbit);
> +
> + matrix_keypad_build_keymap(plat->keymap_data, 0x3,
> + input->keycode, input->keybit);
> +
> + error = request_threaded_irq(irq, NULL,
> + tc3589x_keypad_irq, plat->irqtype,
> + "tc3589x-keypad", keypad);
> + if (error < 0) {
> + dev_err(&pdev->dev,
> + "Could not allocate irq %d,error %d\n",
> + irq, error);
> + goto err_free_mem;
> + }
> +
> + error = input_register_device(input);
> + if (error) {
> + dev_err(&pdev->dev, "Could not register input device\n");
> + goto err_free_irq;
> + }
> +
> + device_init_wakeup(&pdev->dev, plat->enable_wakeup);
> + device_set_wakeup_capable(&pdev->dev, plat->enable_wakeup);

put note here for as mentioned below.

> +
> + platform_set_drvdata(pdev, keypad);
> +
> + return 0;
> +
> +err_free_irq:
> + free_irq(irq, keypad);
> +err_free_mem:
> + input_free_device(input);
> + kfree(keypad);
> + return error;
> +}
> +

...

> +
> +#ifdef CONFIG_PM
> +static int tc3589x_keypad_suspend(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct tc_keypad *keypad = platform_get_drvdata(pdev);
> + struct tc3589x *tc3589x = keypad->tc3589x;
> + int irq = platform_get_irq(pdev, 0);
> +
> + /* disable the IRQ */
> + if (!device_may_wakeup(&pdev->dev))
> + tc3589x_keypad_disable(tc3589x);
> + else
> + enable_irq_wake(irq);

I understand what you are doing here, but let's put a note in the probe
why you are doing device_set_wakeup_capable(...).

> +
> + return 0;
> +}
> +
> +static int tc3589x_keypad_resume(struct device *dev)
> +{
> + struct platform_device *pdev = to_platform_device(dev);
> + struct tc_keypad *keypad = platform_get_drvdata(pdev);
> + struct tc3589x *tc3589x = keypad->tc3589x;
> + int irq = platform_get_irq(pdev, 0);
> +
> + /* enable the IRQ */
> + if (!device_may_wakeup(&pdev->dev))
> + tc3589x_keypad_enable(tc3589x);
> + else
> + disable_irq_wake(irq);
> +
> + return 0;
> +}
> +
> +static const struct dev_pm_ops tc3589x_keypad_dev_pm_ops = {
> + .suspend = tc3589x_keypad_suspend,
> + .resume = tc3589x_keypad_resume,
> +};
> +#endif
> +

...

> +
> +static int __init tc3589x_keypad_init(void)
> +{
> + return platform_driver_register(&tc3589x_keypad_driver);
> +}
> +
> +static void __exit tc3589x_keypad_exit(void)
> +{
> + return platform_driver_unregister(&tc3589x_keypad_driver);
> +}
> +
> +module_init(tc3589x_keypad_init);
> +module_exit(tc3589x_keypad_exit);

nit-pick:

module_init/exit go with related routines.

> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_AUTHOR("Jayeeta Banerjee/Sundar Iyer");
> +MODULE_DESCRIPTION("TC35893 Keypad Driver");

MODULE_ALIAS("platform:tc3589x-keypad") would be good.

---Trilok Soni

--
Sent by a consultant of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.

2010-12-07 05:45:49

by Sundar R IYER

[permalink] [raw]
Subject: RE: [PATCH 00/20] ux500: platform data, TC3589x keypad driver

Hi Sam,

I am waiting for your comments for the MFD parts.

Dmitry has already a Acked-by for the keypad with some changes; Linus W has a Acked-by
for most of the platform changes; I would like to wait to incorporate your comments to push
the v2 for the patch set.

Cheers!
Sundar

>-----Original Message-----
>From: Sundar R IYER
>Cc: Sundar R IYER
>Subject: [PATCH 00/20] ux500: platform data, TC3589x keypad driver
>
>These set of patches add platform data to most of our mainlined
>input drivers. Also included herein is a revised version of the
>TC3589x keypad drivers, incorporating reviews from Dmitry.
>
>(I am still not sure if this is the list to be sent for reviews, but
>I decided sending it internally first; probably Linus/Srinidhi/Rabin
>would like to have a view of the changes before it goes out mainline)
>
>Rabin Vincent (1):
> nomadik-gpio: allow sleep mode dir/pull to differ from normal mode
>
>Sundar Iyer (19):
> mfd/ab8500: remove spi support
> mach-ux500: deprecate spi support for ab8500
> mach-ux500: move keymaps to new file
> mach-ux500: add STMPE1601 platform data
> mfd/tc35892: rename tc35892 header to tc3589x
> mfd/tc35892: rename tc35892 core driver to tc3589x
> mfd/tc3589x: rename tc35892 structs/registers to tc359x
> mfd/tc3589x: add block identifier for multiple child devices
> input/tc3589x: add tc3589x keypad support
> mfd/tc3589x: fix random interrupt misses
> mfd/tc3589x: undo gpio module reset during chip init
> mfd/tc3589x: add suspend/resume support
> plat-nomadik/gpio: add expander gpio pins enumeration
> mach-ux500: add touchscreen interfaces platform data
> i2c/nomadik: add adapter name for updated sanity checkings
> mach-ux500: add TC35893 keypad platform data
> mach-ux500: explicit enable MTU TCR in the kernel
> mach-ux500: clean up checkpatch spits
> i2c/nomadik: some checkpatch warnings
>
> arch/arm/mach-ux500/Makefile | 2 +
> arch/arm/mach-ux500/board-mop500-keypads.c | 229 ++++++++++
> arch/arm/mach-ux500/board-mop500-touchscreen.c | 170 ++++++++
> arch/arm/mach-ux500/board-mop500.c | 164 +-------
> arch/arm/mach-ux500/board-mop500.h | 3 +-
> arch/arm/mach-ux500/clock.c | 167 +++-----
> arch/arm/mach-ux500/devices-db8500.c | 2 +-
> arch/arm/mach-ux500/include/mach/gpio.h | 28 ++
> .../mach-ux500/include/mach/irqs-board-mop500.h | 13 +-
> arch/arm/plat-nomadik/gpio.c | 50 ++-
> arch/arm/plat-nomadik/include/plat/pincfg.h | 70 +++-
> drivers/gpio/Kconfig | 8 +-
> drivers/gpio/Makefile | 2 +-
> drivers/gpio/tc35892-gpio.c | 389 -----------------
> drivers/gpio/tc3589x-gpio.c | 389 +++++++++++++++++
> drivers/i2c/busses/i2c-nomadik.c | 35 +-
> drivers/input/keyboard/Kconfig | 10 +
> drivers/input/keyboard/Makefile | 1 +
> drivers/input/keyboard/tc3589x-keypad.c | 440 ++++++++++++++++++++
> drivers/mfd/Kconfig | 14 +-
> drivers/mfd/Makefile | 4 +-
> drivers/mfd/ab8500-spi.c | 143 -------
> drivers/mfd/tc35892.c | 345 ---------------
> drivers/mfd/tc3589x.c | 438 +++++++++++++++++++
> include/linux/mfd/tc35892.h | 136 ------
> include/linux/mfd/tc3589x.h | 195 +++++++++
> 26 files changed, 2130 insertions(+), 1317 deletions(-)
> create mode 100644 arch/arm/mach-ux500/board-mop500-keypads.c
> create mode 100644 arch/arm/mach-ux500/board-mop500-touchscreen.c
> delete mode 100644 drivers/gpio/tc35892-gpio.c
> create mode 100644 drivers/gpio/tc3589x-gpio.c
> create mode 100644 drivers/input/keyboard/tc3589x-keypad.c
> delete mode 100644 drivers/mfd/ab8500-spi.c
> delete mode 100644 drivers/mfd/tc35892.c
> create mode 100644 drivers/mfd/tc3589x.c
> delete mode 100644 include/linux/mfd/tc35892.h
> create mode 100644 include/linux/mfd/tc3589x.h
>
>--
>1.7.2.dirty

2010-12-09 14:29:18

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd/ab8500: remove spi support

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:34PM +0530, Sundar Iyer wrote:
> Since the Ab8500 v1.0, the SPI support is deprecated on the HW.
I'm fine with that, but you really don't want to be able to support pre 1.0
devices ?

Cheers,
Samuel.


> Signed-off-by: Sundar Iyer <[email protected]>
> ---
> drivers/mfd/Kconfig | 8 +-
> drivers/mfd/Makefile | 2 +-
> drivers/mfd/ab8500-spi.c | 143 ----------------------------------------------
> 3 files changed, 5 insertions(+), 148 deletions(-)
> delete mode 100644 drivers/mfd/ab8500-spi.c
>
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 3a7b891..c856aa7 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -496,13 +496,13 @@ config EZX_PCAP
>
> config AB8500_CORE
> bool "ST-Ericsson AB8500 Mixed Signal Power Management chip"
> - depends on GENERIC_HARDIRQS && ABX500_CORE && SPI_MASTER && ARCH_U8500
> + depends on GENERIC_HARDIRQS && ABX500_CORE && ARCH_U8500
> select MFD_CORE
> help
> Select this option to enable access to AB8500 power management
> - chip. This connects to U8500 either on the SSP/SPI bus
> - or the I2C bus via PRCMU. It also adds the irq_chip
> - parts for handling the Mixed Signal chip events.
> + chip. This connects to U8500 either on the SSP/SPI bus (deprecated
> + since hardware version v1.0) or the I2C bus via PRCMU. It also adds
> + the irq_chip parts for handling the Mixed Signal chip events.
> This chip embeds various other multimedia funtionalities as well.
>
> config AB8500_I2C_CORE
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 04a7226..67c8bcb 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -70,7 +70,7 @@ obj-$(CONFIG_ABX500_CORE) += abx500-core.o
> obj-$(CONFIG_AB3100_CORE) += ab3100-core.o
> obj-$(CONFIG_AB3100_OTP) += ab3100-otp.o
> obj-$(CONFIG_AB3550_CORE) += ab3550-core.o
> -obj-$(CONFIG_AB8500_CORE) += ab8500-core.o ab8500-spi.o
> +obj-$(CONFIG_AB8500_CORE) += ab8500-core.o
> obj-$(CONFIG_AB8500_I2C_CORE) += ab8500-i2c.o
> obj-$(CONFIG_AB8500_DEBUG) += ab8500-debugfs.o
> obj-$(CONFIG_MFD_TIMBERDALE) += timberdale.o
> diff --git a/drivers/mfd/ab8500-spi.c b/drivers/mfd/ab8500-spi.c
> deleted file mode 100644
> index b165342..0000000
> --- a/drivers/mfd/ab8500-spi.c
> +++ /dev/null
> @@ -1,143 +0,0 @@
> -/*
> - * Copyright (C) ST-Ericsson SA 2010
> - *
> - * License Terms: GNU General Public License v2
> - * Author: Srinidhi Kasagar <[email protected]>
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/init.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -#include <linux/spi/spi.h>
> -#include <linux/mfd/ab8500.h>
> -
> -/*
> - * This funtion writes to any AB8500 registers using
> - * SPI protocol & before it writes it packs the data
> - * in the below 24 bit frame format
> - *
> - * *|------------------------------------|
> - * *| 23|22...18|17.......10|9|8|7......0|
> - * *| r/w bank adr data |
> - * * ------------------------------------
> - *
> - * This function shouldn't be called from interrupt
> - * context
> - */
> -static int ab8500_spi_write(struct ab8500 *ab8500, u16 addr, u8 data)
> -{
> - struct spi_device *spi = container_of(ab8500->dev, struct spi_device,
> - dev);
> - unsigned long spi_data = addr << 10 | data;
> - struct spi_transfer xfer;
> - struct spi_message msg;
> -
> - ab8500->tx_buf[0] = spi_data;
> - ab8500->rx_buf[0] = 0;
> -
> - xfer.tx_buf = ab8500->tx_buf;
> - xfer.rx_buf = NULL;
> - xfer.len = sizeof(unsigned long);
> -
> - spi_message_init(&msg);
> - spi_message_add_tail(&xfer, &msg);
> -
> - return spi_sync(spi, &msg);
> -}
> -
> -static int ab8500_spi_read(struct ab8500 *ab8500, u16 addr)
> -{
> - struct spi_device *spi = container_of(ab8500->dev, struct spi_device,
> - dev);
> - unsigned long spi_data = 1 << 23 | addr << 10;
> - struct spi_transfer xfer;
> - struct spi_message msg;
> - int ret;
> -
> - ab8500->tx_buf[0] = spi_data;
> - ab8500->rx_buf[0] = 0;
> -
> - xfer.tx_buf = ab8500->tx_buf;
> - xfer.rx_buf = ab8500->rx_buf;
> - xfer.len = sizeof(unsigned long);
> -
> - spi_message_init(&msg);
> - spi_message_add_tail(&xfer, &msg);
> -
> - ret = spi_sync(spi, &msg);
> - if (!ret)
> - /*
> - * Only the 8 lowermost bytes are
> - * defined with value, the rest may
> - * vary depending on chip/board noise.
> - */
> - ret = ab8500->rx_buf[0] & 0xFFU;
> -
> - return ret;
> -}
> -
> -static int __devinit ab8500_spi_probe(struct spi_device *spi)
> -{
> - struct ab8500 *ab8500;
> - int ret;
> -
> - spi->bits_per_word = 24;
> - ret = spi_setup(spi);
> - if (ret < 0)
> - return ret;
> -
> - ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL);
> - if (!ab8500)
> - return -ENOMEM;
> -
> - ab8500->dev = &spi->dev;
> - ab8500->irq = spi->irq;
> -
> - ab8500->read = ab8500_spi_read;
> - ab8500->write = ab8500_spi_write;
> -
> - spi_set_drvdata(spi, ab8500);
> -
> - ret = ab8500_init(ab8500);
> - if (ret)
> - kfree(ab8500);
> -
> - return ret;
> -}
> -
> -static int __devexit ab8500_spi_remove(struct spi_device *spi)
> -{
> - struct ab8500 *ab8500 = spi_get_drvdata(spi);
> -
> - ab8500_exit(ab8500);
> - kfree(ab8500);
> -
> - return 0;
> -}
> -
> -static struct spi_driver ab8500_spi_driver = {
> - .driver = {
> - .name = "ab8500-spi",
> - .owner = THIS_MODULE,
> - },
> - .probe = ab8500_spi_probe,
> - .remove = __devexit_p(ab8500_spi_remove)
> -};
> -
> -static int __init ab8500_spi_init(void)
> -{
> - return spi_register_driver(&ab8500_spi_driver);
> -}
> -subsys_initcall(ab8500_spi_init);
> -
> -static void __exit ab8500_spi_exit(void)
> -{
> - spi_unregister_driver(&ab8500_spi_driver);
> -}
> -module_exit(ab8500_spi_exit);
> -
> -MODULE_AUTHOR("Srinidhi KASAGAR <[email protected]");
> -MODULE_DESCRIPTION("AB8500 SPI");
> -MODULE_LICENSE("GPL v2");
> --
> 1.7.2.dirty
>

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 14:35:23

by Sundar R IYER

[permalink] [raw]
Subject: RE: [PATCH 01/20] mfd/ab8500: remove spi support

Hi Sam,

[pruning up the CC list]

>-----Original Message-----
>From: Samuel Ortiz [mailto:[email protected]]
>
>> Since the Ab8500 v1.0, the SPI support is deprecated on the HW.
>I'm fine with that, but you really don't want to be able to support pre 1.0
>devices ?

AFAIK, there aren't active pieces of those outside STE :) and it is accepted
that we drop the support for them.

Cheers!

2010-12-09 15:36:39

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd/ab8500: remove spi support

Hi Sundar,

On Thu, Dec 09, 2010 at 03:35:05PM +0100, Sundar R IYER wrote:
> Hi Sam,
>
> [pruning up the CC list]
>
> >-----Original Message-----
> >From: Samuel Ortiz [mailto:[email protected]]
> >
> >> Since the Ab8500 v1.0, the SPI support is deprecated on the HW.
> >I'm fine with that, but you really don't want to be able to support pre 1.0
> >devices ?
>
> AFAIK, there aren't active pieces of those outside STE :)
Ok, that's a good reason. Please add my:
Acked-by: Samuel Ortiz <[email protected]>

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:42:01

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 06/20] mfd/tc35892: rename tc35892 header to tc3589x

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:39PM +0530, Sundar Iyer wrote:
> Rename the header file to include further variants within
> the same mfd core driver

Acked-by: Samuel Ortiz <[email protected]>

> Signed-off-by: Sundar Iyer <[email protected]>
> ---
> drivers/gpio/tc35892-gpio.c | 2 +-
> drivers/mfd/tc35892.c | 2 +-
> include/linux/mfd/{tc35892.h => tc3589x.h} | 0
> 3 files changed, 2 insertions(+), 2 deletions(-)
> rename include/linux/mfd/{tc35892.h => tc3589x.h} (100%)
>
> diff --git a/drivers/gpio/tc35892-gpio.c b/drivers/gpio/tc35892-gpio.c
> index 7e10c93..027b857 100644
> --- a/drivers/gpio/tc35892-gpio.c
> +++ b/drivers/gpio/tc35892-gpio.c
> @@ -13,7 +13,7 @@
> #include <linux/gpio.h>
> #include <linux/irq.h>
> #include <linux/interrupt.h>
> -#include <linux/mfd/tc35892.h>
> +#include <linux/mfd/tc3589x.h>
>
> /*
> * These registers are modified under the irq bus lock and cached to avoid
> diff --git a/drivers/mfd/tc35892.c b/drivers/mfd/tc35892.c
> index e619e2a..f230235 100644
> --- a/drivers/mfd/tc35892.c
> +++ b/drivers/mfd/tc35892.c
> @@ -12,7 +12,7 @@
> #include <linux/slab.h>
> #include <linux/i2c.h>
> #include <linux/mfd/core.h>
> -#include <linux/mfd/tc35892.h>
> +#include <linux/mfd/tc3589x.h>
>
> /**
> * tc35892_reg_read() - read a single TC35892 register
> diff --git a/include/linux/mfd/tc35892.h b/include/linux/mfd/tc3589x.h
> similarity index 100%
> rename from include/linux/mfd/tc35892.h
> rename to include/linux/mfd/tc3589x.h
> --
> 1.7.2.dirty
>

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:42:49

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 07/20] mfd/tc35892: rename tc35892 core driver to tc3589x

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:40PM +0530, Sundar Iyer wrote:
> Rename the tc35892 core/gpio drivers to tc3589x to include
> new variants in the same mfd core

Acked-by: Samuel Ortiz <[email protected]>

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:45:56

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 08/20] mfd/tc3589x: rename tc35892 structs/registers to tc359x

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:41PM +0530, Sundar Iyer wrote:
> Most of the register layout, client IRQ numbers on the TC35892 is shared also
> by other variants. Make this generic as tc3589x

I suppose board-mop500.c is the only tc35892 user ? I couldn't find any other
piece of code using it, I just want to double check.
If that's the case then:

Acked-by: Samuel Ortiz <[email protected]>

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:48:29

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 09/20] mfd/tc3589x: add block identifier for multiple child devices

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:42PM +0530, Sundar Iyer wrote:
> Add block identifier to be able to add multiple mfd clients
> to the mfd core

Acked-by: Samuel Ortiz <[email protected]>

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:50:01

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 11/20] mfd/tc3589x: fix random interrupt misses

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:44PM +0530, Sundar Iyer wrote:
> On the TC35892, a random delayed interrupt clear (GPIO IC) write locks up the
> child interrupts. In such a case, the original interrupt is active and not yet
> acknowledged. Re-check the IRQST bit for any pending interrupts and handle
> those.

Acked-by: Samuel Ortiz <[email protected]>

That does look like this patch should go into 2.6.37. Could you please
generate it against Linus tree and send it to me ?

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 15:50:30

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 12/20] mfd/tc3589x: undo gpio module reset during chip init

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:45PM +0530, Sundar Iyer wrote:
> Skip putting the GPIO module into a reset during the chip init. This makes
> sure to preserve any existing GPIO configurations done by pre-kernel boot code.
>

Acked-by: Samuel Ortiz <[email protected]>

Cheers,
Samuel.

> Signed-off-by: Sundar Iyer <[email protected]>
> ---
> drivers/mfd/tc3589x.c | 9 ++++++---
> 1 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
> index e173f33..fd206fd 100644
> --- a/drivers/mfd/tc3589x.c
> +++ b/drivers/mfd/tc3589x.c
> @@ -247,12 +247,15 @@ static int tc3589x_chip_init(struct tc3589x *tc3589x)
>
> dev_info(tc3589x->dev, "manufacturer: %#x, version: %#x\n", manf, ver);
>
> - /* Put everything except the IRQ module into reset */
> + /*
> + * Put everything except the IRQ module into reset;
> + * also spare the GPIO module for any pin initialization
> + * done during pre-kernel boot
> + */
> ret = tc3589x_reg_write(tc3589x, TC3589x_RSTCTRL,
> TC3589x_RSTCTRL_TIMRST
> | TC3589x_RSTCTRL_ROTRST
> - | TC3589x_RSTCTRL_KBDRST
> - | TC3589x_RSTCTRL_GPIRST);
> + | TC3589x_RSTCTRL_KBDRST);
> if (ret < 0)
> return ret;
>
> --
> 1.7.2.dirty
>

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-09 17:04:03

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 13/20] mfd/tc3589x: add suspend/resume support

Hi Sundar,

On Fri, Dec 03, 2010 at 08:35:46PM +0530, Sundar Iyer wrote:

Acked-by: Samuel Ortiz <[email protected]>

One remark though:
> +
> +static const struct dev_pm_ops tc3589x_dev_pm_ops = {
> + .suspend = tc3589x_suspend,
> + .resume = tc3589x_resume,
> +};
> +#endif
SIMPLE_DEV_PM_OPS or UNIVERSAL_DEV_PM_OPS may be useful and save one ifdef
here.

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/

2010-12-10 04:32:01

by Sundar R IYER

[permalink] [raw]
Subject: RE: [PATCH 11/20] mfd/tc3589x: fix random interrupt misses

Hi Sam,

>-----Original Message-----
>
>That does look like this patch should go into 2.6.37. Could you please
>generate it against Linus tree and send it to me ?
>
Sure. I will send out this one separately against Linus tree.

Cheers!

2010-12-10 04:33:30

by Sundar R IYER

[permalink] [raw]
Subject: RE: [PATCH 13/20] mfd/tc3589x: add suspend/resume support

Hi Sam,

>-----Original Message-----
>
>SIMPLE_DEV_PM_OPS or UNIVERSAL_DEV_PM_OPS may be useful and save
>one ifdef
>here.

Sure, better.

And thanx for ack'ing all those patches; I will repost with your Acked-bys and rebased.

Cheers!

2010-12-19 20:48:48

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd/ab8500: remove spi support

2010/12/9 Samuel Ortiz <[email protected]>:

>> [Sundar]
>> >> Since the Ab8500 v1.0, the SPI support is deprecated on the HW.
>> >I'm fine with that, but you really don't want to be able to support pre 1.0
>> >devices ?
>>
>> AFAIK, there aren't active pieces of those outside STE :)
> Ok, that's a good reason. Please add my:
> Acked-by: Samuel Ortiz <[email protected]>

This better be merged through the MFD tree. It touches a line in
the Makefile that has been changed since, the fixup is trivial but
it's orthogonal to the stuff I have in ux500-core anyway so Sam,
can you merge this into MFD?

(The other patch to remove the platform data for SPI mode
is in my ux500-core git already.)

Yours,
Linus Walleij

2010-12-19 20:53:25

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 03/20] mach-ux500: move keymaps to new file

2010/12/3 Sundar Iyer <[email protected]>:

> Move keylayouts to a dedicated file and plug these keylayouts
> for input platform data. This will make addition of new and custom
> keylayouts localized.

Managed to rebase this somewhat easily on top of the last
batch of tc3589x MFD patches and pushed for ux500-core,
please check that I didn't screw anything up.

Yours,
Linus Walleij

2010-12-19 20:54:34

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 05/20] mach-ux500: add STMPE1601 platform data

I managed to rebase and push patch this patch too.

Now I get input characters from my STMPE1601 keypad on the
STUIB :-)

Yours,
Linus Walleij

2010-12-19 21:03:13

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 00/20] ux500: platform data, TC3589x keypad driver

OK so after a second spin over these patches...

2010/12/3 Sundar Iyer <[email protected]>:

> Rabin Vincent (1):
> ?nomadik-gpio: allow sleep mode dir/pull to differ from normal mode
>
> Sundar Iyer (19):
> ?mfd/ab8500: remove spi support
> mach-ux500: move keymaps to new file
> mach-ux500: add STMPE1601 platform data
> mach-ux500: explicit enable MTU TCR in the kernel
> mach-ux500: clean up checkpatch spits

Merged to ux500-core for testing in -next.

> ?mach-ux500: deprecate spi support for ab8500

Want Sam to merge this to the MFD tree.

> ?mfd/tc35892: rename tc35892 header to tc3589x
> ?mfd/tc35892: rename tc35892 core driver to tc3589x
> ?mfd/tc3589x: rename tc35892 structs/registers to tc359x
> ?mfd/tc3589x: add block identifier for multiple child devices
> ?mfd/tc3589x: fix random interrupt misses
> ?mfd/tc3589x: undo gpio module reset during chip init
> ?mfd/tc3589x: add suspend/resume support

I assume all of this was in the partly rewritten
tc35892->tc3589x refactoring I merged into ux500-core
with Sam's Acked-by:

> plat-nomadik/gpio: add expander gpio pins enumeration

Dropped, Rabin merged another version.

> ?mach-ux500: add touchscreen interfaces platform data

Pending that the staging tree containing the RMI4 driver
gets merged first. This patch will probably have to either
get merged through Gregs tree (probably hard because he
needs to refactor the ux500-core files in his tree which
will screwup) or wait till next merge cycle or -rc1.

> ?i2c/nomadik: add adapter name for updated sanity checkings

Dropped because there is already a similar patch pending
which I submitted independently when I saw the same boot
error...

> input/tc3589x: add tc3589x keypad support
> ?mach-ux500: add TC35893 keypad platform data

Pending review of the TC35893 keypad input driver.
Will be happy to merge this once we have Dmirtry's
Acked-by:

> ?i2c/nomadik: some checkpatch warnings

Please send this to the I2C maintainers...

Did I get everything right?

Yours,
Linus Walleij

2010-12-24 10:53:51

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd/ab8500: remove spi support

Hi Linus,

On Sun, Dec 19, 2010 at 09:48:46PM +0100, Linus Walleij wrote:
> 2010/12/9 Samuel Ortiz <[email protected]>:
>
> >> [Sundar]
> >> >> Since the Ab8500 v1.0, the SPI support is deprecated on the HW.
> >> >I'm fine with that, but you really don't want to be able to support pre 1.0
> >> >devices ?
> >>
> >> AFAIK, there aren't active pieces of those outside STE :)
> > Ok, that's a good reason. Please add my:
> > Acked-by: Samuel Ortiz <[email protected]>
>
> This better be merged through the MFD tree. It touches a line in
> the Makefile that has been changed since, the fixup is trivial but
> it's orthogonal to the stuff I have in ux500-core anyway so Sam,
> can you merge this into MFD?
Sure, patch applied now.

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/