Commit f8a0941f authored by Mark Brown's avatar Mark Brown Committed by Samuel Ortiz

mfd: arizona: Basic support for edge triggered IRQs

Allow the user to configure edge triggered IRQs, though we do not yet
fully handle new interrupts occurring while an interrupt is being handled.
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 7994c664
...@@ -208,7 +208,7 @@ static const struct i2c_board_info wm1277_devs[] = { ...@@ -208,7 +208,7 @@ static const struct i2c_board_info wm1277_devs[] = {
static struct arizona_pdata wm5102_reva_pdata = { static struct arizona_pdata wm5102_reva_pdata = {
.ldoena = S3C64XX_GPN(7), .ldoena = S3C64XX_GPN(7),
.gpio_base = CODEC_GPIO_BASE, .gpio_base = CODEC_GPIO_BASE,
.irq_active_high = true, .irq_flags = IRQF_TRIGGER_HIGH,
.micd_pol_gpio = CODEC_GPIO_BASE + 4, .micd_pol_gpio = CODEC_GPIO_BASE + 4,
.gpio_defaults = { .gpio_defaults = {
[2] = 0x10000, /* AIF3TXLRCLK */ [2] = 0x10000, /* AIF3TXLRCLK */
...@@ -237,7 +237,7 @@ static struct spi_board_info wm5102_reva_spi_devs[] = { ...@@ -237,7 +237,7 @@ static struct spi_board_info wm5102_reva_spi_devs[] = {
static struct arizona_pdata wm5102_pdata = { static struct arizona_pdata wm5102_pdata = {
.ldoena = S3C64XX_GPN(7), .ldoena = S3C64XX_GPN(7),
.gpio_base = CODEC_GPIO_BASE, .gpio_base = CODEC_GPIO_BASE,
.irq_active_high = true, .irq_flags = IRQF_TRIGGER_HIGH,
.micd_pol_gpio = CODEC_GPIO_BASE + 2, .micd_pol_gpio = CODEC_GPIO_BASE + 2,
.gpio_defaults = { .gpio_defaults = {
[2] = 0x10000, /* AIF3TXLRCLK */ [2] = 0x10000, /* AIF3TXLRCLK */
......
...@@ -195,7 +195,11 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -195,7 +195,11 @@ int arizona_irq_init(struct arizona *arizona)
/* Disable all wake sources by default */ /* Disable all wake sources by default */
regmap_write(arizona->regmap, ARIZONA_WAKE_CONTROL, 0); regmap_write(arizona->regmap, ARIZONA_WAKE_CONTROL, 0);
if (arizona->pdata.irq_active_high) { if (!arizona->pdata.irq_flags)
arizona->pdata.irq_flags = IRQF_TRIGGER_LOW;
if (arizona->pdata.irq_flags & (IRQF_TRIGGER_HIGH |
IRQF_TRIGGER_RISING)) {
ret = regmap_update_bits(arizona->regmap, ARIZONA_IRQ_CTRL_1, ret = regmap_update_bits(arizona->regmap, ARIZONA_IRQ_CTRL_1,
ARIZONA_IRQ_POL, 0); ARIZONA_IRQ_POL, 0);
if (ret != 0) { if (ret != 0) {
...@@ -203,12 +207,10 @@ int arizona_irq_init(struct arizona *arizona) ...@@ -203,12 +207,10 @@ int arizona_irq_init(struct arizona *arizona)
ret); ret);
goto err; goto err;
} }
flags |= IRQF_TRIGGER_HIGH;
} else {
flags |= IRQF_TRIGGER_LOW;
} }
flags |= arizona->pdata.irq_flags;
/* Allocate a virtual IRQ domain to distribute to the regmap domains */ /* Allocate a virtual IRQ domain to distribute to the regmap domains */
arizona->virq = irq_domain_add_linear(NULL, 2, &arizona_domain_ops, arizona->virq = irq_domain_add_linear(NULL, 2, &arizona_domain_ops,
arizona); arizona);
......
...@@ -99,7 +99,8 @@ struct arizona_pdata { ...@@ -99,7 +99,8 @@ struct arizona_pdata {
/** If a direct 32kHz clock is provided on an MCLK specify it here */ /** If a direct 32kHz clock is provided on an MCLK specify it here */
int clk32k_src; int clk32k_src;
bool irq_active_high; /** IRQ polarity */ /** Mode for primary IRQ (defaults to active low) */
unsigned int irq_flags;
/* Base GPIO */ /* Base GPIO */
int gpio_base; int gpio_base;
......
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