diff options
Diffstat (limited to 'drivers/dma/intel_mid_dma_regs.h')
-rw-r--r-- | drivers/dma/intel_mid_dma_regs.h | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/drivers/dma/intel_mid_dma_regs.h b/drivers/dma/intel_mid_dma_regs.h index d81aa658ab09..709fecbdde79 100644 --- a/drivers/dma/intel_mid_dma_regs.h +++ b/drivers/dma/intel_mid_dma_regs.h | |||
@@ -29,11 +29,12 @@ | |||
29 | #include <linux/dmapool.h> | 29 | #include <linux/dmapool.h> |
30 | #include <linux/pci_ids.h> | 30 | #include <linux/pci_ids.h> |
31 | 31 | ||
32 | #define INTEL_MID_DMA_DRIVER_VERSION "1.0.5" | 32 | #define INTEL_MID_DMA_DRIVER_VERSION "1.1.0" |
33 | 33 | ||
34 | #define REG_BIT0 0x00000001 | 34 | #define REG_BIT0 0x00000001 |
35 | #define REG_BIT8 0x00000100 | 35 | #define REG_BIT8 0x00000100 |
36 | 36 | #define INT_MASK_WE 0x8 | |
37 | #define CLEAR_DONE 0xFFFFEFFF | ||
37 | #define UNMASK_INTR_REG(chan_num) \ | 38 | #define UNMASK_INTR_REG(chan_num) \ |
38 | ((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num)) | 39 | ((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num)) |
39 | #define MASK_INTR_REG(chan_num) (REG_BIT8 << chan_num) | 40 | #define MASK_INTR_REG(chan_num) (REG_BIT8 << chan_num) |
@@ -41,6 +42,9 @@ | |||
41 | #define ENABLE_CHANNEL(chan_num) \ | 42 | #define ENABLE_CHANNEL(chan_num) \ |
42 | ((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num)) | 43 | ((REG_BIT0 << chan_num) | (REG_BIT8 << chan_num)) |
43 | 44 | ||
45 | #define DISABLE_CHANNEL(chan_num) \ | ||
46 | (REG_BIT8 << chan_num) | ||
47 | |||
44 | #define DESCS_PER_CHANNEL 16 | 48 | #define DESCS_PER_CHANNEL 16 |
45 | /*DMA Registers*/ | 49 | /*DMA Registers*/ |
46 | /*registers associated with channel programming*/ | 50 | /*registers associated with channel programming*/ |
@@ -50,6 +54,7 @@ | |||
50 | /*CH X REG = (DMA_CH_SIZE)*CH_NO + REG*/ | 54 | /*CH X REG = (DMA_CH_SIZE)*CH_NO + REG*/ |
51 | #define SAR 0x00 /* Source Address Register*/ | 55 | #define SAR 0x00 /* Source Address Register*/ |
52 | #define DAR 0x08 /* Destination Address Register*/ | 56 | #define DAR 0x08 /* Destination Address Register*/ |
57 | #define LLP 0x10 /* Linked List Pointer Register*/ | ||
53 | #define CTL_LOW 0x18 /* Control Register*/ | 58 | #define CTL_LOW 0x18 /* Control Register*/ |
54 | #define CTL_HIGH 0x1C /* Control Register*/ | 59 | #define CTL_HIGH 0x1C /* Control Register*/ |
55 | #define CFG_LOW 0x40 /* Configuration Register Low*/ | 60 | #define CFG_LOW 0x40 /* Configuration Register Low*/ |
@@ -112,8 +117,8 @@ union intel_mid_dma_ctl_lo { | |||
112 | union intel_mid_dma_ctl_hi { | 117 | union intel_mid_dma_ctl_hi { |
113 | struct { | 118 | struct { |
114 | u32 block_ts:12; /*block transfer size*/ | 119 | u32 block_ts:12; /*block transfer size*/ |
115 | /*configured by DMAC*/ | 120 | u32 done:1; /*Done - updated by DMAC*/ |
116 | u32 reser:20; | 121 | u32 reser:19; /*configured by DMAC*/ |
117 | } ctlx; | 122 | } ctlx; |
118 | u32 ctl_hi; | 123 | u32 ctl_hi; |
119 | 124 | ||
@@ -152,6 +157,7 @@ union intel_mid_dma_cfg_hi { | |||
152 | u32 cfg_hi; | 157 | u32 cfg_hi; |
153 | }; | 158 | }; |
154 | 159 | ||
160 | |||
155 | /** | 161 | /** |
156 | * struct intel_mid_dma_chan - internal mid representation of a DMA channel | 162 | * struct intel_mid_dma_chan - internal mid representation of a DMA channel |
157 | * @chan: dma_chan strcture represetation for mid chan | 163 | * @chan: dma_chan strcture represetation for mid chan |
@@ -166,7 +172,10 @@ union intel_mid_dma_cfg_hi { | |||
166 | * @slave: dma slave struture | 172 | * @slave: dma slave struture |
167 | * @descs_allocated: total number of decsiptors allocated | 173 | * @descs_allocated: total number of decsiptors allocated |
168 | * @dma: dma device struture pointer | 174 | * @dma: dma device struture pointer |
175 | * @busy: bool representing if ch is busy (active txn) or not | ||
169 | * @in_use: bool representing if ch is in use or not | 176 | * @in_use: bool representing if ch is in use or not |
177 | * @raw_tfr: raw trf interrupt recieved | ||
178 | * @raw_block: raw block interrupt recieved | ||
170 | */ | 179 | */ |
171 | struct intel_mid_dma_chan { | 180 | struct intel_mid_dma_chan { |
172 | struct dma_chan chan; | 181 | struct dma_chan chan; |
@@ -178,10 +187,13 @@ struct intel_mid_dma_chan { | |||
178 | struct list_head active_list; | 187 | struct list_head active_list; |
179 | struct list_head queue; | 188 | struct list_head queue; |
180 | struct list_head free_list; | 189 | struct list_head free_list; |
181 | struct intel_mid_dma_slave *slave; | ||
182 | unsigned int descs_allocated; | 190 | unsigned int descs_allocated; |
183 | struct middma_device *dma; | 191 | struct middma_device *dma; |
192 | bool busy; | ||
184 | bool in_use; | 193 | bool in_use; |
194 | u32 raw_tfr; | ||
195 | u32 raw_block; | ||
196 | struct intel_mid_dma_slave *mid_slave; | ||
185 | }; | 197 | }; |
186 | 198 | ||
187 | static inline struct intel_mid_dma_chan *to_intel_mid_dma_chan( | 199 | static inline struct intel_mid_dma_chan *to_intel_mid_dma_chan( |
@@ -190,6 +202,10 @@ static inline struct intel_mid_dma_chan *to_intel_mid_dma_chan( | |||
190 | return container_of(chan, struct intel_mid_dma_chan, chan); | 202 | return container_of(chan, struct intel_mid_dma_chan, chan); |
191 | } | 203 | } |
192 | 204 | ||
205 | enum intel_mid_dma_state { | ||
206 | RUNNING = 0, | ||
207 | SUSPENDED, | ||
208 | }; | ||
193 | /** | 209 | /** |
194 | * struct middma_device - internal representation of a DMA device | 210 | * struct middma_device - internal representation of a DMA device |
195 | * @pdev: PCI device | 211 | * @pdev: PCI device |
@@ -205,6 +221,7 @@ static inline struct intel_mid_dma_chan *to_intel_mid_dma_chan( | |||
205 | * @max_chan: max number of chs supported (from drv_data) | 221 | * @max_chan: max number of chs supported (from drv_data) |
206 | * @block_size: Block size of DMA transfer supported (from drv_data) | 222 | * @block_size: Block size of DMA transfer supported (from drv_data) |
207 | * @pimr_mask: MMIO register addr for periphral interrupt (from drv_data) | 223 | * @pimr_mask: MMIO register addr for periphral interrupt (from drv_data) |
224 | * @state: dma PM device state | ||
208 | */ | 225 | */ |
209 | struct middma_device { | 226 | struct middma_device { |
210 | struct pci_dev *pdev; | 227 | struct pci_dev *pdev; |
@@ -220,6 +237,7 @@ struct middma_device { | |||
220 | int max_chan; | 237 | int max_chan; |
221 | int block_size; | 238 | int block_size; |
222 | unsigned int pimr_mask; | 239 | unsigned int pimr_mask; |
240 | enum intel_mid_dma_state state; | ||
223 | }; | 241 | }; |
224 | 242 | ||
225 | static inline struct middma_device *to_middma_device(struct dma_device *common) | 243 | static inline struct middma_device *to_middma_device(struct dma_device *common) |
@@ -238,14 +256,27 @@ struct intel_mid_dma_desc { | |||
238 | u32 cfg_lo; | 256 | u32 cfg_lo; |
239 | u32 ctl_lo; | 257 | u32 ctl_lo; |
240 | u32 ctl_hi; | 258 | u32 ctl_hi; |
259 | struct pci_pool *lli_pool; | ||
260 | struct intel_mid_dma_lli *lli; | ||
261 | dma_addr_t lli_phys; | ||
262 | unsigned int lli_length; | ||
263 | unsigned int current_lli; | ||
241 | dma_addr_t next; | 264 | dma_addr_t next; |
242 | enum dma_data_direction dirn; | 265 | enum dma_data_direction dirn; |
243 | enum dma_status status; | 266 | enum dma_status status; |
244 | enum intel_mid_dma_width width; /*width of DMA txn*/ | 267 | enum dma_slave_buswidth width; /*width of DMA txn*/ |
245 | enum intel_mid_dma_mode cfg_mode; /*mode configuration*/ | 268 | enum intel_mid_dma_mode cfg_mode; /*mode configuration*/ |
246 | 269 | ||
247 | }; | 270 | }; |
248 | 271 | ||
272 | struct intel_mid_dma_lli { | ||
273 | dma_addr_t sar; | ||
274 | dma_addr_t dar; | ||
275 | dma_addr_t llp; | ||
276 | u32 ctl_lo; | ||
277 | u32 ctl_hi; | ||
278 | } __attribute__ ((packed)); | ||
279 | |||
249 | static inline int test_ch_en(void __iomem *dma, u32 ch_no) | 280 | static inline int test_ch_en(void __iomem *dma, u32 ch_no) |
250 | { | 281 | { |
251 | u32 en_reg = ioread32(dma + DMA_CHAN_EN); | 282 | u32 en_reg = ioread32(dma + DMA_CHAN_EN); |
@@ -257,4 +288,14 @@ static inline struct intel_mid_dma_desc *to_intel_mid_dma_desc | |||
257 | { | 288 | { |
258 | return container_of(txd, struct intel_mid_dma_desc, txd); | 289 | return container_of(txd, struct intel_mid_dma_desc, txd); |
259 | } | 290 | } |
291 | |||
292 | static inline struct intel_mid_dma_slave *to_intel_mid_dma_slave | ||
293 | (struct dma_slave_config *slave) | ||
294 | { | ||
295 | return container_of(slave, struct intel_mid_dma_slave, dma_slave); | ||
296 | } | ||
297 | |||
298 | |||
299 | int dma_resume(struct pci_dev *pci); | ||
300 | |||
260 | #endif /*__INTEL_MID_DMAC_REGS_H__*/ | 301 | #endif /*__INTEL_MID_DMAC_REGS_H__*/ |