[alsa-devel] [PATCH v2 06/13] soundwire: Add bank switch routine
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Fri Apr 6 01:35:26 CEST 2018
> +static int _sdw_bank_switch(struct sdw_bus *bus)
> +{
> + int col_index, row_index;
> + struct sdw_msg *wr_msg;
> + u8 *wbuf = NULL;
> + int ret = 0;
> + u16 addr;
> +
> + wr_msg = kzalloc(sizeof(*wr_msg), GFP_KERNEL);
> + if (!wr_msg)
> + return -ENOMEM;
> +
> + wbuf = kzalloc(sizeof(*wbuf), GFP_KERNEL);
> + if (!wbuf) {
> + ret = -ENOMEM;
> + goto error_1;
> + }
> +
> + /* Get row and column index to program register */
> + col_index = sdw_find_col_index(bus->params.col);
> + row_index = sdw_find_row_index(bus->params.row);
> + wbuf[0] = col_index | (row_index << 3);
> +
> + if (bus->params.next_bank)
> + addr = SDW_SCP_FRAMECTRL_B1;
> + else
> + addr = SDW_SCP_FRAMECTRL_B0;
> +
> + sdw_fill_msg(wr_msg, NULL, addr, 1, SDW_BROADCAST_DEV_NUM,
> + SDW_MSG_FLAG_WRITE, wbuf);
> + wr_msg->ssp_sync = true;
> +
> + ret = sdw_transfer(bus, wr_msg);
> + if (ret < 0) {
> + dev_err(bus->dev, "Slave frame_ctrl reg write failed");
> + goto error;
> + }
> +
> + kfree(wr_msg);
> + kfree(wbuf);
> + bus->defer_msg.msg = NULL;
> + bus->params.curr_bank = !bus->params.curr_bank;
> + bus->params.next_bank = !bus->params.next_bank;
> +
> + return 0;
> +
> +error:
> + kfree(wbuf);
> +error_1:
> + kfree(wr_msg);
> + return ret;
> +}
> +
> +static int sdw_bank_switch(struct sdw_bus *bus)
> +{
> + const struct sdw_master_ops *ops = bus->ops;
> + int ret = 0;
> +
> + /* Pre-bank switch */
> + if (ops->pre_bank_switch) {
> + ret = ops->pre_bank_switch(bus);
> + if (ret < 0) {
> + dev_err(bus->dev, "Pre bank switch op failed: %d", ret);
> + return ret;
> + }
> + }
> +
> + /* Bank-switch */
> + ret = _sdw_bank_switch(bus);
> + if (ret < 0) {
> + dev_err(bus->dev, "Bank switch op failed: %d", ret);
> + return ret;
> + }
> +
> + return ret;
> +}
> +
> +static int sdw_post_bank_switch(struct sdw_stream_runtime *stream)
> +{
> + struct sdw_master_runtime *m_rt = stream->m_rt;
> + const struct sdw_master_ops *ops;
> + struct sdw_bus *bus = m_rt->bus;
> + int ret = 0;
> +
> + ops = bus->ops;
> +
> + /* Post-bank switch */
> + if (ops->post_bank_switch) {
> + ret = ops->post_bank_switch(bus);
> + if (ret < 0) {
> + dev_err(bus->dev,
> + "Post bank switch op failed: %d", ret);
> + return ret;
> + }
> + }
> +
> + return ret;
> +}
> +
> +static int do_bank_switch(struct sdw_stream_runtime *stream)
> +{
> + struct sdw_master_runtime *m_rt = stream->m_rt;
> + struct sdw_bus *bus = m_rt->bus;
> + int ret;
> +
> + /* Bank switch */
> + ret = sdw_bank_switch(bus);
> + if (ret < 0) {
> + dev_err(bus->dev, "Bank switch failed: %d", ret);
> + goto err;
> + }
> +
> + ret = sdw_post_bank_switch(stream);
> + if (ret < 0)
> + dev_err(bus->dev, "Post Bank switch failed: %d", ret);
The structure of the code makes little sense here, it could be
pre-bank-switch();
bank-switch();
post-band-switch();
in the same routine.
you need to add information that post-bank will need handled in a
specific manner with multi-link streams.
> +
> +err:
> + return ret;
> +}
> +
More information about the Alsa-devel
mailing list