Lines Matching defs:mbox

99 int apple_mbox_send(struct apple_mbox *mbox, const struct apple_mbox_msg msg,
107 spin_lock_irqsave(&mbox->tx_lock, flags);
108 mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->a2i_control);
110 while (mbox_ctrl & mbox->hw->control_full) {
113 mbox->regs + mbox->hw->a2i_control, mbox_ctrl,
114 !(mbox_ctrl & mbox->hw->control_full), 100,
118 spin_unlock_irqrestore(&mbox->tx_lock, flags);
133 if (mbox->hw->has_irq_controls) {
134 writel_relaxed(mbox->hw->irq_bit_send_empty,
135 mbox->regs + mbox->hw->irq_ack);
137 enable_irq(mbox->irq_send_empty);
138 reinit_completion(&mbox->tx_empty);
139 spin_unlock_irqrestore(&mbox->tx_lock, flags);
142 &mbox->tx_empty,
149 spin_lock_irqsave(&mbox->tx_lock, flags);
150 mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->a2i_control);
153 writeq_relaxed(msg.msg0, mbox->regs + mbox->hw->a2i_send0);
155 mbox->regs + mbox->hw->a2i_send1);
157 spin_unlock_irqrestore(&mbox->tx_lock, flags);
165 struct apple_mbox *mbox = data;
174 spin_lock(&mbox->tx_lock);
175 disable_irq_nosync(mbox->irq_send_empty);
176 complete(&mbox->tx_empty);
177 spin_unlock(&mbox->tx_lock);
182 static int apple_mbox_poll_locked(struct apple_mbox *mbox)
187 u32 mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->i2a_control);
189 while (!(mbox_ctrl & mbox->hw->control_empty)) {
190 msg.msg0 = readq_relaxed(mbox->regs + mbox->hw->i2a_recv0);
193 readq_relaxed(mbox->regs + mbox->hw->i2a_recv1));
195 mbox->rx(mbox, msg, mbox->cookie);
197 mbox_ctrl = readl_relaxed(mbox->regs + mbox->hw->i2a_control);
208 if (mbox->hw->has_irq_controls) {
209 writel_relaxed(mbox->hw->irq_bit_recv_not_empty,
210 mbox->regs + mbox->hw->irq_ack);
218 struct apple_mbox *mbox = data;
220 spin_lock(&mbox->rx_lock);
221 apple_mbox_poll_locked(mbox);
222 spin_unlock(&mbox->rx_lock);
227 int apple_mbox_poll(struct apple_mbox *mbox)
232 spin_lock_irqsave(&mbox->rx_lock, flags);
233 ret = apple_mbox_poll_locked(mbox);
234 spin_unlock_irqrestore(&mbox->rx_lock, flags);
240 int apple_mbox_start(struct apple_mbox *mbox)
244 if (mbox->active)
247 ret = pm_runtime_resume_and_get(mbox->dev);
259 if (mbox->hw->has_irq_controls) {
260 writel_relaxed(mbox->hw->irq_bit_recv_not_empty |
261 mbox->hw->irq_bit_send_empty,
262 mbox->regs + mbox->hw->irq_enable);
265 enable_irq(mbox->irq_recv_not_empty);
266 mbox->active = true;
271 void apple_mbox_stop(struct apple_mbox *mbox)
273 if (!mbox->active)
276 mbox->active = false;
277 disable_irq(mbox->irq_recv_not_empty);
278 pm_runtime_mark_last_busy(mbox->dev);
279 pm_runtime_put_autosuspend(mbox->dev);
287 struct apple_mbox *mbox;
290 ret = of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells",
301 mbox = platform_get_drvdata(pdev);
302 if (!mbox)
308 return mbox;
316 index = of_property_match_string(dev->of_node, "mbox-names", name);
328 struct apple_mbox *mbox;
331 mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL);
332 if (!mbox)
335 mbox->dev = &pdev->dev;
336 mbox->hw = of_device_get_match_data(dev);
337 if (!mbox->hw)
340 mbox->regs = devm_platform_ioremap_resource(pdev, 0);
341 if (IS_ERR(mbox->regs))
342 return PTR_ERR(mbox->regs);
344 mbox->irq_recv_not_empty =
346 if (mbox->irq_recv_not_empty < 0)
349 mbox->irq_send_empty = platform_get_irq_byname(pdev, "send-empty");
350 if (mbox->irq_send_empty < 0)
353 spin_lock_init(&mbox->rx_lock);
354 spin_lock_init(&mbox->tx_lock);
355 init_completion(&mbox->tx_empty);
361 ret = devm_request_irq(dev, mbox->irq_recv_not_empty,
363 IRQF_NO_AUTOEN | IRQF_NO_SUSPEND, irqname, mbox);
371 ret = devm_request_irq(dev, mbox->irq_send_empty,
373 IRQF_NO_AUTOEN | IRQF_NO_SUSPEND, irqname, mbox);
381 platform_set_drvdata(pdev, mbox);