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


Reply via email to