Re: [PATCH] usb: typec: intel_pmc_mux: combine kzalloc + kcalloc
From: Heikki Krogerus
Date: Mon Apr 27 2026 - 05:46:19 EST
On Fri, Apr 24, 2026 at 06:42:01PM -0700, Rosen Penev wrote:
> 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 <rosenp@xxxxxxxxx>
Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>
> ---
> 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
--
heikki