Commit dd9d064e authored by Linus Torvalds's avatar Linus Torvalds

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

Pull staging and IIO fixes from Greg KH:
 "Here are a small number of patches to resolve some reported IIO and a
  staging driver problem. Nothing major here, full details are in the
  shortlog below.

  All have been in linux-next with no reported issues"

* tag 'staging-4.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  staging: bcm2835-audio: Fix memory corruption
  iio: adc: at91-sama5d2_adc: fix probe error on missing trigger property
  iio: adc: dln2-adc: fix build error
  iio: dummy: events: Add missing break
  staging: iio: ade7759: fix signed extension bug on shift of a u8
  iio: pressure: zpa2326: Remove always-true check which confuses gcc
  iio: proximity: as3935: noise detection + threshold changes
parents 17e7637f c97d96b4
...@@ -14,3 +14,11 @@ Description: ...@@ -14,3 +14,11 @@ Description:
Show or set the gain boost of the amp, from 0-31 range. Show or set the gain boost of the amp, from 0-31 range.
18 = indoors (default) 18 = indoors (default)
14 = outdoors 14 = outdoors
What /sys/bus/iio/devices/iio:deviceX/noise_level_tripped
Date: May 2017
KernelVersion: 4.13
Contact: Matt Ranostay <matt.ranostay@konsulko.com>
Description:
When 1 the noise level is over the trip level and not reporting
valid data
...@@ -16,6 +16,10 @@ Optional properties: ...@@ -16,6 +16,10 @@ Optional properties:
- ams,tuning-capacitor-pf: Calibration tuning capacitor stepping - ams,tuning-capacitor-pf: Calibration tuning capacitor stepping
value 0 - 120pF. This will require using the calibration data from value 0 - 120pF. This will require using the calibration data from
the manufacturer. the manufacturer.
- ams,nflwdth: Set the noise and watchdog threshold register on
startup. This will need to set according to the noise from the
MCU board, and possibly the local environment. Refer to the
datasheet for the threshold settings.
Example: Example:
...@@ -27,4 +31,5 @@ as3935@0 { ...@@ -27,4 +31,5 @@ as3935@0 {
interrupt-parent = <&gpio1>; interrupt-parent = <&gpio1>;
interrupts = <16 1>; interrupts = <16 1>;
ams,tuning-capacitor-pf = <80>; ams,tuning-capacitor-pf = <80>;
ams,nflwdth = <0x44>;
}; };
...@@ -243,6 +243,8 @@ config DA9150_GPADC ...@@ -243,6 +243,8 @@ config DA9150_GPADC
config DLN2_ADC config DLN2_ADC
tristate "Diolan DLN-2 ADC driver support" tristate "Diolan DLN-2 ADC driver support"
depends on MFD_DLN2 depends on MFD_DLN2
select IIO_BUFFER
select IIO_TRIGGERED_BUFFER
help help
Say yes here to build support for Diolan DLN-2 ADC. Say yes here to build support for Diolan DLN-2 ADC.
......
...@@ -225,6 +225,7 @@ struct at91_adc_trigger { ...@@ -225,6 +225,7 @@ struct at91_adc_trigger {
char *name; char *name;
unsigned int trgmod_value; unsigned int trgmod_value;
unsigned int edge_type; unsigned int edge_type;
bool hw_trig;
}; };
struct at91_adc_state { struct at91_adc_state {
...@@ -254,16 +255,25 @@ static const struct at91_adc_trigger at91_adc_trigger_list[] = { ...@@ -254,16 +255,25 @@ static const struct at91_adc_trigger at91_adc_trigger_list[] = {
.name = "external_rising", .name = "external_rising",
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE, .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_RISE,
.edge_type = IRQ_TYPE_EDGE_RISING, .edge_type = IRQ_TYPE_EDGE_RISING,
.hw_trig = true,
}, },
{ {
.name = "external_falling", .name = "external_falling",
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL, .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_FALL,
.edge_type = IRQ_TYPE_EDGE_FALLING, .edge_type = IRQ_TYPE_EDGE_FALLING,
.hw_trig = true,
}, },
{ {
.name = "external_any", .name = "external_any",
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY, .trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_EXT_TRIG_ANY,
.edge_type = IRQ_TYPE_EDGE_BOTH, .edge_type = IRQ_TYPE_EDGE_BOTH,
.hw_trig = true,
},
{
.name = "software",
.trgmod_value = AT91_SAMA5D2_TRGR_TRGMOD_NO_TRIGGER,
.edge_type = IRQ_TYPE_NONE,
.hw_trig = false,
}, },
}; };
...@@ -597,7 +607,7 @@ static int at91_adc_probe(struct platform_device *pdev) ...@@ -597,7 +607,7 @@ static int at91_adc_probe(struct platform_device *pdev)
struct at91_adc_state *st; struct at91_adc_state *st;
struct resource *res; struct resource *res;
int ret, i; int ret, i;
u32 edge_type; u32 edge_type = IRQ_TYPE_NONE;
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*st));
if (!indio_dev) if (!indio_dev)
...@@ -641,14 +651,14 @@ static int at91_adc_probe(struct platform_device *pdev) ...@@ -641,14 +651,14 @@ static int at91_adc_probe(struct platform_device *pdev)
ret = of_property_read_u32(pdev->dev.of_node, ret = of_property_read_u32(pdev->dev.of_node,
"atmel,trigger-edge-type", &edge_type); "atmel,trigger-edge-type", &edge_type);
if (ret) { if (ret) {
dev_err(&pdev->dev, dev_dbg(&pdev->dev,
"invalid or missing value for atmel,trigger-edge-type\n"); "atmel,trigger-edge-type not specified, only software trigger available\n");
return ret;
} }
st->selected_trig = NULL; st->selected_trig = NULL;
for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT; i++) /* find the right trigger, or no trigger at all */
for (i = 0; i < AT91_SAMA5D2_HW_TRIG_CNT + 1; i++)
if (at91_adc_trigger_list[i].edge_type == edge_type) { if (at91_adc_trigger_list[i].edge_type == edge_type) {
st->selected_trig = &at91_adc_trigger_list[i]; st->selected_trig = &at91_adc_trigger_list[i];
break; break;
...@@ -717,24 +727,27 @@ static int at91_adc_probe(struct platform_device *pdev) ...@@ -717,24 +727,27 @@ static int at91_adc_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, indio_dev); platform_set_drvdata(pdev, indio_dev);
ret = at91_adc_buffer_init(indio_dev); if (st->selected_trig->hw_trig) {
if (ret < 0) { ret = at91_adc_buffer_init(indio_dev);
dev_err(&pdev->dev, "couldn't initialize the buffer.\n"); if (ret < 0) {
goto per_clk_disable_unprepare; dev_err(&pdev->dev, "couldn't initialize the buffer.\n");
} goto per_clk_disable_unprepare;
}
ret = at91_adc_trigger_init(indio_dev); ret = at91_adc_trigger_init(indio_dev);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "couldn't setup the triggers.\n"); dev_err(&pdev->dev, "couldn't setup the triggers.\n");
goto per_clk_disable_unprepare; goto per_clk_disable_unprepare;
}
} }
ret = iio_device_register(indio_dev); ret = iio_device_register(indio_dev);
if (ret < 0) if (ret < 0)
goto per_clk_disable_unprepare; goto per_clk_disable_unprepare;
dev_info(&pdev->dev, "setting up trigger as %s\n", if (st->selected_trig->hw_trig)
st->selected_trig->name); dev_info(&pdev->dev, "setting up trigger as %s\n",
st->selected_trig->name);
dev_info(&pdev->dev, "version: %x\n", dev_info(&pdev->dev, "version: %x\n",
readl_relaxed(st->base + AT91_SAMA5D2_VERSION)); readl_relaxed(st->base + AT91_SAMA5D2_VERSION));
......
...@@ -72,6 +72,7 @@ int iio_simple_dummy_write_event_config(struct iio_dev *indio_dev, ...@@ -72,6 +72,7 @@ int iio_simple_dummy_write_event_config(struct iio_dev *indio_dev,
st->event_en = state; st->event_en = state;
else else
return -EINVAL; return -EINVAL;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
......
...@@ -865,7 +865,6 @@ static irqreturn_t zpa2326_handle_threaded_irq(int irq, void *data) ...@@ -865,7 +865,6 @@ static irqreturn_t zpa2326_handle_threaded_irq(int irq, void *data)
static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev, static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev,
struct zpa2326_private *private) struct zpa2326_private *private)
{ {
int ret;
unsigned int val; unsigned int val;
long timeout; long timeout;
...@@ -887,14 +886,11 @@ static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev, ...@@ -887,14 +886,11 @@ static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev,
/* Timed out. */ /* Timed out. */
zpa2326_warn(indio_dev, "no one shot interrupt occurred (%ld)", zpa2326_warn(indio_dev, "no one shot interrupt occurred (%ld)",
timeout); timeout);
ret = -ETIME; return -ETIME;
} else if (timeout < 0) {
zpa2326_warn(indio_dev,
"wait for one shot interrupt cancelled");
ret = -ERESTARTSYS;
} }
return ret; zpa2326_warn(indio_dev, "wait for one shot interrupt cancelled");
return -ERESTARTSYS;
} }
static int zpa2326_init_managed_irq(struct device *parent, static int zpa2326_init_managed_irq(struct device *parent,
......
...@@ -39,8 +39,12 @@ ...@@ -39,8 +39,12 @@
#define AS3935_AFE_GAIN_MAX 0x1F #define AS3935_AFE_GAIN_MAX 0x1F
#define AS3935_AFE_PWR_BIT BIT(0) #define AS3935_AFE_PWR_BIT BIT(0)
#define AS3935_NFLWDTH 0x01
#define AS3935_NFLWDTH_MASK 0x7f
#define AS3935_INT 0x03 #define AS3935_INT 0x03
#define AS3935_INT_MASK 0x0f #define AS3935_INT_MASK 0x0f
#define AS3935_DISTURB_INT BIT(2)
#define AS3935_EVENT_INT BIT(3) #define AS3935_EVENT_INT BIT(3)
#define AS3935_NOISE_INT BIT(0) #define AS3935_NOISE_INT BIT(0)
...@@ -48,6 +52,7 @@ ...@@ -48,6 +52,7 @@
#define AS3935_DATA_MASK 0x3F #define AS3935_DATA_MASK 0x3F
#define AS3935_TUNE_CAP 0x08 #define AS3935_TUNE_CAP 0x08
#define AS3935_DEFAULTS 0x3C
#define AS3935_CALIBRATE 0x3D #define AS3935_CALIBRATE 0x3D
#define AS3935_READ_DATA BIT(14) #define AS3935_READ_DATA BIT(14)
...@@ -62,7 +67,9 @@ struct as3935_state { ...@@ -62,7 +67,9 @@ struct as3935_state {
struct mutex lock; struct mutex lock;
struct delayed_work work; struct delayed_work work;
unsigned long noise_tripped;
u32 tune_cap; u32 tune_cap;
u32 nflwdth_reg;
u8 buffer[16]; /* 8-bit data + 56-bit padding + 64-bit timestamp */ u8 buffer[16]; /* 8-bit data + 56-bit padding + 64-bit timestamp */
u8 buf[2] ____cacheline_aligned; u8 buf[2] ____cacheline_aligned;
}; };
...@@ -145,12 +152,29 @@ static ssize_t as3935_sensor_sensitivity_store(struct device *dev, ...@@ -145,12 +152,29 @@ static ssize_t as3935_sensor_sensitivity_store(struct device *dev,
return len; return len;
} }
static ssize_t as3935_noise_level_tripped_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct as3935_state *st = iio_priv(dev_to_iio_dev(dev));
int ret;
mutex_lock(&st->lock);
ret = sprintf(buf, "%d\n", !time_after(jiffies, st->noise_tripped + HZ));
mutex_unlock(&st->lock);
return ret;
}
static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR, static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR,
as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0); as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0);
static IIO_DEVICE_ATTR(noise_level_tripped, S_IRUGO,
as3935_noise_level_tripped_show, NULL, 0);
static struct attribute *as3935_attributes[] = { static struct attribute *as3935_attributes[] = {
&iio_dev_attr_sensor_sensitivity.dev_attr.attr, &iio_dev_attr_sensor_sensitivity.dev_attr.attr,
&iio_dev_attr_noise_level_tripped.dev_attr.attr,
NULL, NULL,
}; };
...@@ -246,7 +270,11 @@ static void as3935_event_work(struct work_struct *work) ...@@ -246,7 +270,11 @@ static void as3935_event_work(struct work_struct *work)
case AS3935_EVENT_INT: case AS3935_EVENT_INT:
iio_trigger_poll_chained(st->trig); iio_trigger_poll_chained(st->trig);
break; break;
case AS3935_DISTURB_INT:
case AS3935_NOISE_INT: case AS3935_NOISE_INT:
mutex_lock(&st->lock);
st->noise_tripped = jiffies;
mutex_unlock(&st->lock);
dev_warn(&st->spi->dev, "noise level is too high\n"); dev_warn(&st->spi->dev, "noise level is too high\n");
break; break;
} }
...@@ -269,15 +297,14 @@ static irqreturn_t as3935_interrupt_handler(int irq, void *private) ...@@ -269,15 +297,14 @@ static irqreturn_t as3935_interrupt_handler(int irq, void *private)
static void calibrate_as3935(struct as3935_state *st) static void calibrate_as3935(struct as3935_state *st)
{ {
/* mask disturber interrupt bit */ as3935_write(st, AS3935_DEFAULTS, 0x96);
as3935_write(st, AS3935_INT, BIT(5));
as3935_write(st, AS3935_CALIBRATE, 0x96); as3935_write(st, AS3935_CALIBRATE, 0x96);
as3935_write(st, AS3935_TUNE_CAP, as3935_write(st, AS3935_TUNE_CAP,
BIT(5) | (st->tune_cap / TUNE_CAP_DIV)); BIT(5) | (st->tune_cap / TUNE_CAP_DIV));
mdelay(2); mdelay(2);
as3935_write(st, AS3935_TUNE_CAP, (st->tune_cap / TUNE_CAP_DIV)); as3935_write(st, AS3935_TUNE_CAP, (st->tune_cap / TUNE_CAP_DIV));
as3935_write(st, AS3935_NFLWDTH, st->nflwdth_reg);
} }
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
...@@ -370,6 +397,15 @@ static int as3935_probe(struct spi_device *spi) ...@@ -370,6 +397,15 @@ static int as3935_probe(struct spi_device *spi)
return -EINVAL; return -EINVAL;
} }
ret = of_property_read_u32(np,
"ams,nflwdth", &st->nflwdth_reg);
if (!ret && st->nflwdth_reg > AS3935_NFLWDTH_MASK) {
dev_err(&spi->dev,
"invalid nflwdth setting of %d\n",
st->nflwdth_reg);
return -EINVAL;
}
indio_dev->dev.parent = &spi->dev; indio_dev->dev.parent = &spi->dev;
indio_dev->name = spi_get_device_id(spi)->name; indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->channels = as3935_channels; indio_dev->channels = as3935_channels;
...@@ -384,6 +420,7 @@ static int as3935_probe(struct spi_device *spi) ...@@ -384,6 +420,7 @@ static int as3935_probe(struct spi_device *spi)
return -ENOMEM; return -ENOMEM;
st->trig = trig; st->trig = trig;
st->noise_tripped = jiffies - HZ;
trig->dev.parent = indio_dev->dev.parent; trig->dev.parent = indio_dev->dev.parent;
iio_trigger_set_drvdata(trig, indio_dev); iio_trigger_set_drvdata(trig, indio_dev);
trig->ops = &iio_interrupt_trigger_ops; trig->ops = &iio_interrupt_trigger_ops;
......
...@@ -172,7 +172,7 @@ static int ade7759_spi_read_reg_40(struct device *dev, ...@@ -172,7 +172,7 @@ static int ade7759_spi_read_reg_40(struct device *dev,
reg_address); reg_address);
goto error_ret; goto error_ret;
} }
*val = ((u64)st->rx[1] << 32) | (st->rx[2] << 24) | *val = ((u64)st->rx[1] << 32) | ((u64)st->rx[2] << 24) |
(st->rx[3] << 16) | (st->rx[4] << 8) | st->rx[5]; (st->rx[3] << 16) | (st->rx[4] << 8) | st->rx[5];
error_ret: error_ret:
......
...@@ -390,8 +390,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream ...@@ -390,8 +390,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
__func__, instance); __func__, instance);
instance->alsa_stream = alsa_stream; instance->alsa_stream = alsa_stream;
alsa_stream->instance = instance; alsa_stream->instance = instance;
ret = 0; // xxx todo -1; return 0;
goto err_free_mem;
} }
/* Initialize and create a VCHI connection */ /* Initialize and create a VCHI connection */
...@@ -401,16 +400,15 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream ...@@ -401,16 +400,15 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)\n", LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)\n",
__func__, ret); __func__, ret);
ret = -EIO; return -EIO;
goto err_free_mem;
} }
ret = vchi_connect(NULL, 0, vchi_instance); ret = vchi_connect(NULL, 0, vchi_instance);
if (ret) { if (ret) {
LOG_ERR("%s: failed to connect VCHI instance (ret=%d)\n", LOG_ERR("%s: failed to connect VCHI instance (ret=%d)\n",
__func__, ret); __func__, ret);
ret = -EIO; kfree(vchi_instance);
goto err_free_mem; return -EIO;
} }
initted = 1; initted = 1;
} }
...@@ -421,19 +419,16 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream ...@@ -421,19 +419,16 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
if (IS_ERR(instance)) { if (IS_ERR(instance)) {
LOG_ERR("%s: failed to initialize audio service\n", __func__); LOG_ERR("%s: failed to initialize audio service\n", __func__);
ret = PTR_ERR(instance); /* vchi_instance is retained for use the next time. */
goto err_free_mem; return PTR_ERR(instance);
} }
instance->alsa_stream = alsa_stream; instance->alsa_stream = alsa_stream;
alsa_stream->instance = instance; alsa_stream->instance = instance;
LOG_DBG(" success !\n"); LOG_DBG(" success !\n");
ret = 0;
err_free_mem:
kfree(vchi_instance);
return ret; return 0;
} }
int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream) int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment