Skip to content
Snippets Groups Projects
Commit ce49b628 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'staging-3.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull staging tree update from Greg KH:
 "Here's the large staging tree merge for 3.11-rc1

  Huge thing here is the Lustre client code.  Unfortunatly, due to it
  not building properly on a wide variety of different architectures
  (this was production code???), it is currently disabled from the build
  so as to not annoy people.

  Other than Lustre, there are loads of comedi patches, working to clean
  up that subsystem, iio updates and new drivers, and a load of cleanups
  from the OPW applicants in their quest to get a summer internship.

  All of these have been in the linux-next releases for a while (hence
  the Lustre code being disabled)"

Fixed up trivial conflict in drivers/staging/serqt_usb2/serqt_usb2.c due
to independent renamings in the staging driver cleanup and the USB
tree..

* tag 'staging-3.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (868 commits)
  Revert "Revert "Revert "staging/lustre: drop CONFIG_BROKEN dependency"""
  staging: rtl8192u: fix line length in r819xU_phy.h
  staging: rtl8192u: rename variables in r819xU_phy.h
  staging: rtl8192u: fix comments in r819xU_phy.h
  staging: rtl8192u: fix whitespace in r819xU_phy.h
  staging: rtl8192u: fix newlines in r819xU_phy.c
  staging: comedi: unioxx5: use comedi_alloc_spriv()
  staging: comedi: unioxx5: fix unioxx5_detach()
  silicom: checkpatch: errors caused by macros
  Staging: silicom: remove the board_t typedef in bpctl_mod.c
  Staging: silicom: capitalize labels in the bp_media_type enum
  Staging: silicom: remove bp_media_type enum typedef
  staging: rtl8192u: replace msleep(1) with usleep_range() in r819xU_phy.c
  staging: rtl8192u: rename dwRegRead and rtStatus in r819xU_phy.c
  staging: rtl8192u: replace __FUNCTION__ in r819xU_phy.c
  staging: rtl8192u: limit line size in r819xU_phy.c
  zram: allow request end to coincide with disksize
  staging: drm/imx: use generic irq chip unused field to block out invalid irqs
  staging: drm/imx: use generic irqchip
  staging: drm/imx: ipu-dmfc: use defines for ipu channel numbers
  ...
parents 0de10f9e 0ad1ea69
No related merge requests found
Showing
with 657 additions and 97 deletions
...@@ -690,45 +690,45 @@ Description: ...@@ -690,45 +690,45 @@ Description:
Actually start the buffer capture up. Will start trigger Actually start the buffer capture up. Will start trigger
if first device and appropriate. if first device and appropriate.
What: /sys/bus/iio/devices/iio:deviceX/buffer/scan_elements What: /sys/bus/iio/devices/iio:deviceX/scan_elements
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
Directory containing interfaces for elements that will be Directory containing interfaces for elements that will be
captured for a single triggered sample set in the buffer. captured for a single triggered sample set in the buffer.
What: /sys/.../buffer/scan_elements/in_accel_x_en What: /sys/.../iio:deviceX/scan_elements/in_accel_x_en
What: /sys/.../buffer/scan_elements/in_accel_y_en What: /sys/.../iio:deviceX/scan_elements/in_accel_y_en
What: /sys/.../buffer/scan_elements/in_accel_z_en What: /sys/.../iio:deviceX/scan_elements/in_accel_z_en
What: /sys/.../buffer/scan_elements/in_anglvel_x_en What: /sys/.../iio:deviceX/scan_elements/in_anglvel_x_en
What: /sys/.../buffer/scan_elements/in_anglvel_y_en What: /sys/.../iio:deviceX/scan_elements/in_anglvel_y_en
What: /sys/.../buffer/scan_elements/in_anglvel_z_en What: /sys/.../iio:deviceX/scan_elements/in_anglvel_z_en
What: /sys/.../buffer/scan_elements/in_magn_x_en What: /sys/.../iio:deviceX/scan_elements/in_magn_x_en
What: /sys/.../buffer/scan_elements/in_magn_y_en What: /sys/.../iio:deviceX/scan_elements/in_magn_y_en
What: /sys/.../buffer/scan_elements/in_magn_z_en What: /sys/.../iio:deviceX/scan_elements/in_magn_z_en
What: /sys/.../buffer/scan_elements/in_timestamp_en What: /sys/.../iio:deviceX/scan_elements/in_timestamp_en
What: /sys/.../buffer/scan_elements/in_voltageY_supply_en What: /sys/.../iio:deviceX/scan_elements/in_voltageY_supply_en
What: /sys/.../buffer/scan_elements/in_voltageY_en What: /sys/.../iio:deviceX/scan_elements/in_voltageY_en
What: /sys/.../buffer/scan_elements/in_voltageY-voltageZ_en What: /sys/.../iio:deviceX/scan_elements/in_voltageY-voltageZ_en
What: /sys/.../buffer/scan_elements/in_incli_x_en What: /sys/.../iio:deviceX/scan_elements/in_incli_x_en
What: /sys/.../buffer/scan_elements/in_incli_y_en What: /sys/.../iio:deviceX/scan_elements/in_incli_y_en
What: /sys/.../buffer/scan_elements/in_pressureY_en What: /sys/.../iio:deviceX/scan_elements/in_pressureY_en
What: /sys/.../buffer/scan_elements/in_pressure_en What: /sys/.../iio:deviceX/scan_elements/in_pressure_en
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
Scan element control for triggered data capture. Scan element control for triggered data capture.
What: /sys/.../buffer/scan_elements/in_accel_type What: /sys/.../iio:deviceX/scan_elements/in_accel_type
What: /sys/.../buffer/scan_elements/in_anglvel_type What: /sys/.../iio:deviceX/scan_elements/in_anglvel_type
What: /sys/.../buffer/scan_elements/in_magn_type What: /sys/.../iio:deviceX/scan_elements/in_magn_type
What: /sys/.../buffer/scan_elements/in_incli_type What: /sys/.../iio:deviceX/scan_elements/in_incli_type
What: /sys/.../buffer/scan_elements/in_voltageY_type What: /sys/.../iio:deviceX/scan_elements/in_voltageY_type
What: /sys/.../buffer/scan_elements/in_voltage_type What: /sys/.../iio:deviceX/scan_elements/in_voltage_type
What: /sys/.../buffer/scan_elements/in_voltageY_supply_type What: /sys/.../iio:deviceX/scan_elements/in_voltageY_supply_type
What: /sys/.../buffer/scan_elements/in_timestamp_type What: /sys/.../iio:deviceX/scan_elements/in_timestamp_type
What: /sys/.../buffer/scan_elements/in_pressureY_type What: /sys/.../iio:deviceX/scan_elements/in_pressureY_type
What: /sys/.../buffer/scan_elements/in_pressure_type What: /sys/.../iio:deviceX/scan_elements/in_pressure_type
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
...@@ -752,29 +752,29 @@ Description: ...@@ -752,29 +752,29 @@ Description:
For other storage combinations this attribute will be extended For other storage combinations this attribute will be extended
appropriately. appropriately.
What: /sys/.../buffer/scan_elements/in_accel_type_available What: /sys/.../iio:deviceX/scan_elements/in_accel_type_available
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
If the type parameter can take one of a small set of values, If the type parameter can take one of a small set of values,
this attribute lists them. this attribute lists them.
What: /sys/.../buffer/scan_elements/in_voltageY_index What: /sys/.../iio:deviceX/scan_elements/in_voltageY_index
What: /sys/.../buffer/scan_elements/in_voltageY_supply_index What: /sys/.../iio:deviceX/scan_elements/in_voltageY_supply_index
What: /sys/.../buffer/scan_elements/in_accel_x_index What: /sys/.../iio:deviceX/scan_elements/in_accel_x_index
What: /sys/.../buffer/scan_elements/in_accel_y_index What: /sys/.../iio:deviceX/scan_elements/in_accel_y_index
What: /sys/.../buffer/scan_elements/in_accel_z_index What: /sys/.../iio:deviceX/scan_elements/in_accel_z_index
What: /sys/.../buffer/scan_elements/in_anglvel_x_index What: /sys/.../iio:deviceX/scan_elements/in_anglvel_x_index
What: /sys/.../buffer/scan_elements/in_anglvel_y_index What: /sys/.../iio:deviceX/scan_elements/in_anglvel_y_index
What: /sys/.../buffer/scan_elements/in_anglvel_z_index What: /sys/.../iio:deviceX/scan_elements/in_anglvel_z_index
What: /sys/.../buffer/scan_elements/in_magn_x_index What: /sys/.../iio:deviceX/scan_elements/in_magn_x_index
What: /sys/.../buffer/scan_elements/in_magn_y_index What: /sys/.../iio:deviceX/scan_elements/in_magn_y_index
What: /sys/.../buffer/scan_elements/in_magn_z_index What: /sys/.../iio:deviceX/scan_elements/in_magn_z_index
What: /sys/.../buffer/scan_elements/in_incli_x_index What: /sys/.../iio:deviceX/scan_elements/in_incli_x_index
What: /sys/.../buffer/scan_elements/in_incli_y_index What: /sys/.../iio:deviceX/scan_elements/in_incli_y_index
What: /sys/.../buffer/scan_elements/in_timestamp_index What: /sys/.../iio:deviceX/scan_elements/in_timestamp_index
What: /sys/.../buffer/scan_elements/in_pressureY_index What: /sys/.../iio:deviceX/scan_elements/in_pressureY_index
What: /sys/.../buffer/scan_elements/in_pressure_index What: /sys/.../iio:deviceX/scan_elements/in_pressure_index
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
......
Analog Devices AD7303 DAC device driver
Required properties:
- compatible: Must be "adi,ad7303"
- reg: SPI chip select number for the device
- spi-max-frequency: Max SPI frequency to use (< 30000000)
- Vdd-supply: Phandle to the Vdd power supply
Optional properties:
- REF-supply: Phandle to the external reference voltage supply. This should
only be set if there is an external reference voltage connected to the REF
pin. If the property is not set Vdd/2 is used as the reference voltage.
Example:
ad7303@4 {
compatible = "adi,ad7303";
reg = <4>;
spi-max-frequency = <10000000>;
Vdd-supply = <&vdd_supply>;
adi,use-external-reference;
REF-supply = <&vref_supply>;
};
Analog Devices ADF4350/ADF4351 device driver
Required properties:
- compatible: Should be one of
* "adi,adf4350": When using the ADF4350 device
* "adi,adf4351": When using the ADF4351 device
- reg: SPI chip select numbert for the device
- spi-max-frequency: Max SPI frequency to use (< 20000000)
- clocks: From common clock binding. Clock is phandle to clock for
ADF435x Reference Clock (CLKIN).
Optional properties:
- gpios: GPIO Lock detect - If set with a valid phandle and GPIO number,
pll lock state is tested upon read.
- adi,channel-spacing: Channel spacing in Hz (influences MODULUS).
- adi,power-up-frequency: If set in Hz the PLL tunes to
the desired frequency on probe.
- adi,reference-div-factor: If set the driver skips dynamic calculation
and uses this default value instead.
- adi,reference-doubler-enable: Enables reference doubler.
- adi,reference-div2-enable: Enables reference divider.
- adi,phase-detector-polarity-positive-enable: Enables positive phase
detector polarity. Default = negative.
- adi,lock-detect-precision-6ns-enable: Enables 6ns lock detect precision.
Default = 10ns.
- adi,lock-detect-function-integer-n-enable: Enables lock detect
for integer-N mode. Default = factional-N mode.
- adi,charge-pump-current: Charge pump current in mA.
Default = 2500mA.
- adi,muxout-select: On chip multiplexer output selection.
Valid values for the multiplexer output are:
0: Three-State Output (default)
1: DVDD
2: DGND
3: R-Counter output
4: N-Divider output
5: Analog lock detect
6: Digital lock detect
- adi,low-spur-mode-enable: Enables low spur mode.
Default = Low noise mode.
- adi,cycle-slip-reduction-enable: Enables cycle slip reduction.
- adi,charge-cancellation-enable: Enabled charge pump
charge cancellation for integer-N modes.
- adi,anti-backlash-3ns-enable: Enables 3ns antibacklash pulse width
for integer-N modes.
- adi,band-select-clock-mode-high-enable: Enables faster band
selection logic.
- adi,12bit-clk-divider: Clock divider value used when
adi,12bit-clkdiv-mode != 0
- adi,clk-divider-mode:
Valid values for the clkdiv mode are:
0: Clock divider off (default)
1: Fast lock enable
2: Phase resync enable
- adi,aux-output-enable: Enables auxiliary RF output.
- adi,aux-output-fundamental-enable: Selects fundamental VCO output on
the auxiliary RF output. Default = Output of RF dividers.
- adi,mute-till-lock-enable: Enables Mute-Till-Lock-Detect function.
- adi,output-power: Output power selection.
Valid values for the power mode are:
0: -4dBm (default)
1: -1dBm
2: +2dBm
3: +5dBm
- adi,aux-output-power: Auxiliary output power selection.
Valid values for the power mode are:
0: -4dBm (default)
1: -1dBm
2: +2dBm
3: +5dBm
Example:
lo_pll0_rx_adf4351: adf4351-rx-lpc@4 {
compatible = "adi,adf4351";
reg = <4>;
spi-max-frequency = <10000000>;
clocks = <&clk0_ad9523 9>;
clock-names = "clkin";
adi,channel-spacing = <10000>;
adi,power-up-frequency = <2400000000>;
adi,phase-detector-polarity-positive-enable;
adi,charge-pump-current = <2500>;
adi,output-power = <3>;
adi,mute-till-lock-enable;
};
* AsahiKASEI AK8975 magnetometer sensor
Required properties:
- compatible : should be "asahi-kasei,ak8975"
- reg : the I2C address of the magnetometer
Optional properties:
- gpios : should be device tree identifier of the magnetometer DRDY pin
Example:
ak8975@0c {
compatible = "asahi-kasei,ak8975";
reg = <0x0c>;
gpios = <&gpj0 7 0>;
};
Device-Tree bindings for LVDS Display Bridge (ldb)
LVDS Display Bridge
===================
The LVDS Display Bridge device tree node contains up to two lvds-channel
nodes describing each of the two LVDS encoder channels of the bridge.
Required properties:
- #address-cells : should be <1>
- #size-cells : should be <0>
- compatible : should be "fsl,imx53-ldb" or "fsl,imx6q-ldb".
Both LDB versions are similar, but i.MX6 has an additional
multiplexer in the front to select any of the four IPU display
interfaces as input for each LVDS channel.
- gpr : should be <&gpr> on i.MX53 and i.MX6q.
The phandle points to the iomuxc-gpr region containing the LVDS
control register.
- clocks, clock-names : phandles to the LDB divider and selector clocks and to
the display interface selector clocks, as described in
Documentation/devicetree/bindings/clock/clock-bindings.txt
The following clocks are expected on i.MX53:
"di0_pll" - LDB LVDS channel 0 mux
"di1_pll" - LDB LVDS channel 1 mux
"di0" - LDB LVDS channel 0 gate
"di1" - LDB LVDS channel 1 gate
"di0_sel" - IPU1 DI0 mux
"di1_sel" - IPU1 DI1 mux
On i.MX6q the following additional clocks are needed:
"di2_sel" - IPU2 DI0 mux
"di3_sel" - IPU2 DI1 mux
The needed clock numbers for each are documented in
Documentation/devicetree/bindings/clock/imx5-clock.txt, and in
Documentation/devicetree/bindings/clock/imx6q-clock.txt.
Optional properties:
- pinctrl-names : should be "default" on i.MX53, not used on i.MX6q
- pinctrl-0 : a phandle pointing to LVDS pin settings on i.MX53,
not used on i.MX6q
- fsl,dual-channel : boolean. if it exists, only LVDS channel 0 should
be configured - one input will be distributed on both outputs in dual
channel mode
LVDS Channel
============
Each LVDS Channel has to contain a display-timings node that describes the
video timings for the connected LVDS display. For detailed information, also
have a look at Documentation/devicetree/bindings/video/display-timing.txt.
Required properties:
- reg : should be <0> or <1>
- crtcs : a list of phandles with index pointing to the IPU display interfaces
that can be used as video source for this channel.
- fsl,data-mapping : should be "spwg" or "jeida"
This describes how the color bits are laid out in the
serialized LVDS signal.
- fsl,data-width : should be <18> or <24>
example:
gpr: iomuxc-gpr@53fa8000 {
/* ... */
};
ldb: ldb@53fa8008 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,imx53-ldb";
gpr = <&gpr>;
clocks = <&clks 122>, <&clks 120>,
<&clks 115>, <&clks 116>,
<&clks 123>, <&clks 85>;
clock-names = "di0_pll", "di1_pll",
"di0_sel", "di1_sel",
"di0", "di1";
lvds-channel@0 {
reg = <0>;
crtcs = <&ipu 0>;
fsl,data-mapping = "spwg";
fsl,data-width = <24>;
display-timings {
/* ... */
};
};
lvds-channel@1 {
reg = <1>;
crtcs = <&ipu 1>;
fsl,data-mapping = "spwg";
fsl,data-width = <24>;
display-timings {
/* ... */
};
};
};
...@@ -7783,7 +7783,7 @@ F: drivers/staging/media/solo6x10/ ...@@ -7783,7 +7783,7 @@ F: drivers/staging/media/solo6x10/
STAGING - SPEAKUP CONSOLE SPEECH DRIVER STAGING - SPEAKUP CONSOLE SPEECH DRIVER
M: William Hubbs <w.d.hubbs@gmail.com> M: William Hubbs <w.d.hubbs@gmail.com>
M: Chris Brannon <chris@the-brannons.com> M: Chris Brannon <chris@the-brannons.com>
M: Kirk Reiser <kirk@braille.uwo.ca> M: Kirk Reiser <kirk@reisers.ca>
M: Samuel Thibault <samuel.thibault@ens-lyon.org> M: Samuel Thibault <samuel.thibault@ens-lyon.org>
L: speakup@braille.uwo.ca L: speakup@braille.uwo.ca
W: http://www.linux-speakup.org/ W: http://www.linux-speakup.org/
......
...@@ -70,5 +70,9 @@ source "drivers/iio/gyro/Kconfig" ...@@ -70,5 +70,9 @@ source "drivers/iio/gyro/Kconfig"
source "drivers/iio/imu/Kconfig" source "drivers/iio/imu/Kconfig"
source "drivers/iio/light/Kconfig" source "drivers/iio/light/Kconfig"
source "drivers/iio/magnetometer/Kconfig" source "drivers/iio/magnetometer/Kconfig"
if IIO_TRIGGER
source "drivers/iio/trigger/Kconfig"
endif #IIO_TRIGGER
source "drivers/iio/pressure/Kconfig"
endif # IIO endif # IIO
...@@ -21,3 +21,5 @@ obj-y += frequency/ ...@@ -21,3 +21,5 @@ obj-y += frequency/
obj-y += imu/ obj-y += imu/
obj-y += light/ obj-y += light/
obj-y += magnetometer/ obj-y += magnetometer/
obj-y += trigger/
obj-y += pressure/
...@@ -28,7 +28,6 @@ config IIO_ST_ACCEL_3AXIS ...@@ -28,7 +28,6 @@ config IIO_ST_ACCEL_3AXIS
select IIO_ST_ACCEL_I2C_3AXIS if (I2C) select IIO_ST_ACCEL_I2C_3AXIS if (I2C)
select IIO_ST_ACCEL_SPI_3AXIS if (SPI_MASTER) select IIO_ST_ACCEL_SPI_3AXIS if (SPI_MASTER)
select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
select IIO_ST_ACCEL_BUFFER if (IIO_TRIGGERED_BUFFER)
help help
Say yes here to build support for STMicroelectronics accelerometers: Say yes here to build support for STMicroelectronics accelerometers:
LSM303DLH, LSM303DLHC, LIS3DH, LSM330D, LSM330DL, LSM330DLC, LSM303DLH, LSM303DLHC, LIS3DH, LSM330D, LSM330DL, LSM330DLC,
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
#include <linux/iio/common/st_sensors.h> #include <linux/iio/common/st_sensors.h>
#include "st_accel.h" #include "st_accel.h"
#define ST_ACCEL_NUMBER_DATA_CHANNELS 3
/* DEFAULT VALUE FOR SENSORS */ /* DEFAULT VALUE FOR SENSORS */
#define ST_ACCEL_DEFAULT_OUT_X_L_ADDR 0x28 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR 0x28
#define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR 0x2a #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR 0x2a
...@@ -125,22 +127,34 @@ ...@@ -125,22 +127,34 @@
#define ST_ACCEL_3_MULTIREAD_BIT false #define ST_ACCEL_3_MULTIREAD_BIT false
static const struct iio_chan_spec st_accel_12bit_channels[] = { static const struct iio_chan_spec st_accel_12bit_channels[] = {
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_X, IIO_MOD_X, IIO_LE, ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
ST_SENSORS_DEFAULT_12_REALBITS, ST_ACCEL_DEFAULT_OUT_X_L_ADDR), BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_Y, IIO_MOD_Y, IIO_LE, ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
ST_SENSORS_DEFAULT_12_REALBITS, ST_ACCEL_DEFAULT_OUT_Y_L_ADDR), ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_Z, IIO_MOD_Z, IIO_LE, ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
ST_SENSORS_DEFAULT_12_REALBITS, ST_ACCEL_DEFAULT_OUT_Z_L_ADDR), BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
IIO_CHAN_SOFT_TIMESTAMP(3) IIO_CHAN_SOFT_TIMESTAMP(3)
}; };
static const struct iio_chan_spec st_accel_16bit_channels[] = { static const struct iio_chan_spec st_accel_16bit_channels[] = {
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_X, IIO_MOD_X, IIO_LE, ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
ST_SENSORS_DEFAULT_16_REALBITS, ST_ACCEL_DEFAULT_OUT_X_L_ADDR), BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_Y, IIO_MOD_Y, IIO_LE, ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
ST_SENSORS_DEFAULT_16_REALBITS, ST_ACCEL_DEFAULT_OUT_Y_L_ADDR), ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, ST_SENSORS_SCAN_Z, IIO_MOD_Z, IIO_LE, ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
ST_SENSORS_DEFAULT_16_REALBITS, ST_ACCEL_DEFAULT_OUT_Z_L_ADDR), BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
IIO_CHAN_SOFT_TIMESTAMP(3) IIO_CHAN_SOFT_TIMESTAMP(3)
}; };
...@@ -442,6 +456,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev) ...@@ -442,6 +456,7 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
if (err < 0) if (err < 0)
goto st_accel_common_probe_error; goto st_accel_common_probe_error;
adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
adata->multiread_bit = adata->sensor->multi_read_bit; adata->multiread_bit = adata->sensor->multi_read_bit;
indio_dev->channels = adata->sensor->ch; indio_dev->channels = adata->sensor->ch;
indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
......
...@@ -133,6 +133,16 @@ config MAX1363 ...@@ -133,6 +133,16 @@ config MAX1363
max11646, max11647) Provides direct access via sysfs and buffered max11646, max11647) Provides direct access via sysfs and buffered
data via the iio dev interface. data via the iio dev interface.
config MCP320X
tristate "Microchip Technology MCP3204/08"
depends on SPI
help
Say yes here to build support for Microchip Technology's MCP3204 or
MCP3208 analog to digital converter.
This driver can also be built as a module. If so, the module will be
called mcp320x.
config TI_ADC081C config TI_ADC081C
tristate "Texas Instruments ADC081C021/027" tristate "Texas Instruments ADC081C021/027"
depends on I2C depends on I2C
......
...@@ -14,6 +14,7 @@ obj-$(CONFIG_AT91_ADC) += at91_adc.o ...@@ -14,6 +14,7 @@ obj-$(CONFIG_AT91_ADC) += at91_adc.o
obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o
obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
obj-$(CONFIG_MAX1363) += max1363.o obj-$(CONFIG_MAX1363) += max1363.o
obj-$(CONFIG_MCP320X) += mcp320x.o
obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o
obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o
...@@ -774,11 +774,13 @@ static int at91_adc_remove(struct platform_device *pdev) ...@@ -774,11 +774,13 @@ static int at91_adc_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_OF
static const struct of_device_id at91_adc_dt_ids[] = { static const struct of_device_id at91_adc_dt_ids[] = {
{ .compatible = "atmel,at91sam9260-adc" }, { .compatible = "atmel,at91sam9260-adc" },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); MODULE_DEVICE_TABLE(of, at91_adc_dt_ids);
#endif
static struct platform_driver at91_adc_driver = { static struct platform_driver at91_adc_driver = {
.probe = at91_adc_probe, .probe = at91_adc_probe,
......
...@@ -270,16 +270,16 @@ static int exynos_adc_probe(struct platform_device *pdev) ...@@ -270,16 +270,16 @@ static int exynos_adc_probe(struct platform_device *pdev)
info = iio_priv(indio_dev); info = iio_priv(indio_dev);
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
info->regs = devm_request_and_ioremap(&pdev->dev, mem); info->regs = devm_ioremap_resource(&pdev->dev, mem);
if (!info->regs) { if (IS_ERR(info->regs)) {
ret = -ENOMEM; ret = PTR_ERR(info->regs);
goto err_iio; goto err_iio;
} }
mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
info->enable_reg = devm_request_and_ioremap(&pdev->dev, mem); info->enable_reg = devm_ioremap_resource(&pdev->dev, mem);
if (!info->enable_reg) { if (IS_ERR(info->enable_reg)) {
ret = -ENOMEM; ret = PTR_ERR(info->enable_reg);
goto err_iio; goto err_iio;
} }
......
...@@ -660,7 +660,7 @@ static ssize_t max1363_monitor_store_freq(struct device *dev, ...@@ -660,7 +660,7 @@ static ssize_t max1363_monitor_store_freq(struct device *dev,
unsigned long val; unsigned long val;
bool found = false; bool found = false;
ret = strict_strtoul(buf, 10, &val); ret = kstrtoul(buf, 10, &val);
if (ret) if (ret)
return -EINVAL; return -EINVAL;
for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++) for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++)
......
/*
* Copyright (C) 2013 Oskar Andero <oskar.andero@gmail.com>
*
* Driver for Microchip Technology's MCP3204 and MCP3208 ADC chips.
* Datasheet can be found here:
* http://ww1.microchip.com/downloads/en/devicedoc/21298c.pdf
*
* 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.
*/
#include <linux/err.h>
#include <linux/spi/spi.h>
#include <linux/module.h>
#include <linux/iio/iio.h>
#include <linux/regulator/consumer.h>
#define MCP_SINGLE_ENDED (1 << 3)
#define MCP_START_BIT (1 << 4)
enum {
mcp3204,
mcp3208,
};
struct mcp320x {
struct spi_device *spi;
struct spi_message msg;
struct spi_transfer transfer[2];
u8 tx_buf;
u8 rx_buf[2];
struct regulator *reg;
struct mutex lock;
};
static int mcp320x_adc_conversion(struct mcp320x *adc, u8 msg)
{
int ret;
adc->tx_buf = msg;
ret = spi_sync(adc->spi, &adc->msg);
if (ret < 0)
return ret;
return ((adc->rx_buf[0] & 0x3f) << 6) |
(adc->rx_buf[1] >> 2);
}
static int mcp320x_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *channel, int *val,
int *val2, long mask)
{
struct mcp320x *adc = iio_priv(indio_dev);
int ret = -EINVAL;
mutex_lock(&adc->lock);
switch (mask) {
case IIO_CHAN_INFO_RAW:
if (channel->differential)
ret = mcp320x_adc_conversion(adc,
MCP_START_BIT | channel->address);
else
ret = mcp320x_adc_conversion(adc,
MCP_START_BIT | MCP_SINGLE_ENDED |
channel->address);
if (ret < 0)
goto out;
*val = ret;
ret = IIO_VAL_INT;
break;
case IIO_CHAN_INFO_SCALE:
/* Digital output code = (4096 * Vin) / Vref */
ret = regulator_get_voltage(adc->reg);
if (ret < 0)
goto out;
*val = ret / 1000;
*val2 = 12;
ret = IIO_VAL_FRACTIONAL_LOG2;
break;
default:
break;
}
out:
mutex_unlock(&adc->lock);
return ret;
}
#define MCP320X_VOLTAGE_CHANNEL(num) \
{ \
.type = IIO_VOLTAGE, \
.indexed = 1, \
.channel = (num), \
.address = (num), \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
}
#define MCP320X_VOLTAGE_CHANNEL_DIFF(num) \
{ \
.type = IIO_VOLTAGE, \
.indexed = 1, \
.channel = (num * 2), \
.channel2 = (num * 2 + 1), \
.address = (num * 2), \
.differential = 1, \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \
}
static const struct iio_chan_spec mcp3204_channels[] = {
MCP320X_VOLTAGE_CHANNEL(0),
MCP320X_VOLTAGE_CHANNEL(1),
MCP320X_VOLTAGE_CHANNEL(2),
MCP320X_VOLTAGE_CHANNEL(3),
MCP320X_VOLTAGE_CHANNEL_DIFF(0),
MCP320X_VOLTAGE_CHANNEL_DIFF(1),
};
static const struct iio_chan_spec mcp3208_channels[] = {
MCP320X_VOLTAGE_CHANNEL(0),
MCP320X_VOLTAGE_CHANNEL(1),
MCP320X_VOLTAGE_CHANNEL(2),
MCP320X_VOLTAGE_CHANNEL(3),
MCP320X_VOLTAGE_CHANNEL(4),
MCP320X_VOLTAGE_CHANNEL(5),
MCP320X_VOLTAGE_CHANNEL(6),
MCP320X_VOLTAGE_CHANNEL(7),
MCP320X_VOLTAGE_CHANNEL_DIFF(0),
MCP320X_VOLTAGE_CHANNEL_DIFF(1),
MCP320X_VOLTAGE_CHANNEL_DIFF(2),
MCP320X_VOLTAGE_CHANNEL_DIFF(3),
};
static const struct iio_info mcp320x_info = {
.read_raw = mcp320x_read_raw,
.driver_module = THIS_MODULE,
};
struct mcp3208_chip_info {
const struct iio_chan_spec *channels;
unsigned int num_channels;
};
static const struct mcp3208_chip_info mcp3208_chip_infos[] = {
[mcp3204] = {
.channels = mcp3204_channels,
.num_channels = ARRAY_SIZE(mcp3204_channels)
},
[mcp3208] = {
.channels = mcp3208_channels,
.num_channels = ARRAY_SIZE(mcp3208_channels)
},
};
static int mcp320x_probe(struct spi_device *spi)
{
struct iio_dev *indio_dev;
struct mcp320x *adc;
const struct mcp3208_chip_info *chip_info;
int ret;
indio_dev = iio_device_alloc(sizeof(*adc));
if (!indio_dev)
return -ENOMEM;
adc = iio_priv(indio_dev);
adc->spi = spi;
indio_dev->dev.parent = &spi->dev;
indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &mcp320x_info;
chip_info = &mcp3208_chip_infos[spi_get_device_id(spi)->driver_data];
indio_dev->channels = chip_info->channels;
indio_dev->num_channels = chip_info->num_channels;
adc->transfer[0].tx_buf = &adc->tx_buf;
adc->transfer[0].len = sizeof(adc->tx_buf);
adc->transfer[1].rx_buf = adc->rx_buf;
adc->transfer[1].len = sizeof(adc->rx_buf);
spi_message_init_with_transfers(&adc->msg, adc->transfer,
ARRAY_SIZE(adc->transfer));
adc->reg = regulator_get(&spi->dev, "vref");
if (IS_ERR(adc->reg)) {
ret = PTR_ERR(adc->reg);
goto iio_free;
}
ret = regulator_enable(adc->reg);
if (ret < 0)
goto reg_free;
mutex_init(&adc->lock);
ret = iio_device_register(indio_dev);
if (ret < 0)
goto reg_disable;
return 0;
reg_disable:
regulator_disable(adc->reg);
reg_free:
regulator_put(adc->reg);
iio_free:
iio_device_free(indio_dev);
return ret;
}
static int mcp320x_remove(struct spi_device *spi)
{
struct iio_dev *indio_dev = spi_get_drvdata(spi);
struct mcp320x *adc = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
regulator_disable(adc->reg);
regulator_put(adc->reg);
iio_device_free(indio_dev);
return 0;
}
static const struct spi_device_id mcp320x_id[] = {
{ "mcp3204", mcp3204 },
{ "mcp3208", mcp3208 },
{ }
};
MODULE_DEVICE_TABLE(spi, mcp320x_id);
static struct spi_driver mcp320x_driver = {
.driver = {
.name = "mcp320x",
.owner = THIS_MODULE,
},
.probe = mcp320x_probe,
.remove = mcp320x_remove,
.id_table = mcp320x_id,
};
module_spi_driver(mcp320x_driver);
MODULE_AUTHOR("Oskar Andero <oskar.andero@gmail.com>");
MODULE_DESCRIPTION("Microchip Technology MCP3204/08");
MODULE_LICENSE("GPL v2");
...@@ -24,11 +24,20 @@ ...@@ -24,11 +24,20 @@
int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf)
{ {
u8 *addr;
int i, n = 0, len; int i, n = 0, len;
u8 addr[ST_SENSORS_NUMBER_DATA_CHANNELS];
struct st_sensor_data *sdata = iio_priv(indio_dev); struct st_sensor_data *sdata = iio_priv(indio_dev);
unsigned int num_data_channels = sdata->num_data_channels;
unsigned int byte_for_channel =
indio_dev->channels[0].scan_type.storagebits >> 3;
for (i = 0; i < ST_SENSORS_NUMBER_DATA_CHANNELS; i++) { addr = kmalloc(num_data_channels, GFP_KERNEL);
if (!addr) {
len = -ENOMEM;
goto st_sensors_get_buffer_element_error;
}
for (i = 0; i < num_data_channels; i++) {
if (test_bit(i, indio_dev->active_scan_mask)) { if (test_bit(i, indio_dev->active_scan_mask)) {
addr[n] = indio_dev->channels[i].address; addr[n] = indio_dev->channels[i].address;
n++; n++;
...@@ -37,52 +46,58 @@ int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) ...@@ -37,52 +46,58 @@ int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf)
switch (n) { switch (n) {
case 1: case 1:
len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev, len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
addr[0], ST_SENSORS_BYTE_FOR_CHANNEL, buf, addr[0], byte_for_channel, buf, sdata->multiread_bit);
sdata->multiread_bit);
break; break;
case 2: case 2:
if ((addr[1] - addr[0]) == ST_SENSORS_BYTE_FOR_CHANNEL) { if ((addr[1] - addr[0]) == byte_for_channel) {
len = sdata->tf->read_multiple_byte(&sdata->tb, len = sdata->tf->read_multiple_byte(&sdata->tb,
sdata->dev, addr[0], sdata->dev, addr[0], byte_for_channel * n,
ST_SENSORS_BYTE_FOR_CHANNEL*n, buf, sdata->multiread_bit);
buf, sdata->multiread_bit);
} else { } else {
u8 rx_array[ST_SENSORS_BYTE_FOR_CHANNEL* u8 *rx_array;
ST_SENSORS_NUMBER_DATA_CHANNELS]; rx_array = kmalloc(byte_for_channel * num_data_channels,
GFP_KERNEL);
if (!rx_array) {
len = -ENOMEM;
goto st_sensors_free_memory;
}
len = sdata->tf->read_multiple_byte(&sdata->tb, len = sdata->tf->read_multiple_byte(&sdata->tb,
sdata->dev, addr[0], sdata->dev, addr[0],
ST_SENSORS_BYTE_FOR_CHANNEL* byte_for_channel * num_data_channels,
ST_SENSORS_NUMBER_DATA_CHANNELS,
rx_array, sdata->multiread_bit); rx_array, sdata->multiread_bit);
if (len < 0) if (len < 0) {
goto read_data_channels_error; kfree(rx_array);
goto st_sensors_free_memory;
}
for (i = 0; i < n * ST_SENSORS_NUMBER_DATA_CHANNELS; for (i = 0; i < n * num_data_channels; i++) {
i++) {
if (i < n) if (i < n)
buf[i] = rx_array[i]; buf[i] = rx_array[i];
else else
buf[i] = rx_array[n + i]; buf[i] = rx_array[n + i];
} }
len = ST_SENSORS_BYTE_FOR_CHANNEL*n; kfree(rx_array);
len = byte_for_channel * n;
} }
break; break;
case 3: case 3:
len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev, len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
addr[0], ST_SENSORS_BYTE_FOR_CHANNEL* addr[0], byte_for_channel * num_data_channels,
ST_SENSORS_NUMBER_DATA_CHANNELS,
buf, sdata->multiread_bit); buf, sdata->multiread_bit);
break; break;
default: default:
len = -EINVAL; len = -EINVAL;
goto read_data_channels_error; goto st_sensors_free_memory;
} }
if (len != ST_SENSORS_BYTE_FOR_CHANNEL*n) { if (len != byte_for_channel * n) {
len = -EIO; len = -EIO;
goto read_data_channels_error; goto st_sensors_free_memory;
} }
read_data_channels_error: st_sensors_free_memory:
kfree(addr);
st_sensors_get_buffer_element_error:
return len; return len;
} }
EXPORT_SYMBOL(st_sensors_get_buffer_element); EXPORT_SYMBOL(st_sensors_get_buffer_element);
......
...@@ -20,6 +20,11 @@ ...@@ -20,6 +20,11 @@
#define ST_SENSORS_WAI_ADDRESS 0x0f #define ST_SENSORS_WAI_ADDRESS 0x0f
static inline u32 st_sensors_get_unaligned_le24(const u8 *p)
{
return ((s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8);
}
static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev, static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev,
u8 reg_addr, u8 mask, u8 data) u8 reg_addr, u8 mask, u8 data)
{ {
...@@ -112,7 +117,8 @@ static int st_sensors_match_fs(struct st_sensors *sensor, ...@@ -112,7 +117,8 @@ static int st_sensors_match_fs(struct st_sensors *sensor,
return ret; return ret;
} }
static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs) static int st_sensors_set_fullscale(struct iio_dev *indio_dev,
unsigned int fs)
{ {
int err, i = 0; int err, i = 0;
struct st_sensor_data *sdata = iio_priv(indio_dev); struct st_sensor_data *sdata = iio_priv(indio_dev);
...@@ -273,21 +279,33 @@ int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale) ...@@ -273,21 +279,33 @@ int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale)
EXPORT_SYMBOL(st_sensors_set_fullscale_by_gain); EXPORT_SYMBOL(st_sensors_set_fullscale_by_gain);
static int st_sensors_read_axis_data(struct iio_dev *indio_dev, static int st_sensors_read_axis_data(struct iio_dev *indio_dev,
u8 ch_addr, int *data) struct iio_chan_spec const *ch, int *data)
{ {
int err; int err;
u8 outdata[ST_SENSORS_BYTE_FOR_CHANNEL]; u8 *outdata;
struct st_sensor_data *sdata = iio_priv(indio_dev); struct st_sensor_data *sdata = iio_priv(indio_dev);
unsigned int byte_for_channel = ch->scan_type.storagebits >> 3;
outdata = kmalloc(byte_for_channel, GFP_KERNEL);
if (!outdata) {
err = -EINVAL;
goto st_sensors_read_axis_data_error;
}
err = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev, err = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
ch_addr, ST_SENSORS_BYTE_FOR_CHANNEL, ch->address, byte_for_channel,
outdata, sdata->multiread_bit); outdata, sdata->multiread_bit);
if (err < 0) if (err < 0)
goto read_error; goto st_sensors_free_memory;
*data = (s16)get_unaligned_le16(outdata); if (byte_for_channel == 2)
*data = (s16)get_unaligned_le16(outdata);
else if (byte_for_channel == 3)
*data = (s32)st_sensors_get_unaligned_le24(outdata);
read_error: st_sensors_free_memory:
kfree(outdata);
st_sensors_read_axis_data_error:
return err; return err;
} }
...@@ -307,7 +325,7 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev, ...@@ -307,7 +325,7 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev,
goto read_error; goto read_error;
msleep((sdata->sensor->bootime * 1000) / sdata->odr); msleep((sdata->sensor->bootime * 1000) / sdata->odr);
err = st_sensors_read_axis_data(indio_dev, ch->address, val); err = st_sensors_read_axis_data(indio_dev, ch, val);
if (err < 0) if (err < 0)
goto read_error; goto read_error;
......
...@@ -130,6 +130,16 @@ config AD5686 ...@@ -130,6 +130,16 @@ config AD5686
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called ad5686. module will be called ad5686.
config AD7303
tristate "Analog Devices Analog Devices AD7303 DAC driver"
depends on SPI
help
Say yes here to build support for Analog Devices AD7303 Digital to Analog
Converters (DAC).
To compile this driver as module choose M here: the module will be called
ad7303.
config MAX517 config MAX517
tristate "Maxim MAX517/518/519 DAC driver" tristate "Maxim MAX517/518/519 DAC driver"
depends on I2C depends on I2C
......
...@@ -14,5 +14,6 @@ obj-$(CONFIG_AD5755) += ad5755.o ...@@ -14,5 +14,6 @@ obj-$(CONFIG_AD5755) += ad5755.o
obj-$(CONFIG_AD5764) += ad5764.o obj-$(CONFIG_AD5764) += ad5764.o
obj-$(CONFIG_AD5791) += ad5791.o obj-$(CONFIG_AD5791) += ad5791.o
obj-$(CONFIG_AD5686) += ad5686.o obj-$(CONFIG_AD5686) += ad5686.o
obj-$(CONFIG_AD7303) += ad7303.o
obj-$(CONFIG_MAX517) += max517.o obj-$(CONFIG_MAX517) += max517.o
obj-$(CONFIG_MCP4725) += mcp4725.o obj-$(CONFIG_MCP4725) += mcp4725.o
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment