Merge tag 'hwmon-for-v5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull hwmon fixes from Guenter Roeck: - Fix a couple of inconsistencies and locking problems in pmbus driver - Register with thermal subsystem only on systems supporting devicetree * tag 'hwmon-for-v5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (pmbus/core) Treat parameters as paged if on multiple pages hwmon: (pmbus/core) mutex_lock write in pmbus_set_samples hwmon: (core) add thermal sensors only if dev->of_node is present
This commit is contained in:
@@ -636,7 +636,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
|
|||||||
if (err)
|
if (err)
|
||||||
goto free_hwmon;
|
goto free_hwmon;
|
||||||
|
|
||||||
if (dev && chip && chip->ops->read &&
|
if (dev && dev->of_node && chip && chip->ops->read &&
|
||||||
chip->info[0]->type == hwmon_chip &&
|
chip->info[0]->type == hwmon_chip &&
|
||||||
(chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
|
(chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
|
||||||
const struct hwmon_channel_info **info = chip->info;
|
const struct hwmon_channel_info **info = chip->info;
|
||||||
|
|||||||
@@ -1217,7 +1217,8 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
|
|||||||
const struct pmbus_driver_info *info,
|
const struct pmbus_driver_info *info,
|
||||||
const char *name,
|
const char *name,
|
||||||
int index, int page,
|
int index, int page,
|
||||||
const struct pmbus_sensor_attr *attr)
|
const struct pmbus_sensor_attr *attr,
|
||||||
|
bool paged)
|
||||||
{
|
{
|
||||||
struct pmbus_sensor *base;
|
struct pmbus_sensor *base;
|
||||||
bool upper = !!(attr->gbit & 0xff00); /* need to check STATUS_WORD */
|
bool upper = !!(attr->gbit & 0xff00); /* need to check STATUS_WORD */
|
||||||
@@ -1225,7 +1226,7 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
|
|||||||
|
|
||||||
if (attr->label) {
|
if (attr->label) {
|
||||||
ret = pmbus_add_label(data, name, index, attr->label,
|
ret = pmbus_add_label(data, name, index, attr->label,
|
||||||
attr->paged ? page + 1 : 0);
|
paged ? page + 1 : 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1258,6 +1259,30 @@ static int pmbus_add_sensor_attrs_one(struct i2c_client *client,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info,
|
||||||
|
const struct pmbus_sensor_attr *attr)
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
|
||||||
|
if (attr->paged)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some attributes may be present on more than one page despite
|
||||||
|
* not being marked with the paged attribute. If that is the case,
|
||||||
|
* then treat the sensor as being paged and add the page suffix to the
|
||||||
|
* attribute name.
|
||||||
|
* We don't just add the paged attribute to all such attributes, in
|
||||||
|
* order to maintain the un-suffixed labels in the case where the
|
||||||
|
* attribute is only on page 0.
|
||||||
|
*/
|
||||||
|
for (p = 1; p < info->pages; p++) {
|
||||||
|
if (info->func[p] & attr->func)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static int pmbus_add_sensor_attrs(struct i2c_client *client,
|
static int pmbus_add_sensor_attrs(struct i2c_client *client,
|
||||||
struct pmbus_data *data,
|
struct pmbus_data *data,
|
||||||
const char *name,
|
const char *name,
|
||||||
@@ -1271,14 +1296,15 @@ static int pmbus_add_sensor_attrs(struct i2c_client *client,
|
|||||||
index = 1;
|
index = 1;
|
||||||
for (i = 0; i < nattrs; i++) {
|
for (i = 0; i < nattrs; i++) {
|
||||||
int page, pages;
|
int page, pages;
|
||||||
|
bool paged = pmbus_sensor_is_paged(info, attrs);
|
||||||
|
|
||||||
pages = attrs->paged ? info->pages : 1;
|
pages = paged ? info->pages : 1;
|
||||||
for (page = 0; page < pages; page++) {
|
for (page = 0; page < pages; page++) {
|
||||||
if (!(info->func[page] & attrs->func))
|
if (!(info->func[page] & attrs->func))
|
||||||
continue;
|
continue;
|
||||||
ret = pmbus_add_sensor_attrs_one(client, data, info,
|
ret = pmbus_add_sensor_attrs_one(client, data, info,
|
||||||
name, index, page,
|
name, index, page,
|
||||||
attrs);
|
attrs, paged);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
index++;
|
index++;
|
||||||
@@ -1942,11 +1968,14 @@ static ssize_t pmbus_set_samples(struct device *dev,
|
|||||||
long val;
|
long val;
|
||||||
struct i2c_client *client = to_i2c_client(dev->parent);
|
struct i2c_client *client = to_i2c_client(dev->parent);
|
||||||
struct pmbus_samples_reg *reg = to_samples_reg(devattr);
|
struct pmbus_samples_reg *reg = to_samples_reg(devattr);
|
||||||
|
struct pmbus_data *data = i2c_get_clientdata(client);
|
||||||
|
|
||||||
if (kstrtol(buf, 0, &val) < 0)
|
if (kstrtol(buf, 0, &val) < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
ret = _pmbus_write_word_data(client, reg->page, reg->attr->reg, val);
|
ret = _pmbus_write_word_data(client, reg->page, reg->attr->reg, val);
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
|
||||||
return ret ? : count;
|
return ret ? : count;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user