diff options
-rw-r--r-- | drivers/mfd/wm8994-core.c | 12 | ||||
-rw-r--r-- | drivers/mfd/wm8994-regmap.c | 19 | ||||
-rw-r--r-- | include/linux/mfd/wm8994/core.h | 1 |
3 files changed, 25 insertions, 7 deletions
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index 8b4f22a88e22..93f8599aba32 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
@@ -446,15 +446,16 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq) | |||
446 | ret); | 446 | ret); |
447 | goto err_enable; | 447 | goto err_enable; |
448 | } | 448 | } |
449 | wm8994->revision = ret; | ||
449 | 450 | ||
450 | switch (wm8994->type) { | 451 | switch (wm8994->type) { |
451 | case WM8994: | 452 | case WM8994: |
452 | switch (ret) { | 453 | switch (wm8994->revision) { |
453 | case 0: | 454 | case 0: |
454 | case 1: | 455 | case 1: |
455 | dev_warn(wm8994->dev, | 456 | dev_warn(wm8994->dev, |
456 | "revision %c not fully supported\n", | 457 | "revision %c not fully supported\n", |
457 | 'A' + ret); | 458 | 'A' + wm8994->revision); |
458 | break; | 459 | break; |
459 | default: | 460 | default: |
460 | break; | 461 | break; |
@@ -462,14 +463,15 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq) | |||
462 | break; | 463 | break; |
463 | case WM1811: | 464 | case WM1811: |
464 | /* Revision C did not change the relevant layer */ | 465 | /* Revision C did not change the relevant layer */ |
465 | if (ret > 1) | 466 | if (wm8994->revision > 1) |
466 | ret++; | 467 | wm8994->revision++; |
467 | break; | 468 | break; |
468 | default: | 469 | default: |
469 | break; | 470 | break; |
470 | } | 471 | } |
471 | 472 | ||
472 | dev_info(wm8994->dev, "%s revision %c\n", devname, 'A' + ret); | 473 | dev_info(wm8994->dev, "%s revision %c\n", devname, |
474 | 'A' + wm8994->revision); | ||
473 | 475 | ||
474 | switch (wm8994->type) { | 476 | switch (wm8994->type) { |
475 | case WM1811: | 477 | case WM1811: |
diff --git a/drivers/mfd/wm8994-regmap.c b/drivers/mfd/wm8994-regmap.c index 03594c257ef2..c598ae69b8ff 100644 --- a/drivers/mfd/wm8994-regmap.c +++ b/drivers/mfd/wm8994-regmap.c | |||
@@ -12,6 +12,7 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/mfd/wm8994/core.h> | ||
15 | #include <linux/mfd/wm8994/registers.h> | 16 | #include <linux/mfd/wm8994/registers.h> |
16 | #include <linux/regmap.h> | 17 | #include <linux/regmap.h> |
17 | 18 | ||
@@ -210,7 +211,6 @@ static struct reg_default wm1811_defaults[] = { | |||
210 | { 0x0702, 0xA101 }, /* R1794 - Pull Control (BCLK2) */ | 211 | { 0x0702, 0xA101 }, /* R1794 - Pull Control (BCLK2) */ |
211 | { 0x0703, 0xA101 }, /* R1795 - Pull Control (DACLRCLK2) */ | 212 | { 0x0703, 0xA101 }, /* R1795 - Pull Control (DACLRCLK2) */ |
212 | { 0x0704, 0xA101 }, /* R1796 - Pull Control (DACDAT2) */ | 213 | { 0x0704, 0xA101 }, /* R1796 - Pull Control (DACDAT2) */ |
213 | { 0x0705, 0xA101 }, /* R1797 - GPIO 6 */ | ||
214 | { 0x0707, 0xA101 }, /* R1799 - GPIO 8 */ | 214 | { 0x0707, 0xA101 }, /* R1799 - GPIO 8 */ |
215 | { 0x0708, 0xA101 }, /* R1800 - GPIO 9 */ | 215 | { 0x0708, 0xA101 }, /* R1800 - GPIO 9 */ |
216 | { 0x0709, 0xA101 }, /* R1801 - GPIO 10 */ | 216 | { 0x0709, 0xA101 }, /* R1801 - GPIO 10 */ |
@@ -1145,6 +1145,21 @@ static bool wm8994_volatile_register(struct device *dev, unsigned int reg) | |||
1145 | } | 1145 | } |
1146 | } | 1146 | } |
1147 | 1147 | ||
1148 | static bool wm1811_volatile_register(struct device *dev, unsigned int reg) | ||
1149 | { | ||
1150 | struct wm8994 *wm8994 = dev_get_drvdata(dev); | ||
1151 | |||
1152 | switch (reg) { | ||
1153 | case WM8994_GPIO_6: | ||
1154 | if (wm8994->revision > 1) | ||
1155 | return true; | ||
1156 | else | ||
1157 | return false; | ||
1158 | default: | ||
1159 | return wm8994_volatile_register(dev, reg); | ||
1160 | } | ||
1161 | } | ||
1162 | |||
1148 | static bool wm8958_volatile_register(struct device *dev, unsigned int reg) | 1163 | static bool wm8958_volatile_register(struct device *dev, unsigned int reg) |
1149 | { | 1164 | { |
1150 | switch (reg) { | 1165 | switch (reg) { |
@@ -1185,7 +1200,7 @@ struct regmap_config wm1811_regmap_config = { | |||
1185 | .num_reg_defaults = ARRAY_SIZE(wm1811_defaults), | 1200 | .num_reg_defaults = ARRAY_SIZE(wm1811_defaults), |
1186 | 1201 | ||
1187 | .max_register = WM8994_MAX_REGISTER, | 1202 | .max_register = WM8994_MAX_REGISTER, |
1188 | .volatile_reg = wm8994_volatile_register, | 1203 | .volatile_reg = wm1811_volatile_register, |
1189 | .readable_reg = wm1811_readable_register, | 1204 | .readable_reg = wm1811_readable_register, |
1190 | }; | 1205 | }; |
1191 | 1206 | ||
diff --git a/include/linux/mfd/wm8994/core.h b/include/linux/mfd/wm8994/core.h index f537d2eae390..4dd4409678ce 100644 --- a/include/linux/mfd/wm8994/core.h +++ b/include/linux/mfd/wm8994/core.h | |||
@@ -56,6 +56,7 @@ struct wm8994 { | |||
56 | struct mutex irq_lock; | 56 | struct mutex irq_lock; |
57 | 57 | ||
58 | enum wm8994_type type; | 58 | enum wm8994_type type; |
59 | int revision; | ||
59 | 60 | ||
60 | struct device *dev; | 61 | struct device *dev; |
61 | struct regmap *regmap; | 62 | struct regmap *regmap; |