uboot/include/miiphy.h
<<
>>
Prefs
   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
  36int miiphy_set_current_dev(const char *devname);
  37const char *miiphy_get_current_dev(void);
  38struct mii_dev *mdio_get_current_dev(void);
  39struct list_head *mdio_get_list_head(void);
  40struct mii_dev *miiphy_get_dev_by_name(const char *devname);
  41struct phy_device *mdio_phydev_for_ethname(const char *devname);
  42
  43void miiphy_listdev(void);
  44
  45struct mii_dev *mdio_alloc(void);
  46void mdio_free(struct mii_dev *bus);
  47int 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 */
  56int mdio_register_seq(struct mii_dev *bus, int seq);
  57int mdio_unregister(struct mii_dev *bus);
  58void mdio_list_devices(void);
  59
  60#ifdef CONFIG_BITBANGMII
  61
  62#define BB_MII_DEVNAME  "bb_miiphy"
  63
  64struct 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
  73int bb_miiphy_read(struct mii_dev *miidev, const struct bb_miiphy_bus_ops *ops,
  74                   int addr, int devad, int reg);
  75int 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 */
 115struct 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 */
 126struct 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 */
 139void 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 */
 150int 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 */
 162int 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 */
 170int 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 */
 179struct 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 */
 191struct 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 */
 205struct 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 */
 216struct 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