On Fri, Feb 02, 2024 at 12:53:34PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding@nvidia.com>
>
> In many cases the AXI configuration can be derived from the compatible
> string, so there's no need to add the configuration to DT. Allow drivers
> to pass in the default AXI configuration so they can be properly set up
> without extra data in DT.
>
> Signed-off-by: Thierry Reding <treding@nvidia.com>
..
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> index 650ec8d2f5d7..0d5f2cebd6fc 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
> @@ -91,34 +91,49 @@ static int dwmac1000_validate_ucast_entries(struct device *dev,
> * if required, from device-tree the AXI internal register can be tuned
> * by using platform parameters.
> */
> -static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
> +static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev,
> + struct stmmac_resources *res)
Hi Thierry,
Please consider adding @res to the kernel doc for stmmac_axi_setup,
just a few lines above this hunk.
..
@@ -35,6 +35,8 @@ struct stmmac_resources {
int sfty_ue_irq;
int rx_irq[MTL_MAX_RX_QUEUES];
int tx_irq[MTL_MAX_TX_QUEUES];
+
+ const struct stmmac_axi *axi;
};
enum stmmac_txbuf_type {
@@ -91,34 +91,49 @@ static int dwmac1000_validate_ucast_entries(struct device *dev,
* if required, from device-tree the AXI internal register can be tuned
* by using platform parameters.
*/
-static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
+static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev,
+ struct stmmac_resources *res)
{
struct device_node *np;
struct stmmac_axi *axi;
np = of_parse_phandle(pdev->dev.of_node, "snps,axi-config", 0);
- if (!np)
+ if (!np && !res->axi)
return NULL;
axi = devm_kzalloc(&pdev->dev, sizeof(*axi), GFP_KERNEL);
if (!axi) {
- of_node_put(np);
+ if (np)
+ of_node_put(np);
+
return ERR_PTR(-ENOMEM);
}
- axi->axi_lpi_en = of_property_read_bool(np, "snps,lpi_en");
- axi->axi_xit_frm = of_property_read_bool(np, "snps,xit_frm");
- axi->axi_kbbe = of_property_read_bool(np, "snps,kbbe");
- axi->axi_fb = of_property_read_bool(np, "snps,fb");
- axi->axi_mb = of_property_read_bool(np, "snps,mb");
- axi->axi_rb = of_property_read_bool(np, "snps,rb");
+ if (res->axi)
+ *axi = *res->axi;
+
+ if (np) {
+ axi->axi_lpi_en = of_property_read_bool(np, "snps,lpi_en");
+ axi->axi_xit_frm = of_property_read_bool(np, "snps,xit_frm");
+ axi->axi_kbbe = of_property_read_bool(np, "snps,kbbe");
+ axi->axi_fb = of_property_read_bool(np, "snps,fb");
+ axi->axi_mb = of_property_read_bool(np, "snps,mb");
+ axi->axi_rb = of_property_read_bool(np, "snps,rb");
+
+ if (of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt)) {
+ if (!res->axi)
+ axi->axi_wr_osr_lmt = 1;
+ }
+
+ if (of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt)) {
+ if (!res->axi)
+ axi->axi_rd_osr_lmt = 1;
+ }
+
+ of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN);
- if (of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt))
- axi->axi_wr_osr_lmt = 1;
- if (of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt))
- axi->axi_rd_osr_lmt = 1;
- of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN);
- of_node_put(np);
+ of_node_put(np);
+ }
return axi;
}
@@ -606,7 +621,7 @@ stmmac_probe_config_dt(struct platform_device *pdev,
of_property_read_u32(np, "snps,ps-speed", &plat->mac_port_sel_speed);
- plat->axi = stmmac_axi_setup(pdev);
+ plat->axi = stmmac_axi_setup(pdev, res);
rc = stmmac_mtl_setup(pdev, plat);
if (rc) {