Lines Matching +full:sc9860 +full:- +full:mailbox

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Spreadtrum mailbox driver
91 fifo_len = priv->outbox_fifo_depth; in sprd_mbox_get_fifo_len()
95 fifo_len = wr_pos - rd_pos; in sprd_mbox_get_fifo_len()
97 fifo_len = priv->outbox_fifo_depth - rd_pos + wr_pos; in sprd_mbox_get_fifo_len()
113 dev_warn_ratelimited(priv->dev, "spurious outbox interrupt\n"); in do_outbox_isr()
122 chan = &priv->chan[id]; in do_outbox_isr()
123 if (chan->cl) in do_outbox_isr()
126 dev_warn_ratelimited(priv->dev, in do_outbox_isr()
143 return do_outbox_isr(priv->outbox_base, priv); in sprd_mbox_outbox_isr()
150 return do_outbox_isr(priv->supp_base, priv); in sprd_mbox_supp_isr()
159 fifo_sts = readl(priv->inbox_base + SPRD_MBOX_FIFO_STS); in sprd_mbox_inbox_isr()
165 dev_warn_ratelimited(priv->dev, "spurious inbox interrupt\n"); in sprd_mbox_inbox_isr()
171 send_sts &= (send_sts - 1); in sprd_mbox_inbox_isr()
173 chan = &priv->chan[id]; in sprd_mbox_inbox_isr()
187 priv->inbox_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_inbox_isr()
190 writel(SPRD_MBOX_IRQ_CLR, priv->inbox_base + SPRD_MBOX_IRQ_STS); in sprd_mbox_inbox_isr()
197 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_send_data()
198 unsigned long id = (unsigned long)chan->con_priv; in sprd_mbox_send_data()
202 writel(data[0], priv->inbox_base + SPRD_MBOX_MSG_LOW); in sprd_mbox_send_data()
203 writel(data[1], priv->inbox_base + SPRD_MBOX_MSG_HIGH); in sprd_mbox_send_data()
206 writel(id, priv->inbox_base + SPRD_MBOX_ID); in sprd_mbox_send_data()
209 writel(0x1, priv->inbox_base + SPRD_MBOX_TRIGGER); in sprd_mbox_send_data()
216 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_flush()
217 unsigned long id = (unsigned long)chan->con_priv; in sprd_mbox_flush()
223 busy = readl(priv->inbox_base + SPRD_MBOX_FIFO_STS) & in sprd_mbox_flush()
233 return -ETIME; in sprd_mbox_flush()
238 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_startup()
241 mutex_lock(&priv->lock); in sprd_mbox_startup()
242 if (priv->refcnt++ == 0) { in sprd_mbox_startup()
244 writel(0x0, priv->outbox_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_startup()
247 val = readl(priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
249 writel(val, priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
252 val = readl(priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
254 writel(val, priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
257 if (priv->supp_base) { in sprd_mbox_startup()
258 writel(0x0, priv->supp_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_startup()
259 val = readl(priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
261 writel(val, priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
264 mutex_unlock(&priv->lock); in sprd_mbox_startup()
271 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_shutdown()
273 mutex_lock(&priv->lock); in sprd_mbox_shutdown()
274 if (--priv->refcnt == 0) { in sprd_mbox_shutdown()
276 writel(SPRD_INBOX_FIFO_IRQ_MASK, priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
277 writel(SPRD_OUTBOX_FIFO_IRQ_MASK, priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
279 if (priv->supp_base) in sprd_mbox_shutdown()
281 priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
283 mutex_unlock(&priv->lock); in sprd_mbox_shutdown()
295 struct device *dev = &pdev->dev; in sprd_mbox_probe()
303 return -ENOMEM; in sprd_mbox_probe()
305 priv->dev = dev; in sprd_mbox_probe()
306 mutex_init(&priv->lock); in sprd_mbox_probe()
309 * Unisoc mailbox uses an inbox to send messages to the target in sprd_mbox_probe()
313 * Thus in general the mailbox controller supplies 2 different in sprd_mbox_probe()
319 priv->inbox_base = devm_platform_ioremap_resource(pdev, 0); in sprd_mbox_probe()
320 if (IS_ERR(priv->inbox_base)) in sprd_mbox_probe()
321 return PTR_ERR(priv->inbox_base); in sprd_mbox_probe()
323 priv->outbox_base = devm_platform_ioremap_resource(pdev, 1); in sprd_mbox_probe()
324 if (IS_ERR(priv->outbox_base)) in sprd_mbox_probe()
325 return PTR_ERR(priv->outbox_base); in sprd_mbox_probe()
329 dev_err(dev, "failed to get mailbox clock\n"); in sprd_mbox_probe()
356 supp_irq = platform_get_irq_byname(pdev, "supp-outbox"); in sprd_mbox_probe()
368 return -ENODEV; in sprd_mbox_probe()
370 priv->supp_base = priv->outbox_base + (SPRD_OUTBOX_BASE_SPAN * supp); in sprd_mbox_probe()
374 priv->outbox_fifo_depth = in sprd_mbox_probe()
375 readl(priv->outbox_base + SPRD_MBOX_FIFO_DEPTH) + 1; in sprd_mbox_probe()
376 priv->mbox.dev = dev; in sprd_mbox_probe()
377 priv->mbox.chans = &priv->chan[0]; in sprd_mbox_probe()
378 priv->mbox.num_chans = SPRD_MBOX_CHAN_MAX; in sprd_mbox_probe()
379 priv->mbox.ops = &sprd_mbox_ops; in sprd_mbox_probe()
380 priv->mbox.txdone_irq = true; in sprd_mbox_probe()
383 priv->chan[id].con_priv = (void *)id; in sprd_mbox_probe()
385 ret = devm_mbox_controller_register(dev, &priv->mbox); in sprd_mbox_probe()
387 dev_err(dev, "failed to register mailbox: %d\n", ret); in sprd_mbox_probe()
395 { .compatible = "sprd,sc9860-mailbox" },
396 { .compatible = "sprd,sc9863a-mailbox",
404 .name = "sprd-mailbox",
412 MODULE_DESCRIPTION("Spreadtrum mailbox driver");