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.
67 lines
2.4 KiB
67 lines
2.4 KiB
7 months ago
|
#ifndef __HLETH_MDIO_H
|
||
|
#define __HLETH_MDIO_H
|
||
|
|
||
|
#define HLETH_MDIO_FRQDIV 0
|
||
|
|
||
|
#define HLETH_MDIO_RWCTRL 0x1100
|
||
|
#define HLETH_MDIO_RO_DATA 0x1104
|
||
|
#define HLETH_U_MDIO_PHYADDR 0x0108
|
||
|
#define HLETH_D_MDIO_PHYADDR 0x2108
|
||
|
#define HLETH_U_MDIO_RO_STAT 0x010C
|
||
|
#define HLETH_D_MDIO_RO_STAT 0x210C
|
||
|
#define HLETH_U_MDIO_ANEG_CTRL 0x0110
|
||
|
#define HLETH_D_MDIO_ANEG_CTRL 0x2110
|
||
|
#define HLETH_U_MDIO_IRQENA 0x0114
|
||
|
#define HLETH_D_MDIO_IRQENA 0x2114
|
||
|
|
||
|
#define mdio_mk_rwctl(cpu_data_in, finish, rw, phy_exaddr, frq_div, phy_regnum) \
|
||
|
(((cpu_data_in) << 16) | \
|
||
|
(((finish) & 0x01) << 15) | \
|
||
|
(((rw) & 0x01) << 13) | \
|
||
|
(((phy_exaddr) & 0x1F) << 8) | \
|
||
|
(((frq_div) & 0x7) << 5) | \
|
||
|
((phy_regnum) & 0x1F))
|
||
|
|
||
|
/* hardware set bit'15 of MDIO_REG(0) if mdio ready */
|
||
|
#define mdio_test_ready(priv) (hleth_readl(priv->glb_base, \
|
||
|
HLETH_MDIO_RWCTRL) & (1 << 15))
|
||
|
|
||
|
#define mdio_start_phyread(priv, phy_addr, regnum) \
|
||
|
hleth_writel(priv->glb_base, \
|
||
|
mdio_mk_rwctl(0, 0, 0, phy_addr, HLETH_MDIO_FRQDIV, \
|
||
|
regnum), \
|
||
|
HLETH_MDIO_RWCTRL)
|
||
|
|
||
|
#define mdio_get_phyread_val(priv) (hleth_readl(priv->glb_base, \
|
||
|
HLETH_MDIO_RO_DATA) & 0xFFFF)
|
||
|
|
||
|
#define mdio_phywrite(priv, phy_addr, regnum, val) \
|
||
|
hleth_writel(priv->glb_base, \
|
||
|
mdio_mk_rwctl(val, 0, 1, phy_addr, HLETH_MDIO_FRQDIV, \
|
||
|
regnum), \
|
||
|
HLETH_MDIO_RWCTRL)
|
||
|
|
||
|
/* write mdio registers reset value */
|
||
|
#define mdio_reg_reset(priv) do { \
|
||
|
hleth_writel(priv->glb_base, 0x00008000, HLETH_MDIO_RWCTRL); \
|
||
|
hleth_writel(priv->glb_base, 0x00000001, HLETH_U_MDIO_PHYADDR); \
|
||
|
hleth_writel(priv->glb_base, 0x00000001, HLETH_D_MDIO_PHYADDR); \
|
||
|
hleth_writel(priv->glb_base, 0x04631EA9, HLETH_U_MDIO_ANEG_CTRL); \
|
||
|
hleth_writel(priv->glb_base, 0x04631EA9, HLETH_D_MDIO_ANEG_CTRL); \
|
||
|
hleth_writel(priv->glb_base, 0x00000000, HLETH_U_MDIO_IRQENA); \
|
||
|
hleth_writel(priv->glb_base, 0x00000000, HLETH_D_MDIO_IRQENA); \
|
||
|
} while (0)
|
||
|
|
||
|
int hleth_mdiobus_driver_init(struct platform_device *pdev,
|
||
|
struct hleth_netdev_priv *priv);
|
||
|
void hleth_mdiobus_driver_exit(struct hleth_netdev_priv *priv);
|
||
|
|
||
|
int hleth_mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum);
|
||
|
int hleth_mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum,
|
||
|
u16 val);
|
||
|
int hleth_mdiobus_write_nodelay(struct mii_bus *bus, int phy_addr, int regnum,
|
||
|
u16 val);
|
||
|
#endif
|
||
|
|
||
|
/* vim: set ts=8 sw=8 tw=78: */
|