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