Change kzalloc + kcalloc to just kzalloc with a flexible array member. Add __counted_by for extra runtime analysis when requested.
Shuffle some code in probe to provide a clearer picture. Signed-off-by: Rosen Penev <[email protected]> --- .../typec/tcpm/qcom/qcom_pmic_typec_pdphy.c | 27 ++++++++----------- .../typec/tcpm/qcom/qcom_pmic_typec_port.c | 26 ++++++++---------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.c b/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.c index c8b1463e6e8b..4b3915c6894a 100644 --- a/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.c +++ b/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_pdphy.c @@ -95,13 +95,13 @@ struct pmic_typec_pdphy { struct regmap *regmap; u32 base; - unsigned int nr_irqs; - struct pmic_typec_pdphy_irq_data *irq_data; - struct work_struct reset_work; struct work_struct receive_work; struct regulator *vdd_pdphy; spinlock_t lock; /* Register atomicity */ + + unsigned int nr_irqs; + struct pmic_typec_pdphy_irq_data irq_data[] __counted_by(nr_irqs); }; static void qcom_pmic_typec_pdphy_reset_on(struct pmic_typec_pdphy *pmic_typec_pdphy) @@ -560,31 +560,26 @@ int qcom_pmic_typec_pdphy_probe(struct platform_device *pdev, struct pmic_typec_pdphy_irq_data *irq_data; int i, ret, irq; - pmic_typec_pdphy = devm_kzalloc(dev, sizeof(*pmic_typec_pdphy), GFP_KERNEL); - if (!pmic_typec_pdphy) - return -ENOMEM; - if (!res->nr_irqs || res->nr_irqs > PMIC_PDPHY_MAX_IRQS) return -EINVAL; - irq_data = devm_kcalloc(dev, res->nr_irqs, sizeof(*irq_data), - GFP_KERNEL); - if (!irq_data) + pmic_typec_pdphy = devm_kzalloc(dev, struct_size(pmic_typec_pdphy, irq_data, res->nr_irqs), GFP_KERNEL); + if (!pmic_typec_pdphy) return -ENOMEM; + pmic_typec_pdphy->nr_irqs = res->nr_irqs; + pmic_typec_pdphy->dev = dev; + pmic_typec_pdphy->base = base; + pmic_typec_pdphy->regmap = regmap; pmic_typec_pdphy->vdd_pdphy = devm_regulator_get(dev, "vdd-pdphy"); if (IS_ERR(pmic_typec_pdphy->vdd_pdphy)) return PTR_ERR(pmic_typec_pdphy->vdd_pdphy); - pmic_typec_pdphy->dev = dev; - pmic_typec_pdphy->base = base; - pmic_typec_pdphy->regmap = regmap; - pmic_typec_pdphy->nr_irqs = res->nr_irqs; - pmic_typec_pdphy->irq_data = irq_data; spin_lock_init(&pmic_typec_pdphy->lock); INIT_WORK(&pmic_typec_pdphy->reset_work, qcom_pmic_typec_pdphy_sig_reset_work); - for (i = 0; i < res->nr_irqs; i++, irq_data++) { + for (i = 0; i < res->nr_irqs; i++) { + irq_data = &pmic_typec_pdphy->irq_data[i]; irq = platform_get_irq_byname(pdev, res->irq_params[i].irq_name); if (irq < 0) return irq; diff --git a/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.c b/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.c index 8051eaa46991..7c5cf8061f04 100644 --- a/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.c +++ b/drivers/usb/typec/tcpm/qcom/qcom_pmic_typec_port.c @@ -169,8 +169,6 @@ struct pmic_typec_port { struct tcpm_port *tcpm_port; struct regmap *regmap; u32 base; - unsigned int nr_irqs; - struct pmic_typec_port_irq_data *irq_data; struct regulator *vdd_vbus; bool vbus_enabled; @@ -181,6 +179,9 @@ struct pmic_typec_port { struct delayed_work cc_debounce_dwork; spinlock_t lock; /* Register atomicity */ + + unsigned int nr_irqs; + struct pmic_typec_port_irq_data irq_data[] __counted_by(nr_irqs); }; static const char * const typec_cc_status_name[] = { @@ -706,29 +707,23 @@ int qcom_pmic_typec_port_probe(struct platform_device *pdev, struct pmic_typec_port *pmic_typec_port; int i, ret, irq; - pmic_typec_port = devm_kzalloc(dev, sizeof(*pmic_typec_port), GFP_KERNEL); - if (!pmic_typec_port) - return -ENOMEM; - if (!res->nr_irqs || res->nr_irqs > PMIC_TYPEC_MAX_IRQS) return -EINVAL; - irq_data = devm_kcalloc(dev, res->nr_irqs, sizeof(*irq_data), - GFP_KERNEL); - if (!irq_data) + pmic_typec_port = devm_kzalloc(dev, struct_size(pmic_typec_port, irq_data, res->nr_irqs), GFP_KERNEL); + if (!pmic_typec_port) return -ENOMEM; mutex_init(&pmic_typec_port->vbus_lock); + pmic_typec_port->nr_irqs = res->nr_irqs; + pmic_typec_port->dev = dev; + pmic_typec_port->base = base; + pmic_typec_port->regmap = regmap; pmic_typec_port->vdd_vbus = devm_regulator_get(dev, "vdd-vbus"); if (IS_ERR(pmic_typec_port->vdd_vbus)) return PTR_ERR(pmic_typec_port->vdd_vbus); - pmic_typec_port->dev = dev; - pmic_typec_port->base = base; - pmic_typec_port->regmap = regmap; - pmic_typec_port->nr_irqs = res->nr_irqs; - pmic_typec_port->irq_data = irq_data; spin_lock_init(&pmic_typec_port->lock); INIT_DELAYED_WORK(&pmic_typec_port->cc_debounce_dwork, qcom_pmic_typec_port_cc_debounce); @@ -737,7 +732,8 @@ int qcom_pmic_typec_port_probe(struct platform_device *pdev, if (irq < 0) return irq; - for (i = 0; i < res->nr_irqs; i++, irq_data++) { + for (i = 0; i < res->nr_irqs; i++) { + irq_data = &pmic_typec_port->irq_data[i]; irq = platform_get_irq_byname(pdev, res->irq_params[i].irq_name); if (irq < 0) -- 2.53.0

