tegra124: clean-ups for DMA driver
This addresses comments made in the first round of code reviews for the DMA driver. BUG=none BRANCH=none TEST=built and booted on nyan Change-Id: I4254b7ce9d6559b6507c074f2493f15179f8f15d Reviewed-on: https://chromium-review.googlesource.com/173598 Reviewed-by: Julius Werner <jwerner@chromium.org> Tested-by: David Hendricks <dhendrix@chromium.org> Reviewed-by: David Hendricks <dhendrix@chromium.org> Commit-Queue: David James <davidjames@chromium.org>
This commit is contained in:
parent
97e61f36ad
commit
750c0a5d69
1 changed files with 44 additions and 86 deletions
|
|
@ -26,41 +26,6 @@
|
|||
|
||||
#include "dma.h"
|
||||
|
||||
enum {
|
||||
APB_DMA_CH0 = TEGRA_APB_DMA_BASE + 0x1000,
|
||||
APB_DMA_CH1 = TEGRA_APB_DMA_BASE + 0x1040,
|
||||
APB_DMA_CH2 = TEGRA_APB_DMA_BASE + 0x1080,
|
||||
APB_DMA_CH3 = TEGRA_APB_DMA_BASE + 0x10c0,
|
||||
APB_DMA_CH4 = TEGRA_APB_DMA_BASE + 0x1100,
|
||||
APB_DMA_CH5 = TEGRA_APB_DMA_BASE + 0x1140,
|
||||
APB_DMA_CH6 = TEGRA_APB_DMA_BASE + 0x1180,
|
||||
APB_DMA_CH7 = TEGRA_APB_DMA_BASE + 0x11c0,
|
||||
APB_DMA_CH8 = TEGRA_APB_DMA_BASE + 0x1200,
|
||||
APB_DMA_CH9 = TEGRA_APB_DMA_BASE + 0x1240,
|
||||
APB_DMA_CH10 = TEGRA_APB_DMA_BASE + 0x1280,
|
||||
APB_DMA_CH11 = TEGRA_APB_DMA_BASE + 0x12c0,
|
||||
APB_DMA_CH12 = TEGRA_APB_DMA_BASE + 0x1300,
|
||||
APB_DMA_CH13 = TEGRA_APB_DMA_BASE + 0x1340,
|
||||
APB_DMA_CH14 = TEGRA_APB_DMA_BASE + 0x1380,
|
||||
APB_DMA_CH15 = TEGRA_APB_DMA_BASE + 0x13c0,
|
||||
APB_DMA_CH16 = TEGRA_APB_DMA_BASE + 0x1400,
|
||||
APB_DMA_CH17 = TEGRA_APB_DMA_BASE + 0x1440,
|
||||
APB_DMA_CH18 = TEGRA_APB_DMA_BASE + 0x1480,
|
||||
APB_DMA_CH19 = TEGRA_APB_DMA_BASE + 0x14c0,
|
||||
APB_DMA_CH20 = TEGRA_APB_DMA_BASE + 0x1500,
|
||||
APB_DMA_CH21 = TEGRA_APB_DMA_BASE + 0x1540,
|
||||
APB_DMA_CH22 = TEGRA_APB_DMA_BASE + 0x1580,
|
||||
APB_DMA_CH23 = TEGRA_APB_DMA_BASE + 0x15c0,
|
||||
APB_DMA_CH24 = TEGRA_APB_DMA_BASE + 0x1600,
|
||||
APB_DMA_CH25 = TEGRA_APB_DMA_BASE + 0x1640,
|
||||
APB_DMA_CH26 = TEGRA_APB_DMA_BASE + 0x1680,
|
||||
APB_DMA_CH27 = TEGRA_APB_DMA_BASE + 0x16c0,
|
||||
APB_DMA_CH28 = TEGRA_APB_DMA_BASE + 0x1700,
|
||||
APB_DMA_CH29 = TEGRA_APB_DMA_BASE + 0x1740,
|
||||
APB_DMA_CH30 = TEGRA_APB_DMA_BASE + 0x1780,
|
||||
APB_DMA_CH31 = TEGRA_APB_DMA_BASE + 0x17c0,
|
||||
};
|
||||
|
||||
/*
|
||||
* Note: Many APB DMA controller registers are laid out such that each
|
||||
* bit controls or represents the status for the corresponding channel.
|
||||
|
|
@ -74,7 +39,7 @@ enum {
|
|||
struct apb_dma {
|
||||
u32 command; /* 0x00 */
|
||||
u32 status; /* 0x04 */
|
||||
u8 rsvd1[0x8];
|
||||
u32 rsvd1[2];
|
||||
u32 cntrl_reg; /* 0x10 */
|
||||
u32 irq_sta_cpu; /* 0x14 */
|
||||
u32 irq_sta_cop; /* 0x18 */
|
||||
|
|
@ -87,7 +52,7 @@ struct apb_dma {
|
|||
u32 channel_en_reg; /* 0x34 */
|
||||
u32 security_reg; /* 0x38 */
|
||||
u32 channel_swid; /* 0x3c */
|
||||
u8 rsvd[4];
|
||||
u32 rsvd[1];
|
||||
u32 chan_wt_reg0; /* 0x44 */
|
||||
u32 chan_wt_reg1; /* 0x48 */
|
||||
u32 chan_wt_reg2; /* 0x4c */
|
||||
|
|
@ -97,8 +62,8 @@ struct apb_dma {
|
|||
struct apb_dma * const apb_dma = (struct apb_dma *)TEGRA_APB_DMA_BASE;
|
||||
|
||||
/*
|
||||
* FIXME: Naming in the doc included a superfluous _CHANNEL_n_ for
|
||||
* each entry which I left out for the sake of conciseness.
|
||||
* Naming in the doc included a superfluous _CHANNEL_n_ for
|
||||
* each entry and was left out for the sake of conciseness.
|
||||
*/
|
||||
#define APBDMACHAN_CSR_ENB (1 << 31)
|
||||
#define APBDMACHAN_CSR_IE_EOC (1 << 30)
|
||||
|
|
@ -150,45 +115,41 @@ struct apb_dma * const apb_dma = (struct apb_dma *)TEGRA_APB_DMA_BASE;
|
|||
#define APBDMACHAN_WORD_TRANSFER_MASK 0x0fffffff
|
||||
#define APBDMACHAN_WORD_TRANSFER_SHIFT 2
|
||||
|
||||
#define NUM_APB_DMA_CHANNELS 32
|
||||
#define APB_DMA_CHANNEL(n) \
|
||||
{ \
|
||||
.num = n, \
|
||||
.regs = (struct apb_dma_channel_regs *)APB_DMA_CH##n, \
|
||||
}
|
||||
struct apb_dma_channel apb_dma_channels[NUM_APB_DMA_CHANNELS] = {
|
||||
APB_DMA_CHANNEL(0),
|
||||
APB_DMA_CHANNEL(1),
|
||||
APB_DMA_CHANNEL(2),
|
||||
APB_DMA_CHANNEL(3),
|
||||
APB_DMA_CHANNEL(4),
|
||||
APB_DMA_CHANNEL(5),
|
||||
APB_DMA_CHANNEL(6),
|
||||
APB_DMA_CHANNEL(7),
|
||||
APB_DMA_CHANNEL(8),
|
||||
APB_DMA_CHANNEL(9),
|
||||
APB_DMA_CHANNEL(10),
|
||||
APB_DMA_CHANNEL(11),
|
||||
APB_DMA_CHANNEL(12),
|
||||
APB_DMA_CHANNEL(13),
|
||||
APB_DMA_CHANNEL(14),
|
||||
APB_DMA_CHANNEL(15),
|
||||
APB_DMA_CHANNEL(16),
|
||||
APB_DMA_CHANNEL(17),
|
||||
APB_DMA_CHANNEL(18),
|
||||
APB_DMA_CHANNEL(19),
|
||||
APB_DMA_CHANNEL(20),
|
||||
APB_DMA_CHANNEL(21),
|
||||
APB_DMA_CHANNEL(22),
|
||||
APB_DMA_CHANNEL(23),
|
||||
APB_DMA_CHANNEL(24),
|
||||
APB_DMA_CHANNEL(25),
|
||||
APB_DMA_CHANNEL(26),
|
||||
APB_DMA_CHANNEL(27),
|
||||
APB_DMA_CHANNEL(28),
|
||||
APB_DMA_CHANNEL(29),
|
||||
APB_DMA_CHANNEL(30),
|
||||
APB_DMA_CHANNEL(31),
|
||||
#define APB_DMA_OFFSET(n) \
|
||||
(struct apb_dma_channel_regs *)(TEGRA_APB_DMA_BASE + n)
|
||||
struct apb_dma_channel apb_dma_channels[] = {
|
||||
{ .num = 0, .regs = APB_DMA_OFFSET(0x1000) },
|
||||
{ .num = 1, .regs = APB_DMA_OFFSET(0x1040) },
|
||||
{ .num = 2, .regs = APB_DMA_OFFSET(0x1080) },
|
||||
{ .num = 3, .regs = APB_DMA_OFFSET(0x10c0) },
|
||||
{ .num = 4, .regs = APB_DMA_OFFSET(0x1100) },
|
||||
{ .num = 5, .regs = APB_DMA_OFFSET(0x1140) },
|
||||
{ .num = 6, .regs = APB_DMA_OFFSET(0x1180) },
|
||||
{ .num = 7, .regs = APB_DMA_OFFSET(0x11c0) },
|
||||
{ .num = 8, .regs = APB_DMA_OFFSET(0x1200) },
|
||||
{ .num = 9, .regs = APB_DMA_OFFSET(0x1240) },
|
||||
{ .num = 10, .regs = APB_DMA_OFFSET(0x1280) },
|
||||
{ .num = 11, .regs = APB_DMA_OFFSET(0x12c0) },
|
||||
{ .num = 12, .regs = APB_DMA_OFFSET(0x1300) },
|
||||
{ .num = 13, .regs = APB_DMA_OFFSET(0x1340) },
|
||||
{ .num = 14, .regs = APB_DMA_OFFSET(0x1380) },
|
||||
{ .num = 15, .regs = APB_DMA_OFFSET(0x13c0) },
|
||||
{ .num = 16, .regs = APB_DMA_OFFSET(0x1400) },
|
||||
{ .num = 17, .regs = APB_DMA_OFFSET(0x1440) },
|
||||
{ .num = 18, .regs = APB_DMA_OFFSET(0x1480) },
|
||||
{ .num = 19, .regs = APB_DMA_OFFSET(0x14c0) },
|
||||
{ .num = 20, .regs = APB_DMA_OFFSET(0x1500) },
|
||||
{ .num = 21, .regs = APB_DMA_OFFSET(0x1540) },
|
||||
{ .num = 22, .regs = APB_DMA_OFFSET(0x1580) },
|
||||
{ .num = 23, .regs = APB_DMA_OFFSET(0x15c0) },
|
||||
{ .num = 24, .regs = APB_DMA_OFFSET(0x1600) },
|
||||
{ .num = 25, .regs = APB_DMA_OFFSET(0x1640) },
|
||||
{ .num = 26, .regs = APB_DMA_OFFSET(0x1680) },
|
||||
{ .num = 27, .regs = APB_DMA_OFFSET(0x16c0) },
|
||||
{ .num = 28, .regs = APB_DMA_OFFSET(0x1700) },
|
||||
{ .num = 29, .regs = APB_DMA_OFFSET(0x1740) },
|
||||
{ .num = 30, .regs = APB_DMA_OFFSET(0x1780) },
|
||||
{ .num = 31, .regs = APB_DMA_OFFSET(0x17c0) },
|
||||
};
|
||||
|
||||
int dma_busy(struct apb_dma_channel * const channel)
|
||||
|
|
@ -227,7 +188,7 @@ struct apb_dma_channel * const dma_claim(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (i == NUM_APB_DMA_CHANNELS)
|
||||
if (i == ARRAY_SIZE(apb_dma_channels))
|
||||
return NULL;
|
||||
|
||||
apb_dma_channels[i].in_use = 1;
|
||||
|
|
@ -238,8 +199,8 @@ struct apb_dma_channel * const dma_claim(void)
|
|||
void dma_release(struct apb_dma_channel * const channel)
|
||||
{
|
||||
int i;
|
||||
int dma_in_use = 0;
|
||||
|
||||
/* FIXME: make this "thread" friendly */
|
||||
while (dma_busy(channel))
|
||||
;
|
||||
|
||||
|
|
@ -247,14 +208,11 @@ void dma_release(struct apb_dma_channel * const channel)
|
|||
|
||||
/* clear the global enable bit if no channels are in use */
|
||||
for (i = 0; i < ARRAY_SIZE(apb_dma_channels); i++) {
|
||||
if (apb_dma_channels[i].in_use) {
|
||||
dma_in_use = 1;
|
||||
break;
|
||||
}
|
||||
if (apb_dma_channels[i].in_use)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!dma_in_use)
|
||||
clrbits_le32(&apb_dma->command, APBDMA_COMMAND_GEN);
|
||||
clrbits_le32(&apb_dma->command, APBDMA_COMMAND_GEN);
|
||||
}
|
||||
|
||||
int dma_start(struct apb_dma_channel * const channel)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue