2011-06-06 14:18:03 +09: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 14:19:03 +09:00
# include <linux/interrupt.h>
# include <linux/sh_dma.h>
2012-02-14 11:37:21 +01:00
# include <linux/workqueue.h>
2011-06-06 14:19:03 +09:00
# include <asm/dma.h>
2011-06-06 14:18:07 +09:00
# include "pipe.h"
2011-06-06 14:18:44 +09:00
struct usbhs_fifo {
2011-06-06 14:19:03 +09:00
char * name ;
2011-06-06 14:18:44 +09:00
u32 port ; /* xFIFO */
u32 sel ; /* xFIFOSEL */
u32 ctr ; /* xFIFOCTR */
2011-06-06 14:18:50 +09:00
struct usbhs_pipe * pipe ;
2011-06-06 14:19:03 +09:00
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 14:18:44 +09:00
} ;
2014-11-10 20:02:47 +09:00
# define USBHS_MAX_NUM_DFIFO 4
2011-06-06 14:18:44 +09:00
struct usbhs_fifo_info {
struct usbhs_fifo cfifo ;
2014-11-10 20:02:44 +09:00
struct usbhs_fifo dfifo [ USBHS_MAX_NUM_DFIFO ] ;
2011-06-06 14:18:44 +09:00
} ;
2014-11-10 20:02:45 +09:00
# define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n]))
# define usbhs_for_each_dfifo(priv, dfifo, i) \
for ( ( i ) = 0 , dfifo = usbhsf_get_dnfifo ( priv , ( i ) ) ; \
( ( i ) < USBHS_MAX_NUM_DFIFO ) ; \
( i ) + + , dfifo = usbhsf_get_dnfifo ( priv , ( i ) ) )
2011-06-06 14:18:44 +09:00
2011-06-06 14:18:28 +09:00
struct usbhs_pkt_handle ;
2011-06-06 14:18:07 +09:00
struct usbhs_pkt {
2011-06-06 14:18:16 +09:00
struct list_head node ;
2011-06-06 14:18:07 +09:00
struct usbhs_pipe * pipe ;
2011-06-06 14:18:28 +09:00
struct usbhs_pkt_handle * handler ;
2011-10-10 22:04:41 -07:00
void ( * done ) ( struct usbhs_priv * priv ,
struct usbhs_pkt * pkt ) ;
2012-02-14 11:37:21 +01:00
struct work_struct work ;
2011-06-06 14:19:03 +09:00
dma_addr_t dma ;
2011-06-06 14:18:07 +09:00
void * buf ;
int length ;
2011-06-06 14:19:03 +09:00
int trans ;
2011-06-06 14:18:07 +09:00
int actual ;
2011-06-06 14:18:23 +09:00
int zero ;
2011-12-08 18:28:54 -08:00
int sequence ;
2011-06-06 14:18:07 +09:00
} ;
2011-06-06 14:18:03 +09:00
2011-06-06 14:18:28 +09:00
struct usbhs_pkt_handle {
2011-06-06 14:18:38 +09:00
int ( * prepare ) ( struct usbhs_pkt * pkt , int * is_done ) ;
int ( * try_run ) ( struct usbhs_pkt * pkt , int * is_done ) ;
2011-06-06 14:19:03 +09:00
int ( * dma_done ) ( struct usbhs_pkt * pkt , int * is_done ) ;
2011-06-06 14:18:28 +09:00
} ;
2011-06-06 14:18:03 +09:00
/*
* fifo
*/
2011-06-06 14:18:44 +09:00
int usbhs_fifo_probe ( struct usbhs_priv * priv ) ;
void usbhs_fifo_remove ( struct usbhs_priv * priv ) ;
2011-06-06 14:18:28 +09:00
void usbhs_fifo_init ( struct usbhs_priv * priv ) ;
void usbhs_fifo_quit ( struct usbhs_priv * priv ) ;
2014-11-04 10:05:45 +09:00
void usbhs_fifo_clear_dcp ( struct usbhs_pipe * pipe ) ;
2011-06-06 14:18:03 +09:00
2011-06-06 14:18:07 +09:00
/*
* packet info
*/
2011-06-06 14:18:58 +09:00
extern struct usbhs_pkt_handle usbhs_fifo_pio_push_handler ;
extern struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler ;
2011-06-06 14:18:28 +09:00
extern struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler ;
2011-06-06 14:19:03 +09:00
extern struct usbhs_pkt_handle usbhs_fifo_dma_push_handler ;
extern struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler ;
2011-10-10 22:07:08 -07:00
extern struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler ;
extern struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler ;
extern struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler ;
extern struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler ;
2011-06-06 14:19:03 +09:00
2011-06-06 14:18:16 +09:00
void usbhs_pkt_init ( struct usbhs_pkt * pkt ) ;
2011-06-06 14:18:23 +09:00
void usbhs_pkt_push ( struct usbhs_pipe * pipe , struct usbhs_pkt * pkt ,
2011-10-10 22:04:41 -07:00
void ( * done ) ( struct usbhs_priv * priv ,
struct usbhs_pkt * pkt ) ,
2011-12-08 18:28:54 -08:00
void * buf , int len , int zero , int sequence ) ;
2011-06-06 14:18:38 +09:00
struct usbhs_pkt * usbhs_pkt_pop ( struct usbhs_pipe * pipe , struct usbhs_pkt * pkt ) ;
2011-10-10 21:58:45 -07:00
void usbhs_pkt_start ( struct usbhs_pipe * pipe ) ;
2011-06-06 14:18:28 +09:00
2011-06-06 14:18:03 +09:00
# endif /* RENESAS_USB_FIFO_H */