1 /* SPDX-License-Identifier: GPL-2.0 OR IBM-pibs */ 2 /* 3 * Additions (C) Copyright 2009 Industrie Dial Face S.p.A. 4 */ 5 /*----------------------------------------------------------------------------+ 6 | 7 | File Name: miiphy.h 8 | 9 | Function: Include file defining PHY registers. 10 | 11 | Author: Mark Wisner 12 | 13 +----------------------------------------------------------------------------*/ 14 #ifndef _miiphy_h_ 15 #define _miiphy_h_ 16 17 #include <linux/mii.h> 18 #include <linux/list.h> 19 #include <net.h> 20 #include <phy.h> 21 22 int miiphy_read(const char *devname, unsigned char addr, unsigned char reg, 23 unsigned short *value); 24 int miiphy_write(const char *devname, unsigned char addr, unsigned char reg, 25 unsigned short value); 26 int miiphy_info(const char *devname, unsigned char addr, unsigned int *oui, 27 unsigned char *model, unsigned char *rev); 28 int miiphy_reset(const char *devname, unsigned char addr); 29 int miiphy_speed(const char *devname, unsigned char addr); 30 int miiphy_duplex(const char *devname, unsigned char addr); 31 int miiphy_is_1000base_x(const char *devname, unsigned char addr); 32 #ifdef CONFIG_SYS_FAULT_ECHO_LINK_DOWN 33 int miiphy_link(const char *devname, unsigned char addr); 34 #endif 35 36 int miiphy_set_current_dev(const char *devname); 37 const char *miiphy_get_current_dev(void); 38 struct mii_dev *mdio_get_current_dev(void); 39 struct list_head *mdio_get_list_head(void); 40 struct mii_dev *miiphy_get_dev_by_name(const char *devname); 41 struct phy_device *mdio_phydev_for_ethname(const char *devname); 42 43 void miiphy_listdev(void); 44 45 struct mii_dev *mdio_alloc(void); 46 void mdio_free(struct mii_dev *bus); 47 int mdio_register(struct mii_dev *bus); 48 49 /** 50 * mdio_register_seq - Register mdio bus with sequence number 51 * @bus: mii device structure 52 * @seq: sequence number 53 * 54 * Return: 0 if success, negative value if error 55 */ 56 int mdio_register_seq(struct mii_dev *bus, int seq); 57 int mdio_unregister(struct mii_dev *bus); 58 void mdio_list_devices(void); 59 60 #ifdef CONFIG_BITBANGMII 61 62 #define BB_MII_DEVNAME "bb_miiphy" 63 64 struct bb_miiphy_bus_ops { 65 int (*mdio_active)(struct mii_dev *miidev); 66 int (*mdio_tristate)(struct mii_dev *miidev); 67 int (*set_mdio)(struct mii_dev *miidev, int v); 68 int (*get_mdio)(struct mii_dev *miidev, int *v); 69 int (*set_mdc)(struct mii_dev *miidev, int v); 70 int (*delay)(struct mii_dev *miidev); 71 }; 72 73 int bb_miiphy_read(struct mii_dev *miidev, const struct bb_miiphy_bus_ops *ops, 74 int addr, int devad, int reg); 75 int bb_miiphy_write(struct mii_dev *miidev, const struct bb_miiphy_bus_ops *ops, 76 int addr, int devad, int reg, u16 value); 77 #endif 78 79 /* phy seed setup */ 80 #define AUTO 99 81 #define _1000BASET 1000 82 #define _100BASET 100 83 #define _10BASET 10 84 #define HALF 22 85 #define FULL 44 86 87 /* phy register offsets */ 88 #define MII_MIPSCR 0x11 89 90 /* MII_LPA */ 91 #define PHY_ANLPAR_PSB_802_3 0x0001 92 #define PHY_ANLPAR_PSB_802_9 0x0002 93 94 /* MII_CTRL1000 masks */ 95 #define PHY_1000BTCR_1000FD 0x0200 96 #define PHY_1000BTCR_1000HD 0x0100 97 98 /* MII_STAT1000 masks */ 99 #define PHY_1000BTSR_MSCF 0x8000 100 #define PHY_1000BTSR_MSCR 0x4000 101 #define PHY_1000BTSR_LRS 0x2000 102 #define PHY_1000BTSR_RRS 0x1000 103 #define PHY_1000BTSR_1000FD 0x0800 104 #define PHY_1000BTSR_1000HD 0x0400 105 106 /* phy EXSR */ 107 #define ESTATUS_1000XF 0x8000 108 #define ESTATUS_1000XH 0x4000 109 110 /** 111 * struct mdio_perdev_priv - Per-device class data for MDIO DM 112 * 113 * @mii_bus: Supporting MII legacy bus 114 */ 115 struct mdio_perdev_priv { 116 struct mii_dev *mii_bus; 117 }; 118 119 /** 120 * struct mdio_ops - MDIO bus operations 121 * 122 * @read: Read from a PHY register 123 * @write: Write to a PHY register 124 * @reset: Reset the MDIO bus, NULL if not supported 125 */ 126 struct mdio_ops { 127 int (*read)(struct udevice *mdio_dev, int addr, int devad, int reg); 128 int (*write)(struct udevice *mdio_dev, int addr, int devad, int reg, 129 u16 val); 130 int (*reset)(struct udevice *mdio_dev); 131 }; 132 133 #define mdio_get_ops(dev) ((struct mdio_ops *)(dev)->driver->ops) 134 135 /** 136 * dm_mdio_probe_devices - Call probe on all MII devices, currently used for 137 * MDIO console commands. 138 */ 139 void dm_mdio_probe_devices(void); 140 141 /** 142 * dm_mdio_read - Wrapper over .read() operation for DM MDIO 143 * 144 * @mdiodev: mdio device 145 * @addr: PHY address on MDIO bus 146 * @devad: device address on PHY if C45; should be MDIO_DEVAD_NONE if C22 147 * @reg: register address 148 * Return: register value if non-negative, -error code otherwise 149 */ 150 int dm_mdio_read(struct udevice *mdio_dev, int addr, int devad, int reg); 151 152 /** 153 * dm_mdio_write - Wrapper over .write() operation for DM MDIO 154 * 155 * @mdiodev: mdio device 156 * @addr: PHY address on MDIO bus 157 * @devad: device address on PHY if C45; should be MDIO_DEVAD_NONE if C22 158 * @reg: register address 159 * @val: value to write 160 * Return: 0 on success, -error code otherwise 161 */ 162 int dm_mdio_write(struct udevice *mdio_dev, int addr, int devad, int reg, u16 val); 163 164 /** 165 * dm_mdio_reset - Wrapper over .reset() operation for DM MDIO 166 * 167 * @mdiodev: mdio device 168 * Return: 0 on success, -error code otherwise 169 */ 170 int dm_mdio_reset(struct udevice *mdio_dev); 171 172 /** 173 * dm_phy_find_by_ofnode - Find PHY device by ofnode 174 * 175 * @phynode: PHY's ofnode 176 * 177 * Return: pointer to phy_device, or NULL on error 178 */ 179 struct phy_device *dm_phy_find_by_ofnode(ofnode phynode); 180 181 /** 182 * dm_mdio_phy_connect - Wrapper over phy_connect for DM MDIO 183 * 184 * @mdiodev: mdio device the PHY is accesible on 185 * @phyaddr: PHY address on MDIO bus 186 * @ethdev: ethernet device to connect to the PHY 187 * @interface: MAC-PHY protocol 188 * 189 * Return: pointer to phy_device, or 0 on error 190 */ 191 struct phy_device *dm_mdio_phy_connect(struct udevice *mdiodev, int phyaddr, 192 struct udevice *ethdev, 193 phy_interface_t interface); 194 195 /** 196 * dm_eth_phy_connect - Connect an Eth device to a PHY based on device tree 197 * 198 * Picks up the DT phy-handle and phy-mode from ethernet device node and 199 * connects the ethernet device to the linked PHY. 200 * 201 * @ethdev: ethernet device 202 * 203 * Return: pointer to phy_device, or 0 on error 204 */ 205 struct phy_device *dm_eth_phy_connect(struct udevice *ethdev); 206 207 /* indicates none of the child buses is selected */ 208 #define MDIO_MUX_SELECT_NONE -1 209 210 /** 211 * struct mdio_mux_ops - MDIO MUX operations 212 * 213 * @select: Selects a child bus 214 * @deselect: Clean up selection. Optional, can be NULL 215 */ 216 struct mdio_mux_ops { 217 int (*select)(struct udevice *mux, int cur, int sel); 218 int (*deselect)(struct udevice *mux, int sel); 219 }; 220 221 #define mdio_mux_get_ops(dev) ((struct mdio_mux_ops *)(dev)->driver->ops) 222 223 #endif 224