Commit 15819a6c authored by Grygorii Strashko's avatar Grygorii Strashko Committed by Vinod Koul
Browse files

phy: ti: gmii-sel: move phy init in separate function



Move phy initialization in separate function to improve code readability
and simplify future changes.

Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Link: https://lore.kernel.org/r/20200828201943.29155-2-grygorii.strashko@ti.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent dce9d812
Loading
Loading
Loading
Loading
+64 −47
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@
#define AM33XX_GMII_SEL_MODE_RGMII	2

enum {
	PHY_GMII_SEL_PORT_MODE,
	PHY_GMII_SEL_PORT_MODE = 0,
	PHY_GMII_SEL_RGMII_ID_MODE,
	PHY_GMII_SEL_RMII_IO_CLK_EN,
	PHY_GMII_SEL_LAST,
@@ -242,68 +242,85 @@ static struct phy *phy_gmii_sel_of_xlate(struct device *dev,
	return priv->if_phys[phy_id].if_phy;
}

static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv)
static int phy_gmii_init_phy(struct phy_gmii_sel_priv *priv, int port,
			     struct phy_gmii_sel_phy_priv *if_phy)
{
	const struct phy_gmii_sel_soc_data *soc_data = priv->soc_data;
	struct device *dev = priv->dev;
	struct phy_gmii_sel_phy_priv *if_phys;
	int i, num_ports, ret;

	num_ports = priv->soc_data->num_ports;

	if_phys = devm_kcalloc(priv->dev, num_ports,
			       sizeof(*if_phys), GFP_KERNEL);
	if (!if_phys)
		return -ENOMEM;
	dev_dbg(dev, "%s %d\n", __func__, num_ports);

	for (i = 0; i < num_ports; i++) {
		const struct reg_field *field;
	const struct reg_field *fields;
	struct regmap_field *regfield;
	struct reg_field field;
	int ret;

		if_phys[i].id = i + 1;
		if_phys[i].priv = priv;
	if_phy->id = port;
	if_phy->priv = priv;

		field = &soc_data->regfields[i][PHY_GMII_SEL_PORT_MODE];
	fields = soc_data->regfields[port - 1];
	field = *fields++;
	dev_dbg(dev, "%s field %x %d %d\n", __func__,
			field->reg, field->msb, field->lsb);
		field.reg, field.msb, field.lsb);

		regfield = devm_regmap_field_alloc(dev, priv->regmap, *field);
	regfield = devm_regmap_field_alloc(dev, priv->regmap, field);
	if (IS_ERR(regfield))
		return PTR_ERR(regfield);
		if_phys[i].fields[PHY_GMII_SEL_PORT_MODE] = regfield;
	if_phy->fields[PHY_GMII_SEL_PORT_MODE] = regfield;

		field = &soc_data->regfields[i][PHY_GMII_SEL_RGMII_ID_MODE];
		if (field->reg != (~0)) {
	field = *fields++;
	if (field.reg != (~0)) {
		regfield = devm_regmap_field_alloc(dev,
						   priv->regmap,
							   *field);
						   field);
		if (IS_ERR(regfield))
			return PTR_ERR(regfield);
			if_phys[i].fields[PHY_GMII_SEL_RGMII_ID_MODE] =
				regfield;
		if_phy->fields[PHY_GMII_SEL_RGMII_ID_MODE] = regfield;
		dev_dbg(dev, "%s field %x %d %d\n", __func__,
			field.reg, field.msb, field.lsb);
	}

		field = &soc_data->regfields[i][PHY_GMII_SEL_RMII_IO_CLK_EN];
		if (field->reg != (~0)) {
	field = *fields;
	if (field.reg != (~0)) {
		regfield = devm_regmap_field_alloc(dev,
						   priv->regmap,
							   *field);
						   field);
		if (IS_ERR(regfield))
			return PTR_ERR(regfield);
			if_phys[i].fields[PHY_GMII_SEL_RMII_IO_CLK_EN] =
				regfield;
		if_phy->fields[PHY_GMII_SEL_RMII_IO_CLK_EN] = regfield;
		dev_dbg(dev, "%s field %x %d %d\n", __func__,
			field.reg, field.msb, field.lsb);
	}

		if_phys[i].if_phy = devm_phy_create(dev,
	if_phy->if_phy = devm_phy_create(dev,
					 priv->dev->of_node,
					 &phy_gmii_sel_ops);
		if (IS_ERR(if_phys[i].if_phy)) {
			ret = PTR_ERR(if_phys[i].if_phy);
			dev_err(dev, "Failed to create phy%d %d\n", i, ret);
	if (IS_ERR(if_phy->if_phy)) {
		ret = PTR_ERR(if_phy->if_phy);
		dev_err(dev, "Failed to create phy%d %d\n", port, ret);
		return ret;
	}
		phy_set_drvdata(if_phys[i].if_phy, &if_phys[i]);
	phy_set_drvdata(if_phy->if_phy, if_phy);

	return 0;
}

static int phy_gmii_sel_init_ports(struct phy_gmii_sel_priv *priv)
{
	const struct phy_gmii_sel_soc_data *soc_data = priv->soc_data;
	struct device *dev = priv->dev;
	struct phy_gmii_sel_phy_priv *if_phys;
	int i, num_ports, ret;

	num_ports = soc_data->num_ports;

	if_phys = devm_kcalloc(priv->dev, num_ports,
			       sizeof(*if_phys), GFP_KERNEL);
	if (!if_phys)
		return -ENOMEM;
	dev_dbg(dev, "%s %d\n", __func__, num_ports);

	for (i = 0; i < num_ports; i++) {
		ret = phy_gmii_init_phy(priv, i + 1, &if_phys[i]);
		if (ret)
			return ret;
	}

	priv->if_phys = if_phys;