[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