Lines Matching +full:mailbox +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright Altera Corporation (C) 2013-2014. All rights reserved
15 #define DRIVER_NAME "altera-mailbox"
40 bool is_sender; /* 1-sender, 0-receiver */
45 struct mbox_controller controller; member
47 /* If the controller supports only RX polling mode */
54 if (!chan || !chan->con_priv) in mbox_chan_to_altera_mbox()
57 return (struct altera_mbox *)chan->con_priv; in mbox_chan_to_altera_mbox()
64 status = readl_relaxed(mbox->mbox_base + MAILBOX_STS_REG); in altera_mbox_full()
72 status = readl_relaxed(mbox->mbox_base + MAILBOX_STS_REG); in altera_mbox_pending()
80 mask = readl_relaxed(mbox->mbox_base + MAILBOX_INTMASK_REG); in altera_mbox_rx_intmask()
85 writel_relaxed(mask, mbox->mbox_base + MAILBOX_INTMASK_REG); in altera_mbox_rx_intmask()
92 mask = readl_relaxed(mbox->mbox_base + MAILBOX_INTMASK_REG); in altera_mbox_tx_intmask()
97 writel_relaxed(mask, mbox->mbox_base + MAILBOX_INTMASK_REG); in altera_mbox_tx_intmask()
104 * This register is read-write if it is a sender. in altera_mbox_is_sender()
107 writel_relaxed(MBOX_MAGIC, mbox->mbox_base + MAILBOX_PTR_REG); in altera_mbox_is_sender()
108 reg = readl_relaxed(mbox->mbox_base + MAILBOX_PTR_REG); in altera_mbox_is_sender()
111 writel_relaxed(0, mbox->mbox_base + MAILBOX_PTR_REG); in altera_mbox_is_sender()
124 readl_relaxed(mbox->mbox_base + MAILBOX_PTR_REG); in altera_mbox_rx_data()
126 readl_relaxed(mbox->mbox_base + MAILBOX_CMD_REG); in altera_mbox_rx_data()
135 altera_mbox_rx_data(mbox->chan); in altera_mbox_poll_rx()
137 mod_timer(&mbox->rxpoll_timer, in altera_mbox_poll_rx()
165 if (mbox->intr_mode) { in altera_mbox_startup_sender()
166 ret = request_irq(mbox->irq, altera_mbox_tx_interrupt, 0, in altera_mbox_startup_sender()
169 dev_err(mbox->dev, in altera_mbox_startup_sender()
170 "failed to register mailbox interrupt:%d\n", in altera_mbox_startup_sender()
184 if (mbox->intr_mode) { in altera_mbox_startup_receiver()
185 ret = request_irq(mbox->irq, altera_mbox_rx_interrupt, 0, in altera_mbox_startup_receiver()
188 mbox->intr_mode = false; in altera_mbox_startup_receiver()
198 mbox->chan = chan; in altera_mbox_startup_receiver()
199 timer_setup(&mbox->rxpoll_timer, altera_mbox_poll_rx, 0); in altera_mbox_startup_receiver()
200 mod_timer(&mbox->rxpoll_timer, in altera_mbox_startup_receiver()
212 return -EINVAL; in altera_mbox_send_data()
213 if (!mbox->is_sender) { in altera_mbox_send_data()
214 dev_warn(mbox->dev, in altera_mbox_send_data()
215 "failed to send. This is receiver mailbox.\n"); in altera_mbox_send_data()
216 return -EINVAL; in altera_mbox_send_data()
220 return -EBUSY; in altera_mbox_send_data()
223 if (mbox->intr_mode) in altera_mbox_send_data()
227 writel_relaxed(udata[MBOX_PTR], mbox->mbox_base + MAILBOX_PTR_REG); in altera_mbox_send_data()
228 writel_relaxed(udata[MBOX_CMD], mbox->mbox_base + MAILBOX_CMD_REG); in altera_mbox_send_data()
237 /* Return false if mailbox is full */ in altera_mbox_last_tx_done()
254 return -EINVAL; in altera_mbox_startup()
256 if (mbox->is_sender) in altera_mbox_startup()
268 if (mbox->intr_mode) { in altera_mbox_shutdown()
270 writel_relaxed(~0, mbox->mbox_base + MAILBOX_INTMASK_REG); in altera_mbox_shutdown()
271 free_irq(mbox->irq, chan); in altera_mbox_shutdown()
272 } else if (!mbox->is_sender) { in altera_mbox_shutdown()
273 timer_delete_sync(&mbox->rxpoll_timer); in altera_mbox_shutdown()
291 mbox = devm_kzalloc(&pdev->dev, sizeof(*mbox), in altera_mbox_probe()
294 return -ENOMEM; in altera_mbox_probe()
297 chans = devm_kzalloc(&pdev->dev, sizeof(*chans), GFP_KERNEL); in altera_mbox_probe()
299 return -ENOMEM; in altera_mbox_probe()
301 mbox->mbox_base = devm_platform_ioremap_resource(pdev, 0); in altera_mbox_probe()
302 if (IS_ERR(mbox->mbox_base)) in altera_mbox_probe()
303 return PTR_ERR(mbox->mbox_base); in altera_mbox_probe()
306 mbox->is_sender = altera_mbox_is_sender(mbox); in altera_mbox_probe()
308 mbox->irq = platform_get_irq(pdev, 0); in altera_mbox_probe()
309 if (mbox->irq >= 0) in altera_mbox_probe()
310 mbox->intr_mode = true; in altera_mbox_probe()
312 mbox->dev = &pdev->dev; in altera_mbox_probe()
316 mbox->controller.dev = mbox->dev; in altera_mbox_probe()
317 mbox->controller.num_chans = 1; in altera_mbox_probe()
318 mbox->controller.chans = chans; in altera_mbox_probe()
319 mbox->controller.ops = &altera_mbox_ops; in altera_mbox_probe()
321 if (mbox->is_sender) { in altera_mbox_probe()
322 if (mbox->intr_mode) { in altera_mbox_probe()
323 mbox->controller.txdone_irq = true; in altera_mbox_probe()
325 mbox->controller.txdone_poll = true; in altera_mbox_probe()
326 mbox->controller.txpoll_period = MBOX_POLLING_MS; in altera_mbox_probe()
330 ret = devm_mbox_controller_register(&pdev->dev, &mbox->controller); in altera_mbox_probe()
332 dev_err(&pdev->dev, "Register mailbox failed\n"); in altera_mbox_probe()
342 { .compatible = "altr,mailbox-1.0" },
359 MODULE_DESCRIPTION("Altera mailbox specific functions");
361 MODULE_ALIAS("platform:altera-mailbox");