On Wed, Jul 8, 2020 at 3:16 AM Enric Balletbo i Serra enric.balletbo@collabora.com wrote:
Hi Yu-Hsuan,
Thank you for your patch.
On 8/7/20 9:11, Yu-Hsuan Hsu wrote:
It is not guaranteed that I2S RX is disabled when the kernel booting. For example, if the kernel crashes while it is enabled, it will keep enabled until the next time EC reboots. Reset I2S RX when probing to fix this issue.
Signed-off-by: Yu-Hsuan Hsu yuhsuan@chromium.org
include/linux/platform_data/cros_ec_commands.h | 1 + sound/soc/codecs/cros_ec_codec.c | 7 +++++++ 2 files changed, 8 insertions(+)
diff --git a/include/linux/platform_data/cros_ec_commands.h b/include/linux/platform_data/cros_ec_commands.h index 69210881ebac8..11ce917ca924c 100644 --- a/include/linux/platform_data/cros_ec_commands.h +++ b/include/linux/platform_data/cros_ec_commands.h @@ -4598,6 +4598,7 @@ enum ec_codec_i2s_rx_subcmd { EC_CODEC_I2S_RX_SET_SAMPLE_DEPTH = 0x2, EC_CODEC_I2S_RX_SET_DAIFMT = 0x3, EC_CODEC_I2S_RX_SET_BCLK = 0x4,
EC_CODEC_I2S_RX_RESET = 0x5,
Is this a new command not available in the firmware that is already in the field?
EC_CODEC_I2S_RX_SUBCMD_COUNT,
};
diff --git a/sound/soc/codecs/cros_ec_codec.c b/sound/soc/codecs/cros_ec_codec.c index 8d45c628e988e..5495214e73e68 100644 --- a/sound/soc/codecs/cros_ec_codec.c +++ b/sound/soc/codecs/cros_ec_codec.c @@ -1034,6 +1034,13 @@ static int cros_ec_codec_platform_probe(struct platform_device *pdev) } priv->ec_capabilities = r.capabilities;
/* Reset EC codec I2S RX. */
p.cmd = EC_CODEC_I2S_RX_RESET;
ret = send_ec_host_command(priv->ec_device, EC_CMD_EC_CODEC_I2S_RX,
(uint8_t *)&p, sizeof(p), NULL, 0);
if (ret)
dev_err(dev, "failed to EC_CODEC_I2S_RESET: %d\n", ret);
With an old firmware I suspect this message will appear on every boot, right? So, to solve the issue and get rid of this error you're forced to upgrade the firmware. Is that true?
It might possibly make more sense to fail this silently and to send EC_CODEC_I2S_RX_DISABLE as backup if it is not supported (-ENOTSUPP can possibly be used as trigger if the call returns it).
Also, I don't accept dev_err() if the error is ignored for patches in my scope of responsibility.
Guenter
platform_set_drvdata(pdev, priv); ret = devm_snd_soc_register_component(dev, &i2s_rx_component_driver,