1*6a0abce4SKuninori Morimoto /* SPDX-License-Identifier: GPL-2.0 2*6a0abce4SKuninori Morimoto * 3f15cbe6fSPaul Mundt * include/asm-sh/dma.h 4f15cbe6fSPaul Mundt * 5f15cbe6fSPaul Mundt * Copyright (C) 2003, 2004 Paul Mundt 6f15cbe6fSPaul Mundt */ 7f15cbe6fSPaul Mundt #ifndef __ASM_SH_DMA_H 8f15cbe6fSPaul Mundt #define __ASM_SH_DMA_H 9f15cbe6fSPaul Mundt 10f15cbe6fSPaul Mundt #include <linux/spinlock.h> 11f15cbe6fSPaul Mundt #include <linux/wait.h> 12f15cbe6fSPaul Mundt #include <linux/sched.h> 13dc6876a2SKay Sievers #include <linux/device.h> 149deaa3bcSPaul Mundt #include <asm-generic/dma.h> 15f15cbe6fSPaul Mundt 16f15cbe6fSPaul Mundt /* 17f15cbe6fSPaul Mundt * Read and write modes can mean drastically different things depending on the 18f15cbe6fSPaul Mundt * channel configuration. Consult your DMAC documentation and module 19f15cbe6fSPaul Mundt * implementation for further clues. 20f15cbe6fSPaul Mundt */ 21f15cbe6fSPaul Mundt #define DMA_MODE_READ 0x00 22f15cbe6fSPaul Mundt #define DMA_MODE_WRITE 0x01 23f15cbe6fSPaul Mundt #define DMA_MODE_MASK 0x01 24f15cbe6fSPaul Mundt 25f15cbe6fSPaul Mundt #define DMA_AUTOINIT 0x10 26f15cbe6fSPaul Mundt 27f15cbe6fSPaul Mundt /* 28f15cbe6fSPaul Mundt * DMAC (dma_info) flags 29f15cbe6fSPaul Mundt */ 30f15cbe6fSPaul Mundt enum { 31f15cbe6fSPaul Mundt DMAC_CHANNELS_CONFIGURED = 0x01, 32f15cbe6fSPaul Mundt DMAC_CHANNELS_TEI_CAPABLE = 0x02, /* Transfer end interrupt */ 33f15cbe6fSPaul Mundt }; 34f15cbe6fSPaul Mundt 35f15cbe6fSPaul Mundt /* 36f15cbe6fSPaul Mundt * DMA channel capabilities / flags 37f15cbe6fSPaul Mundt */ 38f15cbe6fSPaul Mundt enum { 39f15cbe6fSPaul Mundt DMA_CONFIGURED = 0x01, 40f15cbe6fSPaul Mundt 41f15cbe6fSPaul Mundt /* 42f15cbe6fSPaul Mundt * Transfer end interrupt, inherited from DMAC. 43f15cbe6fSPaul Mundt * wait_queue used in dma_wait_for_completion. 44f15cbe6fSPaul Mundt */ 45f15cbe6fSPaul Mundt DMA_TEI_CAPABLE = 0x02, 46f15cbe6fSPaul Mundt }; 47f15cbe6fSPaul Mundt 48f15cbe6fSPaul Mundt extern spinlock_t dma_spin_lock; 49f15cbe6fSPaul Mundt 50f15cbe6fSPaul Mundt struct dma_channel; 51f15cbe6fSPaul Mundt 52f15cbe6fSPaul Mundt struct dma_ops { 53f15cbe6fSPaul Mundt int (*request)(struct dma_channel *chan); 54f15cbe6fSPaul Mundt void (*free)(struct dma_channel *chan); 55f15cbe6fSPaul Mundt 56f15cbe6fSPaul Mundt int (*get_residue)(struct dma_channel *chan); 57f15cbe6fSPaul Mundt int (*xfer)(struct dma_channel *chan); 58f15cbe6fSPaul Mundt int (*configure)(struct dma_channel *chan, unsigned long flags); 59f15cbe6fSPaul Mundt int (*extend)(struct dma_channel *chan, unsigned long op, void *param); 60f15cbe6fSPaul Mundt }; 61f15cbe6fSPaul Mundt 62f15cbe6fSPaul Mundt struct dma_channel { 63f15cbe6fSPaul Mundt char dev_id[16]; /* unique name per DMAC of channel */ 64f15cbe6fSPaul Mundt 65f15cbe6fSPaul Mundt unsigned int chan; /* DMAC channel number */ 66f15cbe6fSPaul Mundt unsigned int vchan; /* Virtual channel number */ 67f15cbe6fSPaul Mundt 68f15cbe6fSPaul Mundt unsigned int mode; 69f15cbe6fSPaul Mundt unsigned int count; 70f15cbe6fSPaul Mundt 71f15cbe6fSPaul Mundt unsigned long sar; 72f15cbe6fSPaul Mundt unsigned long dar; 73f15cbe6fSPaul Mundt 74f15cbe6fSPaul Mundt const char **caps; 75f15cbe6fSPaul Mundt 76f15cbe6fSPaul Mundt unsigned long flags; 77f15cbe6fSPaul Mundt atomic_t busy; 78f15cbe6fSPaul Mundt 79f15cbe6fSPaul Mundt wait_queue_head_t wait_queue; 80f15cbe6fSPaul Mundt 81dc6876a2SKay Sievers struct device dev; 82f15cbe6fSPaul Mundt void *priv_data; 83f15cbe6fSPaul Mundt }; 84f15cbe6fSPaul Mundt 85f15cbe6fSPaul Mundt struct dma_info { 86f15cbe6fSPaul Mundt struct platform_device *pdev; 87f15cbe6fSPaul Mundt 88f15cbe6fSPaul Mundt const char *name; 89f15cbe6fSPaul Mundt unsigned int nr_channels; 90f15cbe6fSPaul Mundt unsigned long flags; 91f15cbe6fSPaul Mundt 92f15cbe6fSPaul Mundt struct dma_ops *ops; 93f15cbe6fSPaul Mundt struct dma_channel *channels; 94f15cbe6fSPaul Mundt 95f15cbe6fSPaul Mundt struct list_head list; 96f15cbe6fSPaul Mundt int first_channel_nr; 97f15cbe6fSPaul Mundt int first_vchannel_nr; 98f15cbe6fSPaul Mundt }; 99f15cbe6fSPaul Mundt 100f15cbe6fSPaul Mundt struct dma_chan_caps { 101f15cbe6fSPaul Mundt int ch_num; 102f15cbe6fSPaul Mundt const char **caplist; 103f15cbe6fSPaul Mundt }; 104f15cbe6fSPaul Mundt 105f15cbe6fSPaul Mundt #define to_dma_channel(channel) container_of(channel, struct dma_channel, dev) 106f15cbe6fSPaul Mundt 107f15cbe6fSPaul Mundt /* arch/sh/drivers/dma/dma-api.c */ 108f15cbe6fSPaul Mundt extern int dma_xfer(unsigned int chan, unsigned long from, 109f15cbe6fSPaul Mundt unsigned long to, size_t size, unsigned int mode); 110f15cbe6fSPaul Mundt 111f15cbe6fSPaul Mundt #define dma_write(chan, from, to, size) \ 112f15cbe6fSPaul Mundt dma_xfer(chan, from, to, size, DMA_MODE_WRITE) 113f15cbe6fSPaul Mundt #define dma_write_page(chan, from, to) \ 114f15cbe6fSPaul Mundt dma_write(chan, from, to, PAGE_SIZE) 115f15cbe6fSPaul Mundt 116f15cbe6fSPaul Mundt #define dma_read(chan, from, to, size) \ 117f15cbe6fSPaul Mundt dma_xfer(chan, from, to, size, DMA_MODE_READ) 118f15cbe6fSPaul Mundt #define dma_read_page(chan, from, to) \ 119f15cbe6fSPaul Mundt dma_read(chan, from, to, PAGE_SIZE) 120f15cbe6fSPaul Mundt 121f15cbe6fSPaul Mundt extern int request_dma_bycap(const char **dmac, const char **caps, 122f15cbe6fSPaul Mundt const char *dev_id); 123f15cbe6fSPaul Mundt extern int get_dma_residue(unsigned int chan); 124f15cbe6fSPaul Mundt extern struct dma_info *get_dma_info(unsigned int chan); 125f15cbe6fSPaul Mundt extern struct dma_channel *get_dma_channel(unsigned int chan); 126f15cbe6fSPaul Mundt extern void dma_wait_for_completion(unsigned int chan); 127f15cbe6fSPaul Mundt extern void dma_configure_channel(unsigned int chan, unsigned long flags); 128f15cbe6fSPaul Mundt 129f15cbe6fSPaul Mundt extern int register_dmac(struct dma_info *info); 130f15cbe6fSPaul Mundt extern void unregister_dmac(struct dma_info *info); 131f15cbe6fSPaul Mundt extern struct dma_info *get_dma_info_by_name(const char *dmac_name); 132f15cbe6fSPaul Mundt 133f15cbe6fSPaul Mundt extern int dma_extend(unsigned int chan, unsigned long op, void *param); 134f15cbe6fSPaul Mundt extern int register_chan_caps(const char *dmac, struct dma_chan_caps *capslist); 135f15cbe6fSPaul Mundt 136f15cbe6fSPaul Mundt /* arch/sh/drivers/dma/dma-sysfs.c */ 137f15cbe6fSPaul Mundt extern int dma_create_sysfs_files(struct dma_channel *, struct dma_info *); 138f15cbe6fSPaul Mundt extern void dma_remove_sysfs_files(struct dma_channel *, struct dma_info *); 139f15cbe6fSPaul Mundt 140f15cbe6fSPaul Mundt #endif /* __ASM_SH_DMA_H */ 141