1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* |
3 | * module/mite.h |
4 | * Hardware driver for NI Mite PCI interface chip |
5 | * |
6 | * COMEDI - Linux Control and Measurement Device Interface |
7 | * Copyright (C) 1999 David A. Schleef <ds@schleef.org> |
8 | */ |
9 | |
10 | #ifndef _MITE_H_ |
11 | #define _MITE_H_ |
12 | |
13 | #include <linux/spinlock.h> |
14 | |
15 | #define MAX_MITE_DMA_CHANNELS 8 |
16 | |
17 | struct comedi_device; |
18 | struct comedi_subdevice; |
19 | struct device; |
20 | struct pci_dev; |
21 | |
22 | struct mite_dma_desc { |
23 | __le32 count; |
24 | __le32 addr; |
25 | __le32 next; |
26 | u32 dar; |
27 | }; |
28 | |
29 | struct mite_ring { |
30 | struct device *hw_dev; |
31 | unsigned int n_links; |
32 | struct mite_dma_desc *descs; |
33 | dma_addr_t dma_addr; |
34 | }; |
35 | |
36 | struct mite_channel { |
37 | struct mite *mite; |
38 | unsigned int channel; |
39 | int dir; |
40 | int done; |
41 | struct mite_ring *ring; |
42 | }; |
43 | |
44 | struct mite { |
45 | struct pci_dev *pcidev; |
46 | void __iomem *mmio; |
47 | struct mite_channel channels[MAX_MITE_DMA_CHANNELS]; |
48 | int num_channels; |
49 | unsigned int fifo_size; |
50 | /* protects mite_channel from being released by the driver */ |
51 | spinlock_t lock; |
52 | }; |
53 | |
54 | u32 mite_bytes_in_transit(struct mite_channel *mite_chan); |
55 | |
56 | void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s); |
57 | void mite_ack_linkc(struct mite_channel *mite_chan, struct comedi_subdevice *s, |
58 | bool sync); |
59 | int mite_done(struct mite_channel *mite_chan); |
60 | |
61 | void mite_dma_arm(struct mite_channel *mite_chan); |
62 | void mite_dma_disarm(struct mite_channel *mite_chan); |
63 | |
64 | void mite_prep_dma(struct mite_channel *mite_chan, |
65 | unsigned int num_device_bits, unsigned int num_memory_bits); |
66 | |
67 | struct mite_channel *mite_request_channel_in_range(struct mite *mite, |
68 | struct mite_ring *ring, |
69 | unsigned int min_channel, |
70 | unsigned int max_channel); |
71 | struct mite_channel *mite_request_channel(struct mite *mite, |
72 | struct mite_ring *ring); |
73 | void mite_release_channel(struct mite_channel *mite_chan); |
74 | |
75 | int mite_init_ring_descriptors(struct mite_ring *ring, |
76 | struct comedi_subdevice *s, unsigned int nbytes); |
77 | int mite_buf_change(struct mite_ring *ring, struct comedi_subdevice *s); |
78 | |
79 | struct mite_ring *mite_alloc_ring(struct mite *mite); |
80 | void mite_free_ring(struct mite_ring *ring); |
81 | |
82 | struct mite *mite_attach(struct comedi_device *dev, bool use_win1); |
83 | void mite_detach(struct mite *mite); |
84 | |
85 | /* |
86 | * Mite registers (used outside of the mite driver) |
87 | */ |
88 | #define MITE_IODWBSR 0xc0 /* IO Device Window Base Size */ |
89 | #define MITE_IODWBSR_1 0xc4 /* IO Device Window1 Base Size */ |
90 | #define WENAB BIT(7) /* window enable */ |
91 | #define MITE_IODWCR_1 0xf4 |
92 | |
93 | #endif |
94 | |