| .. | .. |
|---|
| 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) { |
|---|