Pull hwmon fixes from Guenter Roeck: - ltc2992, adm1266: Set missing can_sleep flag - tmp512/tmp513: Drop of_match_ptr for ID table to fix build with !CONFIG_OF - ucd90320: Fix back-to-back access problem - ina3221: Fix bad error return from probe function - xgene: Fix use-after-free bug in remove function - adt7475: Fix hysteresis register bit masks, and fix association of 'smoothing' attributes * tag 'hwmon-for-v6.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (ltc2992) Set `can_sleep` flag for GPIO chip hwmon: (adm1266) Set `can_sleep` flag for GPIO chip hwmon: tmp512: drop of_match_ptr for ID table hwmon: (ucd90320) Add minimum delay between bus accesses hwmon: (ina3221) return prober error code hwmon: (xgene) Fix use after free bug in xgene_hwmon_remove due to race condition hwmon: (adt7475) Fix masking of hysteresis registers hwmon: (adt7475) Display smoothing attributes in correct order
Unified · Split
| @@ -488,10 +488,10 @@ static ssize_t temp_store(struct device *dev, struct device_attribute *attr, · 487 unmodified lines | ||
| 488 | 488 | val = (temp - val) / 1000; |
| 489 | 489 | |
| 490 | 490 | if (sattr->index != 1) { |
| 491 | − data->temp[HYSTERSIS][sattr->index] &= 0xF0; | |
| 491 | + data->temp[HYSTERSIS][sattr->index] &= 0x0F; | |
| 492 | 492 | data->temp[HYSTERSIS][sattr->index] |= (val & 0xF) << 4; |
| 493 | 493 | } else { |
| 494 | − data->temp[HYSTERSIS][sattr->index] &= 0x0F; | |
| 494 | + data->temp[HYSTERSIS][sattr->index] &= 0xF0; | |
| 495 | 495 | data->temp[HYSTERSIS][sattr->index] |= (val & 0xF); |
| 496 | 496 | } |
| 497 | 497 | |
| @@ -556,11 +556,11 @@ static ssize_t temp_st_show(struct device *dev, struct device_attribute *attr, · 58 unmodified lines | ||
| 556 | 556 | val = data->enh_acoustics[0] & 0xf; |
| 557 | 557 | break; |
| 558 | 558 | case 1: |
| 559 | − val = (data->enh_acoustics[1] >> 4) & 0xf; | |
| 559 | + val = data->enh_acoustics[1] & 0xf; | |
| 560 | 560 | break; |
| 561 | 561 | case 2: |
| 562 | 562 | default: |
| 563 | − val = data->enh_acoustics[1] & 0xf; | |
| 563 | + val = (data->enh_acoustics[1] >> 4) & 0xf; | |
| 564 | 564 | break; |
| 565 | 565 | } |
| 566 | 566 | |
| @@ -772,7 +772,7 @@ static int ina3221_probe_child_from_dt(struct device *dev, · 771 unmodified lines | ||
| 772 | 772 | return ret; |
| 773 | 773 | } else if (val > INA3221_CHANNEL3) { |
| 774 | 774 | dev_err(dev, "invalid reg %d of %pOFn\n", val, child); |
| 775 | − return ret; | |
| 775 | + return -EINVAL; | |
| 776 | 776 | } |
| 777 | 777 | |
| 778 | 778 | input = &ina->inputs[val]; |
| @@ -323,6 +323,7 @@ static int ltc2992_config_gpio(struct ltc2992_state *st) · 322 unmodified lines | ||
| 323 | 323 | st->gc.label = name; |
| 324 | 324 | st->gc.parent = &st->client->dev; |
| 325 | 325 | st->gc.owner = THIS_MODULE; |
| 326 | + st->gc.can_sleep = true; | |
| 326 | 327 | st->gc.base = -1; |
| 327 | 328 | st->gc.names = st->gpio_names; |
| 328 | 329 | st->gc.ngpio = ARRAY_SIZE(st->gpio_names); |
| @@ -301,6 +301,7 @@ static int adm1266_config_gpio(struct adm1266_data *data) · 300 unmodified lines | ||
| 301 | 301 | data->gc.label = name; |
| 302 | 302 | data->gc.parent = &data->client->dev; |
| 303 | 303 | data->gc.owner = THIS_MODULE; |
| 304 | + data->gc.can_sleep = true; | |
| 304 | 305 | data->gc.base = -1; |
| 305 | 306 | data->gc.names = data->gpio_names; |
| 306 | 307 | data->gc.ngpio = ARRAY_SIZE(data->gpio_names); |
| @@ -7,6 +7,7 @@ · 6 unmodified lines | ||
| 7 | 7 | */ |
| 8 | 8 | |
| 9 | 9 | #include <linux/debugfs.h> |
| 10 | +#include <linux/delay.h> | |
| 10 | 11 | #include <linux/kernel.h> |
| 11 | 12 | #include <linux/module.h> |
| 12 | 13 | #include <linux/of_device.h> |
| @@ -16,6 +17,7 @@ · 3 unmodified lines | ||
| 16 | 17 | #include <linux/i2c.h> |
| 17 | 18 | #include <linux/pmbus.h> |
| 18 | 19 | #include <linux/gpio/driver.h> |
| 20 | +#include <linux/timekeeping.h> | |
| 19 | 21 | #include "pmbus.h" |
| 20 | 22 | |
| 21 | 23 | enum chips { ucd9000, ucd90120, ucd90124, ucd90160, ucd90320, ucd9090, |
| @@ -65,6 +67,7 @@ struct ucd9000_data { · 43 unmodified lines | ||
| 65 | 67 | struct gpio_chip gpio; |
| 66 | 68 | #endif |
| 67 | 69 | struct dentry *debugfs; |
| 70 | + ktime_t write_time; | |
| 68 | 71 | }; |
| 69 | 72 | #define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info) |
| 70 | 73 | |
| @@ -73,6 +76,73 @@ struct ucd9000_debugfs_entry { · 2 unmodified lines | ||
| 73 | 76 | u8 index; |
| 74 | 77 | }; |
| 75 | 78 | |
| 79 | +/* | |
| 80 | + * It has been observed that the UCD90320 randomly fails register access when | |
| 81 | + * doing another access right on the back of a register write. To mitigate this | |
| 82 | + * make sure that there is a minimum delay between a write access and the | |
| 83 | + * following access. The 250us is based on experimental data. At a delay of | |
| 84 | + * 200us the issue seems to go away. Add a bit of extra margin to allow for | |
| 85 | + * system to system differences. | |
| 86 | + */ | |
| 87 | +#define UCD90320_WAIT_DELAY_US 250 | |
| 88 | + | |
| 89 | +static inline void ucd90320_wait(const struct ucd9000_data *data) | |
| 90 | +{ | |
| 91 | + s64 delta = ktime_us_delta(ktime_get(), data->write_time); | |
| 92 | + | |
| 93 | + if (delta < UCD90320_WAIT_DELAY_US) | |
| 94 | + udelay(UCD90320_WAIT_DELAY_US - delta); | |
| 95 | +} | |
| 96 | + | |
| 97 | +static int ucd90320_read_word_data(struct i2c_client *client, int page, | |
| 98 | + int phase, int reg) | |
| 99 | +{ | |
| 100 | + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); | |
| 101 | + struct ucd9000_data *data = to_ucd9000_data(info); | |
| 102 | + | |
| 103 | + if (reg >= PMBUS_VIRT_BASE) | |
| 104 | + return -ENXIO; | |
| 105 | + | |
| 106 | + ucd90320_wait(data); | |
| 107 | + return pmbus_read_word_data(client, page, phase, reg); | |
| 108 | +} | |
| 109 | + | |
| 110 | +static int ucd90320_read_byte_data(struct i2c_client *client, int page, int reg) | |
| 111 | +{ | |
| 112 | + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); | |
| 113 | + struct ucd9000_data *data = to_ucd9000_data(info); | |
| 114 | + | |
| 115 | + ucd90320_wait(data); | |
| 116 | + return pmbus_read_byte_data(client, page, reg); | |
| 117 | +} | |
| 118 | + | |
| 119 | +static int ucd90320_write_word_data(struct i2c_client *client, int page, | |
| 120 | + int reg, u16 word) | |
| 121 | +{ | |
| 122 | + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); | |
| 123 | + struct ucd9000_data *data = to_ucd9000_data(info); | |
| 124 | + int ret; | |
| 125 | + | |
| 126 | + ucd90320_wait(data); | |
| 127 | + ret = pmbus_write_word_data(client, page, reg, word); | |
| 128 | + data->write_time = ktime_get(); | |
| 129 | + | |
| 130 | + return ret; | |
| 131 | +} | |
| 132 | + | |
| 133 | +static int ucd90320_write_byte(struct i2c_client *client, int page, u8 value) | |
| 134 | +{ | |
| 135 | + const struct pmbus_driver_info *info = pmbus_get_driver_info(client); | |
| 136 | + struct ucd9000_data *data = to_ucd9000_data(info); | |
| 137 | + int ret; | |
| 138 | + | |
| 139 | + ucd90320_wait(data); | |
| 140 | + ret = pmbus_write_byte(client, page, value); | |
| 141 | + data->write_time = ktime_get(); | |
| 142 | + | |
| 143 | + return ret; | |
| 144 | +} | |
| 145 | + | |
| 76 | 146 | static int ucd9000_get_fan_config(struct i2c_client *client, int fan) |
| 77 | 147 | { |
| 78 | 148 | int fan_config = 0; |
| @@ -598,6 +668,11 @@ static int ucd9000_probe(struct i2c_client *client) · 519 unmodified lines | ||
| 598 | 668 | info->read_byte_data = ucd9000_read_byte_data; |
| 599 | 669 | info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12 |
| 600 | 670 | | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34; |
| 671 | + } else if (mid->driver_data == ucd90320) { | |
| 672 | + info->read_byte_data = ucd90320_read_byte_data; | |
| 673 | + info->read_word_data = ucd90320_read_word_data; | |
| 674 | + info->write_byte = ucd90320_write_byte; | |
| 675 | + info->write_word_data = ucd90320_write_word_data; | |
| 601 | 676 | } |
| 602 | 677 | |
| 603 | 678 | ucd9000_probe_gpio(client, mid, data); |
| @@ -758,7 +758,7 @@ static int tmp51x_probe(struct i2c_client *client) · 757 unmodified lines | ||
| 758 | 758 | static struct i2c_driver tmp51x_driver = { |
| 759 | 759 | .driver = { |
| 760 | 760 | .name = "tmp51x", |
| 761 | − .of_match_table = of_match_ptr(tmp51x_of_match), | |
| 761 | + .of_match_table = tmp51x_of_match, | |
| 762 | 762 | }, |
| 763 | 763 | .probe_new = tmp51x_probe, |
| 764 | 764 | .id_table = tmp51x_id, |
| @@ -761,6 +761,7 @@ static int xgene_hwmon_remove(struct platform_device *pdev) · 760 unmodified lines | ||
| 761 | 761 | { |
| 762 | 762 | struct xgene_hwmon_dev *ctx = platform_get_drvdata(pdev); |
| 763 | 763 | |
| 764 | + cancel_work_sync(&ctx->workq); | |
| 764 | 765 | hwmon_device_unregister(ctx->hwmon_dev); |
| 765 | 766 | kfifo_free(&ctx->async_msg_fifo); |
| 766 | 767 | if (acpi_disabled) |