Lines Matching defs:sc_ipc
27 struct imx_sc_ipc *sc_ipc;
116 struct imx_sc_ipc *sc_ipc = sc_chan->sc_ipc;
121 if (!sc_ipc->msg) {
122 dev_warn(sc_ipc->dev, "unexpected rx idx %d 0x%08x, ignore!\n",
127 if (sc_ipc->fast_ipc) {
129 sc_ipc->rx_size = hdr->size;
130 sc_ipc->msg[0] = *data++;
132 for (i = 1; i < sc_ipc->rx_size; i++)
133 sc_ipc->msg[i] = *data++;
135 complete(&sc_ipc->done);
142 sc_ipc->rx_size = hdr->size;
143 dev_dbg(sc_ipc->dev, "msg rx size %u\n", sc_ipc->rx_size);
144 if (sc_ipc->rx_size > 4)
145 dev_warn(sc_ipc->dev, "RPC does not support receiving over 4 words: %u\n",
146 sc_ipc->rx_size);
149 sc_ipc->msg[sc_chan->idx] = *data;
150 sc_ipc->count++;
152 dev_dbg(sc_ipc->dev, "mu %u msg %u 0x%x\n", sc_chan->idx,
153 sc_ipc->count, *data);
155 if ((sc_ipc->rx_size != 0) && (sc_ipc->count == sc_ipc->rx_size))
156 complete(&sc_ipc->done);
159 static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg)
172 dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr.svc,
175 size = sc_ipc->fast_ipc ? 1 : hdr.size;
177 sc_chan = &sc_ipc->chans[i % 4];
188 if (!sc_ipc->fast_ipc) {
204 int imx_scu_call_rpc(struct imx_sc_ipc *sc_ipc, void *msg, bool have_resp)
210 if (WARN_ON(!sc_ipc || !msg))
213 mutex_lock(&sc_ipc->lock);
214 reinit_completion(&sc_ipc->done);
217 sc_ipc->msg = msg;
221 sc_ipc->count = 0;
222 ret = imx_scu_ipc_write(sc_ipc, msg);
224 dev_err(sc_ipc->dev, "RPC send msg failed: %d\n", ret);
229 if (!wait_for_completion_timeout(&sc_ipc->done,
231 dev_err(sc_ipc->dev, "RPC send msg timeout\n");
232 mutex_unlock(&sc_ipc->lock);
252 sc_ipc->msg = NULL;
253 mutex_unlock(&sc_ipc->lock);
255 dev_dbg(sc_ipc->dev, "RPC SVC done\n");
264 struct imx_sc_ipc *sc_ipc;
273 sc_ipc = devm_kzalloc(dev, sizeof(*sc_ipc), GFP_KERNEL);
274 if (!sc_ipc)
282 sc_ipc->fast_ipc = of_device_is_compatible(args.np, "fsl,imx8-mu-scu");
284 num_channel = sc_ipc->fast_ipc ? 2 : SCU_MU_CHAN_NUM;
295 sc_chan = &sc_ipc->chans[i];
302 if (!sc_ipc->fast_ipc) {
309 sc_chan->sc_ipc = sc_ipc;
325 sc_ipc->dev = dev;
326 mutex_init(&sc_ipc->lock);
327 init_completion(&sc_ipc->done);
329 imx_sc_ipc_handle = sc_ipc;