1 /* $NetBSD: dwc2.h,v 1.2 2013/11/01 15:03:39 skrll Exp $ */ 2 3 /*- 4 * Copyright (c) 2013 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Nick Hudson 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _EXTERNAL_BSD_DWC2_DWC2_H_ 33 #define _EXTERNAL_BSD_DWC2_DWC2_H_ 34 35 #include <sys/param.h> 36 #include <sys/kernel.h> 37 38 #include <sys/workqueue.h> 39 #include <sys/callout.h> 40 41 #include <linux/list.h> 42 43 // #define VERBOSE_DEBUG 44 // #define DWC2_DUMP_FRREM 45 // #define CONFIG_USB_DWC2_TRACK_MISSED_SOFS 46 47 typedef int irqreturn_t; 48 #define IRQ_NONE 0 49 #define IRQ_HANDLED 1 50 51 #define u8 uint8_t 52 #define u16 uint16_t 53 #define s16 int16_t 54 #define u32 uint32_t 55 #define u64 uint64_t 56 57 #define dma_addr_t bus_addr_t 58 59 #define DWC2_READ_4(hsotg, reg) \ 60 bus_space_read_4((hsotg)->hsotg_sc->sc_iot, (hsotg)->hsotg_sc->sc_ioh, (reg)) 61 #define DWC2_WRITE_4(hsotg, reg, data) \ 62 bus_space_write_4((hsotg)->hsotg_sc->sc_iot, (hsotg)->hsotg_sc->sc_ioh, (reg), (data)); 63 64 #ifdef DWC2_DEBUG 65 extern int dwc2debug; 66 #define WARN_ON(x) KASSERT(!(x)) 67 68 #define dev_info(d,fmt,...) do { \ 69 printf("%s: " fmt, device_xname(d), \ 70 ## __VA_ARGS__); \ 71 } while (0) 72 #define dev_warn(d,fmt,...) do { \ 73 printf("%s: " fmt, device_xname(d), \ 74 ## __VA_ARGS__); \ 75 } while (0) 76 #define dev_err(d,fmt,...) do { \ 77 printf("%s: " fmt, device_xname(d), \ 78 ## __VA_ARGS__); \ 79 } while (0) 80 #define dev_dbg(d,fmt,...) do { \ 81 if (dwc2debug >= 1) { \ 82 printf("%s: " fmt, device_xname(d), \ 83 ## __VA_ARGS__); \ 84 } \ 85 } while (0) 86 #define dev_vdbg(d,fmt,...) do { \ 87 if (dwc2debug >= 2) { \ 88 printf("%s: " fmt, device_xname(d), \ 89 ## __VA_ARGS__); \ 90 } \ 91 } while (0) 92 #else 93 #define WARN_ON(x) 94 #define dev_info(...) do { } while (0) 95 #define dev_warn(...) do { } while (0) 96 #define dev_err(...) do { } while (0) 97 #define dev_dbg(...) do { } while (0) 98 #define dev_vdbg(...) do { } while (0) 99 #endif 100 101 #define jiffies hardclock_ticks 102 #define msecs_to_jiffies mstohz 103 104 #define gfp_t int 105 #define GFP_KERNEL KM_SLEEP 106 #define GFP_ATOMIC KM_NOSLEEP 107 108 enum usb_otg_state { 109 OTG_STATE_RESERVED = 0, 110 111 OTG_STATE_A_HOST, 112 OTG_STATE_A_PERIPHERAL, 113 OTG_STATE_A_SUSPEND, 114 OTG_STATE_B_HOST, 115 OTG_STATE_B_PERIPHERAL, 116 }; 117 118 #define usleep_range(l, u) do { DELAY(u); } while (0) 119 120 #define spinlock_t kmutex_t 121 #define spin_lock_init(lock) mutex_init(lock, MUTEX_DEFAULT, IPL_VM) 122 #define spin_lock(l) do { mutex_spin_enter(l); } while (0) 123 #define spin_unlock(l) do { mutex_spin_exit(l); } while (0) 124 125 #define spin_lock_irqsave(l, f) \ 126 do { mutex_spin_enter(l); (void)(f); } while (0) 127 128 #define spin_unlock_irqrestore(l, f) \ 129 do { mutex_spin_exit(l); (void)(f); } while (0) 130 131 #define IRQ_RETVAL(r) (r) 132 133 #define USB_ENDPOINT_XFER_CONTROL UE_CONTROL /* 0 */ 134 #define USB_ENDPOINT_XFER_ISOC UE_ISOCHRONOUS /* 1 */ 135 #define USB_ENDPOINT_XFER_BULK UE_BULK /* 2 */ 136 #define USB_ENDPOINT_XFER_INT UE_INTERRUPT /* 3 */ 137 138 #define USB_DIR_IN UE_DIR_IN 139 #define USB_DIR_OUT UE_DIR_OUT 140 141 #define USB_PORT_FEAT_CONNECTION UHF_PORT_CONNECTION 142 #define USB_PORT_FEAT_ENABLE UHF_PORT_ENABLE 143 #define USB_PORT_FEAT_SUSPEND UHF_PORT_SUSPEND 144 #define USB_PORT_FEAT_OVER_CURRENT UHF_PORT_OVER_CURRENT 145 #define USB_PORT_FEAT_RESET UHF_PORT_RESET 146 // #define USB_PORT_FEAT_L1 5 /* L1 suspend */ 147 #define USB_PORT_FEAT_POWER UHF_PORT_POWER 148 #define USB_PORT_FEAT_LOWSPEED UHF_PORT_LOW_SPEED 149 #define USB_PORT_FEAT_C_CONNECTION UHF_C_PORT_CONNECTION 150 #define USB_PORT_FEAT_C_ENABLE UHF_C_PORT_ENABLE 151 #define USB_PORT_FEAT_C_SUSPEND UHF_C_PORT_SUSPEND 152 #define USB_PORT_FEAT_C_OVER_CURRENT UHF_C_PORT_OVER_CURRENT 153 #define USB_PORT_FEAT_C_RESET UHF_C_PORT_RESET 154 #define USB_PORT_FEAT_TEST UHF_PORT_TEST 155 #define USB_PORT_FEAT_INDICATOR UHF_PORT_INDICATOR 156 #define USB_PORT_FEAT_C_PORT_L1 UHF_C_PORT_L1 157 158 #define C_HUB_LOCAL_POWER UHF_C_HUB_LOCAL_POWER 159 #define C_HUB_OVER_CURRENT UHF_C_HUB_OVER_CURRENT 160 161 #define USB_REQ_GET_STATUS UR_GET_STATUS 162 #define USB_REQ_CLEAR_FEATURE UR_CLEAR_FEATURE 163 #define USB_REQ_SET_FEATURE UR_SET_FEATURE 164 #define USB_REQ_GET_DESCRIPTOR UR_GET_DESCRIPTOR 165 166 #define ClearHubFeature ((UT_WRITE_CLASS_DEVICE << 8) | USB_REQ_CLEAR_FEATURE) 167 #define ClearPortFeature ((UT_WRITE_CLASS_OTHER << 8) | USB_REQ_CLEAR_FEATURE) 168 #define GetHubDescriptor ((UT_READ_CLASS_DEVICE << 8) | USB_REQ_GET_DESCRIPTOR) 169 #define GetHubStatus ((UT_READ_CLASS_DEVICE << 8) | USB_REQ_GET_STATUS) 170 #define GetPortStatus ((UT_READ_CLASS_OTHER << 8) | USB_REQ_GET_STATUS) 171 #define SetHubFeature ((UT_WRITE_CLASS_DEVICE << 8) | USB_REQ_SET_FEATURE) 172 #define SetPortFeature ((UT_WRITE_CLASS_OTHER << 8) | USB_REQ_SET_FEATURE) 173 174 #define USB_PORT_STAT_CONNECTION UPS_CURRENT_CONNECT_STATUS 175 #define USB_PORT_STAT_ENABLE UPS_PORT_ENABLED 176 #define USB_PORT_STAT_SUSPEND UPS_SUSPEND 177 #define USB_PORT_STAT_OVERCURRENT UPS_OVERCURRENT_INDICATOR 178 #define USB_PORT_STAT_RESET UPS_RESET 179 #define USB_PORT_STAT_L1 UPS_PORT_L1 180 #define USB_PORT_STAT_POWER UPS_PORT_POWER 181 #define USB_PORT_STAT_LOW_SPEED UPS_LOW_SPEED 182 #define USB_PORT_STAT_HIGH_SPEED UPS_HIGH_SPEED 183 #define USB_PORT_STAT_TEST UPS_PORT_TEST 184 #define USB_PORT_STAT_INDICATOR UPS_PORT_INDICATOR 185 186 #define USB_PORT_STAT_C_CONNECTION UPS_C_CONNECT_STATUS 187 #define USB_PORT_STAT_C_ENABLE UPS_C_PORT_ENABLED 188 #define USB_PORT_STAT_C_SUSPEND UPS_C_SUSPEND 189 #define USB_PORT_STAT_C_OVERCURRENT UPS_C_OVERCURRENT_INDICATOR 190 #define USB_PORT_STAT_C_RESET UPS_C_PORT_RESET 191 #define USB_PORT_STAT_C_L1 UPS_C_PORT_L1 192 193 static inline void 194 udelay(unsigned long usecs) 195 { 196 DELAY(usecs); 197 } 198 199 #define EREMOTEIO EIO 200 #define ECOMM EIO 201 202 #define NS_TO_US(ns) ((ns + 500L) / 1000L) 203 204 void dw_callout(void *); 205 void dwc2_worker(struct work *, void *); 206 207 struct delayed_work { 208 struct work work; 209 struct callout dw_timer; 210 211 struct workqueue *dw_wq; 212 }; 213 214 static inline void 215 INIT_DELAYED_WORK(struct delayed_work *dw, void (*fn)(struct work *)) 216 { 217 callout_init(&dw->dw_timer, CALLOUT_MPSAFE); 218 } 219 220 static inline void 221 queue_delayed_work(struct workqueue *wq, struct delayed_work *dw, int j) 222 { 223 callout_reset(&dw->dw_timer, j, dw_callout, dw); 224 } 225 226 #endif 227