Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 886e03be authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull staging tree fixes from Greg Kroah-Hartman:
 "Here are some drivers/staging and drivers/iio fixes for 3.9 (the two
  are still pretty intertwined, hence them coming both from my tree
  still.) Nothing major, just a few things that have been reported by
  users, all of these have been in linux-next for a while."

* tag 'staging-3.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  staging: comedi: dt9812: use CR_CHAN() for channel number
  staging/vt6656: Fix too large integer constant warning on 32-bit
  staging: comedi: drivers: usbduxsigma.c: fix DMA buffers on stack
  staging: imx/drm: request irq only after adding the crtc
  staging: comedi: drivers: usbduxfast.c: fix for DMA buffers on stack
  staging: comedi: drivers: usbdux.c: fix DMA buffers on stack
  staging: vt6656: Fix oops on resume from suspend.
  iio:common:st_sensors fixed all warning messages about uninitialized variables
  iio: Fix build error seen if IIO_TRIGGER is defined but IIO_BUFFER is not
  iio/imu: inv_mpu6050 depends on IIO_BUFFER
  iio:ad5064: Initialize register cache correctly
  iio:ad5064: Fix off by one in DAC value range check
  iio:ad5064: Fix address of the second channel for ad5065/ad5045/ad5025
parents e66eded8 564c526a
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ st_sensors_match_odr_error:
int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr)
{
	int err;
	struct st_sensor_odr_avl odr_out;
	struct st_sensor_odr_avl odr_out = {0, 0};
	struct st_sensor_data *sdata = iio_priv(indio_dev);

	err = st_sensors_match_odr(sdata->sensor, odr, &odr_out);
@@ -114,7 +114,7 @@ st_sensors_match_odr_error:

static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs)
{
	int err, i;
	int err, i = 0;
	struct st_sensor_data *sdata = iio_priv(indio_dev);

	err = st_sensors_match_fs(sdata->sensor, fs, &i);
@@ -139,14 +139,13 @@ st_accel_set_fullscale_error:

int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable)
{
	bool found;
	u8 tmp_value;
	int err = -EINVAL;
	struct st_sensor_odr_avl odr_out;
	bool found = false;
	struct st_sensor_odr_avl odr_out = {0, 0};
	struct st_sensor_data *sdata = iio_priv(indio_dev);

	if (enable) {
		found = false;
		tmp_value = sdata->sensor->pw.value_on;
		if ((sdata->sensor->odr.addr == sdata->sensor->pw.addr) &&
			(sdata->sensor->odr.mask == sdata->sensor->pw.mask)) {
+38 −26
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@
#define AD5064_ADDR(x)				((x) << 20)
#define AD5064_CMD(x)				((x) << 24)

#define AD5064_ADDR_DAC(chan)			(chan)
#define AD5064_ADDR_ALL_DAC			0xF

#define AD5064_CMD_WRITE_INPUT_N		0x0
@@ -131,15 +130,15 @@ static int ad5064_write(struct ad5064_state *st, unsigned int cmd,
}

static int ad5064_sync_powerdown_mode(struct ad5064_state *st,
	unsigned int channel)
	const struct iio_chan_spec *chan)
{
	unsigned int val;
	int ret;

	val = (0x1 << channel);
	val = (0x1 << chan->address);

	if (st->pwr_down[channel])
		val |= st->pwr_down_mode[channel] << 8;
	if (st->pwr_down[chan->channel])
		val |= st->pwr_down_mode[chan->channel] << 8;

	ret = ad5064_write(st, AD5064_CMD_POWERDOWN_DAC, 0, val, 0);

@@ -169,7 +168,7 @@ static int ad5064_set_powerdown_mode(struct iio_dev *indio_dev,
	mutex_lock(&indio_dev->mlock);
	st->pwr_down_mode[chan->channel] = mode + 1;

	ret = ad5064_sync_powerdown_mode(st, chan->channel);
	ret = ad5064_sync_powerdown_mode(st, chan);
	mutex_unlock(&indio_dev->mlock);

	return ret;
@@ -205,7 +204,7 @@ static ssize_t ad5064_write_dac_powerdown(struct iio_dev *indio_dev,
	mutex_lock(&indio_dev->mlock);
	st->pwr_down[chan->channel] = pwr_down;

	ret = ad5064_sync_powerdown_mode(st, chan->channel);
	ret = ad5064_sync_powerdown_mode(st, chan);
	mutex_unlock(&indio_dev->mlock);
	return ret ? ret : len;
}
@@ -258,7 +257,7 @@ static int ad5064_write_raw(struct iio_dev *indio_dev,

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		if (val > (1 << chan->scan_type.realbits) || val < 0)
		if (val >= (1 << chan->scan_type.realbits) || val < 0)
			return -EINVAL;

		mutex_lock(&indio_dev->mlock);
@@ -292,34 +291,44 @@ static const struct iio_chan_spec_ext_info ad5064_ext_info[] = {
	{ },
};

#define AD5064_CHANNEL(chan, bits) {				\
#define AD5064_CHANNEL(chan, addr, bits) {			\
	.type = IIO_VOLTAGE,					\
	.indexed = 1,						\
	.output = 1,						\
	.channel = (chan),					\
	.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |		\
	IIO_CHAN_INFO_SCALE_SEPARATE_BIT,			\
	.address = AD5064_ADDR_DAC(chan),			\
	.address = addr,					\
	.scan_type = IIO_ST('u', (bits), 16, 20 - (bits)),	\
	.ext_info = ad5064_ext_info,				\
}

#define DECLARE_AD5064_CHANNELS(name, bits) \
const struct iio_chan_spec name[] = { \
	AD5064_CHANNEL(0, bits), \
	AD5064_CHANNEL(1, bits), \
	AD5064_CHANNEL(2, bits), \
	AD5064_CHANNEL(3, bits), \
	AD5064_CHANNEL(4, bits), \
	AD5064_CHANNEL(5, bits), \
	AD5064_CHANNEL(6, bits), \
	AD5064_CHANNEL(7, bits), \
	AD5064_CHANNEL(0, 0, bits), \
	AD5064_CHANNEL(1, 1, bits), \
	AD5064_CHANNEL(2, 2, bits), \
	AD5064_CHANNEL(3, 3, bits), \
	AD5064_CHANNEL(4, 4, bits), \
	AD5064_CHANNEL(5, 5, bits), \
	AD5064_CHANNEL(6, 6, bits), \
	AD5064_CHANNEL(7, 7, bits), \
}

#define DECLARE_AD5065_CHANNELS(name, bits) \
const struct iio_chan_spec name[] = { \
	AD5064_CHANNEL(0, 0, bits), \
	AD5064_CHANNEL(1, 3, bits), \
}

static DECLARE_AD5064_CHANNELS(ad5024_channels, 12);
static DECLARE_AD5064_CHANNELS(ad5044_channels, 14);
static DECLARE_AD5064_CHANNELS(ad5064_channels, 16);

static DECLARE_AD5065_CHANNELS(ad5025_channels, 12);
static DECLARE_AD5065_CHANNELS(ad5045_channels, 14);
static DECLARE_AD5065_CHANNELS(ad5065_channels, 16);

static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
	[ID_AD5024] = {
		.shared_vref = false,
@@ -328,7 +337,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
	},
	[ID_AD5025] = {
		.shared_vref = false,
		.channels = ad5024_channels,
		.channels = ad5025_channels,
		.num_channels = 2,
	},
	[ID_AD5044] = {
@@ -338,7 +347,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
	},
	[ID_AD5045] = {
		.shared_vref = false,
		.channels = ad5044_channels,
		.channels = ad5045_channels,
		.num_channels = 2,
	},
	[ID_AD5064] = {
@@ -353,7 +362,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
	},
	[ID_AD5065] = {
		.shared_vref = false,
		.channels = ad5064_channels,
		.channels = ad5065_channels,
		.num_channels = 2,
	},
	[ID_AD5628_1] = {
@@ -429,6 +438,7 @@ static int ad5064_probe(struct device *dev, enum ad5064_type type,
{
	struct iio_dev *indio_dev;
	struct ad5064_state *st;
	unsigned int midscale;
	unsigned int i;
	int ret;

@@ -465,11 +475,6 @@ static int ad5064_probe(struct device *dev, enum ad5064_type type,
			goto error_free_reg;
	}

	for (i = 0; i < st->chip_info->num_channels; ++i) {
		st->pwr_down_mode[i] = AD5064_LDAC_PWRDN_1K;
		st->dac_cache[i] = 0x8000;
	}

	indio_dev->dev.parent = dev;
	indio_dev->name = name;
	indio_dev->info = &ad5064_info;
@@ -477,6 +482,13 @@ static int ad5064_probe(struct device *dev, enum ad5064_type type,
	indio_dev->channels = st->chip_info->channels;
	indio_dev->num_channels = st->chip_info->num_channels;

	midscale = (1 << indio_dev->channels[0].scan_type.realbits) /  2;

	for (i = 0; i < st->chip_info->num_channels; ++i) {
		st->pwr_down_mode[i] = AD5064_LDAC_PWRDN_1K;
		st->dac_cache[i] = midscale;
	}

	ret = iio_device_register(indio_dev);
	if (ret)
		goto error_disable_reg;
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
config INV_MPU6050_IIO
	tristate "Invensense MPU6050 devices"
	depends on I2C && SYSFS
	select IIO_BUFFER
	select IIO_TRIGGERED_BUFFER
	help
	  This driver supports the Invensense MPU6050 devices.
+10 −6
Original line number Diff line number Diff line
@@ -947,12 +947,13 @@ static int dt9812_di_rinsn(struct comedi_device *dev,
			   unsigned int *data)
{
	struct comedi_dt9812 *devpriv = dev->private;
	unsigned int channel = CR_CHAN(insn->chanspec);
	int n;
	u8 bits = 0;

	dt9812_digital_in(devpriv->slot, &bits);
	for (n = 0; n < insn->n; n++)
		data[n] = ((1 << insn->chanspec) & bits) != 0;
		data[n] = ((1 << channel) & bits) != 0;
	return n;
}

@@ -961,12 +962,13 @@ static int dt9812_do_winsn(struct comedi_device *dev,
			   unsigned int *data)
{
	struct comedi_dt9812 *devpriv = dev->private;
	unsigned int channel = CR_CHAN(insn->chanspec);
	int n;
	u8 bits = 0;

	dt9812_digital_out_shadow(devpriv->slot, &bits);
	for (n = 0; n < insn->n; n++) {
		u8 mask = 1 << insn->chanspec;
		u8 mask = 1 << channel;

		bits &= ~mask;
		if (data[n])
@@ -981,13 +983,13 @@ static int dt9812_ai_rinsn(struct comedi_device *dev,
			   unsigned int *data)
{
	struct comedi_dt9812 *devpriv = dev->private;
	unsigned int channel = CR_CHAN(insn->chanspec);
	int n;

	for (n = 0; n < insn->n; n++) {
		u16 value = 0;

		dt9812_analog_in(devpriv->slot, insn->chanspec, &value,
				 DT9812_GAIN_1);
		dt9812_analog_in(devpriv->slot, channel, &value, DT9812_GAIN_1);
		data[n] = value;
	}
	return n;
@@ -998,12 +1000,13 @@ static int dt9812_ao_rinsn(struct comedi_device *dev,
			   unsigned int *data)
{
	struct comedi_dt9812 *devpriv = dev->private;
	unsigned int channel = CR_CHAN(insn->chanspec);
	int n;
	u16 value;

	for (n = 0; n < insn->n; n++) {
		value = 0;
		dt9812_analog_out_shadow(devpriv->slot, insn->chanspec, &value);
		dt9812_analog_out_shadow(devpriv->slot, channel, &value);
		data[n] = value;
	}
	return n;
@@ -1014,10 +1017,11 @@ static int dt9812_ao_winsn(struct comedi_device *dev,
			   unsigned int *data)
{
	struct comedi_dt9812 *devpriv = dev->private;
	unsigned int channel = CR_CHAN(insn->chanspec);
	int n;

	for (n = 0; n < insn->n; n++)
		dt9812_analog_out(devpriv->slot, insn->chanspec, data[n]);
		dt9812_analog_out(devpriv->slot, channel, data[n]);
	return n;
}

+19 −12
Original line number Diff line number Diff line
@@ -730,10 +730,14 @@ static void usbduxsub_ao_IsocIrq(struct urb *urb)
static int usbduxsub_start(struct usbduxsub *usbduxsub)
{
	int errcode = 0;
	uint8_t local_transfer_buffer[16];
	uint8_t *local_transfer_buffer;

	local_transfer_buffer = kmalloc(1, GFP_KERNEL);
	if (!local_transfer_buffer)
		return -ENOMEM;

	/* 7f92 to zero */
	local_transfer_buffer[0] = 0;
	*local_transfer_buffer = 0;
	errcode = usb_control_msg(usbduxsub->usbdev,
				  /* create a pipe for a control transfer */
				  usb_sndctrlpipe(usbduxsub->usbdev, 0),
@@ -751,22 +755,25 @@ static int usbduxsub_start(struct usbduxsub *usbduxsub)
				  1,
				  /* Timeout */
				  BULK_TIMEOUT);
	if (errcode < 0) {
	if (errcode < 0)
		dev_err(&usbduxsub->interface->dev,
			"comedi_: control msg failed (start)\n");

	kfree(local_transfer_buffer);
	return errcode;
}
	return 0;
}

static int usbduxsub_stop(struct usbduxsub *usbduxsub)
{
	int errcode = 0;
	uint8_t *local_transfer_buffer;

	uint8_t local_transfer_buffer[16];
	local_transfer_buffer = kmalloc(1, GFP_KERNEL);
	if (!local_transfer_buffer)
		return -ENOMEM;

	/* 7f92 to one */
	local_transfer_buffer[0] = 1;
	*local_transfer_buffer = 1;
	errcode = usb_control_msg(usbduxsub->usbdev,
				  usb_sndctrlpipe(usbduxsub->usbdev, 0),
				  /* bRequest, "Firmware" */
@@ -781,13 +788,13 @@ static int usbduxsub_stop(struct usbduxsub *usbduxsub)
				  1,
				  /* Timeout */
				  BULK_TIMEOUT);
	if (errcode < 0) {
	if (errcode < 0)
		dev_err(&usbduxsub->interface->dev,
			"comedi_: control msg failed (stop)\n");

	kfree(local_transfer_buffer);
	return errcode;
}
	return 0;
}

static int usbduxsub_upload(struct usbduxsub *usbduxsub,
			    uint8_t *local_transfer_buffer,
Loading