blob: bf283578deeca35a53108b7597c572c6c7b6f74d [file] [log] [blame]
#ifndef __BACKPORT_LINUX_PHY_H
#define __BACKPORT_LINUX_PHY_H
#include_next <linux/phy.h>
#include <linux/compiler.h>
#include <linux/version.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))
#define phy_connect(dev, bus_id, handler, interface) \
phy_connect(dev, bus_id, handler, 0, interface)
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0))
#define phydev_name LINUX_BACKPORT(phydev_name)
static inline const char *phydev_name(const struct phy_device *phydev)
{
return dev_name(&phydev->dev);
}
#define mdiobus_is_registered_device LINUX_BACKPORT(mdiobus_is_registered_device)
static inline bool mdiobus_is_registered_device(struct mii_bus *bus, int addr)
{
return bus->phy_map[addr];
}
#define phy_attached_print LINUX_BACKPORT(phy_attached_print)
void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
__printf(2, 3);
#define phy_attached_info LINUX_BACKPORT(phy_attached_info)
void phy_attached_info(struct phy_device *phydev);
static inline int backport_mdiobus_register(struct mii_bus *bus)
{
bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
if (!bus->irq) {
pr_err("mii_bus irq allocation failed\n");
return -ENOMEM;
}
memset(bus->irq, PHY_POLL, sizeof(int) * PHY_MAX_ADDR);
/* in kernel 4.3 a #define for mdiobus_register is added to the kernel. */
#ifndef mdiobus_register
return mdiobus_register(bus);
#else
return __mdiobus_register(bus, THIS_MODULE);
#endif
}
#ifdef mdiobus_register
#undef mdiobus_register
#endif
#define mdiobus_register LINUX_BACKPORT(mdiobus_register)
static inline void backport_mdiobus_unregister(struct mii_bus *bus)
{
kfree(bus->irq);
mdiobus_unregister(bus);
}
#define mdiobus_unregister LINUX_BACKPORT(mdiobus_unregister)
#endif /* < 4.5 */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0))
#define phydev_get_addr LINUX_BACKPORT(phydev_get_addr)
static inline int phydev_get_addr(struct phy_device *phydev)
{
return phydev->addr;
}
#else
#define phydev_get_addr LINUX_BACKPORT(phydev_get_addr)
static inline int phydev_get_addr(struct phy_device *phydev)
{
return phydev->mdio.addr;
}
#endif
#endif /* __BACKPORT_LINUX_PHY_H */