xref: /rk3399_rockchip-uboot/include/miiphy.h (revision 8a2d844d7d70ac9d97f9e6e344ff56ced05f8e3e)
146263f2dSWolfgang Denk /*
21b387ef5SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0	IBM-pibs
346263f2dSWolfgang Denk  *
446263f2dSWolfgang Denk  * Additions (C) Copyright 2009 Industrie Dial Face S.p.A.
546263f2dSWolfgang Denk  */
6214ec6bbSwdenk /*----------------------------------------------------------------------------+
7214ec6bbSwdenk |
8214ec6bbSwdenk |  File Name:	miiphy.h
9214ec6bbSwdenk |
10214ec6bbSwdenk |  Function:	Include file defining PHY registers.
11214ec6bbSwdenk |
12214ec6bbSwdenk |  Author:	Mark Wisner
13214ec6bbSwdenk |
14214ec6bbSwdenk +----------------------------------------------------------------------------*/
15214ec6bbSwdenk #ifndef _miiphy_h_
16214ec6bbSwdenk #define _miiphy_h_
17214ec6bbSwdenk 
185f184715SAndy Fleming #include <common.h>
198ef583a0SMike Frysinger #include <linux/mii.h>
205f184715SAndy Fleming #include <linux/list.h>
2163ff004cSMarian Balakowicz #include <net.h>
225f184715SAndy Fleming #include <phy.h>
235f184715SAndy Fleming 
24f915c931SWolfgang Denk int miiphy_read(const char *devname, unsigned char addr, unsigned char reg,
2563ff004cSMarian Balakowicz 		 unsigned short *value);
26f915c931SWolfgang Denk int miiphy_write(const char *devname, unsigned char addr, unsigned char reg,
2763ff004cSMarian Balakowicz 		  unsigned short value);
285700bb63SMike Frysinger int miiphy_info(const char *devname, unsigned char addr, unsigned int *oui,
2963ff004cSMarian Balakowicz 		 unsigned char *model, unsigned char *rev);
305700bb63SMike Frysinger int miiphy_reset(const char *devname, unsigned char addr);
315700bb63SMike Frysinger int miiphy_speed(const char *devname, unsigned char addr);
325700bb63SMike Frysinger int miiphy_duplex(const char *devname, unsigned char addr);
335700bb63SMike Frysinger int miiphy_is_1000base_x(const char *devname, unsigned char addr);
346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_FAULT_ECHO_LINK_DOWN
355700bb63SMike Frysinger int miiphy_link(const char *devname, unsigned char addr);
36fc3e2165Swdenk #endif
37214ec6bbSwdenk 
38d9785c14SMarian Balakowicz void miiphy_init(void);
39d9785c14SMarian Balakowicz 
405700bb63SMike Frysinger int miiphy_set_current_dev(const char *devname);
415700bb63SMike Frysinger const char *miiphy_get_current_dev(void);
425f184715SAndy Fleming struct mii_dev *mdio_get_current_dev(void);
435f184715SAndy Fleming struct mii_dev *miiphy_get_dev_by_name(const char *devname);
445f184715SAndy Fleming struct phy_device *mdio_phydev_for_ethname(const char *devname);
4563ff004cSMarian Balakowicz 
4663ff004cSMarian Balakowicz void miiphy_listdev(void);
4763ff004cSMarian Balakowicz 
485f184715SAndy Fleming struct mii_dev *mdio_alloc(void);
49cb6baca7SBin Meng void mdio_free(struct mii_dev *bus);
505f184715SAndy Fleming int mdio_register(struct mii_dev *bus);
5179e2a6a0SMichal Simek 
5279e2a6a0SMichal Simek /**
5379e2a6a0SMichal Simek  * mdio_register_seq - Register mdio bus with sequence number
5479e2a6a0SMichal Simek  * @bus: mii device structure
5579e2a6a0SMichal Simek  * @seq: sequence number
5679e2a6a0SMichal Simek  *
5779e2a6a0SMichal Simek  * Return: 0 if success, negative value if error
5879e2a6a0SMichal Simek  */
5979e2a6a0SMichal Simek int mdio_register_seq(struct mii_dev *bus, int seq);
60cb6baca7SBin Meng int mdio_unregister(struct mii_dev *bus);
615f184715SAndy Fleming void mdio_list_devices(void);
625f184715SAndy Fleming 
634ba31ab3SLuigi 'Comio' Mantellini #ifdef CONFIG_BITBANGMII
6463ff004cSMarian Balakowicz 
654ba31ab3SLuigi 'Comio' Mantellini #define BB_MII_DEVNAME	"bb_miiphy"
664ba31ab3SLuigi 'Comio' Mantellini 
674ba31ab3SLuigi 'Comio' Mantellini struct bb_miiphy_bus {
68f6add132SMike Frysinger 	char name[16];
694ba31ab3SLuigi 'Comio' Mantellini 	int (*init)(struct bb_miiphy_bus *bus);
704ba31ab3SLuigi 'Comio' Mantellini 	int (*mdio_active)(struct bb_miiphy_bus *bus);
714ba31ab3SLuigi 'Comio' Mantellini 	int (*mdio_tristate)(struct bb_miiphy_bus *bus);
724ba31ab3SLuigi 'Comio' Mantellini 	int (*set_mdio)(struct bb_miiphy_bus *bus, int v);
734ba31ab3SLuigi 'Comio' Mantellini 	int (*get_mdio)(struct bb_miiphy_bus *bus, int *v);
744ba31ab3SLuigi 'Comio' Mantellini 	int (*set_mdc)(struct bb_miiphy_bus *bus, int v);
754ba31ab3SLuigi 'Comio' Mantellini 	int (*delay)(struct bb_miiphy_bus *bus);
764ba31ab3SLuigi 'Comio' Mantellini #ifdef CONFIG_BITBANGMII_MULTI
774ba31ab3SLuigi 'Comio' Mantellini 	void *priv;
784ba31ab3SLuigi 'Comio' Mantellini #endif
794ba31ab3SLuigi 'Comio' Mantellini };
804ba31ab3SLuigi 'Comio' Mantellini 
814ba31ab3SLuigi 'Comio' Mantellini extern struct bb_miiphy_bus bb_miiphy_buses[];
824ba31ab3SLuigi 'Comio' Mantellini extern int bb_miiphy_buses_num;
834ba31ab3SLuigi 'Comio' Mantellini 
844ba31ab3SLuigi 'Comio' Mantellini void bb_miiphy_init(void);
85dfcc496eSJoe Hershberger int bb_miiphy_read(struct mii_dev *miidev, int addr, int devad, int reg);
86dfcc496eSJoe Hershberger int bb_miiphy_write(struct mii_dev *miidev, int addr, int devad, int reg,
87dfcc496eSJoe Hershberger 		    u16 value);
884ba31ab3SLuigi 'Comio' Mantellini #endif
89214ec6bbSwdenk 
90214ec6bbSwdenk /* phy seed setup */
91214ec6bbSwdenk #define AUTO			99
92855a496fSwdenk #define _1000BASET		1000
93214ec6bbSwdenk #define _100BASET		100
94214ec6bbSwdenk #define _10BASET		10
95214ec6bbSwdenk #define HALF			22
96214ec6bbSwdenk #define FULL			44
97214ec6bbSwdenk 
98214ec6bbSwdenk /* phy register offsets */
998ef583a0SMike Frysinger #define MII_MIPSCR		0x11
100214ec6bbSwdenk 
1018ef583a0SMike Frysinger /* MII_LPA */
102b9711de1Swdenk #define PHY_ANLPAR_PSB_802_3	0x0001
103b9711de1Swdenk #define PHY_ANLPAR_PSB_802_9	0x0002
104b9711de1Swdenk 
1058ef583a0SMike Frysinger /* MII_CTRL1000 masks */
10671bc6e64SLarry Johnson #define PHY_1000BTCR_1000FD	0x0200
10771bc6e64SLarry Johnson #define PHY_1000BTCR_1000HD	0x0100
10871bc6e64SLarry Johnson 
1098ef583a0SMike Frysinger /* MII_STAT1000 masks */
110855a496fSwdenk #define PHY_1000BTSR_MSCF	0x8000
111855a496fSwdenk #define PHY_1000BTSR_MSCR	0x4000
112855a496fSwdenk #define PHY_1000BTSR_LRS	0x2000
113855a496fSwdenk #define PHY_1000BTSR_RRS	0x1000
114855a496fSwdenk #define PHY_1000BTSR_1000FD	0x0800
115855a496fSwdenk #define PHY_1000BTSR_1000HD	0x0400
116855a496fSwdenk 
11771bc6e64SLarry Johnson /* phy EXSR */
1188ef583a0SMike Frysinger #define ESTATUS_1000XF		0x8000
1198ef583a0SMike Frysinger #define ESTATUS_1000XH		0x4000
12071bc6e64SLarry Johnson 
121*8a2d844dSAlex Marginean #ifdef CONFIG_DM_MDIO
122*8a2d844dSAlex Marginean 
123*8a2d844dSAlex Marginean /**
124*8a2d844dSAlex Marginean  * struct mdio_perdev_priv - Per-device class data for MDIO DM
125*8a2d844dSAlex Marginean  *
126*8a2d844dSAlex Marginean  * @mii_bus: Supporting MII legacy bus
127*8a2d844dSAlex Marginean  */
128*8a2d844dSAlex Marginean struct mdio_perdev_priv {
129*8a2d844dSAlex Marginean 	struct mii_dev *mii_bus;
130*8a2d844dSAlex Marginean };
131*8a2d844dSAlex Marginean 
132*8a2d844dSAlex Marginean /**
133*8a2d844dSAlex Marginean  * struct mdio_ops - MDIO bus operations
134*8a2d844dSAlex Marginean  *
135*8a2d844dSAlex Marginean  * @read: Read from a PHY register
136*8a2d844dSAlex Marginean  * @write: Write to a PHY register
137*8a2d844dSAlex Marginean  * @reset: Reset the MDIO bus, NULL if not supported
138*8a2d844dSAlex Marginean  */
139*8a2d844dSAlex Marginean struct mdio_ops {
140*8a2d844dSAlex Marginean 	int (*read)(struct udevice *mdio_dev, int addr, int devad, int reg);
141*8a2d844dSAlex Marginean 	int (*write)(struct udevice *mdio_dev, int addr, int devad, int reg,
142*8a2d844dSAlex Marginean 		     u16 val);
143*8a2d844dSAlex Marginean 	int (*reset)(struct udevice *mdio_dev);
144*8a2d844dSAlex Marginean };
145*8a2d844dSAlex Marginean 
146*8a2d844dSAlex Marginean #define mdio_get_ops(dev) ((struct mdio_ops *)(dev)->driver->ops)
147*8a2d844dSAlex Marginean 
148*8a2d844dSAlex Marginean /**
149*8a2d844dSAlex Marginean  * dm_mdio_probe_devices - Call probe on all MII devices, currently used for
150*8a2d844dSAlex Marginean  * MDIO console commands.
151*8a2d844dSAlex Marginean  */
152*8a2d844dSAlex Marginean void dm_mdio_probe_devices(void);
153*8a2d844dSAlex Marginean 
154*8a2d844dSAlex Marginean /**
155*8a2d844dSAlex Marginean  * dm_mdio_phy_connect - Wrapper over phy_connect for DM MDIO
156*8a2d844dSAlex Marginean  *
157*8a2d844dSAlex Marginean  * @dev: mdio dev
158*8a2d844dSAlex Marginean  * @addr: PHY address on MDIO bus
159*8a2d844dSAlex Marginean  * @ethdev: ethernet device to connect to the PHY
160*8a2d844dSAlex Marginean  * @interface: MAC-PHY protocol
161*8a2d844dSAlex Marginean  *
162*8a2d844dSAlex Marginean  * @return pointer to phy_device, or 0 on error
163*8a2d844dSAlex Marginean  */
164*8a2d844dSAlex Marginean struct phy_device *dm_mdio_phy_connect(struct udevice *dev, int addr,
165*8a2d844dSAlex Marginean 				       struct udevice *ethdev,
166*8a2d844dSAlex Marginean 				       phy_interface_t interface);
167*8a2d844dSAlex Marginean 
168*8a2d844dSAlex Marginean #endif
169*8a2d844dSAlex Marginean 
170214ec6bbSwdenk #endif
171