Lines Matching +full:sc9860 +full:- +full:mailbox
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Spreadtrum mailbox driver
92 fifo_len = priv->outbox_fifo_depth; in sprd_mbox_get_fifo_len()
96 fifo_len = wr_pos - rd_pos; in sprd_mbox_get_fifo_len()
98 fifo_len = priv->outbox_fifo_depth - rd_pos + wr_pos; in sprd_mbox_get_fifo_len()
114 dev_warn_ratelimited(priv->dev, "spurious outbox interrupt\n"); in do_outbox_isr()
123 chan = &priv->chan[id]; in do_outbox_isr()
124 if (chan->cl) in do_outbox_isr()
127 dev_warn_ratelimited(priv->dev, in do_outbox_isr()
144 return do_outbox_isr(priv->outbox_base, priv); in sprd_mbox_outbox_isr()
151 return do_outbox_isr(priv->supp_base, priv); in sprd_mbox_supp_isr()
160 fifo_sts = readl(priv->inbox_base + SPRD_MBOX_FIFO_STS); in sprd_mbox_inbox_isr()
166 dev_warn_ratelimited(priv->dev, "spurious inbox interrupt\n"); in sprd_mbox_inbox_isr()
172 send_sts &= (send_sts - 1); in sprd_mbox_inbox_isr()
174 chan = &priv->chan[id]; in sprd_mbox_inbox_isr()
188 priv->inbox_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_inbox_isr()
191 writel(SPRD_MBOX_IRQ_CLR, priv->inbox_base + SPRD_MBOX_IRQ_STS); in sprd_mbox_inbox_isr()
198 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_send_data()
199 unsigned long id = (unsigned long)chan->con_priv; in sprd_mbox_send_data()
203 writel(data[0], priv->inbox_base + SPRD_MBOX_MSG_LOW); in sprd_mbox_send_data()
204 writel(data[1], priv->inbox_base + SPRD_MBOX_MSG_HIGH); in sprd_mbox_send_data()
207 writel(id, priv->inbox_base + SPRD_MBOX_ID); in sprd_mbox_send_data()
210 writel(0x1, priv->inbox_base + SPRD_MBOX_TRIGGER); in sprd_mbox_send_data()
217 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_flush()
218 unsigned long id = (unsigned long)chan->con_priv; in sprd_mbox_flush()
224 busy = readl(priv->inbox_base + SPRD_MBOX_FIFO_STS) & in sprd_mbox_flush()
234 return -ETIME; in sprd_mbox_flush()
239 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_startup()
242 mutex_lock(&priv->lock); in sprd_mbox_startup()
243 if (priv->refcnt++ == 0) { in sprd_mbox_startup()
245 writel(0x0, priv->outbox_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_startup()
248 val = readl(priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
250 writel(val, priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
253 val = readl(priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
255 writel(val, priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
258 if (priv->supp_base) { in sprd_mbox_startup()
259 writel(0x0, priv->supp_base + SPRD_MBOX_FIFO_RST); in sprd_mbox_startup()
260 val = readl(priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
262 writel(val, priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_startup()
265 mutex_unlock(&priv->lock); in sprd_mbox_startup()
272 struct sprd_mbox_priv *priv = to_sprd_mbox_priv(chan->mbox); in sprd_mbox_shutdown()
274 mutex_lock(&priv->lock); in sprd_mbox_shutdown()
275 if (--priv->refcnt == 0) { in sprd_mbox_shutdown()
277 writel(SPRD_INBOX_FIFO_IRQ_MASK, priv->inbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
278 writel(SPRD_OUTBOX_FIFO_IRQ_MASK, priv->outbox_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
280 if (priv->supp_base) in sprd_mbox_shutdown()
282 priv->supp_base + SPRD_MBOX_IRQ_MSK); in sprd_mbox_shutdown()
284 mutex_unlock(&priv->lock); in sprd_mbox_shutdown()
298 clk_disable_unprepare(priv->clk); in sprd_mbox_disable()
303 struct device *dev = &pdev->dev; in sprd_mbox_probe()
310 return -ENOMEM; in sprd_mbox_probe()
312 priv->dev = dev; in sprd_mbox_probe()
313 mutex_init(&priv->lock); in sprd_mbox_probe()
316 * Unisoc mailbox uses an inbox to send messages to the target in sprd_mbox_probe()
320 * Thus in general the mailbox controller supplies 2 different in sprd_mbox_probe()
326 priv->inbox_base = devm_platform_ioremap_resource(pdev, 0); in sprd_mbox_probe()
327 if (IS_ERR(priv->inbox_base)) in sprd_mbox_probe()
328 return PTR_ERR(priv->inbox_base); in sprd_mbox_probe()
330 priv->outbox_base = devm_platform_ioremap_resource(pdev, 1); in sprd_mbox_probe()
331 if (IS_ERR(priv->outbox_base)) in sprd_mbox_probe()
332 return PTR_ERR(priv->outbox_base); in sprd_mbox_probe()
334 priv->clk = devm_clk_get(dev, "enable"); in sprd_mbox_probe()
335 if (IS_ERR(priv->clk)) { in sprd_mbox_probe()
336 dev_err(dev, "failed to get mailbox clock\n"); in sprd_mbox_probe()
337 return PTR_ERR(priv->clk); in sprd_mbox_probe()
340 ret = clk_prepare_enable(priv->clk); in sprd_mbox_probe()
346 dev_err(dev, "failed to add mailbox disable action\n"); in sprd_mbox_probe()
373 supp_irq = platform_get_irq_byname(pdev, "supp-outbox"); in sprd_mbox_probe()
385 return -ENODEV; in sprd_mbox_probe()
387 priv->supp_base = priv->outbox_base + (SPRD_OUTBOX_BASE_SPAN * supp); in sprd_mbox_probe()
391 priv->outbox_fifo_depth = in sprd_mbox_probe()
392 readl(priv->outbox_base + SPRD_MBOX_FIFO_DEPTH) + 1; in sprd_mbox_probe()
393 priv->mbox.dev = dev; in sprd_mbox_probe()
394 priv->mbox.chans = &priv->chan[0]; in sprd_mbox_probe()
395 priv->mbox.num_chans = SPRD_MBOX_CHAN_MAX; in sprd_mbox_probe()
396 priv->mbox.ops = &sprd_mbox_ops; in sprd_mbox_probe()
397 priv->mbox.txdone_irq = true; in sprd_mbox_probe()
400 priv->chan[id].con_priv = (void *)id; in sprd_mbox_probe()
402 ret = devm_mbox_controller_register(dev, &priv->mbox); in sprd_mbox_probe()
404 dev_err(dev, "failed to register mailbox: %d\n", ret); in sprd_mbox_probe()
412 { .compatible = "sprd,sc9860-mailbox" },
413 { .compatible = "sprd,sc9863a-mailbox",
421 .name = "sprd-mailbox",
429 MODULE_DESCRIPTION("Spreadtrum mailbox driver");