diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2012-10-11 07:55:32 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-11-13 13:54:23 -0500 |
commit | ab7edb149c7548541ee588b8372c2041b6f1cbc8 (patch) | |
tree | 12bff6036c4eed3683e007e3fa890d1453666edf /drivers/mfd/twl6040-core.c | |
parent | 1ac96265a6f35080083e85b0f58182cdc9c07d0e (diff) |
mfd: twl6040: Convert to use regmap_irq
With regmap_irq it is possible to remove the twl6040-irq.c file and
simplify the code.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/twl6040-core.c')
-rw-r--r-- | drivers/mfd/twl6040-core.c | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index 5817bc6d09dc..e5f7b795afff 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
@@ -499,6 +499,25 @@ static struct regmap_config twl6040_regmap_config = { | |||
499 | .readable_reg = twl6040_readable_reg, | 499 | .readable_reg = twl6040_readable_reg, |
500 | }; | 500 | }; |
501 | 501 | ||
502 | static const struct regmap_irq twl6040_irqs[] = { | ||
503 | { .reg_offset = 0, .mask = TWL6040_THINT, }, | ||
504 | { .reg_offset = 0, .mask = TWL6040_PLUGINT | TWL6040_UNPLUGINT, }, | ||
505 | { .reg_offset = 0, .mask = TWL6040_HOOKINT, }, | ||
506 | { .reg_offset = 0, .mask = TWL6040_HFINT, }, | ||
507 | { .reg_offset = 0, .mask = TWL6040_VIBINT, }, | ||
508 | { .reg_offset = 0, .mask = TWL6040_READYINT, }, | ||
509 | }; | ||
510 | |||
511 | static struct regmap_irq_chip twl6040_irq_chip = { | ||
512 | .name = "twl6040", | ||
513 | .irqs = twl6040_irqs, | ||
514 | .num_irqs = ARRAY_SIZE(twl6040_irqs), | ||
515 | |||
516 | .num_regs = 1, | ||
517 | .status_base = TWL6040_REG_INTID, | ||
518 | .mask_base = TWL6040_REG_INTMR, | ||
519 | }; | ||
520 | |||
502 | static int __devinit twl6040_probe(struct i2c_client *client, | 521 | static int __devinit twl6040_probe(struct i2c_client *client, |
503 | const struct i2c_device_id *id) | 522 | const struct i2c_device_id *id) |
504 | { | 523 | { |
@@ -574,21 +593,27 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
574 | goto gpio_err; | 593 | goto gpio_err; |
575 | } | 594 | } |
576 | 595 | ||
577 | /* codec interrupt */ | 596 | ret = regmap_add_irq_chip(twl6040->regmap, twl6040->irq, |
578 | ret = twl6040_irq_init(twl6040); | 597 | IRQF_ONESHOT, 0, &twl6040_irq_chip, |
579 | if (ret) | 598 | &twl6040->irq_data); |
599 | if (ret < 0) | ||
580 | goto irq_init_err; | 600 | goto irq_init_err; |
581 | 601 | ||
582 | ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_READY, | 602 | twl6040->irq_ready = regmap_irq_get_virq(twl6040->irq_data, |
583 | NULL, twl6040_readyint_handler, IRQF_ONESHOT, | 603 | TWL6040_IRQ_READY); |
604 | twl6040->irq_th = regmap_irq_get_virq(twl6040->irq_data, | ||
605 | TWL6040_IRQ_TH); | ||
606 | |||
607 | ret = request_threaded_irq(twl6040->irq_ready, NULL, | ||
608 | twl6040_readyint_handler, IRQF_ONESHOT, | ||
584 | "twl6040_irq_ready", twl6040); | 609 | "twl6040_irq_ready", twl6040); |
585 | if (ret) { | 610 | if (ret) { |
586 | dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret); | 611 | dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret); |
587 | goto readyirq_err; | 612 | goto readyirq_err; |
588 | } | 613 | } |
589 | 614 | ||
590 | ret = request_threaded_irq(twl6040->irq_base + TWL6040_IRQ_TH, | 615 | ret = request_threaded_irq(twl6040->irq_th, NULL, |
591 | NULL, twl6040_thint_handler, IRQF_ONESHOT, | 616 | twl6040_thint_handler, IRQF_ONESHOT, |
592 | "twl6040_irq_th", twl6040); | 617 | "twl6040_irq_th", twl6040); |
593 | if (ret) { | 618 | if (ret) { |
594 | dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret); | 619 | dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret); |
@@ -604,7 +629,7 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
604 | * The ASoC codec can work without pdata, pass the platform_data only if | 629 | * The ASoC codec can work without pdata, pass the platform_data only if |
605 | * it has been provided. | 630 | * it has been provided. |
606 | */ | 631 | */ |
607 | irq = twl6040->irq_base + TWL6040_IRQ_PLUG; | 632 | irq = regmap_irq_get_virq(twl6040->irq_data, TWL6040_IRQ_PLUG); |
608 | cell = &twl6040->cells[children]; | 633 | cell = &twl6040->cells[children]; |
609 | cell->name = "twl6040-codec"; | 634 | cell->name = "twl6040-codec"; |
610 | twl6040_codec_rsrc[0].start = irq; | 635 | twl6040_codec_rsrc[0].start = irq; |
@@ -618,7 +643,7 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
618 | children++; | 643 | children++; |
619 | 644 | ||
620 | if (twl6040_has_vibra(pdata, node)) { | 645 | if (twl6040_has_vibra(pdata, node)) { |
621 | irq = twl6040->irq_base + TWL6040_IRQ_VIB; | 646 | irq = regmap_irq_get_virq(twl6040->irq_data, TWL6040_IRQ_VIB); |
622 | 647 | ||
623 | cell = &twl6040->cells[children]; | 648 | cell = &twl6040->cells[children]; |
624 | cell->name = "twl6040-vibra"; | 649 | cell->name = "twl6040-vibra"; |
@@ -657,11 +682,11 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
657 | return 0; | 682 | return 0; |
658 | 683 | ||
659 | mfd_err: | 684 | mfd_err: |
660 | free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040); | 685 | free_irq(twl6040->irq_th, twl6040); |
661 | thirq_err: | 686 | thirq_err: |
662 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); | 687 | free_irq(twl6040->irq_ready, twl6040); |
663 | readyirq_err: | 688 | readyirq_err: |
664 | twl6040_irq_exit(twl6040); | 689 | regmap_del_irq_chip(twl6040->irq, twl6040->irq_data); |
665 | irq_init_err: | 690 | irq_init_err: |
666 | if (gpio_is_valid(twl6040->audpwron)) | 691 | if (gpio_is_valid(twl6040->audpwron)) |
667 | gpio_free(twl6040->audpwron); | 692 | gpio_free(twl6040->audpwron); |
@@ -685,9 +710,9 @@ static int __devexit twl6040_remove(struct i2c_client *client) | |||
685 | if (gpio_is_valid(twl6040->audpwron)) | 710 | if (gpio_is_valid(twl6040->audpwron)) |
686 | gpio_free(twl6040->audpwron); | 711 | gpio_free(twl6040->audpwron); |
687 | 712 | ||
688 | free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); | 713 | free_irq(twl6040->irq_ready, twl6040); |
689 | free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040); | 714 | free_irq(twl6040->irq_th, twl6040); |
690 | twl6040_irq_exit(twl6040); | 715 | regmap_del_irq_chip(twl6040->irq, twl6040->irq_data); |
691 | 716 | ||
692 | mfd_remove_devices(&client->dev); | 717 | mfd_remove_devices(&client->dev); |
693 | i2c_set_clientdata(client, NULL); | 718 | i2c_set_clientdata(client, NULL); |