LAN969x SGPIO
1. SoC Resources
The Serial GPIO Controller for LAN969x supports as many Serial GPIOs as configured in the device tree.
The EVB-LAN9696-24port EVB has 128 input and 128 output.
2. Kernel configurations
Following kernel config options should be enabled to use LAN969x GPIO Controller:
-
CONFIG_PINCTRL_MICROCHIP_SGPIO- Serial GPIO controller config option.
3. Devicetree Configuration
To use SGPIO pins of a specific peripheral, configure following properties in the device tree:
-
compatiblemust be set to"microchip,sparx5-sgpio". -
regmust be set to<0xe2010230 0x118>. -
clocksmust refer to the 320MHz core clock<&fx100_clk>. -
reset-namesmust be set to"switch". -
resetsmust refer to the switch reset controllers reset signal, e.g.<&reset 0>. -
#address-cellsmust be 1. -
#size-cellsmust be 0.
For each direction there must be a child node.
For the IN direction the following properties must be provided:
-
compatiblemust be set to"microchip,sparx5-sgpio-bank". -
regmust be set to<0>. -
gpio-controllermust be set. -
#gpio-cellsmust be set to 3. -
interruptsmust be set to<GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>.
Peripheral |
Shared Peripheral Interrupt |
CPU INTR |
sgpio |
48 |
16 |
- Note
-
Shared peripheral interrupt lines start at index ID32. So, CPU INTR must be calculated as [Shared peripheral interrupt number - 32].
-
interrupt-controllermust be set. -
#interrupt-cellsmust be set to 3. -
#address-cellsmust be set to 0.
-
For the OUT direction the following properties must be provided:
-
compatiblemust be set to"microchip,sparx5-sgpio-bank". -
regmust be set to 1. -
gpio-controllermust be set. -
#gpio-cellsmust be set to 3.
3.2. Example
Following example shows how an SGPIO controller should be defined in the DT to enable SGPIO pins for a mux controller and an SFP.
The clients refer to the IN and OUT directions to get the appropriate SGPIOs.
dtsi file:
sgpio: gpio@e2010230 {
compatible = "microchip,sparx5-sgpio";
reg = <0xe2010230 0x118>;
clocks = <&fx100_clk>;
resets = <&reset 0>;
reset-names = "switch";
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
sgpio_in: gpio@0 {
compatible = "microchip,sparx5-sgpio-bank";
reg = <0>;
gpio-controller;
#gpio-cells = <3>;
interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
interrupt-controller;
#interrupt-cells = <3>;
#address-cells = <0>;
};
sgpio_out: gpio@1 {
compatible = "microchip,sparx5-sgpio-bank";
reg = <1>;
gpio-controller;
#gpio-cells = <3>;
};
};
dts file changes to use the SGPIO:
&gpio {
sgpio_pins: sgpio-pins {
/* SCK, D0, D1, LD */
pins = "GPIO_5", "GPIO_6", "GPIO_7", "GPIO_8";
function = "sgpio_a";
};
};
&sgpio {
pinctrl-0 = <&sgpio_pins>;
pinctrl-names = "default";
microchip,sgpio-port-ranges = <0 1>, <6 9>;
status = "okay";
gpio@0 {
ngpios = <128>;
};
gpio@1 {
ngpios = <128>;
};
};
/ {
mux-controller {
compatible = "gpio-mux";
#mux-control-cells = <0>;
mux-gpios = <&sgpio_out 1 2 GPIO_ACTIVE_LOW>,
<&sgpio_out 1 3 GPIO_ACTIVE_LOW>;
};
sfp0: sfp0 {
compatible = "sff,sfp";
i2c-bus = <&i2c_sfp0>;
tx-disable-gpios = <&sgpio_out 6 2 GPIO_ACTIVE_HIGH>;
los-gpios = <&sgpio_in 6 0 GPIO_ACTIVE_HIGH>;
mod-def0-gpios = <&sgpio_in 6 1 GPIO_ACTIVE_LOW>;
tx-fault-gpios = <&sgpio_in 6 2 GPIO_ACTIVE_HIGH>;
};
};
4. UserSpace
4.1. Confirm instances are created
Checking if the SGPIO driver is registered:
# cat /sys/kernel/debug/pinctrl/pinctrl-devices name [pinmux] [pinconf] lan969x-pinctrl yes yes e2010230.gpio-input yes yes e2010230.gpio-output yes yes
Here the lan969x-pinctrl is the device described on this page, and the e2010230.gpio-input and e2010230.gpio-output are the Serial GPIO Controllers two direction nodes - each of them being its own pin controller device.
4.2. Setting the SFP LEDs
The LEDs for the SFP cages are available via SGPIOs:
leds {
compatible = "gpio-leds";
led-s6-green {
label = "s6:green";
gpios = <&sgpio_out 6 0 GPIO_ACTIVE_LOW>;
default-state = "off";
};
led-s6-yellow {
label = "s6:yellow";
gpios = <&sgpio_out 6 1 GPIO_ACTIVE_LOW>;
default-state = "off";
};
... more LED nodes follows...
};
You can locate the LEDs in sysfs with:
# find /sys/class/leds/ /sys/class/leds/ /sys/class/leds/s7:green /sys/class/leds/s6:yellow /sys/class/leds/s7:yellow /sys/class/leds/s8:yellow /sys/class/leds/s8:green /sys/class/leds/s9:yellow /sys/class/leds/s9:green /sys/class/leds/s6:green /sys/class/leds/mmc0::
Now you can turn on the green LED of the Serdes 6 SFP using:
# echo 1 > /sys/class/leds/s6:green/brightness
And you can turn it off again using;
# echo 0 > /sys/class/leds/s6:green/brightness