Lines Matching refs:mbox
44 #define mbox_dbg(mbox, ...) dev_dbg((mbox)->controller.dev, __VA_ARGS__)
58 return chan - chan->mbox->chans;
68 struct sun6i_msgbox *mbox = dev_id;
73 status = readl(mbox->regs + LOCAL_IRQ_EN_REG) &
74 readl(mbox->regs + LOCAL_IRQ_STAT_REG);
80 struct mbox_chan *chan = &mbox->controller.chans[n];
86 uint32_t msg = readl(mbox->regs + MSG_DATA_REG(n));
88 mbox_dbg(mbox, "Channel %d received 0x%08x\n", n, msg);
93 writel(RX_IRQ(n), mbox->regs + LOCAL_IRQ_STAT_REG);
101 struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
106 if (WARN_ON_ONCE(!(readl(mbox->regs + CTRL_REG(n)) & CTRL_TX(n))))
109 writel(msg, mbox->regs + MSG_DATA_REG(n));
110 mbox_dbg(mbox, "Channel %d sent 0x%08x\n", n, msg);
117 struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
121 if (readl(mbox->regs + CTRL_REG(n)) & CTRL_RX(n)) {
124 readl(mbox->regs + MSG_DATA_REG(n));
125 writel(RX_IRQ(n), mbox->regs + LOCAL_IRQ_STAT_REG);
128 spin_lock(&mbox->lock);
129 writel(readl(mbox->regs + LOCAL_IRQ_EN_REG) | RX_IRQ(n),
130 mbox->regs + LOCAL_IRQ_EN_REG);
131 spin_unlock(&mbox->lock);
134 mbox_dbg(mbox, "Channel %d startup complete\n", n);
141 struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
144 if (readl(mbox->regs + CTRL_REG(n)) & CTRL_RX(n)) {
146 spin_lock(&mbox->lock);
147 writel(readl(mbox->regs + LOCAL_IRQ_EN_REG) & ~RX_IRQ(n),
148 mbox->regs + LOCAL_IRQ_EN_REG);
149 spin_unlock(&mbox->lock);
154 readl(mbox->regs + MSG_DATA_REG(n));
155 writel(RX_IRQ(n), mbox->regs + LOCAL_IRQ_STAT_REG);
156 } while (readl(mbox->regs + LOCAL_IRQ_STAT_REG) & RX_IRQ(n));
159 mbox_dbg(mbox, "Channel %d shutdown complete\n", n);
164 struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
176 return !(readl(mbox->regs + REMOTE_IRQ_STAT_REG) & RX_IRQ(n));
181 struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
184 return readl(mbox->regs + MSG_STAT_REG(n)) & MSG_STAT_MASK;
201 struct sun6i_msgbox *mbox;
204 mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL);
205 if (!mbox)
213 chans[i].con_priv = mbox;
215 mbox->clk = devm_clk_get(dev, NULL);
216 if (IS_ERR(mbox->clk)) {
217 ret = PTR_ERR(mbox->clk);
222 ret = clk_prepare_enable(mbox->clk);
255 mbox->regs = devm_ioremap_resource(&pdev->dev, res);
256 if (IS_ERR(mbox->regs)) {
257 ret = PTR_ERR(mbox->regs);
263 writel(0, mbox->regs + LOCAL_IRQ_EN_REG);
266 sun6i_msgbox_irq, 0, dev_name(dev), mbox);
272 mbox->controller.dev = dev;
273 mbox->controller.ops = &sun6i_msgbox_chan_ops;
274 mbox->controller.chans = chans;
275 mbox->controller.num_chans = NUM_CHANS;
276 mbox->controller.txdone_irq = false;
277 mbox->controller.txdone_poll = true;
278 mbox->controller.txpoll_period = 5;
280 spin_lock_init(&mbox->lock);
281 platform_set_drvdata(pdev, mbox);
283 ret = mbox_controller_register(&mbox->controller);
292 clk_disable_unprepare(mbox->clk);
299 struct sun6i_msgbox *mbox = platform_get_drvdata(pdev);
301 mbox_controller_unregister(&mbox->controller);
303 clk_disable_unprepare(mbox->clk);