aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/magnetometer
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/magnetometer')
-rw-r--r--drivers/iio/magnetometer/Kconfig6
-rw-r--r--drivers/iio/magnetometer/Makefile1
-rw-r--r--drivers/iio/magnetometer/hid-sensor-magn-3d.c43
-rw-r--r--drivers/iio/magnetometer/st_magn.h3
-rw-r--r--drivers/iio/magnetometer/st_magn_core.c6
-rw-r--r--drivers/iio/magnetometer/st_magn_i2c.c17
-rw-r--r--drivers/iio/magnetometer/st_magn_spi.c17
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
4menu "Magnetometer sensors" 6menu "Magnetometer sensors"
5 7
6config AK8975 8config 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
5obj-$(CONFIG_AK8975) += ak8975.o 6obj-$(CONFIG_AK8975) += ak8975.o
6obj-$(CONFIG_HID_SENSOR_MAGNETOMETER_3D) += hid-sensor-magn-3d.o 7obj-$(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
37enum magn_3d_channel { 33enum 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
183static 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
190static const struct iio_info magn_3d_info = { 179static 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);
369error_free_dev_mem: 356error_free_dev_mem:
370 kfree(indio_dev->channels); 357 kfree(indio_dev->channels);
371error_free_dev:
372 iio_device_free(indio_dev);
373error_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
376static 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};
383MODULE_DEVICE_TABLE(platform, hid_magn_3d_ids);
384
393static struct platform_driver hid_magn_3d_platform_driver = { 385static 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
21int st_magn_common_probe(struct iio_dev *indio_dev); 21int st_magn_common_probe(struct iio_dev *indio_dev,
22 struct st_sensors_platform_data *pdata);
22void st_magn_common_remove(struct iio_dev *indio_dev); 23void 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
348int st_magn_common_probe(struct iio_dev *indio_dev) 348int 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}
411EXPORT_SYMBOL(st_magn_common_remove); 411EXPORT_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
45st_magn_common_probe_error:
46 iio_device_free(indio_dev);
47iio_device_alloc_error:
48 return err;
49} 42}
50 43
51static int st_magn_i2c_remove(struct i2c_client *client) 44static 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
44st_magn_common_probe_error:
45 iio_device_free(indio_dev);
46iio_device_alloc_error:
47 return err;
48} 41}
49 42
50static int st_magn_spi_remove(struct spi_device *spi) 43static int st_magn_spi_remove(struct spi_device *spi)