1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * platform device definitions for the iop3xx dma/xor engines
4*4882a593Smuzhiyun * Copyright © 2006, Intel Corporation.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun #include <linux/platform_device.h>
7*4882a593Smuzhiyun #include <linux/dma-mapping.h>
8*4882a593Smuzhiyun #include <linux/platform_data/dma-iop32x.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "iop3xx.h"
11*4882a593Smuzhiyun #include "irqs.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT
14*4882a593Smuzhiyun #define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC
15*4882a593Smuzhiyun #define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT
18*4882a593Smuzhiyun #define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC
19*4882a593Smuzhiyun #define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #define IRQ_AA_EOT IRQ_IOP32X_AA_EOT
22*4882a593Smuzhiyun #define IRQ_AA_EOC IRQ_IOP32X_AA_EOC
23*4882a593Smuzhiyun #define IRQ_AA_ERR IRQ_IOP32X_AA_ERR
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun /* AAU and DMA Channels */
26*4882a593Smuzhiyun static struct resource iop3xx_dma_0_resources[] = {
27*4882a593Smuzhiyun [0] = {
28*4882a593Smuzhiyun .start = IOP3XX_DMA_PHYS_BASE(0),
29*4882a593Smuzhiyun .end = IOP3XX_DMA_UPPER_PA(0),
30*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
31*4882a593Smuzhiyun },
32*4882a593Smuzhiyun [1] = {
33*4882a593Smuzhiyun .start = IRQ_DMA0_EOT,
34*4882a593Smuzhiyun .end = IRQ_DMA0_EOT,
35*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
36*4882a593Smuzhiyun },
37*4882a593Smuzhiyun [2] = {
38*4882a593Smuzhiyun .start = IRQ_DMA0_EOC,
39*4882a593Smuzhiyun .end = IRQ_DMA0_EOC,
40*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
41*4882a593Smuzhiyun },
42*4882a593Smuzhiyun [3] = {
43*4882a593Smuzhiyun .start = IRQ_DMA0_ERR,
44*4882a593Smuzhiyun .end = IRQ_DMA0_ERR,
45*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun static struct resource iop3xx_dma_1_resources[] = {
50*4882a593Smuzhiyun [0] = {
51*4882a593Smuzhiyun .start = IOP3XX_DMA_PHYS_BASE(1),
52*4882a593Smuzhiyun .end = IOP3XX_DMA_UPPER_PA(1),
53*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
54*4882a593Smuzhiyun },
55*4882a593Smuzhiyun [1] = {
56*4882a593Smuzhiyun .start = IRQ_DMA1_EOT,
57*4882a593Smuzhiyun .end = IRQ_DMA1_EOT,
58*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
59*4882a593Smuzhiyun },
60*4882a593Smuzhiyun [2] = {
61*4882a593Smuzhiyun .start = IRQ_DMA1_EOC,
62*4882a593Smuzhiyun .end = IRQ_DMA1_EOC,
63*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
64*4882a593Smuzhiyun },
65*4882a593Smuzhiyun [3] = {
66*4882a593Smuzhiyun .start = IRQ_DMA1_ERR,
67*4882a593Smuzhiyun .end = IRQ_DMA1_ERR,
68*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun static struct resource iop3xx_aau_resources[] = {
74*4882a593Smuzhiyun [0] = {
75*4882a593Smuzhiyun .start = IOP3XX_AAU_PHYS_BASE,
76*4882a593Smuzhiyun .end = IOP3XX_AAU_UPPER_PA,
77*4882a593Smuzhiyun .flags = IORESOURCE_MEM,
78*4882a593Smuzhiyun },
79*4882a593Smuzhiyun [1] = {
80*4882a593Smuzhiyun .start = IRQ_AA_EOT,
81*4882a593Smuzhiyun .end = IRQ_AA_EOT,
82*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
83*4882a593Smuzhiyun },
84*4882a593Smuzhiyun [2] = {
85*4882a593Smuzhiyun .start = IRQ_AA_EOC,
86*4882a593Smuzhiyun .end = IRQ_AA_EOC,
87*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
88*4882a593Smuzhiyun },
89*4882a593Smuzhiyun [3] = {
90*4882a593Smuzhiyun .start = IRQ_AA_ERR,
91*4882a593Smuzhiyun .end = IRQ_AA_ERR,
92*4882a593Smuzhiyun .flags = IORESOURCE_IRQ
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32);
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static struct iop_adma_platform_data iop3xx_dma_0_data = {
99*4882a593Smuzhiyun .hw_id = DMA0_ID,
100*4882a593Smuzhiyun .pool_size = PAGE_SIZE,
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun static struct iop_adma_platform_data iop3xx_dma_1_data = {
104*4882a593Smuzhiyun .hw_id = DMA1_ID,
105*4882a593Smuzhiyun .pool_size = PAGE_SIZE,
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun static struct iop_adma_platform_data iop3xx_aau_data = {
109*4882a593Smuzhiyun .hw_id = AAU_ID,
110*4882a593Smuzhiyun .pool_size = 3 * PAGE_SIZE,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun struct platform_device iop3xx_dma_0_channel = {
114*4882a593Smuzhiyun .name = "iop-adma",
115*4882a593Smuzhiyun .id = 0,
116*4882a593Smuzhiyun .num_resources = 4,
117*4882a593Smuzhiyun .resource = iop3xx_dma_0_resources,
118*4882a593Smuzhiyun .dev = {
119*4882a593Smuzhiyun .dma_mask = &iop3xx_adma_dmamask,
120*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
121*4882a593Smuzhiyun .platform_data = (void *) &iop3xx_dma_0_data,
122*4882a593Smuzhiyun },
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun struct platform_device iop3xx_dma_1_channel = {
126*4882a593Smuzhiyun .name = "iop-adma",
127*4882a593Smuzhiyun .id = 1,
128*4882a593Smuzhiyun .num_resources = 4,
129*4882a593Smuzhiyun .resource = iop3xx_dma_1_resources,
130*4882a593Smuzhiyun .dev = {
131*4882a593Smuzhiyun .dma_mask = &iop3xx_adma_dmamask,
132*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
133*4882a593Smuzhiyun .platform_data = (void *) &iop3xx_dma_1_data,
134*4882a593Smuzhiyun },
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun struct platform_device iop3xx_aau_channel = {
138*4882a593Smuzhiyun .name = "iop-adma",
139*4882a593Smuzhiyun .id = 2,
140*4882a593Smuzhiyun .num_resources = 4,
141*4882a593Smuzhiyun .resource = iop3xx_aau_resources,
142*4882a593Smuzhiyun .dev = {
143*4882a593Smuzhiyun .dma_mask = &iop3xx_adma_dmamask,
144*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
145*4882a593Smuzhiyun .platform_data = (void *) &iop3xx_aau_data,
146*4882a593Smuzhiyun },
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun
iop3xx_adma_cap_init(void)149*4882a593Smuzhiyun static int __init iop3xx_adma_cap_init(void)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask);
152*4882a593Smuzhiyun dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask);
155*4882a593Smuzhiyun dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask);
158*4882a593Smuzhiyun dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun return 0;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun arch_initcall(iop3xx_adma_cap_init);
164