Commit 5de62b86 authored by Tony Lindgren's avatar Tony Lindgren

omap1: Fix gpio mpuio bank to work for multi-omap for 7xx/15xx/16xx

We need to divide the 15xx/16xx offset by 2 for 7xx. Use bank->stride
for that. This allows us to get rid of the duplicate defines for the
MPUIO registers.

Note that this will cause omap-keypad.c driver to not work on 7xx.
However, the right fix there is to move over to matrix_keypad instead
as suggested by Cory Maccarrone <darkstar6262@gmail.com> and
Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>.

Cc: Cory Maccarrone <darkstar6262@gmail.com>
Acked-by: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 77640aab
...@@ -38,6 +38,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = { ...@@ -38,6 +38,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
.virtual_irq_start = IH_MPUIO_BASE, .virtual_irq_start = IH_MPUIO_BASE,
.bank_type = METHOD_MPUIO, .bank_type = METHOD_MPUIO,
.bank_width = 16, .bank_width = 16,
.bank_stride = 1,
}; };
static struct __initdata platform_device omap15xx_mpu_gpio = { static struct __initdata platform_device omap15xx_mpu_gpio = {
......
...@@ -41,6 +41,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = { ...@@ -41,6 +41,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
.virtual_irq_start = IH_MPUIO_BASE, .virtual_irq_start = IH_MPUIO_BASE,
.bank_type = METHOD_MPUIO, .bank_type = METHOD_MPUIO,
.bank_width = 16, .bank_width = 16,
.bank_stride = 1,
}; };
static struct __initdata platform_device omap16xx_mpu_gpio = { static struct __initdata platform_device omap16xx_mpu_gpio = {
......
...@@ -43,6 +43,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = { ...@@ -43,6 +43,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
.virtual_irq_start = IH_MPUIO_BASE, .virtual_irq_start = IH_MPUIO_BASE,
.bank_type = METHOD_MPUIO, .bank_type = METHOD_MPUIO,
.bank_width = 32, .bank_width = 32,
.bank_stride = 2,
}; };
static struct __initdata platform_device omap7xx_mpu_gpio = { static struct __initdata platform_device omap7xx_mpu_gpio = {
......
...@@ -159,6 +159,7 @@ struct gpio_bank { ...@@ -159,6 +159,7 @@ struct gpio_bank {
u32 dbck_enable_mask; u32 dbck_enable_mask;
struct device *dev; struct device *dev;
bool dbck_flag; bool dbck_flag;
int stride;
}; };
#ifdef CONFIG_ARCH_OMAP3 #ifdef CONFIG_ARCH_OMAP3
...@@ -267,7 +268,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) ...@@ -267,7 +268,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_IO_CNTL; reg += OMAP_MPUIO_IO_CNTL / bank->stride;
break; break;
#endif #endif
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
...@@ -315,7 +316,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) ...@@ -315,7 +316,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_OUTPUT; reg += OMAP_MPUIO_OUTPUT / bank->stride;
l = __raw_readl(reg); l = __raw_readl(reg);
if (enable) if (enable)
l |= 1 << gpio; l |= 1 << gpio;
...@@ -387,7 +388,7 @@ static int _get_gpio_datain(struct gpio_bank *bank, int gpio) ...@@ -387,7 +388,7 @@ static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_INPUT_LATCH; reg += OMAP_MPUIO_INPUT_LATCH / bank->stride;
break; break;
#endif #endif
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
...@@ -433,7 +434,7 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) ...@@ -433,7 +434,7 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_OUTPUT; reg += OMAP_MPUIO_OUTPUT / bank->stride;
break; break;
#endif #endif
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
...@@ -620,7 +621,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio) ...@@ -620,7 +621,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
switch (bank->method) { switch (bank->method) {
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_INT_EDGE; reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
break; break;
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
case METHOD_GPIO_1510: case METHOD_GPIO_1510:
...@@ -654,7 +655,7 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) ...@@ -654,7 +655,7 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_INT_EDGE; reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
l = __raw_readl(reg); l = __raw_readl(reg);
if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
bank->toggle_mask |= 1 << gpio; bank->toggle_mask |= 1 << gpio;
...@@ -840,7 +841,7 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank) ...@@ -840,7 +841,7 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_MASKIT; reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
mask = 0xffff; mask = 0xffff;
inv = 1; inv = 1;
break; break;
...@@ -897,7 +898,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab ...@@ -897,7 +898,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_MASKIT; reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
l = __raw_readl(reg); l = __raw_readl(reg);
if (enable) if (enable)
l &= ~(gpio_mask); l &= ~(gpio_mask);
...@@ -1147,7 +1148,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) ...@@ -1147,7 +1148,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
bank = get_irq_data(irq); bank = get_irq_data(irq);
#ifdef CONFIG_ARCH_OMAP1 #ifdef CONFIG_ARCH_OMAP1
if (bank->method == METHOD_MPUIO) if (bank->method == METHOD_MPUIO)
isr_reg = bank->base + OMAP_MPUIO_GPIO_INT; isr_reg = bank->base +
OMAP_MPUIO_GPIO_INT / bank->stride;
#endif #endif
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
if (bank->method == METHOD_GPIO_1510) if (bank->method == METHOD_GPIO_1510)
...@@ -1345,7 +1347,8 @@ static int omap_mpuio_suspend_noirq(struct device *dev) ...@@ -1345,7 +1347,8 @@ static int omap_mpuio_suspend_noirq(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct gpio_bank *bank = platform_get_drvdata(pdev); struct gpio_bank *bank = platform_get_drvdata(pdev);
void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; void __iomem *mask_reg = bank->base +
OMAP_MPUIO_GPIO_MASKIT / bank->stride;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bank->lock, flags); spin_lock_irqsave(&bank->lock, flags);
...@@ -1360,7 +1363,8 @@ static int omap_mpuio_resume_noirq(struct device *dev) ...@@ -1360,7 +1363,8 @@ static int omap_mpuio_resume_noirq(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct gpio_bank *bank = platform_get_drvdata(pdev); struct gpio_bank *bank = platform_get_drvdata(pdev);
void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; void __iomem *mask_reg = bank->base +
OMAP_MPUIO_GPIO_MASKIT / bank->stride;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&bank->lock, flags); spin_lock_irqsave(&bank->lock, flags);
...@@ -1440,7 +1444,7 @@ static int gpio_is_input(struct gpio_bank *bank, int mask) ...@@ -1440,7 +1444,7 @@ static int gpio_is_input(struct gpio_bank *bank, int mask)
switch (bank->method) { switch (bank->method) {
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_IO_CNTL; reg += OMAP_MPUIO_IO_CNTL / bank->stride;
break; break;
case METHOD_GPIO_1510: case METHOD_GPIO_1510:
reg += OMAP1510_GPIO_DIR_CONTROL; reg += OMAP1510_GPIO_DIR_CONTROL;
...@@ -1601,8 +1605,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id) ...@@ -1601,8 +1605,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
} }
} else if (cpu_class_is_omap1()) { } else if (cpu_class_is_omap1()) {
if (bank_is_mpuio(bank)) if (bank_is_mpuio(bank))
__raw_writew(0xffff, bank->base __raw_writew(0xffff, bank->base +
+ OMAP_MPUIO_GPIO_MASKIT); OMAP_MPUIO_GPIO_MASKIT / bank->stride);
if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) { if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
__raw_writew(0xffff, bank->base __raw_writew(0xffff, bank->base
+ OMAP1510_GPIO_INT_MASK); + OMAP1510_GPIO_INT_MASK);
...@@ -1716,6 +1720,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev) ...@@ -1716,6 +1720,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
bank->method = pdata->bank_type; bank->method = pdata->bank_type;
bank->dev = &pdev->dev; bank->dev = &pdev->dev;
bank->dbck_flag = pdata->dbck_flag; bank->dbck_flag = pdata->dbck_flag;
bank->stride = pdata->bank_stride;
bank_width = pdata->bank_width; bank_width = pdata->bank_width;
spin_lock_init(&bank->lock); spin_lock_init(&bank->lock);
......
...@@ -32,22 +32,10 @@ ...@@ -32,22 +32,10 @@
#define OMAP1_MPUIO_BASE 0xfffb5000 #define OMAP1_MPUIO_BASE 0xfffb5000
#if (defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)) /*
* These are the omap15xx/16xx offsets. The omap7xx offset are
#define OMAP_MPUIO_INPUT_LATCH 0x00 * OMAP_MPUIO_ / 2 offsets below.
#define OMAP_MPUIO_OUTPUT 0x02 */
#define OMAP_MPUIO_IO_CNTL 0x04
#define OMAP_MPUIO_KBR_LATCH 0x08
#define OMAP_MPUIO_KBC 0x0a
#define OMAP_MPUIO_GPIO_EVENT_MODE 0x0c
#define OMAP_MPUIO_GPIO_INT_EDGE 0x0e
#define OMAP_MPUIO_KBD_INT 0x10
#define OMAP_MPUIO_GPIO_INT 0x12
#define OMAP_MPUIO_KBD_MASKIT 0x14
#define OMAP_MPUIO_GPIO_MASKIT 0x16
#define OMAP_MPUIO_GPIO_DEBOUNCING 0x18
#define OMAP_MPUIO_LATCH 0x1a
#else
#define OMAP_MPUIO_INPUT_LATCH 0x00 #define OMAP_MPUIO_INPUT_LATCH 0x00
#define OMAP_MPUIO_OUTPUT 0x04 #define OMAP_MPUIO_OUTPUT 0x04
#define OMAP_MPUIO_IO_CNTL 0x08 #define OMAP_MPUIO_IO_CNTL 0x08
...@@ -61,7 +49,6 @@ ...@@ -61,7 +49,6 @@
#define OMAP_MPUIO_GPIO_MASKIT 0x2c #define OMAP_MPUIO_GPIO_MASKIT 0x2c
#define OMAP_MPUIO_GPIO_DEBOUNCING 0x30 #define OMAP_MPUIO_GPIO_DEBOUNCING 0x30
#define OMAP_MPUIO_LATCH 0x34 #define OMAP_MPUIO_LATCH 0x34
#endif
#define OMAP34XX_NR_GPIOS 6 #define OMAP34XX_NR_GPIOS 6
...@@ -88,6 +75,7 @@ struct omap_gpio_platform_data { ...@@ -88,6 +75,7 @@ struct omap_gpio_platform_data {
u16 virtual_irq_start; u16 virtual_irq_start;
int bank_type; int bank_type;
int bank_width; /* GPIO bank width */ int bank_width; /* GPIO bank width */
int bank_stride; /* Only needed for omap1 MPUIO */
bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ bool dbck_flag; /* dbck required or not - True for OMAP3&4 */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment