diff options
author | Charles Keepax <ckeepax@opensource.wolfsonmicro.com> | 2013-11-19 11:04:00 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2013-11-21 07:23:04 -0500 |
commit | c50aa44db3f803d3c3b79c926e76862454e77c48 (patch) | |
tree | 1a467af2211206d8e50253aa47a61517be4a8877 | |
parent | 5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff) |
mfd: wm5110: Make DSP memories readable
Expose the memory regions used by the DSP cores on WM5110 as readable
and volatile.
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r-- | drivers/mfd/wm5110-tables.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/drivers/mfd/wm5110-tables.c b/drivers/mfd/wm5110-tables.c index 3113e39b318e..4430404471c0 100644 --- a/drivers/mfd/wm5110-tables.c +++ b/drivers/mfd/wm5110-tables.c | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/mfd/arizona/core.h> | 15 | #include <linux/mfd/arizona/core.h> |
16 | #include <linux/mfd/arizona/registers.h> | 16 | #include <linux/mfd/arizona/registers.h> |
17 | #include <linux/device.h> | ||
17 | 18 | ||
18 | #include "arizona.h" | 19 | #include "arizona.h" |
19 | 20 | ||
@@ -1336,6 +1337,64 @@ static const struct reg_default wm5110_reg_default[] = { | |||
1336 | { 0x00001404, 0x0000 }, /* R5124 - DSP4 Status 1 */ | 1337 | { 0x00001404, 0x0000 }, /* R5124 - DSP4 Status 1 */ |
1337 | }; | 1338 | }; |
1338 | 1339 | ||
1340 | static bool wm5110_is_rev_b_adsp_memory(unsigned int reg) | ||
1341 | { | ||
1342 | if ((reg >= 0x100000 && reg < 0x103000) || | ||
1343 | (reg >= 0x180000 && reg < 0x181000) || | ||
1344 | (reg >= 0x190000 && reg < 0x192000) || | ||
1345 | (reg >= 0x1a8000 && reg < 0x1a9000) || | ||
1346 | (reg >= 0x200000 && reg < 0x209000) || | ||
1347 | (reg >= 0x280000 && reg < 0x281000) || | ||
1348 | (reg >= 0x290000 && reg < 0x29a000) || | ||
1349 | (reg >= 0x2a8000 && reg < 0x2aa000) || | ||
1350 | (reg >= 0x300000 && reg < 0x30f000) || | ||
1351 | (reg >= 0x380000 && reg < 0x382000) || | ||
1352 | (reg >= 0x390000 && reg < 0x39e000) || | ||
1353 | (reg >= 0x3a8000 && reg < 0x3b6000) || | ||
1354 | (reg >= 0x400000 && reg < 0x403000) || | ||
1355 | (reg >= 0x480000 && reg < 0x481000) || | ||
1356 | (reg >= 0x490000 && reg < 0x492000) || | ||
1357 | (reg >= 0x4a8000 && reg < 0x4a9000)) | ||
1358 | return true; | ||
1359 | else | ||
1360 | return false; | ||
1361 | } | ||
1362 | |||
1363 | static bool wm5110_is_rev_d_adsp_memory(unsigned int reg) | ||
1364 | { | ||
1365 | if ((reg >= 0x100000 && reg < 0x106000) || | ||
1366 | (reg >= 0x180000 && reg < 0x182000) || | ||
1367 | (reg >= 0x190000 && reg < 0x198000) || | ||
1368 | (reg >= 0x1a8000 && reg < 0x1aa000) || | ||
1369 | (reg >= 0x200000 && reg < 0x20f000) || | ||
1370 | (reg >= 0x280000 && reg < 0x282000) || | ||
1371 | (reg >= 0x290000 && reg < 0x29c000) || | ||
1372 | (reg >= 0x2a6000 && reg < 0x2b4000) || | ||
1373 | (reg >= 0x300000 && reg < 0x30f000) || | ||
1374 | (reg >= 0x380000 && reg < 0x382000) || | ||
1375 | (reg >= 0x390000 && reg < 0x3a2000) || | ||
1376 | (reg >= 0x3a6000 && reg < 0x3b4000) || | ||
1377 | (reg >= 0x400000 && reg < 0x406000) || | ||
1378 | (reg >= 0x480000 && reg < 0x482000) || | ||
1379 | (reg >= 0x490000 && reg < 0x498000) || | ||
1380 | (reg >= 0x4a8000 && reg < 0x4aa000)) | ||
1381 | return true; | ||
1382 | else | ||
1383 | return false; | ||
1384 | } | ||
1385 | |||
1386 | static bool wm5110_is_adsp_memory(struct device *dev, unsigned int reg) | ||
1387 | { | ||
1388 | struct arizona *arizona = dev_get_drvdata(dev); | ||
1389 | |||
1390 | switch (arizona->rev) { | ||
1391 | case 0 ... 2: | ||
1392 | return wm5110_is_rev_b_adsp_memory(reg); | ||
1393 | default: | ||
1394 | return wm5110_is_rev_d_adsp_memory(reg); | ||
1395 | } | ||
1396 | } | ||
1397 | |||
1339 | static bool wm5110_readable_register(struct device *dev, unsigned int reg) | 1398 | static bool wm5110_readable_register(struct device *dev, unsigned int reg) |
1340 | { | 1399 | { |
1341 | switch (reg) { | 1400 | switch (reg) { |
@@ -2308,7 +2367,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg) | |||
2308 | case ARIZONA_DSP4_STATUS_3: | 2367 | case ARIZONA_DSP4_STATUS_3: |
2309 | return true; | 2368 | return true; |
2310 | default: | 2369 | default: |
2311 | return false; | 2370 | return wm5110_is_adsp_memory(dev, reg); |
2312 | } | 2371 | } |
2313 | } | 2372 | } |
2314 | 2373 | ||
@@ -2368,16 +2427,18 @@ static bool wm5110_volatile_register(struct device *dev, unsigned int reg) | |||
2368 | case ARIZONA_DSP4_STATUS_3: | 2427 | case ARIZONA_DSP4_STATUS_3: |
2369 | return true; | 2428 | return true; |
2370 | default: | 2429 | default: |
2371 | return false; | 2430 | return wm5110_is_adsp_memory(dev, reg); |
2372 | } | 2431 | } |
2373 | } | 2432 | } |
2374 | 2433 | ||
2434 | #define WM5110_MAX_REGISTER 0x4a9fff | ||
2435 | |||
2375 | const struct regmap_config wm5110_spi_regmap = { | 2436 | const struct regmap_config wm5110_spi_regmap = { |
2376 | .reg_bits = 32, | 2437 | .reg_bits = 32, |
2377 | .pad_bits = 16, | 2438 | .pad_bits = 16, |
2378 | .val_bits = 16, | 2439 | .val_bits = 16, |
2379 | 2440 | ||
2380 | .max_register = ARIZONA_DSP1_STATUS_2, | 2441 | .max_register = WM5110_MAX_REGISTER, |
2381 | .readable_reg = wm5110_readable_register, | 2442 | .readable_reg = wm5110_readable_register, |
2382 | .volatile_reg = wm5110_volatile_register, | 2443 | .volatile_reg = wm5110_volatile_register, |
2383 | 2444 | ||
@@ -2391,7 +2452,7 @@ const struct regmap_config wm5110_i2c_regmap = { | |||
2391 | .reg_bits = 32, | 2452 | .reg_bits = 32, |
2392 | .val_bits = 16, | 2453 | .val_bits = 16, |
2393 | 2454 | ||
2394 | .max_register = ARIZONA_DSP1_STATUS_2, | 2455 | .max_register = WM5110_MAX_REGISTER, |
2395 | .readable_reg = wm5110_readable_register, | 2456 | .readable_reg = wm5110_readable_register, |
2396 | .volatile_reg = wm5110_volatile_register, | 2457 | .volatile_reg = wm5110_volatile_register, |
2397 | 2458 | ||