hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/iio/magnetometer/mag3110.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * mag3110.c - Support for Freescale MAG3110 magnetometer sensor
34 *
45 * Copyright (c) 2013 Peter Meerwald <pmeerw@pmeerw.net>
5
- *
6
- * This file is subject to the terms and conditions of version 2 of
7
- * the GNU General Public License. See the file COPYING in the main
8
- * directory of this archive for more details.
96 *
107 * (7-bit I2C slave address 0x0e)
118 *
....@@ -20,6 +17,7 @@
2017 #include <linux/iio/buffer.h>
2118 #include <linux/iio/triggered_buffer.h>
2219 #include <linux/delay.h>
20
+#include <linux/regulator/consumer.h>
2321
2422 #define MAG3110_STATUS 0x00
2523 #define MAG3110_OUT_X 0x01 /* MSB first */
....@@ -56,6 +54,8 @@
5654 struct mutex lock;
5755 u8 ctrl_reg1;
5856 int sleep_val;
57
+ struct regulator *vdd_reg;
58
+ struct regulator *vddio_reg;
5959 /* Ensure natural alignment of timestamp */
6060 struct {
6161 __be16 channels[3];
....@@ -474,24 +474,48 @@
474474 struct iio_dev *indio_dev;
475475 int ret;
476476
477
- ret = i2c_smbus_read_byte_data(client, MAG3110_WHO_AM_I);
478
- if (ret < 0)
479
- return ret;
480
- if (ret != MAG3110_DEVICE_ID)
481
- return -ENODEV;
482
-
483477 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
484478 if (!indio_dev)
485479 return -ENOMEM;
486480
487481 data = iio_priv(indio_dev);
482
+
483
+ data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
484
+ if (IS_ERR(data->vdd_reg))
485
+ return dev_err_probe(&client->dev, PTR_ERR(data->vdd_reg),
486
+ "failed to get VDD regulator!\n");
487
+
488
+ data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
489
+ if (IS_ERR(data->vddio_reg))
490
+ return dev_err_probe(&client->dev, PTR_ERR(data->vddio_reg),
491
+ "failed to get VDDIO regulator!\n");
492
+
493
+ ret = regulator_enable(data->vdd_reg);
494
+ if (ret) {
495
+ dev_err(&client->dev, "failed to enable VDD regulator!\n");
496
+ return ret;
497
+ }
498
+
499
+ ret = regulator_enable(data->vddio_reg);
500
+ if (ret) {
501
+ dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
502
+ goto disable_regulator_vdd;
503
+ }
504
+
505
+ ret = i2c_smbus_read_byte_data(client, MAG3110_WHO_AM_I);
506
+ if (ret < 0)
507
+ goto disable_regulators;
508
+ if (ret != MAG3110_DEVICE_ID) {
509
+ ret = -ENODEV;
510
+ goto disable_regulators;
511
+ }
512
+
488513 data->client = client;
489514 mutex_init(&data->lock);
490515
491516 i2c_set_clientdata(client, indio_dev);
492517 indio_dev->info = &mag3110_info;
493518 indio_dev->name = id->name;
494
- indio_dev->dev.parent = &client->dev;
495519 indio_dev->modes = INDIO_DIRECT_MODE;
496520 indio_dev->channels = mag3110_channels;
497521 indio_dev->num_channels = ARRAY_SIZE(mag3110_channels);
....@@ -504,7 +528,7 @@
504528
505529 ret = mag3110_change_config(data, MAG3110_CTRL_REG1, data->ctrl_reg1);
506530 if (ret < 0)
507
- return ret;
531
+ goto disable_regulators;
508532
509533 ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG2,
510534 MAG3110_CTRL_AUTO_MRST_EN);
....@@ -525,16 +549,24 @@
525549 iio_triggered_buffer_cleanup(indio_dev);
526550 standby_on_error:
527551 mag3110_standby(iio_priv(indio_dev));
552
+disable_regulators:
553
+ regulator_disable(data->vddio_reg);
554
+disable_regulator_vdd:
555
+ regulator_disable(data->vdd_reg);
556
+
528557 return ret;
529558 }
530559
531560 static int mag3110_remove(struct i2c_client *client)
532561 {
533562 struct iio_dev *indio_dev = i2c_get_clientdata(client);
563
+ struct mag3110_data *data = iio_priv(indio_dev);
534564
535565 iio_device_unregister(indio_dev);
536566 iio_triggered_buffer_cleanup(indio_dev);
537567 mag3110_standby(iio_priv(indio_dev));
568
+ regulator_disable(data->vddio_reg);
569
+ regulator_disable(data->vdd_reg);
538570
539571 return 0;
540572 }
....@@ -542,14 +574,48 @@
542574 #ifdef CONFIG_PM_SLEEP
543575 static int mag3110_suspend(struct device *dev)
544576 {
545
- return mag3110_standby(iio_priv(i2c_get_clientdata(
577
+ struct mag3110_data *data = iio_priv(i2c_get_clientdata(
578
+ to_i2c_client(dev)));
579
+ int ret;
580
+
581
+ ret = mag3110_standby(iio_priv(i2c_get_clientdata(
546582 to_i2c_client(dev))));
583
+ if (ret)
584
+ return ret;
585
+
586
+ ret = regulator_disable(data->vddio_reg);
587
+ if (ret) {
588
+ dev_err(dev, "failed to disable VDDIO regulator\n");
589
+ return ret;
590
+ }
591
+
592
+ ret = regulator_disable(data->vdd_reg);
593
+ if (ret) {
594
+ dev_err(dev, "failed to disable VDD regulator\n");
595
+ return ret;
596
+ }
597
+
598
+ return 0;
547599 }
548600
549601 static int mag3110_resume(struct device *dev)
550602 {
551603 struct mag3110_data *data = iio_priv(i2c_get_clientdata(
552604 to_i2c_client(dev)));
605
+ int ret;
606
+
607
+ ret = regulator_enable(data->vdd_reg);
608
+ if (ret) {
609
+ dev_err(dev, "failed to enable VDD regulator\n");
610
+ return ret;
611
+ }
612
+
613
+ ret = regulator_enable(data->vddio_reg);
614
+ if (ret) {
615
+ dev_err(dev, "failed to enable VDDIO regulator\n");
616
+ regulator_disable(data->vdd_reg);
617
+ return ret;
618
+ }
553619
554620 return i2c_smbus_write_byte_data(data->client, MAG3110_CTRL_REG1,
555621 data->ctrl_reg1);