aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-11-28 02:47:56 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-11-28 02:47:56 -0500
commit9dd649c6390dcf3c7b4e66703a88a1c5492562cf (patch)
treee1d904d118d3b948c56c129b5c2e6ad614d38e43
parent75e9ebecfedb88a22eee0d2b3b63aeaeab1bfdee (diff)
parent3be3251db0887f721f9c110e1966900922fc4ff4 (diff)
Merge tag 'usb-ci-v4.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-next
Peter writes: - Adding ULPI PHY support for imx53 - Properly mark little endian descriptors for udc
-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/udc.c6
-rw-r--r--drivers/usb/chipidea/udc.h12
-rw-r--r--drivers/usb/chipidea/usbmisc_imx.c86
5 files changed, 86 insertions, 23 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/udc.c b/drivers/usb/chipidea/udc.c
index f5320d66019a..cf132f057137 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -365,7 +365,7 @@ static int add_td_to_list(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq,
365 if (hwreq->req.length == 0 365 if (hwreq->req.length == 0
366 || hwreq->req.length % hwep->ep.maxpacket) 366 || hwreq->req.length % hwep->ep.maxpacket)
367 mul++; 367 mul++;
368 node->ptr->token |= mul << __ffs(TD_MULTO); 368 node->ptr->token |= cpu_to_le32(mul << __ffs(TD_MULTO));
369 } 369 }
370 370
371 temp = (u32) (hwreq->req.dma + hwreq->req.actual); 371 temp = (u32) (hwreq->req.dma + hwreq->req.actual);
@@ -504,7 +504,7 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq)
504 if (hwreq->req.length == 0 504 if (hwreq->req.length == 0
505 || hwreq->req.length % hwep->ep.maxpacket) 505 || hwreq->req.length % hwep->ep.maxpacket)
506 mul++; 506 mul++;
507 hwep->qh.ptr->cap |= mul << __ffs(QH_MULT); 507 hwep->qh.ptr->cap |= cpu_to_le32(mul << __ffs(QH_MULT));
508 } 508 }
509 509
510 ret = hw_ep_prime(ci, hwep->num, hwep->dir, 510 ret = hw_ep_prime(ci, hwep->num, hwep->dir,
@@ -529,7 +529,7 @@ static void free_pending_td(struct ci_hw_ep *hwep)
529static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep, 529static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep,
530 struct td_node *node) 530 struct td_node *node)
531{ 531{
532 hwep->qh.ptr->td.next = node->dma; 532 hwep->qh.ptr->td.next = cpu_to_le32(node->dma);
533 hwep->qh.ptr->td.token &= 533 hwep->qh.ptr->td.token &=
534 cpu_to_le32(~(TD_STATUS_HALTED | TD_STATUS_ACTIVE)); 534 cpu_to_le32(~(TD_STATUS_HALTED | TD_STATUS_ACTIVE));
535 535
diff --git a/drivers/usb/chipidea/udc.h b/drivers/usb/chipidea/udc.h
index e66df0020bd4..2ecd1174d66c 100644
--- a/drivers/usb/chipidea/udc.h
+++ b/drivers/usb/chipidea/udc.h
@@ -22,11 +22,11 @@
22/* DMA layout of transfer descriptors */ 22/* DMA layout of transfer descriptors */
23struct ci_hw_td { 23struct ci_hw_td {
24 /* 0 */ 24 /* 0 */
25 u32 next; 25 __le32 next;
26#define TD_TERMINATE BIT(0) 26#define TD_TERMINATE BIT(0)
27#define TD_ADDR_MASK (0xFFFFFFEUL << 5) 27#define TD_ADDR_MASK (0xFFFFFFEUL << 5)
28 /* 1 */ 28 /* 1 */
29 u32 token; 29 __le32 token;
30#define TD_STATUS (0x00FFUL << 0) 30#define TD_STATUS (0x00FFUL << 0)
31#define TD_STATUS_TR_ERR BIT(3) 31#define TD_STATUS_TR_ERR BIT(3)
32#define TD_STATUS_DT_ERR BIT(5) 32#define TD_STATUS_DT_ERR BIT(5)
@@ -36,7 +36,7 @@ struct ci_hw_td {
36#define TD_IOC BIT(15) 36#define TD_IOC BIT(15)
37#define TD_TOTAL_BYTES (0x7FFFUL << 16) 37#define TD_TOTAL_BYTES (0x7FFFUL << 16)
38 /* 2 */ 38 /* 2 */
39 u32 page[5]; 39 __le32 page[5];
40#define TD_CURR_OFFSET (0x0FFFUL << 0) 40#define TD_CURR_OFFSET (0x0FFFUL << 0)
41#define TD_FRAME_NUM (0x07FFUL << 0) 41#define TD_FRAME_NUM (0x07FFUL << 0)
42#define TD_RESERVED_MASK (0x0FFFUL << 0) 42#define TD_RESERVED_MASK (0x0FFFUL << 0)
@@ -45,18 +45,18 @@ struct ci_hw_td {
45/* DMA layout of queue heads */ 45/* DMA layout of queue heads */
46struct ci_hw_qh { 46struct ci_hw_qh {
47 /* 0 */ 47 /* 0 */
48 u32 cap; 48 __le32 cap;
49#define QH_IOS BIT(15) 49#define QH_IOS BIT(15)
50#define QH_MAX_PKT (0x07FFUL << 16) 50#define QH_MAX_PKT (0x07FFUL << 16)
51#define QH_ZLT BIT(29) 51#define QH_ZLT BIT(29)
52#define QH_MULT (0x0003UL << 30) 52#define QH_MULT (0x0003UL << 30)
53#define QH_ISO_MULT(x) ((x >> 11) & 0x03) 53#define QH_ISO_MULT(x) ((x >> 11) & 0x03)
54 /* 1 */ 54 /* 1 */
55 u32 curr; 55 __le32 curr;
56 /* 2 - 8 */ 56 /* 2 - 8 */
57 struct ci_hw_td td; 57 struct ci_hw_td td;
58 /* 9 */ 58 /* 9 */
59 u32 RESERVED; 59 __le32 RESERVED;
60 struct usb_ctrlrequest setup; 60 struct usb_ctrlrequest setup;
61} __attribute__ ((packed, aligned(4))); 61} __attribute__ ((packed, aligned(4)));
62 62
diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
index 20d02a5e418d..e77a4ed4f021 100644
--- a/drivers/usb/chipidea/usbmisc_imx.c
+++ b/drivers/usb/chipidea/usbmisc_imx.c
@@ -46,11 +46,23 @@
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
56#define MX53_USB_CLKONOFF_CTRL_OFFSET 0x24
57#define MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF BIT(21)
58#define MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF BIT(22)
51#define MX53_BM_OVER_CUR_DIS_H1 BIT(5) 59#define MX53_BM_OVER_CUR_DIS_H1 BIT(5)
52#define MX53_BM_OVER_CUR_DIS_OTG BIT(8) 60#define MX53_BM_OVER_CUR_DIS_OTG BIT(8)
53#define MX53_BM_OVER_CUR_DIS_UHx BIT(30) 61#define MX53_BM_OVER_CUR_DIS_UHx BIT(30)
62#define MX53_USB_CTRL_1_UH2_ULPI_EN BIT(26)
63#define MX53_USB_CTRL_1_UH3_ULPI_EN BIT(27)
64#define MX53_USB_UHx_CTRL_WAKE_UP_EN BIT(7)
65#define MX53_USB_UHx_CTRL_ULPI_INT_EN BIT(8)
54#define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3 66#define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3
55#define MX53_USB_PLL_DIV_24_MHZ 0x01 67#define MX53_USB_PLL_DIV_24_MHZ 0x01
56 68
@@ -199,31 +211,77 @@ static int usbmisc_imx53_init(struct imx_usbmisc_data *data)
199 val |= MX53_USB_PLL_DIV_24_MHZ; 211 val |= MX53_USB_PLL_DIV_24_MHZ;
200 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); 212 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET);
201 213
202 if (data->disable_oc) { 214 spin_lock_irqsave(&usbmisc->lock, flags);
203 spin_lock_irqsave(&usbmisc->lock, flags); 215
204 switch (data->index) { 216 switch (data->index) {
205 case 0: 217 case 0:
218 if (data->disable_oc) {
206 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; 219 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
207 val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG; 220 val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG;
208 break; 221 writel(val, reg);
209 case 1: 222 }
223 break;
224 case 1:
225 if (data->disable_oc) {
210 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; 226 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
211 val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1; 227 val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1;
212 break; 228 writel(val, reg);
213 case 2: 229 }
230 break;
231 case 2:
232 if (data->ulpi) {
233 /* set USBH2 into ULPI-mode. */
234 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET;
235 val = readl(reg) | MX53_USB_CTRL_1_UH2_ULPI_EN;
236 /* select ULPI clock */
237 val &= ~MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK;
238 val |= MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_ULPI;
239 writel(val, reg);
240 /* Set interrupt wake up enable */
241 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
242 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN
243 | MX53_USB_UHx_CTRL_ULPI_INT_EN;
244 writel(val, reg);
245 /* Disable internal 60Mhz clock */
246 reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET;
247 val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H2_INT60CKOFF;
248 writel(val, reg);
249 }
250 if (data->disable_oc) {
214 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; 251 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
215 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; 252 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
216 break; 253 writel(val, reg);
217 case 3: 254 }
255 break;
256 case 3:
257 if (data->ulpi) {
258 /* set USBH3 into ULPI-mode. */
259 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET;
260 val = readl(reg) | MX53_USB_CTRL_1_UH3_ULPI_EN;
261 /* select ULPI clock */
262 val &= ~MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK;
263 val |= MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_ULPI;
264 writel(val, reg);
265 /* Set interrupt wake up enable */
218 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; 266 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
219 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx; 267 val = readl(reg) | MX53_USB_UHx_CTRL_WAKE_UP_EN
220 break; 268 | MX53_USB_UHx_CTRL_ULPI_INT_EN;
269 writel(val, reg);
270 /* Disable internal 60Mhz clock */
271 reg = usbmisc->base + MX53_USB_CLKONOFF_CTRL_OFFSET;
272 val = readl(reg) | MX53_USB_CLKONOFF_CTRL_H3_INT60CKOFF;
273 writel(val, reg);
221 } 274 }
222 if (reg && val) 275 if (data->disable_oc) {
276 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
277 val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
223 writel(val, reg); 278 writel(val, reg);
224 spin_unlock_irqrestore(&usbmisc->lock, flags); 279 }
280 break;
225 } 281 }
226 282
283 spin_unlock_irqrestore(&usbmisc->lock, flags);
284
227 return 0; 285 return 0;
228} 286}
229 287