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: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
77640aabd7
commit
5de62b86d2
@ -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 = {
|
|||||||
.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 = {
|
|||||||
.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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
} 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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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 @@
|
|||||||
#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 {
|
|||||||
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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user