|
@@ -536,51 +536,22 @@ int arizona_dev_init(struct arizona *arizona)
|
|
|
|
|
|
regcache_cache_only(arizona->regmap, false);
|
|
|
|
|
|
+ /* Verify that this is a chip we know about */
|
|
|
ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®);
|
|
|
if (ret != 0) {
|
|
|
dev_err(dev, "Failed to read ID register: %d\n", ret);
|
|
|
goto err_reset;
|
|
|
}
|
|
|
|
|
|
- ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
|
|
|
- &arizona->rev);
|
|
|
- if (ret != 0) {
|
|
|
- dev_err(dev, "Failed to read revision register: %d\n", ret);
|
|
|
- goto err_reset;
|
|
|
- }
|
|
|
- arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
|
|
|
-
|
|
|
switch (reg) {
|
|
|
-#ifdef CONFIG_MFD_WM5102
|
|
|
case 0x5102:
|
|
|
- type_name = "WM5102";
|
|
|
- if (arizona->type != WM5102) {
|
|
|
- dev_err(arizona->dev, "WM5102 registered as %d\n",
|
|
|
- arizona->type);
|
|
|
- arizona->type = WM5102;
|
|
|
- }
|
|
|
- apply_patch = wm5102_patch;
|
|
|
- arizona->rev &= 0x7;
|
|
|
- break;
|
|
|
-#endif
|
|
|
-#ifdef CONFIG_MFD_WM5110
|
|
|
case 0x5110:
|
|
|
- type_name = "WM5110";
|
|
|
- if (arizona->type != WM5110) {
|
|
|
- dev_err(arizona->dev, "WM5110 registered as %d\n",
|
|
|
- arizona->type);
|
|
|
- arizona->type = WM5110;
|
|
|
- }
|
|
|
- apply_patch = wm5110_patch;
|
|
|
break;
|
|
|
-#endif
|
|
|
default:
|
|
|
- dev_err(arizona->dev, "Unknown device ID %x\n", reg);
|
|
|
+ dev_err(arizona->dev, "Unknown device ID: %x\n", reg);
|
|
|
goto err_reset;
|
|
|
}
|
|
|
|
|
|
- dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
|
|
|
-
|
|
|
/* If we have a /RESET GPIO we'll already be reset */
|
|
|
if (!arizona->pdata.reset) {
|
|
|
regcache_mark_dirty(arizona->regmap);
|
|
@@ -600,6 +571,7 @@ int arizona_dev_init(struct arizona *arizona)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /* Ensure device startup is complete */
|
|
|
switch (arizona->type) {
|
|
|
case WM5102:
|
|
|
ret = regmap_read(arizona->regmap, 0x19, &val);
|
|
@@ -620,6 +592,52 @@ int arizona_dev_init(struct arizona *arizona)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ /* Read the device ID information & do device specific stuff */
|
|
|
+ ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, ®);
|
|
|
+ if (ret != 0) {
|
|
|
+ dev_err(dev, "Failed to read ID register: %d\n", ret);
|
|
|
+ goto err_reset;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
|
|
|
+ &arizona->rev);
|
|
|
+ if (ret != 0) {
|
|
|
+ dev_err(dev, "Failed to read revision register: %d\n", ret);
|
|
|
+ goto err_reset;
|
|
|
+ }
|
|
|
+ arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
|
|
|
+
|
|
|
+ switch (reg) {
|
|
|
+#ifdef CONFIG_MFD_WM5102
|
|
|
+ case 0x5102:
|
|
|
+ type_name = "WM5102";
|
|
|
+ if (arizona->type != WM5102) {
|
|
|
+ dev_err(arizona->dev, "WM5102 registered as %d\n",
|
|
|
+ arizona->type);
|
|
|
+ arizona->type = WM5102;
|
|
|
+ }
|
|
|
+ apply_patch = wm5102_patch;
|
|
|
+ arizona->rev &= 0x7;
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_MFD_WM5110
|
|
|
+ case 0x5110:
|
|
|
+ type_name = "WM5110";
|
|
|
+ if (arizona->type != WM5110) {
|
|
|
+ dev_err(arizona->dev, "WM5110 registered as %d\n",
|
|
|
+ arizona->type);
|
|
|
+ arizona->type = WM5110;
|
|
|
+ }
|
|
|
+ apply_patch = wm5110_patch;
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ default:
|
|
|
+ dev_err(arizona->dev, "Unknown device ID %x\n", reg);
|
|
|
+ goto err_reset;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
|
|
|
+
|
|
|
if (apply_patch) {
|
|
|
ret = apply_patch(arizona);
|
|
|
if (ret != 0) {
|