Lines Matching full:mbox
78 static bool mpfs_mbox_busy(struct mpfs_mbox *mbox) in mpfs_mbox_busy() argument
82 if (mbox->control_scb) in mpfs_mbox_busy()
83 regmap_read(mbox->control_scb, SERVICES_SR_OFFSET, &status); in mpfs_mbox_busy()
85 status = readl_relaxed(mbox->ctrl_base + SERVICES_SR_OFFSET); in mpfs_mbox_busy()
92 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_last_tx_done() local
93 struct mpfs_mss_response *response = mbox->response; in mpfs_mbox_last_tx_done()
96 if (mpfs_mbox_busy(mbox)) in mpfs_mbox_last_tx_done()
105 if (mbox->control_scb) in mpfs_mbox_last_tx_done()
106 regmap_read(mbox->control_scb, SERVICES_SR_OFFSET, &val); in mpfs_mbox_last_tx_done()
108 val = readl_relaxed(mbox->ctrl_base + SERVICES_SR_OFFSET); in mpfs_mbox_last_tx_done()
117 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_send_data() local
123 mbox->response = msg->response; in mpfs_mbox_send_data()
124 mbox->resp_offset = msg->resp_offset; in mpfs_mbox_send_data()
126 if (mpfs_mbox_busy(mbox)) in mpfs_mbox_send_data()
136 mbox->mbox_base + msg->mbox_offset + index * 0x4); in mpfs_mbox_send_data()
142 val = readl_relaxed(mbox->mbox_base + msg->mbox_offset + index * 0x4); in mpfs_mbox_send_data()
149 writel_relaxed(val, mbox->mbox_base + msg->mbox_offset + index * 0x4); in mpfs_mbox_send_data()
158 if (mbox->control_scb) in mpfs_mbox_send_data()
159 regmap_write(mbox->control_scb, SERVICES_CR_OFFSET, tx_trigger); in mpfs_mbox_send_data()
161 writel_relaxed(tx_trigger, mbox->ctrl_base + SERVICES_CR_OFFSET); in mpfs_mbox_send_data()
169 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_rx_data() local
170 struct mpfs_mss_response *response = mbox->response; in mpfs_mbox_rx_data()
175 dev_err(mbox->dev, "failed to assign memory for response %d\n", -ENOMEM); in mpfs_mbox_rx_data()
184 if (mpfs_mbox_busy(mbox)) { in mpfs_mbox_rx_data()
185 dev_err(mbox->dev, "got an interrupt but system controller is busy\n"); in mpfs_mbox_rx_data()
192 readl_relaxed(mbox->mbox_base in mpfs_mbox_rx_data()
193 + mbox->resp_offset + i * 0x4); in mpfs_mbox_rx_data()
202 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_inbox_isr() local
204 if (mbox->control_scb) in mpfs_mbox_inbox_isr()
205 regmap_write(mbox->sysreg_scb, MESSAGE_INT_OFFSET, 0); in mpfs_mbox_inbox_isr()
207 writel_relaxed(0, mbox->int_reg); in mpfs_mbox_inbox_isr()
216 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_startup() local
219 if (!mbox) in mpfs_mbox_startup()
222 ret = devm_request_irq(mbox->dev, mbox->irq, mpfs_mbox_inbox_isr, 0, "mpfs-mailbox", chan); in mpfs_mbox_startup()
224 dev_err(mbox->dev, "failed to register mailbox interrupt:%d\n", ret); in mpfs_mbox_startup()
231 struct mpfs_mbox *mbox = (struct mpfs_mbox *)chan->con_priv; in mpfs_mbox_shutdown() local
233 devm_free_irq(mbox->dev, mbox->irq, chan); in mpfs_mbox_shutdown()
243 static inline int mpfs_mbox_syscon_probe(struct mpfs_mbox *mbox, struct platform_device *pdev) in mpfs_mbox_syscon_probe() argument
245 mbox->control_scb = syscon_regmap_lookup_by_compatible("microchip,mpfs-control-scb"); in mpfs_mbox_syscon_probe()
246 if (IS_ERR(mbox->control_scb)) in mpfs_mbox_syscon_probe()
247 return PTR_ERR(mbox->control_scb); in mpfs_mbox_syscon_probe()
249 mbox->sysreg_scb = syscon_regmap_lookup_by_compatible("microchip,mpfs-sysreg-scb"); in mpfs_mbox_syscon_probe()
250 if (IS_ERR(mbox->sysreg_scb)) in mpfs_mbox_syscon_probe()
251 return PTR_ERR(mbox->sysreg_scb); in mpfs_mbox_syscon_probe()
253 mbox->mbox_base = devm_platform_ioremap_resource(pdev, 0); in mpfs_mbox_syscon_probe()
254 if (IS_ERR(mbox->mbox_base)) in mpfs_mbox_syscon_probe()
255 return PTR_ERR(mbox->mbox_base); in mpfs_mbox_syscon_probe()
260 static inline int mpfs_mbox_old_format_probe(struct mpfs_mbox *mbox, struct platform_device *pdev) in mpfs_mbox_old_format_probe() argument
264 mbox->ctrl_base = devm_platform_ioremap_resource(pdev, 0); in mpfs_mbox_old_format_probe()
265 if (IS_ERR(mbox->ctrl_base)) in mpfs_mbox_old_format_probe()
266 return PTR_ERR(mbox->ctrl_base); in mpfs_mbox_old_format_probe()
268 mbox->int_reg = devm_platform_ioremap_resource(pdev, 1); in mpfs_mbox_old_format_probe()
269 if (IS_ERR(mbox->int_reg)) in mpfs_mbox_old_format_probe()
270 return PTR_ERR(mbox->int_reg); in mpfs_mbox_old_format_probe()
272 mbox->mbox_base = devm_platform_ioremap_resource(pdev, 2); in mpfs_mbox_old_format_probe()
273 if (IS_ERR(mbox->mbox_base)) // account for the old dt-binding w/ 2 regs in mpfs_mbox_old_format_probe()
274 mbox->mbox_base = mbox->ctrl_base + MAILBOX_REG_OFFSET; in mpfs_mbox_old_format_probe()
281 struct mpfs_mbox *mbox; in mpfs_mbox_probe() local
284 mbox = devm_kzalloc(&pdev->dev, sizeof(*mbox), GFP_KERNEL); in mpfs_mbox_probe()
285 if (!mbox) in mpfs_mbox_probe()
288 ret = mpfs_mbox_syscon_probe(mbox, pdev); in mpfs_mbox_probe()
294 mbox->control_scb = NULL; in mpfs_mbox_probe()
295 ret = mpfs_mbox_old_format_probe(mbox, pdev); in mpfs_mbox_probe()
299 mbox->irq = platform_get_irq(pdev, 0); in mpfs_mbox_probe()
300 if (mbox->irq < 0) in mpfs_mbox_probe()
301 return mbox->irq; in mpfs_mbox_probe()
303 mbox->dev = &pdev->dev; in mpfs_mbox_probe()
305 mbox->chans[0].con_priv = mbox; in mpfs_mbox_probe()
306 mbox->controller.dev = mbox->dev; in mpfs_mbox_probe()
307 mbox->controller.num_chans = 1; in mpfs_mbox_probe()
308 mbox->controller.chans = mbox->chans; in mpfs_mbox_probe()
309 mbox->controller.ops = &mpfs_mbox_ops; in mpfs_mbox_probe()
310 mbox->controller.txdone_poll = true; in mpfs_mbox_probe()
311 mbox->controller.txpoll_period = 10u; in mpfs_mbox_probe()
313 ret = devm_mbox_controller_register(&pdev->dev, &mbox->controller); in mpfs_mbox_probe()