diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2019-07-16 04:26:53 -0400 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2019-07-29 02:41:38 -0400 |
commit | e96b1f64ee2885acb8fb26325eb9743ad6c64696 (patch) | |
tree | 4d94da9ea3d18c7aa01d99737550004bc948c479 | |
parent | 4689d35c765c696bdf0535486a990038b242a26b (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.c | 106 |
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 */ |
136 | struct edmacc_param { | 147 | struct 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) | |||
639 | static void edma_pause(struct edma_chan *echan) | 649 | static 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. */ |
648 | static void edma_resume(struct edma_chan *echan) | 659 | static 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 | ||
656 | static void edma_trigger_channel(struct edma_chan *echan) | 668 | static 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 | ||
668 | static void edma_clean_channel(struct edma_chan *echan) | 681 | static 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 | ||