A flexible array member can be used to combine allocations and simplify
handling slightly.

Add __counted_by for extra runtime analysis.

Signed-off-by: Rosen Penev <[email protected]>
---
 drivers/usb/typec/mux/intel_pmc_mux.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/typec/mux/intel_pmc_mux.c 
b/drivers/usb/typec/mux/intel_pmc_mux.c
index 1698428654ab..e22b070a140f 100644
--- a/drivers/usb/typec/mux/intel_pmc_mux.c
+++ b/drivers/usb/typec/mux/intel_pmc_mux.c
@@ -151,13 +151,14 @@ struct pmc_usb {
        u8 num_ports;
        struct device *dev;
        struct intel_scu_ipc_dev *ipc;
-       struct pmc_usb_port *port;
        struct acpi_device *iom_adev;
        void __iomem *iom_base;
        u32 iom_port_status_offset;
        u8 iom_port_status_size;
 
        struct dentry *dentry;
+
+       struct pmc_usb_port port[] __counted_by(num_ports);
 };
 
 static struct dentry *pmc_mux_debugfs_root;
@@ -731,27 +732,25 @@ static int pmc_usb_probe(struct platform_device *pdev)
 {
        struct fwnode_handle *fwnode = NULL;
        struct pmc_usb *pmc;
+       u8 num_ports;
        int i = 0;
        int ret;
 
-       pmc = devm_kzalloc(&pdev->dev, sizeof(*pmc), GFP_KERNEL);
-       if (!pmc)
-               return -ENOMEM;
-
        device_for_each_child_node(&pdev->dev, fwnode)
-               pmc->num_ports++;
+               num_ports++;
 
        /* The IOM microcontroller has a limitation of max 4 ports. */
-       if (pmc->num_ports > 4) {
+       if (num_ports > 4) {
                dev_err(&pdev->dev, "driver limited to 4 ports\n");
                return -ERANGE;
        }
 
-       pmc->port = devm_kcalloc(&pdev->dev, pmc->num_ports,
-                                sizeof(struct pmc_usb_port), GFP_KERNEL);
-       if (!pmc->port)
+       pmc = devm_kzalloc(&pdev->dev, struct_size(pmc, port, num_ports), 
GFP_KERNEL);
+       if (!pmc)
                return -ENOMEM;
 
+       pmc->num_ports = num_ports;
+
        pmc->ipc = devm_intel_scu_ipc_dev_get(&pdev->dev);
        if (!pmc->ipc)
                return -EPROBE_DEFER;
-- 
2.54.0


Reply via email to