drivers/phy/mediatek/phy-mtk-xsphy.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
Instead of kzalloc and kcalloc, we can use a flex array to reduce to a
single allocation.
Also added __counted_by() for extra possible analysis.
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/phy/mediatek/phy-mtk-xsphy.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/phy/mediatek/phy-mtk-xsphy.c b/drivers/phy/mediatek/phy-mtk-xsphy.c
index c0ddb9273cc3..cc1d66954212 100644
--- a/drivers/phy/mediatek/phy-mtk-xsphy.c
+++ b/drivers/phy/mediatek/phy-mtk-xsphy.c
@@ -112,10 +112,10 @@ struct xsphy_instance {
struct mtk_xsphy {
struct device *dev;
void __iomem *glb_base; /* only shared u3 sif */
- struct xsphy_instance **phys;
- int nphys;
int src_ref_clk; /* MHZ, reference clock for slew rate calibrate */
int src_coef; /* coefficient for slew rate calibrate */
+ int nphys;
+ struct xsphy_instance *phys[] __counted_by(nphys);
};
static void u2_phy_slew_rate_calibrate(struct mtk_xsphy *xsphy,
@@ -515,18 +515,15 @@ static int mtk_xsphy_probe(struct platform_device *pdev)
struct resource *glb_res;
struct mtk_xsphy *xsphy;
struct resource res;
+ size_t nphys;
int port;
- xsphy = devm_kzalloc(dev, sizeof(*xsphy), GFP_KERNEL);
+ nphys = of_get_child_count(np);
+ xsphy = devm_kzalloc(dev, struct_size(xsphy, phys, nphys), GFP_KERNEL);
if (!xsphy)
return -ENOMEM;
- xsphy->nphys = of_get_child_count(np);
- xsphy->phys = devm_kcalloc(dev, xsphy->nphys,
- sizeof(*xsphy->phys), GFP_KERNEL);
- if (!xsphy->phys)
- return -ENOMEM;
-
+ xsphy->nphys = nphys;
xsphy->dev = dev;
platform_set_drvdata(pdev, xsphy);
--
2.53.0
On 3/4/26 13:34, Rosen Penev wrote:
> Instead of kzalloc and kcalloc, we can use a flex array to reduce to a
> single allocation.
>
> Also added __counted_by() for extra possible analysis.
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Thanks
-Gustavo
> ---
> drivers/phy/mediatek/phy-mtk-xsphy.c | 15 ++++++---------
> 1 file changed, 6 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/phy/mediatek/phy-mtk-xsphy.c b/drivers/phy/mediatek/phy-mtk-xsphy.c
> index c0ddb9273cc3..cc1d66954212 100644
> --- a/drivers/phy/mediatek/phy-mtk-xsphy.c
> +++ b/drivers/phy/mediatek/phy-mtk-xsphy.c
> @@ -112,10 +112,10 @@ struct xsphy_instance {
> struct mtk_xsphy {
> struct device *dev;
> void __iomem *glb_base; /* only shared u3 sif */
> - struct xsphy_instance **phys;
> - int nphys;
> int src_ref_clk; /* MHZ, reference clock for slew rate calibrate */
> int src_coef; /* coefficient for slew rate calibrate */
> + int nphys;
> + struct xsphy_instance *phys[] __counted_by(nphys);
> };
>
> static void u2_phy_slew_rate_calibrate(struct mtk_xsphy *xsphy,
> @@ -515,18 +515,15 @@ static int mtk_xsphy_probe(struct platform_device *pdev)
> struct resource *glb_res;
> struct mtk_xsphy *xsphy;
> struct resource res;
> + size_t nphys;
> int port;
>
> - xsphy = devm_kzalloc(dev, sizeof(*xsphy), GFP_KERNEL);
> + nphys = of_get_child_count(np);
> + xsphy = devm_kzalloc(dev, struct_size(xsphy, phys, nphys), GFP_KERNEL);
> if (!xsphy)
> return -ENOMEM;
>
> - xsphy->nphys = of_get_child_count(np);
> - xsphy->phys = devm_kcalloc(dev, xsphy->nphys,
> - sizeof(*xsphy->phys), GFP_KERNEL);
> - if (!xsphy->phys)
> - return -ENOMEM;
> -
> + xsphy->nphys = nphys;
> xsphy->dev = dev;
> platform_set_drvdata(pdev, xsphy);
>
© 2016 - 2026 Red Hat, Inc.