forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.6 KiB
118 lines
2.6 KiB
/* 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(struct mii_bus *bus, int phy_id, int regnum); |
|
int cavium_mdiobus_write(struct mii_bus *bus, int phy_id, int regnum, u16 val);
|
|
|