Lines Matching +full:mbox +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-only
30 struct mbox_controller mbox; member
39 return chan - chan->mbox->chans; in ch_num()
44 return !(readl(mb->tx_regs + IPCR_STATUS) & BIT(idx)); in ast2700_mbox_tx_done()
51 int num_words = mb->msg_size / sizeof(u32); in ast2700_mbox_irq()
57 status = readl(mb->rx_regs + IPCR_ENABLE) & in ast2700_mbox_irq()
58 readl(mb->rx_regs + IPCR_STATUS); in ast2700_mbox_irq()
63 for (n = 0; n < mb->mbox.num_chans; ++n) { in ast2700_mbox_irq()
64 struct mbox_chan *chan = &mb->mbox.chans[n]; in ast2700_mbox_irq()
69 data_reg = mb->rx_regs + IPCR_DATA + mb->msg_size * n; in ast2700_mbox_irq()
70 word_data = chan->con_priv; in ast2700_mbox_irq()
75 mbox_chan_received_data(chan, chan->con_priv); in ast2700_mbox_irq()
78 writel(RX_IRQ(n), mb->rx_regs + IPCR_STATUS); in ast2700_mbox_irq()
86 struct ast2700_mbox *mb = dev_get_drvdata(chan->mbox->dev); in ast2700_mbox_send_data()
88 void __iomem *data_reg = mb->tx_regs + IPCR_DATA + mb->msg_size * idx; in ast2700_mbox_send_data()
90 int num_words = mb->msg_size / sizeof(u32); in ast2700_mbox_send_data()
93 if (!(readl(mb->tx_regs + IPCR_ENABLE) & BIT(idx))) { in ast2700_mbox_send_data()
94 dev_warn(mb->mbox.dev, "%s: Ch-%d not enabled yet\n", __func__, idx); in ast2700_mbox_send_data()
95 return -ENODEV; in ast2700_mbox_send_data()
99 dev_warn(mb->mbox.dev, "%s: Ch-%d last data has not finished\n", __func__, idx); in ast2700_mbox_send_data()
100 return -EBUSY; in ast2700_mbox_send_data()
107 writel(BIT(idx), mb->tx_regs + IPCR_TX_TRIG); in ast2700_mbox_send_data()
108 dev_dbg(mb->mbox.dev, "%s: Ch-%d sent\n", __func__, idx); in ast2700_mbox_send_data()
115 struct ast2700_mbox *mb = dev_get_drvdata(chan->mbox->dev); in ast2700_mbox_startup()
117 void __iomem *reg = mb->rx_regs + IPCR_ENABLE; in ast2700_mbox_startup()
120 spin_lock_irqsave(&mb->lock, flags); in ast2700_mbox_startup()
122 spin_unlock_irqrestore(&mb->lock, flags); in ast2700_mbox_startup()
129 struct ast2700_mbox *mb = dev_get_drvdata(chan->mbox->dev); in ast2700_mbox_shutdown()
131 void __iomem *reg = mb->rx_regs + IPCR_ENABLE; in ast2700_mbox_shutdown()
134 spin_lock_irqsave(&mb->lock, flags); in ast2700_mbox_shutdown()
136 spin_unlock_irqrestore(&mb->lock, flags); in ast2700_mbox_shutdown()
141 struct ast2700_mbox *mb = dev_get_drvdata(chan->mbox->dev); in ast2700_mbox_last_tx_done()
158 struct device *dev = &pdev->dev; in ast2700_mbox_probe()
161 if (!pdev->dev.of_node) in ast2700_mbox_probe()
162 return -ENODEV; in ast2700_mbox_probe()
164 dev_data = device_get_match_data(&pdev->dev); in ast2700_mbox_probe()
168 return -ENOMEM; in ast2700_mbox_probe()
170 mb->mbox.chans = devm_kcalloc(&pdev->dev, dev_data->num_chans, in ast2700_mbox_probe()
171 sizeof(*mb->mbox.chans), GFP_KERNEL); in ast2700_mbox_probe()
172 if (!mb->mbox.chans) in ast2700_mbox_probe()
173 return -ENOMEM; in ast2700_mbox_probe()
176 for (int i = 0; i < dev_data->num_chans; i++) { in ast2700_mbox_probe()
177 mb->mbox.chans[i].con_priv = devm_kcalloc(dev, dev_data->msg_size, in ast2700_mbox_probe()
179 if (!mb->mbox.chans[i].con_priv) in ast2700_mbox_probe()
180 return -ENOMEM; in ast2700_mbox_probe()
185 mb->tx_regs = devm_platform_ioremap_resource_byname(pdev, "tx"); in ast2700_mbox_probe()
186 if (IS_ERR(mb->tx_regs)) in ast2700_mbox_probe()
187 return PTR_ERR(mb->tx_regs); in ast2700_mbox_probe()
189 mb->rx_regs = devm_platform_ioremap_resource_byname(pdev, "rx"); in ast2700_mbox_probe()
190 if (IS_ERR(mb->rx_regs)) in ast2700_mbox_probe()
191 return PTR_ERR(mb->rx_regs); in ast2700_mbox_probe()
193 mb->msg_size = dev_data->msg_size; in ast2700_mbox_probe()
194 mb->mbox.dev = dev; in ast2700_mbox_probe()
195 mb->mbox.num_chans = dev_data->num_chans; in ast2700_mbox_probe()
196 mb->mbox.ops = &ast2700_mbox_chan_ops; in ast2700_mbox_probe()
197 mb->mbox.txdone_irq = false; in ast2700_mbox_probe()
198 mb->mbox.txdone_poll = true; in ast2700_mbox_probe()
199 mb->mbox.txpoll_period = 5; in ast2700_mbox_probe()
200 spin_lock_init(&mb->lock); in ast2700_mbox_probe()
210 return devm_mbox_controller_register(dev, &mb->mbox); in ast2700_mbox_probe()
219 { .compatible = "aspeed,ast2700-mailbox", .data = &ast2700_dev_data },
226 .name = "ast2700-mailbox",