diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig index d19844be9fe5..88b3ee841c76 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Kconfig +++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig @@ -109,8 +109,7 @@ config DWMAC_MEDIATEK config DWMAC_MESON tristate "Amlogic Meson dwmac support" - default ARCH_MESON - depends on OF && COMMON_CLK && (ARCH_MESON || COMPILE_TEST) + depends on OF && COMMON_CLK help Support for Ethernet controller on Amlogic Meson SoCs. @@ -118,6 +117,17 @@ config DWMAC_MESON the stmmac device driver. This driver is used for Meson6, Meson8, Meson8b and GXBB SoCs. +config AMLOGIC_ETH_PRIVE + tristate "Amlogic private ethernet code" + default n + depends on OF + help + Support for Ethernet controller on Amlogic Meson SoCs. + + This selects the Amlogic Meson SoC glue layer support for + the stmmac device driver. This driver is used for amlogic + private driver. + config DWMAC_OXNAS tristate "Oxford Semiconductor OXNAS dwmac support" default ARCH_OXNAS diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c index e8b507f88fbc..17717d60f778 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -385,6 +385,23 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) return 0; } +#ifdef CONFIG_AMLOGIC_ETH_PRIVE +static int aml_custom_setting(struct platform_device *pdev, struct meson8b_dwmac *dwmac) +{ + struct device_node *np = pdev->dev.of_node; + unsigned int mc_val = 0; + + pr_info("aml_cust_setting\n"); + + if (of_property_read_u32(np, "mc_val", &mc_val) == 0) { + pr_info("cover mc_val as 0x%x\n", mc_val); + writel(mc_val, dwmac->regs + PRG_ETH0); + } + + return 0; +} +#endif + static int meson8b_dwmac_probe(struct platform_device *pdev) { struct plat_stmmacenet_data *plat_dat; @@ -484,7 +501,9 @@ static int meson8b_dwmac_probe(struct platform_device *pdev) ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); if (ret) goto err_remove_config_dt; - +#ifdef CONFIG_AMLOGIC_ETH_PRIVE + aml_custom_setting(pdev, dwmac); +#endif return 0; err_remove_config_dt: diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index e12df9d99089..b964ad0574e7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -384,6 +384,51 @@ static int stmmac_of_get_mac_mode(struct device_node *np) return -ENODEV; } +#ifdef CONFIG_AMLOGIC_ETH_PRIVE +static int setup_aml_clk(struct platform_device *pdev) +{ + struct clk *pipe_clk; + struct clk *gp_clk; + struct clk *gp_clk_mux; + struct clk *fix_clk_50m; + int rtn; + + pipe_clk = devm_clk_get(&pdev->dev, "ethpipe"); + if (IS_ERR(pipe_clk)) { + dev_warn(&pdev->dev, "Cannot get pipe line clock\n"); + pipe_clk = NULL; + } + clk_prepare_enable(pipe_clk); + /*GP_MCLK2*/ + gp_clk_mux = devm_clk_get(&pdev->dev, "gp_mclk2_mux"); + if (IS_ERR(gp_clk_mux)) { + dev_warn(&pdev->dev, "Cannot get gp clock\n"); + gp_clk_mux = NULL; + } + fix_clk_50m = devm_clk_get(&pdev->dev, "fixpll_50m"); + if (IS_ERR(fix_clk_50m)) { + dev_warn(&pdev->dev, "Cannot get gp clock\n"); + fix_clk_50m = NULL; + } + rtn = clk_set_parent(gp_clk_mux, fix_clk_50m); + + gp_clk = devm_clk_get(&pdev->dev, "gp_mclk2"); + if (IS_ERR(gp_clk)) { + dev_warn(&pdev->dev, "Cannot get gp clock\n"); + gp_clk = NULL; + } + rtn = clk_set_rate(gp_clk, 50 * 1000 * 1000); + if (rtn) + pr_info("set gpclk error\n"); + + rtn = clk_prepare_enable(gp_clk); + if (rtn) + pr_info("enable gpclk error\n"); + + return rtn; +} +#endif + /** * stmmac_probe_config_dt - parse device-tree driver parameters * @pdev: platform_device structure @@ -584,7 +629,9 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) } clk_prepare_enable(plat->stmmac_clk); } - +#ifdef CONFIG_AMLOGIC_ETH_PRIVE + setup_aml_clk(pdev); +#endif plat->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); if (IS_ERR(plat->pclk)) { ret = plat->pclk;