diff options
-rw-r--r-- | drivers/mfd/wm8350-core.c | 54 | ||||
-rw-r--r-- | include/linux/mfd/wm8350/core.h | 6 |
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 |