at v4.11-rc5 371 lines 12 kB view raw
1#ifndef _LINUX_RESET_H_ 2#define _LINUX_RESET_H_ 3 4#include <linux/device.h> 5 6struct reset_control; 7 8#ifdef CONFIG_RESET_CONTROLLER 9 10int reset_control_reset(struct reset_control *rstc); 11int reset_control_assert(struct reset_control *rstc); 12int reset_control_deassert(struct reset_control *rstc); 13int reset_control_status(struct reset_control *rstc); 14 15struct reset_control *__of_reset_control_get(struct device_node *node, 16 const char *id, int index, bool shared, 17 bool optional); 18void reset_control_put(struct reset_control *rstc); 19struct reset_control *__devm_reset_control_get(struct device *dev, 20 const char *id, int index, bool shared, 21 bool optional); 22 23int __must_check device_reset(struct device *dev); 24 25static inline int device_reset_optional(struct device *dev) 26{ 27 return device_reset(dev); 28} 29 30#else 31 32static inline int reset_control_reset(struct reset_control *rstc) 33{ 34 return 0; 35} 36 37static inline int reset_control_assert(struct reset_control *rstc) 38{ 39 return 0; 40} 41 42static inline int reset_control_deassert(struct reset_control *rstc) 43{ 44 return 0; 45} 46 47static inline int reset_control_status(struct reset_control *rstc) 48{ 49 return 0; 50} 51 52static inline void reset_control_put(struct reset_control *rstc) 53{ 54} 55 56static inline int __must_check device_reset(struct device *dev) 57{ 58 WARN_ON(1); 59 return -ENOTSUPP; 60} 61 62static inline int device_reset_optional(struct device *dev) 63{ 64 return -ENOTSUPP; 65} 66 67static inline struct reset_control *__of_reset_control_get( 68 struct device_node *node, 69 const char *id, int index, bool shared, 70 bool optional) 71{ 72 return optional ? NULL : ERR_PTR(-ENOTSUPP); 73} 74 75static inline struct reset_control *__devm_reset_control_get( 76 struct device *dev, const char *id, 77 int index, bool shared, bool optional) 78{ 79 return optional ? NULL : ERR_PTR(-ENOTSUPP); 80} 81 82#endif /* CONFIG_RESET_CONTROLLER */ 83 84/** 85 * reset_control_get_exclusive - Lookup and obtain an exclusive reference 86 * to a reset controller. 87 * @dev: device to be reset by the controller 88 * @id: reset line name 89 * 90 * Returns a struct reset_control or IS_ERR() condition containing errno. 91 * If this function is called more then once for the same reset_control it will 92 * return -EBUSY. 93 * 94 * See reset_control_get_shared for details on shared references to 95 * reset-controls. 96 * 97 * Use of id names is optional. 98 */ 99static inline struct reset_control * 100__must_check reset_control_get_exclusive(struct device *dev, const char *id) 101{ 102#ifndef CONFIG_RESET_CONTROLLER 103 WARN_ON(1); 104#endif 105 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, false, 106 false); 107} 108 109/** 110 * reset_control_get_shared - Lookup and obtain a shared reference to a 111 * reset controller. 112 * @dev: device to be reset by the controller 113 * @id: reset line name 114 * 115 * Returns a struct reset_control or IS_ERR() condition containing errno. 116 * This function is intended for use with reset-controls which are shared 117 * between hardware-blocks. 118 * 119 * When a reset-control is shared, the behavior of reset_control_assert / 120 * deassert is changed, the reset-core will keep track of a deassert_count 121 * and only (re-)assert the reset after reset_control_assert has been called 122 * as many times as reset_control_deassert was called. Also see the remark 123 * about shared reset-controls in the reset_control_assert docs. 124 * 125 * Calling reset_control_assert without first calling reset_control_deassert 126 * is not allowed on a shared reset control. Calling reset_control_reset is 127 * also not allowed on a shared reset control. 128 * 129 * Use of id names is optional. 130 */ 131static inline struct reset_control *reset_control_get_shared( 132 struct device *dev, const char *id) 133{ 134 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, true, 135 false); 136} 137 138static inline struct reset_control *reset_control_get_optional_exclusive( 139 struct device *dev, const char *id) 140{ 141 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, false, 142 true); 143} 144 145static inline struct reset_control *reset_control_get_optional_shared( 146 struct device *dev, const char *id) 147{ 148 return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, true, 149 true); 150} 151 152/** 153 * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference 154 * to a reset controller. 155 * @node: device to be reset by the controller 156 * @id: reset line name 157 * 158 * Returns a struct reset_control or IS_ERR() condition containing errno. 159 * 160 * Use of id names is optional. 161 */ 162static inline struct reset_control *of_reset_control_get_exclusive( 163 struct device_node *node, const char *id) 164{ 165 return __of_reset_control_get(node, id, 0, false, false); 166} 167 168/** 169 * of_reset_control_get_shared - Lookup and obtain an shared reference 170 * to a reset controller. 171 * @node: device to be reset by the controller 172 * @id: reset line name 173 * 174 * When a reset-control is shared, the behavior of reset_control_assert / 175 * deassert is changed, the reset-core will keep track of a deassert_count 176 * and only (re-)assert the reset after reset_control_assert has been called 177 * as many times as reset_control_deassert was called. Also see the remark 178 * about shared reset-controls in the reset_control_assert docs. 179 * 180 * Calling reset_control_assert without first calling reset_control_deassert 181 * is not allowed on a shared reset control. Calling reset_control_reset is 182 * also not allowed on a shared reset control. 183 * Returns a struct reset_control or IS_ERR() condition containing errno. 184 * 185 * Use of id names is optional. 186 */ 187static inline struct reset_control *of_reset_control_get_shared( 188 struct device_node *node, const char *id) 189{ 190 return __of_reset_control_get(node, id, 0, true, false); 191} 192 193/** 194 * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive 195 * reference to a reset controller 196 * by index. 197 * @node: device to be reset by the controller 198 * @index: index of the reset controller 199 * 200 * This is to be used to perform a list of resets for a device or power domain 201 * in whatever order. Returns a struct reset_control or IS_ERR() condition 202 * containing errno. 203 */ 204static inline struct reset_control *of_reset_control_get_exclusive_by_index( 205 struct device_node *node, int index) 206{ 207 return __of_reset_control_get(node, NULL, index, false, false); 208} 209 210/** 211 * of_reset_control_get_shared_by_index - Lookup and obtain an shared 212 * reference to a reset controller 213 * by index. 214 * @node: device to be reset by the controller 215 * @index: index of the reset controller 216 * 217 * When a reset-control is shared, the behavior of reset_control_assert / 218 * deassert is changed, the reset-core will keep track of a deassert_count 219 * and only (re-)assert the reset after reset_control_assert has been called 220 * as many times as reset_control_deassert was called. Also see the remark 221 * about shared reset-controls in the reset_control_assert docs. 222 * 223 * Calling reset_control_assert without first calling reset_control_deassert 224 * is not allowed on a shared reset control. Calling reset_control_reset is 225 * also not allowed on a shared reset control. 226 * Returns a struct reset_control or IS_ERR() condition containing errno. 227 * 228 * This is to be used to perform a list of resets for a device or power domain 229 * in whatever order. Returns a struct reset_control or IS_ERR() condition 230 * containing errno. 231 */ 232static inline struct reset_control *of_reset_control_get_shared_by_index( 233 struct device_node *node, int index) 234{ 235 return __of_reset_control_get(node, NULL, index, true, false); 236} 237 238/** 239 * devm_reset_control_get_exclusive - resource managed 240 * reset_control_get_exclusive() 241 * @dev: device to be reset by the controller 242 * @id: reset line name 243 * 244 * Managed reset_control_get_exclusive(). For reset controllers returned 245 * from this function, reset_control_put() is called automatically on driver 246 * detach. 247 * 248 * See reset_control_get_exclusive() for more information. 249 */ 250static inline struct reset_control * 251__must_check devm_reset_control_get_exclusive(struct device *dev, 252 const char *id) 253{ 254#ifndef CONFIG_RESET_CONTROLLER 255 WARN_ON(1); 256#endif 257 return __devm_reset_control_get(dev, id, 0, false, false); 258} 259 260/** 261 * devm_reset_control_get_shared - resource managed reset_control_get_shared() 262 * @dev: device to be reset by the controller 263 * @id: reset line name 264 * 265 * Managed reset_control_get_shared(). For reset controllers returned from 266 * this function, reset_control_put() is called automatically on driver detach. 267 * See reset_control_get_shared() for more information. 268 */ 269static inline struct reset_control *devm_reset_control_get_shared( 270 struct device *dev, const char *id) 271{ 272 return __devm_reset_control_get(dev, id, 0, true, false); 273} 274 275static inline struct reset_control *devm_reset_control_get_optional_exclusive( 276 struct device *dev, const char *id) 277{ 278 return __devm_reset_control_get(dev, id, 0, false, true); 279} 280 281static inline struct reset_control *devm_reset_control_get_optional_shared( 282 struct device *dev, const char *id) 283{ 284 return __devm_reset_control_get(dev, id, 0, true, true); 285} 286 287/** 288 * devm_reset_control_get_exclusive_by_index - resource managed 289 * reset_control_get_exclusive() 290 * @dev: device to be reset by the controller 291 * @index: index of the reset controller 292 * 293 * Managed reset_control_get_exclusive(). For reset controllers returned from 294 * this function, reset_control_put() is called automatically on driver 295 * detach. 296 * 297 * See reset_control_get_exclusive() for more information. 298 */ 299static inline struct reset_control * 300devm_reset_control_get_exclusive_by_index(struct device *dev, int index) 301{ 302 return __devm_reset_control_get(dev, NULL, index, false, false); 303} 304 305/** 306 * devm_reset_control_get_shared_by_index - resource managed 307 * reset_control_get_shared 308 * @dev: device to be reset by the controller 309 * @index: index of the reset controller 310 * 311 * Managed reset_control_get_shared(). For reset controllers returned from 312 * this function, reset_control_put() is called automatically on driver detach. 313 * See reset_control_get_shared() for more information. 314 */ 315static inline struct reset_control * 316devm_reset_control_get_shared_by_index(struct device *dev, int index) 317{ 318 return __devm_reset_control_get(dev, NULL, index, true, false); 319} 320 321/* 322 * TEMPORARY calls to use during transition: 323 * 324 * of_reset_control_get() => of_reset_control_get_exclusive() 325 * 326 * These inline function calls will be removed once all consumers 327 * have been moved over to the new explicit API. 328 */ 329static inline struct reset_control *reset_control_get( 330 struct device *dev, const char *id) 331{ 332 return reset_control_get_exclusive(dev, id); 333} 334 335static inline struct reset_control *reset_control_get_optional( 336 struct device *dev, const char *id) 337{ 338 return reset_control_get_optional_exclusive(dev, id); 339} 340 341static inline struct reset_control *of_reset_control_get( 342 struct device_node *node, const char *id) 343{ 344 return of_reset_control_get_exclusive(node, id); 345} 346 347static inline struct reset_control *of_reset_control_get_by_index( 348 struct device_node *node, int index) 349{ 350 return of_reset_control_get_exclusive_by_index(node, index); 351} 352 353static inline struct reset_control *devm_reset_control_get( 354 struct device *dev, const char *id) 355{ 356 return devm_reset_control_get_exclusive(dev, id); 357} 358 359static inline struct reset_control *devm_reset_control_get_optional( 360 struct device *dev, const char *id) 361{ 362 return devm_reset_control_get_optional_exclusive(dev, id); 363 364} 365 366static inline struct reset_control *devm_reset_control_get_by_index( 367 struct device *dev, int index) 368{ 369 return devm_reset_control_get_exclusive_by_index(dev, index); 370} 371#endif