phy: cadence: Sierra: Move the link operations from serdes phy to link device

In commit 6f46c7441a ("phy: cadence: Sierra: Add a UCLASS_PHY device for
links"), a separate udevice of type UCLASS_PHY was created for each link.
Therefore, move the corresponding link operations under the link device.

Also, change the uclass of sierra phy to UCLASS_MISC as it is no longer the
phy device.

Fixes: 6f46c7441a ("phy: cadence: Sierra: Add a UCLASS_PHY device for links")
Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
Reviewed-by: Georgi Vlaev <g-vlaev@ti.com>
This commit is contained in:
Aswath Govindraju 2022-03-04 17:45:25 +05:30 committed by Tom Rini
parent ee5a284b29
commit b78f81eb5d

View file

@ -358,26 +358,10 @@ static inline int cdns_reset_deassert(struct reset_control *rst)
return 0; return 0;
} }
static inline struct cdns_sierra_inst *phy_get_drvdata(struct phy *phy) static int cdns_sierra_link_init(struct phy *gphy)
{ {
struct cdns_sierra_phy *sp = dev_get_priv(phy->dev); struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
int index; struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev->parent);
if (phy->id >= SIERRA_MAX_LANES)
return NULL;
for (index = 0; index < sp->nsubnodes; index++) {
if (phy->id == sp->phys[index]->mlane)
return sp->phys[index];
}
return NULL;
}
static int cdns_sierra_phy_init(struct phy *gphy)
{
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy);
struct cdns_sierra_phy *phy = dev_get_priv(gphy->dev);
struct cdns_sierra_data *init_data = phy->init_data; struct cdns_sierra_data *init_data = phy->init_data;
struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals; struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals;
enum cdns_sierra_phy_type phy_type = ins->phy_type; enum cdns_sierra_phy_type phy_type = ins->phy_type;
@ -443,10 +427,11 @@ static int cdns_sierra_phy_init(struct phy *gphy)
return 0; return 0;
} }
static int cdns_sierra_phy_on(struct phy *gphy) static int cdns_sierra_link_on(struct phy *gphy)
{ {
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy); struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev); struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev->parent);
struct udevice *dev = gphy->dev; struct udevice *dev = gphy->dev;
u32 val; u32 val;
int ret; int ret;
@ -503,16 +488,16 @@ static int cdns_sierra_phy_on(struct phy *gphy)
return ret; return ret;
} }
static int cdns_sierra_phy_off(struct phy *gphy) static int cdns_sierra_link_off(struct phy *gphy)
{ {
struct cdns_sierra_inst *ins = phy_get_drvdata(gphy); struct cdns_sierra_inst *ins = dev_get_priv(gphy->dev);
return reset_assert_bulk(ins->lnk_rst); return reset_assert_bulk(ins->lnk_rst);
} }
static int cdns_sierra_phy_reset(struct phy *gphy) static int cdns_sierra_link_reset(struct phy *gphy)
{ {
struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev); struct cdns_sierra_phy *sp = dev_get_priv(gphy->dev->parent);
reset_control_assert(sp->phy_rst); reset_control_assert(sp->phy_rst);
reset_control_deassert(sp->phy_rst); reset_control_deassert(sp->phy_rst);
@ -520,10 +505,10 @@ static int cdns_sierra_phy_reset(struct phy *gphy)
}; };
static const struct phy_ops ops = { static const struct phy_ops ops = {
.init = cdns_sierra_phy_init, .init = cdns_sierra_link_init,
.power_on = cdns_sierra_phy_on, .power_on = cdns_sierra_link_on,
.power_off = cdns_sierra_phy_off, .power_off = cdns_sierra_link_off,
.reset = cdns_sierra_phy_reset, .reset = cdns_sierra_link_reset,
}; };
struct cdns_sierra_pll_mux_sel { struct cdns_sierra_pll_mux_sel {
@ -580,7 +565,7 @@ static const struct clk_ops cdns_sierra_pll_mux_ops = {
.set_parent = cdns_sierra_pll_mux_set_parent, .set_parent = cdns_sierra_pll_mux_set_parent,
}; };
int cdns_sierra_pll_mux_probe(struct udevice *dev) static int cdns_sierra_pll_mux_probe(struct udevice *dev)
{ {
struct cdns_sierra_pll_mux *priv = dev_get_priv(dev); struct cdns_sierra_pll_mux *priv = dev_get_priv(dev);
struct cdns_sierra_phy *sp = dev_get_priv(dev->parent); struct cdns_sierra_phy *sp = dev_get_priv(dev->parent);
@ -1012,9 +997,8 @@ static int cdns_sierra_phy_get_resets(struct cdns_sierra_phy *sp,
return 0; return 0;
} }
static int cdns_sierra_bind_link_nodes(struct cdns_sierra_phy *sp) static int cdns_sierra_phy_bind(struct udevice *dev)
{ {
struct udevice *dev = sp->dev;
struct driver *link_drv; struct driver *link_drv;
ofnode child; ofnode child;
int rc; int rc;
@ -1079,6 +1063,7 @@ U_BOOT_DRIVER(sierra_phy_link) = {
.name = "sierra_phy_link", .name = "sierra_phy_link",
.id = UCLASS_PHY, .id = UCLASS_PHY,
.probe = cdns_sierra_link_probe, .probe = cdns_sierra_link_probe,
.ops = &ops,
.priv_auto = sizeof(struct cdns_sierra_inst), .priv_auto = sizeof(struct cdns_sierra_inst),
}; };
@ -1141,10 +1126,6 @@ static int cdns_sierra_phy_probe(struct udevice *dev)
} }
sp->autoconf = dev_read_bool(dev, "cdns,autoconf"); sp->autoconf = dev_read_bool(dev, "cdns,autoconf");
/* Binding link nodes as children to serdes */
ret = cdns_sierra_bind_link_nodes(sp);
if (ret)
goto clk_disable;
dev_info(dev, "sierra probed\n"); dev_info(dev, "sierra probed\n");
return 0; return 0;
@ -1971,10 +1952,10 @@ static const struct udevice_id cdns_sierra_id_table[] = {
U_BOOT_DRIVER(sierra_phy_provider) = { U_BOOT_DRIVER(sierra_phy_provider) = {
.name = "cdns,sierra", .name = "cdns,sierra",
.id = UCLASS_PHY, .id = UCLASS_MISC,
.of_match = cdns_sierra_id_table, .of_match = cdns_sierra_id_table,
.probe = cdns_sierra_phy_probe, .probe = cdns_sierra_phy_probe,
.remove = cdns_sierra_phy_remove, .remove = cdns_sierra_phy_remove,
.ops = &ops, .bind = cdns_sierra_phy_bind,
.priv_auto = sizeof(struct cdns_sierra_phy), .priv_auto = sizeof(struct cdns_sierra_phy),
}; };