| .. | .. |
|---|
| 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, |
|---|