diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-11-28 02:47:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-11-28 02:47:56 -0500 |
commit | 9dd649c6390dcf3c7b4e66703a88a1c5492562cf (patch) | |
tree | e1d904d118d3b948c56c129b5c2e6ad614d38e43 | |
parent | 75e9ebecfedb88a22eee0d2b3b63aeaeab1bfdee (diff) | |
parent | 3be3251db0887f721f9c110e1966900922fc4ff4 (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.c | 4 | ||||
-rw-r--r-- | drivers/usb/chipidea/ci_hdrc_imx.h | 1 | ||||
-rw-r--r-- | drivers/usb/chipidea/udc.c | 6 | ||||
-rw-r--r-- | drivers/usb/chipidea/udc.h | 12 | ||||
-rw-r--r-- | drivers/usb/chipidea/usbmisc_imx.c | 86 |
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 | ||
24 | int imx_usbmisc_init(struct imx_usbmisc_data *); | 25 | int 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) | |||
529 | static int reprime_dtd(struct ci_hdrc *ci, struct ci_hw_ep *hwep, | 529 | static 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 */ |
23 | struct ci_hw_td { | 23 | struct 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 */ |
46 | struct ci_hw_qh { | 46 | struct 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 | ||