diff options
author | Hans de Goede <hdegoede@redhat.com> | 2015-03-20 15:11:12 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-05-26 11:46:54 -0400 |
commit | 6cc2af6d50204e8a1034ecd162378ceea22b09e8 (patch) | |
tree | da62fadb96bb790ebbdc9ce0b1fbe7fbcaf4a2f3 | |
parent | 0cb74b3dc45a5448161eb481d4709cdda2a889fd (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.c | 34 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.h | 5 | ||||
-rw-r--r-- | drivers/usb/musb/musb_host.c | 12 | ||||
-rw-r--r-- | drivers/usb/musb/musb_io.h | 2 | ||||
-rw-r--r-- | drivers/usb/musb/musb_regs.h | 63 |
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 | ||
254 | static u32 musb_default_busctl_offset(u8 epnum, u16 offset) | ||
255 | { | ||
256 | return 0x80 + (0x08 * epnum) + offset; | ||
257 | } | ||
258 | |||
254 | static u8 musb_default_readb(const void __iomem *addr, unsigned offset) | 259 | static 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 | |||
447 | static inline struct musb *gadget_to_musb(struct usb_gadget *g) | 450 | static 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 | */ |
51 | struct musb_io { | 52 | struct 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 | |||
306 | static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) | 303 | static 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 | ||
367 | static inline void musb_write_rxfunaddr(void __iomem *mbase, u8 epnum, | 364 | static 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 | ||
374 | static inline void musb_write_rxhubaddr(void __iomem *mbase, u8 epnum, | 372 | static 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 | ||
381 | static inline void musb_write_rxhubport(void __iomem *mbase, u8 epnum, | 379 | static 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 | ||
388 | static inline void musb_write_txfunaddr(void __iomem *mbase, u8 epnum, | 386 | static 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 | ||
395 | static inline void musb_write_txhubaddr(void __iomem *mbase, u8 epnum, | 394 | static 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 | ||
402 | static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, | 401 | static 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 | ||
409 | static inline u8 musb_read_rxfunaddr(void __iomem *mbase, u8 epnum) | 408 | static 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 | ||
414 | static inline u8 musb_read_rxhubaddr(void __iomem *mbase, u8 epnum) | 414 | static 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 | ||
419 | static inline u8 musb_read_rxhubport(void __iomem *mbase, u8 epnum) | 420 | static 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 | ||
424 | static inline u8 musb_read_txfunaddr(void __iomem *mbase, u8 epnum) | 426 | static 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 | ||
429 | static inline u8 musb_read_txhubaddr(void __iomem *mbase, u8 epnum) | 432 | static 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 | ||
434 | static inline u8 musb_read_txhubport(void __iomem *mbase, u8 epnum) | 438 | static 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 */ |