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;
200 struct sun6i_msgbox *mbox;
203 mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL);
204 if (!mbox)
212 chans[i].con_priv = mbox;
214 mbox->clk = devm_clk_get(dev, NULL);
215 if (IS_ERR(mbox->clk)) {
216 ret = PTR_ERR(mbox->clk);
221 ret = clk_prepare_enable(mbox->clk);
248 mbox->regs = devm_platform_ioremap_resource(pdev, 0);
249 if (IS_ERR(mbox->regs)) {
250 ret = PTR_ERR(mbox->regs);
256 writel(0, mbox->regs + LOCAL_IRQ_EN_REG);
259 sun6i_msgbox_irq, 0, dev_name(dev), mbox);
265 mbox->controller.dev = dev;
266 mbox->controller.ops = &sun6i_msgbox_chan_ops;
267 mbox->controller.chans = chans;
268 mbox->controller.num_chans = NUM_CHANS;
269 mbox->controller.txdone_irq = false;
270 mbox->controller.txdone_poll = true;
271 mbox->controller.txpoll_period = 5;
273 spin_lock_init(&mbox->lock);
274 platform_set_drvdata(pdev, mbox);
276 ret = mbox_controller_register(&mbox->controller);
285 clk_disable_unprepare(mbox->clk);
292 struct sun6i_msgbox *mbox = platform_get_drvdata(pdev);
294 mbox_controller_unregister(&mbox->controller);
296 clk_disable_unprepare(mbox->clk);