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

iio: hid-sensors: bind IIO channels alloc to device object

Some HID drivers use devm_kmemdup() already to clone the template IIO
channels information and update it.
However, there are still some drivers that kmemdup() and kfree() the
channels.

This change converts them to use devm_kmemdup() and bind the life-time of
this allocated object to the parent device object (in these drivers).

Signed-off-by: Alexandru Ardelean <aardelean@deviqon.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Link: https://lore.kernel.org/r/20210630123029.759609-1-aardelean@deviqon.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
8b2ac516 e73f0f0e

+24 -41
+4 -6
drivers/iio/accel/hid-sensor-accel-3d.c
··· 367 367 dev_err(&pdev->dev, "failed to setup common attributes\n"); 368 368 return ret; 369 369 } 370 - indio_dev->channels = kmemdup(channel_spec, channel_size, GFP_KERNEL); 370 + indio_dev->channels = devm_kmemdup(&pdev->dev, channel_spec, 371 + channel_size, GFP_KERNEL); 371 372 372 373 if (!indio_dev->channels) { 373 374 dev_err(&pdev->dev, "failed to duplicate channels\n"); ··· 379 378 hsdev->usage, accel_state); 380 379 if (ret) { 381 380 dev_err(&pdev->dev, "failed to setup attributes\n"); 382 - goto error_free_dev_mem; 381 + return ret; 383 382 } 384 383 385 384 indio_dev->info = &accel_3d_info; ··· 392 391 &accel_state->common_attributes); 393 392 if (ret < 0) { 394 393 dev_err(&pdev->dev, "trigger setup failed\n"); 395 - goto error_free_dev_mem; 394 + return ret; 396 395 } 397 396 398 397 ret = iio_device_register(indio_dev); ··· 417 416 iio_device_unregister(indio_dev); 418 417 error_remove_trigger: 419 418 hid_sensor_remove_trigger(indio_dev, &accel_state->common_attributes); 420 - error_free_dev_mem: 421 - kfree(indio_dev->channels); 422 419 return ret; 423 420 } 424 421 ··· 430 431 sensor_hub_remove_callback(hsdev, hsdev->usage); 431 432 iio_device_unregister(indio_dev); 432 433 hid_sensor_remove_trigger(indio_dev, &accel_state->common_attributes); 433 - kfree(indio_dev->channels); 434 434 435 435 return 0; 436 436 }
+4 -7
drivers/iio/gyro/hid-sensor-gyro-3d.c
··· 303 303 return ret; 304 304 } 305 305 306 - indio_dev->channels = kmemdup(gyro_3d_channels, 307 - sizeof(gyro_3d_channels), GFP_KERNEL); 306 + indio_dev->channels = devm_kmemdup(&pdev->dev, gyro_3d_channels, 307 + sizeof(gyro_3d_channels), GFP_KERNEL); 308 308 if (!indio_dev->channels) { 309 309 dev_err(&pdev->dev, "failed to duplicate channels\n"); 310 310 return -ENOMEM; ··· 315 315 HID_USAGE_SENSOR_GYRO_3D, gyro_state); 316 316 if (ret) { 317 317 dev_err(&pdev->dev, "failed to setup attributes\n"); 318 - goto error_free_dev_mem; 318 + return ret; 319 319 } 320 320 321 321 indio_dev->num_channels = ARRAY_SIZE(gyro_3d_channels); ··· 329 329 &gyro_state->common_attributes); 330 330 if (ret < 0) { 331 331 dev_err(&pdev->dev, "trigger setup failed\n"); 332 - goto error_free_dev_mem; 332 + return ret; 333 333 } 334 334 335 335 ret = iio_device_register(indio_dev); ··· 354 354 iio_device_unregister(indio_dev); 355 355 error_remove_trigger: 356 356 hid_sensor_remove_trigger(indio_dev, &gyro_state->common_attributes); 357 - error_free_dev_mem: 358 - kfree(indio_dev->channels); 359 357 return ret; 360 358 } 361 359 ··· 367 369 sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_GYRO_3D); 368 370 iio_device_unregister(indio_dev); 369 371 hid_sensor_remove_trigger(indio_dev, &gyro_state->common_attributes); 370 - kfree(indio_dev->channels); 371 372 372 373 return 0; 373 374 }
+4 -7
drivers/iio/light/hid-sensor-als.c
··· 294 294 return ret; 295 295 } 296 296 297 - indio_dev->channels = kmemdup(als_channels, 298 - sizeof(als_channels), GFP_KERNEL); 297 + indio_dev->channels = devm_kmemdup(&pdev->dev, als_channels, 298 + sizeof(als_channels), GFP_KERNEL); 299 299 if (!indio_dev->channels) { 300 300 dev_err(&pdev->dev, "failed to duplicate channels\n"); 301 301 return -ENOMEM; ··· 306 306 HID_USAGE_SENSOR_ALS, als_state); 307 307 if (ret) { 308 308 dev_err(&pdev->dev, "failed to setup attributes\n"); 309 - goto error_free_dev_mem; 309 + return ret; 310 310 } 311 311 312 312 indio_dev->num_channels = ··· 321 321 &als_state->common_attributes); 322 322 if (ret < 0) { 323 323 dev_err(&pdev->dev, "trigger setup failed\n"); 324 - goto error_free_dev_mem; 324 + return ret; 325 325 } 326 326 327 327 ret = iio_device_register(indio_dev); ··· 346 346 iio_device_unregister(indio_dev); 347 347 error_remove_trigger: 348 348 hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes); 349 - error_free_dev_mem: 350 - kfree(indio_dev->channels); 351 349 return ret; 352 350 } 353 351 ··· 359 361 sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ALS); 360 362 iio_device_unregister(indio_dev); 361 363 hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes); 362 - kfree(indio_dev->channels); 363 364 364 365 return 0; 365 366 }
+4 -7
drivers/iio/light/hid-sensor-prox.c
··· 253 253 return ret; 254 254 } 255 255 256 - indio_dev->channels = kmemdup(prox_channels, sizeof(prox_channels), 257 - GFP_KERNEL); 256 + indio_dev->channels = devm_kmemdup(&pdev->dev, prox_channels, 257 + sizeof(prox_channels), GFP_KERNEL); 258 258 if (!indio_dev->channels) { 259 259 dev_err(&pdev->dev, "failed to duplicate channels\n"); 260 260 return -ENOMEM; ··· 265 265 HID_USAGE_SENSOR_PROX, prox_state); 266 266 if (ret) { 267 267 dev_err(&pdev->dev, "failed to setup attributes\n"); 268 - goto error_free_dev_mem; 268 + return ret; 269 269 } 270 270 271 271 indio_dev->num_channels = ARRAY_SIZE(prox_channels); ··· 279 279 &prox_state->common_attributes); 280 280 if (ret) { 281 281 dev_err(&pdev->dev, "trigger setup failed\n"); 282 - goto error_free_dev_mem; 282 + return ret; 283 283 } 284 284 285 285 ret = iio_device_register(indio_dev); ··· 304 304 iio_device_unregister(indio_dev); 305 305 error_remove_trigger: 306 306 hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes); 307 - error_free_dev_mem: 308 - kfree(indio_dev->channels); 309 307 return ret; 310 308 } 311 309 ··· 317 319 sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_PROX); 318 320 iio_device_unregister(indio_dev); 319 321 hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes); 320 - kfree(indio_dev->channels); 321 322 322 323 return 0; 323 324 }
+4 -7
drivers/iio/orientation/hid-sensor-incl-3d.c
··· 326 326 return ret; 327 327 } 328 328 329 - indio_dev->channels = kmemdup(incl_3d_channels, 330 - sizeof(incl_3d_channels), GFP_KERNEL); 329 + indio_dev->channels = devm_kmemdup(&pdev->dev, incl_3d_channels, 330 + sizeof(incl_3d_channels), GFP_KERNEL); 331 331 if (!indio_dev->channels) { 332 332 dev_err(&pdev->dev, "failed to duplicate channels\n"); 333 333 return -ENOMEM; ··· 339 339 incl_state); 340 340 if (ret) { 341 341 dev_err(&pdev->dev, "failed to setup attributes\n"); 342 - goto error_free_dev_mem; 342 + return ret; 343 343 } 344 344 345 345 indio_dev->num_channels = ARRAY_SIZE(incl_3d_channels); ··· 353 353 &incl_state->common_attributes); 354 354 if (ret) { 355 355 dev_err(&pdev->dev, "trigger setup failed\n"); 356 - goto error_free_dev_mem; 356 + return ret; 357 357 } 358 358 359 359 ret = iio_device_register(indio_dev); ··· 379 379 iio_device_unregister(indio_dev); 380 380 error_remove_trigger: 381 381 hid_sensor_remove_trigger(indio_dev, &incl_state->common_attributes); 382 - error_free_dev_mem: 383 - kfree(indio_dev->channels); 384 382 return ret; 385 383 } 386 384 ··· 392 394 sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_INCLINOMETER_3D); 393 395 iio_device_unregister(indio_dev); 394 396 hid_sensor_remove_trigger(indio_dev, &incl_state->common_attributes); 395 - kfree(indio_dev->channels); 396 397 397 398 return 0; 398 399 }
+4 -7
drivers/iio/pressure/hid-sensor-press.c
··· 259 259 return ret; 260 260 } 261 261 262 - indio_dev->channels = kmemdup(press_channels, sizeof(press_channels), 263 - GFP_KERNEL); 262 + indio_dev->channels = devm_kmemdup(&pdev->dev, press_channels, 263 + sizeof(press_channels), GFP_KERNEL); 264 264 if (!indio_dev->channels) { 265 265 dev_err(&pdev->dev, "failed to duplicate channels\n"); 266 266 return -ENOMEM; ··· 271 271 HID_USAGE_SENSOR_PRESSURE, press_state); 272 272 if (ret) { 273 273 dev_err(&pdev->dev, "failed to setup attributes\n"); 274 - goto error_free_dev_mem; 274 + return ret; 275 275 } 276 276 277 277 indio_dev->num_channels = ··· 286 286 &press_state->common_attributes); 287 287 if (ret) { 288 288 dev_err(&pdev->dev, "trigger setup failed\n"); 289 - goto error_free_dev_mem; 289 + return ret; 290 290 } 291 291 292 292 ret = iio_device_register(indio_dev); ··· 311 311 iio_device_unregister(indio_dev); 312 312 error_remove_trigger: 313 313 hid_sensor_remove_trigger(indio_dev, &press_state->common_attributes); 314 - error_free_dev_mem: 315 - kfree(indio_dev->channels); 316 314 return ret; 317 315 } 318 316 ··· 324 326 sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_PRESSURE); 325 327 iio_device_unregister(indio_dev); 326 328 hid_sensor_remove_trigger(indio_dev, &press_state->common_attributes); 327 - kfree(indio_dev->channels); 328 329 329 330 return 0; 330 331 }