Lines Matching refs:pic_mbox
45 struct pic_mbox struct
61 #define raw_to_pic_mbox(raw) rt_container_of(raw, struct pic_mbox, parent) argument
66 struct pic_mbox *pic_mbox = raw_to_pic_mbox(chan->ctrl); in pic_mbox_request() local
68 HWREG32(pic_mbox->regs + MAILBOX_IMASK) &= ~RT_BIT(index); in pic_mbox_request()
69 HWREG32(pic_mbox->regs + MAILBOX_ISTATE) = 0; in pic_mbox_request()
77 struct pic_mbox *pic_mbox = raw_to_pic_mbox(chan->ctrl); in pic_mbox_release() local
79 HWREG32(pic_mbox->regs + MAILBOX_IMASK) |= RT_BIT(index); in pic_mbox_release()
86 struct pic_mbox *pic_mbox = raw_to_pic_mbox(chan->ctrl); in pic_mbox_send() local
88 while (HWREG32(pic_mbox->peer_regs + MAILBOX_ISTATE) & RT_BIT(index)) in pic_mbox_send()
93 if (HWREG32(pic_mbox->peer_regs + MAILBOX_IMASK) & RT_BIT(index)) in pic_mbox_send()
98 level = rt_spin_lock_irqsave(&pic_mbox->lock); in pic_mbox_send()
100 HWREG32(pic_mbox->regs + MAILBOX_MSG(index)) = *(rt_uint32_t *)data; in pic_mbox_send()
101 HWREG32(pic_mbox->peer_regs + MAILBOX_ISTATE) |= RT_BIT(index); in pic_mbox_send()
104 rt_pic_irq_set_state_raw(pic_mbox->pic, pic_mbox->peer_hwirq, in pic_mbox_send()
107 rt_spin_unlock_irqrestore(&pic_mbox->lock, level); in pic_mbox_send()
122 struct pic_mbox *pic_mbox = param; in pic_mbox_isr() local
124 isr = HWREG32(pic_mbox->regs + MAILBOX_ISTATE); in pic_mbox_isr()
136 msg = HWREG32(pic_mbox->peer_regs + MAILBOX_MSG(idx)); in pic_mbox_isr()
138 rt_mbox_recv(&pic_mbox->parent.chans[idx], &msg); in pic_mbox_isr()
141 HWREG32(pic_mbox->regs + MAILBOX_ISTATE) &= ~isr; in pic_mbox_isr()
144 static void pic_mbox_free_resource(struct pic_mbox *pic_mbox) in pic_mbox_free_resource() argument
146 if (pic_mbox->regs && pic_mbox->peer_regs) in pic_mbox_free_resource()
148 if (pic_mbox->peer_regs > pic_mbox->regs) in pic_mbox_free_resource()
150 rt_iounmap(pic_mbox->regs); in pic_mbox_free_resource()
154 rt_iounmap(pic_mbox->peer_regs); in pic_mbox_free_resource()
158 rt_free(pic_mbox); in pic_mbox_free_resource()
169 struct pic_mbox *pic_mbox = rt_calloc(1, sizeof(*pic_mbox)); in pic_mbox_probe() local
171 if (!pic_mbox) in pic_mbox_probe()
188 pic_mbox->regs = rt_dm_dev_iomap(dev, 0); in pic_mbox_probe()
190 if (!pic_mbox->regs) in pic_mbox_probe()
195 pic_mbox->peer_regs = pic_mbox->regs + size / 2; in pic_mbox_probe()
198 HWREG32(pic_mbox->regs + MAILBOX_IMASK) = 0xffffffff; in pic_mbox_probe()
199 HWREG32(pic_mbox->regs + MAILBOX_ISTATE) = 0; in pic_mbox_probe()
200 HWREG32(pic_mbox->peer_regs + MAILBOX_IMASK) = 0xffffffff; in pic_mbox_probe()
201 HWREG32(pic_mbox->peer_regs + MAILBOX_ISTATE) = 0; in pic_mbox_probe()
205 pic_mbox->peer_regs = rt_dm_dev_iomap(dev, 0); in pic_mbox_probe()
207 if (!pic_mbox->peer_regs) in pic_mbox_probe()
212 pic_mbox->regs = pic_mbox->peer_regs + size / 2; in pic_mbox_probe()
215 pic_mbox->irq = rt_dm_dev_get_irq(dev, 0); in pic_mbox_probe()
217 if (pic_mbox->irq < 0) in pic_mbox_probe()
219 err = pic_mbox->irq; in pic_mbox_probe()
228 pic_mbox->peer_hwirq = value; in pic_mbox_probe()
239 pic_mbox->pic = rt_ofw_data(pic_np); in pic_mbox_probe()
242 rt_spin_lock_init(&pic_mbox->lock); in pic_mbox_probe()
244 pic_mbox->parent.dev = dev; in pic_mbox_probe()
245 pic_mbox->parent.num_chans = 32; in pic_mbox_probe()
246 pic_mbox->parent.ops = &pic_mbox_ops; in pic_mbox_probe()
248 if ((err = rt_mbox_controller_register(&pic_mbox->parent))) in pic_mbox_probe()
254 rt_hw_interrupt_install(pic_mbox->irq, pic_mbox_isr, pic_mbox, dev_name); in pic_mbox_probe()
255 rt_hw_interrupt_umask(pic_mbox->irq); in pic_mbox_probe()
260 pic_mbox_free_resource(pic_mbox); in pic_mbox_probe()
267 struct pic_mbox *pic_mbox = pdev->parent.user_data; in pic_mbox_remove() local
269 rt_pic_detach_irq(pic_mbox->irq, pic_mbox); in pic_mbox_remove()
271 rt_mbox_controller_unregister(&pic_mbox->parent); in pic_mbox_remove()
273 pic_mbox_free_resource(pic_mbox); in pic_mbox_remove()