mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
hwmon: (pmbus/core) Notify hwmon events
Notify hwmon events using the pmbus irq handler. Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Signed-off-by: Naresh Solanki <naresh.solanki@9elements.com> Link: https://lore.kernel.org/r/20230301164434.1928237-4-Naresh.Solanki@9elements.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
221819ca4c
commit
f469bde9af
@ -2761,7 +2761,35 @@ static int __maybe_unused pmbus_is_enabled(struct device *dev, u8 page)
|
||||
return !!(ret & PB_OPERATION_CONTROL_ON);
|
||||
}
|
||||
|
||||
static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flags)
|
||||
#define to_dev_attr(_dev_attr) \
|
||||
container_of(_dev_attr, struct device_attribute, attr)
|
||||
|
||||
static void pmbus_notify(struct pmbus_data *data, int page, int reg, int flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < data->num_attributes; i++) {
|
||||
struct device_attribute *da = to_dev_attr(data->group.attrs[i]);
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
int index = attr->index;
|
||||
u16 smask = pb_index_to_mask(index);
|
||||
u8 spage = pb_index_to_page(index);
|
||||
u16 sreg = pb_index_to_reg(index);
|
||||
|
||||
if (reg == sreg && page == spage && (smask & flags)) {
|
||||
dev_dbg(data->dev, "sysfs notify: %s", da->attr.name);
|
||||
sysfs_notify(&data->dev->kobj, NULL, da->attr.name);
|
||||
kobject_uevent(&data->dev->kobj, KOBJ_CHANGE);
|
||||
flags &= ~smask;
|
||||
}
|
||||
|
||||
if (!flags)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flags,
|
||||
bool notify)
|
||||
{
|
||||
int i, status;
|
||||
const struct pmbus_status_category *cat;
|
||||
@ -2785,6 +2813,10 @@ static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flag
|
||||
if (status & bit->pflag)
|
||||
*flags |= bit->rflag;
|
||||
}
|
||||
|
||||
if (notify && status)
|
||||
pmbus_notify(data, page, cat->reg, status);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2828,12 +2860,13 @@ static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flag
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flags)
|
||||
static int __maybe_unused pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flags,
|
||||
bool notify)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
ret = _pmbus_get_flags(data, page, flags);
|
||||
ret = _pmbus_get_flags(data, page, flags, notify);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return ret;
|
||||
@ -2878,7 +2911,7 @@ static int pmbus_regulator_get_error_flags(struct regulator_dev *rdev, unsigned
|
||||
struct i2c_client *client = to_i2c_client(dev->parent);
|
||||
struct pmbus_data *data = i2c_get_clientdata(client);
|
||||
|
||||
return pmbus_get_flags(data, rdev_get_id(rdev), flags);
|
||||
return pmbus_get_flags(data, rdev_get_id(rdev), flags, false);
|
||||
}
|
||||
|
||||
static int pmbus_regulator_get_status(struct regulator_dev *rdev)
|
||||
@ -3114,9 +3147,10 @@ static irqreturn_t pmbus_fault_handler(int irq, void *pdata)
|
||||
{
|
||||
struct pmbus_data *data = pdata;
|
||||
struct i2c_client *client = to_i2c_client(data->dev);
|
||||
|
||||
int i, status;
|
||||
mutex_lock(&data->update_lock);
|
||||
/* TODO: Check status flag & notify hwmon events */
|
||||
for (i = 0; i < data->info->pages; i++)
|
||||
_pmbus_get_flags(data, i, &status, true);
|
||||
|
||||
pmbus_clear_faults(client);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user