[net-next,1/2,v10] net: ethernet: Add DT bindings for the Gemini ethernet

Message ID 20180109221053.927-1-linus.walleij@linaro.org
State New
Headers show
Series
  • [net-next,1/2,v10] net: ethernet: Add DT bindings for the Gemini ethernet
Related show

Commit Message

Linus Walleij Jan. 9, 2018, 10:10 p.m.
This adds the device tree bindings for the Gemini ethernet
controller. It is pretty straight-forward, using standard
bindings and modelling the two child ports as child devices
under the parent ethernet controller device.

Cc: devicetree@vger.kernel.org
Cc: Tobias Waldvogel <tobias.waldvogel@gmail.com>
Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v9->v10:
- Resend with the driver.
ChangeLog v8->v9:
- Collect Rob's ACK.
ChangeLog v7->v8:
- Use ethernet-port@0 and ethernet-port@1 with unit names
  and following OF graph requirements.
---
 .../bindings/net/cortina,gemini-ethernet.txt       | 92 ++++++++++++++++++++++
 1 file changed, 92 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt

Comments

David Miller Jan. 10, 2018, 8:40 p.m. | #1
From: Linus Walleij <linus.walleij@linaro.org>
Date: Tue,  9 Jan 2018 23:10:52 +0100

> This adds the device tree bindings for the Gemini ethernet
> controller. It is pretty straight-forward, using standard
> bindings and modelling the two child ports as child devices
> under the parent ethernet controller device.
> 
> Cc: devicetree@vger.kernel.org
> Cc: Tobias Waldvogel <tobias.waldvogel@gmail.com>
> Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Reviewed-by: Rob Herring <robh@kernel.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

Applied.
David Miller Jan. 10, 2018, 8:41 p.m. | #2
From: Linus Walleij <linus.walleij@linaro.org>
Date: Tue,  9 Jan 2018 23:10:53 +0100

> The Gemini ethernet has been around for years as an out-of-tree
> patch used with the NAS boxen and routers built on StorLink
> SL3512 and SL3516, later Storm Semiconductor, later Cortina
> Systems. These ASICs are still being deployed and brand new
> off-the-shelf systems using it can easily be acquired.
> 
> The full name of the IP block is "Net Engine and Gigabit
> Ethernet MAC" commonly just called "GMAC".
> 
> The hardware block contains a common TCP Offload Enginer (TOE)
> that can be used by both MACs. The current driver does not use
> it.
> 
> Cc: Tobias Waldvogel <tobias.waldvogel@gmail.com>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

Applied.
David Miller Jan. 10, 2018, 8:43 p.m. | #3
Actually I had to revert these two patches, this stuff doesn't even
build.

[davem@dhcp-10-15-49-227 net-next]$ make -s -j16
In file included from ./include/linux/printk.h:329:0,
                 from ./include/linux/kernel.h:14,
                 from ./include/linux/list.h:9,
                 from ./include/linux/module.h:9,
                 from drivers/net/ethernet/cortina/gemini.c:16:
drivers/net/ethernet/cortina/gemini.c: In function ‘geth_freeq_alloc_map_page’:
drivers/net/ethernet/cortina/gemini.c:821:21: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 5 has type ‘dma_addr_t {aka long long unsigned int}’ [-Wformat=]
  dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n",
                     ^
./include/linux/dynamic_debug.h:135:39: note: in definition of macro ‘dynamic_dev_dbg’
   __dynamic_dev_dbg(&descriptor, dev, fmt, \
                                       ^~~
drivers/net/ethernet/cortina/gemini.c:821:2: note: in expansion of macro ‘dev_dbg’
  dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n",
  ^~~~~~~
drivers/net/ethernet/cortina/gemini.c: In function ‘gmac_rx’:
drivers/net/ethernet/cortina/gemini.c:1410:50: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘dma_addr_t {aka long long unsigned int}’ [-Wformat=]
    dev_err(geth->dev, "could not find mapping %08x (page = %08x, page off = %08x)\n",
                                               ~~~^
                                               %08llx
drivers/net/ethernet/cortina/gemini.c:1410:63: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘long long unsigned int’ [-Wformat=]
    dev_err(geth->dev, "could not find mapping %08x (page = %08x, page off = %08x)\n",
                                                            ~~~^
                                                            %08llx
drivers/net/ethernet/cortina/gemini.c: In function ‘gemini_ethernet_port_probe’:
drivers/net/ethernet/cortina/gemini.c:2456:28: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘resource_size_t {aka long long unsigned int}’ [-Wformat=]
        "irq %d, DMA @ 0x%08x, GMAC @ 0x%08x\n",
                         ~~~^
                         %08llx
        port->irq, dmares->start,
                   ~~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2456:43: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 5 has type ‘resource_size_t {aka long long unsigned int}’ [-Wformat=]
        "irq %d, DMA @ 0x%08x, GMAC @ 0x%08x\n",
                                        ~~~^
                                        %08llx
drivers/net/ethernet/cortina/gemini.c:2458:8:
        gmacres->start);
        ~~~~~~~~~~~~~~                      
In file included from drivers/net/ethernet/cortina/gemini.c:16:0:
drivers/net/ethernet/cortina/gemini.c: At top level:
./include/linux/module.h:129:42: error: redefinition of ‘__inittest’
  static inline initcall_t __maybe_unused __inittest(void)  \
                                          ^
./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’
 module_init(__driver##_init); \
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:129:42: note: previous definition of ‘__inittest’ was here
  static inline initcall_t __maybe_unused __inittest(void)  \
                                          ^
./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’
 module_init(__driver##_init); \
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_port_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:131:6: error: redefinition of ‘init_module’
  int init_module(void) __attribute__((alias(#initfn)));
      ^
./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’
 module_init(__driver##_init); \
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:131:6: note: previous definition of ‘init_module’ was here
  int init_module(void) __attribute__((alias(#initfn)));
      ^
./include/linux/device.h:1513:1: note: in expansion of macro ‘module_init’
 module_init(__driver##_init); \
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_port_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:135:42: error: redefinition of ‘__exittest’
  static inline exitcall_t __maybe_unused __exittest(void)  \
                                          ^
./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’
 module_exit(__driver##_exit);
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:135:42: note: previous definition of ‘__exittest’ was here
  static inline exitcall_t __maybe_unused __exittest(void)  \
                                          ^
./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’
 module_exit(__driver##_exit);
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_port_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:137:7: error: redefinition of ‘cleanup_module’
  void cleanup_module(void) __attribute__((alias(#exitfn)));
       ^
./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’
 module_exit(__driver##_exit);
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2567:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
./include/linux/module.h:137:7: note: previous definition of ‘cleanup_module’ was here
  void cleanup_module(void) __attribute__((alias(#exitfn)));
       ^
./include/linux/device.h:1518:1: note: in expansion of macro ‘module_exit’
 module_exit(__driver##_exit);
 ^~~~~~~~~~~
./include/linux/platform_device.h:228:2: note: in expansion of macro ‘module_driver’
  module_driver(__platform_driver, platform_driver_register, \
  ^~~~~~~~~~~~~
drivers/net/ethernet/cortina/gemini.c:2495:1: note: in expansion of macro ‘module_platform_driver’
 module_platform_driver(gemini_ethernet_port_driver);
 ^~~~~~~~~~~~~~~~~~~~~~
make[4]: *** [scripts/Makefile.build:317: drivers/net/ethernet/cortina/gemini.o] Error 1
make[3]: *** [scripts/Makefile.build:569: drivers/net/ethernet/cortina] Error 2
make[3]: *** Waiting for unfinished jobs....
Linus Walleij Jan. 10, 2018, 10:02 p.m. | #4
On Wed, Jan 10, 2018 at 9:43 PM, David Miller <davem@davemloft.net> wrote:

> Actually I had to revert these two patches, this stuff doesn't even
> build.

Sorry about that, I did build it before sending out but I guess not on enough
architectures :(

I will iterate with the help of the zeroday build servers, my own machines
just don't suffice.

Yours,
Linus Walleij

Patch

diff --git a/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt b/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt
new file mode 100644
index 000000000000..6c559981d110
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt
@@ -0,0 +1,92 @@ 
+Cortina Systems Gemini Ethernet Controller
+==========================================
+
+This ethernet controller is found in the Gemini SoC family:
+StorLink SL3512 and SL3516, also known as Cortina Systems
+CS3512 and CS3516.
+
+Required properties:
+- compatible: must be "cortina,gemini-ethernet"
+- reg: must contain the global registers and the V-bit and A-bit
+  memory areas, in total three register sets.
+- syscon: a phandle to the system controller
+- #address-cells: must be specified, must be <1>
+- #size-cells: must be specified, must be <1>
+- ranges: should be state like this giving a 1:1 address translation
+  for the subnodes
+
+The subnodes represents the two ethernet ports in this device.
+They are not independent of each other since they share resources
+in the parent node, and are thus children.
+
+Required subnodes:
+- port0: contains the resources for ethernet port 0
+- port1: contains the resources for ethernet port 1
+
+Required subnode properties:
+- compatible: must be "cortina,gemini-ethernet-port"
+- reg: must contain two register areas: the DMA/TOE memory and
+  the GMAC memory area of the port
+- interrupts: should contain the interrupt line of the port.
+  this is nominally a level interrupt active high.
+- resets: this must provide an SoC-integrated reset line for
+  the port.
+- clocks: this should contain a handle to the PCLK clock for
+  clocking the silicon in this port
+- clock-names: must be "PCLK"
+
+Optional subnode properties:
+- phy-mode: see ethernet.txt
+- phy-handle: see ethernet.txt
+
+Example:
+
+mdio-bus {
+	(...)
+	phy0: ethernet-phy@1 {
+		reg = <1>;
+		device_type = "ethernet-phy";
+	};
+	phy1: ethernet-phy@3 {
+		reg = <3>;
+		device_type = "ethernet-phy";
+	};
+};
+
+
+ethernet@60000000 {
+	compatible = "cortina,gemini-ethernet";
+	reg = <0x60000000 0x4000>, /* Global registers, queue */
+	      <0x60004000 0x2000>, /* V-bit */
+	      <0x60006000 0x2000>; /* A-bit */
+	syscon = <&syscon>;
+	#address-cells = <1>;
+	#size-cells = <1>;
+	ranges;
+
+	gmac0: ethernet-port@0 {
+		compatible = "cortina,gemini-ethernet-port";
+		reg = <0x60008000 0x2000>, /* Port 0 DMA/TOE */
+		      <0x6000a000 0x2000>; /* Port 0 GMAC */
+		interrupt-parent = <&intcon>;
+		interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
+		resets = <&syscon GEMINI_RESET_GMAC0>;
+		clocks = <&syscon GEMINI_CLK_GATE_GMAC0>;
+		clock-names = "PCLK";
+		phy-mode = "rgmii";
+		phy-handle = <&phy0>;
+	};
+
+	gmac1: ethernet-port@1 {
+		compatible = "cortina,gemini-ethernet-port";
+		reg = <0x6000c000 0x2000>, /* Port 1 DMA/TOE */
+		      <0x6000e000 0x2000>; /* Port 1 GMAC */
+		interrupt-parent = <&intcon>;
+		interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
+		resets = <&syscon GEMINI_RESET_GMAC1>;
+		clocks = <&syscon GEMINI_CLK_GATE_GMAC1>;
+		clock-names = "PCLK";
+		phy-mode = "rgmii";
+		phy-handle = <&phy1>;
+	};
+};