aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2008-11-24 14:22:58 -0500
committerSamuel Ortiz <samuel@sortiz.org>2009-01-04 06:17:39 -0500
commitb797a5551979da22b0a35632198ffc8a330d9537 (patch)
tree664747dc55889cd30a7d853e2fe5e816a2d9d6a2
parentd756f4a4446227ca9626087939a6769ca55ab036 (diff)
mfd: Refactor WM8350 chip identification
Since the WM8350 driver was originally written the semantics for the identification registers of the chip have been clarified, allowing us to do an exact match on all the fields. This avoids mistakenly running on unsupported hardware. Also change to using the datasheet names more consistently for legibility and fix a printk() that should be dev_err(). Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Samuel Ortiz <sameo@openedhand.com>
-rw-r--r--drivers/mfd/wm8350-core.c54
-rw-r--r--include/linux/mfd/wm8350/core.h6
2 files changed, 43 insertions, 17 deletions
diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index 764bf15ea684..2188d759cbde 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -1227,52 +1227,72 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,
1227 struct wm8350_platform_data *pdata) 1227 struct wm8350_platform_data *pdata)
1228{ 1228{
1229 int ret = -EINVAL; 1229 int ret = -EINVAL;
1230 u16 id1, id2, mask, mode; 1230 u16 id1, id2, mask_rev;
1231 u16 cust_id, mode, chip_rev;
1231 1232
1232 /* get WM8350 revision and config mode */ 1233 /* get WM8350 revision and config mode */
1233 wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1); 1234 wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
1234 wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2); 1235 wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
1236 wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev), &mask_rev);
1235 1237
1236 id1 = be16_to_cpu(id1); 1238 id1 = be16_to_cpu(id1);
1237 id2 = be16_to_cpu(id2); 1239 id2 = be16_to_cpu(id2);
1240 mask_rev = be16_to_cpu(mask_rev);
1238 1241
1239 if (id1 == 0x6143) { 1242 if (id1 != 0x6143) {
1240 switch ((id2 & WM8350_CHIP_REV_MASK) >> 12) { 1243 dev_err(wm8350->dev,
1244 "Device with ID %x is not a WM8350\n", id1);
1245 ret = -ENODEV;
1246 goto err;
1247 }
1248
1249 mode = id2 & WM8350_CONF_STS_MASK >> 10;
1250 cust_id = id2 & WM8350_CUST_ID_MASK;
1251 chip_rev = (id2 & WM8350_CHIP_REV_MASK) >> 12;
1252 dev_info(wm8350->dev,
1253 "CONF_STS %d, CUST_ID %d, MASK_REV %d, CHIP_REV %d\n",
1254 mode, cust_id, mask_rev, chip_rev);
1255
1256 if (cust_id != 0) {
1257 dev_err(wm8350->dev, "Unsupported CUST_ID\n");
1258 ret = -ENODEV;
1259 goto err;
1260 }
1261
1262 switch (mask_rev) {
1263 case 0:
1264 switch (chip_rev) {
1241 case WM8350_REV_E: 1265 case WM8350_REV_E:
1242 dev_info(wm8350->dev, "Found Rev E device\n"); 1266 dev_info(wm8350->dev, "WM8350 Rev E\n");
1243 break; 1267 break;
1244 case WM8350_REV_F: 1268 case WM8350_REV_F:
1245 dev_info(wm8350->dev, "Found Rev F device\n"); 1269 dev_info(wm8350->dev, "WM8350 Rev F\n");
1246 break; 1270 break;
1247 case WM8350_REV_G: 1271 case WM8350_REV_G:
1248 dev_info(wm8350->dev, "Found Rev G device\n"); 1272 dev_info(wm8350->dev, "WM8350 Rev G\n");
1249 wm8350->power.rev_g_coeff = 1; 1273 wm8350->power.rev_g_coeff = 1;
1250 break; 1274 break;
1251 case WM8350_REV_H: 1275 case WM8350_REV_H:
1252 dev_info(wm8350->dev, "Found Rev H device\n"); 1276 dev_info(wm8350->dev, "WM8350 Rev H\n");
1253 wm8350->power.rev_g_coeff = 1; 1277 wm8350->power.rev_g_coeff = 1;
1254 break; 1278 break;
1255 default: 1279 default:
1256 /* For safety we refuse to run on unknown hardware */ 1280 /* For safety we refuse to run on unknown hardware */
1257 dev_info(wm8350->dev, "Found unknown rev %x\n", 1281 dev_err(wm8350->dev, "Unknown WM8350 CHIP_REV\n");
1258 (id2 & WM8350_CHIP_REV_MASK) >> 12);
1259 ret = -ENODEV; 1282 ret = -ENODEV;
1260 goto err; 1283 goto err;
1261 } 1284 }
1262 } else { 1285 break;
1263 dev_info(wm8350->dev, "Device with ID %x is not a WM8350\n", 1286
1264 id1); 1287 default:
1288 dev_err(wm8350->dev, "Unknown MASK_REV\n");
1265 ret = -ENODEV; 1289 ret = -ENODEV;
1266 goto err; 1290 goto err;
1267 } 1291 }
1268 1292
1269 mode = id2 & WM8350_CONF_STS_MASK >> 10;
1270 mask = id2 & WM8350_CUST_ID_MASK;
1271 dev_info(wm8350->dev, "Config mode %d, ROM mask %d\n", mode, mask);
1272
1273 ret = wm8350_create_cache(wm8350, mode); 1293 ret = wm8350_create_cache(wm8350, mode);
1274 if (ret < 0) { 1294 if (ret < 0) {
1275 printk(KERN_ERR "wm8350: failed to create register cache\n"); 1295 dev_err(wm8350->dev, "Failed to create register cache\n");
1276 return ret; 1296 return ret;
1277 } 1297 }
1278 1298
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h
index 3c9735663f36..2a7abeebe777 100644
--- a/include/linux/mfd/wm8350/core.h
+++ b/include/linux/mfd/wm8350/core.h
@@ -29,6 +29,7 @@
29 */ 29 */
30#define WM8350_RESET_ID 0x00 30#define WM8350_RESET_ID 0x00
31#define WM8350_ID 0x01 31#define WM8350_ID 0x01
32#define WM8350_REVISION 0x02
32#define WM8350_SYSTEM_CONTROL_1 0x03 33#define WM8350_SYSTEM_CONTROL_1 0x03
33#define WM8350_SYSTEM_CONTROL_2 0x04 34#define WM8350_SYSTEM_CONTROL_2 0x04
34#define WM8350_SYSTEM_HIBERNATE 0x05 35#define WM8350_SYSTEM_HIBERNATE 0x05
@@ -80,6 +81,11 @@
80#define WM8350_CUST_ID_MASK 0x00FF 81#define WM8350_CUST_ID_MASK 0x00FF
81 82
82/* 83/*
84 * R2 (0x02) - Revision
85 */
86#define WM8350_MASK_REV_MASK 0x00FF
87
88/*
83 * R3 (0x03) - System Control 1 89 * R3 (0x03) - System Control 1
84 */ 90 */
85#define WM8350_CHIP_ON 0x8000 91#define WM8350_CHIP_ON 0x8000