* [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver [not found] <20160625165013.15917-1-martin.blumenstingl@googlemail.com> @ 2016-08-15 16:40 ` Martin Blumenstingl 2016-08-15 16:40 ` [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl ` (3 more replies) 0 siblings, 4 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-15 16:40 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, Martin Blumenstingl This adds a DWMAC glue driver for the PRG_ETHERNET registers found in Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver the register layout is completely different. Thus I introduced a separate driver. Changes compared to the RFC version: - switch from syscon / regmap to assigning the corresponding register region directly to the driver (like meson6-dwmac does it) - dropped "fix_mac_speed" callback since the reference driver does not implement it (I could not test if it is required due to lack of hardware) - switch to common clock framework now that we know what bits 5:4 (mux clock), 6:5 (250MHz divider) and 10 (configurable 5 or 10 divider) are used for - Removed dts property "amlogic,mp2-clock" because it is now part of the clocks which are registered by the glue driver - Removed dts properties "amlogic,enable-tx-phy-ref-clk" and "amlogic,tx-delay" because it seems we can guess them based on the phy-mode (the original Amlogic dts files only supply two different values: one value for the internal RMII PHY and another one for the external RGMII Gbit PHY). If required we can extend the code in the future to make these configurable. - This means that the only Meson8b / GXBB specific part of the binding is the clkin0 (FCLK_DIV2) clock, as it's needed for the mux clock. Everything else is auto-detected based on the phy-mode (which is already mandatory in stmmac). I have successfully tested this on a Vega S95 Meta clone which comes with a "broken" bootloader (which programs the ethernet registers to "Fast Ethernet / RGMII" mode, while the board has a Realtek Gbit PHY). Before this series stmmac was detected, I got a network interface but no traffic was flowing. Due to lack of hardware I could not test this on a device which uses the internal RMII (Fast Ethernet) PHY. Martin Blumenstingl (3): net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver .../devicetree/bindings/net/meson-dwmac.txt | 43 ++- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 7 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 327 +++++++++++++++++++++ 4 files changed, 367 insertions(+), 12 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -- 2.9.3 ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-15 16:40 ` [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl @ 2016-08-15 16:40 ` Martin Blumenstingl 2016-08-16 14:25 ` Rob Herring 2016-08-15 16:40 ` [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl ` (2 subsequent siblings) 3 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-15 16:40 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, Martin Blumenstingl This patch adds the documentation for the DWMAC ethernet controller found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. The main difference between the Meson6 glue is that different registers (with different layout) are used. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- .../devicetree/bindings/net/meson-dwmac.txt | 43 ++++++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt index ec633d7..8db6899 100644 --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt @@ -1,18 +1,31 @@ * Amlogic Meson DWMAC Ethernet controller The device inherits all the properties of the dwmac/stmmac devices -described in the file net/stmmac.txt with the following changes. +described in the file stmmac.txt in the current directory with the +following changes. -Required properties: +Required properties on all platforms: -- compatible: should be "amlogic,meson6-dwmac" along with "snps,dwmac" - and any applicable more detailed version number - described in net/stmmac.txt +- compatible: Depending on the platform this should be one of: + - "amlogic,meson6-dwmac" + - "amlogic,meson8b-dwmac" + - "amlogic,meson-gxbb-dwmac" + Additionally "snps,dwmac" and any applicable more + detailed version number described in net/stmmac.txt + should be used. -- reg: should contain a register range for the dwmac controller and - another one for the Amlogic specific configuration +- reg: The first register range should be the one of the DWMAC + controller. The second range is is for the Amlogic specific + configuration (for example the PRG_ETHERNET register range + on Meson8b and newer) -Example: +Required properties on Meson8b and newer: +- clock-names: Should contain the following: + - "stmmaceth" - see stmmac.txt + - "clkin0" - parent clock of internal mux (usually FCLK_DIV2) + + +Example for Meson6: ethmac: ethernet@c9410000 { compatible = "amlogic,meson6-dwmac", "snps,dwmac"; @@ -23,3 +36,17 @@ Example: clocks = <&clk81>; clock-names = "stmmaceth"; } + +Example for GXBB: + ethmac: ethernet@c9410000 { + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; + reg = <0x0 0xc9410000 0x0 0x10000>, + <0x0 0xc8834540 0x0 0x8>; + interrupts = <0 8 1>; + interrupt-names = "macirq"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>; + clock-names = "stmmaceth", "clkin0"; + phy-mode = "rgmii"; + status = "disabled"; + }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-15 16:40 ` [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl @ 2016-08-16 14:25 ` Rob Herring 0 siblings, 0 replies; 52+ messages in thread From: Rob Herring @ 2016-08-16 14:25 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel On Mon, Aug 15, 2016 at 06:40:58PM +0200, Martin Blumenstingl wrote: > This patch adds the documentation for the DWMAC ethernet controller > found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. > The main difference between the Meson6 glue is that different registers > (with different layout) are used. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > --- > .../devicetree/bindings/net/meson-dwmac.txt | 43 ++++++++++++++++++---- > 1 file changed, 35 insertions(+), 8 deletions(-) Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-15 16:40 ` [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 2016-08-15 16:40 ` [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl @ 2016-08-15 16:40 ` Martin Blumenstingl 2016-08-19 21:40 ` Kevin Hilman 2016-08-15 16:41 ` [PATCH 3/3] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl 3 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-15 16:40 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, Martin Blumenstingl The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys DesignWare MAC IP core which is already supported by the stmmac driver. In addition to the standard stmmac driver some Meson8b / GXBB specific registers have to be configured for the PHY clocks. These SoC specific registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the datasheet. These registers are not backwards compatible with those on Meson 6b, which is why a new glue driver is introduced. This worked for many boards because the bootloader programs the PRG_ETHERNET registers correctly. Additionally the meson6-dwmac driver only sets bit 1 of PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used during reset. Currently all configuration values can be determined automatically, based on the configured phy-mode (which is mandatory for the stmmac driver). If required the tx-delay and the mux clock (so it supports the MPLL2 clock as well) can be made configurable in the future. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 327 +++++++++++++++++++++ 2 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 0fb362d..79e5d0c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -9,7 +9,7 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o obj-$(CONFIG_DWMAC_IPQ806X) += dwmac-ipq806x.o obj-$(CONFIG_DWMAC_LPC18XX) += dwmac-lpc18xx.o -obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o +obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c new file mode 100644 index 0000000..0d4e152 --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -0,0 +1,327 @@ +/* + * Amlogic Meson S805/S905 DWMAC glue layer + * + * Copyright (C) 20016 Martin Blumenstingl <martin.blumenstingl@googlemail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/ethtool.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/of_net.h> +#include <linux/mfd/syscon.h> +#include <linux/platform_device.h> +#include <linux/stmmac.h> + +#include "stmmac_platform.h" + +#define PRG_ETH0 0x0 + +#define PRG_ETH0_RGMII_MODE BIT(0) + +/* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */ +#define PRG_ETH0_CLK_M250_SEL_SHIFT 4 +#define PRG_ETH0_CLK_M250_SEL_MASK GENMASK(4, 4) + +#define PRG_ETH0_TXDLY_SHIFT 5 +#define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) +#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) + +/* divider for the result of m250_sel */ +#define PRG_ETH0_CLK_M250_DIV_SHIFT 7 +#define PRG_ETH0_CLK_M250_DIV_WIDTH 3 + +/* divides the result of m25_sel by either 5 (bit unset) or 10 (bit set) */ +#define PRG_ETH0_CLK_M25_DIV_SHIFT 10 +#define PRG_ETH0_CLK_M25_DIV_WIDTH 1 + +#define PRG_ETH0_INVERTED_RMII_CLK BIT(11) +#define PRG_ETH0_TX_AND_PHY_REF_CLK BIT(12) + +#define MUX_CLK_NUM_PARENTS 2 + +struct meson8b_dwmac { + struct platform_device *pdev; + + void __iomem *regs; + + phy_interface_t phy_mode; + + struct clk_mux m250_mux; + struct clk *m250_mux_clk; + struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; + + struct clk_divider m250_div; + struct clk *m250_div_clk; + + struct clk_divider m25_div; + struct clk *m25_div_clk; +}; + +static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, + u32 mask, u32 value) +{ + u32 data; + + data = readl(dwmac->regs + reg); + data &= ~mask; + data |= (value & mask); + + writel(data, dwmac->regs + reg); +} + +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) +{ + struct clk_init_data init; + int i, ret; + struct device *dev = &dwmac->pdev->dev; + char clk_name[32]; + const char *clk_div_parents[1]; + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + unsigned int mux_parent_count = 0; + static struct clk_div_table clk_25m_div_table[] = { + { .val = 0, .div = 5 }, + { .val = 1, .div = 10 }, + { /* sentinel */ }, + }; + + /* get the mux parents from DT */ + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { + char name[16]; + + snprintf(name, sizeof(name), "clkin%d", i); + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); + if (IS_ERR(dwmac->m250_mux_parent[i])) { + /* NOTE: the second clock (MP2) is unused on all known + * boards, thus we're making it optional here. + */ + if (i > 0) + continue; + + ret = PTR_ERR(dwmac->m250_mux_parent[i]); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Missing clock %s\n", name); + dwmac->m250_mux_parent[i] = NULL; + return ret; + } + + mux_parent_names[i] = + __clk_get_name(dwmac->m250_mux_parent[i]); + mux_parent_count++; + } + + /* create the m250_mux */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); + init.name = clk_name; + init.ops = &clk_mux_ops; + init.flags = CLK_IS_BASIC; + init.parent_names = mux_parent_names; + init.num_parents = mux_parent_count; + + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + dwmac->m250_mux.flags = 0; + dwmac->m250_mux.table = NULL; + dwmac->m250_mux.hw.init = &init; + + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_mux_clk))) + return PTR_ERR(dwmac->m250_mux_clk); + + /* create the m250_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + dwmac->m250_div.hw.init = &init; + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) + return PTR_ERR(dwmac->m250_div_clk); + + /* create the m25_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; + dwmac->m25_div.table = clk_25m_div_table; + dwmac->m25_div.hw.init = &init; + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) + return PTR_ERR(dwmac->m25_div_clk); + + return 0; +} + +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) +{ + int ret; + unsigned long clk_rate; + + switch (dwmac->phy_mode) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + /* Generate a 25MHz clock for the PHY */ + clk_rate = 25 * 1000 * 1000; + + /* enable RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + PRG_ETH0_RGMII_MODE); + + /* only relevant for RMII mode -> disable in RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, 0); + + /* TX clock delay - all known boards use a 1/4 cycle delay */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + PRG_ETH0_TXDLY_QUARTER); + break; + + case PHY_INTERFACE_MODE_RMII: + /* Use the rate of the mux clock for the internal RMII PHY */ + clk_rate = clk_get_rate(dwmac->m250_mux_clk); + + /* disable RGMII mode -> enables RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + 0); + + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, + PRG_ETH0_INVERTED_RMII_CLK); + + /* TX clock delay cannot be configured in RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + 0); + + break; + + default: + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + phy_modes(dwmac->phy_mode)); + return -EINVAL; + } + + ret = clk_prepare_enable(dwmac->m25_div_clk); + if (ret) { + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); + return ret; + } + + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); + if (ret) { + clk_disable_unprepare(dwmac->m25_div_clk); + + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); + return ret; + } + + /* enable TX_CLK and PHY_REF_CLK generator */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, + PRG_ETH0_TX_AND_PHY_REF_CLK); + + return 0; +} + +static int meson8b_dwmac_probe(struct platform_device *pdev) +{ + struct plat_stmmacenet_data *plat_dat; + struct stmmac_resources stmmac_res; + struct resource *res; + struct meson8b_dwmac *dwmac; + int ret; + + ret = stmmac_get_platform_resources(pdev, &stmmac_res); + if (ret) + return ret; + + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); + if (IS_ERR(plat_dat)) + return PTR_ERR(plat_dat); + + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); + if (!dwmac) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!res) + return -ENODEV; + + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dwmac->regs)) + return PTR_ERR(dwmac->regs); + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); + if (dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + return -EINVAL; + } + + ret = meson8b_init_clk(dwmac); + if (ret) + return ret; + + ret = meson8b_init_prg_eth(dwmac); + if (ret) + return ret; + + plat_dat->bsp_priv = dwmac; + + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); +} + +static const struct of_device_id meson8b_dwmac_match[] = { + { .compatible = "amlogic,meson8b-dwmac" }, + { .compatible = "amlogic,meson-gxbb-dwmac" }, + { } +}; +MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); + +static struct platform_driver meson8b_dwmac_driver = { + .probe = meson8b_dwmac_probe, + .remove = stmmac_pltfr_remove, + .driver = { + .name = "meson8b-dwmac", + .pm = &stmmac_pltfr_pm_ops, + .of_match_table = meson8b_dwmac_match, + }, +}; +module_platform_driver(meson8b_dwmac_driver); + +MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>"); +MODULE_DESCRIPTION("Amlogic Meson S805/S905 DWMAC glue layer"); +MODULE_LICENSE("GPL v2"); -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-15 16:40 ` [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-08-19 21:40 ` Kevin Hilman 0 siblings, 0 replies; 52+ messages in thread From: Kevin Hilman @ 2016-08-19 21:40 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-amlogic, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel Martin Blumenstingl <martin.blumenstingl@googlemail.com> writes: > The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys > DesignWare MAC IP core which is already supported by the stmmac driver. > > In addition to the standard stmmac driver some Meson8b / GXBB specific > registers have to be configured for the PHY clocks. These SoC specific > registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the > datasheet. > These registers are not backwards compatible with those on Meson 6b, > which is why a new glue driver is introduced. This worked for many > boards because the bootloader programs the PRG_ETHERNET registers > correctly. Additionally the meson6-dwmac driver only sets bit 1 of > PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used > during reset. > > Currently all configuration values can be determined automatically, > based on the configured phy-mode (which is mandatory for the stmmac > driver). If required the tx-delay and the mux clock (so it supports > the MPLL2 clock as well) can be made configurable in the future. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> [...] > +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) > +{ > + struct clk_init_data init; > + int i, ret; > + struct device *dev = &dwmac->pdev->dev; > + char clk_name[32]; > + const char *clk_div_parents[1]; > + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; > + unsigned int mux_parent_count = 0; > + static struct clk_div_table clk_25m_div_table[] = { > + { .val = 0, .div = 5 }, > + { .val = 1, .div = 10 }, > + { /* sentinel */ }, > + }; > + > + /* get the mux parents from DT */ > + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { > + char name[16]; > + > + snprintf(name, sizeof(name), "clkin%d", i); > + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); > + if (IS_ERR(dwmac->m250_mux_parent[i])) { > + /* NOTE: the second clock (MP2) is unused on all known nit: multi-line comment style (c.f. Documentation/CodingStyle search for "multi-line") > + * boards, thus we're making it optional here. > + */ > + if (i > 0) > + continue; IMO, this is a bit confusing. I think this should either be coded to deal with an optional "clkin1" (preferred), or it should be coded to without a mux and clkin0 is directly the parent of the divider. The current way of always bailing out of this loop early is a bit confusing. > + ret = PTR_ERR(dwmac->m250_mux_parent[i]); > + if (ret != -EPROBE_DEFER) > + dev_err(dev, "Missing clock %s\n", name); > + dwmac->m250_mux_parent[i] = NULL; > + return ret; > + } > + > + mux_parent_names[i] = > + __clk_get_name(dwmac->m250_mux_parent[i]); > + mux_parent_count++; > + } > + > + /* create the m250_mux */ > + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); > + init.name = clk_name; > + init.ops = &clk_mux_ops; > + init.flags = CLK_IS_BASIC; > + init.parent_names = mux_parent_names; > + init.num_parents = mux_parent_count; > + > + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; > + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; > + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; > + dwmac->m250_mux.flags = 0; > + dwmac->m250_mux.table = NULL; > + dwmac->m250_mux.hw.init = &init; > + > + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_mux_clk))) > + return PTR_ERR(dwmac->m250_mux_clk); > + > + /* create the m250_div */ > + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); > + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > + init.ops = &clk_divider_ops; > + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; hmm, with CLK_SET_RATE_PARENT that implies that it might switch the mux, but it's hard-coded above so the mux only ever has one parent, so that can never happen. > + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); > + init.parent_names = clk_div_parents; > + init.num_parents = ARRAY_SIZE(clk_div_parents); > + > + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; > + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; > + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; > + dwmac->m250_div.hw.init = &init; > + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; > + > + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) > + return PTR_ERR(dwmac->m250_div_clk); > + > + /* create the m25_div */ > + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); > + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > + init.ops = &clk_divider_ops; > + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; > + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); > + init.parent_names = clk_div_parents; > + init.num_parents = ARRAY_SIZE(clk_div_parents); > + > + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; > + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; > + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; > + dwmac->m25_div.table = clk_25m_div_table; > + dwmac->m25_div.hw.init = &init; > + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; > + > + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) > + return PTR_ERR(dwmac->m25_div_clk); > + > + return 0; > +} > + > +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) > +{ > + int ret; > + unsigned long clk_rate; > + > + switch (dwmac->phy_mode) { > + case PHY_INTERFACE_MODE_RGMII: > + case PHY_INTERFACE_MODE_RGMII_ID: > + case PHY_INTERFACE_MODE_RGMII_RXID: > + case PHY_INTERFACE_MODE_RGMII_TXID: > + /* Generate a 25MHz clock for the PHY */ > + clk_rate = 25 * 1000 * 1000; > + > + /* enable RGMII mode */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, > + PRG_ETH0_RGMII_MODE); > + > + /* only relevant for RMII mode -> disable in RGMII mode */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, > + PRG_ETH0_INVERTED_RMII_CLK, 0); > + > + /* TX clock delay - all known boards use a 1/4 cycle delay */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, > + PRG_ETH0_TXDLY_QUARTER); > + break; > + > + case PHY_INTERFACE_MODE_RMII: > + /* Use the rate of the mux clock for the internal RMII PHY */ > + clk_rate = clk_get_rate(dwmac->m250_mux_clk); > + > + /* disable RGMII mode -> enables RMII mode */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, > + 0); > + > + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, > + PRG_ETH0_INVERTED_RMII_CLK, > + PRG_ETH0_INVERTED_RMII_CLK); > + > + /* TX clock delay cannot be configured in RMII mode */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, > + 0); > + > + break; > + > + default: > + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", > + phy_modes(dwmac->phy_mode)); > + return -EINVAL; > + } > + > + ret = clk_prepare_enable(dwmac->m25_div_clk); > + if (ret) { > + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); > + return ret; > + } > + > + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); > + if (ret) { > + clk_disable_unprepare(dwmac->m25_div_clk); > + > + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); > + return ret; > + } In the case of success, the clock is never disabled/unprepared. You probably need a .remove function which disables the clock and then calls stmmac_pltfr_remove. > + /* enable TX_CLK and PHY_REF_CLK generator */ > + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, > + PRG_ETH0_TX_AND_PHY_REF_CLK); > + > + return 0; > +} [...] Otherwise, this is looking good. Also, I tested on meson-gxbb-odroidc2 and meson-gxbb-p200 by booting a debian root filesystem over NFS and all was well. Tested-by: Kevin Hilman <khilman@baylibre.com> Kevin ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 3/3] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver 2016-08-15 16:40 ` [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 2016-08-15 16:40 ` [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-08-15 16:40 ` [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-08-15 16:41 ` Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl 3 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-15 16:41 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, Martin Blumenstingl The Amlogic reference driver uses the "mc_val" devicetree property to configure the PRG_ETHERNET_ADDR0 register. Unfortunately it uses magic values for this configuration. According to the datasheet the PRG_ETHERNET_ADDR0 register is at address 0xc8834108. However, the reference driver uses 0xc8834540 instead. According to my tests, the value from the reference driver is correct. No changes are required to the board dts files because the only required configuration option is the phy-mode, which had to be configured correctly before as well. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 2c200f9..f8cf16e 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -367,13 +367,14 @@ }; ethmac: ethernet@c9410000 { - compatible = "amlogic,meson6-dwmac", "snps,dwmac"; + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; reg = <0x0 0xc9410000 0x0 0x10000 0x0 0xc8834540 0x0 0x4>; interrupts = <0 8 1>; interrupt-names = "macirq"; - clocks = <&clkc CLKID_ETH>; - clock-names = "stmmaceth"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>; + clock-names = "stmmaceth", "clkin0"; phy-mode = "rgmii"; status = "disabled"; }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 0/4] meson: Meson8b and GXBB DWMAC glue driver 2016-08-15 16:40 ` [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl ` (2 preceding siblings ...) 2016-08-15 16:41 ` [PATCH 3/3] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl @ 2016-08-20 9:35 ` Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl ` (4 more replies) 3 siblings, 5 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-20 9:35 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, Martin Blumenstingl This adds a DWMAC glue driver for the PRG_ETHERNET registers found in Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver the register layout is completely different. Thus I introduced a separate driver. Changes since v1: - make clkin1 mandatory because the internal mux expects two clocks (in other words: this makes the driver consistent with how the hardware actually works) - expose the MPLL2 clock for use by DT so we can pass it to the ethmac - added a .remove function to the glue driver which disables and unprepares the clocks on driver removal Martin Blumenstingl (4): net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings clk: gxbb: expose MPLL2 clock for use by DT net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver .../devicetree/bindings/net/meson-dwmac.txt | 45 ++- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +- drivers/clk/meson/gxbb.h | 2 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 329 +++++++++++++++++++++ include/dt-bindings/clock/gxbb-clkc.h | 1 + 6 files changed, 374 insertions(+), 13 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -- 2.9.3 ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl @ 2016-08-20 9:35 ` Martin Blumenstingl [not found] ` <20160820093538.9707-2-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-20 9:35 ` [PATCH v2 2/4] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl ` (3 subsequent siblings) 4 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-20 9:35 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, Martin Blumenstingl This patch adds the documentation for the DWMAC ethernet controller found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. The main difference between the Meson6 glue is that different registers (with different layout) are used. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: Rob Herring <robh@kernel.org> --- .../devicetree/bindings/net/meson-dwmac.txt | 45 ++++++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt index ec633d7..89e62dd 100644 --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt @@ -1,18 +1,32 @@ * Amlogic Meson DWMAC Ethernet controller The device inherits all the properties of the dwmac/stmmac devices -described in the file net/stmmac.txt with the following changes. +described in the file stmmac.txt in the current directory with the +following changes. -Required properties: +Required properties on all platforms: -- compatible: should be "amlogic,meson6-dwmac" along with "snps,dwmac" - and any applicable more detailed version number - described in net/stmmac.txt +- compatible: Depending on the platform this should be one of: + - "amlogic,meson6-dwmac" + - "amlogic,meson8b-dwmac" + - "amlogic,meson-gxbb-dwmac" + Additionally "snps,dwmac" and any applicable more + detailed version number described in net/stmmac.txt + should be used. -- reg: should contain a register range for the dwmac controller and - another one for the Amlogic specific configuration +- reg: The first register range should be the one of the DWMAC + controller. The second range is is for the Amlogic specific + configuration (for example the PRG_ETHERNET register range + on Meson8b and newer) -Example: +Required properties on Meson8b and newer: +- clock-names: Should contain the following: + - "stmmaceth" - see stmmac.txt + - "clkin0" - first parent clock of the internal mux + - "clkin1" - second parent clock of the internal mux + + +Example for Meson6: ethmac: ethernet@c9410000 { compatible = "amlogic,meson6-dwmac", "snps,dwmac"; @@ -23,3 +37,18 @@ Example: clocks = <&clk81>; clock-names = "stmmaceth"; } + +Example for GXBB: + ethmac: ethernet@c9410000 { + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; + reg = <0x0 0xc9410000 0x0 0x10000>, + <0x0 0xc8834540 0x0 0x8>; + interrupts = <0 8 1>; + interrupt-names = "macirq"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; + phy-mode = "rgmii"; + status = "disabled"; + }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
[parent not found: <20160820093538.9707-2-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings [not found] ` <20160820093538.9707-2-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-08-22 11:55 ` Arnd Bergmann 2016-08-22 12:04 ` Martin Blumenstingl 0 siblings, 1 reply; 52+ messages in thread From: Arnd Bergmann @ 2016-08-22 11:55 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Martin Blumenstingl, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, mark.rutland-5wv7dgnIgG8, devicetree-u79uwXL29TY76Z2rM5mHXA, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, netdev-u79uwXL29TY76Z2rM5mHXA, sboyd-sgV2jX0FEOL9JmXXK+q4OQ On Saturday, August 20, 2016 11:35:35 AM CEST Martin Blumenstingl wrote: > +- reg: The first register range should be the one of the DWMAC > + controller. The second range is is for the Amlogic specific > + configuration (for example the PRG_ETHERNET register range > + on Meson8b and newer) > ... > +Example for GXBB: > + ethmac: ethernet@c9410000 { > + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; > + reg = <0x0 0xc9410000 0x0 0x10000>, > + <0x0 0xc8834540 0x0 0x8>; > The address "0xc8834540" suggests that this is part of a larger register range that is used for various things, i.e. a "syscon" type of device. How about making this a syscon reference rather than a "reg" address? Arnd -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-22 11:55 ` Arnd Bergmann @ 2016-08-22 12:04 ` Martin Blumenstingl 2016-08-22 15:25 ` Arnd Bergmann 0 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-22 12:04 UTC (permalink / raw) To: Arnd Bergmann Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, mark.rutland-5wv7dgnIgG8, devicetree-u79uwXL29TY76Z2rM5mHXA, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, netdev-u79uwXL29TY76Z2rM5mHXA, sboyd-sgV2jX0FEOL9JmXXK+q4OQ On Mon, Aug 22, 2016 at 1:55 PM, Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> wrote: > On Saturday, August 20, 2016 11:35:35 AM CEST Martin Blumenstingl wrote: >> +- reg: The first register range should be the one of the DWMAC >> + controller. The second range is is for the Amlogic specific >> + configuration (for example the PRG_ETHERNET register range >> + on Meson8b and newer) >> > ... > >> +Example for GXBB: >> + ethmac: ethernet@c9410000 { >> + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; >> + reg = <0x0 0xc9410000 0x0 0x10000>, >> + <0x0 0xc8834540 0x0 0x8>; >> > > The address "0xc8834540" suggests that this is part of a larger register > range that is used for various things, i.e. a "syscon" type of device. You are right, these are part of the cbus range (which is already defined in meson-gxbb.dtsi) > How about making this a syscon reference rather than a "reg" address? The first version of my patch ([0]) used syscon_regmap_lookup_by_phandle. Maybe I did it wrong (and I should have passed the cbus syscon-node instead of defining a new one just for the 2x32bit PRG_ETHERNET registers). I am perfectly fine with either way - however it seems that some other dwmac glue implementations are also using a second set of resources (that doesn't automatically make it "correct" though). Martin -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-22 12:04 ` Martin Blumenstingl @ 2016-08-22 15:25 ` Arnd Bergmann 2016-08-28 16:15 ` Martin Blumenstingl 0 siblings, 1 reply; 52+ messages in thread From: Arnd Bergmann @ 2016-08-22 15:25 UTC (permalink / raw) To: linux-arm-kernel Cc: Martin Blumenstingl, mark.rutland, devicetree, sboyd, catalin.marinas, alexandre.torgue, khilman, mturquette, will.deacon, robh+dt, peppe.cavallaro, carlo, linux-amlogic, netdev On Monday, August 22, 2016 2:04:49 PM CEST Martin Blumenstingl wrote: > On Mon, Aug 22, 2016 at 1:55 PM, Arnd Bergmann <arnd@arndb.de> wrote: > > On Saturday, August 20, 2016 11:35:35 AM CEST Martin Blumenstingl wrote: > >> +- reg: The first register range should be the one of the DWMAC > >> + controller. The second range is is for the Amlogic specific > >> + configuration (for example the PRG_ETHERNET register range > >> + on Meson8b and newer) > >> > > ... > > > >> +Example for GXBB: > >> + ethmac: ethernet@c9410000 { > >> + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; > >> + reg = <0x0 0xc9410000 0x0 0x10000>, > >> + <0x0 0xc8834540 0x0 0x8>; > >> > > > > The address "0xc8834540" suggests that this is part of a larger register > > range that is used for various things, i.e. a "syscon" type of device. > You are right, these are part of the cbus range (which is already > defined in meson-gxbb.dtsi) > > > How about making this a syscon reference rather than a "reg" address? > The first version of my patch ([0]) used > syscon_regmap_lookup_by_phandle. Maybe I did it wrong (and I should > have passed the cbus syscon-node instead of defining a new one just > for the 2x32bit PRG_ETHERNET registers). > I am perfectly fine with either way - however it seems that some other > dwmac glue implementations are also using a second set of resources > (that doesn't automatically make it "correct" though). It really depends on the kind of SoC. Some may have a suboptimal binding, on some others there may be a distinct register area that just contains a few additional registers for the dwmac. Arnd ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-22 15:25 ` Arnd Bergmann @ 2016-08-28 16:15 ` Martin Blumenstingl 2016-08-29 13:31 ` Arnd Bergmann 0 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:15 UTC (permalink / raw) To: Arnd Bergmann Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, mark.rutland-5wv7dgnIgG8, devicetree-u79uwXL29TY76Z2rM5mHXA, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, catalin.marinas-5wv7dgnIgG8, alexandre.torgue-qxv4g6HH51o, khilman-rdvid1DuHRBWk0Htik3J/w, mturquette-rdvid1DuHRBWk0Htik3J/w, will.deacon-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, peppe.cavallaro-qxv4g6HH51o, carlo-KA+7E9HrN00dnm+yROfE0A, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, netdev-u79uwXL29TY76Z2rM5mHXA On Mon, Aug 22, 2016 at 5:25 PM, Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> wrote: > It really depends on the kind of SoC. Some may have a suboptimal > binding, on some others there may be a distinct register area that > just contains a few additional registers for the dwmac. the dwmac PHY configuration registers (2x32bit) on the GXBB SoC are part of the "periphs" region/module. This is already defined as "simple-bus" in meson-gxbb.dtsi, see [0] On Meson8b this is slightly different: there is no specific "periphs" region - there the dwmac PHY configuration registers are directly located in the cbus region at a slightly different offset than on the GXBB SoCs. In the future we might need a third memory region because the latest reference kernel contains some more PHY configuration registers on newer SoCs (GXL = S905X). Please let me know if you're OK with the dts definition in it's current state - or let me know how you would like to change it. PS: I will re-send the patches in a v3 in a few minutes because that fixes a bug during module unload. Regards, Martin [0] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi#n217 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-08-28 16:15 ` Martin Blumenstingl @ 2016-08-29 13:31 ` Arnd Bergmann 0 siblings, 0 replies; 52+ messages in thread From: Arnd Bergmann @ 2016-08-29 13:31 UTC (permalink / raw) To: Martin Blumenstingl Cc: mark.rutland, devicetree, alexandre.torgue, catalin.marinas, mturquette, sboyd, will.deacon, robh+dt, khilman, carlo, peppe.cavallaro, linux-amlogic, netdev, linux-arm-kernel On Sunday 28 August 2016, Martin Blumenstingl wrote: > On Mon, Aug 22, 2016 at 5:25 PM, Arnd Bergmann <arnd@arndb.de> wrote: > > It really depends on the kind of SoC. Some may have a suboptimal > > binding, on some others there may be a distinct register area that > > just contains a few additional registers for the dwmac. > the dwmac PHY configuration registers (2x32bit) on the GXBB SoC are > part of the "periphs" region/module. This is already defined as > "simple-bus" in meson-gxbb.dtsi, see [0] > On Meson8b this is slightly different: there is no specific "periphs" > region - there the dwmac PHY configuration registers are directly > located in the cbus region at a slightly different offset than on the > GXBB SoCs. > > In the future we might need a third memory region because the latest > reference kernel contains some more PHY configuration registers on > newer SoCs (GXL = S905X). > > Please let me know if you're OK with the dts definition in it's > current state - or let me know how you would like to change it. > > PS: I will re-send the patches in a v3 in a few minutes because that > fixes a bug during module unload. I don't really see a good way to describe this hardware then. If it was only the first case, I'd suggest marking the periphs bus node as "compatible="simple-bus","syscon";" so you could have a reference to it, but that doesn't seem to work well in the second case, unless you can a separate DT node just for the PHY config registers there. With the third case, is there any logic at all behind the register map? Maybe someone else has a better idea for how to describe this. In general, we try to avoid overlapping "reg" properties, but I even see that the "periphs" node on gxbb has a "reg" property (is this intentional) that overlaps with the registers in its ranges, so adding another one won't make this worse than it already is. Arnd ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v2 2/4] clk: gxbb: expose MPLL2 clock for use by DT 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl @ 2016-08-20 9:35 ` Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl ` (2 subsequent siblings) 4 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-20 9:35 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, Martin Blumenstingl This exposes the MPLL2 clock as this is one of the input clocks of the ethernet controller's internal mux. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/gxbb.h | 2 +- include/dt-bindings/clock/gxbb-clkc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h index 217df51..3606e875 100644 --- a/drivers/clk/meson/gxbb.h +++ b/drivers/clk/meson/gxbb.h @@ -183,7 +183,7 @@ /* CLKID_CLK81 */ #define CLKID_MPLL0 13 #define CLKID_MPLL1 14 -#define CLKID_MPLL2 15 +/* CLKID_MPLL2 */ #define CLKID_DDR 16 #define CLKID_DOS 17 #define CLKID_ISA 18 diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h index 7d41864..244ea6e 100644 --- a/include/dt-bindings/clock/gxbb-clkc.h +++ b/include/dt-bindings/clock/gxbb-clkc.h @@ -8,6 +8,7 @@ #define CLKID_CPUCLK 1 #define CLKID_FCLK_DIV2 4 #define CLKID_CLK81 12 +#define CLKID_MPLL2 15 #define CLKID_ETH 36 #define CLKID_SD_EMMC_A 94 #define CLKID_SD_EMMC_B 95 -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 2/4] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl @ 2016-08-20 9:35 ` Martin Blumenstingl 2016-08-20 21:29 ` Joachim Eastwood [not found] ` <20160820093538.9707-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl 4 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-20 9:35 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, Martin Blumenstingl The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys DesignWare MAC IP core which is already supported by the stmmac driver. In addition to the standard stmmac driver some Meson8b / GXBB specific registers have to be configured for the PHY clocks. These SoC specific registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the datasheet. These registers are not backwards compatible with those on Meson 6b, which is why a new glue driver is introduced. This worked for many boards because the bootloader programs the PRG_ETHERNET registers correctly. Additionally the meson6-dwmac driver only sets bit 1 of PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used during reset. Currently all configuration values can be determined automatically, based on the configured phy-mode (which is mandatory for the stmmac driver). If required the tx-delay and the mux clock (so it supports the MPLL2 clock as well) can be made configurable in the future. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Tested-by: Kevin Hilman <khilman@baylibre.com> --- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 329 +++++++++++++++++++++ 2 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 44b630c..f77edb9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -9,7 +9,7 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o obj-$(CONFIG_DWMAC_IPQ806X) += dwmac-ipq806x.o obj-$(CONFIG_DWMAC_LPC18XX) += dwmac-lpc18xx.o -obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o +obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c new file mode 100644 index 0000000..d080512 --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -0,0 +1,329 @@ +/* + * Amlogic Meson S805/S905 DWMAC glue layer + * + * Copyright (C) 20016 Martin Blumenstingl <martin.blumenstingl@googlemail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/ethtool.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/of_net.h> +#include <linux/mfd/syscon.h> +#include <linux/platform_device.h> +#include <linux/stmmac.h> + +#include "stmmac_platform.h" + +#define PRG_ETH0 0x0 + +#define PRG_ETH0_RGMII_MODE BIT(0) + +/* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */ +#define PRG_ETH0_CLK_M250_SEL_SHIFT 4 +#define PRG_ETH0_CLK_M250_SEL_MASK GENMASK(4, 4) + +#define PRG_ETH0_TXDLY_SHIFT 5 +#define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) +#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) + +/* divider for the result of m250_sel */ +#define PRG_ETH0_CLK_M250_DIV_SHIFT 7 +#define PRG_ETH0_CLK_M250_DIV_WIDTH 3 + +/* divides the result of m25_sel by either 5 (bit unset) or 10 (bit set) */ +#define PRG_ETH0_CLK_M25_DIV_SHIFT 10 +#define PRG_ETH0_CLK_M25_DIV_WIDTH 1 + +#define PRG_ETH0_INVERTED_RMII_CLK BIT(11) +#define PRG_ETH0_TX_AND_PHY_REF_CLK BIT(12) + +#define MUX_CLK_NUM_PARENTS 2 + +struct meson8b_dwmac { + struct platform_device *pdev; + + void __iomem *regs; + + phy_interface_t phy_mode; + + struct clk_mux m250_mux; + struct clk *m250_mux_clk; + struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; + + struct clk_divider m250_div; + struct clk *m250_div_clk; + + struct clk_divider m25_div; + struct clk *m25_div_clk; +}; + +static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, + u32 mask, u32 value) +{ + u32 data; + + data = readl(dwmac->regs + reg); + data &= ~mask; + data |= (value & mask); + + writel(data, dwmac->regs + reg); +} + +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) +{ + struct clk_init_data init; + int i, ret; + struct device *dev = &dwmac->pdev->dev; + char clk_name[32]; + const char *clk_div_parents[1]; + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + static struct clk_div_table clk_25m_div_table[] = { + { .val = 0, .div = 5 }, + { .val = 1, .div = 10 }, + { /* sentinel */ }, + }; + + /* get the mux parents from DT */ + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { + char name[16]; + + snprintf(name, sizeof(name), "clkin%d", i); + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); + if (IS_ERR(dwmac->m250_mux_parent[i])) { + ret = PTR_ERR(dwmac->m250_mux_parent[i]); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Missing clock %s\n", name); + return ret; + } + + mux_parent_names[i] = + __clk_get_name(dwmac->m250_mux_parent[i]); + } + + /* create the m250_mux */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); + init.name = clk_name; + init.ops = &clk_mux_ops; + init.flags = CLK_IS_BASIC; + init.parent_names = mux_parent_names; + init.num_parents = MUX_CLK_NUM_PARENTS; + + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + dwmac->m250_mux.flags = 0; + dwmac->m250_mux.table = NULL; + dwmac->m250_mux.hw.init = &init; + + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_mux_clk))) + return PTR_ERR(dwmac->m250_mux_clk); + + /* create the m250_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + dwmac->m250_div.hw.init = &init; + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) + return PTR_ERR(dwmac->m250_div_clk); + + /* create the m25_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; + dwmac->m25_div.table = clk_25m_div_table; + dwmac->m25_div.hw.init = &init; + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) + return PTR_ERR(dwmac->m25_div_clk); + + return 0; +} + +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) +{ + int ret; + unsigned long clk_rate; + + switch (dwmac->phy_mode) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + /* Generate a 25MHz clock for the PHY */ + clk_rate = 25 * 1000 * 1000; + + /* enable RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + PRG_ETH0_RGMII_MODE); + + /* only relevant for RMII mode -> disable in RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, 0); + + /* TX clock delay - all known boards use a 1/4 cycle delay */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + PRG_ETH0_TXDLY_QUARTER); + break; + + case PHY_INTERFACE_MODE_RMII: + /* Use the rate of the mux clock for the internal RMII PHY */ + clk_rate = clk_get_rate(dwmac->m250_mux_clk); + + /* disable RGMII mode -> enables RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + 0); + + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, + PRG_ETH0_INVERTED_RMII_CLK); + + /* TX clock delay cannot be configured in RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + 0); + + break; + + default: + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + phy_modes(dwmac->phy_mode)); + return -EINVAL; + } + + ret = clk_prepare_enable(dwmac->m25_div_clk); + if (ret) { + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); + return ret; + } + + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); + if (ret) { + clk_disable_unprepare(dwmac->m25_div_clk); + + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); + return ret; + } + + /* enable TX_CLK and PHY_REF_CLK generator */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, + PRG_ETH0_TX_AND_PHY_REF_CLK); + + return 0; +} + +static int meson8b_dwmac_probe(struct platform_device *pdev) +{ + struct plat_stmmacenet_data *plat_dat; + struct stmmac_resources stmmac_res; + struct resource *res; + struct meson8b_dwmac *dwmac; + int ret; + + ret = stmmac_get_platform_resources(pdev, &stmmac_res); + if (ret) + return ret; + + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); + if (IS_ERR(plat_dat)) + return PTR_ERR(plat_dat); + + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); + if (!dwmac) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!res) + return -ENODEV; + + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dwmac->regs)) + return PTR_ERR(dwmac->regs); + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); + if (dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + return -EINVAL; + } + + ret = meson8b_init_clk(dwmac); + if (ret) + return ret; + + ret = meson8b_init_prg_eth(dwmac); + if (ret) + return ret; + + plat_dat->bsp_priv = dwmac; + + platform_set_drvdata(pdev, dwmac); + + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); +} + +static int meson8b_dwmac_remove(struct platform_device *pdev) +{ + struct meson8b_dwmac *dwmac = platform_get_drvdata(pdev); + + clk_disable_unprepare(dwmac->m25_div_clk); + + return stmmac_pltfr_remove(pdev); +} + +static const struct of_device_id meson8b_dwmac_match[] = { + { .compatible = "amlogic,meson8b-dwmac" }, + { .compatible = "amlogic,meson-gxbb-dwmac" }, + { } +}; +MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); + +static struct platform_driver meson8b_dwmac_driver = { + .probe = meson8b_dwmac_probe, + .remove = meson8b_dwmac_remove, + .driver = { + .name = "meson8b-dwmac", + .pm = &stmmac_pltfr_pm_ops, + .of_match_table = meson8b_dwmac_match, + }, +}; +module_platform_driver(meson8b_dwmac_driver); + +MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>"); +MODULE_DESCRIPTION("Amlogic Meson S805/S905 DWMAC glue layer"); +MODULE_LICENSE("GPL v2"); -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-20 9:35 ` [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-08-20 21:29 ` Joachim Eastwood [not found] ` <CAGhQ9VyWs=sYg7PVrt5r-fM-2t--qAnHyvNXAZXwjkYn5P196g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 52+ messages in thread From: Joachim Eastwood @ 2016-08-20 21:29 UTC (permalink / raw) To: Martin Blumenstingl Cc: Mark Rutland, devicetree, Stephen Boyd, Catalin Marinas, alexandre.torgue, khilman, Michael Turquette, Will Deacon, Rob Herring, peppe.cavallaro, carlo, linux-amlogic, netdev, linux-arm-kernel@lists.infradead.org Hi Martin, On 20 August 2016 at 11:35, Martin Blumenstingl <martin.blumenstingl@googlemail.com> wrote: > The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys > DesignWare MAC IP core which is already supported by the stmmac driver. > > In addition to the standard stmmac driver some Meson8b / GXBB specific > registers have to be configured for the PHY clocks. These SoC specific > registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the > datasheet. > These registers are not backwards compatible with those on Meson 6b, > which is why a new glue driver is introduced. This worked for many > boards because the bootloader programs the PRG_ETHERNET registers > correctly. Additionally the meson6-dwmac driver only sets bit 1 of > PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used > during reset. > > Currently all configuration values can be determined automatically, > based on the configured phy-mode (which is mandatory for the stmmac > driver). If required the tx-delay and the mux clock (so it supports > the MPLL2 clock as well) can be made configurable in the future. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > Tested-by: Kevin Hilman <khilman@baylibre.com> > --- > drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- > .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 329 +++++++++++++++++++++ > 2 files changed, 330 insertions(+), 1 deletion(-) > create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c <snip> > +static int meson8b_dwmac_probe(struct platform_device *pdev) > +{ > + struct plat_stmmacenet_data *plat_dat; > + struct stmmac_resources stmmac_res; > + struct resource *res; > + struct meson8b_dwmac *dwmac; > + int ret; > + > + ret = stmmac_get_platform_resources(pdev, &stmmac_res); > + if (ret) > + return ret; > + > + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); > + if (IS_ERR(plat_dat)) > + return PTR_ERR(plat_dat); > + > + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); > + if (!dwmac) > + return -ENOMEM; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > + if (!res) > + return -ENODEV; > + > + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(dwmac->regs)) > + return PTR_ERR(dwmac->regs); > + > + dwmac->pdev = pdev; > + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); > + if (dwmac->phy_mode < 0) { > + dev_err(&pdev->dev, "missing phy-mode property\n"); > + return -EINVAL; > + } > + > + ret = meson8b_init_clk(dwmac); > + if (ret) > + return ret; > + > + ret = meson8b_init_prg_eth(dwmac); > + if (ret) > + return ret; > + > + plat_dat->bsp_priv = dwmac; > + > + platform_set_drvdata(pdev, dwmac); This will not work. The main stmmac driver already uses the driver_data field. See: http://lxr.free-electrons.com/source/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c#L3218 > + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); So calling stmmac_dvr_probe here will overwrite the driver_data field. > +} > + > +static int meson8b_dwmac_remove(struct platform_device *pdev) > +{ > + struct meson8b_dwmac *dwmac = platform_get_drvdata(pdev); > + > + clk_disable_unprepare(dwmac->m25_div_clk); Did you test this code? I am pretty sure it will blow up given that driver_data is not set to what you expect. To get your meson8b_dwmac struct you must retrieve it from plat_dat->bsp_priv. I have some code for a helper to retrieve bsp_priv that I have meant to sent to the ML for a while now. See: https://github.com/manabian/linux-lpc/commit/c3e155a6e38b9634e4e61aa4eeb4602ede7e44a6 Feel free to add it to your patch set if you want. Alternatively take a look at the remove function from dwmac-stm32 here: https://patchwork.ozlabs.org/patch/619816/ > + > + return stmmac_pltfr_remove(pdev); > +} regards, Joachim Eastwood ^ permalink raw reply [flat|nested] 52+ messages in thread
[parent not found: <CAGhQ9VyWs=sYg7PVrt5r-fM-2t--qAnHyvNXAZXwjkYn5P196g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <CAGhQ9VyWs=sYg7PVrt5r-fM-2t--qAnHyvNXAZXwjkYn5P196g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2016-08-21 12:00 ` Martin Blumenstingl 0 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-21 12:00 UTC (permalink / raw) To: Joachim Eastwood Cc: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, Michael Turquette, peppe.cavallaro, alexandre.torgue-qxv4g6HH51o, Rob Herring, Mark Rutland, Catalin Marinas, Will Deacon, netdev, devicetree, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Stephen Boyd Hi Joachim, On Sat, Aug 20, 2016 at 11:29 PM, Joachim Eastwood <manabian-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> + platform_set_drvdata(pdev, dwmac); > > This will not work. The main stmmac driver already uses the driver_data field. > See: http://lxr.free-electrons.com/source/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c#L3218 > > >> + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); > > So calling stmmac_dvr_probe here will overwrite the driver_data field. > > >> +} >> + >> +static int meson8b_dwmac_remove(struct platform_device *pdev) >> +{ >> + struct meson8b_dwmac *dwmac = platform_get_drvdata(pdev); >> + >> + clk_disable_unprepare(dwmac->m25_div_clk); > > Did you test this code? I am pretty sure it will blow up given that > driver_data is not set to what you expect. I guess I should've taken a closer look at my kernel config: CONFIG_DWMAC_MESON=y Thanks for spotting this issue! > To get your meson8b_dwmac struct you must retrieve it from plat_dat->bsp_priv. > > > I have some code for a helper to retrieve bsp_priv that I have meant > to sent to the ML for a while now. > See: https://github.com/manabian/linux-lpc/commit/c3e155a6e38b9634e4e61aa4eeb4602ede7e44a6 > > Feel free to add it to your patch set if you want. > > Alternatively take a look at the remove function from dwmac-stm32 here: > https://patchwork.ozlabs.org/patch/619816/ excellent, thanks! I will send a fixed version as soon as possible Regards, Martin -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
[parent not found: <20160820093538.9707-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* [PATCH v2 4/4] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver [not found] ` <20160820093538.9707-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-08-20 9:35 ` Martin Blumenstingl 0 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-20 9:35 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, Martin Blumenstingl The Amlogic reference driver uses the "mc_val" devicetree property to configure the PRG_ETHERNET_ADDR0 register. Unfortunately it uses magic values for this configuration. According to the datasheet the PRG_ETHERNET_ADDR0 register is at address 0xc8834108. However, the reference driver uses 0xc8834540 instead. According to my tests, the value from the reference driver is correct. No changes are required to the board dts files because the only required configuration option is the phy-mode, which had to be configured correctly before as well. Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 4f42316..ab817d3 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -373,13 +373,15 @@ }; ethmac: ethernet@c9410000 { - compatible = "amlogic,meson6-dwmac", "snps,dwmac"; + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; reg = <0x0 0xc9410000 0x0 0x10000 0x0 0xc8834540 0x0 0x4>; interrupts = <0 8 1>; interrupt-names = "macirq"; - clocks = <&clkc CLKID_ETH>; - clock-names = "stmmaceth"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; phy-mode = "rgmii"; status = "disabled"; }; -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl ` (3 preceding siblings ...) [not found] ` <20160820093538.9707-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-08-28 16:16 ` Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl ` (5 more replies) 4 siblings, 6 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, Martin Blumenstingl This adds a DWMAC glue driver for the PRG_ETHERNET registers found in Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver the register layout is completely different. Thus I introduced a separate driver. Changes since v2: - fixed unloading the glue driver when built as module. This pulls in a patch from Joachim Eastwood (thanks) to get our private data structure (bsp_priv). Joachim Eastwood (1): stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl (4): net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings clk: gxbb: expose MPLL2 clock for use by DT net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver .../devicetree/bindings/net/meson-dwmac.txt | 45 ++- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +- drivers/clk/meson/gxbb.h | 2 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 327 +++++++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 + include/dt-bindings/clock/gxbb-clkc.h | 1 + 7 files changed, 380 insertions(+), 13 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -- 2.9.3 ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v3 2/5] clk: gxbb: expose MPLL2 clock for use by DT 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl @ 2016-08-28 16:16 ` Martin Blumenstingl [not found] ` <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> ` (4 subsequent siblings) 5 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, Martin Blumenstingl This exposes the MPLL2 clock as this is one of the input clocks of the ethernet controller's internal mux. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/gxbb.h | 2 +- include/dt-bindings/clock/gxbb-clkc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h index 217df51..3606e875 100644 --- a/drivers/clk/meson/gxbb.h +++ b/drivers/clk/meson/gxbb.h @@ -183,7 +183,7 @@ /* CLKID_CLK81 */ #define CLKID_MPLL0 13 #define CLKID_MPLL1 14 -#define CLKID_MPLL2 15 +/* CLKID_MPLL2 */ #define CLKID_DDR 16 #define CLKID_DOS 17 #define CLKID_ISA 18 diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h index 7d41864..244ea6e 100644 --- a/include/dt-bindings/clock/gxbb-clkc.h +++ b/include/dt-bindings/clock/gxbb-clkc.h @@ -8,6 +8,7 @@ #define CLKID_CPUCLK 1 #define CLKID_FCLK_DIV2 4 #define CLKID_CLK81 12 +#define CLKID_MPLL2 15 #define CLKID_ETH 36 #define CLKID_SD_EMMC_A 94 #define CLKID_SD_EMMC_B 95 -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
[parent not found: <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* [PATCH v3 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings [not found] ` <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-08-28 16:16 ` Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 3/5] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl 1 sibling, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, Martin Blumenstingl This patch adds the documentation for the DWMAC ethernet controller found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. The main difference between the Meson6 glue is that different registers (with different layout) are used. Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> --- .../devicetree/bindings/net/meson-dwmac.txt | 45 ++++++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt index ec633d7..89e62dd 100644 --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt @@ -1,18 +1,32 @@ * Amlogic Meson DWMAC Ethernet controller The device inherits all the properties of the dwmac/stmmac devices -described in the file net/stmmac.txt with the following changes. +described in the file stmmac.txt in the current directory with the +following changes. -Required properties: +Required properties on all platforms: -- compatible: should be "amlogic,meson6-dwmac" along with "snps,dwmac" - and any applicable more detailed version number - described in net/stmmac.txt +- compatible: Depending on the platform this should be one of: + - "amlogic,meson6-dwmac" + - "amlogic,meson8b-dwmac" + - "amlogic,meson-gxbb-dwmac" + Additionally "snps,dwmac" and any applicable more + detailed version number described in net/stmmac.txt + should be used. -- reg: should contain a register range for the dwmac controller and - another one for the Amlogic specific configuration +- reg: The first register range should be the one of the DWMAC + controller. The second range is is for the Amlogic specific + configuration (for example the PRG_ETHERNET register range + on Meson8b and newer) -Example: +Required properties on Meson8b and newer: +- clock-names: Should contain the following: + - "stmmaceth" - see stmmac.txt + - "clkin0" - first parent clock of the internal mux + - "clkin1" - second parent clock of the internal mux + + +Example for Meson6: ethmac: ethernet@c9410000 { compatible = "amlogic,meson6-dwmac", "snps,dwmac"; @@ -23,3 +37,18 @@ Example: clocks = <&clk81>; clock-names = "stmmaceth"; } + +Example for GXBB: + ethmac: ethernet@c9410000 { + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; + reg = <0x0 0xc9410000 0x0 0x10000>, + <0x0 0xc8834540 0x0 0x8>; + interrupts = <0 8 1>; + interrupt-names = "macirq"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; + phy-mode = "rgmii"; + status = "disabled"; + }; -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v3 3/5] stmmac: introduce get_stmmac_bsp_priv() helper [not found] ` <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-28 16:16 ` [PATCH v3 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl @ 2016-08-28 16:16 ` Martin Blumenstingl 1 sibling, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4 From: Joachim Eastwood <manabian-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Create a helper to retrive dwmac private data from a dev pointer. This is useful in PM callbacks and driver remove. Signed-off-by: Joachim Eastwood <manabian-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Tested-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> --- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h index ffeb8d9..64e147f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h @@ -30,4 +30,12 @@ int stmmac_get_platform_resources(struct platform_device *pdev, int stmmac_pltfr_remove(struct platform_device *pdev); extern const struct dev_pm_ops stmmac_pltfr_pm_ops; +static inline void *get_stmmac_bsp_priv(struct device *dev) +{ + struct net_device *ndev = dev_get_drvdata(dev); + struct stmmac_priv *priv = netdev_priv(ndev); + + return priv->plat->bsp_priv; +} + #endif /* __STMMAC_PLATFORM_H__ */ -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl [not found] ` <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-08-28 16:16 ` Martin Blumenstingl 2016-08-30 19:19 ` Stephen Boyd 2016-08-28 16:16 ` [PATCH v3 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl ` (2 subsequent siblings) 5 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, Martin Blumenstingl The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys DesignWare MAC IP core which is already supported by the stmmac driver. In addition to the standard stmmac driver some Meson8b / GXBB specific registers have to be configured for the PHY clocks. These SoC specific registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the datasheet. These registers are not backwards compatible with those on Meson 6b, which is why a new glue driver is introduced. This worked for many boards because the bootloader programs the PRG_ETHERNET registers correctly. Additionally the meson6-dwmac driver only sets bit 1 of PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used during reset. Currently all configuration values can be determined automatically, based on the configured phy-mode (which is mandatory for the stmmac driver). If required the tx-delay and the mux clock (so it supports the MPLL2 clock as well) can be made configurable in the future. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Tested-by: Kevin Hilman <khilman@baylibre.com> --- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 327 +++++++++++++++++++++ 2 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 44b630c..f77edb9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -9,7 +9,7 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o obj-$(CONFIG_DWMAC_IPQ806X) += dwmac-ipq806x.o obj-$(CONFIG_DWMAC_LPC18XX) += dwmac-lpc18xx.o -obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o +obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c new file mode 100644 index 0000000..0f185e4 --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -0,0 +1,327 @@ +/* + * Amlogic Meson S805/S905 DWMAC glue layer + * + * Copyright (C) 20016 Martin Blumenstingl <martin.blumenstingl@googlemail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/ethtool.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/of_net.h> +#include <linux/mfd/syscon.h> +#include <linux/platform_device.h> +#include <linux/stmmac.h> + +#include "stmmac_platform.h" + +#define PRG_ETH0 0x0 + +#define PRG_ETH0_RGMII_MODE BIT(0) + +/* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */ +#define PRG_ETH0_CLK_M250_SEL_SHIFT 4 +#define PRG_ETH0_CLK_M250_SEL_MASK GENMASK(4, 4) + +#define PRG_ETH0_TXDLY_SHIFT 5 +#define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) +#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) + +/* divider for the result of m250_sel */ +#define PRG_ETH0_CLK_M250_DIV_SHIFT 7 +#define PRG_ETH0_CLK_M250_DIV_WIDTH 3 + +/* divides the result of m25_sel by either 5 (bit unset) or 10 (bit set) */ +#define PRG_ETH0_CLK_M25_DIV_SHIFT 10 +#define PRG_ETH0_CLK_M25_DIV_WIDTH 1 + +#define PRG_ETH0_INVERTED_RMII_CLK BIT(11) +#define PRG_ETH0_TX_AND_PHY_REF_CLK BIT(12) + +#define MUX_CLK_NUM_PARENTS 2 + +struct meson8b_dwmac { + struct platform_device *pdev; + + void __iomem *regs; + + phy_interface_t phy_mode; + + struct clk_mux m250_mux; + struct clk *m250_mux_clk; + struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; + + struct clk_divider m250_div; + struct clk *m250_div_clk; + + struct clk_divider m25_div; + struct clk *m25_div_clk; +}; + +static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, + u32 mask, u32 value) +{ + u32 data; + + data = readl(dwmac->regs + reg); + data &= ~mask; + data |= (value & mask); + + writel(data, dwmac->regs + reg); +} + +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) +{ + struct clk_init_data init; + int i, ret; + struct device *dev = &dwmac->pdev->dev; + char clk_name[32]; + const char *clk_div_parents[1]; + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + static struct clk_div_table clk_25m_div_table[] = { + { .val = 0, .div = 5 }, + { .val = 1, .div = 10 }, + { /* sentinel */ }, + }; + + /* get the mux parents from DT */ + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { + char name[16]; + + snprintf(name, sizeof(name), "clkin%d", i); + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); + if (IS_ERR(dwmac->m250_mux_parent[i])) { + ret = PTR_ERR(dwmac->m250_mux_parent[i]); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Missing clock %s\n", name); + return ret; + } + + mux_parent_names[i] = + __clk_get_name(dwmac->m250_mux_parent[i]); + } + + /* create the m250_mux */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); + init.name = clk_name; + init.ops = &clk_mux_ops; + init.flags = CLK_IS_BASIC; + init.parent_names = mux_parent_names; + init.num_parents = MUX_CLK_NUM_PARENTS; + + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + dwmac->m250_mux.flags = 0; + dwmac->m250_mux.table = NULL; + dwmac->m250_mux.hw.init = &init; + + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_mux_clk))) + return PTR_ERR(dwmac->m250_mux_clk); + + /* create the m250_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + dwmac->m250_div.hw.init = &init; + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) + return PTR_ERR(dwmac->m250_div_clk); + + /* create the m25_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; + dwmac->m25_div.table = clk_25m_div_table; + dwmac->m25_div.hw.init = &init; + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) + return PTR_ERR(dwmac->m25_div_clk); + + return 0; +} + +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) +{ + int ret; + unsigned long clk_rate; + + switch (dwmac->phy_mode) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + /* Generate a 25MHz clock for the PHY */ + clk_rate = 25 * 1000 * 1000; + + /* enable RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + PRG_ETH0_RGMII_MODE); + + /* only relevant for RMII mode -> disable in RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, 0); + + /* TX clock delay - all known boards use a 1/4 cycle delay */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + PRG_ETH0_TXDLY_QUARTER); + break; + + case PHY_INTERFACE_MODE_RMII: + /* Use the rate of the mux clock for the internal RMII PHY */ + clk_rate = clk_get_rate(dwmac->m250_mux_clk); + + /* disable RGMII mode -> enables RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + 0); + + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, + PRG_ETH0_INVERTED_RMII_CLK); + + /* TX clock delay cannot be configured in RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + 0); + + break; + + default: + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + phy_modes(dwmac->phy_mode)); + return -EINVAL; + } + + ret = clk_prepare_enable(dwmac->m25_div_clk); + if (ret) { + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); + return ret; + } + + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); + if (ret) { + clk_disable_unprepare(dwmac->m25_div_clk); + + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); + return ret; + } + + /* enable TX_CLK and PHY_REF_CLK generator */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, + PRG_ETH0_TX_AND_PHY_REF_CLK); + + return 0; +} + +static int meson8b_dwmac_probe(struct platform_device *pdev) +{ + struct plat_stmmacenet_data *plat_dat; + struct stmmac_resources stmmac_res; + struct resource *res; + struct meson8b_dwmac *dwmac; + int ret; + + ret = stmmac_get_platform_resources(pdev, &stmmac_res); + if (ret) + return ret; + + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); + if (IS_ERR(plat_dat)) + return PTR_ERR(plat_dat); + + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); + if (!dwmac) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!res) + return -ENODEV; + + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dwmac->regs)) + return PTR_ERR(dwmac->regs); + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); + if (dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + return -EINVAL; + } + + ret = meson8b_init_clk(dwmac); + if (ret) + return ret; + + ret = meson8b_init_prg_eth(dwmac); + if (ret) + return ret; + + plat_dat->bsp_priv = dwmac; + + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); +} + +static int meson8b_dwmac_remove(struct platform_device *pdev) +{ + struct meson8b_dwmac *dwmac = get_stmmac_bsp_priv(&pdev->dev); + + clk_disable_unprepare(dwmac->m25_div_clk); + + return stmmac_pltfr_remove(pdev); +} + +static const struct of_device_id meson8b_dwmac_match[] = { + { .compatible = "amlogic,meson8b-dwmac" }, + { .compatible = "amlogic,meson-gxbb-dwmac" }, + { } +}; +MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); + +static struct platform_driver meson8b_dwmac_driver = { + .probe = meson8b_dwmac_probe, + .remove = meson8b_dwmac_remove, + .driver = { + .name = "meson8b-dwmac", + .pm = &stmmac_pltfr_pm_ops, + .of_match_table = meson8b_dwmac_match, + }, +}; +module_platform_driver(meson8b_dwmac_driver); + +MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>"); +MODULE_DESCRIPTION("Amlogic Meson S805/S905 DWMAC glue layer"); +MODULE_LICENSE("GPL v2"); -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-08-28 16:16 ` [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-08-30 19:19 ` Stephen Boyd [not found] ` <20160830191906.GD12510-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 0 siblings, 1 reply; 52+ messages in thread From: Stephen Boyd @ 2016-08-30 19:19 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, manabian, arnd On 08/28, Martin Blumenstingl wrote: > +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) > +{ > + struct clk_init_data init; > + int i, ret; > + struct device *dev = &dwmac->pdev->dev; > + char clk_name[32]; > + const char *clk_div_parents[1]; > + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; > + static struct clk_div_table clk_25m_div_table[] = { > + { .val = 0, .div = 5 }, > + { .val = 1, .div = 10 }, > + { /* sentinel */ }, > + }; > + > + /* get the mux parents from DT */ > + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { > + char name[16]; > + > + snprintf(name, sizeof(name), "clkin%d", i); > + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); > + if (IS_ERR(dwmac->m250_mux_parent[i])) { > + ret = PTR_ERR(dwmac->m250_mux_parent[i]); > + if (ret != -EPROBE_DEFER) > + dev_err(dev, "Missing clock %s\n", name); > + return ret; > + } > + > + mux_parent_names[i] = > + __clk_get_name(dwmac->m250_mux_parent[i]); > + } > + > + /* create the m250_mux */ > + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); > + init.name = clk_name; > + init.ops = &clk_mux_ops; > + init.flags = CLK_IS_BASIC; Please don't use this flag unless you need it. > + init.parent_names = mux_parent_names; > + init.num_parents = MUX_CLK_NUM_PARENTS; > + > + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; > + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; > + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; > + dwmac->m250_mux.flags = 0; > + dwmac->m250_mux.table = NULL; > + dwmac->m250_mux.hw.init = &init; > + > + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_mux_clk))) Why not if(WARN_ON(IS_ERR())? The OR_ZERO part seems confusing. > + return PTR_ERR(dwmac->m250_mux_clk); > + > + /* create the m250_div */ > + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); > + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > + init.ops = &clk_divider_ops; > + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; > + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); > + init.parent_names = clk_div_parents; > + init.num_parents = ARRAY_SIZE(clk_div_parents); > + > + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; > + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; > + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; > + dwmac->m250_div.hw.init = &init; > + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; > + > + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); We've been trying to move away from devm_clk_register() to devm_clk_hw_register() so that clk providers aren't also clk consumers. Obviously in this case this driver is a provider and a consumer, so this isn't as important. Kevin did something similar in the mmc driver, so I'll reiterate what I said on that patch. Perhaps we should make __clk_create_clk() into a real clk provider API so that we can use devm_clk_hw_register() here and then generate a clk for this device. That would allow us to have proper consumer tracking without relying on the clk that is returned from clk_register() (the intent is to make that clk instance internal to the framework). > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) > + return PTR_ERR(dwmac->m250_div_clk); > + > + /* create the m25_div */ > + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); > + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > + init.ops = &clk_divider_ops; > + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; > + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); > + init.parent_names = clk_div_parents; > + init.num_parents = ARRAY_SIZE(clk_div_parents); > + > + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; > + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; > + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; > + dwmac->m25_div.table = clk_25m_div_table; > + dwmac->m25_div.hw.init = &init; > + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; > + > + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); > + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) > + return PTR_ERR(dwmac->m25_div_clk); > + > + return 0; This could be return WARN_ON(PTR_ERR_OR_ZERO(...)) > + > +static int meson8b_dwmac_probe(struct platform_device *pdev) > +{ > + struct plat_stmmacenet_data *plat_dat; > + struct stmmac_resources stmmac_res; > + struct resource *res; > + struct meson8b_dwmac *dwmac; > + int ret; > + > + ret = stmmac_get_platform_resources(pdev, &stmmac_res); > + if (ret) > + return ret; > + > + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); > + if (IS_ERR(plat_dat)) > + return PTR_ERR(plat_dat); > + > + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); > + if (!dwmac) > + return -ENOMEM; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > + if (!res) > + return -ENODEV; > + You can drop the above two lines and just call devm_ioremap_resource(). > + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 52+ messages in thread
[parent not found: <20160830191906.GD12510-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* Re: [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <20160830191906.GD12510-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> @ 2016-09-04 18:20 ` Martin Blumenstingl [not found] ` <CAFBinCCVUhUVyceGc2capcCPOK8MTsn+RcC9gnrtMVvZUENXtQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:20 UTC (permalink / raw) To: Stephen Boyd Cc: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4 On Tue, Aug 30, 2016 at 9:19 PM, Stephen Boyd <sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> wrote: >> + return PTR_ERR(dwmac->m250_mux_clk); >> + >> + /* create the m250_div */ >> + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); >> + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); >> + init.ops = &clk_divider_ops; >> + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; >> + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); >> + init.parent_names = clk_div_parents; >> + init.num_parents = ARRAY_SIZE(clk_div_parents); >> + >> + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; >> + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; >> + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; >> + dwmac->m250_div.hw.init = &init; >> + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; >> + >> + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); > > We've been trying to move away from devm_clk_register() to > devm_clk_hw_register() so that clk providers aren't also clk > consumers. Obviously in this case this driver is a provider and a > consumer, so this isn't as important. Kevin did something similar > in the mmc driver, so I'll reiterate what I said on that patch. > Perhaps we should make __clk_create_clk() into a real clk > provider API so that we can use devm_clk_hw_register() here and > then generate a clk for this device. That would allow us to have > proper consumer tracking without relying on the clk that is > returned from clk_register() (the intent is to make that clk > instance internal to the framework). please correct me if I'm wrong but I read this as "this code is OK for now, but it should be changed once the clk framework has API for that". If still you want me to change the code then please send a NACK (preferably on the updated series which I am preparing right now). >> + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m250_div_clk))) >> + return PTR_ERR(dwmac->m250_div_clk); >> + >> + /* create the m25_div */ >> + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); >> + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); >> + init.ops = &clk_divider_ops; >> + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; >> + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); >> + init.parent_names = clk_div_parents; >> + init.num_parents = ARRAY_SIZE(clk_div_parents); >> + >> + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; >> + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; >> + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; >> + dwmac->m25_div.table = clk_25m_div_table; >> + dwmac->m25_div.hw.init = &init; >> + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; >> + >> + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); >> + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) >> + return PTR_ERR(dwmac->m25_div_clk); >> + >> + return 0; > > This could be return WARN_ON(PTR_ERR_OR_ZERO(...)) This would work as well but I prefer the way it is right now (as one could easily extend the code without having to touch any existing code apart from the last return). However, as it's always the case with personal preference: if coding-style requires me to change it then I'll do so, just let me know. I have addressed all other issues you found (thanks for that!) in v4 (which I am about to send in the next few minutes). Thanks, Martin -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
[parent not found: <CAFBinCCVUhUVyceGc2capcCPOK8MTsn+RcC9gnrtMVvZUENXtQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <CAFBinCCVUhUVyceGc2capcCPOK8MTsn+RcC9gnrtMVvZUENXtQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2016-09-05 9:27 ` Arnd Bergmann 0 siblings, 0 replies; 52+ messages in thread From: Arnd Bergmann @ 2016-09-05 9:27 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r Cc: Martin Blumenstingl, Stephen Boyd, mark.rutland-5wv7dgnIgG8, devicetree-u79uwXL29TY76Z2rM5mHXA, catalin.marinas-5wv7dgnIgG8, alexandre.torgue-qxv4g6HH51o, manabian-Re5JQEeQqe8AvxtiuMwx3w, khilman-rdvid1DuHRBWk0Htik3J/w, mturquette-rdvid1DuHRBWk0Htik3J/w, will.deacon-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, peppe.cavallaro-qxv4g6HH51o, carlo-KA+7E9HrN00dnm+yROfE0A, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, netdev-u79uwXL29TY76Z2rM5mHXA On Sunday, September 4, 2016 8:20:15 PM CEST Martin Blumenstingl wrote: > > >> + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); > >> + if (WARN_ON(PTR_ERR_OR_ZERO(dwmac->m25_div_clk))) > >> + return PTR_ERR(dwmac->m25_div_clk); > >> + > >> + return 0; > > > > This could be return WARN_ON(PTR_ERR_OR_ZERO(...)) > This would work as well but I prefer the way it is right now (as one > could easily extend the code without having to touch any existing code > apart from the last return). > However, as it's always the case with personal preference: if > coding-style requires me to change it then I'll do so, just let me > know. > > I have addressed all other issues you found (thanks for that!) in v4 > (which I am about to send in the next few minutes). Both of these are fairly unusual. The most common way to write it is if (WARN_ON(IS_ERR(dwmac->m25_div_clk))) return PTR_ERR(dwmac->m25_div_clk); return 0; However, I now tend to prefer ret = PTR_ERR_OR_ZERO(dwmac->m25_div_clk); WARN_ON(ret); return ret; which is less likely to cause false-positive warnings when building with -Wmaybe-uninitialized than any of the other ones. Please don't use PTR_ERR_OR_ZERO() as a condition, that is what IS_ERR() is meant for. Arnd -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v3 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl ` (2 preceding siblings ...) 2016-08-28 16:16 ` [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-08-28 16:16 ` Martin Blumenstingl 2016-08-29 3:40 ` [PATCH v3 0/5] meson: Meson8b and " David Miller 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl 5 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-28 16:16 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, Martin Blumenstingl The Amlogic reference driver uses the "mc_val" devicetree property to configure the PRG_ETHERNET_ADDR0 register. Unfortunately it uses magic values for this configuration. According to the datasheet the PRG_ETHERNET_ADDR0 register is at address 0xc8834108. However, the reference driver uses 0xc8834540 instead. According to my tests, the value from the reference driver is correct. No changes are required to the board dts files because the only required configuration option is the phy-mode, which had to be configured correctly before as well. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 4f42316..ab817d3 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -373,13 +373,15 @@ }; ethmac: ethernet@c9410000 { - compatible = "amlogic,meson6-dwmac", "snps,dwmac"; + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; reg = <0x0 0xc9410000 0x0 0x10000 0x0 0xc8834540 0x0 0x4>; interrupts = <0 8 1>; interrupt-names = "macirq"; - clocks = <&clkc CLKID_ETH>; - clock-names = "stmmaceth"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; phy-mode = "rgmii"; status = "disabled"; }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl ` (3 preceding siblings ...) 2016-08-28 16:16 ` [PATCH v3 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl @ 2016-08-29 3:40 ` David Miller 2016-08-30 18:49 ` Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl 5 siblings, 1 reply; 52+ messages in thread From: David Miller @ 2016-08-29 3:40 UTC (permalink / raw) To: martin.blumenstingl Cc: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Date: Sun, 28 Aug 2016 18:16:32 +0200 > This adds a DWMAC glue driver for the PRG_ETHERNET registers found in > Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver > the register layout is completely different. > Thus I introduced a separate driver. > > Changes since v2: > - fixed unloading the glue driver when built as module. This pulls in a > patch from Joachim Eastwood (thanks) to get our private data structure > (bsp_priv). This doesn't apply cleanly at all to the net-next tree, so I have no idea where you expect these changes to be applied. ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-08-29 3:40 ` [PATCH v3 0/5] meson: Meson8b and " David Miller @ 2016-08-30 18:49 ` Martin Blumenstingl [not found] ` <CAFBinCCmg-+8mjd0Xc5c7bEWL9_S_4kizs_UMiiW9ATBH_G8iw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-08-30 18:49 UTC (permalink / raw) To: David Miller, khilman Cc: linux-amlogic, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd On Mon, Aug 29, 2016 at 5:40 AM, David Miller <davem@davemloft.net> wrote: > From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > Date: Sun, 28 Aug 2016 18:16:32 +0200 > >> This adds a DWMAC glue driver for the PRG_ETHERNET registers found in >> Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver >> the register layout is completely different. >> Thus I introduced a separate driver. >> >> Changes since v2: >> - fixed unloading the glue driver when built as module. This pulls in a >> patch from Joachim Eastwood (thanks) to get our private data structure >> (bsp_priv). > > This doesn't apply cleanly at all to the net-next tree, so I have > no idea where you expect these changes to be applied. OK, maybe Kevin can me help out here as I think the patches should go to various trees. I think patches 1, 3 and 4 should go through the net-next tree (as these touch drivers/net/ethernet/stmicro/stmmac/ and the corresponding documentation). Patch 2 should probably go through clk-meson-gxbb / clk-next (just like the other clk changes we had). The last patch (patch 5) should probably go through the ARM SoC tree (just like the other dts changes we had). @David, Kevin: would this be fine for you? ^ permalink raw reply [flat|nested] 52+ messages in thread
[parent not found: <CAFBinCCmg-+8mjd0Xc5c7bEWL9_S_4kizs_UMiiW9ATBH_G8iw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver [not found] ` <CAFBinCCmg-+8mjd0Xc5c7bEWL9_S_4kizs_UMiiW9ATBH_G8iw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2016-08-31 4:57 ` David Miller 2016-09-02 4:23 ` Kevin Hilman 0 siblings, 1 reply; 52+ messages in thread From: David Miller @ 2016-08-31 4:57 UTC (permalink / raw) To: martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg Cc: khilman-rdvid1DuHRBWk0Htik3J/w, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4 From: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Date: Tue, 30 Aug 2016 20:49:28 +0200 > On Mon, Aug 29, 2016 at 5:40 AM, David Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> wrote: >> From: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> >> Date: Sun, 28 Aug 2016 18:16:32 +0200 >> >>> This adds a DWMAC glue driver for the PRG_ETHERNET registers found in >>> Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver >>> the register layout is completely different. >>> Thus I introduced a separate driver. >>> >>> Changes since v2: >>> - fixed unloading the glue driver when built as module. This pulls in a >>> patch from Joachim Eastwood (thanks) to get our private data structure >>> (bsp_priv). >> >> This doesn't apply cleanly at all to the net-next tree, so I have >> no idea where you expect these changes to be applied. > OK, maybe Kevin can me help out here as I think the patches should go > to various trees. > > I think patches 1, 3 and 4 should go through the net-next tree (as > these touch drivers/net/ethernet/stmicro/stmmac/ and the corresponding > documentation). > Patch 2 should probably go through clk-meson-gxbb / clk-next (just > like the other clk changes we had). > The last patch (patch 5) should probably go through the ARM SoC tree > (just like the other dts changes we had). > > @David, Kevin: would this be fine for you? I would prefer if all of the patches went through one tree, that way all the dependencies are satisfied in one place. -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-08-31 4:57 ` David Miller @ 2016-09-02 4:23 ` Kevin Hilman 2016-09-02 5:37 ` David Miller 0 siblings, 1 reply; 52+ messages in thread From: Kevin Hilman @ 2016-09-02 4:23 UTC (permalink / raw) To: David Miller Cc: martin.blumenstingl, linux-amlogic, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd David Miller <davem@davemloft.net> writes: > From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > Date: Tue, 30 Aug 2016 20:49:28 +0200 > >> On Mon, Aug 29, 2016 at 5:40 AM, David Miller <davem@davemloft.net> wrote: >>> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >>> Date: Sun, 28 Aug 2016 18:16:32 +0200 >>> >>>> This adds a DWMAC glue driver for the PRG_ETHERNET registers found in >>>> Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver >>>> the register layout is completely different. >>>> Thus I introduced a separate driver. >>>> >>>> Changes since v2: >>>> - fixed unloading the glue driver when built as module. This pulls in a >>>> patch from Joachim Eastwood (thanks) to get our private data structure >>>> (bsp_priv). >>> >>> This doesn't apply cleanly at all to the net-next tree, so I have >>> no idea where you expect these changes to be applied. >> OK, maybe Kevin can me help out here as I think the patches should go >> to various trees. >> >> I think patches 1, 3 and 4 should go through the net-next tree (as >> these touch drivers/net/ethernet/stmicro/stmmac/ and the corresponding >> documentation). >> Patch 2 should probably go through clk-meson-gxbb / clk-next (just >> like the other clk changes we had). >> The last patch (patch 5) should probably go through the ARM SoC tree >> (just like the other dts changes we had). >> >> @David, Kevin: would this be fine for you? > > I would prefer if all of the patches went through one tree, that way > all the dependencies are satisfied in one place. David, with your ack on the drivers/net changes, I can take them through my tree for Amlogic SoCs (which then goes via the arm-soc tree.) Note that there may be some minor tweaks yet to the clock handling based on review comments. Thanks, Kevin ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-09-02 4:23 ` Kevin Hilman @ 2016-09-02 5:37 ` David Miller 2016-09-02 8:50 ` Arnd Bergmann 0 siblings, 1 reply; 52+ messages in thread From: David Miller @ 2016-09-02 5:37 UTC (permalink / raw) To: khilman Cc: martin.blumenstingl, linux-amlogic, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd From: Kevin Hilman <khilman@baylibre.com> Date: Thu, 01 Sep 2016 21:23:52 -0700 > David Miller <davem@davemloft.net> writes: > >> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >> Date: Tue, 30 Aug 2016 20:49:28 +0200 >> >>> On Mon, Aug 29, 2016 at 5:40 AM, David Miller <davem@davemloft.net> wrote: >>>> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> >>>> Date: Sun, 28 Aug 2016 18:16:32 +0200 >>>> >>>>> This adds a DWMAC glue driver for the PRG_ETHERNET registers found in >>>>> Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver >>>>> the register layout is completely different. >>>>> Thus I introduced a separate driver. >>>>> >>>>> Changes since v2: >>>>> - fixed unloading the glue driver when built as module. This pulls in a >>>>> patch from Joachim Eastwood (thanks) to get our private data structure >>>>> (bsp_priv). >>>> >>>> This doesn't apply cleanly at all to the net-next tree, so I have >>>> no idea where you expect these changes to be applied. >>> OK, maybe Kevin can me help out here as I think the patches should go >>> to various trees. >>> >>> I think patches 1, 3 and 4 should go through the net-next tree (as >>> these touch drivers/net/ethernet/stmicro/stmmac/ and the corresponding >>> documentation). >>> Patch 2 should probably go through clk-meson-gxbb / clk-next (just >>> like the other clk changes we had). >>> The last patch (patch 5) should probably go through the ARM SoC tree >>> (just like the other dts changes we had). >>> >>> @David, Kevin: would this be fine for you? >> >> I would prefer if all of the patches went through one tree, that way >> all the dependencies are satisfied in one place. > > David, with your ack on the drivers/net changes, I can take them through > my tree for Amlogic SoCs (which then goes via the arm-soc tree.) Acked-by: David S. Miller <davem@davemloft.net> ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v3 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-09-02 5:37 ` David Miller @ 2016-09-02 8:50 ` Arnd Bergmann 0 siblings, 0 replies; 52+ messages in thread From: Arnd Bergmann @ 2016-09-02 8:50 UTC (permalink / raw) To: linux-arm-kernel Cc: David Miller, khilman, mark.rutland, devicetree, sboyd, alexandre.torgue, martin.blumenstingl, catalin.marinas, mturquette, will.deacon, manabian, robh+dt, peppe.cavallaro, carlo, linux-amlogic, netdev On Thursday, September 1, 2016 10:37:31 PM CEST David Miller wrote: > From: Kevin Hilman <khilman@baylibre.com> > Date: Thu, 01 Sep 2016 21:23:52 -0700 > > David Miller <davem@davemloft.net> writes: > >> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > >> Date: Tue, 30 Aug 2016 20:49:28 +0200 > >>> On Mon, Aug 29, 2016 at 5:40 AM, David Miller <davem@davemloft.net> wrote: > >>>> From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > >>> I think patches 1, 3 and 4 should go through the net-next tree (as > >>> these touch drivers/net/ethernet/stmicro/stmmac/ and the corresponding > >>> documentation). > >>> Patch 2 should probably go through clk-meson-gxbb / clk-next (just > >>> like the other clk changes we had). > >>> The last patch (patch 5) should probably go through the ARM SoC tree > >>> (just like the other dts changes we had). > >>> > >>> @David, Kevin: would this be fine for you? > >> > >> I would prefer if all of the patches went through one tree, that way > >> all the dependencies are satisfied in one place. > > > > David, with your ack on the drivers/net changes, I can take them through > > my tree for Amlogic SoCs (which then goes via the arm-soc tree.) > > Acked-by: David S. Miller <davem@davemloft.net> Thanks! Note that we (in arm-soc) normally put drivers and DT changes into separate branches and send a pull request for each branch separately (though usually on the same day). We expect there to be no runtime dependency between the DT changes and the driver changes other than requiring both to make use of the added features. Kevin/Martin: in case this one does have a runtime dependency, please we can put both halves into the next/drivers branch in the correct order to ensure that they are applied together, and describe the dependency in the cover letter for the pull request. Arnd ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v4 0/5] meson: Meson8b and GXBB DWMAC glue driver 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl ` (4 preceding siblings ...) 2016-08-29 3:40 ` [PATCH v3 0/5] meson: Meson8b and " David Miller @ 2016-09-04 18:23 ` Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl ` (4 more replies) 5 siblings, 5 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: mark.rutland, devicetree, arnd, Martin Blumenstingl, catalin.marinas, manabian, will.deacon, davem, robh+dt, netdev, sboyd, linux-arm-kernel This adds a DWMAC glue driver for the PRG_ETHERNET registers found in Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver the register layout is completely different. Thus I introduced a separate driver. Changes since v3: - remove (unnecessary) usage of CLK_IS_BASIC flag - use WARN_ON(IS_ERR(...)) instead of WARN_ON(PTR_ERR_OR_ZERO(...)) - let devm_ioremap_resource() check the result returned by platform_get_resource() - added David Miller's ACKs to the patches which would be relevant for the net-next tree (patches 1, 3 and 4) as per http://lists.infradead.org/pipermail/linux-amlogic/2016-September/000995.html - fixed typo in copyright year Joachim Eastwood (1): stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl (4): net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings clk: gxbb: expose MPLL2 clock for use by DT net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver .../devicetree/bindings/net/meson-dwmac.txt | 45 ++- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +- drivers/clk/meson/gxbb.h | 2 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 324 +++++++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 + include/dt-bindings/clock/gxbb-clkc.h | 1 + 7 files changed, 377 insertions(+), 13 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -- 2.9.3 ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v4 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl @ 2016-09-04 18:23 ` Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl ` (3 subsequent siblings) 4 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: mark.rutland, devicetree, arnd, Martin Blumenstingl, catalin.marinas, manabian, will.deacon, davem, robh+dt, netdev, sboyd, linux-arm-kernel This patch adds the documentation for the DWMAC ethernet controller found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. The main difference between the Meson6 glue is that different registers (with different layout) are used. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: Rob Herring <robh@kernel.org> Acked-by: David S. Miller <davem@davemloft.net> --- .../devicetree/bindings/net/meson-dwmac.txt | 45 ++++++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt index ec633d7..89e62dd 100644 --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt @@ -1,18 +1,32 @@ * Amlogic Meson DWMAC Ethernet controller The device inherits all the properties of the dwmac/stmmac devices -described in the file net/stmmac.txt with the following changes. +described in the file stmmac.txt in the current directory with the +following changes. -Required properties: +Required properties on all platforms: -- compatible: should be "amlogic,meson6-dwmac" along with "snps,dwmac" - and any applicable more detailed version number - described in net/stmmac.txt +- compatible: Depending on the platform this should be one of: + - "amlogic,meson6-dwmac" + - "amlogic,meson8b-dwmac" + - "amlogic,meson-gxbb-dwmac" + Additionally "snps,dwmac" and any applicable more + detailed version number described in net/stmmac.txt + should be used. -- reg: should contain a register range for the dwmac controller and - another one for the Amlogic specific configuration +- reg: The first register range should be the one of the DWMAC + controller. The second range is is for the Amlogic specific + configuration (for example the PRG_ETHERNET register range + on Meson8b and newer) -Example: +Required properties on Meson8b and newer: +- clock-names: Should contain the following: + - "stmmaceth" - see stmmac.txt + - "clkin0" - first parent clock of the internal mux + - "clkin1" - second parent clock of the internal mux + + +Example for Meson6: ethmac: ethernet@c9410000 { compatible = "amlogic,meson6-dwmac", "snps,dwmac"; @@ -23,3 +37,18 @@ Example: clocks = <&clk81>; clock-names = "stmmaceth"; } + +Example for GXBB: + ethmac: ethernet@c9410000 { + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; + reg = <0x0 0xc9410000 0x0 0x10000>, + <0x0 0xc8834540 0x0 0x8>; + interrupts = <0 8 1>; + interrupt-names = "macirq"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; + phy-mode = "rgmii"; + status = "disabled"; + }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v4 2/5] clk: gxbb: expose MPLL2 clock for use by DT 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl @ 2016-09-04 18:23 ` Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 3/5] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl ` (2 subsequent siblings) 4 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: mark.rutland, devicetree, arnd, Martin Blumenstingl, catalin.marinas, manabian, will.deacon, davem, robh+dt, netdev, sboyd, linux-arm-kernel This exposes the MPLL2 clock as this is one of the input clocks of the ethernet controller's internal mux. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/clk/meson/gxbb.h | 2 +- include/dt-bindings/clock/gxbb-clkc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h index 217df51..3606e875 100644 --- a/drivers/clk/meson/gxbb.h +++ b/drivers/clk/meson/gxbb.h @@ -183,7 +183,7 @@ /* CLKID_CLK81 */ #define CLKID_MPLL0 13 #define CLKID_MPLL1 14 -#define CLKID_MPLL2 15 +/* CLKID_MPLL2 */ #define CLKID_DDR 16 #define CLKID_DOS 17 #define CLKID_ISA 18 diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h index 7d41864..244ea6e 100644 --- a/include/dt-bindings/clock/gxbb-clkc.h +++ b/include/dt-bindings/clock/gxbb-clkc.h @@ -8,6 +8,7 @@ #define CLKID_CPUCLK 1 #define CLKID_FCLK_DIV2 4 #define CLKID_CLK81 12 +#define CLKID_MPLL2 15 #define CLKID_ETH 36 #define CLKID_SD_EMMC_A 94 #define CLKID_SD_EMMC_B 95 -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v4 3/5] stmmac: introduce get_stmmac_bsp_priv() helper 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl @ 2016-09-04 18:23 ` Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl [not found] ` <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 4 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: mark.rutland, devicetree, arnd, catalin.marinas, manabian, will.deacon, davem, robh+dt, netdev, sboyd, linux-arm-kernel From: Joachim Eastwood <manabian@gmail.com> Create a helper to retrive dwmac private data from a dev pointer. This is useful in PM callbacks and driver remove. Signed-off-by: Joachim Eastwood <manabian@gmail.com> Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: David S. Miller <davem@davemloft.net> --- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h index ffeb8d9..64e147f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h @@ -30,4 +30,12 @@ int stmmac_get_platform_resources(struct platform_device *pdev, int stmmac_pltfr_remove(struct platform_device *pdev); extern const struct dev_pm_ops stmmac_pltfr_pm_ops; +static inline void *get_stmmac_bsp_priv(struct device *dev) +{ + struct net_device *ndev = dev_get_drvdata(dev); + struct stmmac_priv *priv = netdev_priv(ndev); + + return priv->plat->bsp_priv; +} + #endif /* __STMMAC_PLATFORM_H__ */ -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v4 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl ` (2 preceding siblings ...) 2016-09-04 18:23 ` [PATCH v4 3/5] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl @ 2016-09-04 18:23 ` Martin Blumenstingl [not found] ` <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 4 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: mark.rutland, devicetree, arnd, Martin Blumenstingl, catalin.marinas, manabian, will.deacon, davem, robh+dt, netdev, sboyd, linux-arm-kernel The Amlogic reference driver uses the "mc_val" devicetree property to configure the PRG_ETHERNET_ADDR0 register. Unfortunately it uses magic values for this configuration. According to the datasheet the PRG_ETHERNET_ADDR0 register is at address 0xc8834108. However, the reference driver uses 0xc8834540 instead. According to my tests, the value from the reference driver is correct. No changes are required to the board dts files because the only required configuration option is the phy-mode, which had to be configured correctly before as well. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 2b47415..2e8a3d9 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -497,13 +497,15 @@ }; ethmac: ethernet@c9410000 { - compatible = "amlogic,meson6-dwmac", "snps,dwmac"; + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; reg = <0x0 0xc9410000 0x0 0x10000 0x0 0xc8834540 0x0 0x4>; interrupts = <0 8 1>; interrupt-names = "macirq"; - clocks = <&clkc CLKID_ETH>; - clock-names = "stmmaceth"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; phy-mode = "rgmii"; status = "disabled"; }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
[parent not found: <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-09-04 18:23 ` Martin Blumenstingl [not found] ` <20160904182320.671-5-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-05 1:43 ` kbuild test robot 2016-09-06 21:38 ` [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 1 sibling, 2 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-04 18:23 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, Martin Blumenstingl The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys DesignWare MAC IP core which is already supported by the stmmac driver. In addition to the standard stmmac driver some Meson8b / GXBB specific registers have to be configured for the PHY clocks. These SoC specific registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the datasheet. These registers are not backwards compatible with those on Meson 6b, which is why a new glue driver is introduced. This worked for many boards because the bootloader programs the PRG_ETHERNET registers correctly. Additionally the meson6-dwmac driver only sets bit 1 of PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used during reset. Currently all configuration values can be determined automatically, based on the configured phy-mode (which is mandatory for the stmmac driver). If required the tx-delay and the mux clock (so it supports the MPLL2 clock as well) can be made configurable in the future. Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Tested-by: Kevin Hilman <khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org> Acked-by: David S. Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> --- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 324 +++++++++++++++++++++ 2 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 44b630c..f77edb9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -9,7 +9,7 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o obj-$(CONFIG_DWMAC_IPQ806X) += dwmac-ipq806x.o obj-$(CONFIG_DWMAC_LPC18XX) += dwmac-lpc18xx.o -obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o +obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c new file mode 100644 index 0000000..a31ec24 --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -0,0 +1,324 @@ +/* + * Amlogic Meson S805/S905 DWMAC glue layer + * + * Copyright (C) 2016 Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/ethtool.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/of_net.h> +#include <linux/mfd/syscon.h> +#include <linux/platform_device.h> +#include <linux/stmmac.h> + +#include "stmmac_platform.h" + +#define PRG_ETH0 0x0 + +#define PRG_ETH0_RGMII_MODE BIT(0) + +/* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */ +#define PRG_ETH0_CLK_M250_SEL_SHIFT 4 +#define PRG_ETH0_CLK_M250_SEL_MASK GENMASK(4, 4) + +#define PRG_ETH0_TXDLY_SHIFT 5 +#define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) +#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) + +/* divider for the result of m250_sel */ +#define PRG_ETH0_CLK_M250_DIV_SHIFT 7 +#define PRG_ETH0_CLK_M250_DIV_WIDTH 3 + +/* divides the result of m25_sel by either 5 (bit unset) or 10 (bit set) */ +#define PRG_ETH0_CLK_M25_DIV_SHIFT 10 +#define PRG_ETH0_CLK_M25_DIV_WIDTH 1 + +#define PRG_ETH0_INVERTED_RMII_CLK BIT(11) +#define PRG_ETH0_TX_AND_PHY_REF_CLK BIT(12) + +#define MUX_CLK_NUM_PARENTS 2 + +struct meson8b_dwmac { + struct platform_device *pdev; + + void __iomem *regs; + + phy_interface_t phy_mode; + + struct clk_mux m250_mux; + struct clk *m250_mux_clk; + struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; + + struct clk_divider m250_div; + struct clk *m250_div_clk; + + struct clk_divider m25_div; + struct clk *m25_div_clk; +}; + +static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, + u32 mask, u32 value) +{ + u32 data; + + data = readl(dwmac->regs + reg); + data &= ~mask; + data |= (value & mask); + + writel(data, dwmac->regs + reg); +} + +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) +{ + struct clk_init_data init; + int i, ret; + struct device *dev = &dwmac->pdev->dev; + char clk_name[32]; + const char *clk_div_parents[1]; + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + static struct clk_div_table clk_25m_div_table[] = { + { .val = 0, .div = 5 }, + { .val = 1, .div = 10 }, + { /* sentinel */ }, + }; + + /* get the mux parents from DT */ + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { + char name[16]; + + snprintf(name, sizeof(name), "clkin%d", i); + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); + if (IS_ERR(dwmac->m250_mux_parent[i])) { + ret = PTR_ERR(dwmac->m250_mux_parent[i]); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Missing clock %s\n", name); + return ret; + } + + mux_parent_names[i] = + __clk_get_name(dwmac->m250_mux_parent[i]); + } + + /* create the m250_mux */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); + init.name = clk_name; + init.ops = &clk_mux_ops; + init.flags = 0; + init.parent_names = mux_parent_names; + init.num_parents = MUX_CLK_NUM_PARENTS; + + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + dwmac->m250_mux.flags = 0; + dwmac->m250_mux.table = NULL; + dwmac->m250_mux.hw.init = &init; + + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); + if (WARN_ON(IS_ERR(dwmac->m250_mux_clk))) + return PTR_ERR(dwmac->m250_mux_clk); + + /* create the m250_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + dwmac->m250_div.hw.init = &init; + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); + if (WARN_ON(IS_ERR(dwmac->m250_div_clk))) + return PTR_ERR(dwmac->m250_div_clk); + + /* create the m25_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; + dwmac->m25_div.table = clk_25m_div_table; + dwmac->m25_div.hw.init = &init; + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); + if (WARN_ON(IS_ERR(dwmac->m25_div_clk))) + return PTR_ERR(dwmac->m25_div_clk); + + return 0; +} + +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) +{ + int ret; + unsigned long clk_rate; + + switch (dwmac->phy_mode) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + /* Generate a 25MHz clock for the PHY */ + clk_rate = 25 * 1000 * 1000; + + /* enable RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + PRG_ETH0_RGMII_MODE); + + /* only relevant for RMII mode -> disable in RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, 0); + + /* TX clock delay - all known boards use a 1/4 cycle delay */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + PRG_ETH0_TXDLY_QUARTER); + break; + + case PHY_INTERFACE_MODE_RMII: + /* Use the rate of the mux clock for the internal RMII PHY */ + clk_rate = clk_get_rate(dwmac->m250_mux_clk); + + /* disable RGMII mode -> enables RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + 0); + + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, + PRG_ETH0_INVERTED_RMII_CLK); + + /* TX clock delay cannot be configured in RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + 0); + + break; + + default: + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + phy_modes(dwmac->phy_mode)); + return -EINVAL; + } + + ret = clk_prepare_enable(dwmac->m25_div_clk); + if (ret) { + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); + return ret; + } + + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); + if (ret) { + clk_disable_unprepare(dwmac->m25_div_clk); + + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); + return ret; + } + + /* enable TX_CLK and PHY_REF_CLK generator */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, + PRG_ETH0_TX_AND_PHY_REF_CLK); + + return 0; +} + +static int meson8b_dwmac_probe(struct platform_device *pdev) +{ + struct plat_stmmacenet_data *plat_dat; + struct stmmac_resources stmmac_res; + struct resource *res; + struct meson8b_dwmac *dwmac; + int ret; + + ret = stmmac_get_platform_resources(pdev, &stmmac_res); + if (ret) + return ret; + + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); + if (IS_ERR(plat_dat)) + return PTR_ERR(plat_dat); + + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); + if (!dwmac) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dwmac->regs)) + return PTR_ERR(dwmac->regs); + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); + if (dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + return -EINVAL; + } + + ret = meson8b_init_clk(dwmac); + if (ret) + return ret; + + ret = meson8b_init_prg_eth(dwmac); + if (ret) + return ret; + + plat_dat->bsp_priv = dwmac; + + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); +} + +static int meson8b_dwmac_remove(struct platform_device *pdev) +{ + struct meson8b_dwmac *dwmac = get_stmmac_bsp_priv(&pdev->dev); + + clk_disable_unprepare(dwmac->m25_div_clk); + + return stmmac_pltfr_remove(pdev); +} + +static const struct of_device_id meson8b_dwmac_match[] = { + { .compatible = "amlogic,meson8b-dwmac" }, + { .compatible = "amlogic,meson-gxbb-dwmac" }, + { } +}; +MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); + +static struct platform_driver meson8b_dwmac_driver = { + .probe = meson8b_dwmac_probe, + .remove = meson8b_dwmac_remove, + .driver = { + .name = "meson8b-dwmac", + .pm = &stmmac_pltfr_pm_ops, + .of_match_table = meson8b_dwmac_match, + }, +}; +module_platform_driver(meson8b_dwmac_driver); + +MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>"); +MODULE_DESCRIPTION("Amlogic Meson S805/S905 DWMAC glue layer"); +MODULE_LICENSE("GPL v2"); -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
[parent not found: <20160904182320.671-5-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <20160904182320.671-5-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-09-05 1:37 ` kbuild test robot 2016-09-05 10:53 ` Arnd Bergmann 0 siblings, 1 reply; 52+ messages in thread From: kbuild test robot @ 2016-09-05 1:37 UTC (permalink / raw) Cc: kbuild-all-JC7UmRfGjtg, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, Martin Blumenstingl [-- Attachment #1: Type: text/plain, Size: 10245 bytes --] Hi Martin, [auto build test ERROR on next-20160825] [also build test ERROR on v4.8-rc5] [cannot apply to robh/for-next net-next/master net/master v4.8-rc4 v4.8-rc3 v4.8-rc2] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] [Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on] [Check https://git-scm.com/docs/git-format-patch for more information] url: https://github.com/0day-ci/linux/commits/Martin-Blumenstingl/meson-Meson8b-and-GXBB-DWMAC-glue-driver/20160905-023130 config: sparc64-allyesconfig (attached as .config) compiler: sparc64-linux-gnu-gcc (Debian 5.4.0-6) 5.4.0 20160609 reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=sparc64 All error/warnings (new ones prefixed by >>): >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:63:18: error: field 'm250_mux' has incomplete type struct clk_mux m250_mux; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:67:21: error: field 'm250_div' has incomplete type struct clk_divider m250_div; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:70:21: error: field 'm25_div' has incomplete type struct clk_divider m25_div; ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c: In function 'meson8b_init_clk': >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:88:23: error: storage size of 'init' isn't known struct clk_init_data init; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:94:30: error: array type has incomplete element type 'struct clk_div_table' static struct clk_div_table clk_25m_div_table[] = { ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:5: error: field name not in record or union initializer { .val = 0, .div = 5 }, ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:5: note: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:15: error: field name not in record or union initializer { .val = 0, .div = 5 }, ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:15: note: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:5: error: field name not in record or union initializer { .val = 1, .div = 10 }, ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:5: note: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:15: error: field name not in record or union initializer { .val = 1, .div = 10 }, ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:15: note: (near initialization for 'clk_25m_div_table') >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:114:4: error: implicit declaration of function '__clk_get_name' [-Werror=implicit-function-declaration] __clk_get_name(dwmac->m250_mux_parent[i]); ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:113:23: warning: assignment makes pointer from integer without a cast [-Wint-conversion] mux_parent_names[i] = ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:120:14: error: 'clk_mux_ops' undeclared (first use in this function) init.ops = &clk_mux_ops; ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:120:14: note: each undeclared identifier is reported only once for each function it appears in >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:132:24: error: implicit declaration of function 'devm_clk_register' [-Werror=implicit-function-declaration] dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:139:14: error: 'clk_divider_ops' undeclared (first use in this function) init.ops = &clk_divider_ops; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:140:15: error: 'CLK_SET_RATE_PARENT' undeclared (first use in this function) init.flags = CLK_SET_RATE_PARENT; ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:141:21: warning: assignment makes pointer from integer without a cast [-Wint-conversion] clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:149:26: error: 'CLK_DIVIDER_ONE_BASED' undeclared (first use in this function) dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:149:50: error: 'CLK_DIVIDER_ALLOW_ZERO' undeclared (first use in this function) dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:159:15: error: 'CLK_IS_BASIC' undeclared (first use in this function) init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; ^ drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:160:21: warning: assignment makes pointer from integer without a cast [-Wint-conversion] clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:94:30: warning: unused variable 'clk_25m_div_table' [-Wunused-variable] static struct clk_div_table clk_25m_div_table[] = { ^ >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:88:23: warning: unused variable 'init' [-Wunused-variable] struct clk_init_data init; ^ cc1: some warnings being treated as errors vim +/m250_mux +63 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c 57 struct platform_device *pdev; 58 59 void __iomem *regs; 60 61 phy_interface_t phy_mode; 62 > 63 struct clk_mux m250_mux; 64 struct clk *m250_mux_clk; 65 struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; 66 > 67 struct clk_divider m250_div; 68 struct clk *m250_div_clk; 69 > 70 struct clk_divider m25_div; 71 struct clk *m25_div_clk; 72 }; 73 74 static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, 75 u32 mask, u32 value) 76 { 77 u32 data; 78 79 data = readl(dwmac->regs + reg); 80 data &= ~mask; 81 data |= (value & mask); 82 83 writel(data, dwmac->regs + reg); 84 } 85 86 static int meson8b_init_clk(struct meson8b_dwmac *dwmac) 87 { > 88 struct clk_init_data init; 89 int i, ret; 90 struct device *dev = &dwmac->pdev->dev; 91 char clk_name[32]; 92 const char *clk_div_parents[1]; 93 const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; > 94 static struct clk_div_table clk_25m_div_table[] = { > 95 { .val = 0, .div = 5 }, > 96 { .val = 1, .div = 10 }, 97 { /* sentinel */ }, 98 }; 99 100 /* get the mux parents from DT */ 101 for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { 102 char name[16]; 103 104 snprintf(name, sizeof(name), "clkin%d", i); 105 dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); 106 if (IS_ERR(dwmac->m250_mux_parent[i])) { 107 ret = PTR_ERR(dwmac->m250_mux_parent[i]); 108 if (ret != -EPROBE_DEFER) 109 dev_err(dev, "Missing clock %s\n", name); 110 return ret; 111 } 112 > 113 mux_parent_names[i] = > 114 __clk_get_name(dwmac->m250_mux_parent[i]); 115 } 116 117 /* create the m250_mux */ 118 snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); 119 init.name = clk_name; > 120 init.ops = &clk_mux_ops; 121 init.flags = 0; 122 init.parent_names = mux_parent_names; 123 init.num_parents = MUX_CLK_NUM_PARENTS; 124 125 dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; 126 dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; 127 dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; 128 dwmac->m250_mux.flags = 0; 129 dwmac->m250_mux.table = NULL; 130 dwmac->m250_mux.hw.init = &init; 131 > 132 dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); 133 if (WARN_ON(IS_ERR(dwmac->m250_mux_clk))) 134 return PTR_ERR(dwmac->m250_mux_clk); 135 136 /* create the m250_div */ 137 snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); 138 init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); > 139 init.ops = &clk_divider_ops; > 140 init.flags = CLK_SET_RATE_PARENT; > 141 clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); 142 init.parent_names = clk_div_parents; 143 init.num_parents = ARRAY_SIZE(clk_div_parents); 144 145 dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; 146 dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; 147 dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; 148 dwmac->m250_div.hw.init = &init; > 149 dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; 150 151 dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); 152 if (WARN_ON(IS_ERR(dwmac->m250_div_clk))) 153 return PTR_ERR(dwmac->m250_div_clk); 154 155 /* create the m25_div */ 156 snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); 157 init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); 158 init.ops = &clk_divider_ops; > 159 init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; 160 clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); 161 init.parent_names = clk_div_parents; 162 init.num_parents = ARRAY_SIZE(clk_div_parents); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/octet-stream, Size: 47275 bytes --] ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-09-05 1:37 ` kbuild test robot @ 2016-09-05 10:53 ` Arnd Bergmann 2016-09-05 19:07 ` Martin Blumenstingl 0 siblings, 1 reply; 52+ messages in thread From: Arnd Bergmann @ 2016-09-05 10:53 UTC (permalink / raw) To: kbuild test robot Cc: Martin Blumenstingl, kbuild-all, linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, davem On Monday, September 5, 2016 9:37:29 AM CEST kbuild test robot wrote: > All error/warnings (new ones prefixed by >>): > > >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:63:18: error: field 'm250_mux' has incomplete type > struct clk_mux m250_mux; > ^ > >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:67:21: error: field 'm250_div' has incomplete type > struct clk_divider m250_div; > ^ > I think this needs a compile-time dependency on COMMON_CLK Arnd ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-09-05 10:53 ` Arnd Bergmann @ 2016-09-05 19:07 ` Martin Blumenstingl 2016-09-06 9:37 ` Arnd Bergmann 0 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-05 19:07 UTC (permalink / raw) To: Arnd Bergmann Cc: kbuild test robot, kbuild-all-JC7UmRfGjtg, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, davem-fT/PcQaiUtIeIZ0/mPfg9Q On Mon, Sep 5, 2016 at 12:53 PM, Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org> wrote: > On Monday, September 5, 2016 9:37:29 AM CEST kbuild test robot wrote: >> All error/warnings (new ones prefixed by >>): >> >> >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:63:18: error: field 'm250_mux' has incomplete type >> struct clk_mux m250_mux; >> ^ >> >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:67:21: error: field 'm250_div' has incomplete type >> struct clk_divider m250_div; >> ^ >> > > I think this needs a compile-time dependency on COMMON_CLK indeed, since we are also a clock provider we have to depend on CONFIG_COMMON_CLK. That brings up a question though: so far the new driver uses the same Kconfig symbol as the "old" driver (CONFIG_DWMAC_MESON). The "old" driver does not need CONFIG_COMMON_CLK while the new one does. I see a few options here: 1. simply adding the dependency (as most configurations will have CONFIG_COMMON_CLK enabled anyways) 2. add some depends on COMMON_CLK || MACH_MESON6 || MACH_MESON8 foo 3. use a new Kconfig symbol for new new driver (CONFIG_DWMAC_MESON8B?) And finally regarding your other mail: I have already changed WARN_ON(PTR_ERR_OR_ZERO(...)) to WARN_ON(IS_ERR(...)) in v4 Regards, Martin -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-09-05 19:07 ` Martin Blumenstingl @ 2016-09-06 9:37 ` Arnd Bergmann 0 siblings, 0 replies; 52+ messages in thread From: Arnd Bergmann @ 2016-09-06 9:37 UTC (permalink / raw) To: Martin Blumenstingl Cc: kbuild test robot, kbuild-all, linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, davem On Monday, September 5, 2016 9:07:03 PM CEST Martin Blumenstingl wrote: > On Mon, Sep 5, 2016 at 12:53 PM, Arnd Bergmann <arnd@arndb.de> wrote: > > On Monday, September 5, 2016 9:37:29 AM CEST kbuild test robot wrote: > >> All error/warnings (new ones prefixed by >>): > >> > >> >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:63:18: error: field 'm250_mux' has incomplete type > >> struct clk_mux m250_mux; > >> ^ > >> >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:67:21: error: field 'm250_div' has incomplete type > >> struct clk_divider m250_div; > >> ^ > >> > > > > I think this needs a compile-time dependency on COMMON_CLK > indeed, since we are also a clock provider we have to depend on > CONFIG_COMMON_CLK. > > That brings up a question though: > so far the new driver uses the same Kconfig symbol as the "old" driver > (CONFIG_DWMAC_MESON). > The "old" driver does not need CONFIG_COMMON_CLK while the new one does. > I see a few options here: > 1. simply adding the dependency (as most configurations will have > CONFIG_COMMON_CLK enabled anyways) I think that's fine. At least on both ARM multiplatform and ARM64 it is always defined by definition, and when build testing, it should be possible to enable it on other architectures as well. > 2. add some depends on COMMON_CLK || MACH_MESON6 || MACH_MESON8 foo That doesn't work unless you also put the calls into the clk interface inside of ugly #ifdef > 3. use a new Kconfig symbol for new new driver (CONFIG_DWMAC_MESON8B?) That would be ok as well, probably not necessary. > And finally regarding your other mail: I have already changed > WARN_ON(PTR_ERR_OR_ZERO(...)) to WARN_ON(IS_ERR(...)) in v4 Ok, thanks. Arnd ^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC 2016-09-04 18:23 ` [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl [not found] ` <20160904182320.671-5-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-09-05 1:43 ` kbuild test robot 1 sibling, 0 replies; 52+ messages in thread From: kbuild test robot @ 2016-09-05 1:43 UTC (permalink / raw) Cc: kbuild-all, linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, davem, Martin Blumenstingl [-- Attachment #1: Type: text/plain, Size: 5822 bytes --] Hi Martin, [auto build test ERROR on next-20160825] [also build test ERROR on v4.8-rc5] [cannot apply to robh/for-next net-next/master net/master v4.8-rc4 v4.8-rc3 v4.8-rc2] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] [Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on] [Check https://git-scm.com/docs/git-format-patch for more information] url: https://github.com/0day-ci/linux/commits/Martin-Blumenstingl/meson-Meson8b-and-GXBB-DWMAC-glue-driver/20160905-023130 config: tile-allyesconfig (attached as .config) compiler: tilegx-linux-gcc (GCC) 4.6.2 reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=tile All errors (new ones prefixed by >>): drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:63:18: error: field 'm250_mux' has incomplete type drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:67:21: error: field 'm250_div' has incomplete type drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:70:21: error: field 'm25_div' has incomplete type drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c: In function 'meson8b_init_clk': drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:88:23: error: storage size of 'init' isn't known >> drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:94:30: error: array type has incomplete element type drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:3: error: field name not in record or union initializer drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:3: error: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:3: error: field name not in record or union initializer drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:95:3: error: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:3: error: field name not in record or union initializer drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:3: error: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:3: error: field name not in record or union initializer drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:96:3: error: (near initialization for 'clk_25m_div_table') drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:114:4: error: implicit declaration of function '__clk_get_name' drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:113:23: warning: assignment makes pointer from integer without a cast [enabled by default] drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:120:14: error: 'clk_mux_ops' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:120:14: note: each undeclared identifier is reported only once for each function it appears in drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:132:2: error: implicit declaration of function 'devm_clk_register' drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:139:14: error: 'clk_divider_ops' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:140:15: error: 'CLK_SET_RATE_PARENT' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:141:21: warning: assignment makes pointer from integer without a cast [enabled by default] drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:149:26: error: 'CLK_DIVIDER_ONE_BASED' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:149:50: error: 'CLK_DIVIDER_ALLOW_ZERO' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:159:15: error: 'CLK_IS_BASIC' undeclared (first use in this function) drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:160:21: warning: assignment makes pointer from integer without a cast [enabled by default] drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:94:30: warning: unused variable 'clk_25m_div_table' drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c:88:23: warning: unused variable 'init' cc1: some warnings being treated as errors vim +94 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c 57 struct platform_device *pdev; 58 59 void __iomem *regs; 60 61 phy_interface_t phy_mode; 62 > 63 struct clk_mux m250_mux; 64 struct clk *m250_mux_clk; 65 struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; 66 67 struct clk_divider m250_div; 68 struct clk *m250_div_clk; 69 70 struct clk_divider m25_div; 71 struct clk *m25_div_clk; 72 }; 73 74 static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, 75 u32 mask, u32 value) 76 { 77 u32 data; 78 79 data = readl(dwmac->regs + reg); 80 data &= ~mask; 81 data |= (value & mask); 82 83 writel(data, dwmac->regs + reg); 84 } 85 86 static int meson8b_init_clk(struct meson8b_dwmac *dwmac) 87 { 88 struct clk_init_data init; 89 int i, ret; 90 struct device *dev = &dwmac->pdev->dev; 91 char clk_name[32]; 92 const char *clk_div_parents[1]; 93 const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; > 94 static struct clk_div_table clk_25m_div_table[] = { 95 { .val = 0, .div = 5 }, 96 { .val = 1, .div = 10 }, 97 { /* sentinel */ }, --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/octet-stream, Size: 45742 bytes --] ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver [not found] ` <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-04 18:23 ` [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl @ 2016-09-06 21:38 ` Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 1/6] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl ` (3 more replies) 1 sibling, 4 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, b.galvani-Re5JQEeQqe8AvxtiuMwx3w, Martin Blumenstingl This adds a DWMAC glue driver for the PRG_ETHERNET registers found in Meson8b and GXBB SoCs. Based on the "old" meson6b-dwmac glue driver the register layout is completely different. Thus I introduced a separate driver. Changes since v4: - DWMAC_MESON now depends on COMMON_CLK because the new glue driver is also a clock provider (which requires COMMON_CLK) - use Meson8b and GXBB in the module description (instead of the marketing names S805 and S905) - fixed a trivial typo (retrive -> retrieve) in the get_stmmac_bsp_priv() helper patch - added a new patch to update the module description of the dwmac-meson driver to indicate which SoCs are supported exactly (this patch is optional and does not affect the rest of the series) Joachim Eastwood (1): stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl (5): net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings clk: gxbb: expose MPLL2 clock for use by DT net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver net: stmmac: update the module description of the dwmac-meson driver .../devicetree/bindings/net/meson-dwmac.txt | 45 ++- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +- drivers/clk/meson/gxbb.h | 2 +- drivers/net/ethernet/stmicro/stmmac/Kconfig | 6 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c | 4 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 324 +++++++++++++++++++++ .../net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 + include/dt-bindings/clock/gxbb-clkc.h | 1 + 9 files changed, 382 insertions(+), 18 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v5 1/6] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings 2016-09-06 21:38 ` [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl @ 2016-09-06 21:38 ` Martin Blumenstingl [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> ` (2 subsequent siblings) 3 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, davem, b.galvani, Martin Blumenstingl This patch adds the documentation for the DWMAC ethernet controller found in Amlogic Meson 8b (S805) and GXBB (S905) SoCs. The main difference between the Meson6 glue is that different registers (with different layout) are used. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Acked-by: Rob Herring <robh@kernel.org> Acked-by: David S. Miller <davem@davemloft.net> --- .../devicetree/bindings/net/meson-dwmac.txt | 45 ++++++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt index ec633d7..89e62dd 100644 --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt @@ -1,18 +1,32 @@ * Amlogic Meson DWMAC Ethernet controller The device inherits all the properties of the dwmac/stmmac devices -described in the file net/stmmac.txt with the following changes. +described in the file stmmac.txt in the current directory with the +following changes. -Required properties: +Required properties on all platforms: -- compatible: should be "amlogic,meson6-dwmac" along with "snps,dwmac" - and any applicable more detailed version number - described in net/stmmac.txt +- compatible: Depending on the platform this should be one of: + - "amlogic,meson6-dwmac" + - "amlogic,meson8b-dwmac" + - "amlogic,meson-gxbb-dwmac" + Additionally "snps,dwmac" and any applicable more + detailed version number described in net/stmmac.txt + should be used. -- reg: should contain a register range for the dwmac controller and - another one for the Amlogic specific configuration +- reg: The first register range should be the one of the DWMAC + controller. The second range is is for the Amlogic specific + configuration (for example the PRG_ETHERNET register range + on Meson8b and newer) -Example: +Required properties on Meson8b and newer: +- clock-names: Should contain the following: + - "stmmaceth" - see stmmac.txt + - "clkin0" - first parent clock of the internal mux + - "clkin1" - second parent clock of the internal mux + + +Example for Meson6: ethmac: ethernet@c9410000 { compatible = "amlogic,meson6-dwmac", "snps,dwmac"; @@ -23,3 +37,18 @@ Example: clocks = <&clk81>; clock-names = "stmmaceth"; } + +Example for GXBB: + ethmac: ethernet@c9410000 { + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; + reg = <0x0 0xc9410000 0x0 0x10000>, + <0x0 0xc8834540 0x0 0x8>; + interrupts = <0 8 1>; + interrupt-names = "macirq"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; + phy-mode = "rgmii"; + status = "disabled"; + }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
[parent not found: <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>]
* [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-09-06 21:38 ` Martin Blumenstingl 2016-09-07 21:27 ` Stephen Boyd 2016-09-06 21:38 ` [PATCH v5 3/6] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 4/6] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2 siblings, 1 reply; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, b.galvani-Re5JQEeQqe8AvxtiuMwx3w, Martin Blumenstingl This exposes the MPLL2 clock as this is one of the input clocks of the ethernet controller's internal mux. Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> --- drivers/clk/meson/gxbb.h | 2 +- include/dt-bindings/clock/gxbb-clkc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h index 217df51..3606e875 100644 --- a/drivers/clk/meson/gxbb.h +++ b/drivers/clk/meson/gxbb.h @@ -183,7 +183,7 @@ /* CLKID_CLK81 */ #define CLKID_MPLL0 13 #define CLKID_MPLL1 14 -#define CLKID_MPLL2 15 +/* CLKID_MPLL2 */ #define CLKID_DDR 16 #define CLKID_DOS 17 #define CLKID_ISA 18 diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h index 7d41864..244ea6e 100644 --- a/include/dt-bindings/clock/gxbb-clkc.h +++ b/include/dt-bindings/clock/gxbb-clkc.h @@ -8,6 +8,7 @@ #define CLKID_CPUCLK 1 #define CLKID_FCLK_DIV2 4 #define CLKID_CLK81 12 +#define CLKID_MPLL2 15 #define CLKID_ETH 36 #define CLKID_SD_EMMC_A 94 #define CLKID_SD_EMMC_B 95 -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* Re: [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT 2016-09-06 21:38 ` [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl @ 2016-09-07 21:27 ` Stephen Boyd 0 siblings, 0 replies; 52+ messages in thread From: Stephen Boyd @ 2016-09-07 21:27 UTC (permalink / raw) To: Martin Blumenstingl Cc: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue, robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, manabian, arnd, davem, b.galvani On 09/06, Martin Blumenstingl wrote: > This exposes the MPLL2 clock as this is one of the input clocks of the > ethernet controller's internal mux. > > Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> > --- Acked-by: Stephen Boyd <sboyd@codeaurora.org> -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH v5 3/6] stmmac: introduce get_stmmac_bsp_priv() helper [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-06 21:38 ` [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl @ 2016-09-06 21:38 ` Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 4/6] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, b.galvani-Re5JQEeQqe8AvxtiuMwx3w From: Joachim Eastwood <manabian-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Create a helper to retrieve dwmac private data from a dev pointer. This is useful in PM callbacks and driver remove. Signed-off-by: Joachim Eastwood <manabian-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Tested-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Acked-by: David S. Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> --- drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h index ffeb8d9..64e147f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h @@ -30,4 +30,12 @@ int stmmac_get_platform_resources(struct platform_device *pdev, int stmmac_pltfr_remove(struct platform_device *pdev); extern const struct dev_pm_ops stmmac_pltfr_pm_ops; +static inline void *get_stmmac_bsp_priv(struct device *dev) +{ + struct net_device *ndev = dev_get_drvdata(dev); + struct stmmac_priv *priv = netdev_priv(ndev); + + return priv->plat->bsp_priv; +} + #endif /* __STMMAC_PLATFORM_H__ */ -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v5 4/6] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-06 21:38 ` [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 3/6] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl @ 2016-09-06 21:38 ` Martin Blumenstingl 2 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, khilman-rdvid1DuHRBWk0Htik3J/w, carlo-KA+7E9HrN00dnm+yROfE0A, mturquette-rdvid1DuHRBWk0Htik3J/w, peppe.cavallaro-qxv4g6HH51o, alexandre.torgue-qxv4g6HH51o Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8, netdev-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, sboyd-sgV2jX0FEOL9JmXXK+q4OQ, manabian-Re5JQEeQqe8AvxtiuMwx3w, arnd-r2nGTMty4D4, davem-fT/PcQaiUtIeIZ0/mPfg9Q, b.galvani-Re5JQEeQqe8AvxtiuMwx3w, Martin Blumenstingl The Ethernet controller available in Meson8b and GXBB SoCs is a Synopsys DesignWare MAC IP core which is already supported by the stmmac driver. In addition to the standard stmmac driver some Meson8b / GXBB specific registers have to be configured for the PHY clocks. These SoC specific registers are called PRG_ETHERNET_ADDR0 and PRG_ETHERNET_ADDR1 in the datasheet. These registers are not backwards compatible with those on Meson 6b, which is why a new glue driver is introduced. This worked for many boards because the bootloader programs the PRG_ETHERNET registers correctly. Additionally the meson6-dwmac driver only sets bit 1 of PRG_ETHERNET_ADDR0 which (according to the datasheet) is only used during reset. Currently all configuration values can be determined automatically, based on the configured phy-mode (which is mandatory for the stmmac driver). If required the tx-delay and the mux clock (so it supports the MPLL2 clock as well) can be made configurable in the future. Signed-off-by: Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Tested-by: Kevin Hilman <khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org> Acked-by: David S. Miller <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org> --- drivers/net/ethernet/stmicro/stmmac/Kconfig | 6 +- drivers/net/ethernet/stmicro/stmmac/Makefile | 2 +- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 324 +++++++++++++++++++++ 3 files changed, 328 insertions(+), 4 deletions(-) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig index 8f06a66..54de175 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Kconfig +++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig @@ -61,13 +61,13 @@ config DWMAC_LPC18XX config DWMAC_MESON tristate "Amlogic Meson dwmac support" default ARCH_MESON - depends on OF && (ARCH_MESON || COMPILE_TEST) + depends on OF && COMMON_CLK && (ARCH_MESON || COMPILE_TEST) 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 Meson6 and - Meson8 SoCs. + the stmmac device driver. This driver is used for Meson6, + Meson8, Meson8b and GXBB SoCs. config DWMAC_ROCKCHIP tristate "Rockchip dwmac support" diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index 44b630c..f77edb9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -9,7 +9,7 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o \ obj-$(CONFIG_STMMAC_PLATFORM) += stmmac-platform.o obj-$(CONFIG_DWMAC_IPQ806X) += dwmac-ipq806x.o obj-$(CONFIG_DWMAC_LPC18XX) += dwmac-lpc18xx.o -obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o +obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c new file mode 100644 index 0000000..250e4ce --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c @@ -0,0 +1,324 @@ +/* + * Amlogic Meson8b and GXBB DWMAC glue layer + * + * Copyright (C) 2016 Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/ethtool.h> +#include <linux/io.h> +#include <linux/ioport.h> +#include <linux/module.h> +#include <linux/of_net.h> +#include <linux/mfd/syscon.h> +#include <linux/platform_device.h> +#include <linux/stmmac.h> + +#include "stmmac_platform.h" + +#define PRG_ETH0 0x0 + +#define PRG_ETH0_RGMII_MODE BIT(0) + +/* mux to choose between fclk_div2 (bit unset) and mpll2 (bit set) */ +#define PRG_ETH0_CLK_M250_SEL_SHIFT 4 +#define PRG_ETH0_CLK_M250_SEL_MASK GENMASK(4, 4) + +#define PRG_ETH0_TXDLY_SHIFT 5 +#define PRG_ETH0_TXDLY_MASK GENMASK(6, 5) +#define PRG_ETH0_TXDLY_OFF (0x0 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_QUARTER (0x1 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_HALF (0x2 << PRG_ETH0_TXDLY_SHIFT) +#define PRG_ETH0_TXDLY_THREE_QUARTERS (0x3 << PRG_ETH0_TXDLY_SHIFT) + +/* divider for the result of m250_sel */ +#define PRG_ETH0_CLK_M250_DIV_SHIFT 7 +#define PRG_ETH0_CLK_M250_DIV_WIDTH 3 + +/* divides the result of m25_sel by either 5 (bit unset) or 10 (bit set) */ +#define PRG_ETH0_CLK_M25_DIV_SHIFT 10 +#define PRG_ETH0_CLK_M25_DIV_WIDTH 1 + +#define PRG_ETH0_INVERTED_RMII_CLK BIT(11) +#define PRG_ETH0_TX_AND_PHY_REF_CLK BIT(12) + +#define MUX_CLK_NUM_PARENTS 2 + +struct meson8b_dwmac { + struct platform_device *pdev; + + void __iomem *regs; + + phy_interface_t phy_mode; + + struct clk_mux m250_mux; + struct clk *m250_mux_clk; + struct clk *m250_mux_parent[MUX_CLK_NUM_PARENTS]; + + struct clk_divider m250_div; + struct clk *m250_div_clk; + + struct clk_divider m25_div; + struct clk *m25_div_clk; +}; + +static void meson8b_dwmac_mask_bits(struct meson8b_dwmac *dwmac, u32 reg, + u32 mask, u32 value) +{ + u32 data; + + data = readl(dwmac->regs + reg); + data &= ~mask; + data |= (value & mask); + + writel(data, dwmac->regs + reg); +} + +static int meson8b_init_clk(struct meson8b_dwmac *dwmac) +{ + struct clk_init_data init; + int i, ret; + struct device *dev = &dwmac->pdev->dev; + char clk_name[32]; + const char *clk_div_parents[1]; + const char *mux_parent_names[MUX_CLK_NUM_PARENTS]; + static struct clk_div_table clk_25m_div_table[] = { + { .val = 0, .div = 5 }, + { .val = 1, .div = 10 }, + { /* sentinel */ }, + }; + + /* get the mux parents from DT */ + for (i = 0; i < MUX_CLK_NUM_PARENTS; i++) { + char name[16]; + + snprintf(name, sizeof(name), "clkin%d", i); + dwmac->m250_mux_parent[i] = devm_clk_get(dev, name); + if (IS_ERR(dwmac->m250_mux_parent[i])) { + ret = PTR_ERR(dwmac->m250_mux_parent[i]); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Missing clock %s\n", name); + return ret; + } + + mux_parent_names[i] = + __clk_get_name(dwmac->m250_mux_parent[i]); + } + + /* create the m250_mux */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_sel", dev_name(dev)); + init.name = clk_name; + init.ops = &clk_mux_ops; + init.flags = 0; + init.parent_names = mux_parent_names; + init.num_parents = MUX_CLK_NUM_PARENTS; + + dwmac->m250_mux.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_mux.shift = PRG_ETH0_CLK_M250_SEL_SHIFT; + dwmac->m250_mux.mask = PRG_ETH0_CLK_M250_SEL_MASK; + dwmac->m250_mux.flags = 0; + dwmac->m250_mux.table = NULL; + dwmac->m250_mux.hw.init = &init; + + dwmac->m250_mux_clk = devm_clk_register(dev, &dwmac->m250_mux.hw); + if (WARN_ON(IS_ERR(dwmac->m250_mux_clk))) + return PTR_ERR(dwmac->m250_mux_clk); + + /* create the m250_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m250_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_mux_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m250_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m250_div.shift = PRG_ETH0_CLK_M250_DIV_SHIFT; + dwmac->m250_div.width = PRG_ETH0_CLK_M250_DIV_WIDTH; + dwmac->m250_div.hw.init = &init; + dwmac->m250_div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m250_div_clk = devm_clk_register(dev, &dwmac->m250_div.hw); + if (WARN_ON(IS_ERR(dwmac->m250_div_clk))) + return PTR_ERR(dwmac->m250_div_clk); + + /* create the m25_div */ + snprintf(clk_name, sizeof(clk_name), "%s#m25_div", dev_name(dev)); + init.name = devm_kstrdup(dev, clk_name, GFP_KERNEL); + init.ops = &clk_divider_ops; + init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT; + clk_div_parents[0] = __clk_get_name(dwmac->m250_div_clk); + init.parent_names = clk_div_parents; + init.num_parents = ARRAY_SIZE(clk_div_parents); + + dwmac->m25_div.reg = dwmac->regs + PRG_ETH0; + dwmac->m25_div.shift = PRG_ETH0_CLK_M25_DIV_SHIFT; + dwmac->m25_div.width = PRG_ETH0_CLK_M25_DIV_WIDTH; + dwmac->m25_div.table = clk_25m_div_table; + dwmac->m25_div.hw.init = &init; + dwmac->m25_div.flags = CLK_DIVIDER_ALLOW_ZERO; + + dwmac->m25_div_clk = devm_clk_register(dev, &dwmac->m25_div.hw); + if (WARN_ON(IS_ERR(dwmac->m25_div_clk))) + return PTR_ERR(dwmac->m25_div_clk); + + return 0; +} + +static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) +{ + int ret; + unsigned long clk_rate; + + switch (dwmac->phy_mode) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + /* Generate a 25MHz clock for the PHY */ + clk_rate = 25 * 1000 * 1000; + + /* enable RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + PRG_ETH0_RGMII_MODE); + + /* only relevant for RMII mode -> disable in RGMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, 0); + + /* TX clock delay - all known boards use a 1/4 cycle delay */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + PRG_ETH0_TXDLY_QUARTER); + break; + + case PHY_INTERFACE_MODE_RMII: + /* Use the rate of the mux clock for the internal RMII PHY */ + clk_rate = clk_get_rate(dwmac->m250_mux_clk); + + /* disable RGMII mode -> enables RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_RGMII_MODE, + 0); + + /* invert internal clk_rmii_i to generate 25/2.5 tx_rx_clk */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, + PRG_ETH0_INVERTED_RMII_CLK, + PRG_ETH0_INVERTED_RMII_CLK); + + /* TX clock delay cannot be configured in RMII mode */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TXDLY_MASK, + 0); + + break; + + default: + dev_err(&dwmac->pdev->dev, "unsupported phy-mode %s\n", + phy_modes(dwmac->phy_mode)); + return -EINVAL; + } + + ret = clk_prepare_enable(dwmac->m25_div_clk); + if (ret) { + dev_err(&dwmac->pdev->dev, "failed to enable the PHY clock\n"); + return ret; + } + + ret = clk_set_rate(dwmac->m25_div_clk, clk_rate); + if (ret) { + clk_disable_unprepare(dwmac->m25_div_clk); + + dev_err(&dwmac->pdev->dev, "failed to set PHY clock\n"); + return ret; + } + + /* enable TX_CLK and PHY_REF_CLK generator */ + meson8b_dwmac_mask_bits(dwmac, PRG_ETH0, PRG_ETH0_TX_AND_PHY_REF_CLK, + PRG_ETH0_TX_AND_PHY_REF_CLK); + + return 0; +} + +static int meson8b_dwmac_probe(struct platform_device *pdev) +{ + struct plat_stmmacenet_data *plat_dat; + struct stmmac_resources stmmac_res; + struct resource *res; + struct meson8b_dwmac *dwmac; + int ret; + + ret = stmmac_get_platform_resources(pdev, &stmmac_res); + if (ret) + return ret; + + plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); + if (IS_ERR(plat_dat)) + return PTR_ERR(plat_dat); + + dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); + if (!dwmac) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + dwmac->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(dwmac->regs)) + return PTR_ERR(dwmac->regs); + + dwmac->pdev = pdev; + dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); + if (dwmac->phy_mode < 0) { + dev_err(&pdev->dev, "missing phy-mode property\n"); + return -EINVAL; + } + + ret = meson8b_init_clk(dwmac); + if (ret) + return ret; + + ret = meson8b_init_prg_eth(dwmac); + if (ret) + return ret; + + plat_dat->bsp_priv = dwmac; + + return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); +} + +static int meson8b_dwmac_remove(struct platform_device *pdev) +{ + struct meson8b_dwmac *dwmac = get_stmmac_bsp_priv(&pdev->dev); + + clk_disable_unprepare(dwmac->m25_div_clk); + + return stmmac_pltfr_remove(pdev); +} + +static const struct of_device_id meson8b_dwmac_match[] = { + { .compatible = "amlogic,meson8b-dwmac" }, + { .compatible = "amlogic,meson-gxbb-dwmac" }, + { } +}; +MODULE_DEVICE_TABLE(of, meson8b_dwmac_match); + +static struct platform_driver meson8b_dwmac_driver = { + .probe = meson8b_dwmac_probe, + .remove = meson8b_dwmac_remove, + .driver = { + .name = "meson8b-dwmac", + .pm = &stmmac_pltfr_pm_ops, + .of_match_table = meson8b_dwmac_match, + }, +}; +module_platform_driver(meson8b_dwmac_driver); + +MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>"); +MODULE_DESCRIPTION("Amlogic Meson8b and GXBB DWMAC glue layer"); +MODULE_LICENSE("GPL v2"); -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v5 5/6] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver 2016-09-06 21:38 ` [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 1/6] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> @ 2016-09-06 21:38 ` Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 6/6] net: stmmac: update the module description of the dwmac-meson driver Martin Blumenstingl 3 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, davem, b.galvani, Martin Blumenstingl The Amlogic reference driver uses the "mc_val" devicetree property to configure the PRG_ETHERNET_ADDR0 register. Unfortunately it uses magic values for this configuration. According to the datasheet the PRG_ETHERNET_ADDR0 register is at address 0xc8834108. However, the reference driver uses 0xc8834540 instead. According to my tests, the value from the reference driver is correct. No changes are required to the board dts files because the only required configuration option is the phy-mode, which had to be configured correctly before as well. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi index 2b47415..2e8a3d9 100644 --- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi @@ -497,13 +497,15 @@ }; ethmac: ethernet@c9410000 { - compatible = "amlogic,meson6-dwmac", "snps,dwmac"; + compatible = "amlogic,meson-gxbb-dwmac", "snps,dwmac"; reg = <0x0 0xc9410000 0x0 0x10000 0x0 0xc8834540 0x0 0x4>; interrupts = <0 8 1>; interrupt-names = "macirq"; - clocks = <&clkc CLKID_ETH>; - clock-names = "stmmaceth"; + clocks = <&clkc CLKID_ETH>, + <&clkc CLKID_FCLK_DIV2>, + <&clkc CLKID_MPLL2>; + clock-names = "stmmaceth", "clkin0", "clkin1"; phy-mode = "rgmii"; status = "disabled"; }; -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
* [PATCH v5 6/6] net: stmmac: update the module description of the dwmac-meson driver 2016-09-06 21:38 ` [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl ` (2 preceding siblings ...) 2016-09-06 21:38 ` [PATCH v5 5/6] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl @ 2016-09-06 21:38 ` Martin Blumenstingl 3 siblings, 0 replies; 52+ messages in thread From: Martin Blumenstingl @ 2016-09-06 21:38 UTC (permalink / raw) To: linux-amlogic, khilman, carlo, mturquette, peppe.cavallaro, alexandre.torgue Cc: robh+dt, mark.rutland, catalin.marinas, will.deacon, netdev, devicetree, linux-arm-kernel, sboyd, manabian, arnd, davem, b.galvani, Martin Blumenstingl The dwmac-meson glue driver supports Meson6 and Meson8 SoCs. Newer SoCs are supported by the dwmac-meson8b driver. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> --- drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c index c1bac19..309d995 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c @@ -1,5 +1,5 @@ /* - * Amlogic Meson DWMAC glue layer + * Amlogic Meson6 and Meson8 DWMAC glue layer * * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com> * @@ -96,5 +96,5 @@ static struct platform_driver meson6_dwmac_driver = { module_platform_driver(meson6_dwmac_driver); MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>"); -MODULE_DESCRIPTION("Amlogic Meson DWMAC glue layer"); +MODULE_DESCRIPTION("Amlogic Meson6 and Meson8 DWMAC glue layer"); MODULE_LICENSE("GPL v2"); -- 2.9.3 ^ permalink raw reply related [flat|nested] 52+ messages in thread
end of thread, other threads:[~2016-09-07 21:27 UTC | newest] Thread overview: 52+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20160625165013.15917-1-martin.blumenstingl@googlemail.com> 2016-08-15 16:40 ` [PATCH 0/3] ARM64: meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 2016-08-15 16:40 ` [PATCH 1/3] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-08-16 14:25 ` Rob Herring 2016-08-15 16:40 ` [PATCH 2/3] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2016-08-19 21:40 ` Kevin Hilman 2016-08-15 16:41 ` [PATCH 3/3] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 0/4] meson: Meson8b and " Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 1/4] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl [not found] ` <20160820093538.9707-2-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-22 11:55 ` Arnd Bergmann 2016-08-22 12:04 ` Martin Blumenstingl 2016-08-22 15:25 ` Arnd Bergmann 2016-08-28 16:15 ` Martin Blumenstingl 2016-08-29 13:31 ` Arnd Bergmann 2016-08-20 9:35 ` [PATCH v2 2/4] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl 2016-08-20 9:35 ` [PATCH v2 3/4] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2016-08-20 21:29 ` Joachim Eastwood [not found] ` <CAGhQ9VyWs=sYg7PVrt5r-fM-2t--qAnHyvNXAZXwjkYn5P196g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2016-08-21 12:00 ` Martin Blumenstingl [not found] ` <20160820093538.9707-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-20 9:35 ` [PATCH v2 4/4] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 0/5] meson: Meson8b and " Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl [not found] ` <20160828161637.9941-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-08-28 16:16 ` [PATCH v3 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 3/5] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl 2016-08-28 16:16 ` [PATCH v3 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2016-08-30 19:19 ` Stephen Boyd [not found] ` <20160830191906.GD12510-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 2016-09-04 18:20 ` Martin Blumenstingl [not found] ` <CAFBinCCVUhUVyceGc2capcCPOK8MTsn+RcC9gnrtMVvZUENXtQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2016-09-05 9:27 ` Arnd Bergmann 2016-08-28 16:16 ` [PATCH v3 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl 2016-08-29 3:40 ` [PATCH v3 0/5] meson: Meson8b and " David Miller 2016-08-30 18:49 ` Martin Blumenstingl [not found] ` <CAFBinCCmg-+8mjd0Xc5c7bEWL9_S_4kizs_UMiiW9ATBH_G8iw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2016-08-31 4:57 ` David Miller 2016-09-02 4:23 ` Kevin Hilman 2016-09-02 5:37 ` David Miller 2016-09-02 8:50 ` Arnd Bergmann 2016-09-04 18:23 ` [PATCH v4 " Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 1/5] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 2/5] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 3/5] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl 2016-09-04 18:23 ` [PATCH v4 5/5] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl [not found] ` <20160904182320.671-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-04 18:23 ` [PATCH v4 4/5] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl [not found] ` <20160904182320.671-5-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-05 1:37 ` kbuild test robot 2016-09-05 10:53 ` Arnd Bergmann 2016-09-05 19:07 ` Martin Blumenstingl 2016-09-06 9:37 ` Arnd Bergmann 2016-09-05 1:43 ` kbuild test robot 2016-09-06 21:38 ` [PATCH v5 0/6] meson: Meson8b and GXBB DWMAC glue driver Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 1/6] net: dt-bindings: Document the new Meson8b and GXBB DWMAC bindings Martin Blumenstingl [not found] ` <20160906213848.17785-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> 2016-09-06 21:38 ` [PATCH v5 2/6] clk: gxbb: expose MPLL2 clock for use by DT Martin Blumenstingl 2016-09-07 21:27 ` Stephen Boyd 2016-09-06 21:38 ` [PATCH v5 3/6] stmmac: introduce get_stmmac_bsp_priv() helper Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 4/6] net: stmmac: add a glue driver for the Amlogic Meson 8b / GXBB DWMAC Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 5/6] ARM64: dts: meson-gxbb: use the new GXBB DWMAC glue driver Martin Blumenstingl 2016-09-06 21:38 ` [PATCH v5 6/6] net: stmmac: update the module description of the dwmac-meson driver Martin Blumenstingl
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).