Merge branch 'depends/omap/gpio/runtime-pm-cleanup' into next/cleanup
Conflicts: arch/arm/mach-omap1/gpio16xx.c drivers/gpio/gpio-omap.c Merge in the runtime-pm-cleanup branch from the gpio tree into next/cleanup, this resolves a nonobvious merge conflict between the two branches. Both branches move parts of the gpio-omap driver into platform code, this takes the superset of both changes. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
1220547bfd
@ -42,11 +42,12 @@ static struct omap_gpio_reg_offs omap15xx_mpuio_regs = {
|
||||
.irqstatus = OMAP_MPUIO_GPIO_INT,
|
||||
.irqenable = OMAP_MPUIO_GPIO_MASKIT,
|
||||
.irqenable_inv = true,
|
||||
.irqctrl = OMAP_MPUIO_GPIO_INT_EDGE,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
|
||||
.virtual_irq_start = IH_MPUIO_BASE,
|
||||
.bank_type = METHOD_MPUIO,
|
||||
.is_mpuio = true,
|
||||
.bank_width = 16,
|
||||
.bank_stride = 1,
|
||||
.regs = &omap15xx_mpuio_regs,
|
||||
@ -83,11 +84,12 @@ static struct omap_gpio_reg_offs omap15xx_gpio_regs = {
|
||||
.irqstatus = OMAP1510_GPIO_INT_STATUS,
|
||||
.irqenable = OMAP1510_GPIO_INT_MASK,
|
||||
.irqenable_inv = true,
|
||||
.irqctrl = OMAP1510_GPIO_INT_CONTROL,
|
||||
.pinctrl = OMAP1510_GPIO_PIN_CONTROL,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE,
|
||||
.bank_type = METHOD_GPIO_1510,
|
||||
.bank_width = 16,
|
||||
.regs = &omap15xx_gpio_regs,
|
||||
};
|
||||
@ -115,7 +117,6 @@ static int __init omap15xx_gpio_init(void)
|
||||
platform_device_register(&omap15xx_mpu_gpio);
|
||||
platform_device_register(&omap15xx_gpio);
|
||||
|
||||
gpio_bank_count = 2;
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(omap15xx_gpio_init);
|
||||
|
@ -24,6 +24,9 @@
|
||||
#define OMAP1610_GPIO4_BASE 0xfffbbc00
|
||||
#define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE
|
||||
|
||||
/* smart idle, enable wakeup */
|
||||
#define SYSCONFIG_WORD 0x14
|
||||
|
||||
/* mpu gpio */
|
||||
static struct __initdata resource omap16xx_mpu_gpio_resources[] = {
|
||||
{
|
||||
@ -45,11 +48,12 @@ static struct omap_gpio_reg_offs omap16xx_mpuio_regs = {
|
||||
.irqstatus = OMAP_MPUIO_GPIO_INT,
|
||||
.irqenable = OMAP_MPUIO_GPIO_MASKIT,
|
||||
.irqenable_inv = true,
|
||||
.irqctrl = OMAP_MPUIO_GPIO_INT_EDGE,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
|
||||
.virtual_irq_start = IH_MPUIO_BASE,
|
||||
.bank_type = METHOD_MPUIO,
|
||||
.is_mpuio = true,
|
||||
.bank_width = 16,
|
||||
.bank_stride = 1,
|
||||
.regs = &omap16xx_mpuio_regs,
|
||||
@ -89,11 +93,13 @@ static struct omap_gpio_reg_offs omap16xx_gpio_regs = {
|
||||
.irqenable = OMAP1610_GPIO_IRQENABLE1,
|
||||
.set_irqenable = OMAP1610_GPIO_SET_IRQENABLE1,
|
||||
.clr_irqenable = OMAP1610_GPIO_CLEAR_IRQENABLE1,
|
||||
.wkup_en = OMAP1610_GPIO_WAKEUPENABLE,
|
||||
.edgectrl1 = OMAP1610_GPIO_EDGE_CTRL1,
|
||||
.edgectrl2 = OMAP1610_GPIO_EDGE_CTRL2,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE,
|
||||
.bank_type = METHOD_GPIO_1610,
|
||||
.bank_width = 16,
|
||||
.regs = &omap16xx_gpio_regs,
|
||||
};
|
||||
@ -123,7 +129,6 @@ static struct __initdata resource omap16xx_gpio2_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 16,
|
||||
.bank_type = METHOD_GPIO_1610,
|
||||
.bank_width = 16,
|
||||
.regs = &omap16xx_gpio_regs,
|
||||
};
|
||||
@ -153,7 +158,6 @@ static struct __initdata resource omap16xx_gpio3_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 32,
|
||||
.bank_type = METHOD_GPIO_1610,
|
||||
.bank_width = 16,
|
||||
.regs = &omap16xx_gpio_regs,
|
||||
};
|
||||
@ -183,7 +187,6 @@ static struct __initdata resource omap16xx_gpio4_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 48,
|
||||
.bank_type = METHOD_GPIO_1610,
|
||||
.bank_width = 16,
|
||||
.regs = &omap16xx_gpio_regs,
|
||||
};
|
||||
@ -214,6 +217,10 @@ static struct __initdata platform_device * omap16xx_gpio_dev[] = {
|
||||
static int __init omap16xx_gpio_init(void)
|
||||
{
|
||||
int i;
|
||||
void __iomem *base;
|
||||
struct resource *res;
|
||||
struct platform_device *pdev;
|
||||
struct omap_gpio_platform_data *pdata;
|
||||
|
||||
if (!cpu_is_omap16xx())
|
||||
return -EINVAL;
|
||||
@ -225,10 +232,27 @@ static int __init omap16xx_gpio_init(void)
|
||||
omap_writel(omap_readl(ULPD_CAM_CLK_CTRL) | 0x04,
|
||||
ULPD_CAM_CLK_CTRL);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++)
|
||||
platform_device_register(omap16xx_gpio_dev[i]);
|
||||
for (i = 0; i < ARRAY_SIZE(omap16xx_gpio_dev); i++) {
|
||||
pdev = omap16xx_gpio_dev[i];
|
||||
pdata = pdev->dev.platform_data;
|
||||
|
||||
gpio_bank_count = ARRAY_SIZE(omap16xx_gpio_dev);
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (unlikely(!res)) {
|
||||
dev_err(&pdev->dev, "Invalid mem resource.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
base = ioremap(res->start, resource_size(res));
|
||||
if (unlikely(!base)) {
|
||||
dev_err(&pdev->dev, "ioremap failed.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
__raw_writel(SYSCONFIG_WORD, base + OMAP1610_GPIO_SYSCONFIG);
|
||||
iounmap(base);
|
||||
|
||||
platform_device_register(omap16xx_gpio_dev[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,12 +47,13 @@ static struct omap_gpio_reg_offs omap7xx_mpuio_regs = {
|
||||
.irqstatus = OMAP_MPUIO_GPIO_INT / 2,
|
||||
.irqenable = OMAP_MPUIO_GPIO_MASKIT / 2,
|
||||
.irqenable_inv = true,
|
||||
.irqctrl = OMAP_MPUIO_GPIO_INT_EDGE >> 1,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
|
||||
.virtual_irq_start = IH_MPUIO_BASE,
|
||||
.bank_type = METHOD_MPUIO,
|
||||
.bank_width = 32,
|
||||
.is_mpuio = true,
|
||||
.bank_width = 16,
|
||||
.bank_stride = 2,
|
||||
.regs = &omap7xx_mpuio_regs,
|
||||
};
|
||||
@ -88,11 +89,11 @@ static struct omap_gpio_reg_offs omap7xx_gpio_regs = {
|
||||
.irqstatus = OMAP7XX_GPIO_INT_STATUS,
|
||||
.irqenable = OMAP7XX_GPIO_INT_MASK,
|
||||
.irqenable_inv = true,
|
||||
.irqctrl = OMAP7XX_GPIO_INT_CONTROL,
|
||||
};
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -122,7 +123,6 @@ static struct __initdata resource omap7xx_gpio2_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 32,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -152,7 +152,6 @@ static struct __initdata resource omap7xx_gpio3_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 64,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -182,7 +181,6 @@ static struct __initdata resource omap7xx_gpio4_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 96,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -212,7 +210,6 @@ static struct __initdata resource omap7xx_gpio5_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 128,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -242,7 +239,6 @@ static struct __initdata resource omap7xx_gpio6_resources[] = {
|
||||
|
||||
static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {
|
||||
.virtual_irq_start = IH_GPIO_BASE + 160,
|
||||
.bank_type = METHOD_GPIO_7XX,
|
||||
.bank_width = 32,
|
||||
.regs = &omap7xx_gpio_regs,
|
||||
};
|
||||
@ -282,8 +278,6 @@ static int __init omap7xx_gpio_init(void)
|
||||
for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++)
|
||||
platform_device_register(omap7xx_gpio_dev[i]);
|
||||
|
||||
gpio_bank_count = ARRAY_SIZE(omap7xx_gpio_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(omap7xx_gpio_init);
|
||||
|
@ -23,6 +23,9 @@
|
||||
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#include "powerdomain.h"
|
||||
|
||||
static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
{
|
||||
@ -31,6 +34,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
struct omap_gpio_dev_attr *dev_attr;
|
||||
char *name = "omap_gpio";
|
||||
int id;
|
||||
struct powerdomain *pwrdm;
|
||||
|
||||
/*
|
||||
* extract the device id from name field available in the
|
||||
@ -52,7 +56,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
pdata->bank_width = dev_attr->bank_width;
|
||||
pdata->dbck_flag = dev_attr->dbck_flag;
|
||||
pdata->virtual_irq_start = IH_GPIO_BASE + 32 * (id - 1);
|
||||
|
||||
pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
||||
pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
pr_err("gpio%d: Memory allocation failed\n", id);
|
||||
@ -61,8 +65,15 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
|
||||
switch (oh->class->rev) {
|
||||
case 0:
|
||||
if (id == 1)
|
||||
/* non-wakeup GPIO pins for OMAP2 Bank1 */
|
||||
pdata->non_wakeup_gpios = 0xe203ffc0;
|
||||
else if (id == 2)
|
||||
/* non-wakeup GPIO pins for OMAP2 Bank2 */
|
||||
pdata->non_wakeup_gpios = 0x08700040;
|
||||
/* fall through */
|
||||
|
||||
case 1:
|
||||
pdata->bank_type = METHOD_GPIO_24XX;
|
||||
pdata->regs->revision = OMAP24XX_GPIO_REVISION;
|
||||
pdata->regs->direction = OMAP24XX_GPIO_OE;
|
||||
pdata->regs->datain = OMAP24XX_GPIO_DATAIN;
|
||||
@ -72,13 +83,19 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1;
|
||||
pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2;
|
||||
pdata->regs->irqenable = OMAP24XX_GPIO_IRQENABLE1;
|
||||
pdata->regs->irqenable2 = OMAP24XX_GPIO_IRQENABLE2;
|
||||
pdata->regs->set_irqenable = OMAP24XX_GPIO_SETIRQENABLE1;
|
||||
pdata->regs->clr_irqenable = OMAP24XX_GPIO_CLEARIRQENABLE1;
|
||||
pdata->regs->debounce = OMAP24XX_GPIO_DEBOUNCE_VAL;
|
||||
pdata->regs->debounce_en = OMAP24XX_GPIO_DEBOUNCE_EN;
|
||||
pdata->regs->ctrl = OMAP24XX_GPIO_CTRL;
|
||||
pdata->regs->wkup_en = OMAP24XX_GPIO_WAKE_EN;
|
||||
pdata->regs->leveldetect0 = OMAP24XX_GPIO_LEVELDETECT0;
|
||||
pdata->regs->leveldetect1 = OMAP24XX_GPIO_LEVELDETECT1;
|
||||
pdata->regs->risingdetect = OMAP24XX_GPIO_RISINGDETECT;
|
||||
pdata->regs->fallingdetect = OMAP24XX_GPIO_FALLINGDETECT;
|
||||
break;
|
||||
case 2:
|
||||
pdata->bank_type = METHOD_GPIO_44XX;
|
||||
pdata->regs->revision = OMAP4_GPIO_REVISION;
|
||||
pdata->regs->direction = OMAP4_GPIO_OE;
|
||||
pdata->regs->datain = OMAP4_GPIO_DATAIN;
|
||||
@ -88,10 +105,17 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0;
|
||||
pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1;
|
||||
pdata->regs->irqenable = OMAP4_GPIO_IRQSTATUSSET0;
|
||||
pdata->regs->irqenable2 = OMAP4_GPIO_IRQSTATUSSET1;
|
||||
pdata->regs->set_irqenable = OMAP4_GPIO_IRQSTATUSSET0;
|
||||
pdata->regs->clr_irqenable = OMAP4_GPIO_IRQSTATUSCLR0;
|
||||
pdata->regs->debounce = OMAP4_GPIO_DEBOUNCINGTIME;
|
||||
pdata->regs->debounce_en = OMAP4_GPIO_DEBOUNCENABLE;
|
||||
pdata->regs->ctrl = OMAP4_GPIO_CTRL;
|
||||
pdata->regs->wkup_en = OMAP4_GPIO_IRQWAKEN0;
|
||||
pdata->regs->leveldetect0 = OMAP4_GPIO_LEVELDETECT0;
|
||||
pdata->regs->leveldetect1 = OMAP4_GPIO_LEVELDETECT1;
|
||||
pdata->regs->risingdetect = OMAP4_GPIO_RISINGDETECT;
|
||||
pdata->regs->fallingdetect = OMAP4_GPIO_FALLINGDETECT;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Invalid gpio bank_type\n");
|
||||
@ -99,6 +123,9 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pwrdm = omap_hwmod_get_pwrdm(oh);
|
||||
pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
|
||||
|
||||
pdev = omap_device_build(name, id - 1, oh, pdata,
|
||||
sizeof(*pdata), NULL, 0, false);
|
||||
kfree(pdata);
|
||||
@ -109,9 +136,6 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
omap_device_disable_idle_on_suspend(pdev);
|
||||
|
||||
gpio_bank_count++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -75,16 +75,6 @@ static struct powerdomain *mpu_pwrdm, *neon_pwrdm;
|
||||
static struct powerdomain *core_pwrdm, *per_pwrdm;
|
||||
static struct powerdomain *cam_pwrdm;
|
||||
|
||||
static inline void omap3_per_save_context(void)
|
||||
{
|
||||
omap_gpio_save_context();
|
||||
}
|
||||
|
||||
static inline void omap3_per_restore_context(void)
|
||||
{
|
||||
omap_gpio_restore_context();
|
||||
}
|
||||
|
||||
static void omap3_enable_io_chain(void)
|
||||
{
|
||||
int timeout = 0;
|
||||
@ -332,8 +322,6 @@ void omap_sram_idle(void)
|
||||
if (per_next_state < PWRDM_POWER_ON) {
|
||||
per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
|
||||
omap2_gpio_prepare_for_idle(per_going_off);
|
||||
if (per_next_state == PWRDM_POWER_OFF)
|
||||
omap3_per_save_context();
|
||||
}
|
||||
|
||||
/* CORE */
|
||||
@ -399,8 +387,6 @@ void omap_sram_idle(void)
|
||||
if (per_next_state < PWRDM_POWER_ON) {
|
||||
per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
|
||||
omap2_gpio_resume_after_idle();
|
||||
if (per_prev_state == PWRDM_POWER_OFF)
|
||||
omap3_per_restore_context();
|
||||
}
|
||||
|
||||
/* Disable IO-PAD and IO-CHAIN wakeup */
|
||||
|
@ -162,13 +162,6 @@
|
||||
IH_MPUIO_BASE + ((nr) & 0x0f) : \
|
||||
IH_GPIO_BASE + (nr))
|
||||
|
||||
#define METHOD_MPUIO 0
|
||||
#define METHOD_GPIO_1510 1
|
||||
#define METHOD_GPIO_1610 2
|
||||
#define METHOD_GPIO_7XX 3
|
||||
#define METHOD_GPIO_24XX 5
|
||||
#define METHOD_GPIO_44XX 6
|
||||
|
||||
struct omap_gpio_dev_attr {
|
||||
int bank_width; /* GPIO bank width */
|
||||
bool dbck_flag; /* dbck required or not - True for OMAP3&4 */
|
||||
@ -184,10 +177,21 @@ struct omap_gpio_reg_offs {
|
||||
u16 irqstatus;
|
||||
u16 irqstatus2;
|
||||
u16 irqenable;
|
||||
u16 irqenable2;
|
||||
u16 set_irqenable;
|
||||
u16 clr_irqenable;
|
||||
u16 debounce;
|
||||
u16 debounce_en;
|
||||
u16 ctrl;
|
||||
u16 wkup_en;
|
||||
u16 leveldetect0;
|
||||
u16 leveldetect1;
|
||||
u16 risingdetect;
|
||||
u16 fallingdetect;
|
||||
u16 irqctrl;
|
||||
u16 edgectrl1;
|
||||
u16 edgectrl2;
|
||||
u16 pinctrl;
|
||||
|
||||
bool irqenable_inv;
|
||||
};
|
||||
@ -198,19 +202,20 @@ struct omap_gpio_platform_data {
|
||||
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 loses_context; /* whether the bank would ever lose context */
|
||||
bool is_mpuio; /* whether the bank is of type MPUIO */
|
||||
u32 non_wakeup_gpios;
|
||||
|
||||
struct omap_gpio_reg_offs *regs;
|
||||
};
|
||||
|
||||
/* TODO: Analyze removing gpio_bank_count usage from driver code */
|
||||
extern int gpio_bank_count;
|
||||
/* Return context loss count due to PM states changing */
|
||||
int (*get_context_loss_count)(struct device *dev);
|
||||
};
|
||||
|
||||
extern void omap2_gpio_prepare_for_idle(int off_mode);
|
||||
extern void omap2_gpio_resume_after_idle(void);
|
||||
extern void omap_set_gpio_debounce(int gpio, int enable);
|
||||
extern void omap_set_gpio_debounce_time(int gpio, int enable);
|
||||
extern void omap_gpio_save_context(void);
|
||||
extern void omap_gpio_restore_context(void);
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* Wrappers for "new style" GPIO calls, using the new infrastructure
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user