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

#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: */