aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-09 11:04:35 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-05-17 11:42:24 -0400
commitca76ceb8b9ca1466be9b6de5e4c0fb19b37417ee (patch)
treee51c8fa660ebb91c2f775f17d94aa2b8643c3383
parentf722406faae2d073cc1d01063d1123c35425939e (diff)
mfd: arizona: Read the device identification information after boot
Future devices may not fully report the device identification information until their boot sequence is complete so defer acting on these until that has finished. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--drivers/mfd/arizona-core.c80
1 files changed, 49 insertions, 31 deletions
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 6ab03043fd60..81907f9fc92e 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -536,51 +536,22 @@ int arizona_dev_init(struct arizona *arizona)
536 536
537 regcache_cache_only(arizona->regmap, false); 537 regcache_cache_only(arizona->regmap, false);
538 538
539 /* Verify that this is a chip we know about */
539 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg); 540 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
540 if (ret != 0) { 541 if (ret != 0) {
541 dev_err(dev, "Failed to read ID register: %d\n", ret); 542 dev_err(dev, "Failed to read ID register: %d\n", ret);
542 goto err_reset; 543 goto err_reset;
543 } 544 }
544 545
545 ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
546 &arizona->rev);
547 if (ret != 0) {
548 dev_err(dev, "Failed to read revision register: %d\n", ret);
549 goto err_reset;
550 }
551 arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
552
553 switch (reg) { 546 switch (reg) {
554#ifdef CONFIG_MFD_WM5102
555 case 0x5102: 547 case 0x5102:
556 type_name = "WM5102";
557 if (arizona->type != WM5102) {
558 dev_err(arizona->dev, "WM5102 registered as %d\n",
559 arizona->type);
560 arizona->type = WM5102;
561 }
562 apply_patch = wm5102_patch;
563 arizona->rev &= 0x7;
564 break;
565#endif
566#ifdef CONFIG_MFD_WM5110
567 case 0x5110: 548 case 0x5110:
568 type_name = "WM5110";
569 if (arizona->type != WM5110) {
570 dev_err(arizona->dev, "WM5110 registered as %d\n",
571 arizona->type);
572 arizona->type = WM5110;
573 }
574 apply_patch = wm5110_patch;
575 break; 549 break;
576#endif
577 default: 550 default:
578 dev_err(arizona->dev, "Unknown device ID %x\n", reg); 551 dev_err(arizona->dev, "Unknown device ID: %x\n", reg);
579 goto err_reset; 552 goto err_reset;
580 } 553 }
581 554
582 dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
583
584 /* If we have a /RESET GPIO we'll already be reset */ 555 /* If we have a /RESET GPIO we'll already be reset */
585 if (!arizona->pdata.reset) { 556 if (!arizona->pdata.reset) {
586 regcache_mark_dirty(arizona->regmap); 557 regcache_mark_dirty(arizona->regmap);
@@ -600,6 +571,7 @@ int arizona_dev_init(struct arizona *arizona)
600 } 571 }
601 } 572 }
602 573
574 /* Ensure device startup is complete */
603 switch (arizona->type) { 575 switch (arizona->type) {
604 case WM5102: 576 case WM5102:
605 ret = regmap_read(arizona->regmap, 0x19, &val); 577 ret = regmap_read(arizona->regmap, 0x19, &val);
@@ -620,6 +592,52 @@ int arizona_dev_init(struct arizona *arizona)
620 break; 592 break;
621 } 593 }
622 594
595 /* Read the device ID information & do device specific stuff */
596 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
597 if (ret != 0) {
598 dev_err(dev, "Failed to read ID register: %d\n", ret);
599 goto err_reset;
600 }
601
602 ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
603 &arizona->rev);
604 if (ret != 0) {
605 dev_err(dev, "Failed to read revision register: %d\n", ret);
606 goto err_reset;
607 }
608 arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
609
610 switch (reg) {
611#ifdef CONFIG_MFD_WM5102
612 case 0x5102:
613 type_name = "WM5102";
614 if (arizona->type != WM5102) {
615 dev_err(arizona->dev, "WM5102 registered as %d\n",
616 arizona->type);
617 arizona->type = WM5102;
618 }
619 apply_patch = wm5102_patch;
620 arizona->rev &= 0x7;
621 break;
622#endif
623#ifdef CONFIG_MFD_WM5110
624 case 0x5110:
625 type_name = "WM5110";
626 if (arizona->type != WM5110) {
627 dev_err(arizona->dev, "WM5110 registered as %d\n",
628 arizona->type);
629 arizona->type = WM5110;
630 }
631 apply_patch = wm5110_patch;
632 break;
633#endif
634 default:
635 dev_err(arizona->dev, "Unknown device ID %x\n", reg);
636 goto err_reset;
637 }
638
639 dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
640
623 if (apply_patch) { 641 if (apply_patch) {
624 ret = apply_patch(arizona); 642 ret = apply_patch(arizona);
625 if (ret != 0) { 643 if (ret != 0) {