aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-03-20 15:11:12 -0400
committerFelipe Balbi <balbi@ti.com>2015-05-26 11:46:54 -0400
commit6cc2af6d50204e8a1034ecd162378ceea22b09e8 (patch)
treeda62fadb96bb790ebbdc9ce0b1fbe7fbcaf4a2f3
parent0cb74b3dc45a5448161eb481d4709cdda2a889fd (diff)
usb: musb: Make busctl_offset an io-op rather then a define
The Allwinner (sunxi) implementation of the musb has its busctl registers indexed by the MUSB_INDEX register rather then in a flat address space. This commit turns MUSB_BUSCTL_OFFSET from a macro into an io-op which can be overridden from the platform ops. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/musb/musb_core.c34
-rw-r--r--drivers/usb/musb/musb_core.h5
-rw-r--r--drivers/usb/musb/musb_host.c12
-rw-r--r--drivers/usb/musb/musb_io.h2
-rw-r--r--drivers/usb/musb/musb_regs.h63
5 files changed, 68 insertions, 48 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index a3bc06d56fcb..fea3402f12d5 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -251,6 +251,11 @@ static u32 musb_indexed_ep_offset(u8 epnum, u16 offset)
251 return 0x10 + offset; 251 return 0x10 + offset;
252} 252}
253 253
254static u32 musb_default_busctl_offset(u8 epnum, u16 offset)
255{
256 return 0x80 + (0x08 * epnum) + offset;
257}
258
254static u8 musb_default_readb(const void __iomem *addr, unsigned offset) 259static u8 musb_default_readb(const void __iomem *addr, unsigned offset)
255{ 260{
256 return __raw_readb(addr + offset); 261 return __raw_readb(addr + offset);
@@ -2052,6 +2057,11 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2052 else 2057 else
2053 musb->io.fifo_offset = musb_default_fifo_offset; 2058 musb->io.fifo_offset = musb_default_fifo_offset;
2054 2059
2060 if (musb->ops->busctl_offset)
2061 musb->io.busctl_offset = musb->ops->busctl_offset;
2062 else
2063 musb->io.busctl_offset = musb_default_busctl_offset;
2064
2055 if (musb->ops->readb) 2065 if (musb->ops->readb)
2056 musb_readb = musb->ops->readb; 2066 musb_readb = musb->ops->readb;
2057 if (musb->ops->writeb) 2067 if (musb->ops->writeb)
@@ -2332,18 +2342,18 @@ static void musb_save_context(struct musb *musb)
2332 musb_readb(epio, MUSB_RXINTERVAL); 2342 musb_readb(epio, MUSB_RXINTERVAL);
2333 2343
2334 musb->context.index_regs[i].txfunaddr = 2344 musb->context.index_regs[i].txfunaddr =
2335 musb_read_txfunaddr(musb_base, i); 2345 musb_read_txfunaddr(musb, i);
2336 musb->context.index_regs[i].txhubaddr = 2346 musb->context.index_regs[i].txhubaddr =
2337 musb_read_txhubaddr(musb_base, i); 2347 musb_read_txhubaddr(musb, i);
2338 musb->context.index_regs[i].txhubport = 2348 musb->context.index_regs[i].txhubport =
2339 musb_read_txhubport(musb_base, i); 2349 musb_read_txhubport(musb, i);
2340 2350
2341 musb->context.index_regs[i].rxfunaddr = 2351 musb->context.index_regs[i].rxfunaddr =
2342 musb_read_rxfunaddr(musb_base, i); 2352 musb_read_rxfunaddr(musb, i);
2343 musb->context.index_regs[i].rxhubaddr = 2353 musb->context.index_regs[i].rxhubaddr =
2344 musb_read_rxhubaddr(musb_base, i); 2354 musb_read_rxhubaddr(musb, i);
2345 musb->context.index_regs[i].rxhubport = 2355 musb->context.index_regs[i].rxhubport =
2346 musb_read_rxhubport(musb_base, i); 2356 musb_read_rxhubport(musb, i);
2347 } 2357 }
2348} 2358}
2349 2359
@@ -2411,18 +2421,18 @@ static void musb_restore_context(struct musb *musb)
2411 musb_writeb(epio, MUSB_RXINTERVAL, 2421 musb_writeb(epio, MUSB_RXINTERVAL,
2412 2422
2413 musb->context.index_regs[i].rxinterval); 2423 musb->context.index_regs[i].rxinterval);
2414 musb_write_txfunaddr(musb_base, i, 2424 musb_write_txfunaddr(musb, i,
2415 musb->context.index_regs[i].txfunaddr); 2425 musb->context.index_regs[i].txfunaddr);
2416 musb_write_txhubaddr(musb_base, i, 2426 musb_write_txhubaddr(musb, i,
2417 musb->context.index_regs[i].txhubaddr); 2427 musb->context.index_regs[i].txhubaddr);
2418 musb_write_txhubport(musb_base, i, 2428 musb_write_txhubport(musb, i,
2419 musb->context.index_regs[i].txhubport); 2429 musb->context.index_regs[i].txhubport);
2420 2430
2421 musb_write_rxfunaddr(musb_base, i, 2431 musb_write_rxfunaddr(musb, i,
2422 musb->context.index_regs[i].rxfunaddr); 2432 musb->context.index_regs[i].rxfunaddr);
2423 musb_write_rxhubaddr(musb_base, i, 2433 musb_write_rxhubaddr(musb, i,
2424 musb->context.index_regs[i].rxhubaddr); 2434 musb->context.index_regs[i].rxhubaddr);
2425 musb_write_rxhubport(musb_base, i, 2435 musb_write_rxhubport(musb, i,
2426 musb->context.index_regs[i].rxhubport); 2436 musb->context.index_regs[i].rxhubport);
2427 } 2437 }
2428 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); 2438 musb_writeb(musb_base, MUSB_INDEX, musb->context.index);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index b8372f6006e3..4b886d0f6bdf 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -67,7 +67,6 @@ struct musb_ep;
67#include "musb_dma.h" 67#include "musb_dma.h"
68 68
69#include "musb_io.h" 69#include "musb_io.h"
70#include "musb_regs.h"
71 70
72#include "musb_gadget.h" 71#include "musb_gadget.h"
73#include <linux/usb/hcd.h> 72#include <linux/usb/hcd.h>
@@ -191,6 +190,7 @@ struct musb_platform_ops {
191 void (*ep_select)(void __iomem *mbase, u8 epnum); 190 void (*ep_select)(void __iomem *mbase, u8 epnum);
192 u16 fifo_mode; 191 u16 fifo_mode;
193 u32 (*fifo_offset)(u8 epnum); 192 u32 (*fifo_offset)(u8 epnum);
193 u32 (*busctl_offset)(u8 epnum, u16 offset);
194 u8 (*readb)(const void __iomem *addr, unsigned offset); 194 u8 (*readb)(const void __iomem *addr, unsigned offset);
195 void (*writeb)(void __iomem *addr, unsigned offset, u8 data); 195 void (*writeb)(void __iomem *addr, unsigned offset, u8 data);
196 u16 (*readw)(const void __iomem *addr, unsigned offset); 196 u16 (*readw)(const void __iomem *addr, unsigned offset);
@@ -444,6 +444,9 @@ struct musb {
444#endif 444#endif
445}; 445};
446 446
447/* This must be included after struct musb is defined */
448#include "musb_regs.h"
449
447static inline struct musb *gadget_to_musb(struct usb_gadget *g) 450static inline struct musb *gadget_to_musb(struct usb_gadget *g)
448{ 451{
449 return container_of(g, struct musb, g); 452 return container_of(g, struct musb, g);
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 4a19c8110e7a..26c65e66cc0f 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -595,9 +595,9 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, u8 epnum)
595 595
596 /* target addr and (for multipoint) hub addr/port */ 596 /* target addr and (for multipoint) hub addr/port */
597 if (musb->is_multipoint) { 597 if (musb->is_multipoint) {
598 musb_write_rxfunaddr(musb->mregs, epnum, qh->addr_reg); 598 musb_write_rxfunaddr(musb, epnum, qh->addr_reg);
599 musb_write_rxhubaddr(musb->mregs, epnum, qh->h_addr_reg); 599 musb_write_rxhubaddr(musb, epnum, qh->h_addr_reg);
600 musb_write_rxhubport(musb->mregs, epnum, qh->h_port_reg); 600 musb_write_rxhubport(musb, epnum, qh->h_port_reg);
601 } else 601 } else
602 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); 602 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg);
603 603
@@ -836,9 +836,9 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
836 836
837 /* target addr and (for multipoint) hub addr/port */ 837 /* target addr and (for multipoint) hub addr/port */
838 if (musb->is_multipoint) { 838 if (musb->is_multipoint) {
839 musb_write_txfunaddr(mbase, epnum, qh->addr_reg); 839 musb_write_txfunaddr(musb, epnum, qh->addr_reg);
840 musb_write_txhubaddr(mbase, epnum, qh->h_addr_reg); 840 musb_write_txhubaddr(musb, epnum, qh->h_addr_reg);
841 musb_write_txhubport(mbase, epnum, qh->h_port_reg); 841 musb_write_txhubport(musb, epnum, qh->h_port_reg);
842/* FIXME if !epnum, do the same for RX ... */ 842/* FIXME if !epnum, do the same for RX ... */
843 } else 843 } else
844 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); 844 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg);
diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h
index 8a57a6f4b3a6..17a80ae20674 100644
--- a/drivers/usb/musb/musb_io.h
+++ b/drivers/usb/musb/musb_io.h
@@ -47,6 +47,7 @@
47 * @fifo_offset: platform specific function to get fifo offset 47 * @fifo_offset: platform specific function to get fifo offset
48 * @read_fifo: platform specific function to read fifo 48 * @read_fifo: platform specific function to read fifo
49 * @write_fifo: platform specific function to write fifo 49 * @write_fifo: platform specific function to write fifo
50 * @busctl_offset: platform specific function to get busctl offset
50 */ 51 */
51struct musb_io { 52struct musb_io {
52 u32 quirks; 53 u32 quirks;
@@ -55,6 +56,7 @@ struct musb_io {
55 u32 (*fifo_offset)(u8 epnum); 56 u32 (*fifo_offset)(u8 epnum);
56 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf); 57 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf);
57 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf); 58 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
59 u32 (*busctl_offset)(u8 epnum, u16 offset);
58}; 60};
59 61
60/* Do not add new entries here, add them the struct musb_io instead */ 62/* Do not add new entries here, add them the struct musb_io instead */
diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h
index edfc730f0ab2..cff5bcf0d00f 100644
--- a/drivers/usb/musb/musb_regs.h
+++ b/drivers/usb/musb/musb_regs.h
@@ -300,9 +300,6 @@
300#define MUSB_RXHUBADDR 0x06 300#define MUSB_RXHUBADDR 0x06
301#define MUSB_RXHUBPORT 0x07 301#define MUSB_RXHUBPORT 0x07
302 302
303#define MUSB_BUSCTL_OFFSET(_epnum, _offset) \
304 (0x80 + (8*(_epnum)) + (_offset))
305
306static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) 303static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size)
307{ 304{
308 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size); 305 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
@@ -364,76 +361,84 @@ static inline u16 musb_read_hwvers(void __iomem *mbase)
364 return musb_readw(mbase, MUSB_HWVERS); 361 return musb_readw(mbase, MUSB_HWVERS);
365} 362}
366 363
367static inline void musb_write_rxfunaddr(void __iomem *mbase, u8 epnum, 364static inline void musb_write_rxfunaddr(struct musb *musb, u8 epnum,
368 u8 qh_addr_reg) 365 u8 qh_addr_reg)
369{ 366{
370 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXFUNCADDR), 367 musb_writeb(musb->mregs,
371 qh_addr_reg); 368 musb->io.busctl_offset(epnum, MUSB_RXFUNCADDR),
369 qh_addr_reg);
372} 370}
373 371
374static inline void musb_write_rxhubaddr(void __iomem *mbase, u8 epnum, 372static inline void musb_write_rxhubaddr(struct musb *musb, u8 epnum,
375 u8 qh_h_addr_reg) 373 u8 qh_h_addr_reg)
376{ 374{
377 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBADDR), 375 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_RXHUBADDR),
378 qh_h_addr_reg); 376 qh_h_addr_reg);
379} 377}
380 378
381static inline void musb_write_rxhubport(void __iomem *mbase, u8 epnum, 379static inline void musb_write_rxhubport(struct musb *musb, u8 epnum,
382 u8 qh_h_port_reg) 380 u8 qh_h_port_reg)
383{ 381{
384 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBPORT), 382 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_RXHUBPORT),
385 qh_h_port_reg); 383 qh_h_port_reg);
386} 384}
387 385
388static inline void musb_write_txfunaddr(void __iomem *mbase, u8 epnum, 386static inline void musb_write_txfunaddr(struct musb *musb, u8 epnum,
389 u8 qh_addr_reg) 387 u8 qh_addr_reg)
390{ 388{
391 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR), 389 musb_writeb(musb->mregs,
392 qh_addr_reg); 390 musb->io.busctl_offset(epnum, MUSB_TXFUNCADDR),
391 qh_addr_reg);
393} 392}
394 393
395static inline void musb_write_txhubaddr(void __iomem *mbase, u8 epnum, 394static inline void musb_write_txhubaddr(struct musb *musb, u8 epnum,
396 u8 qh_addr_reg) 395 u8 qh_addr_reg)
397{ 396{
398 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR), 397 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_TXHUBADDR),
399 qh_addr_reg); 398 qh_addr_reg);
400} 399}
401 400
402static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, 401static inline void musb_write_txhubport(struct musb *musb, u8 epnum,
403 u8 qh_h_port_reg) 402 u8 qh_h_port_reg)
404{ 403{
405 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT), 404 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_TXHUBPORT),
406 qh_h_port_reg); 405 qh_h_port_reg);
407} 406}
408 407
409static inline u8 musb_read_rxfunaddr(void __iomem *mbase, u8 epnum) 408static inline u8 musb_read_rxfunaddr(struct musb *musb, u8 epnum)
410{ 409{
411 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXFUNCADDR)); 410 return musb_readb(musb->mregs,
411 musb->io.busctl_offset(epnum, MUSB_RXFUNCADDR));
412} 412}
413 413
414static inline u8 musb_read_rxhubaddr(void __iomem *mbase, u8 epnum) 414static inline u8 musb_read_rxhubaddr(struct musb *musb, u8 epnum)
415{ 415{
416 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBADDR)); 416 return musb_readb(musb->mregs,
417 musb->io.busctl_offset(epnum, MUSB_RXHUBADDR));
417} 418}
418 419
419static inline u8 musb_read_rxhubport(void __iomem *mbase, u8 epnum) 420static inline u8 musb_read_rxhubport(struct musb *musb, u8 epnum)
420{ 421{
421 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBPORT)); 422 return musb_readb(musb->mregs,
423 musb->io.busctl_offset(epnum, MUSB_RXHUBPORT));
422} 424}
423 425
424static inline u8 musb_read_txfunaddr(void __iomem *mbase, u8 epnum) 426static inline u8 musb_read_txfunaddr(struct musb *musb, u8 epnum)
425{ 427{
426 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR)); 428 return musb_readb(musb->mregs,
429 musb->io.busctl_offset(epnum, MUSB_TXFUNCADDR));
427} 430}
428 431
429static inline u8 musb_read_txhubaddr(void __iomem *mbase, u8 epnum) 432static inline u8 musb_read_txhubaddr(struct musb *musb, u8 epnum)
430{ 433{
431 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR)); 434 return musb_readb(musb->mregs,
435 musb->io.busctl_offset(epnum, MUSB_TXHUBADDR));
432} 436}
433 437
434static inline u8 musb_read_txhubport(void __iomem *mbase, u8 epnum) 438static inline u8 musb_read_txhubport(struct musb *musb, u8 epnum)
435{ 439{
436 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT)); 440 return musb_readb(musb->mregs,
441 musb->io.busctl_offset(epnum, MUSB_TXHUBPORT));
437} 442}
438 443
439#else /* CONFIG_BLACKFIN */ 444#else /* CONFIG_BLACKFIN */