aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2019-07-16 04:26:53 -0400
committerVinod Koul <vkoul@kernel.org>2019-07-29 02:41:38 -0400
commite96b1f64ee2885acb8fb26325eb9743ad6c64696 (patch)
tree4d94da9ea3d18c7aa01d99737550004bc948c479
parent4689d35c765c696bdf0535486a990038b242a26b (diff)
dmaengine: ti: edma: Clean up the 2x32bit array register accesses
Introduce defines for getting the array index and the bit number within the 64bit array register pairs. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Link: https://lore.kernel.org/r/20190716082655.1620-2-peter.ujfalusi@ti.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r--drivers/dma/ti/edma.c106
1 files changed, 61 insertions, 45 deletions
diff --git a/drivers/dma/ti/edma.c b/drivers/dma/ti/edma.c
index f2549ee3fb49..6d0e0bcc0379 100644
--- a/drivers/dma/ti/edma.c
+++ b/drivers/dma/ti/edma.c
@@ -132,6 +132,17 @@
132#define EDMA_CONT_PARAMS_FIXED_EXACT 1002 132#define EDMA_CONT_PARAMS_FIXED_EXACT 1002
133#define EDMA_CONT_PARAMS_FIXED_NOT_EXACT 1003 133#define EDMA_CONT_PARAMS_FIXED_NOT_EXACT 1003
134 134
135/*
136 * 64bit array registers are split into two 32bit registers:
137 * reg0: channel/event 0-31
138 * reg1: channel/event 32-63
139 *
140 * bit 5 in the channel number tells the array index (0/1)
141 * bit 0-4 (0x1f) is the bit offset within the register
142 */
143#define EDMA_REG_ARRAY_INDEX(channel) ((channel) >> 5)
144#define EDMA_CHANNEL_BIT(channel) (BIT((channel) & 0x1f))
145
135/* PaRAM slots are laid out like this */ 146/* PaRAM slots are laid out like this */
136struct edmacc_param { 147struct edmacc_param {
137 u32 opt; 148 u32 opt;
@@ -440,15 +451,14 @@ static void edma_setup_interrupt(struct edma_chan *echan, bool enable)
440{ 451{
441 struct edma_cc *ecc = echan->ecc; 452 struct edma_cc *ecc = echan->ecc;
442 int channel = EDMA_CHAN_SLOT(echan->ch_num); 453 int channel = EDMA_CHAN_SLOT(echan->ch_num);
454 int idx = EDMA_REG_ARRAY_INDEX(channel);
455 int ch_bit = EDMA_CHANNEL_BIT(channel);
443 456
444 if (enable) { 457 if (enable) {
445 edma_shadow0_write_array(ecc, SH_ICR, channel >> 5, 458 edma_shadow0_write_array(ecc, SH_ICR, idx, ch_bit);
446 BIT(channel & 0x1f)); 459 edma_shadow0_write_array(ecc, SH_IESR, idx, ch_bit);
447 edma_shadow0_write_array(ecc, SH_IESR, channel >> 5,
448 BIT(channel & 0x1f));
449 } else { 460 } else {
450 edma_shadow0_write_array(ecc, SH_IECR, channel >> 5, 461 edma_shadow0_write_array(ecc, SH_IECR, idx, ch_bit);
451 BIT(channel & 0x1f));
452 } 462 }
453} 463}
454 464
@@ -586,26 +596,26 @@ static void edma_start(struct edma_chan *echan)
586{ 596{
587 struct edma_cc *ecc = echan->ecc; 597 struct edma_cc *ecc = echan->ecc;
588 int channel = EDMA_CHAN_SLOT(echan->ch_num); 598 int channel = EDMA_CHAN_SLOT(echan->ch_num);
589 int j = (channel >> 5); 599 int idx = EDMA_REG_ARRAY_INDEX(channel);
590 unsigned int mask = BIT(channel & 0x1f); 600 int ch_bit = EDMA_CHANNEL_BIT(channel);
591 601
592 if (!echan->hw_triggered) { 602 if (!echan->hw_triggered) {
593 /* EDMA channels without event association */ 603 /* EDMA channels without event association */
594 dev_dbg(ecc->dev, "ESR%d %08x\n", j, 604 dev_dbg(ecc->dev, "ESR%d %08x\n", idx,
595 edma_shadow0_read_array(ecc, SH_ESR, j)); 605 edma_shadow0_read_array(ecc, SH_ESR, idx));
596 edma_shadow0_write_array(ecc, SH_ESR, j, mask); 606 edma_shadow0_write_array(ecc, SH_ESR, idx, ch_bit);
597 } else { 607 } else {
598 /* EDMA channel with event association */ 608 /* EDMA channel with event association */
599 dev_dbg(ecc->dev, "ER%d %08x\n", j, 609 dev_dbg(ecc->dev, "ER%d %08x\n", idx,
600 edma_shadow0_read_array(ecc, SH_ER, j)); 610 edma_shadow0_read_array(ecc, SH_ER, idx));
601 /* Clear any pending event or error */ 611 /* Clear any pending event or error */
602 edma_write_array(ecc, EDMA_ECR, j, mask); 612 edma_write_array(ecc, EDMA_ECR, idx, ch_bit);
603 edma_write_array(ecc, EDMA_EMCR, j, mask); 613 edma_write_array(ecc, EDMA_EMCR, idx, ch_bit);
604 /* Clear any SER */ 614 /* Clear any SER */
605 edma_shadow0_write_array(ecc, SH_SECR, j, mask); 615 edma_shadow0_write_array(ecc, SH_SECR, idx, ch_bit);
606 edma_shadow0_write_array(ecc, SH_EESR, j, mask); 616 edma_shadow0_write_array(ecc, SH_EESR, idx, ch_bit);
607 dev_dbg(ecc->dev, "EER%d %08x\n", j, 617 dev_dbg(ecc->dev, "EER%d %08x\n", idx,
608 edma_shadow0_read_array(ecc, SH_EER, j)); 618 edma_shadow0_read_array(ecc, SH_EER, idx));
609 } 619 }
610} 620}
611 621
@@ -613,19 +623,19 @@ static void edma_stop(struct edma_chan *echan)
613{ 623{
614 struct edma_cc *ecc = echan->ecc; 624 struct edma_cc *ecc = echan->ecc;
615 int channel = EDMA_CHAN_SLOT(echan->ch_num); 625 int channel = EDMA_CHAN_SLOT(echan->ch_num);
616 int j = (channel >> 5); 626 int idx = EDMA_REG_ARRAY_INDEX(channel);
617 unsigned int mask = BIT(channel & 0x1f); 627 int ch_bit = EDMA_CHANNEL_BIT(channel);
618 628
619 edma_shadow0_write_array(ecc, SH_EECR, j, mask); 629 edma_shadow0_write_array(ecc, SH_EECR, idx, ch_bit);
620 edma_shadow0_write_array(ecc, SH_ECR, j, mask); 630 edma_shadow0_write_array(ecc, SH_ECR, idx, ch_bit);
621 edma_shadow0_write_array(ecc, SH_SECR, j, mask); 631 edma_shadow0_write_array(ecc, SH_SECR, idx, ch_bit);
622 edma_write_array(ecc, EDMA_EMCR, j, mask); 632 edma_write_array(ecc, EDMA_EMCR, idx, ch_bit);
623 633
624 /* clear possibly pending completion interrupt */ 634 /* clear possibly pending completion interrupt */
625 edma_shadow0_write_array(ecc, SH_ICR, j, mask); 635 edma_shadow0_write_array(ecc, SH_ICR, idx, ch_bit);
626 636
627 dev_dbg(ecc->dev, "EER%d %08x\n", j, 637 dev_dbg(ecc->dev, "EER%d %08x\n", idx,
628 edma_shadow0_read_array(ecc, SH_EER, j)); 638 edma_shadow0_read_array(ecc, SH_EER, idx));
629 639
630 /* REVISIT: consider guarding against inappropriate event 640 /* REVISIT: consider guarding against inappropriate event
631 * chaining by overwriting with dummy_paramset. 641 * chaining by overwriting with dummy_paramset.
@@ -639,45 +649,49 @@ static void edma_stop(struct edma_chan *echan)
639static void edma_pause(struct edma_chan *echan) 649static void edma_pause(struct edma_chan *echan)
640{ 650{
641 int channel = EDMA_CHAN_SLOT(echan->ch_num); 651 int channel = EDMA_CHAN_SLOT(echan->ch_num);
642 unsigned int mask = BIT(channel & 0x1f);
643 652
644 edma_shadow0_write_array(echan->ecc, SH_EECR, channel >> 5, mask); 653 edma_shadow0_write_array(echan->ecc, SH_EECR,
654 EDMA_REG_ARRAY_INDEX(channel),
655 EDMA_CHANNEL_BIT(channel));
645} 656}
646 657
647/* Re-enable EDMA hardware events on the specified channel. */ 658/* Re-enable EDMA hardware events on the specified channel. */
648static void edma_resume(struct edma_chan *echan) 659static void edma_resume(struct edma_chan *echan)
649{ 660{
650 int channel = EDMA_CHAN_SLOT(echan->ch_num); 661 int channel = EDMA_CHAN_SLOT(echan->ch_num);
651 unsigned int mask = BIT(channel & 0x1f);
652 662
653 edma_shadow0_write_array(echan->ecc, SH_EESR, channel >> 5, mask); 663 edma_shadow0_write_array(echan->ecc, SH_EESR,
664 EDMA_REG_ARRAY_INDEX(channel),
665 EDMA_CHANNEL_BIT(channel));
654} 666}
655 667
656static void edma_trigger_channel(struct edma_chan *echan) 668static void edma_trigger_channel(struct edma_chan *echan)
657{ 669{
658 struct edma_cc *ecc = echan->ecc; 670 struct edma_cc *ecc = echan->ecc;
659 int channel = EDMA_CHAN_SLOT(echan->ch_num); 671 int channel = EDMA_CHAN_SLOT(echan->ch_num);
660 unsigned int mask = BIT(channel & 0x1f); 672 int idx = EDMA_REG_ARRAY_INDEX(channel);
673 int ch_bit = EDMA_CHANNEL_BIT(channel);
661 674
662 edma_shadow0_write_array(ecc, SH_ESR, (channel >> 5), mask); 675 edma_shadow0_write_array(ecc, SH_ESR, idx, ch_bit);
663 676
664 dev_dbg(ecc->dev, "ESR%d %08x\n", (channel >> 5), 677 dev_dbg(ecc->dev, "ESR%d %08x\n", idx,
665 edma_shadow0_read_array(ecc, SH_ESR, (channel >> 5))); 678 edma_shadow0_read_array(ecc, SH_ESR, idx));
666} 679}
667 680
668static void edma_clean_channel(struct edma_chan *echan) 681static void edma_clean_channel(struct edma_chan *echan)
669{ 682{
670 struct edma_cc *ecc = echan->ecc; 683 struct edma_cc *ecc = echan->ecc;
671 int channel = EDMA_CHAN_SLOT(echan->ch_num); 684 int channel = EDMA_CHAN_SLOT(echan->ch_num);
672 int j = (channel >> 5); 685 int idx = EDMA_REG_ARRAY_INDEX(channel);
673 unsigned int mask = BIT(channel & 0x1f); 686 int ch_bit = EDMA_CHANNEL_BIT(channel);
674 687
675 dev_dbg(ecc->dev, "EMR%d %08x\n", j, edma_read_array(ecc, EDMA_EMR, j)); 688 dev_dbg(ecc->dev, "EMR%d %08x\n", idx,
676 edma_shadow0_write_array(ecc, SH_ECR, j, mask); 689 edma_read_array(ecc, EDMA_EMR, idx));
690 edma_shadow0_write_array(ecc, SH_ECR, idx, ch_bit);
677 /* Clear the corresponding EMR bits */ 691 /* Clear the corresponding EMR bits */
678 edma_write_array(ecc, EDMA_EMCR, j, mask); 692 edma_write_array(ecc, EDMA_EMCR, idx, ch_bit);
679 /* Clear any SER */ 693 /* Clear any SER */
680 edma_shadow0_write_array(ecc, SH_SECR, j, mask); 694 edma_shadow0_write_array(ecc, SH_SECR, idx, ch_bit);
681 edma_write(ecc, EDMA_CCERRCLR, BIT(16) | BIT(1) | BIT(0)); 695 edma_write(ecc, EDMA_CCERRCLR, BIT(16) | BIT(1) | BIT(0));
682} 696}
683 697
@@ -707,7 +721,8 @@ static int edma_alloc_channel(struct edma_chan *echan,
707 int channel = EDMA_CHAN_SLOT(echan->ch_num); 721 int channel = EDMA_CHAN_SLOT(echan->ch_num);
708 722
709 /* ensure access through shadow region 0 */ 723 /* ensure access through shadow region 0 */
710 edma_or_array2(ecc, EDMA_DRAE, 0, channel >> 5, BIT(channel & 0x1f)); 724 edma_or_array2(ecc, EDMA_DRAE, 0, EDMA_REG_ARRAY_INDEX(channel),
725 EDMA_CHANNEL_BIT(channel));
711 726
712 /* ensure no events are pending */ 727 /* ensure no events are pending */
713 edma_stop(echan); 728 edma_stop(echan);
@@ -2483,8 +2498,9 @@ static int edma_pm_resume(struct device *dev)
2483 for (i = 0; i < ecc->num_channels; i++) { 2498 for (i = 0; i < ecc->num_channels; i++) {
2484 if (echan[i].alloced) { 2499 if (echan[i].alloced) {
2485 /* ensure access through shadow region 0 */ 2500 /* ensure access through shadow region 0 */
2486 edma_or_array2(ecc, EDMA_DRAE, 0, i >> 5, 2501 edma_or_array2(ecc, EDMA_DRAE, 0,
2487 BIT(i & 0x1f)); 2502 EDMA_REG_ARRAY_INDEX(i),
2503 EDMA_CHANNEL_BIT(i));
2488 2504
2489 edma_setup_interrupt(&echan[i], true); 2505 edma_setup_interrupt(&echan[i], true);
2490 2506