> > The MiPHY365x is a Generic PHY which can serve various SATA or PCIe
> > devices. It has 2 ports which it can use for either; both SATA, both
> 
> various SATA or PCIe devices in STMicroelectronics STiH41x SoC series?

To tell you the truth, I'm not sure if it is limited to ST's h/w, but
I think it can only be found there, so I'm happy to fixup.

<snip>

> > +config PHY_MIPHY365X
> > +   tristate "STMicroelectronics MIPHY365X PHY driver for STiH41x series"
> > +   depends on ARCH_STI
> > +   depends on GENERIC_PHY
> depends on CONFIG_OF and HAS_IOMEM?

Sure, I'll fix.

<snip>

> > + * Copyright (C) 2014 STMicroelectronics
> > + *
> > + * STMicroelectronics PHY driver MiPHY365 (for SoC STiH416).
> > + *
> > + * Author: Alexandre Torgue <alexandre.tor...@st.com>
> 
> The author of this patch is not Alexandre Torgue?

The history of this driver is long and the authors are many. Alex
did the last internal over-haul and converted it to use Generic PHY. I
took Alex's driver and made significant changes in order to upstream.

<snip>

> > +#define HFC_TIMEOUT                50
> > +
> > +#define SYSCFG_2521                0x824
> > +#define SYSCFG_2522                0x828
> > +#define SYSCFG_PCIE_SATA_MASK      BIT(1)
> > +#define SYSCFG_PCIE_SATA_POS       1
> > +
> > +/* MiPHY365x register definitiona */
> > +#define RESET_REG          0x00
> > +#define RST_PLL                    BIT(1)
> 
> There are quite a few alignment problems with these macros. It needs
> to be fixed.

This is just Git playing up.

In reality everything is perfectly aligned and all using tabs.

<snip>

> > +/*
> > + * This function selects the system configuration,
> > + * either two SATA, one SATA and one PCIe, or two PCIe lanes.
> > + */
> > +static int miphy365x_set_path(struct miphy365x_phy *miphy_phy,
> > +                         struct miphy365x_dev *miphy_dev)
> > +{
> > +   u8 config = miphy_phy->type | miphy_phy->port;
> > +   u32 mask  = SYSCFG_PCIE_SATA_MASK;
> > +   u32 reg;
> > +   bool sata;
> > +
> > +   switch (config) {
> > +   case MIPHY_SATA_PORT0:
> > +           reg = SYSCFG_2521;
> > +           sata = true;
> 
> How do we configure PORT1 for SATA here? Do we really support all the system
> configuration?

Good spot eagle-eye!

Actually in the current version there is a h/w bug which only allows
the SATA_PORT0 and PCIE_PORT1 configuration. When a new version fixing
this is released I will add version detection to the driver and we can
support full intended configuration options. 

<snip>

> > +static inline int miphy365x_phy_hfc_not_rdy(struct miphy365x_phy 
> > *miphy_phy,
> > +                                       struct miphy365x_dev *miphy_dev)
> > +{
> > +   int timeout = HFC_TIMEOUT;
> > +   u8 mask = IDLL_RDY | PLL_RDY;
> > +   u8 regval;
> > +
> > +   do {
> > +           regval = readb_relaxed(miphy_phy->base + STATUS_REG);
> > +           usleep_range(2000, 2500);
> 
> Any comment on how this delay value is obtained?

I don't have any specific comments, I believe the 2000us it taken from
the datasheet and the 2500 is us playing nice with the scheduler.

<snip>

> > +static inline int miphy365x_phy_rdy(struct miphy365x_phy *miphy_phy,
> > +                               struct miphy365x_dev *miphy_dev)
> > +{
> > +   int timeout = HFC_TIMEOUT;
> > +   u8 mask = mask = IDLL_RDY | PLL_RDY;
> 
> just u8 mask = IDLL_RDY | PLL_RDY; would suffice.

Hmm... not sure how this slipped through - will fix.

> > +   u8 regval;
> > +
> > +   do {
> > +           regval = readb_relaxed(miphy_phy->base + STATUS_REG);
> > +           usleep_range(2000, 2500);
> 
> same here.

As above.

<snip>

> > +   mask = DES_BIT_LOCK | DES_SYMBOL_LOCK;
> > +   while ((readb_relaxed(miphy_phy->base + COMP_CTRL1_REG) & mask) != mask)
> > +           cpu_relax();
> 
> Don't we need to break from here at some point if the LOCK's are never set?

I'm sure sure that's possible, but I will invesigate and fixup if req'd.

<snip>

> > +static int miphy365x_phy_power_on(struct phy *phy)
> > +{
> > +   return 0;
> > +}
> > +
> > +static int miphy365x_phy_power_off(struct phy *phy)
> > +{
> > +   return 0;
> > +}
> 
> Both these empty functions can be removed.

You're right, I see the NULL checks, thanks.

<snip>

> > +static int miphy365x_phy_get_base_addr(struct platform_device *pdev,
> > +                                  struct miphy365x_phy *phy, u8 port)
> > +{
> > +   struct resource *res;
> > +   char sata[16];
> > +   char pcie[16];
> 
> It can be done with a single variable ;-)

Right. :)

<snip>

> Phy provider register should be the last step in registering the PHY.

Okay, will fix, thanks.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to