Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: da9062: Add support for interrupt polarity defined in device tree

The da9062 interrupt handler cannot necessarily be low active.
Add a function to configure the interrupt type based on what is defined in the device tree.
The allowable interrupt type is either low or high level trigger.

Signed-off-by: Shreyas Joshi <shreyas.joshi@biamp.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Shreyas Joshi and committed by
Lee Jones
b1cc5409 a045f357

+41 -3
+41 -3
drivers/mfd/da9062-core.c
··· 21 21 #define DA9062_REG_EVENT_B_OFFSET 1 22 22 #define DA9062_REG_EVENT_C_OFFSET 2 23 23 24 + #define DA9062_IRQ_LOW 0 25 + #define DA9062_IRQ_HIGH 1 26 + 24 27 static struct regmap_irq da9061_irqs[] = { 25 28 /* EVENT A */ 26 29 [DA9061_IRQ_ONKEY] = { ··· 372 369 return ret; 373 370 } 374 371 372 + static u32 da9062_configure_irq_type(struct da9062 *chip, int irq, u32 *trigger) 373 + { 374 + u32 irq_type = 0; 375 + struct irq_data *irq_data = irq_get_irq_data(irq); 376 + 377 + if (!irq_data) { 378 + dev_err(chip->dev, "Invalid IRQ: %d\n", irq); 379 + return -EINVAL; 380 + } 381 + *trigger = irqd_get_trigger_type(irq_data); 382 + 383 + switch (*trigger) { 384 + case IRQ_TYPE_LEVEL_HIGH: 385 + irq_type = DA9062_IRQ_HIGH; 386 + break; 387 + case IRQ_TYPE_LEVEL_LOW: 388 + irq_type = DA9062_IRQ_LOW; 389 + break; 390 + default: 391 + dev_warn(chip->dev, "Unsupported IRQ type: %d\n", *trigger); 392 + return -EINVAL; 393 + } 394 + return regmap_update_bits(chip->regmap, DA9062AA_CONFIG_A, 395 + DA9062AA_IRQ_TYPE_MASK, 396 + irq_type << DA9062AA_IRQ_TYPE_SHIFT); 397 + } 398 + 375 399 static const struct regmap_range da9061_aa_readable_ranges[] = { 376 400 regmap_reg_range(DA9062AA_PAGE_CON, DA9062AA_STATUS_B), 377 401 regmap_reg_range(DA9062AA_STATUS_D, DA9062AA_EVENT_C), ··· 418 388 regmap_reg_range(DA9062AA_VBUCK1_A, DA9062AA_VBUCK4_A), 419 389 regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A), 420 390 regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A), 391 + regmap_reg_range(DA9062AA_CONFIG_A, DA9062AA_CONFIG_A), 421 392 regmap_reg_range(DA9062AA_VBUCK1_B, DA9062AA_VBUCK4_B), 422 393 regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B), 423 394 regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B), ··· 448 417 regmap_reg_range(DA9062AA_VBUCK1_A, DA9062AA_VBUCK4_A), 449 418 regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A), 450 419 regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A), 420 + regmap_reg_range(DA9062AA_CONFIG_A, DA9062AA_CONFIG_A), 451 421 regmap_reg_range(DA9062AA_VBUCK1_B, DA9062AA_VBUCK4_B), 452 422 regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B), 453 423 regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B), ··· 628 596 const struct regmap_irq_chip *irq_chip; 629 597 const struct regmap_config *config; 630 598 int cell_num; 599 + u32 trigger_type = 0; 631 600 int ret; 632 601 633 602 chip = devm_kzalloc(&i2c->dev, sizeof(*chip), GFP_KERNEL); ··· 687 654 if (ret) 688 655 return ret; 689 656 657 + ret = da9062_configure_irq_type(chip, i2c->irq, &trigger_type); 658 + if (ret < 0) { 659 + dev_err(chip->dev, "Failed to configure IRQ type\n"); 660 + return ret; 661 + } 662 + 690 663 ret = regmap_add_irq_chip(chip->regmap, i2c->irq, 691 - IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED, 692 - -1, irq_chip, 693 - &chip->regmap_irq); 664 + trigger_type | IRQF_SHARED | IRQF_ONESHOT, 665 + -1, irq_chip, &chip->regmap_irq); 694 666 if (ret) { 695 667 dev_err(chip->dev, "Failed to request IRQ %d: %d\n", 696 668 i2c->irq, ret);