forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/accel/mxc4005.c
....@@ -1,16 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * 3-axis accelerometer driver for MXC4005XC Memsic sensor
34 *
45 * Copyright (c) 2014, Intel Corporation.
5
- *
6
- * This program is free software; you can redistribute it and/or modify it
7
- * under the terms and conditions of the GNU General Public License,
8
- * version 2, as published by the Free Software Foundation.
9
- *
10
- * This program is distributed in the hope it will be useful, but WITHOUT
11
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13
- * more details.
146 */
157
168 #include <linux/module.h>
....@@ -64,7 +56,11 @@
6456 struct mutex mutex;
6557 struct regmap *regmap;
6658 struct iio_trigger *dready_trig;
67
- __be16 buffer[8];
59
+ /* Ensure timestamp is naturally aligned */
60
+ struct {
61
+ __be16 chans[3];
62
+ s64 timestamp __aligned(8);
63
+ } scan;
6864 bool trigger_enabled;
6965 };
7066
....@@ -143,7 +139,7 @@
143139 int ret;
144140
145141 ret = regmap_bulk_read(data->regmap, MXC4005_REG_XOUT_UPPER,
146
- (u8 *) data->buffer, sizeof(data->buffer));
142
+ data->scan.chans, sizeof(data->scan.chans));
147143 if (ret < 0) {
148144 dev_err(data->dev, "failed to read axes\n");
149145 return ret;
....@@ -158,7 +154,7 @@
158154 __be16 reg;
159155 int ret;
160156
161
- ret = regmap_bulk_read(data->regmap, addr, (u8 *) &reg, sizeof(reg));
157
+ ret = regmap_bulk_read(data->regmap, addr, &reg, sizeof(reg));
162158 if (ret < 0) {
163159 dev_err(data->dev, "failed to read reg %02x\n", addr);
164160 return ret;
....@@ -309,7 +305,7 @@
309305 if (ret < 0)
310306 goto err;
311307
312
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
308
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
313309 pf->timestamp);
314310
315311 err:
....@@ -424,7 +420,6 @@
424420
425421 mutex_init(&data->mutex);
426422
427
- indio_dev->dev.parent = &client->dev;
428423 indio_dev->channels = mxc4005_channels;
429424 indio_dev->num_channels = ARRAY_SIZE(mxc4005_channels);
430425 indio_dev->available_scan_masks = mxc4005_scan_masks;
....@@ -432,7 +427,7 @@
432427 indio_dev->modes = INDIO_DIRECT_MODE;
433428 indio_dev->info = &mxc4005_info;
434429
435
- ret = iio_triggered_buffer_setup(indio_dev,
430
+ ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
436431 iio_pollfunc_store_time,
437432 mxc4005_trigger_handler,
438433 NULL);
....@@ -460,61 +455,36 @@
460455 if (ret) {
461456 dev_err(&client->dev,
462457 "failed to init threaded irq\n");
463
- goto err_buffer_cleanup;
458
+ return ret;
464459 }
465460
466461 data->dready_trig->dev.parent = &client->dev;
467462 data->dready_trig->ops = &mxc4005_trigger_ops;
468463 iio_trigger_set_drvdata(data->dready_trig, indio_dev);
469
- indio_dev->trig = data->dready_trig;
470
- iio_trigger_get(indio_dev->trig);
471
- ret = iio_trigger_register(data->dready_trig);
464
+ ret = devm_iio_trigger_register(&client->dev,
465
+ data->dready_trig);
472466 if (ret) {
473467 dev_err(&client->dev,
474468 "failed to register trigger\n");
475
- goto err_trigger_unregister;
469
+ return ret;
476470 }
471
+
472
+ indio_dev->trig = iio_trigger_get(data->dready_trig);
477473 }
478474
479
- ret = iio_device_register(indio_dev);
480
- if (ret < 0) {
481
- dev_err(&client->dev,
482
- "unable to register iio device %d\n", ret);
483
- goto err_buffer_cleanup;
484
- }
485
-
486
- return 0;
487
-
488
-err_trigger_unregister:
489
- iio_trigger_unregister(data->dready_trig);
490
-err_buffer_cleanup:
491
- iio_triggered_buffer_cleanup(indio_dev);
492
-
493
- return ret;
494
-}
495
-
496
-static int mxc4005_remove(struct i2c_client *client)
497
-{
498
- struct iio_dev *indio_dev = i2c_get_clientdata(client);
499
- struct mxc4005_data *data = iio_priv(indio_dev);
500
-
501
- iio_device_unregister(indio_dev);
502
-
503
- iio_triggered_buffer_cleanup(indio_dev);
504
- if (data->dready_trig)
505
- iio_trigger_unregister(data->dready_trig);
506
-
507
- return 0;
475
+ return devm_iio_device_register(&client->dev, indio_dev);
508476 }
509477
510478 static const struct acpi_device_id mxc4005_acpi_match[] = {
511479 {"MXC4005", 0},
480
+ {"MXC6655", 0},
512481 { },
513482 };
514483 MODULE_DEVICE_TABLE(acpi, mxc4005_acpi_match);
515484
516485 static const struct i2c_device_id mxc4005_id[] = {
517486 {"mxc4005", 0},
487
+ {"mxc6655", 0},
518488 { },
519489 };
520490 MODULE_DEVICE_TABLE(i2c, mxc4005_id);
....@@ -525,7 +495,6 @@
525495 .acpi_match_table = ACPI_PTR(mxc4005_acpi_match),
526496 },
527497 .probe = mxc4005_probe,
528
- .remove = mxc4005_remove,
529498 .id_table = mxc4005_id,
530499 };
531500