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