forked from Minki/linux
Staging/IIO driver fixes for 4.8-rc5
Here are a number of small fixes for staging and IIO drivers that resolve reported problems. Full details are in the shortlog. All of these have been in linux-next with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iFYEABECABYFAlfK4HoPHGdyZWdAa3JvYWguY29tAAoJEDFH1A3bLfspt0MAn0wC dYhZOUHxOptLiEkVGXFCU9kzAJ4gETEbuGn9lgp2TFATOOAN7oqPUw== =6MKk -----END PGP SIGNATURE----- Merge tag 'staging-4.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging Pull staging/IIO driver fixes from Greg KH: "Here are a number of small fixes for staging and IIO drivers that resolve reported problems. Full details are in the shortlog. All of these have been in linux-next with no reported issues" * tag 'staging-4.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (35 commits) arm: dts: rockchip: add reset node for the exist saradc SoCs arm64: dts: rockchip: add reset saradc node for rk3368 SoCs iio: adc: rockchip_saradc: reset saradc controller before programming it iio: accel: kxsd9: Fix raw read return iio: adc: ti_am335x_adc: Increase timeout value waiting for ADC sample iio: adc: ti_am335x_adc: Protect FIFO1 from concurrent access include/linux: fix excess fence.h kernel-doc notation staging: wilc1000: correctly check if associatedsta has not been found staging: wilc1000: NULL dereference on error staging: wilc1000: txq_event: Fix coding error MAINTAINERS: Add file patterns for ion device tree bindings MAINTAINERS: Update maintainer entry for wilc1000 iio: chemical: atlas-ph-sensor: fix typo in val assignment iio: fix sched WARNING "do not call blocking ops when !TASK_RUNNING" staging: comedi: ni_mio_common: fix AO inttrig backwards compatibility staging: comedi: dt2811: fix a precedence bug staging: comedi: adv_pci1760: Do not return EINVAL for CMDF_ROUND_DOWN. staging: comedi: ni_mio_common: fix wrong insn_write handler staging: comedi: comedi_test: fix timer race conditions staging: comedi: daqboard2000: bug fix board type matching code ...
This commit is contained in:
commit
018c81b827
@ -16,6 +16,11 @@ Required properties:
|
||||
- vref-supply: The regulator supply ADC reference voltage.
|
||||
- #io-channel-cells: Should be 1, see ../iio-bindings.txt
|
||||
|
||||
Optional properties:
|
||||
- resets: Must contain an entry for each entry in reset-names if need support
|
||||
this option. See ../reset/reset.txt for details.
|
||||
- reset-names: Must include the name "saradc-apb".
|
||||
|
||||
Example:
|
||||
saradc: saradc@2006c000 {
|
||||
compatible = "rockchip,saradc";
|
||||
@ -23,6 +28,8 @@ Example:
|
||||
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
#io-channel-cells = <1>;
|
||||
vref-supply = <&vcc18>;
|
||||
};
|
||||
|
@ -798,6 +798,7 @@ M: Laura Abbott <labbott@redhat.com>
|
||||
M: Sumit Semwal <sumit.semwal@linaro.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/staging/ion/
|
||||
F: drivers/staging/android/ion
|
||||
F: drivers/staging/android/uapi/ion.h
|
||||
F: drivers/staging/android/uapi/ion_test.h
|
||||
@ -11232,12 +11233,8 @@ S: Odd Fixes
|
||||
F: drivers/staging/vt665?/
|
||||
|
||||
STAGING - WILC1000 WIFI DRIVER
|
||||
M: Johnny Kim <johnny.kim@atmel.com>
|
||||
M: Austin Shin <austin.shin@atmel.com>
|
||||
M: Chris Park <chris.park@atmel.com>
|
||||
M: Tony Cho <tony.cho@atmel.com>
|
||||
M: Glen Lee <glen.lee@atmel.com>
|
||||
M: Leo Kim <leo.kim@atmel.com>
|
||||
M: Aditya Shankar <aditya.shankar@microchip.com>
|
||||
M: Ganesh Krishna <ganesh.krishna@microchip.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/staging/wilc1000/
|
||||
|
@ -197,6 +197,8 @@
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#io-channel-cells = <1>;
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -279,6 +279,8 @@
|
||||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -399,6 +399,8 @@
|
||||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -270,6 +270,8 @@
|
||||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -20,6 +20,8 @@ config BMA180
|
||||
config BMA220
|
||||
tristate "Bosch BMA220 3-Axis Accelerometer Driver"
|
||||
depends on SPI
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say yes here to add support for the Bosch BMA220 triaxial
|
||||
acceleration sensor.
|
||||
@ -234,7 +236,8 @@ config STK8312
|
||||
config STK8BA50
|
||||
tristate "Sensortek STK8BA50 3-Axis Accelerometer Driver"
|
||||
depends on I2C
|
||||
depends on IIO_TRIGGER
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say yes here to get support for the Sensortek STK8BA50 3-axis
|
||||
accelerometer.
|
||||
|
@ -253,7 +253,7 @@ static int bma220_probe(struct spi_device *spi)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = iio_triggered_buffer_setup(indio_dev, NULL,
|
||||
ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time,
|
||||
bma220_trigger_handler, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "iio triggered buffer setup failed\n");
|
||||
|
@ -160,6 +160,7 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev,
|
||||
if (ret < 0)
|
||||
goto error_ret;
|
||||
*val = ret;
|
||||
ret = IIO_VAL_INT;
|
||||
break;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
ret = spi_w8r8(st->us, KXSD9_READ(KXSD9_REG_CTRL_C));
|
||||
|
@ -389,6 +389,7 @@ config QCOM_SPMI_VADC
|
||||
config ROCKCHIP_SARADC
|
||||
tristate "Rockchip SARADC driver"
|
||||
depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST)
|
||||
depends on RESET_CONTROLLER
|
||||
help
|
||||
Say yes here to build support for the SARADC found in SoCs from
|
||||
Rockchip.
|
||||
|
@ -527,6 +527,7 @@ static struct attribute_group ad799x_event_attrs_group = {
|
||||
static const struct iio_info ad7991_info = {
|
||||
.read_raw = &ad799x_read_raw,
|
||||
.driver_module = THIS_MODULE,
|
||||
.update_scan_mode = ad799x_update_scan_mode,
|
||||
};
|
||||
|
||||
static const struct iio_info ad7993_4_7_8_noirq_info = {
|
||||
|
@ -381,8 +381,8 @@ static irqreturn_t at91_adc_rl_interrupt(int irq, void *private)
|
||||
st->ts_bufferedmeasure = false;
|
||||
input_report_key(st->ts_input, BTN_TOUCH, 0);
|
||||
input_sync(st->ts_input);
|
||||
} else if (status & AT91_ADC_EOC(3)) {
|
||||
/* Conversion finished */
|
||||
} else if (status & AT91_ADC_EOC(3) && st->ts_input) {
|
||||
/* Conversion finished and we've a touchscreen */
|
||||
if (st->ts_bufferedmeasure) {
|
||||
/*
|
||||
* Last measurement is always discarded, since it can
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/iio/iio.h>
|
||||
|
||||
@ -53,6 +55,7 @@ struct rockchip_saradc {
|
||||
struct clk *clk;
|
||||
struct completion completion;
|
||||
struct regulator *vref;
|
||||
struct reset_control *reset;
|
||||
const struct rockchip_saradc_data *data;
|
||||
u16 last_val;
|
||||
};
|
||||
@ -190,6 +193,16 @@ static const struct of_device_id rockchip_saradc_match[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rockchip_saradc_match);
|
||||
|
||||
/**
|
||||
* Reset SARADC Controller.
|
||||
*/
|
||||
static void rockchip_saradc_reset_controller(struct reset_control *reset)
|
||||
{
|
||||
reset_control_assert(reset);
|
||||
usleep_range(10, 20);
|
||||
reset_control_deassert(reset);
|
||||
}
|
||||
|
||||
static int rockchip_saradc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rockchip_saradc *info = NULL;
|
||||
@ -218,6 +231,20 @@ static int rockchip_saradc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(info->regs))
|
||||
return PTR_ERR(info->regs);
|
||||
|
||||
/*
|
||||
* The reset should be an optional property, as it should work
|
||||
* with old devicetrees as well
|
||||
*/
|
||||
info->reset = devm_reset_control_get(&pdev->dev, "saradc-apb");
|
||||
if (IS_ERR(info->reset)) {
|
||||
ret = PTR_ERR(info->reset);
|
||||
if (ret != -ENOENT)
|
||||
return ret;
|
||||
|
||||
dev_dbg(&pdev->dev, "no reset control found\n");
|
||||
info->reset = NULL;
|
||||
}
|
||||
|
||||
init_completion(&info->completion);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
@ -252,6 +279,9 @@ static int rockchip_saradc_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(info->vref);
|
||||
}
|
||||
|
||||
if (info->reset)
|
||||
rockchip_saradc_reset_controller(info->reset);
|
||||
|
||||
/*
|
||||
* Use a default value for the converter clock.
|
||||
* This may become user-configurable in the future.
|
||||
|
@ -489,7 +489,8 @@ static struct iio_info ads1115_info = {
|
||||
#ifdef CONFIG_OF
|
||||
static int ads1015_get_channels_config_of(struct i2c_client *client)
|
||||
{
|
||||
struct ads1015_data *data = i2c_get_clientdata(client);
|
||||
struct iio_dev *indio_dev = i2c_get_clientdata(client);
|
||||
struct ads1015_data *data = iio_priv(indio_dev);
|
||||
struct device_node *node;
|
||||
|
||||
if (!client->dev.of_node ||
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
struct tiadc_device {
|
||||
struct ti_tscadc_dev *mfd_tscadc;
|
||||
struct mutex fifo1_lock; /* to protect fifo access */
|
||||
int channels;
|
||||
u8 channel_line[8];
|
||||
u8 channel_step[8];
|
||||
@ -359,6 +360,7 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
||||
int *val, int *val2, long mask)
|
||||
{
|
||||
struct tiadc_device *adc_dev = iio_priv(indio_dev);
|
||||
int ret = IIO_VAL_INT;
|
||||
int i, map_val;
|
||||
unsigned int fifo1count, read, stepid;
|
||||
bool found = false;
|
||||
@ -372,13 +374,14 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
||||
if (!step_en)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&adc_dev->fifo1_lock);
|
||||
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
|
||||
while (fifo1count--)
|
||||
tiadc_readl(adc_dev, REG_FIFO1);
|
||||
|
||||
am335x_tsc_se_set_once(adc_dev->mfd_tscadc, step_en);
|
||||
|
||||
timeout = jiffies + usecs_to_jiffies
|
||||
timeout = jiffies + msecs_to_jiffies
|
||||
(IDLE_TIMEOUT * adc_dev->channels);
|
||||
/* Wait for Fifo threshold interrupt */
|
||||
while (1) {
|
||||
@ -388,7 +391,8 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
||||
|
||||
if (time_after(jiffies, timeout)) {
|
||||
am335x_tsc_se_adc_done(adc_dev->mfd_tscadc);
|
||||
return -EAGAIN;
|
||||
ret = -EAGAIN;
|
||||
goto err_unlock;
|
||||
}
|
||||
}
|
||||
map_val = adc_dev->channel_step[chan->scan_index];
|
||||
@ -414,8 +418,11 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
|
||||
am335x_tsc_se_adc_done(adc_dev->mfd_tscadc);
|
||||
|
||||
if (found == false)
|
||||
return -EBUSY;
|
||||
return IIO_VAL_INT;
|
||||
ret = -EBUSY;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&adc_dev->fifo1_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct iio_info tiadc_info = {
|
||||
@ -483,6 +490,7 @@ static int tiadc_probe(struct platform_device *pdev)
|
||||
|
||||
tiadc_step_config(indio_dev);
|
||||
tiadc_writel(adc_dev, REG_FIFO1THR, FIFO1_THRESHOLD);
|
||||
mutex_init(&adc_dev->fifo1_lock);
|
||||
|
||||
err = tiadc_channel_init(indio_dev, adc_dev->channels);
|
||||
if (err < 0)
|
||||
|
@ -434,7 +434,7 @@ static int atlas_read_raw(struct iio_dev *indio_dev,
|
||||
break;
|
||||
case IIO_ELECTRICALCONDUCTIVITY:
|
||||
*val = 1; /* 0.00001 */
|
||||
*val = 100000;
|
||||
*val2 = 100000;
|
||||
break;
|
||||
case IIO_CONCENTRATION:
|
||||
*val = 0; /* 0.000000001 */
|
||||
|
@ -65,6 +65,16 @@ struct stx104_gpio {
|
||||
unsigned int out_state;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct stx104_dev - STX104 device private data structure
|
||||
* @indio_dev: IIO device
|
||||
* @chip: instance of the gpio_chip
|
||||
*/
|
||||
struct stx104_dev {
|
||||
struct iio_dev *indio_dev;
|
||||
struct gpio_chip *chip;
|
||||
};
|
||||
|
||||
static int stx104_read_raw(struct iio_dev *indio_dev,
|
||||
struct iio_chan_spec const *chan, int *val, int *val2, long mask)
|
||||
{
|
||||
@ -107,6 +117,7 @@ static const struct iio_chan_spec stx104_channels[STX104_NUM_CHAN] = {
|
||||
static int stx104_gpio_get_direction(struct gpio_chip *chip,
|
||||
unsigned int offset)
|
||||
{
|
||||
/* GPIO 0-3 are input only, while the rest are output only */
|
||||
if (offset < 4)
|
||||
return 1;
|
||||
|
||||
@ -169,6 +180,7 @@ static int stx104_probe(struct device *dev, unsigned int id)
|
||||
struct iio_dev *indio_dev;
|
||||
struct stx104_iio *priv;
|
||||
struct stx104_gpio *stx104gpio;
|
||||
struct stx104_dev *stx104dev;
|
||||
int err;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
|
||||
@ -179,6 +191,10 @@ static int stx104_probe(struct device *dev, unsigned int id)
|
||||
if (!stx104gpio)
|
||||
return -ENOMEM;
|
||||
|
||||
stx104dev = devm_kzalloc(dev, sizeof(*stx104dev), GFP_KERNEL);
|
||||
if (!stx104dev)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!devm_request_region(dev, base[id], STX104_EXTENT,
|
||||
dev_name(dev))) {
|
||||
dev_err(dev, "Unable to lock port addresses (0x%X-0x%X)\n",
|
||||
@ -199,12 +215,6 @@ static int stx104_probe(struct device *dev, unsigned int id)
|
||||
outw(0, base[id] + 4);
|
||||
outw(0, base[id] + 6);
|
||||
|
||||
err = devm_iio_device_register(dev, indio_dev);
|
||||
if (err) {
|
||||
dev_err(dev, "IIO device registering failed (%d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
stx104gpio->chip.label = dev_name(dev);
|
||||
stx104gpio->chip.parent = dev;
|
||||
stx104gpio->chip.owner = THIS_MODULE;
|
||||
@ -220,7 +230,9 @@ static int stx104_probe(struct device *dev, unsigned int id)
|
||||
|
||||
spin_lock_init(&stx104gpio->lock);
|
||||
|
||||
dev_set_drvdata(dev, stx104gpio);
|
||||
stx104dev->indio_dev = indio_dev;
|
||||
stx104dev->chip = &stx104gpio->chip;
|
||||
dev_set_drvdata(dev, stx104dev);
|
||||
|
||||
err = gpiochip_add_data(&stx104gpio->chip, stx104gpio);
|
||||
if (err) {
|
||||
@ -228,14 +240,22 @@ static int stx104_probe(struct device *dev, unsigned int id)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = iio_device_register(indio_dev);
|
||||
if (err) {
|
||||
dev_err(dev, "IIO device registering failed (%d)\n", err);
|
||||
gpiochip_remove(&stx104gpio->chip);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stx104_remove(struct device *dev, unsigned int id)
|
||||
{
|
||||
struct stx104_gpio *const stx104gpio = dev_get_drvdata(dev);
|
||||
struct stx104_dev *const stx104dev = dev_get_drvdata(dev);
|
||||
|
||||
gpiochip_remove(&stx104gpio->chip);
|
||||
iio_device_unregister(stx104dev->indio_dev);
|
||||
gpiochip_remove(stx104dev->chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -6,6 +6,8 @@ menu "Humidity sensors"
|
||||
config AM2315
|
||||
tristate "Aosong AM2315 relative humidity and temperature sensor"
|
||||
depends on I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
If you say yes here you get support for the Aosong AM2315
|
||||
relative humidity and ambient temperature sensor.
|
||||
|
@ -244,7 +244,7 @@ static int am2315_probe(struct i2c_client *client,
|
||||
indio_dev->channels = am2315_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(am2315_channels);
|
||||
|
||||
ret = iio_triggered_buffer_setup(indio_dev, NULL,
|
||||
ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time,
|
||||
am2315_trigger_handler, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "iio triggered buffer setup failed\n");
|
||||
|
@ -142,7 +142,7 @@ static int hdc100x_get_measurement(struct hdc100x_data *data,
|
||||
struct i2c_client *client = data->client;
|
||||
int delay = data->adc_int_us[chan->address];
|
||||
int ret;
|
||||
int val;
|
||||
__be16 val;
|
||||
|
||||
/* start measurement */
|
||||
ret = i2c_smbus_write_byte(client, chan->address);
|
||||
@ -154,26 +154,13 @@ static int hdc100x_get_measurement(struct hdc100x_data *data,
|
||||
/* wait for integration time to pass */
|
||||
usleep_range(delay, delay + 1000);
|
||||
|
||||
/*
|
||||
* i2c_smbus_read_word_data cannot() be used here due to the command
|
||||
* value not being understood and causes NAKs preventing any reading
|
||||
* from being accessed.
|
||||
*/
|
||||
ret = i2c_smbus_read_byte(client);
|
||||
/* read measurement */
|
||||
ret = i2c_master_recv(data->client, (char *)&val, sizeof(val));
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "cannot read high byte measurement");
|
||||
dev_err(&client->dev, "cannot read sensor data\n");
|
||||
return ret;
|
||||
}
|
||||
val = ret << 8;
|
||||
|
||||
ret = i2c_smbus_read_byte(client);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "cannot read low byte measurement");
|
||||
return ret;
|
||||
}
|
||||
val |= ret;
|
||||
|
||||
return val;
|
||||
return be16_to_cpu(val);
|
||||
}
|
||||
|
||||
static int hdc100x_get_heater_status(struct hdc100x_data *data)
|
||||
@ -272,8 +259,8 @@ static int hdc100x_probe(struct i2c_client *client,
|
||||
struct iio_dev *indio_dev;
|
||||
struct hdc100x_data *data;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BYTE))
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA |
|
||||
I2C_FUNC_SMBUS_BYTE | I2C_FUNC_I2C))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
|
||||
|
@ -107,6 +107,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
|
||||
{
|
||||
struct iio_dev *indio_dev = filp->private_data;
|
||||
struct iio_buffer *rb = indio_dev->buffer;
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
size_t datum_size;
|
||||
size_t to_wait;
|
||||
int ret;
|
||||
@ -131,19 +132,29 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
|
||||
else
|
||||
to_wait = min_t(size_t, n / datum_size, rb->watermark);
|
||||
|
||||
add_wait_queue(&rb->pollq, &wait);
|
||||
do {
|
||||
ret = wait_event_interruptible(rb->pollq,
|
||||
iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size));
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!indio_dev->info) {
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!indio_dev->info)
|
||||
return -ENODEV;
|
||||
if (!iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size)) {
|
||||
if (signal_pending(current)) {
|
||||
ret = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
wait_woken(&wait, TASK_INTERRUPTIBLE,
|
||||
MAX_SCHEDULE_TIMEOUT);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = rb->access->read_first_n(rb, n, buf);
|
||||
if (ret == 0 && (filp->f_flags & O_NONBLOCK))
|
||||
ret = -EAGAIN;
|
||||
} while (ret == 0);
|
||||
remove_wait_queue(&rb->pollq, &wait);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -238,6 +238,8 @@ config MAX44000
|
||||
tristate "MAX44000 Ambient and Infrared Proximity Sensor"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_TRIGGERED_BUFFER
|
||||
help
|
||||
Say Y here if you want to build support for Maxim Integrated's
|
||||
MAX44000 ambient and infrared proximity sensor device.
|
||||
|
@ -970,7 +970,7 @@ int bmp280_common_probe(struct device *dev,
|
||||
data->vdda = devm_regulator_get(dev, "vdda");
|
||||
if (IS_ERR(data->vdda)) {
|
||||
dev_err(dev, "failed to get VDDA regulator\n");
|
||||
ret = PTR_ERR(data->vddd);
|
||||
ret = PTR_ERR(data->vdda);
|
||||
goto out_disable_vddd;
|
||||
}
|
||||
ret = regulator_enable(data->vdda);
|
||||
@ -1079,7 +1079,8 @@ EXPORT_SYMBOL(bmp280_common_remove);
|
||||
#ifdef CONFIG_PM
|
||||
static int bmp280_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct bmp280_data *data = dev_get_drvdata(dev);
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct bmp280_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
ret = regulator_disable(data->vdda);
|
||||
@ -1090,7 +1091,8 @@ static int bmp280_runtime_suspend(struct device *dev)
|
||||
|
||||
static int bmp280_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct bmp280_data *data = dev_get_drvdata(dev);
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct bmp280_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
ret = regulator_enable(data->vddd);
|
||||
|
@ -397,7 +397,7 @@ static int as3935_probe(struct spi_device *spi)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = iio_triggered_buffer_setup(indio_dev, NULL,
|
||||
ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time,
|
||||
&as3935_trigger_handler, NULL);
|
||||
|
||||
if (ret) {
|
||||
|
@ -196,6 +196,7 @@ static int pci1760_pwm_ns_to_div(unsigned int flags, unsigned int ns)
|
||||
break;
|
||||
case CMDF_ROUND_DOWN:
|
||||
divisor = ns / PCI1760_PWM_TIMEBASE;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -56,11 +56,6 @@
|
||||
|
||||
#define N_CHANS 8
|
||||
|
||||
enum waveform_state_bits {
|
||||
WAVEFORM_AI_RUNNING,
|
||||
WAVEFORM_AO_RUNNING
|
||||
};
|
||||
|
||||
/* Data unique to this driver */
|
||||
struct waveform_private {
|
||||
struct timer_list ai_timer; /* timer for AI commands */
|
||||
@ -68,7 +63,6 @@ struct waveform_private {
|
||||
unsigned int wf_amplitude; /* waveform amplitude in microvolts */
|
||||
unsigned int wf_period; /* waveform period in microseconds */
|
||||
unsigned int wf_current; /* current time in waveform period */
|
||||
unsigned long state_bits;
|
||||
unsigned int ai_scan_period; /* AI scan period in usec */
|
||||
unsigned int ai_convert_period; /* AI conversion period in usec */
|
||||
struct timer_list ao_timer; /* timer for AO commands */
|
||||
@ -191,10 +185,6 @@ static void waveform_ai_timer(unsigned long arg)
|
||||
unsigned int nsamples;
|
||||
unsigned int time_increment;
|
||||
|
||||
/* check command is still active */
|
||||
if (!test_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits))
|
||||
return;
|
||||
|
||||
now = ktime_to_us(ktime_get());
|
||||
nsamples = comedi_nsamples_left(s, UINT_MAX);
|
||||
|
||||
@ -386,11 +376,6 @@ static int waveform_ai_cmd(struct comedi_device *dev,
|
||||
*/
|
||||
devpriv->ai_timer.expires =
|
||||
jiffies + usecs_to_jiffies(devpriv->ai_convert_period) + 1;
|
||||
|
||||
/* mark command as active */
|
||||
smp_mb__before_atomic();
|
||||
set_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits);
|
||||
smp_mb__after_atomic();
|
||||
add_timer(&devpriv->ai_timer);
|
||||
return 0;
|
||||
}
|
||||
@ -400,11 +385,12 @@ static int waveform_ai_cancel(struct comedi_device *dev,
|
||||
{
|
||||
struct waveform_private *devpriv = dev->private;
|
||||
|
||||
/* mark command as no longer active */
|
||||
clear_bit(WAVEFORM_AI_RUNNING, &devpriv->state_bits);
|
||||
smp_mb__after_atomic();
|
||||
/* cannot call del_timer_sync() as may be called from timer routine */
|
||||
if (in_softirq()) {
|
||||
/* Assume we were called from the timer routine itself. */
|
||||
del_timer(&devpriv->ai_timer);
|
||||
} else {
|
||||
del_timer_sync(&devpriv->ai_timer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -436,10 +422,6 @@ static void waveform_ao_timer(unsigned long arg)
|
||||
u64 scans_since;
|
||||
unsigned int scans_avail = 0;
|
||||
|
||||
/* check command is still active */
|
||||
if (!test_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits))
|
||||
return;
|
||||
|
||||
/* determine number of scan periods since last time */
|
||||
now = ktime_to_us(ktime_get());
|
||||
scans_since = now - devpriv->ao_last_scan_time;
|
||||
@ -518,11 +500,6 @@ static int waveform_ao_inttrig_start(struct comedi_device *dev,
|
||||
devpriv->ao_last_scan_time = ktime_to_us(ktime_get());
|
||||
devpriv->ao_timer.expires =
|
||||
jiffies + usecs_to_jiffies(devpriv->ao_scan_period);
|
||||
|
||||
/* mark command as active */
|
||||
smp_mb__before_atomic();
|
||||
set_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits);
|
||||
smp_mb__after_atomic();
|
||||
add_timer(&devpriv->ao_timer);
|
||||
|
||||
return 1;
|
||||
@ -608,11 +585,12 @@ static int waveform_ao_cancel(struct comedi_device *dev,
|
||||
struct waveform_private *devpriv = dev->private;
|
||||
|
||||
s->async->inttrig = NULL;
|
||||
/* mark command as no longer active */
|
||||
clear_bit(WAVEFORM_AO_RUNNING, &devpriv->state_bits);
|
||||
smp_mb__after_atomic();
|
||||
/* cannot call del_timer_sync() as may be called from timer routine */
|
||||
if (in_softirq()) {
|
||||
/* Assume we were called from the timer routine itself. */
|
||||
del_timer(&devpriv->ao_timer);
|
||||
} else {
|
||||
del_timer_sync(&devpriv->ao_timer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -634,7 +634,7 @@ static const void *daqboard2000_find_boardinfo(struct comedi_device *dev,
|
||||
const struct daq200_boardtype *board;
|
||||
int i;
|
||||
|
||||
if (pcidev->subsystem_device != PCI_VENDOR_ID_IOTECH)
|
||||
if (pcidev->subsystem_vendor != PCI_VENDOR_ID_IOTECH)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(boardtypes); i++) {
|
||||
|
@ -588,8 +588,8 @@ static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||
s = &dev->subdevices[0];
|
||||
s->type = COMEDI_SUBD_AI;
|
||||
s->subdev_flags = SDF_READABLE |
|
||||
(it->options[2] == 1) ? SDF_DIFF :
|
||||
(it->options[2] == 2) ? SDF_COMMON : SDF_GROUND;
|
||||
((it->options[2] == 1) ? SDF_DIFF :
|
||||
(it->options[2] == 2) ? SDF_COMMON : SDF_GROUND);
|
||||
s->n_chan = (it->options[2] == 1) ? 8 : 16;
|
||||
s->maxdata = 0x0fff;
|
||||
s->range_table = board->is_pgh ? &dt2811_pgh_ai_ranges
|
||||
|
@ -2772,7 +2772,15 @@ static int ni_ao_inttrig(struct comedi_device *dev,
|
||||
int i;
|
||||
static const int timeout = 1000;
|
||||
|
||||
if (trig_num != cmd->start_arg)
|
||||
/*
|
||||
* Require trig_num == cmd->start_arg when cmd->start_src == TRIG_INT.
|
||||
* For backwards compatibility, also allow trig_num == 0 when
|
||||
* cmd->start_src != TRIG_INT (i.e. when cmd->start_src == TRIG_EXT);
|
||||
* in that case, the internal trigger is being used as a pre-trigger
|
||||
* before the external trigger.
|
||||
*/
|
||||
if (!(trig_num == cmd->start_arg ||
|
||||
(trig_num == 0 && cmd->start_src != TRIG_INT)))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
@ -5480,7 +5488,7 @@ static int ni_E_init(struct comedi_device *dev,
|
||||
s->maxdata = (devpriv->is_m_series) ? 0xffffffff
|
||||
: 0x00ffffff;
|
||||
s->insn_read = ni_tio_insn_read;
|
||||
s->insn_write = ni_tio_insn_read;
|
||||
s->insn_write = ni_tio_insn_write;
|
||||
s->insn_config = ni_tio_insn_config;
|
||||
#ifdef PCIDMA
|
||||
if (dev->irq && devpriv->mite) {
|
||||
|
@ -419,6 +419,7 @@ static ssize_t ad5933_store(struct device *dev,
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
switch ((u32)this_attr->address) {
|
||||
case AD5933_OUT_RANGE:
|
||||
ret = -EINVAL;
|
||||
for (i = 0; i < 4; i++)
|
||||
if (val == st->range_avail[i]) {
|
||||
st->ctrl_hb &= ~AD5933_CTRL_RANGE(0x3);
|
||||
@ -426,7 +427,6 @@ static ssize_t ad5933_store(struct device *dev,
|
||||
ret = ad5933_cmd(st, 0);
|
||||
break;
|
||||
}
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
case AD5933_IN_PGA_GAIN:
|
||||
if (sysfs_streq(buf, "1")) {
|
||||
|
@ -388,6 +388,7 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
|
||||
struct inode *inode = NULL;
|
||||
__u64 bits = 0;
|
||||
int rc = 0;
|
||||
struct dentry *alias;
|
||||
|
||||
/* NB 1 request reference will be taken away by ll_intent_lock()
|
||||
* when I return
|
||||
@ -412,26 +413,12 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
|
||||
*/
|
||||
}
|
||||
|
||||
/* Only hash *de if it is unhashed (new dentry).
|
||||
* Atoimc_open may passing hashed dentries for open.
|
||||
*/
|
||||
if (d_unhashed(*de)) {
|
||||
struct dentry *alias;
|
||||
|
||||
alias = ll_splice_alias(inode, *de);
|
||||
if (IS_ERR(alias)) {
|
||||
rc = PTR_ERR(alias);
|
||||
goto out;
|
||||
}
|
||||
*de = alias;
|
||||
} else if (!it_disposition(it, DISP_LOOKUP_NEG) &&
|
||||
!it_disposition(it, DISP_OPEN_CREATE)) {
|
||||
/* With DISP_OPEN_CREATE dentry will be
|
||||
* instantiated in ll_create_it.
|
||||
*/
|
||||
LASSERT(!d_inode(*de));
|
||||
d_instantiate(*de, inode);
|
||||
}
|
||||
|
||||
if (!it_disposition(it, DISP_LOOKUP_NEG)) {
|
||||
/* we have lookup look - unhide dentry */
|
||||
@ -587,6 +574,24 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry,
|
||||
dentry, PFID(ll_inode2fid(dir)), dir, file, open_flags, mode,
|
||||
*opened);
|
||||
|
||||
/* Only negative dentries enter here */
|
||||
LASSERT(!d_inode(dentry));
|
||||
|
||||
if (!d_in_lookup(dentry)) {
|
||||
/* A valid negative dentry that just passed revalidation,
|
||||
* there's little point to try and open it server-side,
|
||||
* even though there's a minuscle chance it might succeed.
|
||||
* Either way it's a valid race to just return -ENOENT here.
|
||||
*/
|
||||
if (!(open_flags & O_CREAT))
|
||||
return -ENOENT;
|
||||
|
||||
/* Otherwise we just unhash it to be rehashed afresh via
|
||||
* lookup if necessary
|
||||
*/
|
||||
d_drop(dentry);
|
||||
}
|
||||
|
||||
it = kzalloc(sizeof(*it), GFP_NOFS);
|
||||
if (!it)
|
||||
return -ENOMEM;
|
||||
|
@ -3363,7 +3363,7 @@ int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler)
|
||||
if (!hif_workqueue) {
|
||||
netdev_err(vif->ndev, "Failed to create workqueue\n");
|
||||
result = -ENOMEM;
|
||||
goto _fail_mq_;
|
||||
goto _fail_;
|
||||
}
|
||||
|
||||
setup_timer(&periodic_rssi, GetPeriodicRSSI,
|
||||
@ -3391,7 +3391,6 @@ int wilc_init(struct net_device *dev, struct host_if_drv **hif_drv_handler)
|
||||
|
||||
clients_count++;
|
||||
|
||||
_fail_mq_:
|
||||
destroy_workqueue(hif_workqueue);
|
||||
_fail_:
|
||||
return result;
|
||||
|
@ -648,7 +648,7 @@ void wilc1000_wlan_deinit(struct net_device *dev)
|
||||
mutex_unlock(&wl->hif_cs);
|
||||
}
|
||||
if (&wl->txq_event)
|
||||
wait_for_completion(&wl->txq_event);
|
||||
complete(&wl->txq_event);
|
||||
|
||||
wlan_deinitialize_threads(dev);
|
||||
deinit_irq(dev);
|
||||
|
@ -1191,7 +1191,7 @@ static int get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct wilc_priv *priv;
|
||||
struct wilc_vif *vif;
|
||||
u32 i = 0;
|
||||
u32 associatedsta = 0;
|
||||
u32 associatedsta = ~0;
|
||||
u32 inactive_time = 0;
|
||||
priv = wiphy_priv(wiphy);
|
||||
vif = netdev_priv(dev);
|
||||
@ -1204,7 +1204,7 @@ static int get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
if (associatedsta == -1) {
|
||||
if (associatedsta == ~0) {
|
||||
netdev_err(dev, "sta required is not associated\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ struct fence_cb;
|
||||
* @timestamp: Timestamp when the fence was signaled.
|
||||
* @status: Optional, only valid if < 0, must be set before calling
|
||||
* fence_signal, indicates that the fence has completed with an error.
|
||||
* @child_list: list of children fences
|
||||
* @active_list: list of active fences
|
||||
*
|
||||
* the flags member must be manipulated and read using the appropriate
|
||||
* atomic ops (bit_*), so taking the spinlock will not be needed most
|
||||
|
@ -62,7 +62,7 @@ void iio_swt_group_init_type_name(struct iio_sw_trigger *t,
|
||||
const char *name,
|
||||
struct config_item_type *type)
|
||||
{
|
||||
#ifdef CONFIG_CONFIGFS_FS
|
||||
#if IS_ENABLED(CONFIG_CONFIGFS_FS)
|
||||
config_group_init_type_name(&t->group, name, type);
|
||||
#endif
|
||||
}
|
||||
|
@ -138,16 +138,16 @@
|
||||
/*
|
||||
* time in us for processing a single channel, calculated as follows:
|
||||
*
|
||||
* num cycles = open delay + (sample delay + conv time) * averaging
|
||||
* max num cycles = open delay + (sample delay + conv time) * averaging
|
||||
*
|
||||
* num cycles: 152 + (1 + 13) * 16 = 376
|
||||
* max num cycles: 262143 + (255 + 13) * 16 = 266431
|
||||
*
|
||||
* clock frequency: 26MHz / 8 = 3.25MHz
|
||||
* clock period: 1 / 3.25MHz = 308ns
|
||||
*
|
||||
* processing time: 376 * 308ns = 116us
|
||||
* max processing time: 266431 * 308ns = 83ms(approx)
|
||||
*/
|
||||
#define IDLE_TIMEOUT 116 /* microsec */
|
||||
#define IDLE_TIMEOUT 83 /* milliseconds */
|
||||
|
||||
#define TSCADC_CELLS 2
|
||||
|
||||
|
@ -348,7 +348,7 @@ int main(int argc, char **argv)
|
||||
int notrigger = 0;
|
||||
char *dummy;
|
||||
|
||||
struct iio_channel_info *channels;
|
||||
struct iio_channel_info *channels = NULL;
|
||||
|
||||
register_cleanup();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user