[V7 PATCH 01/16] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller

Chao Xie xiechao.mail at gmail.com
Mon Feb 18 01:58:29 EST 2013


On Mon, Feb 18, 2013 at 2:43 PM, kishon <kishon at ti.com> wrote:
> Hi,
>
>
> On Monday 18 February 2013 11:40 AM, Chao Xie wrote:
>>
>> The PHY is seperated from usb controller.
>> The usb controller used in marvell pxa168/pxa910/mmp2 are same,
>> ...
>> +
>> +#define UTMI_OTG_ADDON_OTG_ON                  (1 << 0)
>> +
>> +enum mv_usb2_phy_type {
>> +       PXA168_USB,
>> +       PXA910_USB,
>> +       MMP2_USB,
>> +};
>
>
> Is this enum being used somewhere?
>
Yes, the PHY setting has a little difference between these SOCes.
I have to use these types to track which SOC is used.
>
>> +
>> +static unsigned int u2o_get(void __iomem *base, unsigned int offset)
>> +{
>> +       return readl(base + offset);
>> +}
>> +
>> +static void u2o_set(void __iomem *base, unsigned int offset,
>> +               unsigned int value)
>> +{
>> +       u32 reg;
>> +
>> +       reg = readl(base + offset);
>> +       reg |= value;
>> +       writel(reg, base + offset);
>> +       readl(base + offset);
>
>
> spurious readl.
>
Writing to the PHY setting registers has to make sure that every
writing has been issued already.
The design engineer suggest us to add reading after the writing. It
can make sure the writing has
taken effect.

>> +}
>> +
>> +static void u2o_clear(void __iomem *base, unsigned int offset,
>> +               unsigned int value)
>> +{
>> +       u32 reg;
>> +
>> +       reg = readl(base + offset);
>> +       reg &= ~value;
>> +       writel(reg, base + offset);
>> +       readl(base + offset);
>
>
> ditto..
>
Same reason. The clear is a writing operation
>> +}
>> +
>> +static void u2o_write(void __iomem *base, unsigned int offset,
>> +               unsigned int value)
>> +{
>> +       writel(value, base + offset);
>> +       readl(base + offset);
>
>
> ditto..
>
Same reason.
>> +}
>> +
>> +static int _mv_usb2_phy_init(struct mv_usb2_phy *mv_phy)
>> +{
>> +       struct platform_device *pdev = mv_phy->pdev;
>> +       unsigned int loops = 0;
>> +       void __iomem *base = mv_phy->base;
>> +
>> +       dev_dbg(&pdev->dev, "phy init\n");
>> +
>> +       /* Initialize the USB PHY power */
>> +       if (mv_phy->type == PXA910_USB) {
>> +               u2o_set(base, UTMI_CTRL,
>> (1<<UTMI_CTRL_INPKT_DELAY_SOF_SHIFT)
>> +                       | (1<<UTMI_CTRL_PU_REF_SHIFT));
>> +       }
>> +

>> 4<<UTMI_TX_IMPCAL_VTH_SHIFT
>> +               | 8<<UTMI_TX_REG_EXT_FS_RCAL_SHIFT |
>> 3<<UTMI_TX_AMP_SHIFT);
>> +
>> phy);
>> +       int i = 0;
>> +
>> +       mutex_lock(&mv_phy->phy_lock);
>> +       if (mv_phy->refcount++ == 0) {
>
>
> shouldn't this be --mv_phy->refcount == 0?
>
you are right.

>
>> +               _mv_usb2_phy_shutdown(mv_phy);
>> +               for (i = 0; i < mv_phy->clks_num; i++)
>> +                       clk_disable_unprepare(mv_phy->clks[i]);
>> +       }
>> +       usb_add_phy_dev(&mv_phy->phy);
>> +
>> +       platform_set_drvdata(pdev, mv_phy);
>> +
>> +       dev_info(&pdev->dev, "mv usb2 phy initialized\n");
>
>
> dev_info makes the boot log noisy.
>
It is the only print in boot log for usb phy.
I can change it to be dev_dbg.

>> +
>> +       return 0;
>> +}
>> +
>> +static int mv_usb2_phy_remove(struct platform_device *pdev)
>> +{
>> +       struct mv_usb2_phy *mv_phy = platform_get_drvdata(pdev);
>> +
>> +struct mv_usb_phy_platform_data {
>> +       unsigned int    clknum;
>> +       char            **clkname;
>> +};
>> +
>>   #endif
>> diff --git a/include/linux/usb/mv_usb2.h b/include/linux/usb/mv_usb2.h
>> new file mode 100644
>> index 0000000..19a1d67
>> --- /dev/null
>> +++ b/include/linux/usb/mv_usb2.h
>> @@ -0,0 +1,40 @@
>> +/*
>> + * Copyright (C) 2012 Marvell Inc.
>
>
> why is this different from drivers/usb/phy/mv_usb2_phy.c?
>
The license has some misaligned. I will modify it.

>> + *
>> + * This software is licensed under the terms of the GNU General Public
>> + * License version 2, as published by the Free Software Foundation, and
>> + * may be copied, distributed, and modified under those terms.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + */
>> +
>> +#ifndef __MV_USB2_H
>> +#define __MV_USB2_H
>> +
>> +#define MV_USB2_PHY_INDEX      0
>> +#define MV_USB2_OTG_PHY_INDEX  1
>> +
>> +struct mv_usb2_phy {
>> +       struct usb_phy          phy;
>> +       struct platform_device  *pdev;
>> +       struct mutex            phy_lock;
>> +       unsigned int            refcount;
>> +       unsigned int            type;
>> +       void __iomem            *base;
>> +       struct clk              **clks;
>> +       unsigned int            clks_num;
>> +};
>> +
>> +#if defined(CONFIG_MV_USB2_PHY) || defined(CONFIG_MV_USB2_PHY_MODULE)
>> +
>> +
>> +#else
>> +
>> +
>> +#endif
>
> This should be removed.
>
You are right.

> Thanks
> Kishon



More information about the linux-arm-kernel mailing list