| From: James Kelly <jamespeterkelly@gmail.com> |
| Date: Mon, 19 Mar 2018 21:29:50 +1100 |
| Subject: ASoC: ssm2602: Replace reg_default_raw with reg_default |
| |
| commit a01df75ce737951ad13a08d101306e88c3f57cb2 upstream. |
| |
| SSM2602 driver is broken on recent kernels (at least |
| since 4.9). User space applications such as amixer or |
| alsamixer get EIO when attempting to access codec |
| controls via the relevant IOCTLs. |
| |
| Root cause of these failures is the regcache_hw_init |
| function in drivers/base/regmap/regcache.c, which |
| prevents regmap cache initalization from the |
| reg_defaults_raw element of the regmap_config structure |
| when registers are write only. It also disables the |
| regmap cache entirely when all registers are write only |
| or volatile as is the case for the SSM2602 driver. |
| |
| Using the reg_defaults element of the regmap_config |
| structure rather than the reg_defaults_raw element to |
| initalize the regmap cache avoids the logic in the |
| regcache_hw_init function entirely. It also makes this |
| driver consistent with other ASoC codec drivers, as |
| this driver was the ONLY codec driver that used the |
| reg_defaults_raw element to initalize the cache. |
| |
| Tested on Digilent Zybo Z7 development board which has |
| a SSM2603 codec chip connected to a Xilinx Zynq SoC. |
| |
| Signed-off-by: James Kelly <jamespeterkelly@gmail.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| sound/soc/codecs/ssm2602.c | 19 +++++++++++++------ |
| 1 file changed, 13 insertions(+), 6 deletions(-) |
| |
| --- a/sound/soc/codecs/ssm2602.c |
| +++ b/sound/soc/codecs/ssm2602.c |
| @@ -54,10 +54,17 @@ struct ssm2602_priv { |
| * using 2 wire for device control, so we cache them instead. |
| * There is no point in caching the reset register |
| */ |
| -static const u16 ssm2602_reg[SSM2602_CACHEREGNUM] = { |
| - 0x0097, 0x0097, 0x0079, 0x0079, |
| - 0x000a, 0x0008, 0x009f, 0x000a, |
| - 0x0000, 0x0000 |
| +static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = { |
| + { .reg = 0x00, .def = 0x0097 }, |
| + { .reg = 0x01, .def = 0x0097 }, |
| + { .reg = 0x02, .def = 0x0079 }, |
| + { .reg = 0x03, .def = 0x0079 }, |
| + { .reg = 0x04, .def = 0x000a }, |
| + { .reg = 0x05, .def = 0x0008 }, |
| + { .reg = 0x06, .def = 0x009f }, |
| + { .reg = 0x07, .def = 0x000a }, |
| + { .reg = 0x08, .def = 0x0000 }, |
| + { .reg = 0x09, .def = 0x0000 } |
| }; |
| |
| |
| @@ -629,8 +636,8 @@ const struct regmap_config ssm2602_regma |
| .volatile_reg = ssm2602_register_volatile, |
| |
| .cache_type = REGCACHE_RBTREE, |
| - .reg_defaults_raw = ssm2602_reg, |
| - .num_reg_defaults_raw = ARRAY_SIZE(ssm2602_reg), |
| + .reg_defaults = ssm2602_reg, |
| + .num_reg_defaults = ARRAY_SIZE(ssm2602_reg), |
| }; |
| EXPORT_SYMBOL_GPL(ssm2602_regmap_config); |
| |