Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'iio-fixes-for-6.1d' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-next

Jonathan writes:

4th set of IIO fixes for 6.1

Single patch fixing a memory leak in an error path.
Fine to queue either for 6.2 if too late for 6.1

* tag 'iio-fixes-for-6.1d' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
iio: fix memory leak in iio_device_register_eventset()
dt-bindings: iio: adc: Remove the property "aspeed,trim-data-valid"
iio: adc: aspeed: Remove the trim valid dts property.
iio: core: Fix entry not deleted when iio_register_sw_trigger_type() fails
iio: accel: bma400: Fix memory leak in bma400_get_steps_reg()
iio: light: rpr0521: add missing Kconfig dependencies
iio: health: afe4404: Fix oob read in afe4404_[read|write]_raw
iio: health: afe4403: Fix oob read in afe4403_read_raw
iio: light: apds9960: fix wrong register for gesture gain

+34 -29
-7
Documentation/devicetree/bindings/iio/adc/aspeed,ast2600-adc.yaml
··· 62 62 description: 63 63 Inform the driver that last channel will be used to sensor battery. 64 64 65 - aspeed,trim-data-valid: 66 - type: boolean 67 - description: | 68 - The ADC reference voltage can be calibrated to obtain the trimming 69 - data which will be stored in otp. This property informs the driver that 70 - the data store in the otp is valid. 71 - 72 65 required: 73 66 - compatible 74 67 - reg
+3 -1
drivers/iio/accel/bma400_core.c
··· 805 805 806 806 ret = regmap_bulk_read(data->regmap, BMA400_STEP_CNT0_REG, 807 807 steps_raw, BMA400_STEP_RAW_LEN); 808 - if (ret) 808 + if (ret) { 809 + kfree(steps_raw); 809 810 return ret; 811 + } 810 812 *val = get_unaligned_le24(steps_raw); 811 813 kfree(steps_raw); 812 814 return IIO_VAL_INT;
+5 -6
drivers/iio/adc/aspeed_adc.c
··· 202 202 ((scu_otp) & 203 203 (data->model_data->trim_locate->field)) >> 204 204 __ffs(data->model_data->trim_locate->field); 205 + if (!trimming_val) 206 + trimming_val = 0x8; 205 207 } 206 208 dev_dbg(data->dev, 207 209 "trimming val = %d, offset = %08x, fields = %08x\n", ··· 565 563 if (ret) 566 564 return ret; 567 565 568 - if (of_find_property(data->dev->of_node, "aspeed,trim-data-valid", 569 - NULL)) { 570 - ret = aspeed_adc_set_trim_data(indio_dev); 571 - if (ret) 572 - return ret; 573 - } 566 + ret = aspeed_adc_set_trim_data(indio_dev); 567 + if (ret) 568 + return ret; 574 569 575 570 if (of_find_property(data->dev->of_node, "aspeed,battery-sensing", 576 571 NULL)) {
+3 -2
drivers/iio/health/afe4403.c
··· 245 245 int *val, int *val2, long mask) 246 246 { 247 247 struct afe4403_data *afe = iio_priv(indio_dev); 248 - unsigned int reg = afe4403_channel_values[chan->address]; 249 - unsigned int field = afe4403_channel_leds[chan->address]; 248 + unsigned int reg, field; 250 249 int ret; 251 250 252 251 switch (chan->type) { 253 252 case IIO_INTENSITY: 254 253 switch (mask) { 255 254 case IIO_CHAN_INFO_RAW: 255 + reg = afe4403_channel_values[chan->address]; 256 256 ret = afe4403_read(afe, reg, val); 257 257 if (ret) 258 258 return ret; ··· 262 262 case IIO_CURRENT: 263 263 switch (mask) { 264 264 case IIO_CHAN_INFO_RAW: 265 + field = afe4403_channel_leds[chan->address]; 265 266 ret = regmap_field_read(afe->fields[field], val); 266 267 if (ret) 267 268 return ret;
+7 -5
drivers/iio/health/afe4404.c
··· 250 250 int *val, int *val2, long mask) 251 251 { 252 252 struct afe4404_data *afe = iio_priv(indio_dev); 253 - unsigned int value_reg = afe4404_channel_values[chan->address]; 254 - unsigned int led_field = afe4404_channel_leds[chan->address]; 255 - unsigned int offdac_field = afe4404_channel_offdacs[chan->address]; 253 + unsigned int value_reg, led_field, offdac_field; 256 254 int ret; 257 255 258 256 switch (chan->type) { 259 257 case IIO_INTENSITY: 260 258 switch (mask) { 261 259 case IIO_CHAN_INFO_RAW: 260 + value_reg = afe4404_channel_values[chan->address]; 262 261 ret = regmap_read(afe->regmap, value_reg, val); 263 262 if (ret) 264 263 return ret; 265 264 return IIO_VAL_INT; 266 265 case IIO_CHAN_INFO_OFFSET: 266 + offdac_field = afe4404_channel_offdacs[chan->address]; 267 267 ret = regmap_field_read(afe->fields[offdac_field], val); 268 268 if (ret) 269 269 return ret; ··· 273 273 case IIO_CURRENT: 274 274 switch (mask) { 275 275 case IIO_CHAN_INFO_RAW: 276 + led_field = afe4404_channel_leds[chan->address]; 276 277 ret = regmap_field_read(afe->fields[led_field], val); 277 278 if (ret) 278 279 return ret; ··· 296 295 int val, int val2, long mask) 297 296 { 298 297 struct afe4404_data *afe = iio_priv(indio_dev); 299 - unsigned int led_field = afe4404_channel_leds[chan->address]; 300 - unsigned int offdac_field = afe4404_channel_offdacs[chan->address]; 298 + unsigned int led_field, offdac_field; 301 299 302 300 switch (chan->type) { 303 301 case IIO_INTENSITY: 304 302 switch (mask) { 305 303 case IIO_CHAN_INFO_OFFSET: 304 + offdac_field = afe4404_channel_offdacs[chan->address]; 306 305 return regmap_field_write(afe->fields[offdac_field], val); 307 306 } 308 307 break; 309 308 case IIO_CURRENT: 310 309 switch (mask) { 311 310 case IIO_CHAN_INFO_RAW: 311 + led_field = afe4404_channel_leds[chan->address]; 312 312 return regmap_field_write(afe->fields[led_field], val); 313 313 } 314 314 break;
+3 -1
drivers/iio/industrialio-event.c
··· 556 556 557 557 ret = iio_device_register_sysfs_group(indio_dev, &ev_int->group); 558 558 if (ret) 559 - goto error_free_setup_event_lines; 559 + goto error_free_group_attrs; 560 560 561 561 ev_int->ioctl_handler.ioctl = iio_event_ioctl; 562 562 iio_device_ioctl_handler_register(&iio_dev_opaque->indio_dev, ··· 564 564 565 565 return 0; 566 566 567 + error_free_group_attrs: 568 + kfree(ev_int->group.attrs); 567 569 error_free_setup_event_lines: 568 570 iio_free_chan_devattr_list(&ev_int->dev_attr_list); 569 571 kfree(ev_int);
+5 -1
drivers/iio/industrialio-sw-trigger.c
··· 58 58 59 59 t->group = configfs_register_default_group(iio_triggers_group, t->name, 60 60 &iio_trigger_type_group_type); 61 - if (IS_ERR(t->group)) 61 + if (IS_ERR(t->group)) { 62 + mutex_lock(&iio_trigger_types_lock); 63 + list_del(&t->list); 64 + mutex_unlock(&iio_trigger_types_lock); 62 65 ret = PTR_ERR(t->group); 66 + } 63 67 64 68 return ret; 65 69 }
+2
drivers/iio/light/Kconfig
··· 293 293 tristate "ROHM RPR0521 ALS and proximity sensor driver" 294 294 depends on I2C 295 295 select REGMAP_I2C 296 + select IIO_BUFFER 297 + select IIO_TRIGGERED_BUFFER 296 298 help 297 299 Say Y here if you want to build support for ROHM's RPR0521 298 300 ambient light and proximity sensor device.
+6 -6
drivers/iio/light/apds9960.c
··· 54 54 #define APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT 2 55 55 56 56 #define APDS9960_REG_CONFIG_2 0x90 57 - #define APDS9960_REG_CONFIG_2_GGAIN_MASK 0x60 58 - #define APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT 5 59 - 60 57 #define APDS9960_REG_ID 0x92 61 58 62 59 #define APDS9960_REG_STATUS 0x93 ··· 74 77 #define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT 6 75 78 76 79 #define APDS9960_REG_GCONF_2 0xa3 80 + #define APDS9960_REG_GCONF_2_GGAIN_MASK 0x60 81 + #define APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT 5 82 + 77 83 #define APDS9960_REG_GOFFSET_U 0xa4 78 84 #define APDS9960_REG_GOFFSET_D 0xa5 79 85 #define APDS9960_REG_GPULSE 0xa6 ··· 400 400 } 401 401 402 402 ret = regmap_update_bits(data->regmap, 403 - APDS9960_REG_CONFIG_2, 404 - APDS9960_REG_CONFIG_2_GGAIN_MASK, 405 - idx << APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT); 403 + APDS9960_REG_GCONF_2, 404 + APDS9960_REG_GCONF_2_GGAIN_MASK, 405 + idx << APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT); 406 406 if (!ret) 407 407 data->pxs_gain = idx; 408 408 mutex_unlock(&data->lock);