aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/twl6040-core.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2012-10-11 07:55:32 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2012-11-13 13:54:23 -0500
commitab7edb149c7548541ee588b8372c2041b6f1cbc8 (patch)
tree12bff6036c4eed3683e007e3fa890d1453666edf /drivers/mfd/twl6040-core.c
parent1ac96265a6f35080083e85b0f58182cdc9c07d0e (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.c55
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
502static 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
511static 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
502static int __devinit twl6040_probe(struct i2c_client *client, 521static 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
659mfd_err: 684mfd_err:
660 free_irq(twl6040->irq_base + TWL6040_IRQ_TH, twl6040); 685 free_irq(twl6040->irq_th, twl6040);
661thirq_err: 686thirq_err:
662 free_irq(twl6040->irq_base + TWL6040_IRQ_READY, twl6040); 687 free_irq(twl6040->irq_ready, twl6040);
663readyirq_err: 688readyirq_err:
664 twl6040_irq_exit(twl6040); 689 regmap_del_irq_chip(twl6040->irq, twl6040->irq_data);
665irq_init_err: 690irq_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);