* [RFC v3 0/3] NET: PHY: Intel XWAY driver @ 2016-06-04 11:45 Hauke Mehrtens [not found] ` <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Hauke Mehrtens @ 2016-06-04 11:45 UTC (permalink / raw) To: f.fainelli Cc: alexander.stein, netdev, andrew, john, openwrt, hauke.mehrtens, daniel.schwierzeck, eckert.florian, devicetree, Hauke Mehrtens This adds the Intel XWAY driver and also adds a device tree binding for Ethernet PHY LEDs. changes since RFC v2: * add Documentation/devicetree/bindings/phy/intel-xway.txt * fixed some typos * renamed from lantiq.c to intel-xway.c * split the generic PHY binding information out Hauke Mehrtens (3): NET: PHY: adds driver for Intel XWAY PHY NET: PHY: Add PHY LED control binding. NET: PHY: Intel XWAY: add LED configuration support .../devicetree/bindings/phy/intel-xway.txt | 77 +++ Documentation/devicetree/bindings/phy/phy-leds.txt | 52 ++ drivers/net/phy/Kconfig | 6 + drivers/net/phy/Makefile | 1 + drivers/net/phy/intel-xway.c | 541 +++++++++++++++++++++ include/dt-bindings/phy/phy-leds.h | 27 + 6 files changed, 704 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/intel-xway.txt create mode 100644 Documentation/devicetree/bindings/phy/phy-leds.txt create mode 100644 drivers/net/phy/intel-xway.c create mode 100644 include/dt-bindings/phy/phy-leds.h -- 2.8.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org>]
* [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY [not found] ` <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> @ 2016-06-04 11:45 ` Hauke Mehrtens 2016-06-04 14:43 ` Langer, Thomas 0 siblings, 1 reply; 7+ messages in thread From: Hauke Mehrtens @ 2016-06-04 11:45 UTC (permalink / raw) To: f.fainelli-Re5JQEeQqe8AvxtiuMwx3w Cc: alexander.stein-93q1YBGzJSMe9JSWTWOYM3xStJ4P+DSV, netdev-u79uwXL29TY76Z2rM5mHXA, andrew-g2DYL2Zd6BY, john-Pj+rj9U5foFAfugRpC6u6w, openwrt-zg6vgJgm1sizQB+pC5nmwQ, hauke.mehrtens-ral2JQCrhuEAvxtiuMwx3w, daniel.schwierzeck-Re5JQEeQqe8AvxtiuMwx3w, eckert.florian-gM/Ye1E23mwN+BqQ9rBEUg, devicetree-u79uwXL29TY76Z2rM5mHXA, Hauke Mehrtens This adds support for the Intel (former Lantiq) XWAY 11G and 22E PHYs. These PHYs are also named PEF 7061, PEF 7071, PEF 7072. Signed-off-by: John Crispin <john-Pj+rj9U5foFAfugRpC6u6w@public.gmane.org> Signed-off-by: Hauke Mehrtens <hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> --- drivers/net/phy/Kconfig | 6 + drivers/net/phy/Makefile | 1 + drivers/net/phy/intel-xway.c | 389 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+) create mode 100644 drivers/net/phy/intel-xway.c diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 6dad9a9..9efe399 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -271,6 +271,12 @@ config MDIO_BCM_IPROC This module provides a driver for the MDIO busses found in the Broadcom iProc SoC's. +config INTEL_XWAY_PHY + tristate "Driver for Intel XWAY PHYs" + ---help--- + Supports the Intel XWAY (former Lantiq) 11G and 22E PHYs. + These PHYs are also named PEF 7061, PEF 7071 and PEF 7072 + endif # PHYLIB config MICREL_KS8995MA diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index fcdbb92..c26b651 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -44,3 +44,4 @@ obj-$(CONFIG_MDIO_MOXART) += mdio-moxart.o obj-$(CONFIG_MDIO_BCM_UNIMAC) += mdio-bcm-unimac.o obj-$(CONFIG_MICROCHIP_PHY) += microchip.o obj-$(CONFIG_MDIO_BCM_IPROC) += mdio-bcm-iproc.o +obj-$(CONFIG_INTEL_XWAY_PHY) += intel-xway.o diff --git a/drivers/net/phy/intel-xway.c b/drivers/net/phy/intel-xway.c new file mode 100644 index 0000000..c789462 --- /dev/null +++ b/drivers/net/phy/intel-xway.c @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2012 Daniel Schwierzeck <daniel.schwierzeck-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> + * Copyright (C) 2016 Hauke Mehrtens <hauke-5/S+JYg5SzeELgA04lAiVw@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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/mdio.h> +#include <linux/module.h> +#include <linux/phy.h> +#include <linux/of.h> + +#define XWAY_MDIO_IMASK 0x19 /* interrupt mask */ +#define XWAY_MDIO_ISTAT 0x1A /* interrupt status */ + +#define XWAY_MDIO_INIT_WOL BIT(15) /* Wake-On-LAN */ +#define XWAY_MDIO_INIT_MSRE BIT(14) +#define XWAY_MDIO_INIT_NPRX BIT(13) +#define XWAY_MDIO_INIT_NPTX BIT(12) +#define XWAY_MDIO_INIT_ANE BIT(11) /* Auto-Neg error */ +#define XWAY_MDIO_INIT_ANC BIT(10) /* Auto-Neg complete */ +#define XWAY_MDIO_INIT_ADSC BIT(5) /* Link auto-downspeed detect */ +#define XWAY_MDIO_INIT_MPIPC BIT(4) +#define XWAY_MDIO_INIT_MDIXC BIT(3) +#define XWAY_MDIO_INIT_DXMC BIT(2) /* Duplex mode change */ +#define XWAY_MDIO_INIT_LSPC BIT(1) /* Link speed change */ +#define XWAY_MDIO_INIT_LSTC BIT(0) /* Link state change */ +#define XWAY_MDIO_INIT_MASK (XWAY_MDIO_INIT_LSTC | \ + XWAY_MDIO_INIT_ADSC) + +#define ADVERTISED_MPD BIT(10) /* Multi-port device */ + +/* LED Configuration */ +#define XWAY_MMD_LEDCH 0x01E0 +/* Inverse of SCAN Function */ +#define XWAY_MMD_LEDCH_NACS_NONE 0x0000 +#define XWAY_MMD_LEDCH_NACS_LINK 0x0001 +#define XWAY_MMD_LEDCH_NACS_PDOWN 0x0002 +#define XWAY_MMD_LEDCH_NACS_EEE 0x0003 +#define XWAY_MMD_LEDCH_NACS_ANEG 0x0004 +#define XWAY_MMD_LEDCH_NACS_ABIST 0x0005 +#define XWAY_MMD_LEDCH_NACS_CDIAG 0x0006 +#define XWAY_MMD_LEDCH_NACS_TEST 0x0007 +/* Slow Blink Frequency */ +#define XWAY_MMD_LEDCH_SBF_F02HZ 0x0000 +#define XWAY_MMD_LEDCH_SBF_F04HZ 0x0010 +#define XWAY_MMD_LEDCH_SBF_F08HZ 0x0020 +#define XWAY_MMD_LEDCH_SBF_F16HZ 0x0030 +/* Fast Blink Frequency */ +#define XWAY_MMD_LEDCH_FBF_F02HZ 0x0000 +#define XWAY_MMD_LEDCH_FBF_F04HZ 0x0040 +#define XWAY_MMD_LEDCH_FBF_F08HZ 0x0080 +#define XWAY_MMD_LEDCH_FBF_F16HZ 0x00C0 +/* LED Configuration */ +#define XWAY_MMD_LEDCL 0x01E1 +/* Complex Blinking Configuration */ +#define XWAY_MMD_LEDCH_CBLINK_NONE 0x0000 +#define XWAY_MMD_LEDCH_CBLINK_LINK 0x0001 +#define XWAY_MMD_LEDCH_CBLINK_PDOWN 0x0002 +#define XWAY_MMD_LEDCH_CBLINK_EEE 0x0003 +#define XWAY_MMD_LEDCH_CBLINK_ANEG 0x0004 +#define XWAY_MMD_LEDCH_CBLINK_ABIST 0x0005 +#define XWAY_MMD_LEDCH_CBLINK_CDIAG 0x0006 +#define XWAY_MMD_LEDCH_CBLINK_TEST 0x0007 +/* Complex SCAN Configuration */ +#define XWAY_MMD_LEDCH_SCAN_NONE 0x0000 +#define XWAY_MMD_LEDCH_SCAN_LINK 0x0010 +#define XWAY_MMD_LEDCH_SCAN_PDOWN 0x0020 +#define XWAY_MMD_LEDCH_SCAN_EEE 0x0030 +#define XWAY_MMD_LEDCH_SCAN_ANEG 0x0040 +#define XWAY_MMD_LEDCH_SCAN_ABIST 0x0050 +#define XWAY_MMD_LEDCH_SCAN_CDIAG 0x0060 +#define XWAY_MMD_LEDCH_SCAN_TEST 0x0070 +/* Configuration for LED Pin x */ +#define XWAY_MMD_LED0H 0x01E2 +/* Fast Blinking Configuration */ +#define XWAY_MMD_LEDxH_BLINKF_MASK 0x000F +#define XWAY_MMD_LEDxH_BLINKF_NONE 0x0000 +#define XWAY_MMD_LEDxH_BLINKF_LINK10 0x0001 +#define XWAY_MMD_LEDxH_BLINKF_LINK100 0x0002 +#define XWAY_MMD_LEDxH_BLINKF_LINK10X 0x0003 +#define XWAY_MMD_LEDxH_BLINKF_LINK1000 0x0004 +#define XWAY_MMD_LEDxH_BLINKF_LINK10_0 0x0005 +#define XWAY_MMD_LEDxH_BLINKF_LINK100X 0x0006 +#define XWAY_MMD_LEDxH_BLINKF_LINK10XX 0x0007 +#define XWAY_MMD_LEDxH_BLINKF_PDOWN 0x0008 +#define XWAY_MMD_LEDxH_BLINKF_EEE 0x0009 +#define XWAY_MMD_LEDxH_BLINKF_ANEG 0x000A +#define XWAY_MMD_LEDxH_BLINKF_ABIST 0x000B +#define XWAY_MMD_LEDxH_BLINKF_CDIAG 0x000C +/* Constant On Configuration */ +#define XWAY_MMD_LEDxH_CON_MASK 0x00F0 +#define XWAY_MMD_LEDxH_CON_NONE 0x0000 +#define XWAY_MMD_LEDxH_CON_LINK10 0x0010 +#define XWAY_MMD_LEDxH_CON_LINK100 0x0020 +#define XWAY_MMD_LEDxH_CON_LINK10X 0x0030 +#define XWAY_MMD_LEDxH_CON_LINK1000 0x0040 +#define XWAY_MMD_LEDxH_CON_LINK10_0 0x0050 +#define XWAY_MMD_LEDxH_CON_LINK100X 0x0060 +#define XWAY_MMD_LEDxH_CON_LINK10XX 0x0070 +#define XWAY_MMD_LEDxH_CON_PDOWN 0x0080 +#define XWAY_MMD_LEDxH_CON_EEE 0x0090 +#define XWAY_MMD_LEDxH_CON_ANEG 0x00A0 +#define XWAY_MMD_LEDxH_CON_ABIST 0x00B0 +#define XWAY_MMD_LEDxH_CON_CDIAG 0x00C0 +#define XWAY_MMD_LEDxH_CON_COPPER 0x00D0 +#define XWAY_MMD_LEDxH_CON_FIBER 0x00E0 +/* Configuration for LED Pin x */ +#define XWAY_MMD_LED0L 0x01E3 +/* Pulsing Configuration */ +#define XWAY_MMD_LEDxL_PULSE_MASK 0x000F +#define XWAY_MMD_LEDxL_PULSE_NONE 0x0000 +#define XWAY_MMD_LEDxL_PULSE_TXACT 0x0001 +#define XWAY_MMD_LEDxL_PULSE_RXACT 0x0002 +#define XWAY_MMD_LEDxL_PULSE_COL 0x0004 +/* Slow Blinking Configuration */ +#define XWAY_MMD_LEDxL_BLINKS_MASK 0x00F0 +#define XWAY_MMD_LEDxL_BLINKS_NONE 0x0000 +#define XWAY_MMD_LEDxL_BLINKS_LINK10 0x0010 +#define XWAY_MMD_LEDxL_BLINKS_LINK100 0x0020 +#define XWAY_MMD_LEDxL_BLINKS_LINK10X 0x0030 +#define XWAY_MMD_LEDxL_BLINKS_LINK1000 0x0040 +#define XWAY_MMD_LEDxL_BLINKS_LINK10_0 0x0050 +#define XWAY_MMD_LEDxL_BLINKS_LINK100X 0x0060 +#define XWAY_MMD_LEDxL_BLINKS_LINK10XX 0x0070 +#define XWAY_MMD_LEDxL_BLINKS_PDOWN 0x0080 +#define XWAY_MMD_LEDxL_BLINKS_EEE 0x0090 +#define XWAY_MMD_LEDxL_BLINKS_ANEG 0x00A0 +#define XWAY_MMD_LEDxL_BLINKS_ABIST 0x00B0 +#define XWAY_MMD_LEDxL_BLINKS_CDIAG 0x00C0 +#define XWAY_MMD_LED1H 0x01E4 +#define XWAY_MMD_LED1L 0x01E5 +#define XWAY_MMD_LED2H 0x01E6 +#define XWAY_MMD_LED2L 0x01E7 +#define XWAY_MMD_LED3H 0x01E8 +#define XWAY_MMD_LED3L 0x01E9 + +#define PHY_ID_PHY11G_1_3 0x030260D1 +#define PHY_ID_PHY22F_1_3 0x030260E1 +#define PHY_ID_PHY11G_1_4 0xD565A400 +#define PHY_ID_PHY22F_1_4 0xD565A410 +#define PHY_ID_PHY11G_1_5 0xD565A401 +#define PHY_ID_PHY22F_1_5 0xD565A411 +#define PHY_ID_PHY11G_VR9 0xD565A409 +#define PHY_ID_PHY22F_VR9 0xD565A419 + +static int xway_gphy_config_init(struct phy_device *phydev) +{ + int err; + u32 ledxh; + u32 ledxl; + + /* Mask all interrupts */ + err = phy_write(phydev, XWAY_MDIO_IMASK, 0); + if (err) + return err; + + /* Clear all pending interrupts */ + phy_read(phydev, XWAY_MDIO_ISTAT); + + phy_write_mmd_indirect(phydev, XWAY_MMD_LEDCH, MDIO_MMD_VEND2, + XWAY_MMD_LEDCH_NACS_NONE | + XWAY_MMD_LEDCH_SBF_F02HZ | + XWAY_MMD_LEDCH_FBF_F16HZ); + phy_write_mmd_indirect(phydev, XWAY_MMD_LEDCL, MDIO_MMD_VEND2, + XWAY_MMD_LEDCH_CBLINK_NONE | + XWAY_MMD_LEDCH_SCAN_NONE); + + /** + * In most cases only one LED is connected to this phy, so + * configure them all to constant on and pulse mode. LED3 is + * only available in some packages, leave it in its reset + * configuration. + */ + ledxh = XWAY_MMD_LEDxH_BLINKF_NONE | XWAY_MMD_LEDxH_CON_LINK10XX; + ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT | + XWAY_MMD_LEDxL_BLINKS_NONE; + phy_write_mmd_indirect(phydev, XWAY_MMD_LED0H, MDIO_MMD_VEND2, ledxh); + phy_write_mmd_indirect(phydev, XWAY_MMD_LED0L, MDIO_MMD_VEND2, ledxl); + phy_write_mmd_indirect(phydev, XWAY_MMD_LED1H, MDIO_MMD_VEND2, ledxh); + phy_write_mmd_indirect(phydev, XWAY_MMD_LED1L, MDIO_MMD_VEND2, ledxl); + phy_write_mmd_indirect(phydev, XWAY_MMD_LED2H, MDIO_MMD_VEND2, ledxh); + phy_write_mmd_indirect(phydev, XWAY_MMD_LED2L, MDIO_MMD_VEND2, ledxl); + + return 0; +} + +static int xway_gphy14_config_aneg(struct phy_device *phydev) +{ + int reg, err; + + /* Advertise as multi-port device, see IEEE802.3-2002 40.5.1.1 */ + /* This is a workaround for an errata in rev < 1.5 devices */ + reg = phy_read(phydev, MII_CTRL1000); + reg |= ADVERTISED_MPD; + err = phy_write(phydev, MII_CTRL1000, reg); + if (err) + return err; + + return genphy_config_aneg(phydev); +} + +static int xway_gphy_ack_interrupt(struct phy_device *phydev) +{ + int reg; + + /** + * Possible IRQ numbers: + * - IM3_IRL18 for GPHY0 + * - IM3_IRL17 for GPHY1 + * + * Due to a silicon bug IRQ lines are not really independent from + * each other. Sometimes the two lines are driven at the same time + * if only one GPHY core raises the interrupt. + */ + reg = phy_read(phydev, XWAY_MDIO_ISTAT); + + return (reg < 0) ? reg : 0; +} + +static int xway_gphy_did_interrupt(struct phy_device *phydev) +{ + int reg; + + reg = phy_read(phydev, XWAY_MDIO_ISTAT); + + return reg & XWAY_MDIO_INIT_MASK; +} + +static int xway_gphy_config_intr(struct phy_device *phydev) +{ + u16 mask = 0; + + if (phydev->interrupts == PHY_INTERRUPT_ENABLED) + mask = XWAY_MDIO_INIT_MASK; + + return phy_write(phydev, XWAY_MDIO_IMASK, mask); +} + +static struct phy_driver xway_gphy[] = { + { + .phy_id = PHY_ID_PHY11G_1_3, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.3", + .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + /* there is an errata regarding irqs in this rev */ + .flags = 0, + .config_init = xway_gphy_config_init, + .config_aneg = xway_gphy14_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY22F_1_3, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY22F (PEF 7061) v1.3", + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + /* there is an errata regarding irqs in this rev */ + .flags = 0, + .config_init = xway_gphy_config_init, + .config_aneg = xway_gphy14_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY11G_1_4, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.4", + .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = xway_gphy14_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY22F_1_4, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY22F (PEF 7061) v1.4", + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = xway_gphy14_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY11G_1_5, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) v1.5 / v1.6", + .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY22F_1_5, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY22F (PEF 7061) v1.5 / v1.6", + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY11G_VR9, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY11G (xRX200)", + .features = (PHY_GBIT_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, { + .phy_id = PHY_ID_PHY22F_VR9, + .phy_id_mask = 0xffffffff, + .name = "Intel XWAY PHY22F (xRX200)", + .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | + SUPPORTED_Asym_Pause), + .flags = PHY_HAS_INTERRUPT, + .config_init = xway_gphy_config_init, + .config_aneg = genphy_config_aneg, + .read_status = genphy_read_status, + .ack_interrupt = xway_gphy_ack_interrupt, + .did_interrupt = xway_gphy_did_interrupt, + .config_intr = xway_gphy_config_intr, + .suspend = genphy_suspend, + .resume = genphy_resume, + }, +}; +module_phy_driver(xway_gphy); + +static struct mdio_device_id __maybe_unused xway_gphy_tbl[] = { + { PHY_ID_PHY11G_1_3, 0xffffffff }, + { PHY_ID_PHY22F_1_3, 0xffffffff }, + { PHY_ID_PHY11G_1_4, 0xffffffff }, + { PHY_ID_PHY22F_1_4, 0xffffffff }, + { PHY_ID_PHY11G_1_5, 0xffffffff }, + { PHY_ID_PHY22F_1_5, 0xffffffff }, + { PHY_ID_PHY11G_VR9, 0xffffffff }, + { PHY_ID_PHY22F_VR9, 0xffffffff }, + { } +}; +MODULE_DEVICE_TABLE(mdio, xway_gphy_tbl); + +MODULE_DESCRIPTION("Intel XWAY PHY driver"); +MODULE_LICENSE("GPL"); -- 2.8.1 -- 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] 7+ messages in thread
* RE: [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY 2016-06-04 11:45 ` [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY Hauke Mehrtens @ 2016-06-04 14:43 ` Langer, Thomas 2016-06-04 14:55 ` John Crispin [not found] ` <0DAF21CFE1B20740AE23D6AF6E54843F1E503ECE-kPTMFJFq+rF9qrmMLTLiibfspsVTdybXVpNB7YpNyf8@public.gmane.org> 0 siblings, 2 replies; 7+ messages in thread From: Langer, Thomas @ 2016-06-04 14:43 UTC (permalink / raw) To: Hauke Mehrtens, f.fainelli@gmail.com Cc: alexander.stein@systec-electronic.com, netdev@vger.kernel.org, andrew@lunn.ch, john@phrozen.org, openwrt@kresin.me, Mehrtens, Hauke, daniel.schwierzeck@gmail.com, eckert.florian@googlemail.com, devicetree@vger.kernel.org Hello Hauke, [...] > + > +static int xway_gphy_ack_interrupt(struct phy_device *phydev) > +{ > + int reg; > + > + /** > + * Possible IRQ numbers: > + * - IM3_IRL18 for GPHY0 > + * - IM3_IRL17 for GPHY1 These are references to the SoC interrupts. > + * > + * Due to a silicon bug IRQ lines are not really independent from > + * each other. Sometimes the two lines are driven at the same time > + * if only one GPHY core raises the interrupt. So this errata sounds like a SoC errata, not an errata for the PHY. > + */ > + reg = phy_read(phydev, XWAY_MDIO_ISTAT); > + > + return (reg < 0) ? reg : 0; > +} > + [...] > + > +static struct phy_driver xway_gphy[] = { > + { > + .phy_id = PHY_ID_PHY11G_1_3, > + .phy_id_mask = 0xffffffff, > + .name = "Intel XWAY PHY11G (PEF 7071/PEF 7072) > v1.3", > + .features = (PHY_GBIT_FEATURES | > SUPPORTED_Pause | > + SUPPORTED_Asym_Pause), > + /* there is an errata regarding irqs in this rev */ And then this is comment is also now valid. What about a system with a single external phy connected, on a non-Lantiq/Intel SoC? I think the feasibility of using interrupts is not related to the phy version, but indirectly by the version of the SoC it is integrated. So maybe he use of interrupts (on these SoCs) should be controlled by devicetree or network driver, where the SoC type and version can be handled? > + .flags = 0, > + .config_init = xway_gphy_config_init, > + .config_aneg = xway_gphy14_config_aneg, > + .read_status = genphy_read_status, > + .ack_interrupt = xway_gphy_ack_interrupt, > + .did_interrupt = xway_gphy_did_interrupt, > + .config_intr = xway_gphy_config_intr, > + .suspend = genphy_suspend, > + .resume = genphy_resume, > + }, { [...] Regards, Thomas ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY 2016-06-04 14:43 ` Langer, Thomas @ 2016-06-04 14:55 ` John Crispin [not found] ` <0DAF21CFE1B20740AE23D6AF6E54843F1E503ECE-kPTMFJFq+rF9qrmMLTLiibfspsVTdybXVpNB7YpNyf8@public.gmane.org> 1 sibling, 0 replies; 7+ messages in thread From: John Crispin @ 2016-06-04 14:55 UTC (permalink / raw) To: Langer, Thomas, Hauke Mehrtens, f.fainelli@gmail.com Cc: alexander.stein@systec-electronic.com, netdev@vger.kernel.org, andrew@lunn.ch, openwrt@kresin.me, Mehrtens, Hauke, daniel.schwierzeck@gmail.com, eckert.florian@googlemail.com, devicetree@vger.kernel.org Hi Thomas Hi Hauke On 04/06/2016 16:43, Langer, Thomas wrote: >> + /* there is an errata regarding irqs in this rev */ > And then this is comment is also now valid. > What about a system with a single external phy connected, > on a non-Lantiq/Intel SoC? > > I think the feasibility of using interrupts is not related to the phy version, > but indirectly by the version of the SoC it is integrated. > > So maybe he use of interrupts (on these SoCs) should be controlled by devicetree or > network driver, where the SoC type and version can be handled? > IIRC the 2 irq lines are broken on xrx200 v1.1 SoC silicon. irqs were unreliable and sometimes fired on the wrong phy or not at all. maybe this was fixed on v1.2 silicon ? this is not related to the phy per-se but the SoC silicon it is integrated into. the PHY driver should be agnostic of the SoC having a functional IRQ block i think. devictrees for v1.1 SoC silicon should simply not define an IRQ inside the devicetree and rely on the phy polling done by the mdio/phy layer. John ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <0DAF21CFE1B20740AE23D6AF6E54843F1E503ECE-kPTMFJFq+rF9qrmMLTLiibfspsVTdybXVpNB7YpNyf8@public.gmane.org>]
* Re: [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY [not found] ` <0DAF21CFE1B20740AE23D6AF6E54843F1E503ECE-kPTMFJFq+rF9qrmMLTLiibfspsVTdybXVpNB7YpNyf8@public.gmane.org> @ 2016-06-04 15:27 ` Daniel Schwierzeck 0 siblings, 0 replies; 7+ messages in thread From: Daniel Schwierzeck @ 2016-06-04 15:27 UTC (permalink / raw) To: Langer, Thomas, Hauke Mehrtens, f.fainelli-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org Cc: alexander.stein-93q1YBGzJSMe9JSWTWOYM3xStJ4P+DSV@public.gmane.org, netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, andrew-g2DYL2Zd6BY@public.gmane.org, john-Pj+rj9U5foFAfugRpC6u6w@public.gmane.org, openwrt-zg6vgJgm1sizQB+pC5nmwQ@public.gmane.org, Mehrtens, Hauke, eckert.florian-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Am 04.06.2016 um 16:43 schrieb Langer, Thomas: > Hello Hauke, > > [...] >> + >> +static int xway_gphy_ack_interrupt(struct phy_device *phydev) >> +{ >> + int reg; >> + >> + /** >> + * Possible IRQ numbers: >> + * - IM3_IRL18 for GPHY0 >> + * - IM3_IRL17 for GPHY1 > > These are references to the SoC interrupts. > >> + * >> + * Due to a silicon bug IRQ lines are not really independent from >> + * each other. Sometimes the two lines are driven at the same time >> + * if only one GPHY core raises the interrupt. > > So this errata sounds like a SoC errata, not an errata for the PHY. > this comment is a remnant from the first driver version which was mainly used on a VRX200 SoC. But interrupts are generally working fine so this comment should be removed. -- - Daniel -- 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] 7+ messages in thread
* [RFC v3 2/3] NET: PHY: Add PHY LED control binding. 2016-06-04 11:45 [RFC v3 0/3] NET: PHY: Intel XWAY driver Hauke Mehrtens [not found] ` <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> @ 2016-06-04 11:45 ` Hauke Mehrtens 2016-06-04 11:45 ` [RFC v3 3/3] NET: PHY: Intel XWAY: add LED configuration support Hauke Mehrtens 2 siblings, 0 replies; 7+ messages in thread From: Hauke Mehrtens @ 2016-06-04 11:45 UTC (permalink / raw) To: f.fainelli Cc: alexander.stein, netdev, andrew, john, openwrt, hauke.mehrtens, daniel.schwierzeck, eckert.florian, devicetree, Hauke Mehrtens This binding makes it possible to control the LEDs of an Ethernet PHY. These settings allow it to abstract the hardware configuration which tells the hardware when to switch the LED constant on or blink for example. This will be used by the Intel XWAY PHY driver. I also checked datasheets for some other Ethernet PHYs and it should be possible to also control their LED behavior with these settings, but they all did not allow a so fine control over the LED behavior. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> --- Documentation/devicetree/bindings/phy/phy-leds.txt | 52 ++++++++++++++++++++++ include/dt-bindings/phy/phy-leds.h | 27 +++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/phy-leds.txt create mode 100644 include/dt-bindings/phy/phy-leds.h diff --git a/Documentation/devicetree/bindings/phy/phy-leds.txt b/Documentation/devicetree/bindings/phy/phy-leds.txt new file mode 100644 index 0000000..1a35e3d --- /dev/null +++ b/Documentation/devicetree/bindings/phy/phy-leds.txt @@ -0,0 +1,52 @@ +LED configuration for Ethernet phys + +All these properties are optional, not all properties are supported by +all PHYs. When more then one property name is define for one LED the +order they get applied is device depended. +Property names: + led-const-on: conditions the LED should be constant on + led-pulse: condition the LED should be pulsed on + led-blink-slow: condition the LED should slowly blink + led-blink-fast: condition the LED should fast blink + +These property values define the states a LED is triggered by the +hardware. Not all PHYs support all states. It is possible to connect +these property values with OR to trigger the LED in multiple stats like +10MBit/s and 100MBit/s. The possible combinations are device specific. +property values: + PHY_LED_OFF: LED is off + PHY_LED_LINK10: link is 10MBit/s + PHY_LED_LINK100: link is 100MBit/s + PHY_LED_LINK1000: link is 1000MBit/s + PHY_LED_PDOWN: link is powered down + PHY_LED_EEE: link is in EEE mode + PHY_LED_ANEG: auto negotiation is running + PHY_LED_ABIST: analog self testing is running + PHY_LED_CDIAG: cable diagnostics is running + PHY_LED_COPPER: copper interface detected + PHY_LED_FIBER: fiber interface detected + PHY_LED_TXACT: Transmit activity + PHY_LED_RXACT: Receive activity + PHY_LED_COL: Collision + +Example: + +#include <dt-bindings/phy/phy-leds.h> +phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x0>; + #address-cells = <1>; + #size-cells = <0>; + led@0 { + compatible = "phy,led"; + reg = <0>; + led-const-on = <(PHY_LED_LINK10 | PHY_LED_LINK100 | PHY_LED_LINK1000)>; + led-pulse = <(PHY_LED_TXACT | PHY_LED_RXACT)>; + }; + led@2 { + compatible = "phy,led"; + reg = <2>; + led-blink-slow = <PHY_LED_EEE>; + led-blink-fast = <PHY_LED_PDOWN>; + }; +}; diff --git a/include/dt-bindings/phy/phy-leds.h b/include/dt-bindings/phy/phy-leds.h new file mode 100644 index 0000000..801fdaf --- /dev/null +++ b/include/dt-bindings/phy/phy-leds.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 Hauke Mehrtens <hauke@hauke-m.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + */ + +#ifndef _DT_BINDINGS_PHY_LEDS +#define _DT_BINDINGS_PHY_LEDS + +#define PHY_LED_OFF (1 << 0) /* is off */ +#define PHY_LED_LINK10 (1 << 1) /* link is 10MBit/s */ +#define PHY_LED_LINK100 (1 << 2) /* link is 100MBit/s */ +#define PHY_LED_LINK1000 (1 << 3) /* link is 1000MBit/s */ +#define PHY_LED_PDOWN (1 << 4) /* link is powered down */ +#define PHY_LED_EEE (1 << 5) /* link is in EEE mode */ +#define PHY_LED_ANEG (1 << 6) /* auto negotiation is running */ +#define PHY_LED_ABIST (1 << 7) /* analog self testing is running */ +#define PHY_LED_CDIAG (1 << 8) /* cable diagnostics is running */ +#define PHY_LED_COPPER (1 << 9) /* copper interface detected */ +#define PHY_LED_FIBER (1 << 10) /* fiber interface detected */ +#define PHY_LED_TXACT (1 << 11) /* Transmit activity */ +#define PHY_LED_RXACT (1 << 12) /* Receive activity */ +#define PHY_LED_COL (1 << 13) /* Collision */ + +#endif /* _DT_BINDINGS_PHY_LEDS */ -- 2.8.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RFC v3 3/3] NET: PHY: Intel XWAY: add LED configuration support 2016-06-04 11:45 [RFC v3 0/3] NET: PHY: Intel XWAY driver Hauke Mehrtens [not found] ` <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> 2016-06-04 11:45 ` [RFC v3 2/3] NET: PHY: Add PHY LED control binding Hauke Mehrtens @ 2016-06-04 11:45 ` Hauke Mehrtens 2 siblings, 0 replies; 7+ messages in thread From: Hauke Mehrtens @ 2016-06-04 11:45 UTC (permalink / raw) To: f.fainelli Cc: alexander.stein, netdev, andrew, john, openwrt, hauke.mehrtens, daniel.schwierzeck, eckert.florian, devicetree, Hauke Mehrtens This makes it possible to configure the behavior of the LEDs connected to a PHY. The LEDs are controlled by the chip, this makes it possible to configure the behavior when the hardware should activate and deactivate the LEDs. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> --- .../devicetree/bindings/phy/intel-xway.txt | 77 +++++++++++ drivers/net/phy/intel-xway.c | 152 +++++++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 Documentation/devicetree/bindings/phy/intel-xway.txt diff --git a/Documentation/devicetree/bindings/phy/intel-xway.txt b/Documentation/devicetree/bindings/phy/intel-xway.txt new file mode 100644 index 0000000..02891c4 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/intel-xway.txt @@ -0,0 +1,77 @@ +Intel XWAY Ethernet PHY binding +------------------------------ + +This supports the Intel XWAY (former Lantiq) 11G and 22E PHYs. These +PHYs are also named PEF 7061, PEF 7071 and PEF 7072. + +Required properties: + - compatible: should be "ethernet-phy-ieee802.3-c22" + - reg: MDIO address of this PHY + + +LEDs: +The PEF 7071 PHY supports 3 LEDs, the PEF 7072 PHY supports 4 LEDs. Use +one subnode for each LED. By default the LEDs 0, 1 and 2 are switched +to be constant on when a 10MBit/s, 100MBit/s or 1000MBit/s link is +detected and they blink when TX or RX traffic is detected. All 3 LEDs +are doing the same as most known devices only have one LED. + +To change the behavior create a subnode with the following attributes: + +Required properties: + - compatible: should be: "phy,led" + - reg: led number + +optional properties: + - led-const-on: Conditions when being constant on + Possible options are one of these: + LED_LINK10, LED_LINK100 and LED_LINK1000, or + some of these 3 values connected with OR. + PHY_LED_PDOWN, PHY_LED_EEE, PHY_LED_ANEG, + PHY_LED_ABIST, PHY_LED_CDIAG, PHY_LED_COPPER, + PHY_LED_FIBER. + - led-pulse: Conditions when led is pulsed + The following values can be connected with OR: + PHY_LED_TXACT, PHY_LED_RXACT, PHY_LED_COL + - led-blink-slow: Conditions when led should blink with 2Hz: + Possible options are one of these: + LED_LINK10, LED_LINK100 and LED_LINK1000, or + some of these 3 values connected with OR. + PHY_LED_PDOWN, PHY_LED_EEE, PHY_LED_ANEG, + PHY_LED_ABIST, PHY_LED_CDIAG. + - led-blink-fast: Conditions when led should blink with 16Hz: + Possible options are one of these: + LED_LINK10, LED_LINK100 and LED_LINK1000, or + some of these 3 values connected with OR. + PHY_LED_PDOWN, PHY_LED_EEE, PHY_LED_ANEG, + PHY_LED_ABIST, PHY_LED_CDIAG. + +When multiple properties are set they are applied with the following priority: + 1. led-pulse + 2. led-blink-fast + 3. led-blink-slow + 4. led-const-on + 5. off + + +Example: + +#include <dt-bindings/phy/phy-leds.h> +phy@0 { + compatible = "intel,phy11g", "ethernet-phy-ieee802.3-c22"; + reg = <0x0>; + #address-cells = <1>; + #size-cells = <0>; + led@0 { + compatible = "phy,led"; + reg = <0>; + led-const-on = <(PHY_LED_LINK10 | PHY_LED_LINK100 | PHY_LED_LINK1000)>; + led-pulse = <(PHY_LED_TXACT | PHY_LED_RXACT)>; + }; + led@2 { + compatible = "phy,led"; + reg = <2>; + led-blink-slow = <PHY_LED_EEE>; + led-blink-fast = <PHY_LED_PDOWN>; + }; +}; diff --git a/drivers/net/phy/intel-xway.c b/drivers/net/phy/intel-xway.c index c789462..0c707b6 100644 --- a/drivers/net/phy/intel-xway.c +++ b/drivers/net/phy/intel-xway.c @@ -17,6 +17,7 @@ #include <linux/module.h> #include <linux/phy.h> #include <linux/of.h> +#include <dt-bindings/phy/phy-leds.h> #define XWAY_MDIO_IMASK 0x19 /* interrupt mask */ #define XWAY_MDIO_ISTAT 0x1A /* interrupt status */ @@ -152,11 +153,158 @@ #define PHY_ID_PHY11G_VR9 0xD565A409 #define PHY_ID_PHY22F_VR9 0xD565A419 +static void xway_gphy_config_led(struct phy_device *phydev, + struct device_node *led_np) +{ + const __be32 *addr, *blink_fast_p, *const_on_p, *pulse_p, *blink_slow_p; + u32 num, blink_fast, const_on, pulse, blink_slow; + u32 ledxl; + u32 ledxh; + + addr = of_get_property(led_np, "reg", NULL); + if (!addr) + return; + num = be32_to_cpu(*addr); + + if (num < 0 || num > 3) + return; + + ledxh = XWAY_MMD_LEDxH_BLINKF_NONE | XWAY_MMD_LEDxH_CON_LINK10XX; + blink_fast_p = of_get_property(led_np, "led-blink-fast", NULL); + if (blink_fast_p) { + ledxh &= ~XWAY_MMD_LEDxH_BLINKF_MASK; + blink_fast = be32_to_cpu(*blink_fast_p); + if ((blink_fast & PHY_LED_LINK10) && + (blink_fast & PHY_LED_LINK100) && + (blink_fast & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK10XX; + } else if ((blink_fast & PHY_LED_LINK10) && + (blink_fast & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK10_0; + } else if ((blink_fast & PHY_LED_LINK10) && + (blink_fast & PHY_LED_LINK100)) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK10X; + } else if ((blink_fast & PHY_LED_LINK100) && + (blink_fast & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK100X; + } else if (blink_fast & PHY_LED_LINK10) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK10; + } else if (blink_fast & PHY_LED_LINK100) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK100; + } else if (blink_fast & PHY_LED_LINK1000) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_LINK1000; + } else if (blink_fast & PHY_LED_PDOWN) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_PDOWN; + } else if (blink_fast & PHY_LED_EEE) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_EEE; + } else if (blink_fast & PHY_LED_ANEG) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_ANEG; + } else if (blink_fast & PHY_LED_ABIST) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_ABIST; + } else if (blink_fast & PHY_LED_CDIAG) { + ledxh |= XWAY_MMD_LEDxH_BLINKF_CDIAG; + } + } + const_on_p = of_get_property(led_np, "led-const-on", NULL); + if (const_on_p) { + ledxh &= ~XWAY_MMD_LEDxH_CON_MASK; + const_on = be32_to_cpu(*const_on_p); + if ((const_on & PHY_LED_LINK10) && + (const_on & PHY_LED_LINK100) && + (const_on & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK10XX; + } else if ((const_on & PHY_LED_LINK10) && + (const_on & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK10_0; + } else if ((const_on & PHY_LED_LINK10) && + (const_on & PHY_LED_LINK100)) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK10X; + } else if ((const_on & PHY_LED_LINK100) && + (const_on & PHY_LED_LINK1000)) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK100X; + } else if (const_on & PHY_LED_LINK10) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK10; + } else if (const_on & PHY_LED_LINK100) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK100; + } else if (const_on & PHY_LED_LINK1000) { + ledxh |= XWAY_MMD_LEDxH_CON_LINK1000; + } else if (const_on & PHY_LED_PDOWN) { + ledxh |= XWAY_MMD_LEDxH_CON_PDOWN; + } else if (const_on & PHY_LED_EEE) { + ledxh |= XWAY_MMD_LEDxH_CON_EEE; + } else if (const_on & PHY_LED_ANEG) { + ledxh |= XWAY_MMD_LEDxH_CON_ANEG; + } else if (const_on & PHY_LED_ABIST) { + ledxh |= XWAY_MMD_LEDxH_CON_ABIST; + } else if (const_on & PHY_LED_CDIAG) { + ledxh |= XWAY_MMD_LEDxH_CON_CDIAG; + } else if (const_on & PHY_LED_COPPER) { + ledxh |= XWAY_MMD_LEDxH_CON_COPPER; + } else if (const_on & PHY_LED_FIBER) { + ledxh |= XWAY_MMD_LEDxH_CON_FIBER; + } + } + phy_write_mmd_indirect(phydev, XWAY_MMD_LED0H + (num * 2), + MDIO_MMD_VEND2, ledxh); + + ledxl = XWAY_MMD_LEDxL_PULSE_TXACT | XWAY_MMD_LEDxL_PULSE_RXACT | + XWAY_MMD_LEDxL_BLINKS_NONE; + pulse_p = of_get_property(led_np, "led-pulse", NULL); + if (pulse_p) { + ledxl &= ~XWAY_MMD_LEDxL_PULSE_MASK; + pulse = be32_to_cpu(*pulse_p); + if (pulse & PHY_LED_TXACT) + ledxl |= XWAY_MMD_LEDxL_PULSE_TXACT; + if (pulse & PHY_LED_RXACT) + ledxl |= XWAY_MMD_LEDxL_PULSE_RXACT; + if (pulse & PHY_LED_COL) + ledxl |= XWAY_MMD_LEDxL_PULSE_COL; + } + blink_slow_p = of_get_property(led_np, "led-blink-slow", NULL); + if (blink_slow_p) { + ledxl &= ~XWAY_MMD_LEDxL_BLINKS_MASK; + blink_slow = be32_to_cpu(*blink_slow_p); + if ((blink_slow & PHY_LED_LINK10) && + (blink_slow & PHY_LED_LINK100) && + (blink_slow & PHY_LED_LINK1000)) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK10XX; + } else if ((blink_slow & PHY_LED_LINK10) && + (blink_slow & PHY_LED_LINK1000)) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK10_0; + } else if ((blink_slow & PHY_LED_LINK10) && + (blink_slow & PHY_LED_LINK100)) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK10X; + } else if ((blink_slow & PHY_LED_LINK100) && + (blink_slow & PHY_LED_LINK1000)) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK100X; + } else if (blink_slow & PHY_LED_LINK10) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK10; + } else if (blink_slow & PHY_LED_LINK100) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK100; + } else if (blink_slow & PHY_LED_LINK1000) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_LINK1000; + } else if (blink_slow & PHY_LED_PDOWN) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_PDOWN; + } else if (blink_slow & PHY_LED_EEE) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_EEE; + } else if (blink_slow & PHY_LED_ANEG) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_ANEG; + } else if (blink_slow & PHY_LED_ABIST) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_ABIST; + } else if (blink_slow & PHY_LED_CDIAG) { + ledxl |= XWAY_MMD_LEDxL_BLINKS_CDIAG; + } + } + phy_write_mmd_indirect(phydev, XWAY_MMD_LED0L + (num * 2), + MDIO_MMD_VEND2, ledxl); +} + static int xway_gphy_config_init(struct phy_device *phydev) { int err; u32 ledxh; u32 ledxl; + struct device_node *led_np; /* Mask all interrupts */ err = phy_write(phydev, XWAY_MDIO_IMASK, 0); @@ -190,6 +338,10 @@ static int xway_gphy_config_init(struct phy_device *phydev) phy_write_mmd_indirect(phydev, XWAY_MMD_LED2H, MDIO_MMD_VEND2, ledxh); phy_write_mmd_indirect(phydev, XWAY_MMD_LED2L, MDIO_MMD_VEND2, ledxl); + for_each_child_of_node(phydev->mdio.dev.of_node, led_np) + if (of_device_is_compatible(led_np, "phy,led")) + xway_gphy_config_led(phydev, led_np); + return 0; } -- 2.8.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-06-04 15:27 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-06-04 11:45 [RFC v3 0/3] NET: PHY: Intel XWAY driver Hauke Mehrtens [not found] ` <1465040728-4904-1-git-send-email-hauke-5/S+JYg5SzeELgA04lAiVw@public.gmane.org> 2016-06-04 11:45 ` [RFC v3 1/3] NET: PHY: adds driver for Intel XWAY PHY Hauke Mehrtens 2016-06-04 14:43 ` Langer, Thomas 2016-06-04 14:55 ` John Crispin [not found] ` <0DAF21CFE1B20740AE23D6AF6E54843F1E503ECE-kPTMFJFq+rF9qrmMLTLiibfspsVTdybXVpNB7YpNyf8@public.gmane.org> 2016-06-04 15:27 ` Daniel Schwierzeck 2016-06-04 11:45 ` [RFC v3 2/3] NET: PHY: Add PHY LED control binding Hauke Mehrtens 2016-06-04 11:45 ` [RFC v3 3/3] NET: PHY: Intel XWAY: add LED configuration support Hauke Mehrtens
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).