2011-06-06 09:18:03 +04:00
/*
* Renesas USB driver
*
* Copyright ( C ) 2011 Renesas Solutions Corp .
* Kuninori Morimoto < kuninori . morimoto . gx @ renesas . com >
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*
*/
# ifndef RENESAS_USB_FIFO_H
# define RENESAS_USB_FIFO_H
2011-06-06 09:19:03 +04:00
# include <linux/interrupt.h>
# include <linux/sh_dma.h>
# include <asm/dma.h>
2011-06-06 09:18:07 +04:00
# include "pipe.h"
2011-06-06 09:19:03 +04:00
# define DMA_ADDR_INVALID (~(dma_addr_t)0)
2011-06-06 09:18:44 +04:00
struct usbhs_fifo {
2011-06-06 09:19:03 +04:00
char * name ;
2011-06-06 09:18:44 +04:00
u32 port ; /* xFIFO */
u32 sel ; /* xFIFOSEL */
u32 ctr ; /* xFIFOCTR */
2011-06-06 09:18:50 +04:00
struct usbhs_pipe * pipe ;
2011-06-06 09:19:03 +04:00
struct tasklet_struct tasklet ;
struct dma_chan * tx_chan ;
struct dma_chan * rx_chan ;
struct sh_dmae_slave tx_slave ;
struct sh_dmae_slave rx_slave ;
2011-06-06 09:18:44 +04:00
} ;
struct usbhs_fifo_info {
struct usbhs_fifo cfifo ;
2011-06-06 09:19:03 +04:00
struct usbhs_fifo d0fifo ;
struct usbhs_fifo d1fifo ;
2011-06-06 09:18:44 +04:00
} ;
2011-06-06 09:18:28 +04:00
struct usbhs_pkt_handle ;
2011-06-06 09:18:07 +04:00
struct usbhs_pkt {
2011-06-06 09:18:16 +04:00
struct list_head node ;
2011-06-06 09:18:07 +04:00
struct usbhs_pipe * pipe ;
2011-06-06 09:18:28 +04:00
struct usbhs_pkt_handle * handler ;
2011-06-06 09:19:03 +04:00
dma_addr_t dma ;
2011-06-06 09:18:07 +04:00
void * buf ;
int length ;
2011-06-06 09:19:03 +04:00
int trans ;
2011-06-06 09:18:07 +04:00
int actual ;
2011-06-06 09:18:23 +04:00
int zero ;
2011-06-06 09:18:07 +04:00
} ;
2011-06-06 09:18:03 +04:00
2011-06-06 09:18:28 +04:00
struct usbhs_pkt_handle {
2011-06-06 09:18:38 +04:00
int ( * prepare ) ( struct usbhs_pkt * pkt , int * is_done ) ;
int ( * try_run ) ( struct usbhs_pkt * pkt , int * is_done ) ;
2011-06-06 09:19:03 +04:00
int ( * dma_done ) ( struct usbhs_pkt * pkt , int * is_done ) ;
2011-06-06 09:18:28 +04:00
} ;
2011-06-06 09:18:03 +04:00
/*
* fifo
*/
2011-06-06 09:18:44 +04:00
int usbhs_fifo_probe ( struct usbhs_priv * priv ) ;
void usbhs_fifo_remove ( struct usbhs_priv * priv ) ;
2011-06-06 09:18:28 +04:00
void usbhs_fifo_init ( struct usbhs_priv * priv ) ;
void usbhs_fifo_quit ( struct usbhs_priv * priv ) ;
2011-06-06 09:18:03 +04:00
2011-06-06 09:18:07 +04:00
/*
* packet info
*/
2011-06-06 09:18:58 +04:00
extern struct usbhs_pkt_handle usbhs_fifo_pio_push_handler ;
extern struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler ;
2011-06-06 09:18:28 +04:00
extern struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler ;
2011-06-06 09:19:03 +04:00
extern struct usbhs_pkt_handle usbhs_fifo_dma_push_handler ;
extern struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler ;
2011-06-06 09:18:16 +04:00
void usbhs_pkt_init ( struct usbhs_pkt * pkt ) ;
2011-06-06 09:18:23 +04:00
void usbhs_pkt_push ( struct usbhs_pipe * pipe , struct usbhs_pkt * pkt ,
void * buf , int len , int zero ) ;
2011-06-06 09:18:38 +04:00
struct usbhs_pkt * usbhs_pkt_pop ( struct usbhs_pipe * pipe , struct usbhs_pkt * pkt ) ;
2011-10-11 08:58:45 +04:00
void usbhs_pkt_start ( struct usbhs_pipe * pipe ) ;
2011-06-06 09:18:28 +04:00
2011-06-06 09:18:03 +04:00
# endif /* RENESAS_USB_FIFO_H */