1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-1.0+ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Renesas USB 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2011 Renesas Solutions Corp. 6*4882a593Smuzhiyun * Copyright (C) 2019 Renesas Electronics Corporation 7*4882a593Smuzhiyun * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 10*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*4882a593Smuzhiyun * GNU General Public License for more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * You should have received a copy of the GNU General Public License 15*4882a593Smuzhiyun * along with this program; if not, write to the Free Software 16*4882a593Smuzhiyun * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun #ifndef RENESAS_USB_H 20*4882a593Smuzhiyun #define RENESAS_USB_H 21*4882a593Smuzhiyun #include <linux/notifier.h> 22*4882a593Smuzhiyun #include <linux/platform_device.h> 23*4882a593Smuzhiyun #include <linux/usb/ch9.h> 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * module type 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * it will be return value from get_id 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun enum { 31*4882a593Smuzhiyun USBHS_HOST = 0, 32*4882a593Smuzhiyun USBHS_GADGET, 33*4882a593Smuzhiyun USBHS_MAX, 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 37*4882a593Smuzhiyun * callback functions for platform 38*4882a593Smuzhiyun * 39*4882a593Smuzhiyun * These functions are called from driver for platform 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun struct renesas_usbhs_platform_callback { 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * option: 45*4882a593Smuzhiyun * 46*4882a593Smuzhiyun * Hardware init function for platform. 47*4882a593Smuzhiyun * it is called when driver was probed. 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun int (*hardware_init)(struct platform_device *pdev); 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* 52*4882a593Smuzhiyun * option: 53*4882a593Smuzhiyun * 54*4882a593Smuzhiyun * Hardware exit function for platform. 55*4882a593Smuzhiyun * it is called when driver was removed 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun int (*hardware_exit)(struct platform_device *pdev); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * option: 61*4882a593Smuzhiyun * 62*4882a593Smuzhiyun * for board specific clock control 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun int (*power_ctrl)(struct platform_device *pdev, 65*4882a593Smuzhiyun void __iomem *base, int enable); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* 68*4882a593Smuzhiyun * option: 69*4882a593Smuzhiyun * 70*4882a593Smuzhiyun * Phy reset for platform 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun int (*phy_reset)(struct platform_device *pdev); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* 75*4882a593Smuzhiyun * get USB ID function 76*4882a593Smuzhiyun * - USBHS_HOST 77*4882a593Smuzhiyun * - USBHS_GADGET 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun int (*get_id)(struct platform_device *pdev); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* 82*4882a593Smuzhiyun * get VBUS status function. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun int (*get_vbus)(struct platform_device *pdev); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * option: 88*4882a593Smuzhiyun * 89*4882a593Smuzhiyun * VBUS control is needed for Host 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun int (*set_vbus)(struct platform_device *pdev, int enable); 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * option: 95*4882a593Smuzhiyun * extcon notifier to set host/peripheral mode. 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun int (*notifier)(struct notifier_block *nb, unsigned long event, 98*4882a593Smuzhiyun void *data); 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* 102*4882a593Smuzhiyun * parameters for renesas usbhs 103*4882a593Smuzhiyun * 104*4882a593Smuzhiyun * some register needs USB chip specific parameters. 105*4882a593Smuzhiyun * This struct show it to driver 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct renesas_usbhs_driver_pipe_config { 109*4882a593Smuzhiyun u8 type; /* USB_ENDPOINT_XFER_xxx */ 110*4882a593Smuzhiyun u16 bufsize; 111*4882a593Smuzhiyun u8 bufnum; 112*4882a593Smuzhiyun bool double_buf; 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun #define RENESAS_USBHS_PIPE(_type, _size, _num, _double_buf) { \ 115*4882a593Smuzhiyun .type = (_type), \ 116*4882a593Smuzhiyun .bufsize = (_size), \ 117*4882a593Smuzhiyun .bufnum = (_num), \ 118*4882a593Smuzhiyun .double_buf = (_double_buf), \ 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun struct renesas_usbhs_driver_param { 122*4882a593Smuzhiyun /* 123*4882a593Smuzhiyun * pipe settings 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun struct renesas_usbhs_driver_pipe_config *pipe_configs; 126*4882a593Smuzhiyun int pipe_size; /* pipe_configs array size */ 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* 129*4882a593Smuzhiyun * option: 130*4882a593Smuzhiyun * 131*4882a593Smuzhiyun * for BUSWAIT :: BWAIT 132*4882a593Smuzhiyun * see 133*4882a593Smuzhiyun * renesas_usbhs/common.c :: usbhsc_set_buswait() 134*4882a593Smuzhiyun * */ 135*4882a593Smuzhiyun int buswait_bwait; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun * option: 139*4882a593Smuzhiyun * 140*4882a593Smuzhiyun * delay time from notify_hotplug callback 141*4882a593Smuzhiyun */ 142*4882a593Smuzhiyun int detection_delay; /* msec */ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* 145*4882a593Smuzhiyun * option: 146*4882a593Smuzhiyun * 147*4882a593Smuzhiyun * dma id for dmaengine 148*4882a593Smuzhiyun * The data transfer direction on D0FIFO/D1FIFO should be 149*4882a593Smuzhiyun * fixed for keeping consistency. 150*4882a593Smuzhiyun * So, the platform id settings will be.. 151*4882a593Smuzhiyun * .d0_tx_id = xx_TX, 152*4882a593Smuzhiyun * .d1_rx_id = xx_RX, 153*4882a593Smuzhiyun * or 154*4882a593Smuzhiyun * .d1_tx_id = xx_TX, 155*4882a593Smuzhiyun * .d0_rx_id = xx_RX, 156*4882a593Smuzhiyun */ 157*4882a593Smuzhiyun int d0_tx_id; 158*4882a593Smuzhiyun int d0_rx_id; 159*4882a593Smuzhiyun int d1_tx_id; 160*4882a593Smuzhiyun int d1_rx_id; 161*4882a593Smuzhiyun int d2_tx_id; 162*4882a593Smuzhiyun int d2_rx_id; 163*4882a593Smuzhiyun int d3_tx_id; 164*4882a593Smuzhiyun int d3_rx_id; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* 167*4882a593Smuzhiyun * option: 168*4882a593Smuzhiyun * 169*4882a593Smuzhiyun * pio <--> dma border. 170*4882a593Smuzhiyun */ 171*4882a593Smuzhiyun int pio_dma_border; /* default is 64byte */ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* 174*4882a593Smuzhiyun * option: 175*4882a593Smuzhiyun */ 176*4882a593Smuzhiyun u32 has_usb_dmac:1; /* for USB-DMAC */ 177*4882a593Smuzhiyun u32 runtime_pwctrl:1; 178*4882a593Smuzhiyun u32 has_cnen:1; 179*4882a593Smuzhiyun u32 cfifo_byte_addr:1; /* CFIFO is byte addressable */ 180*4882a593Smuzhiyun #define USBHS_USB_DMAC_XFER_SIZE 32 /* hardcode the xfer size */ 181*4882a593Smuzhiyun u32 multi_clks:1; 182*4882a593Smuzhiyun u32 has_new_pipe_configs:1; 183*4882a593Smuzhiyun }; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* 186*4882a593Smuzhiyun * option: 187*4882a593Smuzhiyun * 188*4882a593Smuzhiyun * platform information for renesas_usbhs driver. 189*4882a593Smuzhiyun */ 190*4882a593Smuzhiyun struct renesas_usbhs_platform_info { 191*4882a593Smuzhiyun /* 192*4882a593Smuzhiyun * option: 193*4882a593Smuzhiyun * 194*4882a593Smuzhiyun * platform set these functions before 195*4882a593Smuzhiyun * call platform_add_devices if needed 196*4882a593Smuzhiyun */ 197*4882a593Smuzhiyun struct renesas_usbhs_platform_callback platform_callback; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* 200*4882a593Smuzhiyun * option: 201*4882a593Smuzhiyun * 202*4882a593Smuzhiyun * driver use these param for some register 203*4882a593Smuzhiyun */ 204*4882a593Smuzhiyun struct renesas_usbhs_driver_param driver_param; 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /* 208*4882a593Smuzhiyun * macro for platform 209*4882a593Smuzhiyun */ 210*4882a593Smuzhiyun #define renesas_usbhs_get_info(pdev)\ 211*4882a593Smuzhiyun ((struct renesas_usbhs_platform_info *)(pdev)->dev.platform_data) 212*4882a593Smuzhiyun #endif /* RENESAS_USB_H */ 213