aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabien Lahoudere <fabien.lahoudere@collabora.co.uk>2016-09-26 07:14:19 -0400
committerPeter Chen <peter.chen@nxp.com>2016-11-13 21:03:40 -0500
commitd13631bb15cebe8eba50777cb96e2223e5485c23 (patch)
tree79ad2f4a9dd82b7dd7affca5ae6a97adc6e6dca2
parent34445fb4333f47674e988b98a587195ffa84beae (diff)
usb: chipidea: imx: configure imx for ULPI phy
In order to use ULPI phy with usb host 2 and 3, we need to configure controller register to enable ULPI features. Each USB controller have different behaviour, so in order to avoid to have several "swicth(data->index)" and lock/unlock, we prefer to get the index switch and then test for features if they exist for this index. This patch also remove useless test of reg and val. Those two values cannot be NULL. Signed-off-by: Fabien Lahoudere <fabien.lahoudere@collabora.co.uk> Signed-off-by: Peter Chen <peter.chen@nxp.com>
-rw-r--r--drivers/usb/chipidea/ci_hdrc_imx.c4
-rw-r--r--drivers/usb/chipidea/ci_hdrc_imx.h1
-rw-r--r--drivers/usb/chipidea/usbmisc_imx.c75
3 files changed, 66 insertions, 14 deletions
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c
index 099179457f60..5f4a8157fad8 100644
--- a/drivers/usb/chipidea/ci_hdrc_imx.c
+++ b/drivers/usb/chipidea/ci_hdrc_imx.c
@@ -18,6 +18,7 @@
18#include <linux/pm_runtime.h> 18#include <linux/pm_runtime.h>
19#include <linux/dma-mapping.h> 19#include <linux/dma-mapping.h>
20#include <linux/usb/chipidea.h> 20#include <linux/usb/chipidea.h>
21#include <linux/usb/of.h>
21#include <linux/clk.h> 22#include <linux/clk.h>
22 23
23#include "ci.h" 24#include "ci.h"
@@ -146,6 +147,9 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
146 if (of_find_property(np, "external-vbus-divider", NULL)) 147 if (of_find_property(np, "external-vbus-divider", NULL))
147 data->evdo = 1; 148 data->evdo = 1;
148 149
150 if (of_usb_get_phy_mode(np) == USBPHY_INTERFACE_MODE_ULPI)
151 data->ulpi = 1;
152
149 return data; 153 return data;
150} 154}
151 155
diff --git a/drivers/usb/chipidea/ci_hdrc_imx.h b/drivers/usb/chipidea/ci_hdrc_imx.h
index 409aa5ca8dda..d666c9f036ba 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 {
19 unsigned int disable_oc:1; /* over current detect disabled */ 19 unsigned int disable_oc:1; /* over current detect disabled */
20 unsigned int oc_polarity:1; /* over current polarity if oc enabled */ 20 unsigned int oc_polarity:1; /* over current polarity if oc enabled */
21 unsigned int evdo:1; /* set external vbus divider option */ 21 unsigned int evdo:1; /* set external vbus divider option */
22 unsigned int ulpi:1; /* connected to an ULPI phy */
22}; 23};
23 24
24int imx_usbmisc_init(struct imx_usbmisc_data *); 25int imx_usbmisc_init(struct imx_usbmisc_data *);
diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
index 20d02a5e418d..11f51bde44e5 100644
--- a/drivers/usb/chipidea/usbmisc_imx.c
+++ b/drivers/usb/chipidea/usbmisc_imx.c
@@ -46,11 +46,20 @@
46 46
47#define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08 47#define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08
48#define MX53_USB_OTG_PHY_CTRL_1_OFFSET 0x0c 48#define MX53_USB_OTG_PHY_CTRL_1_OFFSET 0x0c
49#define MX53_USB_CTRL_1_OFFSET 0x10
50#define MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK (0x11 << 2)
51#define MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_ULPI BIT(2)
52#define MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK (0x11 << 6)
53#define MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_ULPI BIT(6)
49#define MX53_USB_UH2_CTRL_OFFSET 0x14 54#define MX53_USB_UH2_CTRL_OFFSET 0x14
50#define MX53_USB_UH3_CTRL_OFFSET 0x18 55#define MX53_USB_UH3_CTRL_OFFSET 0x18
51#define MX53_BM_OVER_CUR_DIS_H1 BIT(5) 56#define MX53_BM_OVER_CUR_DIS_H1 BIT(5)
52#define MX53_BM_OVER_CUR_DIS_OTG BIT(8) 57#define MX53_BM_OVER_CUR_DIS_OTG BIT(8)
53#define MX53_BM_OVER_CUR_DIS_UHx BIT(30) 58#define MX53_BM_OVER_CUR_DIS_UHx BIT(30)
59#define MX53_USB_CTRL_1_UH2_ULPI_EN BIT(26)
60#define MX53_USB_CTRL_1_UH3_ULPI_EN BIT(27)
61#define MX53_USB_UHx_CTRL_WAKE_UP_EN BIT(7)
62#define MX53_USB_UHx_CTRL_ULPI_INT_EN BIT(8)
54#define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3 63#define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3
55#define MX53_USB_PLL_DIV_24_MHZ 0x01 64#define MX53_USB_PLL_DIV_24_MHZ 0x01
56 65
@@ -199,31 +208,69 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data)
199 val |= MX53_USB_PLL_DIV_24_MHZ; 208 val |= MX53_USB_PLL_DIV_24_MHZ;
200 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); 209 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET);
201 210
202 if (data->disable_oc) { 211 spin_lock_irqsave(&usbmisc->lock, flags);
203 spin_lock_irqsave(&usbmisc->lock, flags); 212
204 switch (data->index) { 213 switch (data->index) {
205 case 0: 214 case 0:
215 if (data->disable_oc) {
206 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; 216 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
207 val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG; 217 val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG;
208 break; 218 writel(val, reg);
209 case 1: 219 }
220 break;
221 case 1:
222 if (data->disable_oc) {
210 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; 223 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
211 val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1; 224 val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1;
212 break; 225 writel(val, reg);
213 case 2: 226 }
227 break;
228 case 2:
229 if (data->ulpi) {
230 /* set USBH2 into ULPI-mode. */
231 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET;
232 val = readl(reg) | MX53_USB_CTRL_1_UH2_ULPI_EN;
233 /* select ULPI clock */
234 val &= ~MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK;
235 val |= MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_ULPI;
236 writel(val, reg);
237 /* Set interrupt wake up enable */
238 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
239 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN
240 | MX53_USB_UHx_CTRL_ULPI_INT_EN;
241 writel(val, reg);
242 }
243 if (data->disable_oc) {
214 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; 244 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
215 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; 245 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
216 break; 246 writel(val, reg);
217 case 3: 247 }
248 break;
249 case 3:
250 if (data->ulpi) {
251 /* set USBH3 into ULPI-mode. */
252 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET;
253 val = readl(reg) | MX53_USB_CTRL_1_UH3_ULPI_EN;
254 /* select ULPI clock */
255 val &= ~MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK;
256 val |= MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_ULPI;
257 writel(val, reg);
258 /* Set interrupt wake up enable */
218 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; 259 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
219 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; 260 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN
220 break; 261 | MX53_USB_UHx_CTRL_ULPI_INT_EN;
262 writel(val, reg);
221 } 263 }
222 if (reg && val) 264 if (data->disable_oc) {
265 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
266 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
223 writel(val, reg); 267 writel(val, reg);
224 spin_unlock_irqrestore(&usbmisc->lock, flags); 268 }
269 break;
225 } 270 }
226 271
272 spin_unlock_irqrestore(&usbmisc->lock, flags);
273
227 return 0; 274 return 0;
228} 275}
229 276