Commit a9107de4 authored by Srinivas Kandagatla's avatar Srinivas Kandagatla Committed by Vinod Koul

soundwire: stream: Add read_only_wordlength flag to port properties

According to SoundWire Specification Version 1.2.
"A Data Port number X (in the range 0-14) which supports only one
value of WordLength may implement the WordLength field in the
DPX_BlockCtrl1 Register as Read-Only, returning the fixed value of
WordLength in response to reads."

As WSA881x interfaces in PDM mode making the only field "WordLength"
in DPX_BlockCtrl1" fixed and read-only. Behaviour of writing to this
register on WSA881x soundwire slave with Qualcomm Soundwire Controller
is throwing up an error. Not sure how other controllers deal with
writing to readonly registers, but this patch provides a way to avoid
writes to DPN_BlockCtrl1 register by providing a read_only_wordlength
flag in struct sdw_dpn_prop
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20200311113545.23773-2-srinivas.kandagatla@linaro.orgSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent bb6d3fb3
...@@ -167,13 +167,15 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus, ...@@ -167,13 +167,15 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
return ret; return ret;
} }
/* Program DPN_BlockCtrl1 register */ if (!dpn_prop->read_only_wordlength) {
ret = sdw_write(s_rt->slave, addr2, (p_params->bps - 1)); /* Program DPN_BlockCtrl1 register */
if (ret < 0) { ret = sdw_write(s_rt->slave, addr2, (p_params->bps - 1));
dev_err(&s_rt->slave->dev, if (ret < 0) {
"DPN_BlockCtrl1 register write failed for port %d\n", dev_err(&s_rt->slave->dev,
t_params->port_num); "DPN_BlockCtrl1 register write failed for port %d\n",
return ret; t_params->port_num);
return ret;
}
} }
/* Program DPN_SampleCtrl1 register */ /* Program DPN_SampleCtrl1 register */
......
...@@ -284,6 +284,7 @@ struct sdw_dpn_audio_mode { ...@@ -284,6 +284,7 @@ struct sdw_dpn_audio_mode {
* @max_async_buffer: Number of samples that this port can buffer in * @max_async_buffer: Number of samples that this port can buffer in
* asynchronous modes * asynchronous modes
* @block_pack_mode: Type of block port mode supported * @block_pack_mode: Type of block port mode supported
* @read_only_wordlength: Read Only wordlength field in DPN_BlockCtrl1 register
* @port_encoding: Payload Channel Sample encoding schemes supported * @port_encoding: Payload Channel Sample encoding schemes supported
* @audio_modes: Audio modes supported * @audio_modes: Audio modes supported
*/ */
...@@ -307,6 +308,7 @@ struct sdw_dpn_prop { ...@@ -307,6 +308,7 @@ struct sdw_dpn_prop {
u32 modes; u32 modes;
u32 max_async_buffer; u32 max_async_buffer;
bool block_pack_mode; bool block_pack_mode;
bool read_only_wordlength;
u32 port_encoding; u32 port_encoding;
struct sdw_dpn_audio_mode *audio_modes; struct sdw_dpn_audio_mode *audio_modes;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment