net: phy: add struct device_type representation of a PHY
A PHY is a type of MDIO device, so let's model it as struct device_type and place PM ops, attribute groups and release callback on device type level. For this the attribute definitions have to be moved. This change allows us to get rid of the PM ops on a bus level in a second step. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7d840a6065
commit
7f4828ff27
|
@ -346,6 +346,55 @@ static int phy_bus_match(struct device *dev, struct device_driver *drv)
|
|||
}
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
phy_id_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
|
||||
return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_id);
|
||||
|
||||
static ssize_t
|
||||
phy_interface_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
const char *mode = NULL;
|
||||
|
||||
if (phy_is_internal(phydev))
|
||||
mode = "internal";
|
||||
else
|
||||
mode = phy_modes(phydev->interface);
|
||||
|
||||
return sprintf(buf, "%s\n", mode);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_interface);
|
||||
|
||||
static ssize_t
|
||||
phy_has_fixups_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", phydev->has_fixups);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_has_fixups);
|
||||
|
||||
static struct attribute *phy_dev_attrs[] = {
|
||||
&dev_attr_phy_id.attr,
|
||||
&dev_attr_phy_interface.attr,
|
||||
&dev_attr_phy_has_fixups.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(phy_dev);
|
||||
|
||||
static const struct device_type mdio_bus_phy_type = {
|
||||
.name = "PHY",
|
||||
.groups = phy_dev_groups,
|
||||
.release = phy_device_release,
|
||||
.pm = MDIO_BUS_PHY_PM_OPS,
|
||||
};
|
||||
|
||||
struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
|
||||
bool is_c45,
|
||||
struct phy_c45_device_ids *c45_ids)
|
||||
|
@ -359,11 +408,10 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
mdiodev = &dev->mdio;
|
||||
mdiodev->dev.release = phy_device_release;
|
||||
mdiodev->dev.parent = &bus->dev;
|
||||
mdiodev->dev.bus = &mdio_bus_type;
|
||||
mdiodev->dev.type = &mdio_bus_phy_type;
|
||||
mdiodev->bus = bus;
|
||||
mdiodev->pm_ops = MDIO_BUS_PHY_PM_OPS;
|
||||
mdiodev->bus_match = phy_bus_match;
|
||||
mdiodev->addr = addr;
|
||||
mdiodev->flags = MDIO_DEVICE_FLAG_PHY;
|
||||
|
@ -587,48 +635,6 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
|
|||
}
|
||||
EXPORT_SYMBOL(get_phy_device);
|
||||
|
||||
static ssize_t
|
||||
phy_id_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
|
||||
return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_id);
|
||||
|
||||
static ssize_t
|
||||
phy_interface_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
const char *mode = NULL;
|
||||
|
||||
if (phy_is_internal(phydev))
|
||||
mode = "internal";
|
||||
else
|
||||
mode = phy_modes(phydev->interface);
|
||||
|
||||
return sprintf(buf, "%s\n", mode);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_interface);
|
||||
|
||||
static ssize_t
|
||||
phy_has_fixups_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct phy_device *phydev = to_phy_device(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", phydev->has_fixups);
|
||||
}
|
||||
static DEVICE_ATTR_RO(phy_has_fixups);
|
||||
|
||||
static struct attribute *phy_dev_attrs[] = {
|
||||
&dev_attr_phy_id.attr,
|
||||
&dev_attr_phy_interface.attr,
|
||||
&dev_attr_phy_has_fixups.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(phy_dev);
|
||||
|
||||
/**
|
||||
* phy_device_register - Register the phy device on the MDIO bus
|
||||
* @phydev: phy_device structure to be added to the MDIO bus
|
||||
|
@ -651,8 +657,6 @@ int phy_device_register(struct phy_device *phydev)
|
|||
goto out;
|
||||
}
|
||||
|
||||
phydev->mdio.dev.groups = phy_dev_groups;
|
||||
|
||||
err = device_add(&phydev->mdio.dev);
|
||||
if (err) {
|
||||
pr_err("PHY %d failed to add\n", phydev->mdio.addr);
|
||||
|
|
Loading…
Reference in New Issue