diff options
Diffstat (limited to 'drivers/iio/magnetometer')
-rw-r--r-- | drivers/iio/magnetometer/Kconfig | 6 | ||||
-rw-r--r-- | drivers/iio/magnetometer/Makefile | 1 | ||||
-rw-r--r-- | drivers/iio/magnetometer/hid-sensor-magn-3d.c | 43 | ||||
-rw-r--r-- | drivers/iio/magnetometer/st_magn.h | 3 | ||||
-rw-r--r-- | drivers/iio/magnetometer/st_magn_core.c | 6 | ||||
-rw-r--r-- | drivers/iio/magnetometer/st_magn_i2c.c | 17 | ||||
-rw-r--r-- | drivers/iio/magnetometer/st_magn_spi.c | 17 |
7 files changed, 38 insertions, 55 deletions
diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig index c332b0ae4a3b..4fa923f37b97 100644 --- a/drivers/iio/magnetometer/Kconfig +++ b/drivers/iio/magnetometer/Kconfig | |||
@@ -1,6 +1,8 @@ | |||
1 | # | 1 | # |
2 | # Magnetometer sensors | 2 | # Magnetometer sensors |
3 | # | 3 | # |
4 | # When adding new entries keep the list in alphabetical order | ||
5 | |||
4 | menu "Magnetometer sensors" | 6 | menu "Magnetometer sensors" |
5 | 7 | ||
6 | config AK8975 | 8 | config AK8975 |
@@ -36,8 +38,8 @@ config IIO_ST_MAGN_3AXIS | |||
36 | Say yes here to build support for STMicroelectronics magnetometers: | 38 | Say yes here to build support for STMicroelectronics magnetometers: |
37 | LSM303DLHC, LSM303DLM, LIS3MDL. | 39 | LSM303DLHC, LSM303DLM, LIS3MDL. |
38 | 40 | ||
39 | This driver can also be built as a module. If so, will be created | 41 | This driver can also be built as a module. If so, these modules |
40 | these modules: | 42 | will be created: |
41 | - st_magn (core functions for the driver [it is mandatory]); | 43 | - st_magn (core functions for the driver [it is mandatory]); |
42 | - st_magn_i2c (necessary for the I2C devices [optional*]); | 44 | - st_magn_i2c (necessary for the I2C devices [optional*]); |
43 | - st_magn_spi (necessary for the SPI devices [optional*]); | 45 | - st_magn_spi (necessary for the SPI devices [optional*]); |
diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/Makefile index 7f328e37fbab..f91b1b68d392 100644 --- a/drivers/iio/magnetometer/Makefile +++ b/drivers/iio/magnetometer/Makefile | |||
@@ -2,6 +2,7 @@ | |||
2 | # Makefile for industrial I/O Magnetometer sensor drivers | 2 | # Makefile for industrial I/O Magnetometer sensor drivers |
3 | # | 3 | # |
4 | 4 | ||
5 | # When adding new entries keep the list in alphabetical order | ||
5 | obj-$(CONFIG_AK8975) += ak8975.o | 6 | obj-$(CONFIG_AK8975) += ak8975.o |
6 | obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o | 7 | obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o |
7 | 8 | ||
diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index 99f4e494513b..a98460b15e4b 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c | |||
@@ -30,10 +30,6 @@ | |||
30 | #include <linux/iio/triggered_buffer.h> | 30 | #include <linux/iio/triggered_buffer.h> |
31 | #include "../common/hid-sensors/hid-sensor-trigger.h" | 31 | #include "../common/hid-sensors/hid-sensor-trigger.h" |
32 | 32 | ||
33 | /*Format: HID-SENSOR-usage_id_in_hex*/ | ||
34 | /*Usage ID from spec for Magnetometer-3D: 0x200083*/ | ||
35 | #define DRIVER_NAME "HID-SENSOR-200083" | ||
36 | |||
37 | enum magn_3d_channel { | 33 | enum magn_3d_channel { |
38 | CHANNEL_SCAN_INDEX_X, | 34 | CHANNEL_SCAN_INDEX_X, |
39 | CHANNEL_SCAN_INDEX_Y, | 35 | CHANNEL_SCAN_INDEX_Y, |
@@ -180,18 +176,10 @@ static int magn_3d_write_raw(struct iio_dev *indio_dev, | |||
180 | return ret; | 176 | return ret; |
181 | } | 177 | } |
182 | 178 | ||
183 | static int magn_3d_write_raw_get_fmt(struct iio_dev *indio_dev, | ||
184 | struct iio_chan_spec const *chan, | ||
185 | long mask) | ||
186 | { | ||
187 | return IIO_VAL_INT_PLUS_MICRO; | ||
188 | } | ||
189 | |||
190 | static const struct iio_info magn_3d_info = { | 179 | static const struct iio_info magn_3d_info = { |
191 | .driver_module = THIS_MODULE, | 180 | .driver_module = THIS_MODULE, |
192 | .read_raw = &magn_3d_read_raw, | 181 | .read_raw = &magn_3d_read_raw, |
193 | .write_raw = &magn_3d_write_raw, | 182 | .write_raw = &magn_3d_write_raw, |
194 | .write_raw_get_fmt = &magn_3d_write_raw_get_fmt, | ||
195 | }; | 183 | }; |
196 | 184 | ||
197 | /* Function to push data to buffer */ | 185 | /* Function to push data to buffer */ |
@@ -287,11 +275,11 @@ static int hid_magn_3d_probe(struct platform_device *pdev) | |||
287 | struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; | 275 | struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; |
288 | struct iio_chan_spec *channels; | 276 | struct iio_chan_spec *channels; |
289 | 277 | ||
290 | indio_dev = iio_device_alloc(sizeof(struct magn_3d_state)); | 278 | indio_dev = devm_iio_device_alloc(&pdev->dev, |
291 | if (indio_dev == NULL) { | 279 | sizeof(struct magn_3d_state)); |
292 | ret = -ENOMEM; | 280 | if (indio_dev == NULL) |
293 | goto error_ret; | 281 | return -ENOMEM; |
294 | } | 282 | |
295 | platform_set_drvdata(pdev, indio_dev); | 283 | platform_set_drvdata(pdev, indio_dev); |
296 | 284 | ||
297 | magn_state = iio_priv(indio_dev); | 285 | magn_state = iio_priv(indio_dev); |
@@ -303,15 +291,14 @@ static int hid_magn_3d_probe(struct platform_device *pdev) | |||
303 | &magn_state->common_attributes); | 291 | &magn_state->common_attributes); |
304 | if (ret) { | 292 | if (ret) { |
305 | dev_err(&pdev->dev, "failed to setup common attributes\n"); | 293 | dev_err(&pdev->dev, "failed to setup common attributes\n"); |
306 | goto error_free_dev; | 294 | return ret; |
307 | } | 295 | } |
308 | 296 | ||
309 | channels = kmemdup(magn_3d_channels, sizeof(magn_3d_channels), | 297 | channels = kmemdup(magn_3d_channels, sizeof(magn_3d_channels), |
310 | GFP_KERNEL); | 298 | GFP_KERNEL); |
311 | if (!channels) { | 299 | if (!channels) { |
312 | ret = -ENOMEM; | ||
313 | dev_err(&pdev->dev, "failed to duplicate channels\n"); | 300 | dev_err(&pdev->dev, "failed to duplicate channels\n"); |
314 | goto error_free_dev; | 301 | return -ENOMEM; |
315 | } | 302 | } |
316 | 303 | ||
317 | ret = magn_3d_parse_report(pdev, hsdev, channels, | 304 | ret = magn_3d_parse_report(pdev, hsdev, channels, |
@@ -368,9 +355,6 @@ error_unreg_buffer_funcs: | |||
368 | iio_triggered_buffer_cleanup(indio_dev); | 355 | iio_triggered_buffer_cleanup(indio_dev); |
369 | error_free_dev_mem: | 356 | error_free_dev_mem: |
370 | kfree(indio_dev->channels); | 357 | kfree(indio_dev->channels); |
371 | error_free_dev: | ||
372 | iio_device_free(indio_dev); | ||
373 | error_ret: | ||
374 | return ret; | 358 | return ret; |
375 | } | 359 | } |
376 | 360 | ||
@@ -385,14 +369,23 @@ static int hid_magn_3d_remove(struct platform_device *pdev) | |||
385 | hid_sensor_remove_trigger(indio_dev); | 369 | hid_sensor_remove_trigger(indio_dev); |
386 | iio_triggered_buffer_cleanup(indio_dev); | 370 | iio_triggered_buffer_cleanup(indio_dev); |
387 | kfree(indio_dev->channels); | 371 | kfree(indio_dev->channels); |
388 | iio_device_free(indio_dev); | ||
389 | 372 | ||
390 | return 0; | 373 | return 0; |
391 | } | 374 | } |
392 | 375 | ||
376 | static struct platform_device_id hid_magn_3d_ids[] = { | ||
377 | { | ||
378 | /* Format: HID-SENSOR-usage_id_in_hex_lowercase */ | ||
379 | .name = "HID-SENSOR-200083", | ||
380 | }, | ||
381 | { /* sentinel */ } | ||
382 | }; | ||
383 | MODULE_DEVICE_TABLE(platform, hid_magn_3d_ids); | ||
384 | |||
393 | static struct platform_driver hid_magn_3d_platform_driver = { | 385 | static struct platform_driver hid_magn_3d_platform_driver = { |
386 | .id_table = hid_magn_3d_ids, | ||
394 | .driver = { | 387 | .driver = { |
395 | .name = DRIVER_NAME, | 388 | .name = KBUILD_MODNAME, |
396 | .owner = THIS_MODULE, | 389 | .owner = THIS_MODULE, |
397 | }, | 390 | }, |
398 | .probe = hid_magn_3d_probe, | 391 | .probe = hid_magn_3d_probe, |
diff --git a/drivers/iio/magnetometer/st_magn.h b/drivers/iio/magnetometer/st_magn.h index 7e81d00ef0c3..694e33e0fb72 100644 --- a/drivers/iio/magnetometer/st_magn.h +++ b/drivers/iio/magnetometer/st_magn.h | |||
@@ -18,7 +18,8 @@ | |||
18 | #define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn" | 18 | #define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn" |
19 | #define LIS3MDL_MAGN_DEV_NAME "lis3mdl" | 19 | #define LIS3MDL_MAGN_DEV_NAME "lis3mdl" |
20 | 20 | ||
21 | int st_magn_common_probe(struct iio_dev *indio_dev); | 21 | int st_magn_common_probe(struct iio_dev *indio_dev, |
22 | struct st_sensors_platform_data *pdata); | ||
22 | void st_magn_common_remove(struct iio_dev *indio_dev); | 23 | void st_magn_common_remove(struct iio_dev *indio_dev); |
23 | 24 | ||
24 | #ifdef CONFIG_IIO_BUFFER | 25 | #ifdef CONFIG_IIO_BUFFER |
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c index ebfe8f11a0c2..e8d2849cc81d 100644 --- a/drivers/iio/magnetometer/st_magn_core.c +++ b/drivers/iio/magnetometer/st_magn_core.c | |||
@@ -345,7 +345,8 @@ static const struct iio_info magn_info = { | |||
345 | .write_raw = &st_magn_write_raw, | 345 | .write_raw = &st_magn_write_raw, |
346 | }; | 346 | }; |
347 | 347 | ||
348 | int st_magn_common_probe(struct iio_dev *indio_dev) | 348 | int st_magn_common_probe(struct iio_dev *indio_dev, |
349 | struct st_sensors_platform_data *pdata) | ||
349 | { | 350 | { |
350 | int err; | 351 | int err; |
351 | struct st_sensor_data *mdata = iio_priv(indio_dev); | 352 | struct st_sensor_data *mdata = iio_priv(indio_dev); |
@@ -367,7 +368,7 @@ int st_magn_common_probe(struct iio_dev *indio_dev) | |||
367 | &mdata->sensor->fs.fs_avl[0]; | 368 | &mdata->sensor->fs.fs_avl[0]; |
368 | mdata->odr = mdata->sensor->odr.odr_avl[0].hz; | 369 | mdata->odr = mdata->sensor->odr.odr_avl[0].hz; |
369 | 370 | ||
370 | err = st_sensors_init_sensor(indio_dev); | 371 | err = st_sensors_init_sensor(indio_dev, pdata); |
371 | if (err < 0) | 372 | if (err < 0) |
372 | goto st_magn_common_probe_error; | 373 | goto st_magn_common_probe_error; |
373 | 374 | ||
@@ -406,7 +407,6 @@ void st_magn_common_remove(struct iio_dev *indio_dev) | |||
406 | st_sensors_deallocate_trigger(indio_dev); | 407 | st_sensors_deallocate_trigger(indio_dev); |
407 | st_magn_deallocate_ring(indio_dev); | 408 | st_magn_deallocate_ring(indio_dev); |
408 | } | 409 | } |
409 | iio_device_free(indio_dev); | ||
410 | } | 410 | } |
411 | EXPORT_SYMBOL(st_magn_common_remove); | 411 | EXPORT_SYMBOL(st_magn_common_remove); |
412 | 412 | ||
diff --git a/drivers/iio/magnetometer/st_magn_i2c.c b/drivers/iio/magnetometer/st_magn_i2c.c index e6adc4a86425..892e0feeb5c1 100644 --- a/drivers/iio/magnetometer/st_magn_i2c.c +++ b/drivers/iio/magnetometer/st_magn_i2c.c | |||
@@ -25,27 +25,20 @@ static int st_magn_i2c_probe(struct i2c_client *client, | |||
25 | struct st_sensor_data *mdata; | 25 | struct st_sensor_data *mdata; |
26 | int err; | 26 | int err; |
27 | 27 | ||
28 | indio_dev = iio_device_alloc(sizeof(*mdata)); | 28 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*mdata)); |
29 | if (indio_dev == NULL) { | 29 | if (!indio_dev) |
30 | err = -ENOMEM; | 30 | return -ENOMEM; |
31 | goto iio_device_alloc_error; | ||
32 | } | ||
33 | 31 | ||
34 | mdata = iio_priv(indio_dev); | 32 | mdata = iio_priv(indio_dev); |
35 | mdata->dev = &client->dev; | 33 | mdata->dev = &client->dev; |
36 | 34 | ||
37 | st_sensors_i2c_configure(indio_dev, client, mdata); | 35 | st_sensors_i2c_configure(indio_dev, client, mdata); |
38 | 36 | ||
39 | err = st_magn_common_probe(indio_dev); | 37 | err = st_magn_common_probe(indio_dev, NULL); |
40 | if (err < 0) | 38 | if (err < 0) |
41 | goto st_magn_common_probe_error; | 39 | return err; |
42 | 40 | ||
43 | return 0; | 41 | return 0; |
44 | |||
45 | st_magn_common_probe_error: | ||
46 | iio_device_free(indio_dev); | ||
47 | iio_device_alloc_error: | ||
48 | return err; | ||
49 | } | 42 | } |
50 | 43 | ||
51 | static int st_magn_i2c_remove(struct i2c_client *client) | 44 | static int st_magn_i2c_remove(struct i2c_client *client) |
diff --git a/drivers/iio/magnetometer/st_magn_spi.c b/drivers/iio/magnetometer/st_magn_spi.c index 51adb797cb7d..a6143ea51dfc 100644 --- a/drivers/iio/magnetometer/st_magn_spi.c +++ b/drivers/iio/magnetometer/st_magn_spi.c | |||
@@ -24,27 +24,20 @@ static int st_magn_spi_probe(struct spi_device *spi) | |||
24 | struct st_sensor_data *mdata; | 24 | struct st_sensor_data *mdata; |
25 | int err; | 25 | int err; |
26 | 26 | ||
27 | indio_dev = iio_device_alloc(sizeof(*mdata)); | 27 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*mdata)); |
28 | if (indio_dev == NULL) { | 28 | if (!indio_dev) |
29 | err = -ENOMEM; | 29 | return -ENOMEM; |
30 | goto iio_device_alloc_error; | ||
31 | } | ||
32 | 30 | ||
33 | mdata = iio_priv(indio_dev); | 31 | mdata = iio_priv(indio_dev); |
34 | mdata->dev = &spi->dev; | 32 | mdata->dev = &spi->dev; |
35 | 33 | ||
36 | st_sensors_spi_configure(indio_dev, spi, mdata); | 34 | st_sensors_spi_configure(indio_dev, spi, mdata); |
37 | 35 | ||
38 | err = st_magn_common_probe(indio_dev); | 36 | err = st_magn_common_probe(indio_dev, NULL); |
39 | if (err < 0) | 37 | if (err < 0) |
40 | goto st_magn_common_probe_error; | 38 | return err; |
41 | 39 | ||
42 | return 0; | 40 | return 0; |
43 | |||
44 | st_magn_common_probe_error: | ||
45 | iio_device_free(indio_dev); | ||
46 | iio_device_alloc_error: | ||
47 | return err; | ||
48 | } | 41 | } |
49 | 42 | ||
50 | static int st_magn_spi_remove(struct spi_device *spi) | 43 | static int st_magn_spi_remove(struct spi_device *spi) |