| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (C) 2009-2016 Cavium, Inc. |
| */ |
| |
| enum cavium_mdiobus_mode { |
| UNINIT = 0, |
| C22, |
| C45 |
| }; |
| |
| #define SMI_CMD 0x0 |
| #define SMI_WR_DAT 0x8 |
| #define SMI_RD_DAT 0x10 |
| #define SMI_CLK 0x18 |
| #define SMI_EN 0x20 |
| |
| #ifdef __BIG_ENDIAN_BITFIELD |
| #define OCT_MDIO_BITFIELD_FIELD(field, more) \ |
| field; \ |
| more |
| |
| #else |
| #define OCT_MDIO_BITFIELD_FIELD(field, more) \ |
| more \ |
| field; |
| |
| #endif |
| |
| union cvmx_smix_clk { |
| u64 u64; |
| struct cvmx_smix_clk_s { |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_25_63:39, |
| OCT_MDIO_BITFIELD_FIELD(u64 mode:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_21_23:3, |
| OCT_MDIO_BITFIELD_FIELD(u64 sample_hi:5, |
| OCT_MDIO_BITFIELD_FIELD(u64 sample_mode:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_14_14:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 clk_idle:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 preamble:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 sample:4, |
| OCT_MDIO_BITFIELD_FIELD(u64 phase:8, |
| ;)))))))))) |
| } s; |
| }; |
| |
| union cvmx_smix_cmd { |
| u64 u64; |
| struct cvmx_smix_cmd_s { |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_18_63:46, |
| OCT_MDIO_BITFIELD_FIELD(u64 phy_op:2, |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_13_15:3, |
| OCT_MDIO_BITFIELD_FIELD(u64 phy_adr:5, |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_5_7:3, |
| OCT_MDIO_BITFIELD_FIELD(u64 reg_adr:5, |
| ;)))))) |
| } s; |
| }; |
| |
| union cvmx_smix_en { |
| u64 u64; |
| struct cvmx_smix_en_s { |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_1_63:63, |
| OCT_MDIO_BITFIELD_FIELD(u64 en:1, |
| ;)) |
| } s; |
| }; |
| |
| union cvmx_smix_rd_dat { |
| u64 u64; |
| struct cvmx_smix_rd_dat_s { |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_18_63:46, |
| OCT_MDIO_BITFIELD_FIELD(u64 pending:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 val:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 dat:16, |
| ;)))) |
| } s; |
| }; |
| |
| union cvmx_smix_wr_dat { |
| u64 u64; |
| struct cvmx_smix_wr_dat_s { |
| OCT_MDIO_BITFIELD_FIELD(u64 reserved_18_63:46, |
| OCT_MDIO_BITFIELD_FIELD(u64 pending:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 val:1, |
| OCT_MDIO_BITFIELD_FIELD(u64 dat:16, |
| ;)))) |
| } s; |
| }; |
| |
| struct cavium_mdiobus { |
| struct mii_bus *mii_bus; |
| void __iomem *register_base; |
| enum cavium_mdiobus_mode mode; |
| }; |
| |
| #ifdef CONFIG_CAVIUM_OCTEON_SOC |
| |
| #include <asm/octeon/octeon.h> |
| |
| static inline void oct_mdio_writeq(u64 val, void __iomem *addr) |
| { |
| cvmx_write_csr((u64 __force)addr, val); |
| } |
| |
| static inline u64 oct_mdio_readq(void __iomem *addr) |
| { |
| return cvmx_read_csr((u64 __force)addr); |
| } |
| #else |
| #include <linux/io-64-nonatomic-lo-hi.h> |
| |
| #define oct_mdio_writeq(val, addr) writeq(val, addr) |
| #define oct_mdio_readq(addr) readq(addr) |
| #endif |
| |
| int cavium_mdiobus_read_c22(struct mii_bus *bus, int phy_id, int regnum); |
| int cavium_mdiobus_write_c22(struct mii_bus *bus, int phy_id, int regnum, |
| u16 val); |
| int cavium_mdiobus_read_c45(struct mii_bus *bus, int phy_id, int devad, |
| int regnum); |
| int cavium_mdiobus_write_c45(struct mii_bus *bus, int phy_id, int devad, |
| int regnum, u16 val); |