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 17struct comedi_device; 18struct comedi_subdevice; 19struct device; 20struct pci_dev; 21 22struct mite_dma_desc { 23 __le32 count; 24 __le32 addr; 25 __le32 next; 26 u32 dar; 27}; 28 29struct 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 36struct mite_channel { 37 struct mite *mite; 38 unsigned int channel; 39 int dir; 40 int done; 41 struct mite_ring *ring; 42}; 43 44struct 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 54u32 mite_bytes_in_transit(struct mite_channel *mite_chan); 55 56void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s); 57void mite_ack_linkc(struct mite_channel *mite_chan, struct comedi_subdevice *s, 58 bool sync); 59int mite_done(struct mite_channel *mite_chan); 60 61void mite_dma_arm(struct mite_channel *mite_chan); 62void mite_dma_disarm(struct mite_channel *mite_chan); 63 64void mite_prep_dma(struct mite_channel *mite_chan, 65 unsigned int num_device_bits, unsigned int num_memory_bits); 66 67struct 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); 71struct mite_channel *mite_request_channel(struct mite *mite, 72 struct mite_ring *ring); 73void mite_release_channel(struct mite_channel *mite_chan); 74 75int mite_init_ring_descriptors(struct mite_ring *ring, 76 struct comedi_subdevice *s, unsigned int nbytes); 77int mite_buf_change(struct mite_ring *ring, struct comedi_subdevice *s); 78 79struct mite_ring *mite_alloc_ring(struct mite *mite); 80void mite_free_ring(struct mite_ring *ring); 81 82struct mite *mite_attach(struct comedi_device *dev, bool use_win1); 83void 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