Commit 8b2ac516 authored by Alexandru Ardelean's avatar Alexandru Ardelean Committed by Jonathan Cameron
Browse files

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: default avatarAlexandru Ardelean <aardelean@deviqon.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Link: https://lore.kernel.org/r/20210630123029.759609-1-aardelean@deviqon.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent e73f0f0e
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -367,7 +367,8 @@ static int hid_accel_3d_probe(struct platform_device *pdev)
		dev_err(&pdev->dev, "failed to setup common attributes\n");
		return ret;
	}
	indio_dev->channels = kmemdup(channel_spec, channel_size, GFP_KERNEL);
	indio_dev->channels = devm_kmemdup(&pdev->dev, channel_spec,
					   channel_size, GFP_KERNEL);

	if (!indio_dev->channels) {
		dev_err(&pdev->dev, "failed to duplicate channels\n");
@@ -378,7 +379,7 @@ static int hid_accel_3d_probe(struct platform_device *pdev)
				hsdev->usage, accel_state);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup attributes\n");
		goto error_free_dev_mem;
		return ret;
	}

	indio_dev->info = &accel_3d_info;
@@ -391,7 +392,7 @@ static int hid_accel_3d_probe(struct platform_device *pdev)
					&accel_state->common_attributes);
	if (ret < 0) {
		dev_err(&pdev->dev, "trigger setup failed\n");
		goto error_free_dev_mem;
		return ret;
	}

	ret = iio_device_register(indio_dev);
@@ -416,8 +417,6 @@ static int hid_accel_3d_probe(struct platform_device *pdev)
	iio_device_unregister(indio_dev);
error_remove_trigger:
	hid_sensor_remove_trigger(indio_dev, &accel_state->common_attributes);
error_free_dev_mem:
	kfree(indio_dev->channels);
	return ret;
}

@@ -431,7 +430,6 @@ static int hid_accel_3d_remove(struct platform_device *pdev)
	sensor_hub_remove_callback(hsdev, hsdev->usage);
	iio_device_unregister(indio_dev);
	hid_sensor_remove_trigger(indio_dev, &accel_state->common_attributes);
	kfree(indio_dev->channels);

	return 0;
}
+4 −7
Original line number Diff line number Diff line
@@ -303,7 +303,7 @@ static int hid_gyro_3d_probe(struct platform_device *pdev)
		return ret;
	}

	indio_dev->channels = kmemdup(gyro_3d_channels,
	indio_dev->channels = devm_kmemdup(&pdev->dev, gyro_3d_channels,
					   sizeof(gyro_3d_channels), GFP_KERNEL);
	if (!indio_dev->channels) {
		dev_err(&pdev->dev, "failed to duplicate channels\n");
@@ -315,7 +315,7 @@ static int hid_gyro_3d_probe(struct platform_device *pdev)
				   HID_USAGE_SENSOR_GYRO_3D, gyro_state);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup attributes\n");
		goto error_free_dev_mem;
		return ret;
	}

	indio_dev->num_channels = ARRAY_SIZE(gyro_3d_channels);
@@ -329,7 +329,7 @@ static int hid_gyro_3d_probe(struct platform_device *pdev)
					&gyro_state->common_attributes);
	if (ret < 0) {
		dev_err(&pdev->dev, "trigger setup failed\n");
		goto error_free_dev_mem;
		return ret;
	}

	ret = iio_device_register(indio_dev);
@@ -354,8 +354,6 @@ static int hid_gyro_3d_probe(struct platform_device *pdev)
	iio_device_unregister(indio_dev);
error_remove_trigger:
	hid_sensor_remove_trigger(indio_dev, &gyro_state->common_attributes);
error_free_dev_mem:
	kfree(indio_dev->channels);
	return ret;
}

@@ -369,7 +367,6 @@ static int hid_gyro_3d_remove(struct platform_device *pdev)
	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_GYRO_3D);
	iio_device_unregister(indio_dev);
	hid_sensor_remove_trigger(indio_dev, &gyro_state->common_attributes);
	kfree(indio_dev->channels);

	return 0;
}
+4 −7
Original line number Diff line number Diff line
@@ -294,7 +294,7 @@ static int hid_als_probe(struct platform_device *pdev)
		return ret;
	}

	indio_dev->channels = kmemdup(als_channels,
	indio_dev->channels = devm_kmemdup(&pdev->dev, als_channels,
					   sizeof(als_channels), GFP_KERNEL);
	if (!indio_dev->channels) {
		dev_err(&pdev->dev, "failed to duplicate channels\n");
@@ -306,7 +306,7 @@ static int hid_als_probe(struct platform_device *pdev)
			       HID_USAGE_SENSOR_ALS, als_state);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup attributes\n");
		goto error_free_dev_mem;
		return ret;
	}

	indio_dev->num_channels =
@@ -321,7 +321,7 @@ static int hid_als_probe(struct platform_device *pdev)
				&als_state->common_attributes);
	if (ret < 0) {
		dev_err(&pdev->dev, "trigger setup failed\n");
		goto error_free_dev_mem;
		return ret;
	}

	ret = iio_device_register(indio_dev);
@@ -346,8 +346,6 @@ static int hid_als_probe(struct platform_device *pdev)
	iio_device_unregister(indio_dev);
error_remove_trigger:
	hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes);
error_free_dev_mem:
	kfree(indio_dev->channels);
	return ret;
}

@@ -361,7 +359,6 @@ static int hid_als_remove(struct platform_device *pdev)
	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ALS);
	iio_device_unregister(indio_dev);
	hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes);
	kfree(indio_dev->channels);

	return 0;
}
+4 −7
Original line number Diff line number Diff line
@@ -253,8 +253,8 @@ static int hid_prox_probe(struct platform_device *pdev)
		return ret;
	}

	indio_dev->channels = kmemdup(prox_channels, sizeof(prox_channels),
				      GFP_KERNEL);
	indio_dev->channels = devm_kmemdup(&pdev->dev, prox_channels,
					   sizeof(prox_channels), GFP_KERNEL);
	if (!indio_dev->channels) {
		dev_err(&pdev->dev, "failed to duplicate channels\n");
		return -ENOMEM;
@@ -265,7 +265,7 @@ static int hid_prox_probe(struct platform_device *pdev)
				HID_USAGE_SENSOR_PROX, prox_state);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup attributes\n");
		goto error_free_dev_mem;
		return ret;
	}

	indio_dev->num_channels = ARRAY_SIZE(prox_channels);
@@ -279,7 +279,7 @@ static int hid_prox_probe(struct platform_device *pdev)
				&prox_state->common_attributes);
	if (ret) {
		dev_err(&pdev->dev, "trigger setup failed\n");
		goto error_free_dev_mem;
		return ret;
	}

	ret = iio_device_register(indio_dev);
@@ -304,8 +304,6 @@ static int hid_prox_probe(struct platform_device *pdev)
	iio_device_unregister(indio_dev);
error_remove_trigger:
	hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes);
error_free_dev_mem:
	kfree(indio_dev->channels);
	return ret;
}

@@ -319,7 +317,6 @@ static int hid_prox_remove(struct platform_device *pdev)
	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_PROX);
	iio_device_unregister(indio_dev);
	hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes);
	kfree(indio_dev->channels);

	return 0;
}
+4 −7
Original line number Diff line number Diff line
@@ -326,7 +326,7 @@ static int hid_incl_3d_probe(struct platform_device *pdev)
		return ret;
	}

	indio_dev->channels = kmemdup(incl_3d_channels,
	indio_dev->channels = devm_kmemdup(&pdev->dev, incl_3d_channels,
					   sizeof(incl_3d_channels), GFP_KERNEL);
	if (!indio_dev->channels) {
		dev_err(&pdev->dev, "failed to duplicate channels\n");
@@ -339,7 +339,7 @@ static int hid_incl_3d_probe(struct platform_device *pdev)
				   incl_state);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup attributes\n");
		goto error_free_dev_mem;
		return ret;
	}

	indio_dev->num_channels = ARRAY_SIZE(incl_3d_channels);
@@ -353,7 +353,7 @@ static int hid_incl_3d_probe(struct platform_device *pdev)
					&incl_state->common_attributes);
	if (ret) {
		dev_err(&pdev->dev, "trigger setup failed\n");
		goto error_free_dev_mem;
		return ret;
	}

	ret = iio_device_register(indio_dev);
@@ -379,8 +379,6 @@ static int hid_incl_3d_probe(struct platform_device *pdev)
	iio_device_unregister(indio_dev);
error_remove_trigger:
	hid_sensor_remove_trigger(indio_dev, &incl_state->common_attributes);
error_free_dev_mem:
	kfree(indio_dev->channels);
	return ret;
}

@@ -394,7 +392,6 @@ static int hid_incl_3d_remove(struct platform_device *pdev)
	sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_INCLINOMETER_3D);
	iio_device_unregister(indio_dev);
	hid_sensor_remove_trigger(indio_dev, &incl_state->common_attributes);
	kfree(indio_dev->channels);

	return 0;
}
Loading