.. | .. |
---|
222 | 222 | mutex_unlock(®ulator_nesting_mutex); |
---|
223 | 223 | } |
---|
224 | 224 | |
---|
| 225 | +/** |
---|
| 226 | + * regulator_lock_two - lock two regulators |
---|
| 227 | + * @rdev1: first regulator |
---|
| 228 | + * @rdev2: second regulator |
---|
| 229 | + * @ww_ctx: w/w mutex acquire context |
---|
| 230 | + * |
---|
| 231 | + * Locks both rdevs using the regulator_ww_class. |
---|
| 232 | + */ |
---|
| 233 | +static void regulator_lock_two(struct regulator_dev *rdev1, |
---|
| 234 | + struct regulator_dev *rdev2, |
---|
| 235 | + struct ww_acquire_ctx *ww_ctx) |
---|
| 236 | +{ |
---|
| 237 | + struct regulator_dev *tmp; |
---|
| 238 | + int ret; |
---|
| 239 | + |
---|
| 240 | + ww_acquire_init(ww_ctx, ®ulator_ww_class); |
---|
| 241 | + |
---|
| 242 | + /* Try to just grab both of them */ |
---|
| 243 | + ret = regulator_lock_nested(rdev1, ww_ctx); |
---|
| 244 | + WARN_ON(ret); |
---|
| 245 | + ret = regulator_lock_nested(rdev2, ww_ctx); |
---|
| 246 | + if (ret != -EDEADLOCK) { |
---|
| 247 | + WARN_ON(ret); |
---|
| 248 | + goto exit; |
---|
| 249 | + } |
---|
| 250 | + |
---|
| 251 | + while (true) { |
---|
| 252 | + /* |
---|
| 253 | + * Start of loop: rdev1 was locked and rdev2 was contended. |
---|
| 254 | + * Need to unlock rdev1, slowly lock rdev2, then try rdev1 |
---|
| 255 | + * again. |
---|
| 256 | + */ |
---|
| 257 | + regulator_unlock(rdev1); |
---|
| 258 | + |
---|
| 259 | + ww_mutex_lock_slow(&rdev2->mutex, ww_ctx); |
---|
| 260 | + rdev2->ref_cnt++; |
---|
| 261 | + rdev2->mutex_owner = current; |
---|
| 262 | + ret = regulator_lock_nested(rdev1, ww_ctx); |
---|
| 263 | + |
---|
| 264 | + if (ret == -EDEADLOCK) { |
---|
| 265 | + /* More contention; swap which needs to be slow */ |
---|
| 266 | + tmp = rdev1; |
---|
| 267 | + rdev1 = rdev2; |
---|
| 268 | + rdev2 = tmp; |
---|
| 269 | + } else { |
---|
| 270 | + WARN_ON(ret); |
---|
| 271 | + break; |
---|
| 272 | + } |
---|
| 273 | + } |
---|
| 274 | + |
---|
| 275 | +exit: |
---|
| 276 | + ww_acquire_done(ww_ctx); |
---|
| 277 | +} |
---|
| 278 | + |
---|
| 279 | +/** |
---|
| 280 | + * regulator_unlock_two - unlock two regulators |
---|
| 281 | + * @rdev1: first regulator |
---|
| 282 | + * @rdev2: second regulator |
---|
| 283 | + * @ww_ctx: w/w mutex acquire context |
---|
| 284 | + * |
---|
| 285 | + * The inverse of regulator_lock_two(). |
---|
| 286 | + */ |
---|
| 287 | + |
---|
| 288 | +static void regulator_unlock_two(struct regulator_dev *rdev1, |
---|
| 289 | + struct regulator_dev *rdev2, |
---|
| 290 | + struct ww_acquire_ctx *ww_ctx) |
---|
| 291 | +{ |
---|
| 292 | + regulator_unlock(rdev2); |
---|
| 293 | + regulator_unlock(rdev1); |
---|
| 294 | + ww_acquire_fini(ww_ctx); |
---|
| 295 | +} |
---|
| 296 | + |
---|
225 | 297 | static bool regulator_supply_is_couple(struct regulator_dev *rdev) |
---|
226 | 298 | { |
---|
227 | 299 | struct regulator_dev *c_rdev; |
---|
.. | .. |
---|
349 | 421 | ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); |
---|
350 | 422 | old_contended_rdev = new_contended_rdev; |
---|
351 | 423 | old_contended_rdev->ref_cnt++; |
---|
| 424 | + old_contended_rdev->mutex_owner = current; |
---|
352 | 425 | } |
---|
353 | 426 | |
---|
354 | 427 | err = regulator_lock_recursive(rdev, |
---|
.. | .. |
---|
986 | 1059 | /* get input voltage */ |
---|
987 | 1060 | input_uV = 0; |
---|
988 | 1061 | if (rdev->supply) |
---|
989 | | - input_uV = regulator_get_voltage(rdev->supply); |
---|
| 1062 | + input_uV = regulator_get_voltage_rdev(rdev->supply->rdev); |
---|
990 | 1063 | if (input_uV <= 0) |
---|
991 | 1064 | input_uV = rdev->constraints->input_uV; |
---|
992 | 1065 | if (input_uV <= 0) { |
---|
.. | .. |
---|
1434 | 1507 | if (rdev->supply_name && !rdev->supply) |
---|
1435 | 1508 | return -EPROBE_DEFER; |
---|
1436 | 1509 | |
---|
1437 | | - if (rdev->supply) { |
---|
| 1510 | + /* If supplying regulator has already been enabled, |
---|
| 1511 | + * it's not intended to have use_count increment |
---|
| 1512 | + * when rdev is only boot-on. |
---|
| 1513 | + */ |
---|
| 1514 | + if (rdev->supply && |
---|
| 1515 | + (rdev->constraints->always_on || |
---|
| 1516 | + !regulator_is_enabled(rdev->supply))) { |
---|
1438 | 1517 | ret = regulator_enable(rdev->supply); |
---|
1439 | 1518 | if (ret < 0) { |
---|
1440 | 1519 | _regulator_put(rdev->supply); |
---|
.. | .. |
---|
1459 | 1538 | |
---|
1460 | 1539 | /** |
---|
1461 | 1540 | * set_supply - set regulator supply regulator |
---|
1462 | | - * @rdev: regulator name |
---|
1463 | | - * @supply_rdev: supply regulator name |
---|
| 1541 | + * @rdev: regulator (locked) |
---|
| 1542 | + * @supply_rdev: supply regulator (locked)) |
---|
1464 | 1543 | * |
---|
1465 | 1544 | * Called by platform initialisation code to set the supply regulator for this |
---|
1466 | 1545 | * regulator. This ensures that a regulators supply will also be enabled by the |
---|
.. | .. |
---|
1478 | 1557 | |
---|
1479 | 1558 | rdev->supply = create_regulator(supply_rdev, &rdev->dev, "SUPPLY"); |
---|
1480 | 1559 | if (rdev->supply == NULL) { |
---|
| 1560 | + module_put(supply_rdev->owner); |
---|
1481 | 1561 | err = -ENOMEM; |
---|
1482 | 1562 | return err; |
---|
1483 | 1563 | } |
---|
.. | .. |
---|
1631 | 1711 | struct regulator *regulator; |
---|
1632 | 1712 | int err = 0; |
---|
1633 | 1713 | |
---|
| 1714 | + lockdep_assert_held_once(&rdev->mutex.base); |
---|
| 1715 | + |
---|
1634 | 1716 | if (dev) { |
---|
1635 | 1717 | char buf[REG_STR_SIZE]; |
---|
1636 | 1718 | int size; |
---|
.. | .. |
---|
1651 | 1733 | |
---|
1652 | 1734 | regulator = kzalloc(sizeof(*regulator), GFP_KERNEL); |
---|
1653 | 1735 | if (regulator == NULL) { |
---|
1654 | | - kfree(supply_name); |
---|
| 1736 | + kfree_const(supply_name); |
---|
1655 | 1737 | return NULL; |
---|
1656 | 1738 | } |
---|
1657 | 1739 | |
---|
1658 | 1740 | regulator->rdev = rdev; |
---|
1659 | 1741 | regulator->supply_name = supply_name; |
---|
1660 | 1742 | |
---|
1661 | | - regulator_lock(rdev); |
---|
1662 | 1743 | list_add(®ulator->list, &rdev->consumer_list); |
---|
1663 | | - regulator_unlock(rdev); |
---|
1664 | 1744 | |
---|
1665 | 1745 | if (dev) { |
---|
1666 | 1746 | regulator->dev = dev; |
---|
.. | .. |
---|
1677 | 1757 | |
---|
1678 | 1758 | if (err != -EEXIST) |
---|
1679 | 1759 | regulator->debugfs = debugfs_create_dir(supply_name, rdev->debugfs); |
---|
1680 | | - if (!regulator->debugfs) { |
---|
| 1760 | + else |
---|
| 1761 | + regulator->debugfs = ERR_PTR(err); |
---|
| 1762 | + if (IS_ERR(regulator->debugfs)) |
---|
1681 | 1763 | rdev_dbg(rdev, "Failed to create debugfs directory\n"); |
---|
1682 | | - } else { |
---|
1683 | | - debugfs_create_u32("uA_load", 0444, regulator->debugfs, |
---|
1684 | | - ®ulator->uA_load); |
---|
1685 | | - debugfs_create_u32("min_uV", 0444, regulator->debugfs, |
---|
1686 | | - ®ulator->voltage[PM_SUSPEND_ON].min_uV); |
---|
1687 | | - debugfs_create_u32("max_uV", 0444, regulator->debugfs, |
---|
1688 | | - ®ulator->voltage[PM_SUSPEND_ON].max_uV); |
---|
1689 | | - debugfs_create_file("constraint_flags", 0444, |
---|
1690 | | - regulator->debugfs, regulator, |
---|
1691 | | - &constraint_flags_fops); |
---|
1692 | | - } |
---|
| 1764 | + |
---|
| 1765 | + debugfs_create_u32("uA_load", 0444, regulator->debugfs, |
---|
| 1766 | + ®ulator->uA_load); |
---|
| 1767 | + debugfs_create_u32("min_uV", 0444, regulator->debugfs, |
---|
| 1768 | + ®ulator->voltage[PM_SUSPEND_ON].min_uV); |
---|
| 1769 | + debugfs_create_u32("max_uV", 0444, regulator->debugfs, |
---|
| 1770 | + ®ulator->voltage[PM_SUSPEND_ON].max_uV); |
---|
| 1771 | + debugfs_create_file("constraint_flags", 0444, regulator->debugfs, |
---|
| 1772 | + regulator, &constraint_flags_fops); |
---|
1693 | 1773 | |
---|
1694 | 1774 | /* |
---|
1695 | 1775 | * Check now if the regulator is an always on regulator - if |
---|
.. | .. |
---|
1781 | 1861 | node = of_get_regulator(dev, supply); |
---|
1782 | 1862 | if (node) { |
---|
1783 | 1863 | r = of_find_regulator_by_node(node); |
---|
| 1864 | + of_node_put(node); |
---|
1784 | 1865 | if (r) |
---|
1785 | 1866 | return r; |
---|
1786 | 1867 | |
---|
.. | .. |
---|
1825 | 1906 | { |
---|
1826 | 1907 | struct regulator_dev *r; |
---|
1827 | 1908 | struct device *dev = rdev->dev.parent; |
---|
| 1909 | + struct ww_acquire_ctx ww_ctx; |
---|
1828 | 1910 | int ret = 0; |
---|
1829 | 1911 | |
---|
1830 | 1912 | /* No supply to resolve? */ |
---|
.. | .. |
---|
1891 | 1973 | * between rdev->supply null check and setting rdev->supply in |
---|
1892 | 1974 | * set_supply() from concurrent tasks. |
---|
1893 | 1975 | */ |
---|
1894 | | - regulator_lock(rdev); |
---|
| 1976 | + regulator_lock_two(rdev, r, &ww_ctx); |
---|
1895 | 1977 | |
---|
1896 | 1978 | /* Supply just resolved by a concurrent task? */ |
---|
1897 | 1979 | if (rdev->supply) { |
---|
1898 | | - regulator_unlock(rdev); |
---|
| 1980 | + regulator_unlock_two(rdev, r, &ww_ctx); |
---|
1899 | 1981 | put_device(&r->dev); |
---|
1900 | 1982 | goto out; |
---|
1901 | 1983 | } |
---|
1902 | 1984 | |
---|
1903 | 1985 | ret = set_supply(rdev, r); |
---|
1904 | 1986 | if (ret < 0) { |
---|
1905 | | - regulator_unlock(rdev); |
---|
| 1987 | + regulator_unlock_two(rdev, r, &ww_ctx); |
---|
1906 | 1988 | put_device(&r->dev); |
---|
1907 | 1989 | goto out; |
---|
1908 | 1990 | } |
---|
1909 | 1991 | |
---|
1910 | | - regulator_unlock(rdev); |
---|
| 1992 | + regulator_unlock_two(rdev, r, &ww_ctx); |
---|
1911 | 1993 | |
---|
1912 | 1994 | /* |
---|
1913 | 1995 | * In set_machine_constraints() we may have turned this regulator on |
---|
.. | .. |
---|
2020 | 2102 | return regulator; |
---|
2021 | 2103 | } |
---|
2022 | 2104 | |
---|
| 2105 | + regulator_lock(rdev); |
---|
2023 | 2106 | regulator = create_regulator(rdev, dev, id); |
---|
| 2107 | + regulator_unlock(rdev); |
---|
2024 | 2108 | if (regulator == NULL) { |
---|
2025 | 2109 | regulator = ERR_PTR(-ENOMEM); |
---|
2026 | 2110 | module_put(rdev->owner); |
---|
.. | .. |
---|
5216 | 5300 | } |
---|
5217 | 5301 | |
---|
5218 | 5302 | rdev->debugfs = debugfs_create_dir(rname, debugfs_root); |
---|
5219 | | - if (!rdev->debugfs) { |
---|
5220 | | - rdev_warn(rdev, "Failed to create debugfs directory\n"); |
---|
5221 | | - return; |
---|
5222 | | - } |
---|
| 5303 | + if (IS_ERR(rdev->debugfs)) |
---|
| 5304 | + rdev_dbg(rdev, "Failed to create debugfs directory\n"); |
---|
5223 | 5305 | |
---|
5224 | 5306 | debugfs_create_u32("use_count", 0444, rdev->debugfs, |
---|
5225 | 5307 | &rdev->use_count); |
---|
.. | .. |
---|
5742 | 5824 | regulator_remove_coupling(rdev); |
---|
5743 | 5825 | mutex_unlock(®ulator_list_mutex); |
---|
5744 | 5826 | wash: |
---|
| 5827 | + regulator_put(rdev->supply); |
---|
5745 | 5828 | kfree(rdev->coupling_desc.coupled_rdevs); |
---|
5746 | 5829 | mutex_lock(®ulator_list_mutex); |
---|
5747 | 5830 | regulator_ena_gpio_free(rdev); |
---|
.. | .. |
---|
6135 | 6218 | ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); |
---|
6136 | 6219 | old_contended_rdev = new_contended_rdev; |
---|
6137 | 6220 | old_contended_rdev->ref_cnt++; |
---|
| 6221 | + old_contended_rdev->mutex_owner = current; |
---|
6138 | 6222 | } |
---|
6139 | 6223 | |
---|
6140 | 6224 | err = regulator_summary_lock_all(ww_ctx, |
---|
.. | .. |
---|
6195 | 6279 | ret = class_register(®ulator_class); |
---|
6196 | 6280 | |
---|
6197 | 6281 | debugfs_root = debugfs_create_dir("regulator", NULL); |
---|
6198 | | - if (!debugfs_root) |
---|
6199 | | - pr_warn("regulator: Failed to create debugfs directory\n"); |
---|
| 6282 | + if (IS_ERR(debugfs_root)) |
---|
| 6283 | + pr_debug("regulator: Failed to create debugfs directory\n"); |
---|
6200 | 6284 | |
---|
6201 | 6285 | #ifdef CONFIG_DEBUG_FS |
---|
6202 | 6286 | debugfs_create_file("supply_map", 0444, debugfs_root, NULL, |
---|