forked from Minki/linux
iio:pressure: initial zpa2326 barometer support
Introduce driver for Murata ZPA2326 pressure and temperature sensor: http://www.murata.com/en-us/products/productdetail?partno=ZPA2326-0311A-R Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
063e3303a9
commit
03b262f2bb
31
Documentation/devicetree/bindings/iio/pressure/zpa2326.txt
Normal file
31
Documentation/devicetree/bindings/iio/pressure/zpa2326.txt
Normal file
@ -0,0 +1,31 @@
|
||||
Murata ZPA2326 pressure sensor
|
||||
|
||||
Pressure sensor from Murata with SPI and I2C bus interfaces.
|
||||
|
||||
Required properties:
|
||||
- compatible: "murata,zpa2326"
|
||||
- reg: the I2C address or SPI chip select the device will respond to
|
||||
|
||||
Recommended properties for SPI bus usage:
|
||||
- spi-max-frequency: maximum SPI bus frequency as documented in
|
||||
Documentation/devicetree/bindings/spi/spi-bus.txt
|
||||
|
||||
Optional properties:
|
||||
- vref-supply: an optional regulator that needs to be on to provide VREF
|
||||
power to the sensor
|
||||
- vdd-supply: an optional regulator that needs to be on to provide VDD
|
||||
power to the sensor
|
||||
- interrupt-parent: phandle to the parent interrupt controller as documented in
|
||||
Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
|
||||
- interrupts: interrupt mapping for IRQ as documented in
|
||||
Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
|
||||
|
||||
Example:
|
||||
|
||||
zpa2326@5c {
|
||||
compatible = "murata,zpa2326";
|
||||
reg = <0x5c>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <12>;
|
||||
vdd-supply = <&ldo_1v8_gnss>;
|
||||
};
|
@ -187,4 +187,26 @@ config HP206C
|
||||
This driver can also be built as a module. If so, the module will
|
||||
be called hp206c.
|
||||
|
||||
config ZPA2326
|
||||
tristate "Murata ZPA2326 pressure sensor driver"
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
select REGMAP
|
||||
select ZPA2326_I2C if I2C
|
||||
select ZPA2326_SPI if SPI_MASTER
|
||||
help
|
||||
Say Y here to build support for the Murata ZPA2326 pressure and
|
||||
temperature sensor.
|
||||
|
||||
To compile this driver as a module, choose M here: the module will
|
||||
be called zpa2326.
|
||||
|
||||
config ZPA2326_I2C
|
||||
tristate
|
||||
select REGMAP_I2C
|
||||
|
||||
config ZPA2326_SPI
|
||||
tristate
|
||||
select REGMAP_SPI
|
||||
|
||||
endmenu
|
||||
|
@ -22,6 +22,9 @@ st_pressure-y := st_pressure_core.o
|
||||
st_pressure-$(CONFIG_IIO_BUFFER) += st_pressure_buffer.o
|
||||
obj-$(CONFIG_T5403) += t5403.o
|
||||
obj-$(CONFIG_HP206C) += hp206c.o
|
||||
obj-$(CONFIG_ZPA2326) += zpa2326.o
|
||||
obj-$(CONFIG_ZPA2326_I2C) += zpa2326_i2c.o
|
||||
obj-$(CONFIG_ZPA2326_SPI) += zpa2326_spi.o
|
||||
|
||||
obj-$(CONFIG_IIO_ST_PRESS_I2C) += st_pressure_i2c.o
|
||||
obj-$(CONFIG_IIO_ST_PRESS_SPI) += st_pressure_spi.o
|
||||
|
1735
drivers/iio/pressure/zpa2326.c
Normal file
1735
drivers/iio/pressure/zpa2326.c
Normal file
File diff suppressed because it is too large
Load Diff
89
drivers/iio/pressure/zpa2326.h
Normal file
89
drivers/iio/pressure/zpa2326.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Murata ZPA2326 pressure and temperature sensor IIO driver
|
||||
*
|
||||
* Copyright (c) 2016 Parrot S.A.
|
||||
*
|
||||
* Author: Gregor Boirie <gregor.boirie@parrot.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#ifndef _ZPA2326_H
|
||||
#define _ZPA2326_H
|
||||
|
||||
/* Register map. */
|
||||
#define ZPA2326_REF_P_XL_REG (0x8)
|
||||
#define ZPA2326_REF_P_L_REG (0x9)
|
||||
#define ZPA2326_REF_P_H_REG (0xa)
|
||||
#define ZPA2326_DEVICE_ID_REG (0xf)
|
||||
#define ZPA2326_DEVICE_ID (0xb9)
|
||||
#define ZPA2326_RES_CONF_REG (0x10)
|
||||
#define ZPA2326_CTRL_REG0_REG (0x20)
|
||||
#define ZPA2326_CTRL_REG0_ONE_SHOT BIT(0)
|
||||
#define ZPA2326_CTRL_REG0_ENABLE BIT(1)
|
||||
#define ZPA2326_CTRL_REG1_REG (0x21)
|
||||
#define ZPA2326_CTRL_REG1_MASK_DATA_READY BIT(2)
|
||||
#define ZPA2326_CTRL_REG2_REG (0x22)
|
||||
#define ZPA2326_CTRL_REG2_SWRESET BIT(2)
|
||||
#define ZPA2326_CTRL_REG3_REG (0x23)
|
||||
#define ZPA2326_CTRL_REG3_ODR_SHIFT (4)
|
||||
#define ZPA2326_CTRL_REG3_ENABLE_MEAS BIT(7)
|
||||
#define ZPA2326_INT_SOURCE_REG (0x24)
|
||||
#define ZPA2326_INT_SOURCE_DATA_READY BIT(2)
|
||||
#define ZPA2326_THS_P_LOW_REG (0x25)
|
||||
#define ZPA2326_THS_P_HIGH_REG (0x26)
|
||||
#define ZPA2326_STATUS_REG (0x27)
|
||||
#define ZPA2326_STATUS_P_DA BIT(1)
|
||||
#define ZPA2326_STATUS_FIFO_E BIT(2)
|
||||
#define ZPA2326_STATUS_P_OR BIT(5)
|
||||
#define ZPA2326_PRESS_OUT_XL_REG (0x28)
|
||||
#define ZPA2326_PRESS_OUT_L_REG (0x29)
|
||||
#define ZPA2326_PRESS_OUT_H_REG (0x2a)
|
||||
#define ZPA2326_TEMP_OUT_L_REG (0x2b)
|
||||
#define ZPA2326_TEMP_OUT_H_REG (0x2c)
|
||||
|
||||
struct device;
|
||||
struct regmap;
|
||||
|
||||
bool zpa2326_isreg_writeable(struct device *dev, unsigned int reg);
|
||||
bool zpa2326_isreg_readable(struct device *dev, unsigned int reg);
|
||||
bool zpa2326_isreg_precious(struct device *dev, unsigned int reg);
|
||||
|
||||
/**
|
||||
* zpa2326_probe() - Instantiate and register core ZPA2326 IIO device
|
||||
* @parent: Hardware sampling device the created IIO device will be a child of.
|
||||
* @name: Arbitrary name to identify the device.
|
||||
* @irq: Interrupt line, negative if none.
|
||||
* @hwid: Expected device hardware id.
|
||||
* @regmap: Registers map used to abstract underlying bus accesses.
|
||||
*
|
||||
* Return: Zero when successful, a negative error code otherwise.
|
||||
*/
|
||||
int zpa2326_probe(struct device *parent,
|
||||
const char *name,
|
||||
int irq,
|
||||
unsigned int hwid,
|
||||
struct regmap *regmap);
|
||||
|
||||
/**
|
||||
* zpa2326_remove() - Unregister and destroy core ZPA2326 IIO device.
|
||||
* @parent: Hardware sampling device the IIO device to remove is a child of.
|
||||
*/
|
||||
void zpa2326_remove(const struct device *parent);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#include <linux/pm.h>
|
||||
extern const struct dev_pm_ops zpa2326_pm_ops;
|
||||
#define ZPA2326_PM_OPS (&zpa2326_pm_ops)
|
||||
#else
|
||||
#define ZPA2326_PM_OPS (NULL)
|
||||
#endif
|
||||
|
||||
#endif
|
99
drivers/iio/pressure/zpa2326_i2c.c
Normal file
99
drivers/iio/pressure/zpa2326_i2c.c
Normal file
@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Murata ZPA2326 I2C pressure and temperature sensor driver
|
||||
*
|
||||
* Copyright (c) 2016 Parrot S.A.
|
||||
*
|
||||
* Author: Gregor Boirie <gregor.boirie@parrot.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/of_device.h>
|
||||
#include "zpa2326.h"
|
||||
|
||||
/*
|
||||
* read_flag_mask:
|
||||
* - address bit 7 must be set to request a register read operation
|
||||
*/
|
||||
static const struct regmap_config zpa2326_regmap_i2c_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.writeable_reg = zpa2326_isreg_writeable,
|
||||
.readable_reg = zpa2326_isreg_readable,
|
||||
.precious_reg = zpa2326_isreg_precious,
|
||||
.max_register = ZPA2326_TEMP_OUT_H_REG,
|
||||
.read_flag_mask = BIT(7),
|
||||
.cache_type = REGCACHE_NONE,
|
||||
};
|
||||
|
||||
static unsigned int zpa2326_i2c_hwid(const struct i2c_client *client)
|
||||
{
|
||||
#define ZPA2326_SA0(_addr) (_addr & BIT(0))
|
||||
#define ZPA2326_DEVICE_ID_SA0_SHIFT (1)
|
||||
|
||||
/* Identification register bit 1 mirrors device address bit 0. */
|
||||
return (ZPA2326_DEVICE_ID |
|
||||
(ZPA2326_SA0(client->addr) << ZPA2326_DEVICE_ID_SA0_SHIFT));
|
||||
}
|
||||
|
||||
static int zpa2326_probe_i2c(struct i2c_client *client,
|
||||
const struct i2c_device_id *i2c_id)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = devm_regmap_init_i2c(client, &zpa2326_regmap_i2c_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&client->dev, "failed to init registers map");
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
return zpa2326_probe(&client->dev, i2c_id->name, client->irq,
|
||||
zpa2326_i2c_hwid(client), regmap);
|
||||
}
|
||||
|
||||
static int zpa2326_remove_i2c(struct i2c_client *client)
|
||||
{
|
||||
zpa2326_remove(&client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id zpa2326_i2c_ids[] = {
|
||||
{ "zpa2326", 0 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, zpa2326_i2c_ids);
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id zpa2326_i2c_matches[] = {
|
||||
{ .compatible = "murata,zpa2326" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, zpa2326_i2c_matches);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver zpa2326_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "zpa2326-i2c",
|
||||
.of_match_table = of_match_ptr(zpa2326_i2c_matches),
|
||||
.pm = ZPA2326_PM_OPS,
|
||||
},
|
||||
.probe = zpa2326_probe_i2c,
|
||||
.remove = zpa2326_remove_i2c,
|
||||
.id_table = zpa2326_i2c_ids,
|
||||
};
|
||||
module_i2c_driver(zpa2326_i2c_driver);
|
||||
|
||||
MODULE_AUTHOR("Gregor Boirie <gregor.boirie@parrot.com>");
|
||||
MODULE_DESCRIPTION("I2C driver for Murata ZPA2326 pressure sensor");
|
||||
MODULE_LICENSE("GPL v2");
|
103
drivers/iio/pressure/zpa2326_spi.c
Normal file
103
drivers/iio/pressure/zpa2326_spi.c
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Murata ZPA2326 SPI pressure and temperature sensor driver
|
||||
*
|
||||
* Copyright (c) 2016 Parrot S.A.
|
||||
*
|
||||
* Author: Gregor Boirie <gregor.boirie@parrot.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/of_device.h>
|
||||
#include "zpa2326.h"
|
||||
|
||||
/*
|
||||
* read_flag_mask:
|
||||
* - address bit 7 must be set to request a register read operation
|
||||
* - address bit 6 must be set to request register address auto increment
|
||||
*/
|
||||
static const struct regmap_config zpa2326_regmap_spi_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.writeable_reg = zpa2326_isreg_writeable,
|
||||
.readable_reg = zpa2326_isreg_readable,
|
||||
.precious_reg = zpa2326_isreg_precious,
|
||||
.max_register = ZPA2326_TEMP_OUT_H_REG,
|
||||
.read_flag_mask = BIT(7) | BIT(6),
|
||||
.cache_type = REGCACHE_NONE,
|
||||
};
|
||||
|
||||
static int zpa2326_probe_spi(struct spi_device *spi)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int err;
|
||||
|
||||
regmap = devm_regmap_init_spi(spi, &zpa2326_regmap_spi_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(&spi->dev, "failed to init registers map");
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enforce SPI slave settings to prevent from DT misconfiguration.
|
||||
*
|
||||
* Clock is idle high. Sampling happens on trailing edge, i.e., rising
|
||||
* edge. Maximum bus frequency is 1 MHz. Registers are 8 bits wide.
|
||||
*/
|
||||
spi->mode = SPI_MODE_3;
|
||||
spi->max_speed_hz = min(spi->max_speed_hz, 1000000U);
|
||||
spi->bits_per_word = 8;
|
||||
err = spi_setup(spi);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return zpa2326_probe(&spi->dev, spi_get_device_id(spi)->name,
|
||||
spi->irq, ZPA2326_DEVICE_ID, regmap);
|
||||
}
|
||||
|
||||
static int zpa2326_remove_spi(struct spi_device *spi)
|
||||
{
|
||||
zpa2326_remove(&spi->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct spi_device_id zpa2326_spi_ids[] = {
|
||||
{ "zpa2326", 0 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, zpa2326_spi_ids);
|
||||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id zpa2326_spi_matches[] = {
|
||||
{ .compatible = "murata,zpa2326" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, zpa2326_spi_matches);
|
||||
#endif
|
||||
|
||||
static struct spi_driver zpa2326_spi_driver = {
|
||||
.driver = {
|
||||
.name = "zpa2326-spi",
|
||||
.of_match_table = of_match_ptr(zpa2326_spi_matches),
|
||||
.pm = ZPA2326_PM_OPS,
|
||||
},
|
||||
.probe = zpa2326_probe_spi,
|
||||
.remove = zpa2326_remove_spi,
|
||||
.id_table = zpa2326_spi_ids,
|
||||
};
|
||||
module_spi_driver(zpa2326_spi_driver);
|
||||
|
||||
MODULE_AUTHOR("Gregor Boirie <gregor.boirie@parrot.com>");
|
||||
MODULE_DESCRIPTION("SPI driver for Murata ZPA2326 pressure sensor");
|
||||
MODULE_LICENSE("GPL v2");
|
Loading…
Reference in New Issue
Block a user