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