1st set of IIO fixes for the 6.4 cycle.
Usual mixed bag of issues in new code for this cycle and old issues that have surfaced in the last few weeks. - adi,ad_sigma_delta * Ensure irq lazy disable handing is not used as it breaks completion detection. - adi,ad4130 * Fix failure to remove clock provider. - adi,ad5758 * Wrong CONFIG variable used to control driver build. - adi,ad7192 * Fix repeated channel index by just expressing shorted channels as differential channel between a channel and itself. - adi,ad74413 * Fix error handling for resistance input processing to not fail in case of success. - rohm,bu27034 * Fix integration time in wrong units (should be seconds not usecs) * Ensure reset is actually written not detected as already set from regcache. - gts helper * Fix wrong parameter docs. * Fix integration time in wrong units (should be seconds not usecs) - fsl,imx8qxp-adc * Add missing vref-supply to binding doc (already used by driver) - fsl,imx93 * Fix sign bug in read_raw() so that error check didn't work. - inv,icm42600 * Fix reset of timestamp to work even if a particular sensor is off when the chip is first enabled. - kionix,kx022a * Fix irq get form fw node to not include the 0 value. - microchip,mcp4725 * Fix return value from i2c_master_send() handling to nto assume 0 on success. - mediatek,mt6370 * Fix incorrect scaling of a few currents on devices with particular vendor IDs. - fsl,mxs-lradc * Cleanup ordering issue fix. - renesas,rcar-adc bindings * Fix missing vendor prefix for adi,ad7476 - st,st_accel * Fix handling when no ACPI _ONT method present. - st,stm32-adc * Handle no adc-diff-channel present case (all single ended) * Handle no adc-channels present case (all differential) - ti,palmas * Fix off by one bug that could allow out of bounds read if callers provided wrong value. - ti,tmag5273 * Fix a runtime PM leak on measurement error - vishay,vcnl4035 * Correctly mask chip ID so devices with different addresses don't fail the test. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAmRqYH4RHGppYzIzQGtl cm5lbC5vcmcACgkQVIU0mcT0FoiAsA/+LfGniNvgH0COL6sCGWYf0BYOr7tel36J ZcFsUcOP0cMVly67FjRBW0mbGNm2Ry0rjLCxmk/SKm1Hkm8tI2jgQ55LymrpsBXz umIuze6K0TYDQLUCCaav7GOwayQKnp28uXiqi60g+PeG/UlB/ax6P3b4y7/sUxF/ 8Z7CTVHvPjXs7WWaiOJzrhRRdqjv1WjnNCzOVatOFg2U50SQu8gCu8dOmYw22Ct2 oGHUStGSqhkjlqYI/bslk+0gQ19FqH/X/V+RpyrlXfYDlW6kS5wtl2+6ms3i87oR EIT9mIwClX5L9gE5uKsoLfgPw4eHqBTlv3XHF3rfxNY4mQKQJCj2HHJodSdODxYa b42qnUomGJUJARdOVokN8Sy5majJdUnRR7GvnNr+z8d1Ml6Md35NJ9d+xhJGAJbN ZiWtZXzv7VNHCqvhQ8WxXbrTvnav//8s6+E9YmbjLN382NQT48EjfUt7ULc4GQOF CMFR1Pt0dT9l7EX6m7KovWBmB3jq/rVyYjeffeqJumm4Zyek/InNxmUrMaDYHHjn l7tjYQus5UBtphdc3mTIyVkD4WpcySP3JGKfQckWkewELso46hEmhOUYlGnDNflE +zfTSnf0jRGDeKpQq4pWL07dirxIMeRwlENfz3o6xRcdsUkqthGc81NMvt0p9Srq QK6MW7XTN/Y= =NhJU -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-6.4a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-linus Jonathan writes: 1st set of IIO fixes for the 6.4 cycle. Usual mixed bag of issues in new code for this cycle and old issues that have surfaced in the last few weeks. - adi,ad_sigma_delta * Ensure irq lazy disable handing is not used as it breaks completion detection. - adi,ad4130 * Fix failure to remove clock provider. - adi,ad5758 * Wrong CONFIG variable used to control driver build. - adi,ad7192 * Fix repeated channel index by just expressing shorted channels as differential channel between a channel and itself. - adi,ad74413 * Fix error handling for resistance input processing to not fail in case of success. - rohm,bu27034 * Fix integration time in wrong units (should be seconds not usecs) * Ensure reset is actually written not detected as already set from regcache. - gts helper * Fix wrong parameter docs. * Fix integration time in wrong units (should be seconds not usecs) - fsl,imx8qxp-adc * Add missing vref-supply to binding doc (already used by driver) - fsl,imx93 * Fix sign bug in read_raw() so that error check didn't work. - inv,icm42600 * Fix reset of timestamp to work even if a particular sensor is off when the chip is first enabled. - kionix,kx022a * Fix irq get form fw node to not include the 0 value. - microchip,mcp4725 * Fix return value from i2c_master_send() handling to nto assume 0 on success. - mediatek,mt6370 * Fix incorrect scaling of a few currents on devices with particular vendor IDs. - fsl,mxs-lradc * Cleanup ordering issue fix. - renesas,rcar-adc bindings * Fix missing vendor prefix for adi,ad7476 - st,st_accel * Fix handling when no ACPI _ONT method present. - st,stm32-adc * Handle no adc-diff-channel present case (all single ended) * Handle no adc-channels present case (all differential) - ti,palmas * Fix off by one bug that could allow out of bounds read if callers provided wrong value. - ti,tmag5273 * Fix a runtime PM leak on measurement error - vishay,vcnl4035 * Correctly mask chip ID so devices with different addresses don't fail the test. * tag 'iio-fixes-for-6.4a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: (23 commits) iio: imu: inv_icm42600: fix timestamp reset iio: adc: ad_sigma_delta: Fix IRQ issue by setting IRQ_DISABLE_UNLAZY flag dt-bindings: iio: adc: renesas,rcar-gyroadc: Fix adi,ad7476 compatible value iio: dac: mcp4725: Fix i2c_master_send() return value handling iio: accel: kx022a fix irq getting iio: bu27034: Ensure reset is written iio: dac: build ad5758 driver when AD5758 is selected iio: addac: ad74413: fix resistance input processing iio: light: vcnl4035: fixed chip ID check dt-bindings: iio: imx8qxp-adc: add missing vref-supply iio: adc: stm32-adc: skip adc-channels setup if none is present iio: adc: stm32-adc: skip adc-diff-channels setup if none is present iio: adc: ad7192: Change "shorted" channels to differential iio: accel: st_accel: Fix invalid mount_matrix on devices without ACPI _ONT method iio: gts-helpers: fix integration time units iio: bu27034: Fix integration time iio: fix doc for iio_gts_find_sel_by_int_time iio: adc: palmas: fix off by one bugs iio: adc: mxs-lradc: fix the order of two cleanup operations iio: ad4130: Make sure clock provider gets removed ...
This commit is contained in:
commit
bca7a46336
@ -39,6 +39,12 @@ properties:
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
vref-supply:
|
||||
description: |
|
||||
External ADC reference voltage supply on VREFH pad. If VERID[MVI] is
|
||||
set, there are additional, internal reference voltages selectable.
|
||||
VREFH1 is always from VREFH pad.
|
||||
|
||||
"#io-channel-cells":
|
||||
const: 1
|
||||
|
||||
@ -72,6 +78,7 @@ examples:
|
||||
assigned-clocks = <&clk IMX_SC_R_ADC_0>;
|
||||
assigned-clock-rates = <24000000>;
|
||||
power-domains = <&pd IMX_SC_R_ADC_0>;
|
||||
vref-supply = <®_1v8>;
|
||||
#io-channel-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
@ -90,7 +90,7 @@ patternProperties:
|
||||
of the MAX chips to the GyroADC, while MISO line of each Maxim
|
||||
ADC connects to a shared input pin of the GyroADC.
|
||||
enum:
|
||||
- adi,7476
|
||||
- adi,ad7476
|
||||
- fujitsu,mb88101a
|
||||
- maxim,max1162
|
||||
- maxim,max11100
|
||||
|
@ -1048,7 +1048,7 @@ int kx022a_probe_internal(struct device *dev)
|
||||
data->ien_reg = KX022A_REG_INC4;
|
||||
} else {
|
||||
irq = fwnode_irq_get_byname(fwnode, "INT2");
|
||||
if (irq <= 0)
|
||||
if (irq < 0)
|
||||
return dev_err_probe(dev, irq, "No suitable IRQ\n");
|
||||
|
||||
data->inc_reg = KX022A_REG_INC5;
|
||||
|
@ -1291,12 +1291,12 @@ static int apply_acpi_orientation(struct iio_dev *indio_dev)
|
||||
|
||||
adev = ACPI_COMPANION(indio_dev->dev.parent);
|
||||
if (!adev)
|
||||
return 0;
|
||||
return -ENXIO;
|
||||
|
||||
/* Read _ONT data, which should be a package of 6 integers. */
|
||||
status = acpi_evaluate_object(adev->handle, "_ONT", NULL, &buffer);
|
||||
if (status == AE_NOT_FOUND) {
|
||||
return 0;
|
||||
return -ENXIO;
|
||||
} else if (ACPI_FAILURE(status)) {
|
||||
dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
|
||||
status);
|
||||
|
@ -1817,6 +1817,11 @@ static const struct clk_ops ad4130_int_clk_ops = {
|
||||
.unprepare = ad4130_int_clk_unprepare,
|
||||
};
|
||||
|
||||
static void ad4130_clk_del_provider(void *of_node)
|
||||
{
|
||||
of_clk_del_provider(of_node);
|
||||
}
|
||||
|
||||
static int ad4130_setup_int_clk(struct ad4130_state *st)
|
||||
{
|
||||
struct device *dev = &st->spi->dev;
|
||||
@ -1824,6 +1829,7 @@ static int ad4130_setup_int_clk(struct ad4130_state *st)
|
||||
struct clk_init_data init;
|
||||
const char *clk_name;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
if (st->int_pin_sel == AD4130_INT_PIN_CLK ||
|
||||
st->mclk_sel != AD4130_MCLK_76_8KHZ)
|
||||
@ -1843,7 +1849,11 @@ static int ad4130_setup_int_clk(struct ad4130_state *st)
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
return of_clk_add_provider(of_node, of_clk_src_simple_get, clk);
|
||||
ret = of_clk_add_provider(of_node, of_clk_src_simple_get, clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return devm_add_action_or_reset(dev, ad4130_clk_del_provider, of_node);
|
||||
}
|
||||
|
||||
static int ad4130_setup(struct iio_dev *indio_dev)
|
||||
|
@ -897,10 +897,6 @@ static const struct iio_info ad7195_info = {
|
||||
__AD719x_CHANNEL(_si, _channel1, -1, _address, NULL, IIO_VOLTAGE, \
|
||||
BIT(IIO_CHAN_INFO_SCALE), ad7192_calibsys_ext_info)
|
||||
|
||||
#define AD719x_SHORTED_CHANNEL(_si, _channel1, _address) \
|
||||
__AD719x_CHANNEL(_si, _channel1, -1, _address, "shorted", IIO_VOLTAGE, \
|
||||
BIT(IIO_CHAN_INFO_SCALE), ad7192_calibsys_ext_info)
|
||||
|
||||
#define AD719x_TEMP_CHANNEL(_si, _address) \
|
||||
__AD719x_CHANNEL(_si, 0, -1, _address, NULL, IIO_TEMP, 0, NULL)
|
||||
|
||||
@ -908,7 +904,7 @@ static const struct iio_chan_spec ad7192_channels[] = {
|
||||
AD719x_DIFF_CHANNEL(0, 1, 2, AD7192_CH_AIN1P_AIN2M),
|
||||
AD719x_DIFF_CHANNEL(1, 3, 4, AD7192_CH_AIN3P_AIN4M),
|
||||
AD719x_TEMP_CHANNEL(2, AD7192_CH_TEMP),
|
||||
AD719x_SHORTED_CHANNEL(3, 2, AD7192_CH_AIN2P_AIN2M),
|
||||
AD719x_DIFF_CHANNEL(3, 2, 2, AD7192_CH_AIN2P_AIN2M),
|
||||
AD719x_CHANNEL(4, 1, AD7192_CH_AIN1),
|
||||
AD719x_CHANNEL(5, 2, AD7192_CH_AIN2),
|
||||
AD719x_CHANNEL(6, 3, AD7192_CH_AIN3),
|
||||
@ -922,7 +918,7 @@ static const struct iio_chan_spec ad7193_channels[] = {
|
||||
AD719x_DIFF_CHANNEL(2, 5, 6, AD7193_CH_AIN5P_AIN6M),
|
||||
AD719x_DIFF_CHANNEL(3, 7, 8, AD7193_CH_AIN7P_AIN8M),
|
||||
AD719x_TEMP_CHANNEL(4, AD7193_CH_TEMP),
|
||||
AD719x_SHORTED_CHANNEL(5, 2, AD7193_CH_AIN2P_AIN2M),
|
||||
AD719x_DIFF_CHANNEL(5, 2, 2, AD7193_CH_AIN2P_AIN2M),
|
||||
AD719x_CHANNEL(6, 1, AD7193_CH_AIN1),
|
||||
AD719x_CHANNEL(7, 2, AD7193_CH_AIN2),
|
||||
AD719x_CHANNEL(8, 3, AD7193_CH_AIN3),
|
||||
|
@ -584,6 +584,10 @@ static int devm_ad_sd_probe_trigger(struct device *dev, struct iio_dev *indio_de
|
||||
init_completion(&sigma_delta->completion);
|
||||
|
||||
sigma_delta->irq_dis = true;
|
||||
|
||||
/* the IRQ core clears IRQ_DISABLE_UNLAZY flag when freeing an IRQ */
|
||||
irq_set_status_flags(sigma_delta->spi->irq, IRQ_DISABLE_UNLAZY);
|
||||
|
||||
ret = devm_request_irq(dev, sigma_delta->spi->irq,
|
||||
ad_sd_data_rdy_trig_poll,
|
||||
sigma_delta->info->irq_flags | IRQF_NO_AUTOEN,
|
||||
|
@ -236,8 +236,7 @@ static int imx93_adc_read_raw(struct iio_dev *indio_dev,
|
||||
{
|
||||
struct imx93_adc *adc = iio_priv(indio_dev);
|
||||
struct device *dev = adc->dev;
|
||||
long ret;
|
||||
u32 vref_uv;
|
||||
int ret;
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
@ -253,10 +252,10 @@ static int imx93_adc_read_raw(struct iio_dev *indio_dev,
|
||||
return IIO_VAL_INT;
|
||||
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
ret = vref_uv = regulator_get_voltage(adc->vref);
|
||||
ret = regulator_get_voltage(adc->vref);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = vref_uv / 1000;
|
||||
*val = ret / 1000;
|
||||
*val2 = 12;
|
||||
return IIO_VAL_FRACTIONAL_LOG2;
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include <dt-bindings/iio/adc/mediatek,mt6370_adc.h>
|
||||
|
||||
#define MT6370_REG_DEV_INFO 0x100
|
||||
#define MT6370_REG_CHG_CTRL3 0x113
|
||||
#define MT6370_REG_CHG_CTRL7 0x117
|
||||
#define MT6370_REG_CHG_ADC 0x121
|
||||
@ -27,6 +28,7 @@
|
||||
#define MT6370_ADC_START_MASK BIT(0)
|
||||
#define MT6370_ADC_IN_SEL_MASK GENMASK(7, 4)
|
||||
#define MT6370_AICR_ICHG_MASK GENMASK(7, 2)
|
||||
#define MT6370_VENID_MASK GENMASK(7, 4)
|
||||
|
||||
#define MT6370_AICR_100_mA 0x0
|
||||
#define MT6370_AICR_150_mA 0x1
|
||||
@ -47,6 +49,10 @@
|
||||
#define ADC_CONV_TIME_MS 35
|
||||
#define ADC_CONV_POLLING_TIME_US 1000
|
||||
|
||||
#define MT6370_VID_RT5081 0x8
|
||||
#define MT6370_VID_RT5081A 0xA
|
||||
#define MT6370_VID_MT6370 0xE
|
||||
|
||||
struct mt6370_adc_data {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
@ -55,6 +61,7 @@ struct mt6370_adc_data {
|
||||
* from being read at the same time.
|
||||
*/
|
||||
struct mutex adc_lock;
|
||||
unsigned int vid;
|
||||
};
|
||||
|
||||
static int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
|
||||
@ -98,6 +105,30 @@ adc_unlock:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mt6370_adc_get_ibus_scale(struct mt6370_adc_data *priv)
|
||||
{
|
||||
switch (priv->vid) {
|
||||
case MT6370_VID_RT5081:
|
||||
case MT6370_VID_RT5081A:
|
||||
case MT6370_VID_MT6370:
|
||||
return 3350;
|
||||
default:
|
||||
return 3875;
|
||||
}
|
||||
}
|
||||
|
||||
static int mt6370_adc_get_ibat_scale(struct mt6370_adc_data *priv)
|
||||
{
|
||||
switch (priv->vid) {
|
||||
case MT6370_VID_RT5081:
|
||||
case MT6370_VID_RT5081A:
|
||||
case MT6370_VID_MT6370:
|
||||
return 2680;
|
||||
default:
|
||||
return 3870;
|
||||
}
|
||||
}
|
||||
|
||||
static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
|
||||
int chan, int *val1, int *val2)
|
||||
{
|
||||
@ -123,7 +154,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
|
||||
case MT6370_AICR_250_mA:
|
||||
case MT6370_AICR_300_mA:
|
||||
case MT6370_AICR_350_mA:
|
||||
*val1 = 3350;
|
||||
*val1 = mt6370_adc_get_ibus_scale(priv);
|
||||
break;
|
||||
default:
|
||||
*val1 = 5000;
|
||||
@ -150,7 +181,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
|
||||
case MT6370_ICHG_600_mA:
|
||||
case MT6370_ICHG_700_mA:
|
||||
case MT6370_ICHG_800_mA:
|
||||
*val1 = 2680;
|
||||
*val1 = mt6370_adc_get_ibat_scale(priv);
|
||||
break;
|
||||
default:
|
||||
*val1 = 5000;
|
||||
@ -251,6 +282,20 @@ static const struct iio_chan_spec mt6370_adc_channels[] = {
|
||||
MT6370_ADC_CHAN(TEMP_JC, IIO_TEMP, 12, BIT(IIO_CHAN_INFO_OFFSET)),
|
||||
};
|
||||
|
||||
static int mt6370_get_vendor_info(struct mt6370_adc_data *priv)
|
||||
{
|
||||
unsigned int dev_info;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(priv->regmap, MT6370_REG_DEV_INFO, &dev_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->vid = FIELD_GET(MT6370_VENID_MASK, dev_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt6370_adc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
@ -272,6 +317,10 @@ static int mt6370_adc_probe(struct platform_device *pdev)
|
||||
priv->regmap = regmap;
|
||||
mutex_init(&priv->adc_lock);
|
||||
|
||||
ret = mt6370_get_vendor_info(priv);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to get vid\n");
|
||||
|
||||
ret = regmap_write(priv->regmap, MT6370_REG_CHG_ADC, 0);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to reset ADC\n");
|
||||
|
@ -757,13 +757,13 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)
|
||||
|
||||
ret = mxs_lradc_adc_trigger_init(iio);
|
||||
if (ret)
|
||||
goto err_trig;
|
||||
return ret;
|
||||
|
||||
ret = iio_triggered_buffer_setup(iio, &iio_pollfunc_store_time,
|
||||
&mxs_lradc_adc_trigger_handler,
|
||||
&mxs_lradc_adc_buffer_ops);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_trig;
|
||||
|
||||
adc->vref_mv = mxs_lradc_adc_vref_mv[lradc->soc];
|
||||
|
||||
@ -801,9 +801,9 @@ static int mxs_lradc_adc_probe(struct platform_device *pdev)
|
||||
|
||||
err_dev:
|
||||
mxs_lradc_adc_hw_stop(adc);
|
||||
mxs_lradc_adc_trigger_remove(iio);
|
||||
err_trig:
|
||||
iio_triggered_buffer_cleanup(iio);
|
||||
err_trig:
|
||||
mxs_lradc_adc_trigger_remove(iio);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -814,8 +814,8 @@ static int mxs_lradc_adc_remove(struct platform_device *pdev)
|
||||
|
||||
iio_device_unregister(iio);
|
||||
mxs_lradc_adc_hw_stop(adc);
|
||||
mxs_lradc_adc_trigger_remove(iio);
|
||||
iio_triggered_buffer_cleanup(iio);
|
||||
mxs_lradc_adc_trigger_remove(iio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -547,7 +547,7 @@ static int palmas_gpadc_read_raw(struct iio_dev *indio_dev,
|
||||
int adc_chan = chan->channel;
|
||||
int ret = 0;
|
||||
|
||||
if (adc_chan > PALMAS_ADC_CH_MAX)
|
||||
if (adc_chan >= PALMAS_ADC_CH_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
@ -595,7 +595,7 @@ static int palmas_gpadc_read_event_config(struct iio_dev *indio_dev,
|
||||
int adc_chan = chan->channel;
|
||||
int ret = 0;
|
||||
|
||||
if (adc_chan > PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
@ -684,7 +684,7 @@ static int palmas_gpadc_write_event_config(struct iio_dev *indio_dev,
|
||||
int adc_chan = chan->channel;
|
||||
int ret;
|
||||
|
||||
if (adc_chan > PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
@ -710,7 +710,7 @@ static int palmas_gpadc_read_event_value(struct iio_dev *indio_dev,
|
||||
int adc_chan = chan->channel;
|
||||
int ret;
|
||||
|
||||
if (adc_chan > PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
@ -744,7 +744,7 @@ static int palmas_gpadc_write_event_value(struct iio_dev *indio_dev,
|
||||
int old;
|
||||
int ret;
|
||||
|
||||
if (adc_chan > PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
if (adc_chan >= PALMAS_ADC_CH_MAX || type != IIO_EV_TYPE_THRESH)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc->lock);
|
||||
|
@ -2006,16 +2006,15 @@ static int stm32_adc_get_legacy_chan_count(struct iio_dev *indio_dev, struct stm
|
||||
* to get the *real* number of channels.
|
||||
*/
|
||||
ret = device_property_count_u32(dev, "st,adc-diff-channels");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret /= (int)(sizeof(struct stm32_adc_diff_channel) / sizeof(u32));
|
||||
if (ret > adc_info->max_channels) {
|
||||
dev_err(&indio_dev->dev, "Bad st,adc-diff-channels?\n");
|
||||
return -EINVAL;
|
||||
} else if (ret > 0) {
|
||||
adc->num_diff = ret;
|
||||
num_channels += ret;
|
||||
if (ret > 0) {
|
||||
ret /= (int)(sizeof(struct stm32_adc_diff_channel) / sizeof(u32));
|
||||
if (ret > adc_info->max_channels) {
|
||||
dev_err(&indio_dev->dev, "Bad st,adc-diff-channels?\n");
|
||||
return -EINVAL;
|
||||
} else if (ret > 0) {
|
||||
adc->num_diff = ret;
|
||||
num_channels += ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* Optional sample time is provided either for each, or all channels */
|
||||
@ -2037,6 +2036,7 @@ static int stm32_adc_legacy_chan_init(struct iio_dev *indio_dev,
|
||||
struct stm32_adc_diff_channel diff[STM32_ADC_CH_MAX];
|
||||
struct device *dev = &indio_dev->dev;
|
||||
u32 num_diff = adc->num_diff;
|
||||
int num_se = nchans - num_diff;
|
||||
int size = num_diff * sizeof(*diff) / sizeof(u32);
|
||||
int scan_index = 0, ret, i, c;
|
||||
u32 smp = 0, smps[STM32_ADC_CH_MAX], chans[STM32_ADC_CH_MAX];
|
||||
@ -2063,29 +2063,32 @@ static int stm32_adc_legacy_chan_init(struct iio_dev *indio_dev,
|
||||
scan_index++;
|
||||
}
|
||||
}
|
||||
|
||||
ret = device_property_read_u32_array(dev, "st,adc-channels", chans,
|
||||
nchans);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (c = 0; c < nchans; c++) {
|
||||
if (chans[c] >= adc_info->max_channels) {
|
||||
dev_err(&indio_dev->dev, "Invalid channel %d\n",
|
||||
chans[c]);
|
||||
return -EINVAL;
|
||||
if (num_se > 0) {
|
||||
ret = device_property_read_u32_array(dev, "st,adc-channels", chans, num_se);
|
||||
if (ret) {
|
||||
dev_err(&indio_dev->dev, "Failed to get st,adc-channels %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Channel can't be configured both as single-ended & diff */
|
||||
for (i = 0; i < num_diff; i++) {
|
||||
if (chans[c] == diff[i].vinp) {
|
||||
dev_err(&indio_dev->dev, "channel %d misconfigured\n", chans[c]);
|
||||
for (c = 0; c < num_se; c++) {
|
||||
if (chans[c] >= adc_info->max_channels) {
|
||||
dev_err(&indio_dev->dev, "Invalid channel %d\n",
|
||||
chans[c]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Channel can't be configured both as single-ended & diff */
|
||||
for (i = 0; i < num_diff; i++) {
|
||||
if (chans[c] == diff[i].vinp) {
|
||||
dev_err(&indio_dev->dev, "channel %d misconfigured\n",
|
||||
chans[c]);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
stm32_adc_chan_init_one(indio_dev, &channels[scan_index],
|
||||
chans[c], 0, scan_index, false);
|
||||
scan_index++;
|
||||
}
|
||||
stm32_adc_chan_init_one(indio_dev, &channels[scan_index],
|
||||
chans[c], 0, scan_index, false);
|
||||
scan_index++;
|
||||
}
|
||||
|
||||
if (adc->nsmps > 0) {
|
||||
@ -2306,7 +2309,7 @@ static int stm32_adc_chan_fw_init(struct iio_dev *indio_dev, bool timestamping)
|
||||
|
||||
if (legacy)
|
||||
ret = stm32_adc_legacy_chan_init(indio_dev, adc, channels,
|
||||
num_channels);
|
||||
timestamping ? num_channels - 1 : num_channels);
|
||||
else
|
||||
ret = stm32_adc_generic_chan_init(indio_dev, adc, channels);
|
||||
if (ret < 0)
|
||||
|
@ -1007,7 +1007,7 @@ static int ad74413r_read_raw(struct iio_dev *indio_dev,
|
||||
|
||||
ret = ad74413r_get_single_adc_result(indio_dev, chan->channel,
|
||||
val);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ad74413r_adc_to_resistance_result(*val, val);
|
||||
|
@ -17,7 +17,7 @@ obj-$(CONFIG_AD5592R_BASE) += ad5592r-base.o
|
||||
obj-$(CONFIG_AD5592R) += ad5592r.o
|
||||
obj-$(CONFIG_AD5593R) += ad5593r.o
|
||||
obj-$(CONFIG_AD5755) += ad5755.o
|
||||
obj-$(CONFIG_AD5755) += ad5758.o
|
||||
obj-$(CONFIG_AD5758) += ad5758.o
|
||||
obj-$(CONFIG_AD5761) += ad5761.o
|
||||
obj-$(CONFIG_AD5764) += ad5764.o
|
||||
obj-$(CONFIG_AD5766) += ad5766.o
|
||||
|
@ -47,12 +47,18 @@ static int mcp4725_suspend(struct device *dev)
|
||||
struct mcp4725_data *data = iio_priv(i2c_get_clientdata(
|
||||
to_i2c_client(dev)));
|
||||
u8 outbuf[2];
|
||||
int ret;
|
||||
|
||||
outbuf[0] = (data->powerdown_mode + 1) << 4;
|
||||
outbuf[1] = 0;
|
||||
data->powerdown = true;
|
||||
|
||||
return i2c_master_send(data->client, outbuf, 2);
|
||||
ret = i2c_master_send(data->client, outbuf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
else if (ret != 2)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mcp4725_resume(struct device *dev)
|
||||
@ -60,13 +66,19 @@ static int mcp4725_resume(struct device *dev)
|
||||
struct mcp4725_data *data = iio_priv(i2c_get_clientdata(
|
||||
to_i2c_client(dev)));
|
||||
u8 outbuf[2];
|
||||
int ret;
|
||||
|
||||
/* restore previous DAC value */
|
||||
outbuf[0] = (data->dac_value >> 8) & 0xf;
|
||||
outbuf[1] = data->dac_value & 0xff;
|
||||
data->powerdown = false;
|
||||
|
||||
return i2c_master_send(data->client, outbuf, 2);
|
||||
ret = i2c_master_send(data->client, outbuf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
else if (ret != 2)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(mcp4725_pm_ops, mcp4725_suspend,
|
||||
mcp4725_resume);
|
||||
|
@ -275,9 +275,14 @@ static int inv_icm42600_buffer_preenable(struct iio_dev *indio_dev)
|
||||
{
|
||||
struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
|
||||
struct device *dev = regmap_get_device(st->map);
|
||||
struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
mutex_lock(&st->lock);
|
||||
inv_icm42600_timestamp_reset(ts);
|
||||
mutex_unlock(&st->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -375,7 +380,6 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
struct device *dev = regmap_get_device(st->map);
|
||||
unsigned int sensor;
|
||||
unsigned int *watermark;
|
||||
struct inv_icm42600_timestamp *ts;
|
||||
struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
|
||||
unsigned int sleep_temp = 0;
|
||||
unsigned int sleep_sensor = 0;
|
||||
@ -385,11 +389,9 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
if (indio_dev == st->indio_gyro) {
|
||||
sensor = INV_ICM42600_SENSOR_GYRO;
|
||||
watermark = &st->fifo.watermark.gyro;
|
||||
ts = iio_priv(st->indio_gyro);
|
||||
} else if (indio_dev == st->indio_accel) {
|
||||
sensor = INV_ICM42600_SENSOR_ACCEL;
|
||||
watermark = &st->fifo.watermark.accel;
|
||||
ts = iio_priv(st->indio_accel);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -417,8 +419,6 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
|
||||
if (!st->fifo.on)
|
||||
ret = inv_icm42600_set_temp_conf(st, false, &sleep_temp);
|
||||
|
||||
inv_icm42600_timestamp_reset(ts);
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&st->lock);
|
||||
|
||||
|
@ -337,6 +337,17 @@ free_gains:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void iio_gts_us_to_int_micro(int *time_us, int *int_micro_times,
|
||||
int num_times)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_times; i++) {
|
||||
int_micro_times[i * 2] = time_us[i] / 1000000;
|
||||
int_micro_times[i * 2 + 1] = time_us[i] % 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* iio_gts_build_avail_time_table - build table of available integration times
|
||||
* @gts: Gain time scale descriptor
|
||||
@ -351,7 +362,7 @@ free_gains:
|
||||
*/
|
||||
static int iio_gts_build_avail_time_table(struct iio_gts *gts)
|
||||
{
|
||||
int *times, i, j, idx = 0;
|
||||
int *times, i, j, idx = 0, *int_micro_times;
|
||||
|
||||
if (!gts->num_itime)
|
||||
return 0;
|
||||
@ -378,13 +389,24 @@ static int iio_gts_build_avail_time_table(struct iio_gts *gts)
|
||||
}
|
||||
}
|
||||
}
|
||||
gts->avail_time_tables = times;
|
||||
/*
|
||||
* This is just to survive a unlikely corner-case where times in the
|
||||
* given time table were not unique. Else we could just trust the
|
||||
* gts->num_itime.
|
||||
*/
|
||||
gts->num_avail_time_tables = idx;
|
||||
|
||||
/* create a list of times formatted as list of IIO_VAL_INT_PLUS_MICRO */
|
||||
int_micro_times = kcalloc(idx, sizeof(int) * 2, GFP_KERNEL);
|
||||
if (int_micro_times) {
|
||||
/*
|
||||
* This is just to survive a unlikely corner-case where times in
|
||||
* the given time table were not unique. Else we could just
|
||||
* trust the gts->num_itime.
|
||||
*/
|
||||
gts->num_avail_time_tables = idx;
|
||||
iio_gts_us_to_int_micro(times, int_micro_times, idx);
|
||||
}
|
||||
|
||||
gts->avail_time_tables = int_micro_times;
|
||||
kfree(times);
|
||||
|
||||
if (!int_micro_times)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -683,8 +705,8 @@ int iio_gts_avail_times(struct iio_gts *gts, const int **vals, int *type,
|
||||
return -EINVAL;
|
||||
|
||||
*vals = gts->avail_time_tables;
|
||||
*type = IIO_VAL_INT;
|
||||
*length = gts->num_avail_time_tables;
|
||||
*type = IIO_VAL_INT_PLUS_MICRO;
|
||||
*length = gts->num_avail_time_tables * 2;
|
||||
|
||||
return IIO_AVAIL_LIST;
|
||||
}
|
||||
|
@ -231,6 +231,9 @@ struct bu27034_result {
|
||||
|
||||
static const struct regmap_range bu27034_volatile_ranges[] = {
|
||||
{
|
||||
.range_min = BU27034_REG_SYSTEM_CONTROL,
|
||||
.range_max = BU27034_REG_SYSTEM_CONTROL,
|
||||
}, {
|
||||
.range_min = BU27034_REG_MODE_CONTROL4,
|
||||
.range_max = BU27034_REG_MODE_CONTROL4,
|
||||
}, {
|
||||
@ -1167,11 +1170,12 @@ static int bu27034_read_raw(struct iio_dev *idev,
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
*val = bu27034_get_int_time(data);
|
||||
if (*val < 0)
|
||||
return *val;
|
||||
*val = 0;
|
||||
*val2 = bu27034_get_int_time(data);
|
||||
if (*val2 < 0)
|
||||
return *val2;
|
||||
|
||||
return IIO_VAL_INT;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
return bu27034_get_scale(data, chan->channel, val, val2);
|
||||
@ -1229,7 +1233,10 @@ static int bu27034_write_raw(struct iio_dev *idev,
|
||||
ret = bu27034_set_scale(data, chan->channel, val, val2);
|
||||
break;
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
ret = bu27034_try_set_int_time(data, val);
|
||||
if (!val)
|
||||
ret = bu27034_try_set_int_time(data, val2);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@ -1268,12 +1275,19 @@ static int bu27034_chip_init(struct bu27034_data *data)
|
||||
int ret, sel;
|
||||
|
||||
/* Reset */
|
||||
ret = regmap_update_bits(data->regmap, BU27034_REG_SYSTEM_CONTROL,
|
||||
ret = regmap_write_bits(data->regmap, BU27034_REG_SYSTEM_CONTROL,
|
||||
BU27034_MASK_SW_RESET, BU27034_MASK_SW_RESET);
|
||||
if (ret)
|
||||
return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
|
||||
|
||||
msleep(1);
|
||||
|
||||
ret = regmap_reinit_cache(data->regmap, &bu27034_regmap);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "Failed to reinit reg cache\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read integration time here to ensure it is in regmap cache. We do
|
||||
* this to speed-up the int-time acquisition in the start of the buffer
|
||||
|
@ -8,6 +8,7 @@
|
||||
* TODO: Proximity
|
||||
*/
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@ -42,6 +43,7 @@
|
||||
#define VCNL4035_ALS_PERS_MASK GENMASK(3, 2)
|
||||
#define VCNL4035_INT_ALS_IF_H_MASK BIT(12)
|
||||
#define VCNL4035_INT_ALS_IF_L_MASK BIT(13)
|
||||
#define VCNL4035_DEV_ID_MASK GENMASK(7, 0)
|
||||
|
||||
/* Default values */
|
||||
#define VCNL4035_MODE_ALS_ENABLE BIT(0)
|
||||
@ -413,6 +415,7 @@ static int vcnl4035_init(struct vcnl4035_data *data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
id = FIELD_GET(VCNL4035_DEV_ID_MASK, id);
|
||||
if (id != VCNL4035_DEV_ID_VAL) {
|
||||
dev_err(&data->client->dev, "Wrong id, got %x, expected %x\n",
|
||||
id, VCNL4035_DEV_ID_VAL);
|
||||
|
@ -296,12 +296,13 @@ static int tmag5273_read_raw(struct iio_dev *indio_dev,
|
||||
return ret;
|
||||
|
||||
ret = tmag5273_get_measure(data, &t, &x, &y, &z, &angle, &magnitude);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pm_runtime_mark_last_busy(data->dev);
|
||||
pm_runtime_put_autosuspend(data->dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
switch (chan->address) {
|
||||
case TEMPERATURE:
|
||||
*val = t;
|
||||
|
@ -135,7 +135,7 @@ static inline int iio_gts_find_int_time_by_sel(struct iio_gts *gts, int sel)
|
||||
/**
|
||||
* iio_gts_find_sel_by_int_time - find selector matching integration time
|
||||
* @gts: Gain time scale descriptor
|
||||
* @gain: HW-gain for which matching selector is searched for
|
||||
* @time: Integration time for which matching selector is searched for
|
||||
*
|
||||
* Return: a selector matching given integration time or -EINVAL if
|
||||
* selector was not found.
|
||||
|
Loading…
Reference in New Issue
Block a user