diff options
Diffstat (limited to 'drivers/base/regmap/regmap-irq.c')
| -rw-r--r-- | drivers/base/regmap/regmap-irq.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c index 1643e889bafc..d10456ffd811 100644 --- a/drivers/base/regmap/regmap-irq.c +++ b/drivers/base/regmap/regmap-irq.c | |||
| @@ -418,6 +418,31 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, | |||
| 418 | reg, ret); | 418 | reg, ret); |
| 419 | goto err_alloc; | 419 | goto err_alloc; |
| 420 | } | 420 | } |
| 421 | |||
| 422 | if (!chip->init_ack_masked) | ||
| 423 | continue; | ||
| 424 | |||
| 425 | /* Ack masked but set interrupts */ | ||
| 426 | reg = chip->status_base + | ||
| 427 | (i * map->reg_stride * d->irq_reg_stride); | ||
| 428 | ret = regmap_read(map, reg, &d->status_buf[i]); | ||
| 429 | if (ret != 0) { | ||
| 430 | dev_err(map->dev, "Failed to read IRQ status: %d\n", | ||
| 431 | ret); | ||
| 432 | goto err_alloc; | ||
| 433 | } | ||
| 434 | |||
| 435 | if (d->status_buf[i] && chip->ack_base) { | ||
| 436 | reg = chip->ack_base + | ||
| 437 | (i * map->reg_stride * d->irq_reg_stride); | ||
| 438 | ret = regmap_write(map, reg, | ||
| 439 | d->status_buf[i] & d->mask_buf[i]); | ||
| 440 | if (ret != 0) { | ||
| 441 | dev_err(map->dev, "Failed to ack 0x%x: %d\n", | ||
| 442 | reg, ret); | ||
| 443 | goto err_alloc; | ||
| 444 | } | ||
| 445 | } | ||
| 421 | } | 446 | } |
| 422 | 447 | ||
| 423 | /* Wake is disabled by default */ | 448 | /* Wake is disabled by default */ |
