Commit 7ed5849c authored by Mark Brown's avatar Mark Brown

mfd: Mark WM1811 GPIO6 register volatile for later revisions

For later chip revisions the WM1811 GPIO6 register is always volatile so
store the device revision when initialising the driver and then check at
runtime if we're running on a newer device.
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 19f95571
...@@ -446,15 +446,16 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq) ...@@ -446,15 +446,16 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
ret); ret);
goto err_enable; goto err_enable;
} }
wm8994->revision = ret;
switch (wm8994->type) { switch (wm8994->type) {
case WM8994: case WM8994:
switch (ret) { switch (wm8994->revision) {
case 0: case 0:
case 1: case 1:
dev_warn(wm8994->dev, dev_warn(wm8994->dev,
"revision %c not fully supported\n", "revision %c not fully supported\n",
'A' + ret); 'A' + wm8994->revision);
break; break;
default: default:
break; break;
...@@ -462,14 +463,15 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq) ...@@ -462,14 +463,15 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
break; break;
case WM1811: case WM1811:
/* Revision C did not change the relevant layer */ /* Revision C did not change the relevant layer */
if (ret > 1) if (wm8994->revision > 1)
ret++; wm8994->revision++;
break; break;
default: default:
break; break;
} }
dev_info(wm8994->dev, "%s revision %c\n", devname, 'A' + ret); dev_info(wm8994->dev, "%s revision %c\n", devname,
'A' + wm8994->revision);
switch (wm8994->type) { switch (wm8994->type) {
case WM1811: case WM1811:
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
* *
*/ */
#include <linux/mfd/wm8994/core.h>
#include <linux/mfd/wm8994/registers.h> #include <linux/mfd/wm8994/registers.h>
#include <linux/regmap.h> #include <linux/regmap.h>
...@@ -210,7 +211,6 @@ static struct reg_default wm1811_defaults[] = { ...@@ -210,7 +211,6 @@ static struct reg_default wm1811_defaults[] = {
{ 0x0702, 0xA101 }, /* R1794 - Pull Control (BCLK2) */ { 0x0702, 0xA101 }, /* R1794 - Pull Control (BCLK2) */
{ 0x0703, 0xA101 }, /* R1795 - Pull Control (DACLRCLK2) */ { 0x0703, 0xA101 }, /* R1795 - Pull Control (DACLRCLK2) */
{ 0x0704, 0xA101 }, /* R1796 - Pull Control (DACDAT2) */ { 0x0704, 0xA101 }, /* R1796 - Pull Control (DACDAT2) */
{ 0x0705, 0xA101 }, /* R1797 - GPIO 6 */
{ 0x0707, 0xA101 }, /* R1799 - GPIO 8 */ { 0x0707, 0xA101 }, /* R1799 - GPIO 8 */
{ 0x0708, 0xA101 }, /* R1800 - GPIO 9 */ { 0x0708, 0xA101 }, /* R1800 - GPIO 9 */
{ 0x0709, 0xA101 }, /* R1801 - GPIO 10 */ { 0x0709, 0xA101 }, /* R1801 - GPIO 10 */
...@@ -1145,6 +1145,21 @@ static bool wm8994_volatile_register(struct device *dev, unsigned int reg) ...@@ -1145,6 +1145,21 @@ static bool wm8994_volatile_register(struct device *dev, unsigned int reg)
} }
} }
static bool wm1811_volatile_register(struct device *dev, unsigned int reg)
{
struct wm8994 *wm8994 = dev_get_drvdata(dev);
switch (reg) {
case WM8994_GPIO_6:
if (wm8994->revision > 1)
return true;
else
return false;
default:
return wm8994_volatile_register(dev, reg);
}
}
static bool wm8958_volatile_register(struct device *dev, unsigned int reg) static bool wm8958_volatile_register(struct device *dev, unsigned int reg)
{ {
switch (reg) { switch (reg) {
...@@ -1185,7 +1200,7 @@ struct regmap_config wm1811_regmap_config = { ...@@ -1185,7 +1200,7 @@ struct regmap_config wm1811_regmap_config = {
.num_reg_defaults = ARRAY_SIZE(wm1811_defaults), .num_reg_defaults = ARRAY_SIZE(wm1811_defaults),
.max_register = WM8994_MAX_REGISTER, .max_register = WM8994_MAX_REGISTER,
.volatile_reg = wm8994_volatile_register, .volatile_reg = wm1811_volatile_register,
.readable_reg = wm1811_readable_register, .readable_reg = wm1811_readable_register,
}; };
......
...@@ -56,6 +56,7 @@ struct wm8994 { ...@@ -56,6 +56,7 @@ struct wm8994 {
struct mutex irq_lock; struct mutex irq_lock;
enum wm8994_type type; enum wm8994_type type;
int revision;
struct device *dev; struct device *dev;
struct regmap *regmap; struct regmap *regmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment