.. | .. |
---|
110 | 110 | unsigned int method; |
---|
111 | 111 | u32 local_id; |
---|
112 | 112 | int num_mboxes; |
---|
113 | | - struct zynqmp_ipi_mbox *ipi_mboxes; |
---|
| 113 | + struct zynqmp_ipi_mbox ipi_mboxes[]; |
---|
114 | 114 | }; |
---|
115 | 115 | |
---|
116 | 116 | static struct device_driver zynqmp_ipi_mbox_driver = { |
---|
.. | .. |
---|
152 | 152 | struct zynqmp_ipi_message *msg; |
---|
153 | 153 | u64 arg0, arg3; |
---|
154 | 154 | struct arm_smccc_res res; |
---|
155 | | - int ret, i; |
---|
| 155 | + int ret, i, status = IRQ_NONE; |
---|
156 | 156 | |
---|
157 | 157 | (void)irq; |
---|
158 | 158 | arg0 = SMC_IPI_MAILBOX_STATUS_ENQUIRY; |
---|
.. | .. |
---|
170 | 170 | memcpy_fromio(msg->data, mchan->req_buf, |
---|
171 | 171 | msg->len); |
---|
172 | 172 | mbox_chan_received_data(chan, (void *)msg); |
---|
173 | | - return IRQ_HANDLED; |
---|
| 173 | + status = IRQ_HANDLED; |
---|
174 | 174 | } |
---|
175 | 175 | } |
---|
176 | 176 | } |
---|
177 | | - return IRQ_NONE; |
---|
| 177 | + return status; |
---|
178 | 178 | } |
---|
179 | 179 | |
---|
180 | 180 | /** |
---|
.. | .. |
---|
493 | 493 | ret = device_register(&ipi_mbox->dev); |
---|
494 | 494 | if (ret) { |
---|
495 | 495 | dev_err(dev, "Failed to register ipi mbox dev.\n"); |
---|
| 496 | + put_device(&ipi_mbox->dev); |
---|
496 | 497 | return ret; |
---|
497 | 498 | } |
---|
498 | 499 | mdev = &ipi_mbox->dev; |
---|
.. | .. |
---|
619 | 620 | ipi_mbox = &pdata->ipi_mboxes[i]; |
---|
620 | 621 | if (ipi_mbox->dev.parent) { |
---|
621 | 622 | mbox_controller_unregister(&ipi_mbox->mbox); |
---|
622 | | - device_unregister(&ipi_mbox->dev); |
---|
| 623 | + if (device_is_registered(&ipi_mbox->dev)) |
---|
| 624 | + device_unregister(&ipi_mbox->dev); |
---|
623 | 625 | } |
---|
624 | 626 | } |
---|
625 | 627 | } |
---|
.. | .. |
---|
632 | 634 | struct zynqmp_ipi_mbox *mbox; |
---|
633 | 635 | int num_mboxes, ret = -EINVAL; |
---|
634 | 636 | |
---|
635 | | - num_mboxes = of_get_child_count(np); |
---|
636 | | - pdata = devm_kzalloc(dev, sizeof(*pdata) + (num_mboxes * sizeof(*mbox)), |
---|
| 637 | + num_mboxes = of_get_available_child_count(np); |
---|
| 638 | + if (num_mboxes == 0) { |
---|
| 639 | + dev_err(dev, "mailbox nodes not available\n"); |
---|
| 640 | + return -EINVAL; |
---|
| 641 | + } |
---|
| 642 | + |
---|
| 643 | + pdata = devm_kzalloc(dev, struct_size(pdata, ipi_mboxes, num_mboxes), |
---|
637 | 644 | GFP_KERNEL); |
---|
638 | 645 | if (!pdata) |
---|
639 | 646 | return -ENOMEM; |
---|
.. | .. |
---|
647 | 654 | } |
---|
648 | 655 | |
---|
649 | 656 | pdata->num_mboxes = num_mboxes; |
---|
650 | | - pdata->ipi_mboxes = (struct zynqmp_ipi_mbox *) |
---|
651 | | - ((char *)pdata + sizeof(*pdata)); |
---|
652 | 657 | |
---|
653 | 658 | mbox = pdata->ipi_mboxes; |
---|
654 | 659 | for_each_available_child_of_node(np, nc) { |
---|