in qcom-ngd-ctrl.c [932:1017]
static int qcom_slim_ngd_enable_stream(struct slim_stream_runtime *rt)
{
struct slim_device *sdev = rt->dev;
struct slim_controller *ctrl = sdev->ctrl;
struct slim_val_inf msg = {0};
u8 wbuf[SLIM_MSGQ_BUF_LEN];
u8 rbuf[SLIM_MSGQ_BUF_LEN];
struct slim_msg_txn txn = {0,};
int i, ret;
txn.mt = SLIM_MSG_MT_DEST_REFERRED_USER;
txn.dt = SLIM_MSG_DEST_LOGICALADDR;
txn.la = SLIM_LA_MGR;
txn.ec = 0;
txn.msg = &msg;
txn.msg->num_bytes = 0;
txn.msg->wbuf = wbuf;
txn.msg->rbuf = rbuf;
for (i = 0; i < rt->num_ports; i++) {
struct slim_port *port = &rt->ports[i];
if (txn.msg->num_bytes == 0) {
int seg_interval = SLIM_SLOTS_PER_SUPERFRAME/rt->ratem;
int exp;
wbuf[txn.msg->num_bytes++] = sdev->laddr;
wbuf[txn.msg->num_bytes] = rt->bps >> 2 |
(port->ch.aux_fmt << 6);
/* Data channel segment interval not multiple of 3 */
exp = seg_interval % 3;
if (exp)
wbuf[txn.msg->num_bytes] |= BIT(5);
txn.msg->num_bytes++;
wbuf[txn.msg->num_bytes++] = exp << 4 | rt->prot;
if (rt->prot == SLIM_PROTO_ISO)
wbuf[txn.msg->num_bytes++] =
port->ch.prrate |
SLIM_CHANNEL_CONTENT_FL;
else
wbuf[txn.msg->num_bytes++] = port->ch.prrate;
ret = slim_alloc_txn_tid(ctrl, &txn);
if (ret) {
dev_err(&sdev->dev, "Fail to allocate TID\n");
return -ENXIO;
}
wbuf[txn.msg->num_bytes++] = txn.tid;
}
wbuf[txn.msg->num_bytes++] = port->ch.id;
}
txn.mc = SLIM_USR_MC_DEF_ACT_CHAN;
txn.rl = txn.msg->num_bytes + 4;
ret = qcom_slim_ngd_xfer_msg_sync(ctrl, &txn);
if (ret) {
slim_free_txn_tid(ctrl, &txn);
dev_err(&sdev->dev, "TX timed out:MC:0x%x,mt:0x%x", txn.mc,
txn.mt);
return ret;
}
txn.mc = SLIM_USR_MC_RECONFIG_NOW;
txn.msg->num_bytes = 2;
wbuf[1] = sdev->laddr;
txn.rl = txn.msg->num_bytes + 4;
ret = slim_alloc_txn_tid(ctrl, &txn);
if (ret) {
dev_err(ctrl->dev, "Fail to allocate TID\n");
return ret;
}
wbuf[0] = txn.tid;
ret = qcom_slim_ngd_xfer_msg_sync(ctrl, &txn);
if (ret) {
slim_free_txn_tid(ctrl, &txn);
dev_err(&sdev->dev, "TX timed out:MC:0x%x,mt:0x%x", txn.mc,
txn.mt);
}
return ret;
}