1ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy/* 2ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * Texas Instruments CPDMA Driver 3ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * 4ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * Copyright (C) 2010 Texas Instruments 5ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * 6ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * This program is free software; you can redistribute it and/or 7ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * modify it under the terms of the GNU General Public License as 8ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * published by the Free Software Foundation version 2. 9ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * 10ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * This program is distributed "as is" WITHOUT ANY WARRANTY of any 11ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * kind, whether express or implied; without even the implied warranty 12ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * GNU General Public License for more details. 14ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy */ 15ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#ifndef __DAVINCI_CPDMA_H__ 16ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define __DAVINCI_CPDMA_H__ 17ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 18ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define CPDMA_MAX_CHANNELS BITS_PER_LONG 19ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 20ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define tx_chan_num(chan) (chan) 21ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define rx_chan_num(chan) ((chan) + CPDMA_MAX_CHANNELS) 22ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define is_rx_chan(chan) ((chan)->chan_num >= CPDMA_MAX_CHANNELS) 23ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define is_tx_chan(chan) (!is_rx_chan(chan)) 24ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define __chan_linear(chan_num) ((chan_num) & (CPDMA_MAX_CHANNELS - 1)) 25ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#define chan_linear(chan) __chan_linear((chan)->chan_num) 26ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 27ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_params { 28ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy struct device *dev; 29ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy void __iomem *dmaregs; 30ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy void __iomem *txhdp, *rxhdp, *txcp, *rxcp; 31ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy void __iomem *rxthresh, *rxfree; 32ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy int num_chan; 33ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy bool has_soft_reset; 34ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy int min_packet_size; 35ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 desc_mem_phys; 366a1fef6d000944911df0f160f366111daa10740aSriram u32 desc_hw_addr; 37ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy int desc_mem_size; 38ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy int desc_align; 39ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 40ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy /* 41ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * Some instances of embedded cpdma controllers have extra control and 42ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * status registers. The following flag enables access to these 43ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy * "extended" registers. 44ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy */ 45ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy bool has_ext_regs; 46ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy}; 47ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 48ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_chan_stats { 49ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 head_enqueue; 50ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 tail_enqueue; 51ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 pad_enqueue; 52ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 misqueued; 53ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 desc_alloc_fail; 54ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 pad_alloc_fail; 55ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 runt_receive_buff; 56ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 runt_transmit_buff; 57ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 empty_dequeue; 58ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 busy_dequeue; 59ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 good_dequeue; 60ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 requeue; 61ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy u32 teardown_dequeue; 62ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy}; 63ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 64ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_ctlr; 65ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_chan; 66ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 67ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathytypedef void (*cpdma_handler_fn)(void *token, int len, int status); 68ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 69ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_ctlr *cpdma_ctlr_create(struct cpdma_params *params); 70ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_ctlr_destroy(struct cpdma_ctlr *ctlr); 71ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_ctlr_start(struct cpdma_ctlr *ctlr); 72ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_ctlr_stop(struct cpdma_ctlr *ctlr); 73ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_ctlr_dump(struct cpdma_ctlr *ctlr); 74ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 75ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathystruct cpdma_chan *cpdma_chan_create(struct cpdma_ctlr *ctlr, int chan_num, 76ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy cpdma_handler_fn handler); 77ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_destroy(struct cpdma_chan *chan); 78ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_start(struct cpdma_chan *chan); 79ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_stop(struct cpdma_chan *chan); 80ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_dump(struct cpdma_chan *chan); 81ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 82ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_get_stats(struct cpdma_chan *chan, 83ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy struct cpdma_chan_stats *stats); 84ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data, 85ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy int len, gfp_t gfp_mask); 86ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_process(struct cpdma_chan *chan, int quota); 87ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 88ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable); 89ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyvoid cpdma_ctlr_eoi(struct cpdma_ctlr *ctlr); 90ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_chan_int_ctrl(struct cpdma_chan *chan, bool enable); 91ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 92ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyenum cpdma_control { 93ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_CMD_IDLE, /* write-only */ 94ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_COPY_ERROR_FRAMES, /* read-write */ 95ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_RX_OFF_LEN_UPDATE, /* read-write */ 96ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_RX_OWNERSHIP_FLIP, /* read-write */ 97ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_TX_PRIO_FIXED, /* read-write */ 98ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_STAT_IDLE, /* read-only */ 99ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_STAT_TX_ERR_CHAN, /* read-only */ 100ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_STAT_TX_ERR_CODE, /* read-only */ 101ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_STAT_RX_ERR_CHAN, /* read-only */ 102ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_STAT_RX_ERR_CODE, /* read-only */ 103ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy CPDMA_RX_BUFFER_OFFSET, /* read-write */ 104ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy}; 105ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 106ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_control_get(struct cpdma_ctlr *ctlr, int control); 107ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathyint cpdma_control_set(struct cpdma_ctlr *ctlr, int control, int value); 108ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy 109ef8c2dab01b6e30c4b2ca3ea3b8db33430493589Cyril Chemparathy#endif 110