Commit c8b741e1 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'iio-for-5.3a' of...

Merge tag 'iio-for-5.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next

Jonathan writes:

First set of new device support, features and cleanups for IIO in the 5.3 cycle

New device support
* mt6577
  - add supprot for the mt6765 which requires a few minor additional
    new features in the driver.

Yaml binding conversions
* adxl345
* isl29018
* tsl2583
* tsl2772

Minor features and improvements
* ad5758
  - declare an of_device_id table rather than just relying on the spi
    fallback which doesn't use the manufacturer id.
  - drop a set but not used variable left from previous refactor.
* ad7816
  - Add a bit more description to kconfig text.
* ad9523
  - change calculation order to improve frequency accuracy.
* adxl372
  - declare an of_device_id table
* adt7316
  - white space.
* at91_adc
  - Use dev_get_drvdata directly rather than boucing to the platform device
    and back again.
* cros_ec
  - add an id sysfs entry to bring in line with the other implementations.
* ds5522
  - drop a check on the of_node existing as we don't actually use it for
    anything.
* kxsd9
  - declare an of_device_id table.
* maxim_thermocouple
  - declare an of_device_id table.
* mt6577
  - add dt binding entry for mt8183 which is also supported.
* rcar-gyroadc
  - tidy up unnecessary error messages.
* stm32-dfsdm
  - improved error handling.
* stmpe-adc
  - drop an unnecessary variable assignment.
  - add an of_device_id table.
  - reinit completion on begin converstion to avoid a path in which
    previous round had been interrupted, also switch to non interruptible
    wait to avoid an issue with a user program using -pg
  - simplify interrupt handling by just having them always enabled.
  - reset all interrupts on startup and in the timeout handler to
    avoid getting stuck.
* sun4i-gpadc
  - SPDX

* tag 'iio-for-5.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: (28 commits)
  iio: adc: mediatek: mt6577-auxadc, add mt6765 support
  dt-bindings: iio: adc: mediatek: Add document for mt6765
  dt-bindings: iio: accel: adxl345: switch to YAML bindings
  iio: adc: sun4i-gpadc-iio convert to SPDX license tags
  iio: ad9523-1: Improve reported VCO frequency accuracy
  iio: dac: ds4422/ds4424 drop of_node check
  iio: stmpe-adc: Reset possible interrupts
  iio: stmpe-adc: Use wait_for_completion_timeout
  iio: stmpe-adc: Enable all stmpe-adc interrupts just once
  iio: stmpe-adc: Reinit completion struct on begin conversion
  iio: stmpe-adc: Add compatible name
  iio: stmpe-adc: Remove unnecessary assignment
  staging: iio: adc: Add paragraph to describe Kconfig symbol
  staging: iio: adt7316: match parenthesis alignment
  iio: adc: rcar-gyroadc: Remove devm_iio_device_alloc() error printing
  dt-bindings: iio: isl29018: convert bindings to YAML format
  dt-bindings: adc: mt8183: add binding document
  iio: dac: ad5758: remove set but not used variable 'dc_dc_mode'
  iio: cros_ec: add 'id' sysfs entry
  iio: adc: stm32-dfsdm: missing error case during probe
  ...
parents 941add8e 6d97024d
...@@ -18,11 +18,11 @@ Description: ...@@ -18,11 +18,11 @@ Description:
values are 'base' and 'lid'. values are 'base' and 'lid'.
What: /sys/bus/iio/devices/iio:deviceX/id What: /sys/bus/iio/devices/iio:deviceX/id
Date: Septembre 2017 Date: September 2017
KernelVersion: 4.14 KernelVersion: 4.14
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
This attribute is exposed by the CrOS EC legacy accelerometer This attribute is exposed by the CrOS EC sensors driver and
driver and represents the sensor ID as exposed by the EC. This represents the sensor ID as exposed by the EC. This ID is used
ID is used by the Android sensor service hardware abstraction by the Android sensor service hardware abstraction layer (sensor
layer (sensor HAL) through the Android container on ChromeOS. HAL) through the Android container on ChromeOS.
# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/iio/accelerometers/adi,adxl345.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Analog Devices ADXL345/ADXL375 3-Axis Digital Accelerometers
maintainers:
- Michael Hennerich <michael.hennerich@analog.com>
description: |
Analog Devices ADXL345/ADXL375 3-Axis Digital Accelerometers that supports
both I2C & SPI interfaces.
http://www.analog.com/en/products/mems/accelerometers/adxl345.html
http://www.analog.com/en/products/sensors-mems/accelerometers/adxl375.html
properties:
compatible:
enum:
- adi,adxl345
- adi,adxl375
reg:
maxItems: 1
spi-cpha: true
spi-cpol: true
interrupts:
maxItems: 1
required:
- compatible
- reg
- interrupts
examples:
- |
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
i2c0 {
#address-cells = <1>;
#size-cells = <0>;
/* Example for a I2C device node */
accelerometer@2a {
compatible = "adi,adxl345";
reg = <0x53>;
interrupt-parent = <&gpio0>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
};
};
- |
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
spi0 {
#address-cells = <1>;
#size-cells = <0>;
/* Example for a SPI device node */
accelerometer@0 {
compatible = "adi,adxl345";
reg = <0>;
spi-max-frequency = <5000000>;
spi-cpol;
spi-cpha;
interrupt-parent = <&gpio0>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
};
};
Analog Devices ADXL345/ADXL375 3-Axis Digital Accelerometers
http://www.analog.com/en/products/mems/accelerometers/adxl345.html
http://www.analog.com/en/products/sensors-mems/accelerometers/adxl375.html
Required properties:
- compatible : should be one of
"adi,adxl345"
"adi,adxl375"
- reg : the I2C address or SPI chip select number of the sensor
Required properties for SPI bus usage:
- spi-max-frequency : set maximum clock frequency, must be 5000000
- spi-cpol and spi-cpha : must be defined for adxl345 to enable SPI mode 3
Optional properties:
- interrupts: interrupt mapping for IRQ as documented in
Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
Example for a I2C device node:
accelerometer@2a {
compatible = "adi,adxl345";
reg = <0x53>;
interrupt-parent = <&gpio1>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
};
Example for a SPI device node:
accelerometer@0 {
compatible = "adi,adxl345";
reg = <0>;
spi-max-frequency = <5000000>;
spi-cpol;
spi-cpha;
interrupt-parent = <&gpio1>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
};
...@@ -13,8 +13,10 @@ Required properties: ...@@ -13,8 +13,10 @@ Required properties:
- compatible: Should be one of: - compatible: Should be one of:
- "mediatek,mt2701-auxadc": For MT2701 family of SoCs - "mediatek,mt2701-auxadc": For MT2701 family of SoCs
- "mediatek,mt2712-auxadc": For MT2712 family of SoCs - "mediatek,mt2712-auxadc": For MT2712 family of SoCs
- "mediatek,mt6765-auxadc": For MT6765 family of SoCs
- "mediatek,mt7622-auxadc": For MT7622 family of SoCs - "mediatek,mt7622-auxadc": For MT7622 family of SoCs
- "mediatek,mt8173-auxadc": For MT8173 family of SoCs - "mediatek,mt8173-auxadc": For MT8173 family of SoCs
- "mediatek,mt8183-auxadc", "mediatek,mt8173-auxadc": For MT8183 family of SoCs
- reg: Address range of the AUXADC unit. - reg: Address range of the AUXADC unit.
- clocks: Should contain a clock specifier for each entry in clock-names - clocks: Should contain a clock specifier for each entry in clock-names
- clock-names: Should contain "main". - clock-names: Should contain "main".
......
* ISL 29018/29023/29035 I2C ALS, Proximity, and Infrared sensor
Required properties:
- compatible: Should be one of
"isil,isl29018"
"isil,isl29023"
"isil,isl29035"
- reg: the I2C address of the device
Optional properties:
- interrupts: the sole interrupt generated by the device
Refer to interrupt-controller/interrupts.txt for generic interrupt client
node bindings.
- vcc-supply: phandle to the regulator that provides power to the sensor.
Example:
isl29018@44 {
compatible = "isil,isl29018";
reg = <0x44>;
interrupt-parent = <&gpio>;
interrupts = <TEGRA_GPIO(Z, 2) IRQ_TYPE_LEVEL_HIGH>;
};
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/iio/light/isl29018.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: |
Intersil 29018/29023/29035 Ambient Light, Infrared Light, and Proximity Sensor
maintainers:
- Brian Masney <masneyb@onstation.org>
description: |
Ambient and infrared light sensing with proximity detection over an i2c
interface.
https://www.renesas.com/us/en/www/doc/datasheet/isl29018.pdf
https://www.renesas.com/us/en/www/doc/datasheet/isl29023.pdf
https://www.renesas.com/us/en/www/doc/datasheet/isl29035.pdf
properties:
compatible:
enum:
- isil,isl29018
- isil,isl29023
- isil,isl29035
reg:
maxItems: 1
interrupts:
maxItems: 1
vcc-supply:
description: Regulator that provides power to the sensor
required:
- compatible
- reg
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
sensor@44 {
compatible = "isil,isl29018";
reg = <0x44>;
interrupts-extended = <&msmgpio 61 IRQ_TYPE_LEVEL_HIGH>;
};
};
...
* TAOS TSL 2580/2581/2583 ALS sensor
Required properties:
- compatible: Should be one of
"amstaos,tsl2580"
"amstaos,tsl2581"
"amstaos,tsl2583"
- reg: the I2C address of the device
Optional properties:
- interrupts: the sole interrupt generated by the device
Refer to interrupt-controller/interrupts.txt for generic interrupt client
node bindings.
- vcc-supply: phandle to the regulator that provides power to the sensor.
Example:
tsl2581@29 {
compatible = "amstaos,tsl2581";
reg = <0x29>;
};
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/iio/light/tsl2583.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: AMS/TAOS Ambient Light Sensor (ALS)
maintainers:
- Brian Masney <masneyb@onstation.org>
description: |
Ambient light sensing with an i2c interface.
properties:
compatible:
enum:
- amstaos,tsl2580
- amstaos,tsl2581
- amstaos,tsl2583
reg:
maxItems: 1
interrupts:
maxItems: 1
vcc-supply:
description: Regulator that provides power to the sensor
required:
- compatible
- reg
examples:
- |
i2c {
#address-cells = <1>;
#size-cells = <0>;
light-sensor@29 {
compatible = "amstaos,tsl2581";
reg = <0x29>;
};
};
...
* AMS/TAOS ALS and proximity sensor
Required properties:
- compatible: Should be one of
"amstaos,tsl2571"
"amstaos,tsl2671"
"amstaos,tmd2671"
"amstaos,tsl2771"
"amstaos,tmd2771"
"amstaos,tsl2572"
"amstaos,tsl2672"
"amstaos,tmd2672"
"amstaos,tsl2772"
"amstaos,tmd2772"
"avago,apds9930"
- reg: the I2C address of the device
Optional properties:
- amstaos,proximity-diodes - proximity diodes to enable. <0>, <1>, or <0 1>
are the only valid values.
- led-max-microamp - current for the proximity LED. Must be 100000, 50000,
25000, or 13000.
- vdd-supply: phandle to the regulator that provides power to the sensor.
- vddio-supply: phandle to the regulator that provides power to the bus.
- interrupts: the sole interrupt generated by the device
Refer to interrupt-controller/interrupts.txt for generic interrupt client
node bindings.
Example:
tsl2772@39 {
compatible = "amstaos,tsl2772";
reg = <0x39>;
interrupts-extended = <&msmgpio 61 IRQ_TYPE_EDGE_FALLING>;
vdd-supply = <&pm8941_l17>;
vddio-supply = <&pm8941_lvs1>;
amstaos,proximity-diodes = <0>;
led-max-microamp = <100000>;
};
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/iio/light/tsl2772.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: AMS/TAOS Ambient Light Sensor (ALS) and Proximity Detector
maintainers:
- Brian Masney <masneyb@onstation.org>
description: |
Ambient light sensing and proximity detection with an i2c interface.
https://ams.com/documents/20143/36005/TSL2772_DS000181_2-00.pdf
properties:
compatible:
enum:
- amstaos,tsl2571
- amstaos,tsl2671
- amstaos,tmd2671
- amstaos,tsl2771
- amstaos,tmd2771
- amstaos,tsl2572
- amstaos,tsl2672
- amstaos,tmd2672
- amstaos,tsl2772
- amstaos,tmd2772
- avago,apds9930
reg:
maxItems: 1
amstaos,proximity-diodes:
description: Proximity diodes to enable
allOf:
- $ref: /schemas/types.yaml#/definitions/uint32-array
- minItems: 1
maxItems: 2
items:
minimum: 0
maximum: 1
interrupts:
maxItems: 1
led-max-microamp:
description: Current for the proximity LED
enum:
- 13000
- 25000
- 50000
- 100000
vdd-supply:
description: Regulator that provides power to the sensor
vddio-supply:
description: Regulator that provides power to the bus
required:
- compatible
- reg
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
sensor@39 {
compatible = "amstaos,tsl2772";
reg = <0x39>;
interrupts-extended = <&msmgpio 61 IRQ_TYPE_EDGE_FALLING>;
vdd-supply = <&pm8941_l17>;
vddio-supply = <&pm8941_lvs1>;
amstaos,proximity-diodes = <0>;
led-max-microamp = <100000>;
};
};
...
...@@ -551,6 +551,7 @@ W: http://wiki.analog.com/ADXL345 ...@@ -551,6 +551,7 @@ W: http://wiki.analog.com/ADXL345
W: http://ez.analog.com/community/linux-device-drivers W: http://ez.analog.com/community/linux-device-drivers
S: Supported S: Supported
F: drivers/input/misc/adxl34x.c F: drivers/input/misc/adxl34x.c
F: Documentation/devicetree/bindings/iio/accel/adi,adxl345.yaml
ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER ADXL372 THREE-AXIS DIGITAL ACCELEROMETER DRIVER
M: Stefan Popa <stefan.popa@analog.com> M: Stefan Popa <stefan.popa@analog.com>
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include "adxl372.h" #include "adxl372.h"
...@@ -37,9 +39,16 @@ static const struct spi_device_id adxl372_spi_id[] = { ...@@ -37,9 +39,16 @@ static const struct spi_device_id adxl372_spi_id[] = {
}; };
MODULE_DEVICE_TABLE(spi, adxl372_spi_id); MODULE_DEVICE_TABLE(spi, adxl372_spi_id);
static const struct of_device_id adxl372_of_match[] = {
{ .compatible = "adi,adxl372" },
{ },
};
MODULE_DEVICE_TABLE(of, adxl372_of_match);
static struct spi_driver adxl372_spi_driver = { static struct spi_driver adxl372_spi_driver = {
.driver = { .driver = {
.name = "adxl372_spi", .name = "adxl372_spi",
.of_match_table = adxl372_of_match,
}, },
.probe = adxl372_spi_probe, .probe = adxl372_spi_probe,
.id_table = adxl372_spi_id, .id_table = adxl372_spi_id,
......
#include <linux/device.h> #include <linux/device.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -40,10 +42,17 @@ static const struct spi_device_id kxsd9_spi_id[] = { ...@@ -40,10 +42,17 @@ static const struct spi_device_id kxsd9_spi_id[] = {
}; };
MODULE_DEVICE_TABLE(spi, kxsd9_spi_id); MODULE_DEVICE_TABLE(spi, kxsd9_spi_id);
static const struct of_device_id kxsd9_of_match[] = {
{ .compatible = "kionix,kxsd9" },
{ },
};
MODULE_DEVICE_TABLE(of, kxsd9_of_match);
static struct spi_driver kxsd9_spi_driver = { static struct spi_driver kxsd9_spi_driver = {
.driver = { .driver = {
.name = "kxsd9", .name = "kxsd9",
.pm = &kxsd9_dev_pm_ops, .pm = &kxsd9_dev_pm_ops,
.of_match_table = kxsd9_of_match,
}, },
.probe = kxsd9_spi_probe, .probe = kxsd9_spi_probe,
.remove = kxsd9_spi_remove, .remove = kxsd9_spi_remove,
......
...@@ -1586,8 +1586,7 @@ static void at91_adc_hw_init(struct at91_adc_state *st) ...@@ -1586,8 +1586,7 @@ static void at91_adc_hw_init(struct at91_adc_state *st)
static ssize_t at91_adc_get_fifo_state(struct device *dev, static ssize_t at91_adc_get_fifo_state(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct iio_dev *indio_dev = struct iio_dev *indio_dev = dev_get_drvdata(dev);
platform_get_drvdata(to_platform_device(dev));
struct at91_adc_state *st = iio_priv(indio_dev); struct at91_adc_state *st = iio_priv(indio_dev);
return scnprintf(buf, PAGE_SIZE, "%d\n", !!st->dma_st.dma_chan); return scnprintf(buf, PAGE_SIZE, "%d\n", !!st->dma_st.dma_chan);
...@@ -1596,8 +1595,7 @@ static ssize_t at91_adc_get_fifo_state(struct device *dev, ...@@ -1596,8 +1595,7 @@ static ssize_t at91_adc_get_fifo_state(struct device *dev,
static ssize_t at91_adc_get_watermark(struct device *dev, static ssize_t at91_adc_get_watermark(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct iio_dev *indio_dev = struct iio_dev *indio_dev = dev_get_drvdata(dev);
platform_get_drvdata(to_platform_device(dev));
struct at91_adc_state *st = iio_priv(indio_dev); struct at91_adc_state *st = iio_priv(indio_dev);
return scnprintf(buf, PAGE_SIZE, "%d\n", st->dma_st.watermark); return scnprintf(buf, PAGE_SIZE, "%d\n", st->dma_st.watermark);
...@@ -1849,8 +1847,7 @@ static int at91_adc_remove(struct platform_device *pdev) ...@@ -1849,8 +1847,7 @@ static int at91_adc_remove(struct platform_device *pdev)
static __maybe_unused int at91_adc_suspend(struct device *dev) static __maybe_unused int at91_adc_suspend(struct device *dev)
{ {
struct iio_dev *indio_dev = struct iio_dev *indio_dev = dev_get_drvdata(dev);
platform_get_drvdata(to_platform_device(dev));
struct at91_adc_state *st = iio_priv(indio_dev); struct at91_adc_state *st = iio_priv(indio_dev);
/* /*
...@@ -1870,8 +1867,7 @@ static __maybe_unused int at91_adc_suspend(struct device *dev) ...@@ -1870,8 +1867,7 @@ static __maybe_unused int at91_adc_suspend(struct device *dev)
static __maybe_unused int at91_adc_resume(struct device *dev) static __maybe_unused int at91_adc_resume(struct device *dev)
{ {
struct iio_dev *indio_dev = struct iio_dev *indio_dev = dev_get_drvdata(dev);
platform_get_drvdata(to_platform_device(dev));
struct at91_adc_state *st = iio_priv(indio_dev); struct at91_adc_state *st = iio_priv(indio_dev);
int ret; int ret;
......
...@@ -1360,7 +1360,7 @@ static int at91_adc_remove(struct platform_device *pdev) ...@@ -1360,7 +1360,7 @@ static int at91_adc_remove(struct platform_device *pdev)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int at91_adc_suspend(struct device *dev) static int at91_adc_suspend(struct device *dev)
{ {
struct iio_dev *idev = platform_get_drvdata(to_platform_device(dev)); struct iio_dev *idev = dev_get_drvdata(dev);
struct at91_adc_state *st = iio_priv(idev); struct at91_adc_state *st = iio_priv(idev);
pinctrl_pm_select_sleep_state(dev); pinctrl_pm_select_sleep_state(dev);
...@@ -1371,7 +1371,7 @@ static int at91_adc_suspend(struct device *dev) ...@@ -1371,7 +1371,7 @@ static int at91_adc_suspend(struct device *dev)
static int at91_adc_resume(struct device *dev) static int at91_adc_resume(struct device *dev)
{ {
struct iio_dev *idev = platform_get_drvdata(to_platform_device(dev)); struct iio_dev *idev = dev_get_drvdata(dev);
struct at91_adc_state *st = iio_priv(idev); struct at91_adc_state *st = iio_priv(idev);
clk_prepare_enable(st->clk); clk_prepare_enable(st->clk);
......
...@@ -42,10 +42,26 @@ ...@@ -42,10 +42,26 @@
#define MT6577_AUXADC_POWER_READY_MS 1 #define MT6577_AUXADC_POWER_READY_MS 1
#define MT6577_AUXADC_SAMPLE_READY_US 25 #define MT6577_AUXADC_SAMPLE_READY_US 25
struct mtk_auxadc_compatible {
bool sample_data_cali;
bool check_global_idle;
};
struct mt6577_auxadc_device { struct mt6577_auxadc_device {
void __iomem *reg_base; void __iomem *reg_base;
struct clk *adc_clk; struct clk *adc_clk;
struct mutex lock; struct mutex lock;
const struct mtk_auxadc_compatible *dev_comp;
};
static const struct mtk_auxadc_compatible mt8173_compat = {
.sample_data_cali = false,
.check_global_idle = true,
};
static const struct mtk_auxadc_compatible mt6765_compat = {
.sample_data_cali = true,
.check_global_idle = false,
}; };
#define MT6577_AUXADC_CHANNEL(idx) { \ #define MT6577_AUXADC_CHANNEL(idx) { \
...@@ -74,6 +90,11 @@ static const struct iio_chan_spec mt6577_auxadc_iio_channels[] = { ...@@ -74,6 +90,11 @@ static const struct iio_chan_spec mt6577_auxadc_iio_channels[] = {
MT6577_AUXADC_CHANNEL(15), MT6577_AUXADC_CHANNEL(15),
}; };
static int mt_auxadc_get_cali_data(int rawdata, bool enable_cali)
{
return rawdata;
}
static inline void mt6577_auxadc_mod_reg(void __iomem *reg, static inline void mt6577_auxadc_mod_reg(void __iomem *reg,
u32 or_mask, u32 and_mask) u32 or_mask, u32 and_mask)
{ {
...@@ -120,9 +141,10 @@ static int mt6577_auxadc_read(struct iio_dev *indio_dev, ...@@ -120,9 +141,10 @@ static int mt6577_auxadc_read(struct iio_dev *indio_dev,
/* we must delay here for hardware sample channel data */ /* we must delay here for hardware sample channel data */
udelay(MT6577_AUXADC_SAMPLE_READY_US); udelay(MT6577_AUXADC_SAMPLE_READY_US);
if (adc_dev->dev_comp->check_global_idle) {
/* check MTK_AUXADC_CON2 if auxadc is idle */ /* check MTK_AUXADC_CON2 if auxadc is idle */
ret = readl_poll_timeout(adc_dev->reg_base + MT6577_AUXADC_CON2, val, ret = readl_poll_timeout(adc_dev->reg_base + MT6577_AUXADC_CON2,
((val & MT6577_AUXADC_STA) == 0), val, ((val & MT6577_AUXADC_STA) == 0),
MT6577_AUXADC_SLEEP_US, MT6577_AUXADC_SLEEP_US,
MT6577_AUXADC_TIMEOUT_US); MT6577_AUXADC_TIMEOUT_US);
if (ret < 0) { if (ret < 0) {
...@@ -130,6 +152,7 @@ static int mt6577_auxadc_read(struct iio_dev *indio_dev, ...@@ -130,6 +152,7 @@ static int mt6577_auxadc_read(struct iio_dev *indio_dev,
"wait for auxadc idle time out\n"); "wait for auxadc idle time out\n");
goto err_timeout; goto err_timeout;
} }
}
/* read channel and make sure ready bit == 1 */ /* read channel and make sure ready bit == 1 */
ret = readl_poll_timeout(reg_channel, val, ret = readl_poll_timeout(reg_channel, val,
...@@ -163,6 +186,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev, ...@@ -163,6 +186,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev,
int *val2, int *val2,
long info) long info)
{ {
struct mt6577_auxadc_device *adc_dev = iio_priv(indio_dev);
switch (info) { switch (info) {
case IIO_CHAN_INFO_PROCESSED: case IIO_CHAN_INFO_PROCESSED:
*val = mt6577_auxadc_read(indio_dev, chan); *val = mt6577_auxadc_read(indio_dev, chan);
...@@ -172,6 +197,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev, ...@@ -172,6 +197,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev,
chan->channel); chan->channel);
return *val; return *val;
} }
if (adc_dev->dev_comp->sample_data_cali)
*val = mt_auxadc_get_cali_data(*val, true);
return IIO_VAL_INT; return IIO_VAL_INT;
default: default:
...@@ -304,10 +331,11 @@ static SIMPLE_DEV_PM_OPS(mt6577_auxadc_pm_ops, ...@@ -304,10 +331,11 @@ static SIMPLE_DEV_PM_OPS(mt6577_auxadc_pm_ops,
mt6577_auxadc_resume); mt6577_auxadc_resume);
static const struct of_device_id mt6577_auxadc_of_match[] = { static const struct of_device_id mt6577_auxadc_of_match[] = {
{ .compatible = "mediatek,mt2701-auxadc", }, { .compatible = "mediatek,mt2701-auxadc", .data = &mt8173_compat},
{ .compatible = "mediatek,mt2712-auxadc", }, { .compatible = "mediatek,mt2712-auxadc", .data = &mt8173_compat},
{ .compatible = "mediatek,mt7622-auxadc", }, { .compatible = "mediatek,mt7622-auxadc", .data = &mt8173_compat},
{ .compatible = "mediatek,mt8173-auxadc", }, { .compatible = "mediatek,mt8173-auxadc", .data = &mt8173_compat},
{ .compatible = "mediatek,mt6765-auxadc", .data = &mt6765_compat},
{ } { }
}; };
MODULE_DEVICE_TABLE(of, mt6577_auxadc_of_match); MODULE_DEVICE_TABLE(of, mt6577_auxadc_of_match);
......
...@@ -485,10 +485,8 @@ static int rcar_gyroadc_probe(struct platform_device *pdev) ...@@ -485,10 +485,8 @@ static int rcar_gyroadc_probe(struct platform_device *pdev)
int ret; int ret;
indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
if (!indio_dev) { if (!indio_dev)
dev_err(dev, "Failed to allocate IIO device.\n");
return -ENOMEM; return -ENOMEM;
}
priv = iio_priv(indio_dev); priv = iio_priv(indio_dev);
priv->dev = dev; priv->dev = dev;
......
...@@ -1456,6 +1456,12 @@ static int stm32_dfsdm_adc_probe(struct platform_device *pdev) ...@@ -1456,6 +1456,12 @@ static int stm32_dfsdm_adc_probe(struct platform_device *pdev)
* So IRQ associated to filter instance 0 is dedicated to the Filter 0. * So IRQ associated to filter instance 0 is dedicated to the Filter 0.
*/ */
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq < 0) {
if (irq != -EPROBE_DEFER)
dev_err(dev, "Failed to get IRQ: %d\n", irq);
return irq;
}
ret = devm_request_irq(dev, irq, stm32_dfsdm_irq, ret = devm_request_irq(dev, irq, stm32_dfsdm_irq,
0, pdev->name, adc); 0, pdev->name, adc);
if (ret < 0) { if (ret < 0) {
......
...@@ -233,6 +233,8 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, ...@@ -233,6 +233,8 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev,
} }
priv->dfsdm.phys_base = res->start; priv->dfsdm.phys_base = res->start;
priv->dfsdm.base = devm_ioremap_resource(&pdev->dev, res); priv->dfsdm.base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(priv->dfsdm.base))
return PTR_ERR(priv->dfsdm.base);
/* /*
* "dfsdm" clock is mandatory for DFSDM peripheral clocking. * "dfsdm" clock is mandatory for DFSDM peripheral clocking.
...@@ -242,8 +244,10 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, ...@@ -242,8 +244,10 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev,
*/ */
priv->clk = devm_clk_get(&pdev->dev, "dfsdm"); priv->clk = devm_clk_get(&pdev->dev, "dfsdm");
if (IS_ERR(priv->clk)) { if (IS_ERR(priv->clk)) {
dev_err(&pdev->dev, "No stm32_dfsdm_clk clock found\n"); ret = PTR_ERR(priv->clk);
return -EINVAL; if (ret != -EPROBE_DEFER)
dev_err(&pdev->dev, "Failed to get clock (%d)\n", ret);
return ret;
} }
priv->aclk = devm_clk_get(&pdev->dev, "audio"); priv->aclk = devm_clk_get(&pdev->dev, "audio");
......
...@@ -65,6 +65,8 @@ static int stmpe_read_voltage(struct stmpe_adc *info, ...@@ -65,6 +65,8 @@ static int stmpe_read_voltage(struct stmpe_adc *info,
mutex_lock(&info->lock); mutex_lock(&info->lock);
reinit_completion(&info->completion);
info->channel = (u8)chan->channel; info->channel = (u8)chan->channel;
if (info->channel > STMPE_ADC_LAST_NR) { if (info->channel > STMPE_ADC_LAST_NR) {
...@@ -72,23 +74,16 @@ static int stmpe_read_voltage(struct stmpe_adc *info, ...@@ -72,23 +74,16 @@ static int stmpe_read_voltage(struct stmpe_adc *info,
return -EINVAL; return -EINVAL;
} }
stmpe_reg_write(info->stmpe, STMPE_REG_ADC_INT_EN,
STMPE_ADC_CH(info->channel));
stmpe_reg_write(info->stmpe, STMPE_REG_ADC_CAPT, stmpe_reg_write(info->stmpe, STMPE_REG_ADC_CAPT,
STMPE_ADC_CH(info->channel)); STMPE_ADC_CH(info->channel));
*val = info->value; ret = wait_for_completion_timeout(&info->completion, STMPE_ADC_TIMEOUT);
ret = wait_for_completion_interruptible_timeout
(&info->completion, STMPE_ADC_TIMEOUT);
if (ret <= 0) { if (ret <= 0) {
stmpe_reg_write(info->stmpe, STMPE_REG_ADC_INT_STA,
STMPE_ADC_CH(info->channel));
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
if (ret == 0)
return -ETIMEDOUT; return -ETIMEDOUT;
else
return ret;
} }
*val = info->value; *val = info->value;
...@@ -105,6 +100,8 @@ static int stmpe_read_temp(struct stmpe_adc *info, ...@@ -105,6 +100,8 @@ static int stmpe_read_temp(struct stmpe_adc *info,
mutex_lock(&info->lock); mutex_lock(&info->lock);
reinit_completion(&info->completion);
info->channel = (u8)chan->channel; info->channel = (u8)chan->channel;
if (info->channel != STMPE_TEMP_CHANNEL) { if (info->channel != STMPE_TEMP_CHANNEL) {
...@@ -115,15 +112,11 @@ static int stmpe_read_temp(struct stmpe_adc *info, ...@@ -115,15 +112,11 @@ static int stmpe_read_temp(struct stmpe_adc *info,
stmpe_reg_write(info->stmpe, STMPE_REG_TEMP_CTRL, stmpe_reg_write(info->stmpe, STMPE_REG_TEMP_CTRL,
STMPE_START_ONE_TEMP_CONV); STMPE_START_ONE_TEMP_CONV);
ret = wait_for_completion_interruptible_timeout ret = wait_for_completion_timeout(&info->completion, STMPE_ADC_TIMEOUT);
(&info->completion, STMPE_ADC_TIMEOUT);
if (ret <= 0) { if (ret <= 0) {
mutex_unlock(&info->lock); mutex_unlock(&info->lock);
if (ret == 0)
return -ETIMEDOUT; return -ETIMEDOUT;
else
return ret;
} }
/* /*
...@@ -331,6 +324,12 @@ static int stmpe_adc_probe(struct platform_device *pdev) ...@@ -331,6 +324,12 @@ static int stmpe_adc_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
stmpe_reg_write(info->stmpe, STMPE_REG_ADC_INT_EN,
~(norequest_mask & 0xFF));
stmpe_reg_write(info->stmpe, STMPE_REG_ADC_INT_STA,
~(norequest_mask & 0xFF));
return devm_iio_device_register(&pdev->dev, indio_dev); return devm_iio_device_register(&pdev->dev, indio_dev);
} }
...@@ -353,9 +352,14 @@ static struct platform_driver stmpe_adc_driver = { ...@@ -353,9 +352,14 @@ static struct platform_driver stmpe_adc_driver = {
.pm = &stmpe_adc_pm_ops, .pm = &stmpe_adc_pm_ops,
}, },
}; };
module_platform_driver(stmpe_adc_driver); module_platform_driver(stmpe_adc_driver);
static const struct of_device_id stmpe_adc_ids[] = {
{ .compatible = "st,stmpe-adc", },
{ },
};
MODULE_DEVICE_TABLE(of, stmpe_adc_ids);
MODULE_AUTHOR("Stefan Agner <stefan.agner@toradex.com>"); MODULE_AUTHOR("Stefan Agner <stefan.agner@toradex.com>");
MODULE_DESCRIPTION("STMPEXXX ADC driver"); MODULE_DESCRIPTION("STMPEXXX ADC driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
......
// SPDX-License-Identifier: GPL-2.0
/* ADC driver for sunxi platforms' (A10, A13 and A31) GPADC /* ADC driver for sunxi platforms' (A10, A13 and A31) GPADC
* *
* Copyright (c) 2016 Quentin Schulz <quentin.schulz@free-electrons.com> * Copyright (c) 2016 Quentin Schulz <quentin.schulz@free-electrons.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.
*
* The Allwinner SoCs all have an ADC that can also act as a touchscreen * The Allwinner SoCs all have an ADC that can also act as a touchscreen
* controller and a thermal sensor. * controller and a thermal sensor.
* The thermal sensor works only when the ADC acts as a touchscreen controller * The thermal sensor works only when the ADC acts as a touchscreen controller
......
...@@ -125,6 +125,15 @@ static ssize_t cros_ec_sensors_calibrate(struct iio_dev *indio_dev, ...@@ -125,6 +125,15 @@ static ssize_t cros_ec_sensors_calibrate(struct iio_dev *indio_dev,
return ret ? ret : len; return ret ? ret : len;
} }
static ssize_t cros_ec_sensors_id(struct iio_dev *indio_dev,
uintptr_t private,
const struct iio_chan_spec *chan, char *buf)
{
struct cros_ec_sensors_core_state *st = iio_priv(indio_dev);
return snprintf(buf, PAGE_SIZE, "%d\n", st->param.info.sensor_num);
}
static ssize_t cros_ec_sensors_loc(struct iio_dev *indio_dev, static ssize_t cros_ec_sensors_loc(struct iio_dev *indio_dev,
uintptr_t private, const struct iio_chan_spec *chan, uintptr_t private, const struct iio_chan_spec *chan,
char *buf) char *buf)
...@@ -140,6 +149,11 @@ const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[] = { ...@@ -140,6 +149,11 @@ const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[] = {
.shared = IIO_SHARED_BY_ALL, .shared = IIO_SHARED_BY_ALL,
.write = cros_ec_sensors_calibrate .write = cros_ec_sensors_calibrate
}, },
{
.name = "id",
.shared = IIO_SHARED_BY_ALL,
.read = cros_ec_sensors_id
},
{ {
.name = "location", .name = "location",
.shared = IIO_SHARED_BY_ALL, .shared = IIO_SHARED_BY_ALL,
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/property.h> #include <linux/property.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/gpio/consumer.h> #include <linux/gpio/consumer.h>
...@@ -582,7 +584,7 @@ static ssize_t ad5758_write_powerdown(struct iio_dev *indio_dev, ...@@ -582,7 +584,7 @@ static ssize_t ad5758_write_powerdown(struct iio_dev *indio_dev,
{ {
struct ad5758_state *st = iio_priv(indio_dev); struct ad5758_state *st = iio_priv(indio_dev);
bool pwr_down; bool pwr_down;
unsigned int dc_dc_mode, dac_config_mode, val; unsigned int dac_config_mode, val;
unsigned long int dac_config_msk; unsigned long int dac_config_msk;
int ret; int ret;
...@@ -591,13 +593,10 @@ static ssize_t ad5758_write_powerdown(struct iio_dev *indio_dev, ...@@ -591,13 +593,10 @@ static ssize_t ad5758_write_powerdown(struct iio_dev *indio_dev,
return ret; return ret;
mutex_lock(&st->lock); mutex_lock(&st->lock);
if (pwr_down) { if (pwr_down)
dc_dc_mode = AD5758_DCDC_MODE_POWER_OFF;
val = 0; val = 0;
} else { else
dc_dc_mode = st->dc_dc_mode;
val = 1; val = 1;
}
dac_config_mode = AD5758_DAC_CONFIG_OUT_EN_MODE(val) | dac_config_mode = AD5758_DAC_CONFIG_OUT_EN_MODE(val) |
AD5758_DAC_CONFIG_INT_EN_MODE(val); AD5758_DAC_CONFIG_INT_EN_MODE(val);
...@@ -885,9 +884,16 @@ static const struct spi_device_id ad5758_id[] = { ...@@ -885,9 +884,16 @@ static const struct spi_device_id ad5758_id[] = {
}; };
MODULE_DEVICE_TABLE(spi, ad5758_id); MODULE_DEVICE_TABLE(spi, ad5758_id);
static const struct of_device_id ad5758_of_match[] = {
{ .compatible = "adi,ad5758" },
{ },
};
MODULE_DEVICE_TABLE(of, ad5758_of_match);
static struct spi_driver ad5758_driver = { static struct spi_driver ad5758_driver = {
.driver = { .driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.of_match_table = ad5758_of_match,
}, },
.probe = ad5758_probe, .probe = ad5758_probe,
.id_table = ad5758_id, .id_table = ad5758_id,
......
...@@ -236,12 +236,6 @@ static int ds4424_probe(struct i2c_client *client, ...@@ -236,12 +236,6 @@ static int ds4424_probe(struct i2c_client *client,
indio_dev->dev.of_node = client->dev.of_node; indio_dev->dev.of_node = client->dev.of_node;
indio_dev->dev.parent = &client->dev; indio_dev->dev.parent = &client->dev;
if (!client->dev.of_node) {
dev_err(&client->dev,
"Not found DT.\n");
return -ENODEV;
}
data->vcc_reg = devm_regulator_get(&client->dev, "vcc"); data->vcc_reg = devm_regulator_get(&client->dev, "vcc");
if (IS_ERR(data->vcc_reg)) { if (IS_ERR(data->vcc_reg)) {
dev_err(&client->dev, dev_err(&client->dev,
......
...@@ -862,9 +862,11 @@ static int ad9523_setup(struct iio_dev *indio_dev) ...@@ -862,9 +862,11 @@ static int ad9523_setup(struct iio_dev *indio_dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
st->vco_freq = (pdata->vcxo_freq * (pdata->pll2_freq_doubler_en ? 2 : 1) st->vco_freq = div_u64((unsigned long long)pdata->vcxo_freq *
/ pdata->pll2_r2_div) * AD9523_PLL2_FB_NDIV(pdata-> (pdata->pll2_freq_doubler_en ? 2 : 1) *
pll2_ndiv_a_cnt, pdata->pll2_ndiv_b_cnt); AD9523_PLL2_FB_NDIV(pdata->pll2_ndiv_a_cnt,
pdata->pll2_ndiv_b_cnt),
pdata->pll2_r2_div);
ret = ad9523_write(indio_dev, AD9523_PLL2_VCO_CTRL, ret = ad9523_write(indio_dev, AD9523_PLL2_VCO_CTRL,
AD9523_PLL2_VCO_CALIBRATE); AD9523_PLL2_VCO_CALIBRATE);
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/iio/trigger.h> #include <linux/iio/trigger.h>
...@@ -262,9 +264,17 @@ static const struct spi_device_id maxim_thermocouple_id[] = { ...@@ -262,9 +264,17 @@ static const struct spi_device_id maxim_thermocouple_id[] = {
}; };
MODULE_DEVICE_TABLE(spi, maxim_thermocouple_id); MODULE_DEVICE_TABLE(spi, maxim_thermocouple_id);
static const struct of_device_id maxim_thermocouple_of_match[] = {
{ .compatible = "maxim,max6675" },
{ .compatible = "maxim,max31855" },
{ },
};
MODULE_DEVICE_TABLE(of, maxim_thermocouple_of_match);
static struct spi_driver maxim_thermocouple_driver = { static struct spi_driver maxim_thermocouple_driver = {
.driver = { .driver = {
.name = MAXIM_THERMOCOUPLE_DRV_NAME, .name = MAXIM_THERMOCOUPLE_DRV_NAME,
.of_match_table = maxim_thermocouple_of_match,
}, },
.probe = maxim_thermocouple_probe, .probe = maxim_thermocouple_probe,
.remove = maxim_thermocouple_remove, .remove = maxim_thermocouple_remove,
......
...@@ -12,6 +12,9 @@ config AD7816 ...@@ -12,6 +12,9 @@ config AD7816
Say yes here to build support for Analog Devices AD7816/7/8 Say yes here to build support for Analog Devices AD7816/7/8
temperature sensors and ADC. temperature sensors and ADC.
To compile this driver as a module, choose M here: the
module will be called ad7816.
config AD7192 config AD7192
tristate "Analog Devices AD7190 AD7192 AD7193 AD7195 ADC driver" tristate "Analog Devices AD7190 AD7192 AD7193 AD7195 ADC driver"
depends on SPI depends on SPI
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment