mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	hwmon: (pmbus/core) Implement regulator get_status
Add get_status for pmbus_regulator_ops. Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com> Link: https://lore.kernel.org/r/20221124193642.4081054-1-Naresh.Solanki@9elements.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
		
							parent
							
								
									3ca0f12a02
								
							
						
					
					
						commit
						c05f477c4b
					
				
					 1 changed files with 44 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -2855,6 +2855,49 @@ static int pmbus_regulator_get_error_flags(struct regulator_dev *rdev, unsigned
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pmbus_regulator_get_status(struct regulator_dev *rdev)
 | 
			
		||||
{
 | 
			
		||||
	struct device *dev = rdev_get_dev(rdev);
 | 
			
		||||
	struct i2c_client *client = to_i2c_client(dev->parent);
 | 
			
		||||
	struct pmbus_data *data = i2c_get_clientdata(client);
 | 
			
		||||
	u8 page = rdev_get_id(rdev);
 | 
			
		||||
	int status, ret;
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&data->update_lock);
 | 
			
		||||
	status = pmbus_get_status(client, page, PMBUS_STATUS_WORD);
 | 
			
		||||
	if (status < 0) {
 | 
			
		||||
		ret = status;
 | 
			
		||||
		goto unlock;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (status & PB_STATUS_OFF) {
 | 
			
		||||
		ret = REGULATOR_STATUS_OFF;
 | 
			
		||||
		goto unlock;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If regulator is ON & reports power good then return ON */
 | 
			
		||||
	if (!(status & PB_STATUS_POWER_GOOD_N)) {
 | 
			
		||||
		ret = REGULATOR_STATUS_ON;
 | 
			
		||||
		goto unlock;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = pmbus_regulator_get_error_flags(rdev, &status);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto unlock;
 | 
			
		||||
 | 
			
		||||
	if (status & (REGULATOR_ERROR_UNDER_VOLTAGE | REGULATOR_ERROR_OVER_CURRENT |
 | 
			
		||||
	   REGULATOR_ERROR_REGULATION_OUT | REGULATOR_ERROR_FAIL | REGULATOR_ERROR_OVER_TEMP)) {
 | 
			
		||||
		ret = REGULATOR_STATUS_ERROR;
 | 
			
		||||
		goto unlock;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = REGULATOR_STATUS_UNDEFINED;
 | 
			
		||||
 | 
			
		||||
unlock:
 | 
			
		||||
	mutex_unlock(&data->update_lock);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pmbus_regulator_get_low_margin(struct i2c_client *client, int page)
 | 
			
		||||
{
 | 
			
		||||
	struct pmbus_data *data = i2c_get_clientdata(client);
 | 
			
		||||
| 
						 | 
				
			
			@ -2995,6 +3038,7 @@ const struct regulator_ops pmbus_regulator_ops = {
 | 
			
		|||
	.disable = pmbus_regulator_disable,
 | 
			
		||||
	.is_enabled = pmbus_regulator_is_enabled,
 | 
			
		||||
	.get_error_flags = pmbus_regulator_get_error_flags,
 | 
			
		||||
	.get_status = pmbus_regulator_get_status,
 | 
			
		||||
	.get_voltage = pmbus_regulator_get_voltage,
 | 
			
		||||
	.set_voltage = pmbus_regulator_set_voltage,
 | 
			
		||||
	.list_voltage = pmbus_regulator_list_voltage,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue