Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

reset: Add devres helpers to request pre-deasserted reset controls

Add devres helpers

- devm_reset_control_bulk_get_exclusive_deasserted
- devm_reset_control_bulk_get_optional_exclusive_deasserted
- devm_reset_control_bulk_get_optional_shared_deasserted
- devm_reset_control_bulk_get_shared_deasserted
- devm_reset_control_get_exclusive_deasserted
- devm_reset_control_get_optional_exclusive_deasserted
- devm_reset_control_get_optional_shared_deasserted
- devm_reset_control_get_shared_deasserted

to request and immediately deassert reset controls. During cleanup,
reset_control_assert() will be called automatically on the returned
reset controls.

Acked-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/20240925-reset-get-deasserted-v2-2-b3601bbd0458@pengutronix.de
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

+159 -2
+46 -2
drivers/reset/core.c
··· 1236 1236 reset_control_put(*(struct reset_control **)res); 1237 1237 } 1238 1238 1239 + static void devm_reset_control_release_deasserted(struct device *dev, void *res) 1240 + { 1241 + struct reset_control *rstc = *(struct reset_control **)res; 1242 + 1243 + reset_control_assert(rstc); 1244 + reset_control_put(rstc); 1245 + } 1246 + 1239 1247 struct reset_control * 1240 1248 __devm_reset_control_get(struct device *dev, const char *id, int index, 1241 1249 enum reset_control_flags flags) 1242 1250 { 1243 1251 struct reset_control **ptr, *rstc; 1252 + bool deasserted = flags & RESET_CONTROL_FLAGS_BIT_DEASSERTED; 1244 1253 1245 - ptr = devres_alloc(devm_reset_control_release, sizeof(*ptr), 1254 + ptr = devres_alloc(deasserted ? devm_reset_control_release_deasserted : 1255 + devm_reset_control_release, sizeof(*ptr), 1246 1256 GFP_KERNEL); 1247 1257 if (!ptr) 1248 1258 return ERR_PTR(-ENOMEM); 1259 + 1260 + flags &= ~RESET_CONTROL_FLAGS_BIT_DEASSERTED; 1249 1261 1250 1262 rstc = __reset_control_get(dev, id, index, flags); 1251 1263 if (IS_ERR_OR_NULL(rstc)) { 1252 1264 devres_free(ptr); 1253 1265 return rstc; 1266 + } 1267 + 1268 + if (deasserted) { 1269 + int ret; 1270 + 1271 + ret = reset_control_deassert(rstc); 1272 + if (ret) { 1273 + reset_control_put(rstc); 1274 + devres_free(ptr); 1275 + return ERR_PTR(ret); 1276 + } 1254 1277 } 1255 1278 1256 1279 *ptr = rstc; ··· 1295 1272 reset_control_bulk_put(devres->num_rstcs, devres->rstcs); 1296 1273 } 1297 1274 1275 + static void devm_reset_control_bulk_release_deasserted(struct device *dev, void *res) 1276 + { 1277 + struct reset_control_bulk_devres *devres = res; 1278 + 1279 + reset_control_bulk_assert(devres->num_rstcs, devres->rstcs); 1280 + reset_control_bulk_put(devres->num_rstcs, devres->rstcs); 1281 + } 1282 + 1298 1283 int __devm_reset_control_bulk_get(struct device *dev, int num_rstcs, 1299 1284 struct reset_control_bulk_data *rstcs, 1300 1285 enum reset_control_flags flags) 1301 1286 { 1302 1287 struct reset_control_bulk_devres *ptr; 1288 + bool deasserted = flags & RESET_CONTROL_FLAGS_BIT_DEASSERTED; 1303 1289 int ret; 1304 1290 1305 - ptr = devres_alloc(devm_reset_control_bulk_release, sizeof(*ptr), 1291 + ptr = devres_alloc(deasserted ? devm_reset_control_bulk_release_deasserted : 1292 + devm_reset_control_bulk_release, sizeof(*ptr), 1306 1293 GFP_KERNEL); 1307 1294 if (!ptr) 1308 1295 return -ENOMEM; 1296 + 1297 + flags &= ~RESET_CONTROL_FLAGS_BIT_DEASSERTED; 1309 1298 1310 1299 ret = __reset_control_bulk_get(dev, num_rstcs, rstcs, flags); 1311 1300 if (ret < 0) { 1312 1301 devres_free(ptr); 1313 1302 return ret; 1303 + } 1304 + 1305 + if (deasserted) { 1306 + ret = reset_control_bulk_deassert(num_rstcs, rstcs); 1307 + if (ret) { 1308 + reset_control_bulk_put(num_rstcs, rstcs); 1309 + devres_free(ptr); 1310 + return ret; 1311 + } 1314 1312 } 1315 1313 1316 1314 ptr->num_rstcs = num_rstcs;
+113
include/linux/reset.h
··· 28 28 #define RESET_CONTROL_FLAGS_BIT_SHARED BIT(0) /* not exclusive */ 29 29 #define RESET_CONTROL_FLAGS_BIT_OPTIONAL BIT(1) 30 30 #define RESET_CONTROL_FLAGS_BIT_ACQUIRED BIT(2) /* iff exclusive, not released */ 31 + #define RESET_CONTROL_FLAGS_BIT_DEASSERTED BIT(3) 31 32 32 33 /** 33 34 * enum reset_control_flags - Flags that can be passed to the reset_control_get functions ··· 36 35 * These values cannot be OR'd. 37 36 * 38 37 * @RESET_CONTROL_EXCLUSIVE: exclusive, acquired, 38 + * @RESET_CONTROL_EXCLUSIVE_DEASSERTED: exclusive, acquired, deasserted 39 39 * @RESET_CONTROL_EXCLUSIVE_RELEASED: exclusive, released, 40 40 * @RESET_CONTROL_SHARED: shared 41 + * @RESET_CONTROL_SHARED_DEASSERTED: shared, deasserted 41 42 * @RESET_CONTROL_OPTIONAL_EXCLUSIVE: optional, exclusive, acquired 43 + * @RESET_CONTROL_OPTIONAL_EXCLUSIVE_DEASSERTED: optional, exclusive, acquired, deasserted 42 44 * @RESET_CONTROL_OPTIONAL_EXCLUSIVE_RELEASED: optional, exclusive, released 43 45 * @RESET_CONTROL_OPTIONAL_SHARED: optional, shared 46 + * @RESET_CONTROL_OPTIONAL_SHARED_DEASSERTED: optional, shared, deasserted 44 47 */ 45 48 enum reset_control_flags { 46 49 RESET_CONTROL_EXCLUSIVE = RESET_CONTROL_FLAGS_BIT_ACQUIRED, 50 + RESET_CONTROL_EXCLUSIVE_DEASSERTED = RESET_CONTROL_FLAGS_BIT_ACQUIRED | 51 + RESET_CONTROL_FLAGS_BIT_DEASSERTED, 47 52 RESET_CONTROL_EXCLUSIVE_RELEASED = 0, 48 53 RESET_CONTROL_SHARED = RESET_CONTROL_FLAGS_BIT_SHARED, 54 + RESET_CONTROL_SHARED_DEASSERTED = RESET_CONTROL_FLAGS_BIT_SHARED | 55 + RESET_CONTROL_FLAGS_BIT_DEASSERTED, 49 56 RESET_CONTROL_OPTIONAL_EXCLUSIVE = RESET_CONTROL_FLAGS_BIT_OPTIONAL | 50 57 RESET_CONTROL_FLAGS_BIT_ACQUIRED, 58 + RESET_CONTROL_OPTIONAL_EXCLUSIVE_DEASSERTED = RESET_CONTROL_FLAGS_BIT_OPTIONAL | 59 + RESET_CONTROL_FLAGS_BIT_ACQUIRED | 60 + RESET_CONTROL_FLAGS_BIT_DEASSERTED, 51 61 RESET_CONTROL_OPTIONAL_EXCLUSIVE_RELEASED = RESET_CONTROL_FLAGS_BIT_OPTIONAL, 52 62 RESET_CONTROL_OPTIONAL_SHARED = RESET_CONTROL_FLAGS_BIT_OPTIONAL | 53 63 RESET_CONTROL_FLAGS_BIT_SHARED, 64 + RESET_CONTROL_OPTIONAL_SHARED_DEASSERTED = RESET_CONTROL_FLAGS_BIT_OPTIONAL | 65 + RESET_CONTROL_FLAGS_BIT_SHARED | 66 + RESET_CONTROL_FLAGS_BIT_DEASSERTED, 54 67 }; 55 68 56 69 #ifdef CONFIG_RESET_CONTROLLER ··· 612 597 } 613 598 614 599 /** 600 + * devm_reset_control_get_exclusive_deasserted - resource managed 601 + * reset_control_get_exclusive() + 602 + * reset_control_deassert() 603 + * @dev: device to be reset by the controller 604 + * @id: reset line name 605 + * 606 + * Managed reset_control_get_exclusive() + reset_control_deassert(). For reset 607 + * controllers returned from this function, reset_control_assert() + 608 + * reset_control_put() is called automatically on driver detach. 609 + * 610 + * See reset_control_get_exclusive() for more information. 611 + */ 612 + static inline struct reset_control * __must_check 613 + devm_reset_control_get_exclusive_deasserted(struct device *dev, const char *id) 614 + { 615 + return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_EXCLUSIVE_DEASSERTED); 616 + } 617 + 618 + /** 615 619 * devm_reset_control_bulk_get_exclusive - resource managed 616 620 * reset_control_bulk_get_exclusive() 617 621 * @dev: device to be reset by the controller ··· 747 713 } 748 714 749 715 /** 716 + * devm_reset_control_get_shared_deasserted - resource managed 717 + * reset_control_get_shared() + 718 + * reset_control_deassert() 719 + * @dev: device to be reset by the controller 720 + * @id: reset line name 721 + * 722 + * Managed reset_control_get_shared() + reset_control_deassert(). For reset 723 + * controllers returned from this function, reset_control_assert() + 724 + * reset_control_put() is called automatically on driver detach. 725 + * 726 + * See devm_reset_control_get_shared() for more information. 727 + */ 728 + static inline struct reset_control * __must_check 729 + devm_reset_control_get_shared_deasserted(struct device *dev, const char *id) 730 + { 731 + return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_SHARED_DEASSERTED); 732 + } 733 + 734 + /** 750 735 * devm_reset_control_bulk_get_shared - resource managed 751 736 * reset_control_bulk_get_shared() 752 737 * @dev: device to be reset by the controller ··· 786 733 } 787 734 788 735 /** 736 + * devm_reset_control_bulk_get_shared_deasserted - resource managed 737 + * reset_control_bulk_get_shared() + 738 + * reset_control_bulk_deassert() 739 + * @dev: device to be reset by the controller 740 + * @num_rstcs: number of entries in rstcs array 741 + * @rstcs: array of struct reset_control_bulk_data with reset line names set 742 + * 743 + * Managed reset_control_bulk_get_shared() + reset_control_bulk_deassert(). For 744 + * reset controllers returned from this function, reset_control_bulk_assert() + 745 + * reset_control_bulk_put() are called automatically on driver detach. 746 + * 747 + * See devm_reset_control_bulk_get_shared() for more information. 748 + */ 749 + static inline int __must_check 750 + devm_reset_control_bulk_get_shared_deasserted(struct device *dev, int num_rstcs, 751 + struct reset_control_bulk_data *rstcs) 752 + { 753 + return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, 754 + RESET_CONTROL_SHARED_DEASSERTED); 755 + } 756 + 757 + /** 789 758 * devm_reset_control_get_optional_exclusive - resource managed 790 759 * reset_control_get_optional_exclusive() 791 760 * @dev: device to be reset by the controller ··· 823 748 struct device *dev, const char *id) 824 749 { 825 750 return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_OPTIONAL_EXCLUSIVE); 751 + } 752 + 753 + /** 754 + * devm_reset_control_get_optional_exclusive_deasserted - resource managed 755 + * reset_control_get_optional_exclusive() + 756 + * reset_control_deassert() 757 + * @dev: device to be reset by the controller 758 + * @id: reset line name 759 + * 760 + * Managed reset_control_get_optional_exclusive() + reset_control_deassert(). 761 + * For reset controllers returned from this function, reset_control_assert() + 762 + * reset_control_put() is called automatically on driver detach. 763 + * 764 + * See devm_reset_control_get_optional_exclusive() for more information. 765 + */ 766 + static inline struct reset_control * 767 + devm_reset_control_get_optional_exclusive_deasserted(struct device *dev, const char *id) 768 + { 769 + return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_OPTIONAL_EXCLUSIVE_DEASSERTED); 826 770 } 827 771 828 772 /** ··· 881 787 struct device *dev, const char *id) 882 788 { 883 789 return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_OPTIONAL_SHARED); 790 + } 791 + 792 + /** 793 + * devm_reset_control_get_optional_shared_deasserted - resource managed 794 + * reset_control_get_optional_shared() + 795 + * reset_control_deassert() 796 + * @dev: device to be reset by the controller 797 + * @id: reset line name 798 + * 799 + * Managed reset_control_get_optional_shared() + reset_control_deassert(). For 800 + * reset controllers returned from this function, reset_control_assert() + 801 + * reset_control_put() is called automatically on driver detach. 802 + * 803 + * See devm_reset_control_get_optional_shared() for more information. 804 + */ 805 + static inline struct reset_control * 806 + devm_reset_control_get_optional_shared_deasserted(struct device *dev, const char *id) 807 + { 808 + return __devm_reset_control_get(dev, id, 0, RESET_CONTROL_OPTIONAL_SHARED_DEASSERTED); 884 809 } 885 810 886 811 /**