@@ -77,12 +77,64 @@ fsl_ep0_desc = {
77
77
static void fsl_ep_fifo_flush (struct usb_ep * _ep );
78
78
79
79
#ifdef CONFIG_PPC32
80
- #define fsl_readl (addr ) in_le32(addr)
81
- #define fsl_writel (val32 , addr ) out_le32(addr, val32)
82
- #else
80
+ /*
81
+ * On some SoCs, the USB controller registers can be big or little endian,
82
+ * depending on the version of the chip. In order to be able to run the
83
+ * same kernel binary on 2 different versions of an SoC, the BE/LE decision
84
+ * must be made at run time. _fsl_readl and fsl_writel are pointers to the
85
+ * BE or LE readl() and writel() functions, and fsl_readl() and fsl_writel()
86
+ * call through those pointers. Platform code for SoCs that have BE USB
87
+ * registers should set pdata->big_endian_mmio flag.
88
+ *
89
+ * This also applies to controller-to-cpu accessors for the USB descriptors,
90
+ * since their endianness is also SoC dependant. Platform code for SoCs that
91
+ * have BE USB descriptors should set pdata->big_endian_desc flag.
92
+ */
93
+ static u32 _fsl_readl_be (const unsigned __iomem * p )
94
+ {
95
+ return in_be32 (p );
96
+ }
97
+
98
+ static u32 _fsl_readl_le (const unsigned __iomem * p )
99
+ {
100
+ return in_le32 (p );
101
+ }
102
+
103
+ static void _fsl_writel_be (u32 v , unsigned __iomem * p )
104
+ {
105
+ out_be32 (p , v );
106
+ }
107
+
108
+ static void _fsl_writel_le (u32 v , unsigned __iomem * p )
109
+ {
110
+ out_le32 (p , v );
111
+ }
112
+
113
+ static u32 (* _fsl_readl )(const unsigned __iomem * p );
114
+ static void (* _fsl_writel )(u32 v , unsigned __iomem * p );
115
+
116
+ #define fsl_readl (p ) (*_fsl_readl)((p))
117
+ #define fsl_writel (v , p ) (*_fsl_writel)((v), (p))
118
+
119
+ static inline u32 cpu_to_hc32 (const u32 x )
120
+ {
121
+ return udc_controller -> pdata -> big_endian_desc
122
+ ? (__force u32 )cpu_to_be32 (x )
123
+ : (__force u32 )cpu_to_le32 (x );
124
+ }
125
+
126
+ static inline u32 hc32_to_cpu (const u32 x )
127
+ {
128
+ return udc_controller -> pdata -> big_endian_desc
129
+ ? be32_to_cpu ((__force __be32 )x )
130
+ : le32_to_cpu ((__force __le32 )x );
131
+ }
132
+ #else /* !CONFIG_PPC32 */
83
133
#define fsl_readl (addr ) readl(addr)
84
134
#define fsl_writel (val32 , addr ) writel(val32, addr)
85
- #endif
135
+ #define cpu_to_hc32 (x ) cpu_to_le32(x)
136
+ #define hc32_to_cpu (x ) le32_to_cpu(x)
137
+ #endif /* CONFIG_PPC32 */
86
138
87
139
/********************************************************************
88
140
* Internal Used Function
@@ -409,7 +461,7 @@ static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num,
409
461
if (zlt )
410
462
tmp |= EP_QUEUE_HEAD_ZLT_SEL ;
411
463
412
- p_QH -> max_pkt_length = cpu_to_le32 (tmp );
464
+ p_QH -> max_pkt_length = cpu_to_hc32 (tmp );
413
465
p_QH -> next_dtd_ptr = 1 ;
414
466
p_QH -> size_ioc_int_sts = 0 ;
415
467
}
@@ -616,7 +668,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
616
668
struct fsl_req * lastreq ;
617
669
lastreq = list_entry (ep -> queue .prev , struct fsl_req , queue );
618
670
lastreq -> tail -> next_td_ptr =
619
- cpu_to_le32 (req -> head -> td_dma & DTD_ADDR_MASK );
671
+ cpu_to_hc32 (req -> head -> td_dma & DTD_ADDR_MASK );
620
672
/* Read prime bit, if 1 goto done */
621
673
if (fsl_readl (& dr_regs -> endpointprime ) & bitmask )
622
674
goto out ;
@@ -641,10 +693,10 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
641
693
642
694
/* Write dQH next pointer and terminate bit to 0 */
643
695
temp = req -> head -> td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK ;
644
- dQH -> next_dtd_ptr = cpu_to_le32 (temp );
696
+ dQH -> next_dtd_ptr = cpu_to_hc32 (temp );
645
697
646
698
/* Clear active and halt bit */
647
- temp = cpu_to_le32 (~(EP_QUEUE_HEAD_STATUS_ACTIVE
699
+ temp = cpu_to_hc32 (~(EP_QUEUE_HEAD_STATUS_ACTIVE
648
700
| EP_QUEUE_HEAD_STATUS_HALT ));
649
701
dQH -> size_ioc_int_sts &= temp ;
650
702
@@ -682,17 +734,17 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length,
682
734
683
735
dtd -> td_dma = * dma ;
684
736
/* Clear reserved field */
685
- swap_temp = cpu_to_le32 (dtd -> size_ioc_sts );
737
+ swap_temp = hc32_to_cpu (dtd -> size_ioc_sts );
686
738
swap_temp &= ~DTD_RESERVED_FIELDS ;
687
- dtd -> size_ioc_sts = cpu_to_le32 (swap_temp );
739
+ dtd -> size_ioc_sts = cpu_to_hc32 (swap_temp );
688
740
689
741
/* Init all of buffer page pointers */
690
742
swap_temp = (u32 ) (req -> req .dma + req -> req .actual );
691
- dtd -> buff_ptr0 = cpu_to_le32 (swap_temp );
692
- dtd -> buff_ptr1 = cpu_to_le32 (swap_temp + 0x1000 );
693
- dtd -> buff_ptr2 = cpu_to_le32 (swap_temp + 0x2000 );
694
- dtd -> buff_ptr3 = cpu_to_le32 (swap_temp + 0x3000 );
695
- dtd -> buff_ptr4 = cpu_to_le32 (swap_temp + 0x4000 );
743
+ dtd -> buff_ptr0 = cpu_to_hc32 (swap_temp );
744
+ dtd -> buff_ptr1 = cpu_to_hc32 (swap_temp + 0x1000 );
745
+ dtd -> buff_ptr2 = cpu_to_hc32 (swap_temp + 0x2000 );
746
+ dtd -> buff_ptr3 = cpu_to_hc32 (swap_temp + 0x3000 );
747
+ dtd -> buff_ptr4 = cpu_to_hc32 (swap_temp + 0x4000 );
696
748
697
749
req -> req .actual += * length ;
698
750
@@ -716,7 +768,7 @@ static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length,
716
768
if (* is_last && !req -> req .no_interrupt )
717
769
swap_temp |= DTD_IOC ;
718
770
719
- dtd -> size_ioc_sts = cpu_to_le32 (swap_temp );
771
+ dtd -> size_ioc_sts = cpu_to_hc32 (swap_temp );
720
772
721
773
mb ();
722
774
@@ -743,15 +795,15 @@ static int fsl_req_to_dtd(struct fsl_req *req)
743
795
is_first = 0 ;
744
796
req -> head = dtd ;
745
797
} else {
746
- last_dtd -> next_td_ptr = cpu_to_le32 (dma );
798
+ last_dtd -> next_td_ptr = cpu_to_hc32 (dma );
747
799
last_dtd -> next_td_virt = dtd ;
748
800
}
749
801
last_dtd = dtd ;
750
802
751
803
req -> dtd_count ++ ;
752
804
} while (!is_last );
753
805
754
- dtd -> next_td_ptr = cpu_to_le32 (DTD_NEXT_TERMINATE );
806
+ dtd -> next_td_ptr = cpu_to_hc32 (DTD_NEXT_TERMINATE );
755
807
756
808
req -> tail = dtd ;
757
809
@@ -1394,6 +1446,7 @@ static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr)
1394
1446
{
1395
1447
u32 temp ;
1396
1448
struct ep_queue_head * qh ;
1449
+ struct fsl_usb2_platform_data * pdata = udc -> pdata ;
1397
1450
1398
1451
qh = & udc -> ep_qh [ep_num * 2 + EP_DIR_OUT ];
1399
1452
@@ -1408,7 +1461,16 @@ static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr)
1408
1461
fsl_writel (temp | USB_CMD_SUTW , & dr_regs -> usbcmd );
1409
1462
1410
1463
/* Copy the setup packet to local buffer */
1411
- memcpy (buffer_ptr , (u8 * ) qh -> setup_buffer , 8 );
1464
+ if (pdata -> le_setup_buf ) {
1465
+ u32 * p = (u32 * )buffer_ptr ;
1466
+ u32 * s = (u32 * )qh -> setup_buffer ;
1467
+
1468
+ /* Convert little endian setup buffer to CPU endian */
1469
+ * p ++ = le32_to_cpu (* s ++ );
1470
+ * p = le32_to_cpu (* s );
1471
+ } else {
1472
+ memcpy (buffer_ptr , (u8 * ) qh -> setup_buffer , 8 );
1473
+ }
1412
1474
} while (!(fsl_readl (& dr_regs -> usbcmd ) & USB_CMD_SUTW ));
1413
1475
1414
1476
/* Clear Setup Tripwire */
@@ -1432,19 +1494,19 @@ static int process_ep_req(struct fsl_udc *udc, int pipe,
1432
1494
actual = curr_req -> req .length ;
1433
1495
1434
1496
for (j = 0 ; j < curr_req -> dtd_count ; j ++ ) {
1435
- remaining_length = (le32_to_cpu (curr_td -> size_ioc_sts )
1497
+ remaining_length = (hc32_to_cpu (curr_td -> size_ioc_sts )
1436
1498
& DTD_PACKET_SIZE )
1437
1499
>> DTD_LENGTH_BIT_POS ;
1438
1500
actual -= remaining_length ;
1439
1501
1440
- if (( errors = le32_to_cpu (curr_td -> size_ioc_sts ) &
1441
- DTD_ERROR_MASK ) ) {
1502
+ errors = hc32_to_cpu (curr_td -> size_ioc_sts );
1503
+ if ( errors & DTD_ERROR_MASK ) {
1442
1504
if (errors & DTD_STATUS_HALTED ) {
1443
1505
ERR ("dTD error %08x QH=%d\n" , errors , pipe );
1444
1506
/* Clear the errors and Halt condition */
1445
- tmp = le32_to_cpu (curr_qh -> size_ioc_int_sts );
1507
+ tmp = hc32_to_cpu (curr_qh -> size_ioc_int_sts );
1446
1508
tmp &= ~errors ;
1447
- curr_qh -> size_ioc_int_sts = cpu_to_le32 (tmp );
1509
+ curr_qh -> size_ioc_int_sts = cpu_to_hc32 (tmp );
1448
1510
status = - EPIPE ;
1449
1511
/* FIXME: continue with next queued TD? */
1450
1512
@@ -1462,7 +1524,7 @@ static int process_ep_req(struct fsl_udc *udc, int pipe,
1462
1524
ERR ("Unknown error has occurred (0x%x)!\n" ,
1463
1525
errors );
1464
1526
1465
- } else if (le32_to_cpu (curr_td -> size_ioc_sts )
1527
+ } else if (hc32_to_cpu (curr_td -> size_ioc_sts )
1466
1528
& DTD_STATUS_ACTIVE ) {
1467
1529
VDBG ("Request not complete" );
1468
1530
status = REQ_UNCOMPLETE ;
@@ -2233,6 +2295,7 @@ static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index,
2233
2295
*/
2234
2296
static int __init fsl_udc_probe (struct platform_device * pdev )
2235
2297
{
2298
+ struct fsl_usb2_platform_data * pdata ;
2236
2299
struct resource * res ;
2237
2300
int ret = - ENODEV ;
2238
2301
unsigned int i ;
@@ -2249,6 +2312,8 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2249
2312
return - ENOMEM ;
2250
2313
}
2251
2314
2315
+ pdata = pdev -> dev .platform_data ;
2316
+ udc_controller -> pdata = pdata ;
2252
2317
spin_lock_init (& udc_controller -> lock );
2253
2318
udc_controller -> stopped = 1 ;
2254
2319
@@ -2271,6 +2336,14 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
2271
2336
goto err_release_mem_region ;
2272
2337
}
2273
2338
2339
+ if (pdata -> big_endian_mmio ) {
2340
+ _fsl_readl = _fsl_readl_be ;
2341
+ _fsl_writel = _fsl_writel_be ;
2342
+ } else {
2343
+ _fsl_readl = _fsl_readl_le ;
2344
+ _fsl_writel = _fsl_writel_le ;
2345
+ }
2346
+
2274
2347
#ifndef CONFIG_ARCH_MXC
2275
2348
usb_sys_regs = (struct usb_sys_interface * )
2276
2349
((u32 )dr_regs + USB_DR_SYS_OFFSET );
0 commit comments