* [PATCH v4 1/3] net: allwinner: reset control support
2022-01-11 16:05 [PATCH v4 0/3] sun8i: r40: second ethernet support Evgeny Boger
@ 2022-01-11 16:05 ` Evgeny Boger
2022-01-12 9:09 ` Corentin Labbe
2022-01-11 16:05 ` [PATCH v4 2/3] dt-bindings: net: support for Allwinner R40 EMAC controller Evgeny Boger
2022-01-11 16:06 ` [PATCH v4 3/3] ARM: dts: sun8i: r40: add second ethernet support Evgeny Boger
2 siblings, 1 reply; 6+ messages in thread
From: Evgeny Boger @ 2022-01-11 16:05 UTC (permalink / raw)
To: Maxime Ripard, Chen-Yu Tsai, linux-arm-kernel
Cc: Evgeny Boger, devicetree, Rob Herring, linux-sunxi
R40 (aka V40/A40i/T3) and A10/A20 share the same EMAC IP.
However, on R40 the EMAC reset needs to be deasserted.
Signed-off-by: Evgeny Boger <boger@wirenboard.com>
---
drivers/net/ethernet/allwinner/sun4i-emac.c | 64 +++++++++++++++++++--
1 file changed, 59 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c
index 800ee022388f..368597f0ff76 100644
--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
@@ -28,6 +28,7 @@
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/phy.h>
+#include <linux/reset.h>
#include <linux/soc/sunxi/sunxi_sram.h>
#include "sun4i-emac.h"
@@ -68,6 +69,15 @@ MODULE_PARM_DESC(watchdog, "transmit timeout in milliseconds");
* devices, EMACA and EMACB.
*/
+/**
+ * struct emac_quirks - Differences between SoC variants.
+ *
+ * @has_reset: SoC needs reset deasserted.
+ */
+struct emac_quirks {
+ bool has_reset;
+};
+
struct emac_board_info {
struct clk *clk;
struct device *dev;
@@ -85,6 +95,7 @@ struct emac_board_info {
unsigned int link;
unsigned int speed;
unsigned int duplex;
+ struct reset_control *reset;
phy_interface_t phy_interface;
};
@@ -790,6 +801,7 @@ static int emac_probe(struct platform_device *pdev)
struct emac_board_info *db;
struct net_device *ndev;
int ret = 0;
+ const struct emac_quirks *quirks;
ndev = alloc_etherdev(sizeof(struct emac_board_info));
if (!ndev) {
@@ -808,6 +820,13 @@ static int emac_probe(struct platform_device *pdev)
spin_lock_init(&db->lock);
+ quirks = of_device_get_match_data(&pdev->dev);
+ if (!quirks) {
+ dev_err(&pdev->dev, "Failed to determine the quirks to use\n");
+ ret = -ENODEV;
+ goto out;
+ }
+
db->membase = of_iomap(np, 0);
if (!db->membase) {
dev_err(&pdev->dev, "failed to remap registers\n");
@@ -824,16 +843,31 @@ static int emac_probe(struct platform_device *pdev)
goto out_iounmap;
}
+ if (quirks->has_reset) {
+ db->reset = devm_reset_control_get_exclusive(&pdev->dev, NULL);
+ if (IS_ERR(db->reset)) {
+ dev_err(&pdev->dev, "unable to request reset\n");
+ ret = PTR_ERR(db->reset);
+ goto out_dispose_mapping;
+ }
+
+ ret = reset_control_deassert(db->reset);
+ if (ret) {
+ dev_err(&pdev->dev, "could not deassert EMAC reset\n");
+ goto out_dispose_mapping;
+ }
+ }
+
db->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(db->clk)) {
ret = PTR_ERR(db->clk);
- goto out_dispose_mapping;
+ goto out_assert_reset;
}
ret = clk_prepare_enable(db->clk);
if (ret) {
dev_err(&pdev->dev, "Error couldn't enable clock (%d)\n", ret);
- goto out_dispose_mapping;
+ goto out_assert_reset;
}
ret = sunxi_sram_claim(&pdev->dev);
@@ -889,6 +923,8 @@ static int emac_probe(struct platform_device *pdev)
sunxi_sram_release(&pdev->dev);
out_clk_disable_unprepare:
clk_disable_unprepare(db->clk);
+out_assert_reset:
+ reset_control_assert(db->reset);
out_dispose_mapping:
irq_dispose_mapping(ndev->irq);
out_iounmap:
@@ -909,6 +945,7 @@ static int emac_remove(struct platform_device *pdev)
unregister_netdev(ndev);
sunxi_sram_release(&pdev->dev);
clk_disable_unprepare(db->clk);
+ reset_control_assert(db->reset);
irq_dispose_mapping(ndev->irq);
iounmap(db->membase);
free_netdev(ndev);
@@ -940,11 +977,28 @@ static int emac_resume(struct platform_device *dev)
return 0;
}
-static const struct of_device_id emac_of_match[] = {
- {.compatible = "allwinner,sun4i-a10-emac",},
+static const struct emac_quirks sun4i_a10_emac_quirks = {
+ .has_reset = false,
+};
+
+static const struct emac_quirks sun8i_r40_emac_quirks = {
+ .has_reset = true,
+};
+static const struct of_device_id emac_of_match[] = {
+ {
+ .compatible = "allwinner,sun4i-a10-emac",
+ .data = &sun4i_a10_emac_quirks
+ },
+ {
+ .compatible = "allwinner,sun8i-r40-emac",
+ .data = &sun8i_r40_emac_quirks
+ },
/* Deprecated */
- {.compatible = "allwinner,sun4i-emac",},
+ {
+ .compatible = "allwinner,sun4i-emac",
+ .data = &sun4i_a10_emac_quirks
+ },
{},
};
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/3] net: allwinner: reset control support
2022-01-11 16:05 ` [PATCH v4 1/3] net: allwinner: reset control support Evgeny Boger
@ 2022-01-12 9:09 ` Corentin Labbe
0 siblings, 0 replies; 6+ messages in thread
From: Corentin Labbe @ 2022-01-12 9:09 UTC (permalink / raw)
To: Evgeny Boger
Cc: Maxime Ripard, Chen-Yu Tsai, linux-arm-kernel, devicetree,
Rob Herring, linux-sunxi
Le Tue, Jan 11, 2022 at 07:05:58PM +0300, Evgeny Boger a écrit :
> R40 (aka V40/A40i/T3) and A10/A20 share the same EMAC IP.
> However, on R40 the EMAC reset needs to be deasserted.
>
> Signed-off-by: Evgeny Boger <boger@wirenboard.com>
> ---
> drivers/net/ethernet/allwinner/sun4i-emac.c | 64 +++++++++++++++++++--
> 1 file changed, 59 insertions(+), 5 deletions(-)
>
Hello
You need to rebase your patch, it does not apply cleanly anymore due to the dmaengine addition to sun4i-emac.
Regards
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 2/3] dt-bindings: net: support for Allwinner R40 EMAC controller
2022-01-11 16:05 [PATCH v4 0/3] sun8i: r40: second ethernet support Evgeny Boger
2022-01-11 16:05 ` [PATCH v4 1/3] net: allwinner: reset control support Evgeny Boger
@ 2022-01-11 16:05 ` Evgeny Boger
2022-01-12 9:04 ` Maxime Ripard
2022-01-11 16:06 ` [PATCH v4 3/3] ARM: dts: sun8i: r40: add second ethernet support Evgeny Boger
2 siblings, 1 reply; 6+ messages in thread
From: Evgeny Boger @ 2022-01-11 16:05 UTC (permalink / raw)
To: Maxime Ripard, Chen-Yu Tsai, linux-arm-kernel
Cc: Evgeny Boger, devicetree, Rob Herring, linux-sunxi
R40 and A10/A20 share the same EMAC IP.
However, on R40 the EMAC reset needs to be deasserted first,
so resets property is required.
Signed-off-by: Evgeny Boger <boger@wirenboard.com>
---
.../net/allwinner,sun4i-a10-emac.yaml | 20 ++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml b/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
index 8d8560a67abf..8b38b4e981fe 100644
--- a/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
+++ b/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
@@ -15,7 +15,9 @@ maintainers:
properties:
compatible:
- const: allwinner,sun4i-a10-emac
+ enum:
+ - allwinner,sun4i-a10-emac
+ - allwinner,sun8i-r40-emac
reg:
maxItems: 1
@@ -30,6 +32,19 @@ properties:
description: Phandle to the device SRAM
$ref: /schemas/types.yaml#/definitions/phandle-array
+ resets:
+ maxItems: 1
+
+if:
+ properties:
+ compatible:
+ contains:
+ const: allwinner,sun8i-r40-emac
+
+then:
+ required:
+ - resets
+
required:
- compatible
- reg
@@ -42,11 +57,14 @@ unevaluatedProperties: false
examples:
- |
+ #define RST_BUS_EMAC 14
+
emac: ethernet@1c0b000 {
compatible = "allwinner,sun4i-a10-emac";
reg = <0x01c0b000 0x1000>;
interrupts = <55>;
clocks = <&ahb_gates 17>;
+ resets = <&ccu RST_BUS_EMAC>;
phy-handle = <&phy0>;
allwinner,sram = <&emac_sram 1>;
};
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/3] dt-bindings: net: support for Allwinner R40 EMAC controller
2022-01-11 16:05 ` [PATCH v4 2/3] dt-bindings: net: support for Allwinner R40 EMAC controller Evgeny Boger
@ 2022-01-12 9:04 ` Maxime Ripard
0 siblings, 0 replies; 6+ messages in thread
From: Maxime Ripard @ 2022-01-12 9:04 UTC (permalink / raw)
To: Evgeny Boger
Cc: Chen-Yu Tsai, linux-arm-kernel, devicetree, Rob Herring, linux-sunxi
[-- Attachment #1: Type: text/plain, Size: 2006 bytes --]
Hi,
On Tue, Jan 11, 2022 at 07:05:59PM +0300, Evgeny Boger wrote:
> R40 and A10/A20 share the same EMAC IP.
> However, on R40 the EMAC reset needs to be deasserted first,
> so resets property is required.
>
> Signed-off-by: Evgeny Boger <boger@wirenboard.com>
> ---
> .../net/allwinner,sun4i-a10-emac.yaml | 20 ++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml b/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
> index 8d8560a67abf..8b38b4e981fe 100644
> --- a/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
> +++ b/Documentation/devicetree/bindings/net/allwinner,sun4i-a10-emac.yaml
> @@ -15,7 +15,9 @@ maintainers:
>
> properties:
> compatible:
> - const: allwinner,sun4i-a10-emac
> + enum:
> + - allwinner,sun4i-a10-emac
> + - allwinner,sun8i-r40-emac
>
> reg:
> maxItems: 1
> @@ -30,6 +32,19 @@ properties:
> description: Phandle to the device SRAM
> $ref: /schemas/types.yaml#/definitions/phandle-array
>
> + resets:
> + maxItems: 1
> +
> +if:
> + properties:
> + compatible:
> + contains:
> + const: allwinner,sun8i-r40-emac
> +
> +then:
> + required:
> + - resets
> +
> required:
> - compatible
> - reg
> @@ -42,11 +57,14 @@ unevaluatedProperties: false
>
> examples:
> - |
> + #define RST_BUS_EMAC 14
> +
> emac: ethernet@1c0b000 {
> compatible = "allwinner,sun4i-a10-emac";
> reg = <0x01c0b000 0x1000>;
> interrupts = <55>;
> clocks = <&ahb_gates 17>;
> + resets = <&ccu RST_BUS_EMAC>;
> phy-handle = <&phy0>;
> allwinner,sram = <&emac_sram 1>;
> };
The example doesn't make much sense now, since we can't have an A10
controller with the reset line.
Either leave it like it was, or create a new example
Maxime
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 3/3] ARM: dts: sun8i: r40: add second ethernet support
2022-01-11 16:05 [PATCH v4 0/3] sun8i: r40: second ethernet support Evgeny Boger
2022-01-11 16:05 ` [PATCH v4 1/3] net: allwinner: reset control support Evgeny Boger
2022-01-11 16:05 ` [PATCH v4 2/3] dt-bindings: net: support for Allwinner R40 EMAC controller Evgeny Boger
@ 2022-01-11 16:06 ` Evgeny Boger
2 siblings, 0 replies; 6+ messages in thread
From: Evgeny Boger @ 2022-01-11 16:06 UTC (permalink / raw)
To: Maxime Ripard, Chen-Yu Tsai, linux-arm-kernel
Cc: Evgeny Boger, devicetree, Rob Herring, linux-sunxi
R40 (aka V40, A40i, T3) has two different Ethernet IPs
called EMAC and GMAC. EMAC only support 10/100 Mbit in MII mode,
while GMAC support both 10/100 (MII) and 10/100/1000 (RGMII).
In contrast to A10/A20 where GMAC and EMAC share the same pins
making EMAC somewhat pointless, on R40 EMAC can be routed to port H.
Both EMAC (on port H) and GMAC (on port A) can be then enabled at
the same time, allowing for two ethernet ports.
Signed-off-by: Evgeny Boger <boger@wirenboard.com>
---
arch/arm/boot/dts/sun8i-r40.dtsi | 49 ++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/arch/arm/boot/dts/sun8i-r40.dtsi b/arch/arm/boot/dts/sun8i-r40.dtsi
index 1d87fc0c24ee..870d63fae1fc 100644
--- a/arch/arm/boot/dts/sun8i-r40.dtsi
+++ b/arch/arm/boot/dts/sun8i-r40.dtsi
@@ -217,6 +217,19 @@ syscon: system-control@1c00000 {
#size-cells = <1>;
ranges;
+ sram_a: sram@0 {
+ compatible = "mmio-sram";
+ reg = <0x00000000 0xc000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0x00000000 0xc000>;
+
+ emac_sram: sram-section@8000 {
+ compatible = "allwinner,sun4i-a10-sram-a3-a4";
+ reg = <0x8000 0x4000>;
+ };
+ };
+
sram_c: sram@1d00000 {
compatible = "mmio-sram";
reg = <0x01d00000 0xd0000>;
@@ -543,6 +556,24 @@ gmac_rgmii_pins: gmac-rgmii-pins {
drive-strength = <40>;
};
+ emac_pa_pins: emac-pa-pins {
+ pins = "PA0", "PA1", "PA2",
+ "PA3", "PA4", "PA5", "PA6",
+ "PA7", "PA8", "PA9", "PA10",
+ "PA11", "PA12", "PA13", "PA14",
+ "PA15", "PA16";
+ function = "emac";
+ };
+
+ emac_ph_pins: emac-ph-pins {
+ pins = "PH8", "PH9", "PH10", "PH11",
+ "PH14", "PH15", "PH16", "PH17",
+ "PH18","PH19", "PH20", "PH21",
+ "PH22", "PH23", "PH24", "PH25",
+ "PH26", "PH27";
+ function = "emac";
+ };
+
i2c0_pins: i2c0-pins {
pins = "PB0", "PB1";
function = "i2c0";
@@ -980,6 +1011,24 @@ gmac_mdio: mdio {
};
};
+ emac: ethernet@1c0b000 {
+ compatible = "allwinner,sun8i-r40-emac";
+ reg = <0x01c0b000 0x1000>;
+ interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_EMAC>;
+ resets = <&ccu RST_BUS_EMAC>;
+ allwinner,sram = <&emac_sram 1>;
+ status = "disabled";
+ };
+
+ emac_mdio: mdio@1c0b080 {
+ compatible = "allwinner,sun4i-a10-mdio";
+ reg = <0x01c0b080 0x14>;
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+
mbus: dram-controller@1c62000 {
compatible = "allwinner,sun8i-r40-mbus";
reg = <0x01c62000 0x1000>;
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread