From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753801AbcIUHNx (ORCPT ); Wed, 21 Sep 2016 03:13:53 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:36331 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751124AbcIUHMX (ORCPT ); Wed, 21 Sep 2016 03:12:23 -0400 Date: Wed, 21 Sep 2016 15:12:14 +0800 From: Peter Chen To: Fabien Lahoudere Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 2/3] usb: chipidea: imx: configure imx for ULPI phy Message-ID: <20160921071214.GC23435@b29397-desktop> References: <1474285540-26576-1-git-send-email-fabien.lahoudere@collabora.co.uk> <1474285540-26576-3-git-send-email-fabien.lahoudere@collabora.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1474285540-26576-3-git-send-email-fabien.lahoudere@collabora.co.uk> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 19, 2016 at 01:45:39PM +0200, Fabien Lahoudere wrote: > In order to use ULPI phy with usb host 2 and 3, we need to configure > controller register to enable ULPI features. > > Signed-off-by: Fabien Lahoudere > --- > drivers/usb/chipidea/ci_hdrc_imx.c | 5 +++++ > drivers/usb/chipidea/ci_hdrc_imx.h | 1 + > drivers/usb/chipidea/usbmisc_imx.c | 37 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 43 insertions(+) > > diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c > index 0991794..96c0e33 100644 > --- a/drivers/usb/chipidea/ci_hdrc_imx.c > +++ b/drivers/usb/chipidea/ci_hdrc_imx.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > #include > > #include "ci.h" > @@ -146,6 +147,10 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev) > if (of_find_property(np, "external-vbus-divider", NULL)) > data->evdo = 1; > > + > + if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI) > + data->ulpi = 1; > + > return data; > } > > diff --git a/drivers/usb/chipidea/ci_hdrc_imx.h b/drivers/usb/chipidea/ci_hdrc_imx.h > index 409aa5ca8..d666c9f 100644 > --- a/drivers/usb/chipidea/ci_hdrc_imx.h > +++ b/drivers/usb/chipidea/ci_hdrc_imx.h > @@ -19,6 +19,7 @@ struct imx_usbmisc_data { > unsigned int disable_oc:1; /* over current detect disabled */ > unsigned int oc_polarity:1; /* over current polarity if oc enabled */ > unsigned int evdo:1; /* set external vbus divider option */ > + unsigned int ulpi:1; /* connected to an ULPI phy */ > }; > > int imx_usbmisc_init(struct imx_usbmisc_data *); > diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c > index 9549821..11f51bd 100644 > --- a/drivers/usb/chipidea/usbmisc_imx.c > +++ b/drivers/usb/chipidea/usbmisc_imx.c > @@ -46,11 +46,20 @@ > > #define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08 > #define MX53_USB_OTG_PHY_CTRL_1_OFFSET 0x0c > +#define MX53_USB_CTRL_1_OFFSET 0x10 > +#define MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK (0x11 << 2) > +#define MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_ULPI BIT(2) > +#define MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK (0x11 << 6) > +#define MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_ULPI BIT(6) > #define MX53_USB_UH2_CTRL_OFFSET 0x14 > #define MX53_USB_UH3_CTRL_OFFSET 0x18 > #define MX53_BM_OVER_CUR_DIS_H1 BIT(5) > #define MX53_BM_OVER_CUR_DIS_OTG BIT(8) > #define MX53_BM_OVER_CUR_DIS_UHx BIT(30) > +#define MX53_USB_CTRL_1_UH2_ULPI_EN BIT(26) > +#define MX53_USB_CTRL_1_UH3_ULPI_EN BIT(27) > +#define MX53_USB_UHx_CTRL_WAKE_UP_EN BIT(7) > +#define MX53_USB_UHx_CTRL_ULPI_INT_EN BIT(8) > #define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3 > #define MX53_USB_PLL_DIV_24_MHZ 0x01 > > @@ -217,6 +226,20 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > } > break; > case 2: > + if (data->ulpi) { > + /* set USBH2 into ULPI-mode. */ > + reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; > + val = readl(reg) | MX53_USB_CTRL_1_UH2_ULPI_EN; > + /* select ULPI clock */ > + val &= ~MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK; > + val |= MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_ULPI; > + writel(val, reg); > + /* Set interrupt wake up enable */ > + reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; > + val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN > + | MX53_USB_UHx_CTRL_ULPI_INT_EN; > + writel(val, reg); > + } Ok, it seems your 1st patch is just let code structure change be easy in this one, and I may give the wrong comments that you had improved disable oc code before. If you agree with me, would you squash these two into one, and send again. (delete "reg && val" is necessary). Peter > if (data->disable_oc) { > reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; > val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; > @@ -224,6 +247,20 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data) > } > break; > case 3: > + if (data->ulpi) { > + /* set USBH3 into ULPI-mode. */ > + reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; > + val = readl(reg) | MX53_USB_CTRL_1_UH3_ULPI_EN; > + /* select ULPI clock */ > + val &= ~MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK; > + val |= MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_ULPI; > + writel(val, reg); > + /* Set interrupt wake up enable */ > + reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; > + val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN > + | MX53_USB_UHx_CTRL_ULPI_INT_EN; > + writel(val, reg); > + } > if (data->disable_oc) { > reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; > val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; > -- > 2.1.4 > -- Best Regards, Peter Chen