Hi Kishon,

On Tue, Aug 29, 2017 at 04:34:17PM +0530, Kishon Vijay Abraham I wrote:
> On Monday 28 August 2017 08:27 PM, Antoine Tenart wrote:
> >  
> > +config PHY_MVEBU_CP110_COMPHY
> > +   tristate "Marvell CP110 comphy driver"
> > +   depends on ARCH_MVEBU && OF
> 
> (ARCH_MVEBU || COMPILE_TEST) above..

Sure, I'll update.

> > +static const struct mvebu_comhy_conf mvebu_comphy_cp110_modes[] = {
> > +   /* lane 0 */
> > +   MVEBU_COMPHY_CONF(0, 1, PHY_MODE_SGMII, 0x1),
> > +   /* lane 1 */
> > +   MVEBU_COMPHY_CONF(1, 2, PHY_MODE_SGMII, 0x1),
> > +   /* lane 2 */
> > +   MVEBU_COMPHY_CONF(2, 0, PHY_MODE_SGMII, 0x1),
> > +   MVEBU_COMPHY_CONF(2, 0, PHY_MODE_10GKR, 0x1),
> > +   /* lane 3 */
> > +   MVEBU_COMPHY_CONF(3, 1, PHY_MODE_SGMII, 0x2),
> > +   /* lane 4 */
> > +   MVEBU_COMPHY_CONF(4, 0, PHY_MODE_SGMII, 0x2),
> > +   MVEBU_COMPHY_CONF(4, 0, PHY_MODE_10GKR, 0x2),
> > +   MVEBU_COMPHY_CONF(4, 1, PHY_MODE_SGMII, 0x1),
> > +   /* lane 5 */
> > +   MVEBU_COMPHY_CONF(5, 2, PHY_MODE_SGMII, 0x1),
> > +};
> 
> IMHO all the lane and mode configuration should come from dt. That would make
> it more reusable when comphy is configured differently.

These connexions between engines and the comphy lanes are inside the
SoC. They won't change for a given SoC, and the actual configuration is
at the board level to know what is connected to the output of a given
lane, which is already described into the dt (the lane phandle).

So I think we can keep this inside the driver, and we'll had other
tables if the same comphy is ever used in another SoC.

What do you think?

> > +static const struct phy_ops mvebu_comphy_ops = {
> > +   .power_on       = mvebu_comphy_power_on,
> > +   .power_off      = mvebu_comphy_power_off,
> > +   .set_mode       = mvebu_comphy_set_mode,
> 
> missing .owner

I'll fix that.

> > +static struct phy *mvebu_comphy_xlate(struct device *dev,
> > +                                 struct of_phandle_args *args)
> > +{
> > +   struct mvebu_comphy_priv *priv = dev_get_drvdata(dev);
> > +   struct mvebu_comphy_lane *lane;
> > +   int i;
> > +
> > +   if (WARN_ON(args->args[0] >= MVEBU_COMPHY_PORTS))
> > +           return ERR_PTR(-EINVAL);
> > +
> > +   for (i = 0; i < MVEBU_COMPHY_LANES; i++) {
> > +           if (!priv->phys[i])
> > +                   continue;
> > +
> > +           lane = phy_get_drvdata(priv->phys[i]);
> > +           if (priv->phys[i] && args->np == lane->of_node)
> > +                   break;
> > +   }
> 
> You should be able to directly use of_phy_simple_xlate to get the phy pointer.
> (For that to work child node pointer should be passed in devm_phy_create).

Good idea, I'll look into this and update.

Thanks!
Antoine

-- 
Antoine Ténart, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

Attachment: signature.asc
Description: PGP signature

Reply via email to