hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/mailbox/zynqmp-ipi-mailbox.c
....@@ -110,7 +110,7 @@
110110 unsigned int method;
111111 u32 local_id;
112112 int num_mboxes;
113
- struct zynqmp_ipi_mbox *ipi_mboxes;
113
+ struct zynqmp_ipi_mbox ipi_mboxes[];
114114 };
115115
116116 static struct device_driver zynqmp_ipi_mbox_driver = {
....@@ -152,7 +152,7 @@
152152 struct zynqmp_ipi_message *msg;
153153 u64 arg0, arg3;
154154 struct arm_smccc_res res;
155
- int ret, i;
155
+ int ret, i, status = IRQ_NONE;
156156
157157 (void)irq;
158158 arg0 = SMC_IPI_MAILBOX_STATUS_ENQUIRY;
....@@ -170,11 +170,11 @@
170170 memcpy_fromio(msg->data, mchan->req_buf,
171171 msg->len);
172172 mbox_chan_received_data(chan, (void *)msg);
173
- return IRQ_HANDLED;
173
+ status = IRQ_HANDLED;
174174 }
175175 }
176176 }
177
- return IRQ_NONE;
177
+ return status;
178178 }
179179
180180 /**
....@@ -493,6 +493,7 @@
493493 ret = device_register(&ipi_mbox->dev);
494494 if (ret) {
495495 dev_err(dev, "Failed to register ipi mbox dev.\n");
496
+ put_device(&ipi_mbox->dev);
496497 return ret;
497498 }
498499 mdev = &ipi_mbox->dev;
....@@ -619,7 +620,8 @@
619620 ipi_mbox = &pdata->ipi_mboxes[i];
620621 if (ipi_mbox->dev.parent) {
621622 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);
623625 }
624626 }
625627 }
....@@ -632,8 +634,13 @@
632634 struct zynqmp_ipi_mbox *mbox;
633635 int num_mboxes, ret = -EINVAL;
634636
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),
637644 GFP_KERNEL);
638645 if (!pdata)
639646 return -ENOMEM;
....@@ -647,8 +654,6 @@
647654 }
648655
649656 pdata->num_mboxes = num_mboxes;
650
- pdata->ipi_mboxes = (struct zynqmp_ipi_mbox *)
651
- ((char *)pdata + sizeof(*pdata));
652657
653658 mbox = pdata->ipi_mboxes;
654659 for_each_available_child_of_node(np, nc) {