1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_MDIO_BITBANG_H 3 #define __LINUX_MDIO_BITBANG_H 4 5 #include <linux/phy.h> 6 7 struct module; 8 9 struct mdiobb_ctrl; 10 11 struct mdiobb_ops { 12 struct module *owner; 13 14 /* Set the Management Data Clock high if level is one, 15 * low if level is zero. 16 */ 17 void (*set_mdc)(struct mdiobb_ctrl *ctrl, int level); 18 19 /* Configure the Management Data I/O pin as an input if 20 * "output" is zero, or an output if "output" is one. 21 */ 22 void (*set_mdio_dir)(struct mdiobb_ctrl *ctrl, int output); 23 24 /* Set the Management Data I/O pin high if value is one, 25 * low if "value" is zero. This may only be called 26 * when the MDIO pin is configured as an output. 27 */ 28 void (*set_mdio_data)(struct mdiobb_ctrl *ctrl, int value); 29 30 /* Retrieve the state Management Data I/O pin. */ 31 int (*get_mdio_data)(struct mdiobb_ctrl *ctrl); 32 }; 33 34 struct mdiobb_ctrl { 35 const struct mdiobb_ops *ops; 36 unsigned int override_op_c22; 37 u8 op_c22_read; 38 u8 op_c22_write; 39 }; 40 41 int mdiobb_read_c22(struct mii_bus *bus, int phy, int reg); 42 int mdiobb_write_c22(struct mii_bus *bus, int phy, int reg, u16 val); 43 int mdiobb_read_c45(struct mii_bus *bus, int devad, int phy, int reg); 44 int mdiobb_write_c45(struct mii_bus *bus, int devad, int phy, int reg, u16 val); 45 46 /* The returned bus is not yet registered with the phy layer. */ 47 struct mii_bus *alloc_mdio_bitbang(struct mdiobb_ctrl *ctrl); 48 49 /* The bus must already have been unregistered. */ 50 void free_mdio_bitbang(struct mii_bus *bus); 51 52 #endif 53