Skip to contentSkip to conversation

mfd: wm8994: Return error when device ID mismatch is detected

PATCH In review Axel Lin 2 participants 2 messages Feb 22, 2012

Subsystems (2)
lore
Share & tools
lore

Axel Lin

author
#0 lore raw

PATCH 1/1 mfd: wm8994: Return error when device ID mismatch is detected

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.

---
 drivers/mfd/wm8994-core.c |   32 +++++++-------------------------
 1 files changed, 7 insertions(+), 25 deletions(-)
drivers/mfd/wm8994-core.c +7 -25
index 1599bba..6e4612e 100644
@@ -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;
 	}
Signature · 1 line
1.7.5.4
#1 lore raw
Quoted 6 lines · Axel Lin

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.

No, there are valid use cases for registering as the wrong device. It's not ideal to have the wrong supply set but it's going to cause more harm than good to fail hard on this.