Skip to content

Commit 1df9d9e

Browse files
Peter Ujfalusigregkh
authored andcommitted
usb: musb: tusb6010_omap: Create new struct for DMA data/parameters
For the DMA we have ch (channel), dmareq and sync_dev parameters both within the tusb_omap_dma_ch and tusb_omap_dma struct. By creating a common struct the code can be simplified when selecting between the shared or multichannel DMA parameters. Signed-off-by: Peter Ujfalusi <[email protected]> Tested-by: Tony Lindgren <[email protected]> Signed-off-by: Bin Liu <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 3565b78 commit 1df9d9e

File tree

1 file changed

+85
-79
lines changed

1 file changed

+85
-79
lines changed

drivers/usb/musb/tusb6010_omap.c

Lines changed: 85 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
#define OMAP242X_DMA_EXT_DMAREQ4 16
3232
#define OMAP242X_DMA_EXT_DMAREQ5 64
3333

34+
struct tusb_dma_data {
35+
int ch;
36+
s8 dmareq;
37+
s8 sync_dev;
38+
};
39+
3440
struct tusb_omap_dma_ch {
3541
struct musb *musb;
3642
void __iomem *tbase;
@@ -39,9 +45,7 @@ struct tusb_omap_dma_ch {
3945
u8 tx;
4046
struct musb_hw_ep *hw_ep;
4147

42-
int ch;
43-
s8 dmareq;
44-
s8 sync_dev;
48+
struct tusb_dma_data dma_data;
4549

4650
struct tusb_omap_dma *tusb_dma;
4751

@@ -58,9 +62,7 @@ struct tusb_omap_dma {
5862
struct dma_controller controller;
5963
void __iomem *tbase;
6064

61-
int ch;
62-
s8 dmareq;
63-
s8 sync_dev;
65+
struct tusb_dma_data dma_data;
6466
unsigned multichannel:1;
6567
};
6668

@@ -119,9 +121,9 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
119121
spin_lock_irqsave(&musb->lock, flags);
120122

121123
if (tusb_dma->multichannel)
122-
ch = chdat->ch;
124+
ch = chdat->dma_data.ch;
123125
else
124-
ch = tusb_dma->ch;
126+
ch = tusb_dma->dma_data.ch;
125127

126128
if (ch_status != OMAP_DMA_BLOCK_IRQ)
127129
printk(KERN_ERR "TUSB DMA error status: %i\n", ch_status);
@@ -140,8 +142,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)
140142
/* HW issue #10: XFR_SIZE may get corrupt on DMA (both async & sync) */
141143
if (unlikely(remaining > chdat->transfer_len)) {
142144
dev_dbg(musb->controller, "Corrupt %s dma ch%i XFR_SIZE: 0x%08lx\n",
143-
chdat->tx ? "tx" : "rx", chdat->ch,
144-
remaining);
145+
chdat->tx ? "tx" : "rx", ch, remaining);
145146
remaining = 0;
146147
}
147148

@@ -220,9 +221,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
220221
int src_burst, dst_burst;
221222
u16 csr;
222223
u32 psize;
223-
int ch;
224-
s8 dmareq;
225-
s8 sync_dev;
224+
struct tusb_dma_data *dma_data;
226225

227226
if (unlikely(dma_addr & 0x1) || (len < 32) || (len > packet_sz))
228227
return false;
@@ -249,7 +248,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
249248
dma_remaining = TUSB_EP_CONFIG_XFR_SIZE(dma_remaining);
250249
if (dma_remaining) {
251250
dev_dbg(musb->controller, "Busy %s dma ch%i, not using: %08x\n",
252-
chdat->tx ? "tx" : "rx", chdat->ch,
251+
chdat->tx ? "tx" : "rx", chdat->dma_data.ch,
253252
dma_remaining);
254253
return false;
255254
}
@@ -262,26 +261,23 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
262261
chdat->transfer_packet_sz = packet_sz;
263262

264263
if (tusb_dma->multichannel) {
265-
ch = chdat->ch;
266-
dmareq = chdat->dmareq;
267-
sync_dev = chdat->sync_dev;
264+
dma_data = &chdat->dma_data;
268265
} else {
266+
dma_data = &tusb_dma->dma_data;
267+
269268
if (tusb_omap_use_shared_dmareq(chdat) != 0) {
270269
dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum);
271270
return false;
272271
}
273-
if (tusb_dma->ch < 0) {
272+
if (dma_data->ch < 0) {
274273
/* REVISIT: This should get blocked earlier, happens
275274
* with MSC ErrorRecoveryTest
276275
*/
277276
WARN_ON(1);
278277
return false;
279278
}
280279

281-
ch = tusb_dma->ch;
282-
dmareq = tusb_dma->dmareq;
283-
sync_dev = tusb_dma->sync_dev;
284-
omap_set_dma_callback(ch, tusb_omap_dma_cb, channel);
280+
omap_set_dma_callback(dma_data->ch, tusb_omap_dma_cb, channel);
285281
}
286282

287283
chdat->packet_sz = packet_sz;
@@ -312,7 +308,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
312308

313309
dev_dbg(musb->controller, "ep%i %s dma ch%i dma: %pad len: %u(%u) packet_sz: %i(%i)\n",
314310
chdat->epnum, chdat->tx ? "tx" : "rx",
315-
ch, &dma_addr, chdat->transfer_len, len,
311+
dma_data->ch, &dma_addr, chdat->transfer_len, len,
316312
chdat->transfer_packet_sz, packet_sz);
317313

318314
/*
@@ -329,7 +325,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
329325
dma_params.dst_ei = 1;
330326
dma_params.dst_fi = -31; /* Loop 32 byte window */
331327

332-
dma_params.trigger = sync_dev;
328+
dma_params.trigger = dma_data->sync_dev;
333329
dma_params.sync_mode = OMAP_DMA_SYNC_FRAME;
334330
dma_params.src_or_dst_synch = 0; /* Dest sync */
335331

@@ -346,7 +342,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
346342
dma_params.dst_ei = 0;
347343
dma_params.dst_fi = 0;
348344

349-
dma_params.trigger = sync_dev;
345+
dma_params.trigger = dma_data->sync_dev;
350346
dma_params.sync_mode = OMAP_DMA_SYNC_FRAME;
351347
dma_params.src_or_dst_synch = 1; /* Source sync */
352348

@@ -360,10 +356,10 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
360356
((dma_addr & 0x3) == 0) ? "sync" : "async",
361357
dma_params.src_start, dma_params.dst_start);
362358

363-
omap_set_dma_params(ch, &dma_params);
364-
omap_set_dma_src_burst_mode(ch, src_burst);
365-
omap_set_dma_dest_burst_mode(ch, dst_burst);
366-
omap_set_dma_write_mode(ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
359+
omap_set_dma_params(dma_data->ch, &dma_params);
360+
omap_set_dma_src_burst_mode(dma_data->ch, src_burst);
361+
omap_set_dma_dest_burst_mode(dma_data->ch, dst_burst);
362+
omap_set_dma_write_mode(dma_data->ch, OMAP_DMA_WRITE_LAST_NON_POSTED);
367363

368364
/*
369365
* Prepare MUSB for DMA transfer
@@ -386,7 +382,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,
386382
/*
387383
* Start DMA transfer
388384
*/
389-
omap_start_dma(ch);
385+
omap_start_dma(dma_data->ch);
390386

391387
if (chdat->tx) {
392388
/* Send transfer_packet_sz packets at a time */
@@ -415,16 +411,17 @@ static int tusb_omap_dma_abort(struct dma_channel *channel)
415411
{
416412
struct tusb_omap_dma_ch *chdat = to_chdat(channel);
417413
struct tusb_omap_dma *tusb_dma = chdat->tusb_dma;
414+
struct tusb_dma_data *dma_data = &tusb_dma->dma_data;
418415

419416
if (!tusb_dma->multichannel) {
420-
if (tusb_dma->ch >= 0) {
421-
omap_stop_dma(tusb_dma->ch);
422-
omap_free_dma(tusb_dma->ch);
423-
tusb_dma->ch = -1;
417+
if (dma_data->ch >= 0) {
418+
omap_stop_dma(dma_data->ch);
419+
omap_free_dma(dma_data->ch);
420+
dma_data->ch = -1;
424421
}
425422

426-
tusb_dma->dmareq = -1;
427-
tusb_dma->sync_dev = -1;
423+
dma_data->dmareq = -1;
424+
dma_data->sync_dev = -1;
428425
}
429426

430427
channel->status = MUSB_DMA_STATUS_FREE;
@@ -462,8 +459,8 @@ static inline int tusb_omap_dma_allocate_dmareq(struct tusb_omap_dma_ch *chdat)
462459
reg |= ((1 << 4) << (dmareq_nr * 5));
463460
musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
464461

465-
chdat->dmareq = dmareq_nr;
466-
chdat->sync_dev = sync_dev[chdat->dmareq];
462+
chdat->dma_data.dmareq = dmareq_nr;
463+
chdat->dma_data.sync_dev = sync_dev[chdat->dma_data.dmareq];
467464

468465
return 0;
469466
}
@@ -472,15 +469,15 @@ static inline void tusb_omap_dma_free_dmareq(struct tusb_omap_dma_ch *chdat)
472469
{
473470
u32 reg;
474471

475-
if (!chdat || chdat->dmareq < 0)
472+
if (!chdat || chdat->dma_data.dmareq < 0)
476473
return;
477474

478475
reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
479-
reg &= ~(0x1f << (chdat->dmareq * 5));
476+
reg &= ~(0x1f << (chdat->dma_data.dmareq * 5));
480477
musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
481478

482-
chdat->dmareq = -1;
483-
chdat->sync_dev = -1;
479+
chdat->dma_data.dmareq = -1;
480+
chdat->dma_data.sync_dev = -1;
484481
}
485482

486483
static struct dma_channel *dma_channel_pool[MAX_DMAREQ];
@@ -492,11 +489,13 @@ tusb_omap_dma_allocate(struct dma_controller *c,
492489
{
493490
int ret, i;
494491
const char *dev_name;
492+
void *cb_data;
495493
struct tusb_omap_dma *tusb_dma;
496494
struct musb *musb;
497495
void __iomem *tbase;
498496
struct dma_channel *channel = NULL;
499497
struct tusb_omap_dma_ch *chdat = NULL;
498+
struct tusb_dma_data *dma_data = NULL;
500499
u32 reg;
501500

502501
tusb_dma = container_of(c, struct tusb_omap_dma, controller);
@@ -529,56 +528,62 @@ tusb_omap_dma_allocate(struct dma_controller *c,
529528
if (!channel)
530529
return NULL;
531530

532-
if (tx) {
533-
chdat->tx = 1;
534-
dev_name = "TUSB transmit";
535-
} else {
536-
chdat->tx = 0;
537-
dev_name = "TUSB receive";
538-
}
539-
540531
chdat->musb = tusb_dma->controller.musb;
541532
chdat->tbase = tusb_dma->tbase;
542533
chdat->hw_ep = hw_ep;
543534
chdat->epnum = hw_ep->epnum;
544-
chdat->dmareq = -1;
545535
chdat->completed_len = 0;
546536
chdat->tusb_dma = tusb_dma;
537+
if (tx)
538+
chdat->tx = 1;
539+
else
540+
chdat->tx = 0;
547541

548542
channel->max_len = 0x7fffffff;
549543
channel->desired_mode = 0;
550544
channel->actual_len = 0;
551545

552546
if (tusb_dma->multichannel) {
547+
dma_data = &chdat->dma_data;
553548
ret = tusb_omap_dma_allocate_dmareq(chdat);
554549
if (ret != 0)
555550
goto free_dmareq;
556551

557-
ret = omap_request_dma(chdat->sync_dev, dev_name,
558-
tusb_omap_dma_cb, channel, &chdat->ch);
559-
if (ret != 0)
560-
goto free_dmareq;
561-
} else if (tusb_dma->ch == -1) {
562-
tusb_dma->dmareq = 0;
563-
tusb_dma->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
564-
552+
if (chdat->tx)
553+
dev_name = "TUSB transmit";
554+
else
555+
dev_name = "TUSB receive";
556+
cb_data = channel;
557+
} else if (tusb_dma->dma_data.ch == -1) {
558+
dma_data = &tusb_dma->dma_data;
559+
dma_data->dmareq = 0;
560+
dma_data->sync_dev = OMAP24XX_DMA_EXT_DMAREQ0;
561+
562+
dev_name = "TUSB shared";
565563
/* Callback data gets set later in the shared dmareq case */
566-
ret = omap_request_dma(tusb_dma->sync_dev, "TUSB shared",
567-
tusb_omap_dma_cb, NULL, &tusb_dma->ch);
564+
cb_data = NULL;
565+
566+
chdat->dma_data.dmareq = -1;
567+
chdat->dma_data.ch = -1;
568+
chdat->dma_data.sync_dev = -1;
569+
}
570+
571+
if (dma_data) {
572+
ret = omap_request_dma(dma_data->sync_dev, dev_name,
573+
tusb_omap_dma_cb, cb_data,
574+
&dma_data->ch);
568575
if (ret != 0)
569576
goto free_dmareq;
570-
571-
chdat->dmareq = -1;
572-
chdat->ch = -1;
577+
} else {
578+
/* Already allocated shared, single DMA channel. */
579+
dma_data = &tusb_dma->dma_data;
573580
}
574581

575582
dev_dbg(musb->controller, "ep%i %s dma: %s dma%i dmareq%i sync%i\n",
576583
chdat->epnum,
577584
chdat->tx ? "tx" : "rx",
578-
chdat->ch >= 0 ? "dedicated" : "shared",
579-
chdat->ch >= 0 ? chdat->ch : tusb_dma->ch,
580-
chdat->dmareq >= 0 ? chdat->dmareq : tusb_dma->dmareq,
581-
chdat->sync_dev >= 0 ? chdat->sync_dev : tusb_dma->sync_dev);
585+
chdat->dma_data.ch >= 0 ? "dedicated" : "shared",
586+
dma_data->ch, dma_data->dmareq, dma_data->sync_dev);
582587

583588
return channel;
584589

@@ -598,7 +603,8 @@ static void tusb_omap_dma_release(struct dma_channel *channel)
598603
void __iomem *tbase = musb->ctrl_base;
599604
u32 reg;
600605

601-
dev_dbg(musb->controller, "ep%i ch%i\n", chdat->epnum, chdat->ch);
606+
dev_dbg(musb->controller, "ep%i ch%i\n", chdat->epnum,
607+
chdat->dma_data.ch);
602608

603609
reg = musb_readl(tbase, TUSB_DMA_INT_MASK);
604610
if (chdat->tx)
@@ -616,13 +622,13 @@ static void tusb_omap_dma_release(struct dma_channel *channel)
616622

617623
channel->status = MUSB_DMA_STATUS_UNKNOWN;
618624

619-
if (chdat->ch >= 0) {
620-
omap_stop_dma(chdat->ch);
621-
omap_free_dma(chdat->ch);
622-
chdat->ch = -1;
625+
if (chdat->dma_data.ch >= 0) {
626+
omap_stop_dma(chdat->dma_data.ch);
627+
omap_free_dma(chdat->dma_data.ch);
628+
chdat->dma_data.ch = -1;
623629
}
624630

625-
if (chdat->dmareq >= 0)
631+
if (chdat->dma_data.dmareq >= 0)
626632
tusb_omap_dma_free_dmareq(chdat);
627633

628634
channel = NULL;
@@ -642,8 +648,8 @@ void tusb_dma_controller_destroy(struct dma_controller *c)
642648
}
643649
}
644650

645-
if (tusb_dma && !tusb_dma->multichannel && tusb_dma->ch >= 0)
646-
omap_free_dma(tusb_dma->ch);
651+
if (tusb_dma && !tusb_dma->multichannel && tusb_dma->dma_data.ch >= 0)
652+
omap_free_dma(tusb_dma->dma_data.ch);
647653

648654
kfree(tusb_dma);
649655
}
@@ -673,9 +679,9 @@ tusb_dma_controller_create(struct musb *musb, void __iomem *base)
673679
tusb_dma->controller.musb = musb;
674680
tusb_dma->tbase = musb->ctrl_base;
675681

676-
tusb_dma->ch = -1;
677-
tusb_dma->dmareq = -1;
678-
tusb_dma->sync_dev = -1;
682+
tusb_dma->dma_data.ch = -1;
683+
tusb_dma->dma_data.dmareq = -1;
684+
tusb_dma->dma_data.sync_dev = -1;
679685

680686
tusb_dma->controller.channel_alloc = tusb_omap_dma_allocate;
681687
tusb_dma->controller.channel_release = tusb_omap_dma_release;

0 commit comments

Comments
 (0)