Lines Matching defs:sc_ipc
26 struct imx_sc_ipc *sc_ipc;
115 struct imx_sc_ipc *sc_ipc = sc_chan->sc_ipc;
120 if (!sc_ipc->msg) {
121 dev_warn(sc_ipc->dev, "unexpected rx idx %d 0x%08x, ignore!\n",
126 if (sc_ipc->fast_ipc) {
128 sc_ipc->rx_size = hdr->size;
129 sc_ipc->msg[0] = *data++;
131 for (i = 1; i < sc_ipc->rx_size; i++)
132 sc_ipc->msg[i] = *data++;
134 complete(&sc_ipc->done);
141 sc_ipc->rx_size = hdr->size;
142 dev_dbg(sc_ipc->dev, "msg rx size %u\n", sc_ipc->rx_size);
143 if (sc_ipc->rx_size > 4)
144 dev_warn(sc_ipc->dev, "RPC does not support receiving over 4 words: %u\n",
145 sc_ipc->rx_size);
148 sc_ipc->msg[sc_chan->idx] = *data;
149 sc_ipc->count++;
151 dev_dbg(sc_ipc->dev, "mu %u msg %u 0x%x\n", sc_chan->idx,
152 sc_ipc->count, *data);
154 if ((sc_ipc->rx_size != 0) && (sc_ipc->count == sc_ipc->rx_size))
155 complete(&sc_ipc->done);
158 static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg)
171 dev_dbg(sc_ipc->dev, "RPC SVC %u FUNC %u SIZE %u\n", hdr.svc,
174 size = sc_ipc->fast_ipc ? 1 : hdr.size;
176 sc_chan = &sc_ipc->chans[i % 4];
187 if (!sc_ipc->fast_ipc) {
203 int imx_scu_call_rpc(struct imx_sc_ipc *sc_ipc, void *msg, bool have_resp)
209 if (WARN_ON(!sc_ipc || !msg))
212 mutex_lock(&sc_ipc->lock);
213 reinit_completion(&sc_ipc->done);
216 sc_ipc->msg = msg;
220 sc_ipc->count = 0;
221 ret = imx_scu_ipc_write(sc_ipc, msg);
223 dev_err(sc_ipc->dev, "RPC send msg failed: %d\n", ret);
228 if (!wait_for_completion_timeout(&sc_ipc->done,
230 dev_err(sc_ipc->dev, "RPC send msg timeout\n");
231 mutex_unlock(&sc_ipc->lock);
251 sc_ipc->msg = NULL;
252 mutex_unlock(&sc_ipc->lock);
254 dev_dbg(sc_ipc->dev, "RPC SVC done\n");
263 struct imx_sc_ipc *sc_ipc;
272 sc_ipc = devm_kzalloc(dev, sizeof(*sc_ipc), GFP_KERNEL);
273 if (!sc_ipc)
281 sc_ipc->fast_ipc = of_device_is_compatible(args.np, "fsl,imx8-mu-scu");
283 num_channel = sc_ipc->fast_ipc ? 2 : SCU_MU_CHAN_NUM;
294 sc_chan = &sc_ipc->chans[i];
301 if (!sc_ipc->fast_ipc) {
308 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;