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>
2012-02-14 14:37:21 +04:00
# include <linux/workqueue.h>
2011-06-06 09:19:03 +04:00
# include <asm/dma.h>
2011-06-06 09:18:07 +04:00
# include "pipe.h"
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 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
} ;
2014-11-10 14:02:47 +03:00
# define USBHS_MAX_NUM_DFIFO 4
2011-06-06 09:18:44 +04:00
struct usbhs_fifo_info {
struct usbhs_fifo cfifo ;
2014-11-10 14:02:44 +03:00
struct usbhs_fifo dfifo [ USBHS_MAX_NUM_DFIFO ] ;
2011-06-06 09:18:44 +04:00
} ;
2014-11-10 14:02:45 +03:00
# define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n]))
2015-04-14 07:10:04 +03:00
# define usbhs_for_each_dfifo(priv, dfifo, i) \
for ( ( i ) = 0 ; \
( ( i ) < USBHS_MAX_NUM_DFIFO ) & & \
( ( dfifo ) = usbhsf_get_dnfifo ( priv , ( i ) ) ) ; \
( i ) + + )
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 ;
2015-12-27 23:50:29 +03:00
const struct usbhs_pkt_handle * handler ;
2011-10-11 09:04:41 +04:00
void ( * done ) ( struct usbhs_priv * priv ,
struct usbhs_pkt * pkt ) ;
2012-02-14 14:37:21 +04:00
struct work_struct work ;
2011-06-06 09:19:03 +04:00
dma_addr_t dma ;
2015-03-12 09:35:20 +03:00
dma_cookie_t cookie ;
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-12-09 06:28:54 +04:00
int sequence ;
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 ) ;
2014-11-04 04:05:45 +03:00
void usbhs_fifo_clear_dcp ( struct usbhs_pipe * pipe ) ;
2011-06-06 09:18:03 +04:00
2011-06-06 09:18:07 +04:00
/*
* packet info
*/
2015-12-27 23:50:29 +03:00
extern const struct usbhs_pkt_handle usbhs_fifo_pio_push_handler ;
extern const struct usbhs_pkt_handle usbhs_fifo_pio_pop_handler ;
extern const struct usbhs_pkt_handle usbhs_ctrl_stage_end_handler ;
2011-06-06 09:18:28 +04:00
2015-12-27 23:50:29 +03:00
extern const struct usbhs_pkt_handle usbhs_fifo_dma_push_handler ;
extern const struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler ;
2011-06-06 09:19:03 +04:00
2015-12-27 23:50:29 +03:00
extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_in_handler ;
extern const struct usbhs_pkt_handle usbhs_dcp_status_stage_out_handler ;
2011-10-11 09:07:08 +04:00
2015-12-27 23:50:29 +03:00
extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_in_handler ;
extern const struct usbhs_pkt_handle usbhs_dcp_data_stage_out_handler ;
2011-06-06 09:19:03 +04:00
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 ,
2011-10-11 09:04:41 +04:00
void ( * done ) ( struct usbhs_priv * priv ,
struct usbhs_pkt * pkt ) ,
2011-12-09 06:28:54 +04:00
void * buf , int len , int zero , int sequence ) ;
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 */