forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/accel/mma8452.c
....@@ -31,6 +31,7 @@
3131 #include <linux/of_device.h>
3232 #include <linux/of_irq.h>
3333 #include <linux/pm_runtime.h>
34
+#include <linux/regulator/consumer.h>
3435
3536 #define MMA8452_STATUS 0x00
3637 #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0))
....@@ -107,6 +108,8 @@
107108 u8 data_cfg;
108109 const struct mma_chip_info *chip_info;
109110 int sleep_val;
111
+ struct regulator *vdd_reg;
112
+ struct regulator *vddio_reg;
110113
111114 /* Ensure correct alignment of time stamp when present */
112115 struct {
....@@ -173,6 +176,7 @@
173176 * @enabled_events: event flags enabled and handled by this driver
174177 */
175178 struct mma_chip_info {
179
+ const char *name;
176180 u8 chip_id;
177181 const struct iio_chan_spec *channels;
178182 int num_channels;
....@@ -1300,6 +1304,7 @@
13001304
13011305 static const struct mma_chip_info mma_chip_info_table[] = {
13021306 [mma8451] = {
1307
+ .name = "mma8451",
13031308 .chip_id = MMA8451_DEVICE_ID,
13041309 .channels = mma8451_channels,
13051310 .num_channels = ARRAY_SIZE(mma8451_channels),
....@@ -1324,6 +1329,7 @@
13241329 MMA8452_INT_FF_MT,
13251330 },
13261331 [mma8452] = {
1332
+ .name = "mma8452",
13271333 .chip_id = MMA8452_DEVICE_ID,
13281334 .channels = mma8452_channels,
13291335 .num_channels = ARRAY_SIZE(mma8452_channels),
....@@ -1340,6 +1346,7 @@
13401346 MMA8452_INT_FF_MT,
13411347 },
13421348 [mma8453] = {
1349
+ .name = "mma8453",
13431350 .chip_id = MMA8453_DEVICE_ID,
13441351 .channels = mma8453_channels,
13451352 .num_channels = ARRAY_SIZE(mma8453_channels),
....@@ -1356,6 +1363,7 @@
13561363 MMA8452_INT_FF_MT,
13571364 },
13581365 [mma8652] = {
1366
+ .name = "mma8652",
13591367 .chip_id = MMA8652_DEVICE_ID,
13601368 .channels = mma8652_channels,
13611369 .num_channels = ARRAY_SIZE(mma8652_channels),
....@@ -1365,6 +1373,7 @@
13651373 .enabled_events = MMA8452_INT_FF_MT,
13661374 },
13671375 [mma8653] = {
1376
+ .name = "mma8653",
13681377 .chip_id = MMA8653_DEVICE_ID,
13691378 .channels = mma8653_channels,
13701379 .num_channels = ARRAY_SIZE(mma8653_channels),
....@@ -1379,6 +1388,7 @@
13791388 .enabled_events = MMA8452_INT_FF_MT,
13801389 },
13811390 [fxls8471] = {
1391
+ .name = "fxls8471",
13821392 .chip_id = FXLS8471_DEVICE_ID,
13831393 .channels = mma8451_channels,
13841394 .num_channels = ARRAY_SIZE(mma8451_channels),
....@@ -1486,10 +1496,14 @@
14861496 int i;
14871497 int ret;
14881498
1489
- ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2,
1499
+ /*
1500
+ * Find on fxls8471, after config reset bit, it reset immediately,
1501
+ * and will not give ACK, so here do not check the return value.
1502
+ * The following code will read the reset register, and check whether
1503
+ * this reset works.
1504
+ */
1505
+ i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2,
14901506 MMA8452_CTRL_REG2_RST);
1491
- if (ret < 0)
1492
- return ret;
14931507
14941508 for (i = 0; i < 10; i++) {
14951509 usleep_range(100, 200);
....@@ -1522,13 +1536,6 @@
15221536 struct mma8452_data *data;
15231537 struct iio_dev *indio_dev;
15241538 int ret;
1525
- const struct of_device_id *match;
1526
-
1527
- match = of_match_device(mma8452_dt_ids, &client->dev);
1528
- if (!match) {
1529
- dev_err(&client->dev, "unknown device model\n");
1530
- return -ENODEV;
1531
- }
15321539
15331540 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
15341541 if (!indio_dev)
....@@ -1537,11 +1544,42 @@
15371544 data = iio_priv(indio_dev);
15381545 data->client = client;
15391546 mutex_init(&data->lock);
1540
- data->chip_info = match->data;
1547
+
1548
+ data->chip_info = device_get_match_data(&client->dev);
1549
+ if (!data->chip_info) {
1550
+ if (id) {
1551
+ data->chip_info = &mma_chip_info_table[id->driver_data];
1552
+ } else {
1553
+ dev_err(&client->dev, "unknown device model\n");
1554
+ return -ENODEV;
1555
+ }
1556
+ }
1557
+
1558
+ data->vdd_reg = devm_regulator_get(&client->dev, "vdd");
1559
+ if (IS_ERR(data->vdd_reg))
1560
+ return dev_err_probe(&client->dev, PTR_ERR(data->vdd_reg),
1561
+ "failed to get VDD regulator!\n");
1562
+
1563
+ data->vddio_reg = devm_regulator_get(&client->dev, "vddio");
1564
+ if (IS_ERR(data->vddio_reg))
1565
+ return dev_err_probe(&client->dev, PTR_ERR(data->vddio_reg),
1566
+ "failed to get VDDIO regulator!\n");
1567
+
1568
+ ret = regulator_enable(data->vdd_reg);
1569
+ if (ret) {
1570
+ dev_err(&client->dev, "failed to enable VDD regulator!\n");
1571
+ return ret;
1572
+ }
1573
+
1574
+ ret = regulator_enable(data->vddio_reg);
1575
+ if (ret) {
1576
+ dev_err(&client->dev, "failed to enable VDDIO regulator!\n");
1577
+ goto disable_regulator_vdd;
1578
+ }
15411579
15421580 ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
15431581 if (ret < 0)
1544
- return ret;
1582
+ goto disable_regulators;
15451583
15461584 switch (ret) {
15471585 case MMA8451_DEVICE_ID:
....@@ -1552,18 +1590,18 @@
15521590 case FXLS8471_DEVICE_ID:
15531591 if (ret == data->chip_info->chip_id)
15541592 break;
1555
- /* else: fall through */
1593
+ fallthrough;
15561594 default:
1557
- return -ENODEV;
1595
+ ret = -ENODEV;
1596
+ goto disable_regulators;
15581597 }
15591598
15601599 dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
1561
- match->compatible, data->chip_info->chip_id);
1600
+ data->chip_info->name, data->chip_info->chip_id);
15621601
15631602 i2c_set_clientdata(client, indio_dev);
15641603 indio_dev->info = &mma8452_info;
1565
- indio_dev->name = id->name;
1566
- indio_dev->dev.parent = &client->dev;
1604
+ indio_dev->name = data->chip_info->name;
15671605 indio_dev->modes = INDIO_DIRECT_MODE;
15681606 indio_dev->channels = data->chip_info->channels;
15691607 indio_dev->num_channels = data->chip_info->num_channels;
....@@ -1571,13 +1609,13 @@
15711609
15721610 ret = mma8452_reset(client);
15731611 if (ret < 0)
1574
- return ret;
1612
+ goto disable_regulators;
15751613
15761614 data->data_cfg = MMA8452_DATA_CFG_FS_2G;
15771615 ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
15781616 data->data_cfg);
15791617 if (ret < 0)
1580
- return ret;
1618
+ goto disable_regulators;
15811619
15821620 /*
15831621 * By default set transient threshold to max to avoid events if
....@@ -1586,7 +1624,7 @@
15861624 ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
15871625 MMA8452_TRANSIENT_THS_MASK);
15881626 if (ret < 0)
1589
- return ret;
1627
+ goto disable_regulators;
15901628
15911629 if (client->irq) {
15921630 int irq2;
....@@ -1600,7 +1638,7 @@
16001638 MMA8452_CTRL_REG5,
16011639 data->chip_info->all_events);
16021640 if (ret < 0)
1603
- return ret;
1641
+ goto disable_regulators;
16041642
16051643 dev_dbg(&client->dev, "using interrupt line INT1\n");
16061644 }
....@@ -1609,11 +1647,11 @@
16091647 MMA8452_CTRL_REG4,
16101648 data->chip_info->enabled_events);
16111649 if (ret < 0)
1612
- return ret;
1650
+ goto disable_regulators;
16131651
16141652 ret = mma8452_trigger_setup(indio_dev);
16151653 if (ret < 0)
1616
- return ret;
1654
+ goto disable_regulators;
16171655 }
16181656
16191657 data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
....@@ -1669,12 +1707,19 @@
16691707 trigger_cleanup:
16701708 mma8452_trigger_cleanup(indio_dev);
16711709
1710
+disable_regulators:
1711
+ regulator_disable(data->vddio_reg);
1712
+
1713
+disable_regulator_vdd:
1714
+ regulator_disable(data->vdd_reg);
1715
+
16721716 return ret;
16731717 }
16741718
16751719 static int mma8452_remove(struct i2c_client *client)
16761720 {
16771721 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1722
+ struct mma8452_data *data = iio_priv(indio_dev);
16781723
16791724 iio_device_unregister(indio_dev);
16801725
....@@ -1685,6 +1730,9 @@
16851730 iio_triggered_buffer_cleanup(indio_dev);
16861731 mma8452_trigger_cleanup(indio_dev);
16871732 mma8452_standby(iio_priv(indio_dev));
1733
+
1734
+ regulator_disable(data->vddio_reg);
1735
+ regulator_disable(data->vdd_reg);
16881736
16891737 return 0;
16901738 }
....@@ -1704,6 +1752,18 @@
17041752 return -EAGAIN;
17051753 }
17061754
1755
+ ret = regulator_disable(data->vddio_reg);
1756
+ if (ret) {
1757
+ dev_err(dev, "failed to disable VDDIO regulator\n");
1758
+ return ret;
1759
+ }
1760
+
1761
+ ret = regulator_disable(data->vdd_reg);
1762
+ if (ret) {
1763
+ dev_err(dev, "failed to disable VDD regulator\n");
1764
+ return ret;
1765
+ }
1766
+
17071767 return 0;
17081768 }
17091769
....@@ -1713,9 +1773,22 @@
17131773 struct mma8452_data *data = iio_priv(indio_dev);
17141774 int ret, sleep_val;
17151775
1776
+ ret = regulator_enable(data->vdd_reg);
1777
+ if (ret) {
1778
+ dev_err(dev, "failed to enable VDD regulator\n");
1779
+ return ret;
1780
+ }
1781
+
1782
+ ret = regulator_enable(data->vddio_reg);
1783
+ if (ret) {
1784
+ dev_err(dev, "failed to enable VDDIO regulator\n");
1785
+ regulator_disable(data->vdd_reg);
1786
+ return ret;
1787
+ }
1788
+
17161789 ret = mma8452_active(data);
17171790 if (ret < 0)
1718
- return ret;
1791
+ goto runtime_resume_failed;
17191792
17201793 ret = mma8452_get_odr_index(data);
17211794 sleep_val = 1000 / mma8452_samp_freq[ret][0];
....@@ -1725,25 +1798,17 @@
17251798 msleep_interruptible(sleep_val);
17261799
17271800 return 0;
1728
-}
1729
-#endif
17301801
1731
-#ifdef CONFIG_PM_SLEEP
1732
-static int mma8452_suspend(struct device *dev)
1733
-{
1734
- return mma8452_standby(iio_priv(i2c_get_clientdata(
1735
- to_i2c_client(dev))));
1736
-}
1802
+runtime_resume_failed:
1803
+ regulator_disable(data->vddio_reg);
1804
+ regulator_disable(data->vdd_reg);
17371805
1738
-static int mma8452_resume(struct device *dev)
1739
-{
1740
- return mma8452_active(iio_priv(i2c_get_clientdata(
1741
- to_i2c_client(dev))));
1806
+ return ret;
17421807 }
17431808 #endif
17441809
17451810 static const struct dev_pm_ops mma8452_pm_ops = {
1746
- SET_SYSTEM_SLEEP_PM_OPS(mma8452_suspend, mma8452_resume)
1811
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
17471812 SET_RUNTIME_PM_OPS(mma8452_runtime_suspend,
17481813 mma8452_runtime_resume, NULL)
17491814 };
....@@ -1762,7 +1827,7 @@
17621827 static struct i2c_driver mma8452_driver = {
17631828 .driver = {
17641829 .name = "mma8452",
1765
- .of_match_table = of_match_ptr(mma8452_dt_ids),
1830
+ .of_match_table = mma8452_dt_ids,
17661831 .pm = &mma8452_pm_ops,
17671832 },
17681833 .probe = mma8452_probe,