diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-03-12 11:40:15 -0700 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-03-12 11:40:15 -0700 | 
| commit | 192c028b6ac972df25fd624f94a94d038fbdb66c (patch) | |
| tree | 4dd9d13ffd239e4d7c61401f892989742c671fa8 /drivers/regulator/core.c | |
| parent | ea1990c3796e7550e6f240983f2d1b8e5ecf3891 (diff) | |
| parent | fa389e220254c69ffae0d403eac4146171062d08 (diff) | |
Merge 3.14-rc6 into usb-next
We want the USB fixes in here as well.
Diffstat (limited to 'drivers/regulator/core.c')
| -rw-r--r-- | drivers/regulator/core.c | 48 | 
1 files changed, 20 insertions, 28 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index d1ac4caaf1b0..afca1bc24f26 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -953,6 +953,8 @@ static int machine_constraints_current(struct regulator_dev *rdev,  	return 0;  } +static int _regulator_do_enable(struct regulator_dev *rdev); +  /**   * set_machine_constraints - sets regulator constraints   * @rdev: regulator source @@ -1013,10 +1015,9 @@ static int set_machine_constraints(struct regulator_dev *rdev,  	/* If the constraints say the regulator should be on at this point  	 * and we have control then make sure it is enabled.  	 */ -	if ((rdev->constraints->always_on || rdev->constraints->boot_on) && -	    ops->enable) { -		ret = ops->enable(rdev); -		if (ret < 0) { +	if (rdev->constraints->always_on || rdev->constraints->boot_on) { +		ret = _regulator_do_enable(rdev); +		if (ret < 0 && ret != -EINVAL) {  			rdev_err(rdev, "failed to enable\n");  			goto out;  		} @@ -1907,8 +1908,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev)  	trace_regulator_disable_complete(rdev_get_name(rdev)); -	_notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, -			     NULL);  	return 0;  } @@ -1932,6 +1931,8 @@ static int _regulator_disable(struct regulator_dev *rdev)  				rdev_err(rdev, "failed to disable\n");  				return ret;  			} +			_notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, +					NULL);  		}  		rdev->use_count = 0; @@ -1984,20 +1985,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev)  {  	int ret = 0; -	/* force disable */ -	if (rdev->desc->ops->disable) { -		/* ah well, who wants to live forever... */ -		ret = rdev->desc->ops->disable(rdev); -		if (ret < 0) { -			rdev_err(rdev, "failed to force disable\n"); -			return ret; -		} -		/* notify other consumers that power has been forced off */ -		_notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | -			REGULATOR_EVENT_DISABLE, NULL); +	ret = _regulator_do_disable(rdev); +	if (ret < 0) { +		rdev_err(rdev, "failed to force disable\n"); +		return ret;  	} -	return ret; +	_notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | +			REGULATOR_EVENT_DISABLE, NULL); + +	return 0;  }  /** @@ -3630,23 +3627,18 @@ int regulator_suspend_finish(void)  	mutex_lock(®ulator_list_mutex);  	list_for_each_entry(rdev, ®ulator_list, list) { -		struct regulator_ops *ops = rdev->desc->ops; -  		mutex_lock(&rdev->mutex); -		if ((rdev->use_count > 0  || rdev->constraints->always_on) && -				ops->enable) { -			error = ops->enable(rdev); +		if (rdev->use_count > 0  || rdev->constraints->always_on) { +			error = _regulator_do_enable(rdev);  			if (error)  				ret = error;  		} else {  			if (!have_full_constraints())  				goto unlock; -			if (!ops->disable) -				goto unlock;  			if (!_regulator_is_enabled(rdev))  				goto unlock; -			error = ops->disable(rdev); +			error = _regulator_do_disable(rdev);  			if (error)  				ret = error;  		} @@ -3820,7 +3812,7 @@ static int __init regulator_init_complete(void)  		ops = rdev->desc->ops;  		c = rdev->constraints; -		if (!ops->disable || (c && c->always_on)) +		if (c && c->always_on)  			continue;  		mutex_lock(&rdev->mutex); @@ -3841,7 +3833,7 @@ static int __init regulator_init_complete(void)  			/* We log since this may kill the system if it  			 * goes wrong. */  			rdev_info(rdev, "disabling\n"); -			ret = ops->disable(rdev); +			ret = _regulator_do_disable(rdev);  			if (ret != 0)  				rdev_err(rdev, "couldn't disable: %d\n", ret);  		} else {  | 
