lkml.org 
[lkml]   [2012]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[PATCH] mfd: wm8994: Return error when device ID mismatch is detected
From
Date
We base on wm8994->type to set wm8994->supplies and wm8994->num_supplies.
But in current code, wm8994->type may be changed when device ID mismatch is
detected. If we change wm8994->type, then the wm8994->supplies and
wm8994->num_supplies settings are wrong.

Fix it by return error immediately when device ID mismatch is detected.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
---
drivers/mfd/wm8994-core.c | 32 +++++++-------------------------
1 files changed, 7 insertions(+), 25 deletions(-)

diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c
index 1599bba..6e4612e 100644
--- a/drivers/mfd/wm8994-core.c
+++ b/drivers/mfd/wm8994-core.c
@@ -415,14 +415,17 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)

switch (wm8994->type) {
case WM1811:
+ devname = "WM1811";
for (i = 0; i < ARRAY_SIZE(wm1811_main_supplies); i++)
wm8994->supplies[i].supply = wm1811_main_supplies[i];
break;
case WM8994:
+ devname = "WM8994";
for (i = 0; i < ARRAY_SIZE(wm8994_main_supplies); i++)
wm8994->supplies[i].supply = wm8994_main_supplies[i];
break;
case WM8958:
+ devname = "WM8958";
for (i = 0; i < ARRAY_SIZE(wm8958_main_supplies); i++)
wm8994->supplies[i].supply = wm8958_main_supplies[i];
break;
@@ -450,31 +453,10 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
dev_err(wm8994->dev, "Failed to read ID register\n");
goto err_enable;
}
- switch (ret) {
- case 0x1811:
- devname = "WM1811";
- if (wm8994->type != WM1811)
- dev_warn(wm8994->dev, "Device registered as type %d\n",
- wm8994->type);
- wm8994->type = WM1811;
- break;
- case 0x8994:
- devname = "WM8994";
- if (wm8994->type != WM8994)
- dev_warn(wm8994->dev, "Device registered as type %d\n",
- wm8994->type);
- wm8994->type = WM8994;
- break;
- case 0x8958:
- devname = "WM8958";
- if (wm8994->type != WM8958)
- dev_warn(wm8994->dev, "Device registered as type %d\n",
- wm8994->type);
- wm8994->type = WM8958;
- break;
- default:
- dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
- ret);
+
+ if (ret != wm8994->type) {
+ dev_err(wm8994->dev, "Device ID mismatch: expect %x but we got %x\n",
+ wm8994->type, ret);
ret = -EINVAL;
goto err_enable;
}
--
1.7.5.4




\
 
 \ /
  Last update: 2012-02-22 03:27    [W:0.028 / U:0.060 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site