linux-imx/drivers/iio/accel/fxls8962af-spi.c
Carlos Song d7348e0308 LF-12697: support shutdown for for fxls8962 sensor
When system do warm reboot, chip should enter the standby state. It
will ensure in every boot the chip is enabled in same chip internal
logic state.

Add shutdown support for the sensor to disable pm and set the sensor
in standby state in system reboot.

Now this sensor relies on rpm resume suspend to make it enter active
mode and standby mode. When sensor in active mode, system start to
shutdown, because autosuspend_delay value is set 2 seconds, sometimes
this sensor doesn't enter rpm suspend in time when system finished
shutdown. So in next boot the sensor will keep in active mode. In this
case, more time need to be spent to finish the chip reset. According
to datasheet, this sensor need enough time to complete the reset,
otherwise any I2C operation will cause the sensor hang the bus.

Signed-off-by: Carlos Song <carlos.song@nxp.com>
Reviewed-by: Haibo Chen <haibo.chen@nxp.com>
Tested-by: Ye Li <ye.li@nxp.com>
2024-07-18 11:00:16 +08:00

65 lines
1.6 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* NXP FXLS8962AF/FXLS8964AF Accelerometer SPI Driver
*
* Copyright 2021 Connected Cars A/S
*/
#include <linux/dev_printk.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/spi/spi.h>
#include <linux/regmap.h>
#include "fxls8962af.h"
static int fxls8962af_probe(struct spi_device *spi)
{
struct regmap *regmap;
regmap = devm_regmap_init_spi(spi, &fxls8962af_spi_regmap_conf);
if (IS_ERR(regmap)) {
dev_err(&spi->dev, "Failed to initialize spi regmap\n");
return PTR_ERR(regmap);
}
return fxls8962af_core_probe(&spi->dev, regmap, spi->irq);
}
static const struct of_device_id fxls8962af_spi_of_match[] = {
{ .compatible = "nxp,fxls8962af" },
{ .compatible = "nxp,fxls8964af" },
{}
};
MODULE_DEVICE_TABLE(of, fxls8962af_spi_of_match);
static const struct spi_device_id fxls8962af_spi_id_table[] = {
{ "fxls8962af", fxls8962af },
{ "fxls8964af", fxls8964af },
{}
};
MODULE_DEVICE_TABLE(spi, fxls8962af_spi_id_table);
static void fxls8962af_shutdown(struct spi_device *spi)
{
fxls8962af_core_shutdown(&spi->dev);
};
static struct spi_driver fxls8962af_driver = {
.driver = {
.name = "fxls8962af_spi",
.pm = pm_ptr(&fxls8962af_pm_ops),
.of_match_table = fxls8962af_spi_of_match,
},
.shutdown = fxls8962af_shutdown,
.probe = fxls8962af_probe,
.id_table = fxls8962af_spi_id_table,
};
module_spi_driver(fxls8962af_driver);
MODULE_AUTHOR("Sean Nyekjaer <sean@geanix.com>");
MODULE_DESCRIPTION("NXP FXLS8962AF/FXLS8964AF accelerometer spi driver");
MODULE_LICENSE("GPL v2");
MODULE_IMPORT_NS(IIO_FXLS8962AF);