mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
Char/Misc/IIO fixes for 6.16-rc7
Here are some char/misc/iio and other driver fixes for 6.16-rc7. Included in here are: - IIO driver fixes for reported problems - Interconnect driver fixes for reported problems - nvmem driver fixes - bunch of comedi driver fixes for long-term bugs - Kconfig dependancy fixes for mux drivers - other small driver fixes for reported problems. All of these have been in linux-next for a while with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCaHzF6Q8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ym+fACfeLnxF0znIjZqK3G56KF11jN89ugAnjUN8Hs2 yK6Meq35ID98D6nuazES =NQ9W -----END PGP SIGNATURE----- Merge tag 'char-misc-6.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char / misc / IIO fixes from Greg KH: "Here are some char/misc/iio and other driver fixes for 6.16-rc7. Included in here are: - IIO driver fixes for reported problems - Interconnect driver fixes for reported problems - nvmem driver fixes - bunch of comedi driver fixes for long-term bugs - Kconfig dependancy fixes for mux drivers - other small driver fixes for reported problems. All of these have been in linux-next for a while with no reported problems" * tag 'char-misc-6.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (35 commits) nvmem: layouts: u-boot-env: remove crc32 endianness conversion misc: amd-sbi: Explicitly clear in/out arg "mb_in_out" misc: amd-sbi: Address copy_to/from_user() warning reported in smatch misc: amd-sbi: Address potential integer overflow issue reported in smatch comedi: comedi_test: Fix possible deletion of uninitialized timers comedi: Fix initialization of data for instructions that write to subdevice comedi: Fix use of uninitialized data in insn_rw_emulate_bits() comedi: das6402: Fix bit shift out of bounds comedi: aio_iiro_16: Fix bit shift out of bounds comedi: pcl812: Fix bit shift out of bounds comedi: das16m1: Fix bit shift out of bounds comedi: Fix some signed shift left operations comedi: Fail COMEDI_INSNLIST ioctl if n_insns is too large nvmem: imx-ocotp: fix MAC address byte length MAINTAINERS: add miscdevice Rust abstractions mux: mmio: Fix missing CONFIG_REGMAP_MMIO iio: dac: ad3530r: Fix incorrect masking for channels 4-7 in powerdown mode iio: adc: ad7380: fix adi,gain-milli property parsing iio: adc: ad7949: use spi_is_bpw_supported() iio: accel: fxls8962af: Fix use after free in fxls8962af_fifo_flush ...
This commit is contained in:
commit
ecf11d31bf
@ -223,12 +223,6 @@ allOf:
|
|||||||
- required:
|
- required:
|
||||||
- pwms
|
- pwms
|
||||||
|
|
||||||
- oneOf:
|
|
||||||
- required:
|
|
||||||
- interrupts
|
|
||||||
- required:
|
|
||||||
- io-backends
|
|
||||||
|
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
@ -21,7 +21,7 @@ properties:
|
|||||||
vlogic-supply: true
|
vlogic-supply: true
|
||||||
|
|
||||||
interrupts:
|
interrupts:
|
||||||
minItems: 1
|
maxItems: 1
|
||||||
description:
|
description:
|
||||||
Interrupt mapping for the trigger interrupt from the internal oscillator.
|
Interrupt mapping for the trigger interrupt from the internal oscillator.
|
||||||
|
|
||||||
|
@ -5570,6 +5570,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
|||||||
F: drivers/char/
|
F: drivers/char/
|
||||||
F: drivers/misc/
|
F: drivers/misc/
|
||||||
F: include/linux/miscdevice.h
|
F: include/linux/miscdevice.h
|
||||||
|
F: rust/kernel/miscdevice.rs
|
||||||
F: samples/rust/rust_misc_device.rs
|
F: samples/rust/rust_misc_device.rs
|
||||||
X: drivers/char/agp/
|
X: drivers/char/agp/
|
||||||
X: drivers/char/hw_random/
|
X: drivers/char/hw_random/
|
||||||
|
@ -1556,21 +1556,27 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n_insns; ++i) {
|
for (i = 0; i < n_insns; ++i) {
|
||||||
|
unsigned int n = insns[i].n;
|
||||||
|
|
||||||
if (insns[i].insn & INSN_MASK_WRITE) {
|
if (insns[i].insn & INSN_MASK_WRITE) {
|
||||||
if (copy_from_user(data, insns[i].data,
|
if (copy_from_user(data, insns[i].data,
|
||||||
insns[i].n * sizeof(unsigned int))) {
|
n * sizeof(unsigned int))) {
|
||||||
dev_dbg(dev->class_dev,
|
dev_dbg(dev->class_dev,
|
||||||
"copy_from_user failed\n");
|
"copy_from_user failed\n");
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (n < MIN_SAMPLES) {
|
||||||
|
memset(&data[n], 0, (MIN_SAMPLES - n) *
|
||||||
|
sizeof(unsigned int));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = parse_insn(dev, insns + i, data, file);
|
ret = parse_insn(dev, insns + i, data, file);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (insns[i].insn & INSN_MASK_READ) {
|
if (insns[i].insn & INSN_MASK_READ) {
|
||||||
if (copy_to_user(insns[i].data, data,
|
if (copy_to_user(insns[i].data, data,
|
||||||
insns[i].n * sizeof(unsigned int))) {
|
n * sizeof(unsigned int))) {
|
||||||
dev_dbg(dev->class_dev,
|
dev_dbg(dev->class_dev,
|
||||||
"copy_to_user failed\n");
|
"copy_to_user failed\n");
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
@ -1589,6 +1595,16 @@ error:
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_INSNS MAX_SAMPLES
|
||||||
|
static int check_insnlist_len(struct comedi_device *dev, unsigned int n_insns)
|
||||||
|
{
|
||||||
|
if (n_insns > MAX_INSNS) {
|
||||||
|
dev_dbg(dev->class_dev, "insnlist length too large\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* COMEDI_INSN ioctl
|
* COMEDI_INSN ioctl
|
||||||
* synchronous instruction
|
* synchronous instruction
|
||||||
@ -1633,6 +1649,10 @@ static int do_insn_ioctl(struct comedi_device *dev,
|
|||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (insn->n < MIN_SAMPLES) {
|
||||||
|
memset(&data[insn->n], 0,
|
||||||
|
(MIN_SAMPLES - insn->n) * sizeof(unsigned int));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = parse_insn(dev, insn, data, file);
|
ret = parse_insn(dev, insn, data, file);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -2239,6 +2259,9 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
|
|||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
rc = check_insnlist_len(dev, insnlist.n_insns);
|
||||||
|
if (rc)
|
||||||
|
break;
|
||||||
insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL);
|
insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL);
|
||||||
if (!insns) {
|
if (!insns) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
@ -3142,6 +3165,9 @@ static int compat_insnlist(struct file *file, unsigned long arg)
|
|||||||
if (copy_from_user(&insnlist32, compat_ptr(arg), sizeof(insnlist32)))
|
if (copy_from_user(&insnlist32, compat_ptr(arg), sizeof(insnlist32)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
rc = check_insnlist_len(dev, insnlist32.n_insns);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
insns = kcalloc(insnlist32.n_insns, sizeof(*insns), GFP_KERNEL);
|
insns = kcalloc(insnlist32.n_insns, sizeof(*insns), GFP_KERNEL);
|
||||||
if (!insns)
|
if (!insns)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -339,10 +339,10 @@ int comedi_dio_insn_config(struct comedi_device *dev,
|
|||||||
unsigned int *data,
|
unsigned int *data,
|
||||||
unsigned int mask)
|
unsigned int mask)
|
||||||
{
|
{
|
||||||
unsigned int chan_mask = 1 << CR_CHAN(insn->chanspec);
|
unsigned int chan = CR_CHAN(insn->chanspec);
|
||||||
|
|
||||||
if (!mask)
|
if (!mask && chan < 32)
|
||||||
mask = chan_mask;
|
mask = 1U << chan;
|
||||||
|
|
||||||
switch (data[0]) {
|
switch (data[0]) {
|
||||||
case INSN_CONFIG_DIO_INPUT:
|
case INSN_CONFIG_DIO_INPUT:
|
||||||
@ -382,7 +382,7 @@ EXPORT_SYMBOL_GPL(comedi_dio_insn_config);
|
|||||||
unsigned int comedi_dio_update_state(struct comedi_subdevice *s,
|
unsigned int comedi_dio_update_state(struct comedi_subdevice *s,
|
||||||
unsigned int *data)
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
unsigned int chanmask = (s->n_chan < 32) ? ((1 << s->n_chan) - 1)
|
unsigned int chanmask = (s->n_chan < 32) ? ((1U << s->n_chan) - 1)
|
||||||
: 0xffffffff;
|
: 0xffffffff;
|
||||||
unsigned int mask = data[0] & chanmask;
|
unsigned int mask = data[0] & chanmask;
|
||||||
unsigned int bits = data[1];
|
unsigned int bits = data[1];
|
||||||
@ -615,6 +615,9 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
|
|||||||
unsigned int _data[2];
|
unsigned int _data[2];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (insn->n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
memset(_data, 0, sizeof(_data));
|
memset(_data, 0, sizeof(_data));
|
||||||
memset(&_insn, 0, sizeof(_insn));
|
memset(&_insn, 0, sizeof(_insn));
|
||||||
_insn.insn = INSN_BITS;
|
_insn.insn = INSN_BITS;
|
||||||
@ -625,8 +628,8 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
|
|||||||
if (insn->insn == INSN_WRITE) {
|
if (insn->insn == INSN_WRITE) {
|
||||||
if (!(s->subdev_flags & SDF_WRITABLE))
|
if (!(s->subdev_flags & SDF_WRITABLE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
_data[0] = 1 << (chan - base_chan); /* mask */
|
_data[0] = 1U << (chan - base_chan); /* mask */
|
||||||
_data[1] = data[0] ? (1 << (chan - base_chan)) : 0; /* bits */
|
_data[1] = data[0] ? (1U << (chan - base_chan)) : 0; /* bits */
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = s->insn_bits(dev, s, &_insn, _data);
|
ret = s->insn_bits(dev, s, &_insn, _data);
|
||||||
@ -709,7 +712,7 @@ static int __comedi_device_postconfig(struct comedi_device *dev)
|
|||||||
|
|
||||||
if (s->type == COMEDI_SUBD_DO) {
|
if (s->type == COMEDI_SUBD_DO) {
|
||||||
if (s->n_chan < 32)
|
if (s->n_chan < 32)
|
||||||
s->io_bits = (1 << s->n_chan) - 1;
|
s->io_bits = (1U << s->n_chan) - 1;
|
||||||
else
|
else
|
||||||
s->io_bits = 0xffffffff;
|
s->io_bits = 0xffffffff;
|
||||||
}
|
}
|
||||||
|
@ -177,7 +177,8 @@ static int aio_iiro_16_attach(struct comedi_device *dev,
|
|||||||
* Digital input change of state interrupts are optionally supported
|
* Digital input change of state interrupts are optionally supported
|
||||||
* using IRQ 2-7, 10-12, 14, or 15.
|
* using IRQ 2-7, 10-12, 14, or 15.
|
||||||
*/
|
*/
|
||||||
if ((1 << it->options[1]) & 0xdcfc) {
|
if (it->options[1] > 0 && it->options[1] < 16 &&
|
||||||
|
(1 << it->options[1]) & 0xdcfc) {
|
||||||
ret = request_irq(it->options[1], aio_iiro_16_cos, 0,
|
ret = request_irq(it->options[1], aio_iiro_16_cos, 0,
|
||||||
dev->board_name, dev);
|
dev->board_name, dev);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -792,7 +792,7 @@ static void waveform_detach(struct comedi_device *dev)
|
|||||||
{
|
{
|
||||||
struct waveform_private *devpriv = dev->private;
|
struct waveform_private *devpriv = dev->private;
|
||||||
|
|
||||||
if (devpriv) {
|
if (devpriv && dev->n_subdevices) {
|
||||||
timer_delete_sync(&devpriv->ai_timer);
|
timer_delete_sync(&devpriv->ai_timer);
|
||||||
timer_delete_sync(&devpriv->ao_timer);
|
timer_delete_sync(&devpriv->ao_timer);
|
||||||
}
|
}
|
||||||
|
@ -522,7 +522,8 @@ static int das16m1_attach(struct comedi_device *dev,
|
|||||||
devpriv->extra_iobase = dev->iobase + DAS16M1_8255_IOBASE;
|
devpriv->extra_iobase = dev->iobase + DAS16M1_8255_IOBASE;
|
||||||
|
|
||||||
/* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */
|
/* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */
|
||||||
if ((1 << it->options[1]) & 0xdcfc) {
|
if (it->options[1] >= 2 && it->options[1] <= 15 &&
|
||||||
|
(1 << it->options[1]) & 0xdcfc) {
|
||||||
ret = request_irq(it->options[1], das16m1_interrupt, 0,
|
ret = request_irq(it->options[1], das16m1_interrupt, 0,
|
||||||
dev->board_name, dev);
|
dev->board_name, dev);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -567,7 +567,8 @@ static int das6402_attach(struct comedi_device *dev,
|
|||||||
das6402_reset(dev);
|
das6402_reset(dev);
|
||||||
|
|
||||||
/* IRQs 2,3,5,6,7, 10,11,15 are valid for "enhanced" mode */
|
/* IRQs 2,3,5,6,7, 10,11,15 are valid for "enhanced" mode */
|
||||||
if ((1 << it->options[1]) & 0x8cec) {
|
if (it->options[1] > 0 && it->options[1] < 16 &&
|
||||||
|
(1 << it->options[1]) & 0x8cec) {
|
||||||
ret = request_irq(it->options[1], das6402_interrupt, 0,
|
ret = request_irq(it->options[1], das6402_interrupt, 0,
|
||||||
dev->board_name, dev);
|
dev->board_name, dev);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
@ -1149,7 +1149,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||||||
if (IS_ERR(dev->pacer))
|
if (IS_ERR(dev->pacer))
|
||||||
return PTR_ERR(dev->pacer);
|
return PTR_ERR(dev->pacer);
|
||||||
|
|
||||||
if ((1 << it->options[1]) & board->irq_bits) {
|
if (it->options[1] > 0 && it->options[1] < 16 &&
|
||||||
|
(1 << it->options[1]) & board->irq_bits) {
|
||||||
ret = request_irq(it->options[1], pcl812_interrupt, 0,
|
ret = request_irq(it->options[1], pcl812_interrupt, 0,
|
||||||
dev->board_name, dev);
|
dev->board_name, dev);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -877,6 +877,8 @@ static int fxls8962af_buffer_predisable(struct iio_dev *indio_dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
synchronize_irq(data->irq);
|
||||||
|
|
||||||
ret = __fxls8962af_fifo_set_mode(data, false);
|
ret = __fxls8962af_fifo_set_mode(data, false);
|
||||||
|
|
||||||
if (data->enable_event)
|
if (data->enable_event)
|
||||||
|
@ -1353,6 +1353,7 @@ static int apply_acpi_orientation(struct iio_dev *indio_dev)
|
|||||||
union acpi_object *ont;
|
union acpi_object *ont;
|
||||||
union acpi_object *elements;
|
union acpi_object *elements;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
struct device *parent = indio_dev->dev.parent;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int i, j;
|
int i, j;
|
||||||
@ -1371,7 +1372,7 @@ static int apply_acpi_orientation(struct iio_dev *indio_dev)
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
adev = ACPI_COMPANION(indio_dev->dev.parent);
|
adev = ACPI_COMPANION(parent);
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
@ -1380,8 +1381,7 @@ static int apply_acpi_orientation(struct iio_dev *indio_dev)
|
|||||||
if (status == AE_NOT_FOUND) {
|
if (status == AE_NOT_FOUND) {
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
} else if (ACPI_FAILURE(status)) {
|
} else if (ACPI_FAILURE(status)) {
|
||||||
dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
|
dev_warn(parent, "failed to execute _ONT: %d\n", status);
|
||||||
status);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1457,12 +1457,12 @@ static int apply_acpi_orientation(struct iio_dev *indio_dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
dev_info(&indio_dev->dev, "computed mount matrix from ACPI\n");
|
dev_info(parent, "computed mount matrix from ACPI\n");
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kfree(buffer.pointer);
|
kfree(buffer.pointer);
|
||||||
if (ret)
|
if (ret)
|
||||||
dev_dbg(&indio_dev->dev,
|
dev_dbg(parent,
|
||||||
"failed to apply ACPI orientation data: %d\n", ret);
|
"failed to apply ACPI orientation data: %d\n", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1953,8 +1953,9 @@ static int ad7380_probe(struct spi_device *spi)
|
|||||||
|
|
||||||
if (st->chip_info->has_hardware_gain) {
|
if (st->chip_info->has_hardware_gain) {
|
||||||
device_for_each_child_node_scoped(dev, node) {
|
device_for_each_child_node_scoped(dev, node) {
|
||||||
unsigned int channel, gain;
|
unsigned int channel;
|
||||||
int gain_idx;
|
int gain_idx;
|
||||||
|
u16 gain;
|
||||||
|
|
||||||
ret = fwnode_property_read_u32(node, "reg", &channel);
|
ret = fwnode_property_read_u32(node, "reg", &channel);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -1966,7 +1967,7 @@ static int ad7380_probe(struct spi_device *spi)
|
|||||||
"Invalid channel number %i\n",
|
"Invalid channel number %i\n",
|
||||||
channel);
|
channel);
|
||||||
|
|
||||||
ret = fwnode_property_read_u32(node, "adi,gain-milli",
|
ret = fwnode_property_read_u16(node, "adi,gain-milli",
|
||||||
&gain);
|
&gain);
|
||||||
if (ret && ret != -EINVAL)
|
if (ret && ret != -EINVAL)
|
||||||
return dev_err_probe(dev, ret,
|
return dev_err_probe(dev, ret,
|
||||||
|
@ -308,7 +308,6 @@ static void ad7949_disable_reg(void *reg)
|
|||||||
|
|
||||||
static int ad7949_spi_probe(struct spi_device *spi)
|
static int ad7949_spi_probe(struct spi_device *spi)
|
||||||
{
|
{
|
||||||
u32 spi_ctrl_mask = spi->controller->bits_per_word_mask;
|
|
||||||
struct device *dev = &spi->dev;
|
struct device *dev = &spi->dev;
|
||||||
const struct ad7949_adc_spec *spec;
|
const struct ad7949_adc_spec *spec;
|
||||||
struct ad7949_adc_chip *ad7949_adc;
|
struct ad7949_adc_chip *ad7949_adc;
|
||||||
@ -337,11 +336,11 @@ static int ad7949_spi_probe(struct spi_device *spi)
|
|||||||
ad7949_adc->resolution = spec->resolution;
|
ad7949_adc->resolution = spec->resolution;
|
||||||
|
|
||||||
/* Set SPI bits per word */
|
/* Set SPI bits per word */
|
||||||
if (spi_ctrl_mask & SPI_BPW_MASK(ad7949_adc->resolution)) {
|
if (spi_is_bpw_supported(spi, ad7949_adc->resolution)) {
|
||||||
spi->bits_per_word = ad7949_adc->resolution;
|
spi->bits_per_word = ad7949_adc->resolution;
|
||||||
} else if (spi_ctrl_mask == SPI_BPW_MASK(16)) {
|
} else if (spi_is_bpw_supported(spi, 16)) {
|
||||||
spi->bits_per_word = 16;
|
spi->bits_per_word = 16;
|
||||||
} else if (spi_ctrl_mask == SPI_BPW_MASK(8)) {
|
} else if (spi_is_bpw_supported(spi, 8)) {
|
||||||
spi->bits_per_word = 8;
|
spi->bits_per_word = 8;
|
||||||
} else {
|
} else {
|
||||||
dev_err(dev, "unable to find common BPW with spi controller\n");
|
dev_err(dev, "unable to find common BPW with spi controller\n");
|
||||||
|
@ -445,7 +445,7 @@ static int axi_adc_raw_read(struct iio_backend *back, u32 *val)
|
|||||||
static int ad7606_bus_reg_read(struct iio_backend *back, u32 reg, u32 *val)
|
static int ad7606_bus_reg_read(struct iio_backend *back, u32 reg, u32 *val)
|
||||||
{
|
{
|
||||||
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
struct adi_axi_adc_state *st = iio_backend_get_priv(back);
|
||||||
int addr;
|
u32 addr, reg_val;
|
||||||
|
|
||||||
guard(mutex)(&st->lock);
|
guard(mutex)(&st->lock);
|
||||||
|
|
||||||
@ -455,7 +455,9 @@ static int ad7606_bus_reg_read(struct iio_backend *back, u32 reg, u32 *val)
|
|||||||
*/
|
*/
|
||||||
addr = FIELD_PREP(ADI_AXI_REG_ADDRESS_MASK, reg) | ADI_AXI_REG_READ_BIT;
|
addr = FIELD_PREP(ADI_AXI_REG_ADDRESS_MASK, reg) | ADI_AXI_REG_READ_BIT;
|
||||||
axi_adc_raw_write(back, addr);
|
axi_adc_raw_write(back, addr);
|
||||||
axi_adc_raw_read(back, val);
|
axi_adc_raw_read(back, ®_val);
|
||||||
|
|
||||||
|
*val = FIELD_GET(ADI_AXI_REG_VALUE_MASK, reg_val);
|
||||||
|
|
||||||
/* Write 0x0 on the bus to get back to ADC mode */
|
/* Write 0x0 on the bus to get back to ADC mode */
|
||||||
axi_adc_raw_write(back, 0);
|
axi_adc_raw_write(back, 0);
|
||||||
|
@ -187,6 +187,7 @@ static struct iio_map axp717_maps[] = {
|
|||||||
.consumer_channel = "batt_chrg_i",
|
.consumer_channel = "batt_chrg_i",
|
||||||
.adc_channel_label = "batt_chrg_i",
|
.adc_channel_label = "batt_chrg_i",
|
||||||
},
|
},
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -511,10 +511,10 @@ static const struct iio_event_spec max1363_events[] = {
|
|||||||
MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_U(1, _s1, 1, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_U(2, _s2, 2, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_U(3, _s3, 3, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_B(0, 1, d0m1, 4, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_B(0, 1, d0m1, 12, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_B(2, 3, d2m3, 5, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_B(2, 3, d2m3, 13, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_B(1, 0, d1m0, 6, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_B(1, 0, d1m0, 18, bits, ev_spec, num_ev_spec), \
|
||||||
MAX1363_CHAN_B(3, 2, d3m2, 7, bits, ev_spec, num_ev_spec), \
|
MAX1363_CHAN_B(3, 2, d3m2, 19, bits, ev_spec, num_ev_spec), \
|
||||||
IIO_CHAN_SOFT_TIMESTAMP(8) \
|
IIO_CHAN_SOFT_TIMESTAMP(8) \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -532,23 +532,23 @@ static const struct iio_chan_spec max1363_channels[] =
|
|||||||
/* Applies to max1236, max1237 */
|
/* Applies to max1236, max1237 */
|
||||||
static const enum max1363_modes max1236_mode_list[] = {
|
static const enum max1363_modes max1236_mode_list[] = {
|
||||||
_s0, _s1, _s2, _s3,
|
_s0, _s1, _s2, _s3,
|
||||||
s0to1, s0to2, s0to3,
|
s0to1, s0to2, s2to3, s0to3,
|
||||||
d0m1, d2m3, d1m0, d3m2,
|
d0m1, d2m3, d1m0, d3m2,
|
||||||
d0m1to2m3, d1m0to3m2,
|
d0m1to2m3, d1m0to3m2,
|
||||||
s2to3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Applies to max1238, max1239 */
|
/* Applies to max1238, max1239 */
|
||||||
static const enum max1363_modes max1238_mode_list[] = {
|
static const enum max1363_modes max1238_mode_list[] = {
|
||||||
_s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
|
_s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7, _s8, _s9, _s10, _s11,
|
||||||
s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
|
s0to1, s0to2, s0to3, s0to4, s0to5, s0to6,
|
||||||
|
s6to7, s6to8, s6to9, s6to10, s6to11,
|
||||||
s0to7, s0to8, s0to9, s0to10, s0to11,
|
s0to7, s0to8, s0to9, s0to10, s0to11,
|
||||||
d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
|
d0m1, d2m3, d4m5, d6m7, d8m9, d10m11,
|
||||||
d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
|
d1m0, d3m2, d5m4, d7m6, d9m8, d11m10,
|
||||||
d0m1to2m3, d0m1to4m5, d0m1to6m7, d0m1to8m9, d0m1to10m11,
|
d0m1to2m3, d0m1to4m5, d0m1to6m7, d6m7to8m9,
|
||||||
d1m0to3m2, d1m0to5m4, d1m0to7m6, d1m0to9m8, d1m0to11m10,
|
d0m1to8m9, d6m7to10m11, d0m1to10m11, d1m0to3m2,
|
||||||
s6to7, s6to8, s6to9, s6to10, s6to11,
|
d1m0to5m4, d1m0to7m6, d7m6to9m8, d1m0to9m8,
|
||||||
d6m7to8m9, d6m7to10m11, d7m6to9m8, d7m6to11m10,
|
d7m6to11m10, d1m0to11m10,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX1363_12X_CHANS(bits) { \
|
#define MAX1363_12X_CHANS(bits) { \
|
||||||
@ -584,16 +584,15 @@ static const struct iio_chan_spec max1238_channels[] = MAX1363_12X_CHANS(12);
|
|||||||
|
|
||||||
static const enum max1363_modes max11607_mode_list[] = {
|
static const enum max1363_modes max11607_mode_list[] = {
|
||||||
_s0, _s1, _s2, _s3,
|
_s0, _s1, _s2, _s3,
|
||||||
s0to1, s0to2, s0to3,
|
s0to1, s0to2, s2to3,
|
||||||
s2to3,
|
s0to3,
|
||||||
d0m1, d2m3, d1m0, d3m2,
|
d0m1, d2m3, d1m0, d3m2,
|
||||||
d0m1to2m3, d1m0to3m2,
|
d0m1to2m3, d1m0to3m2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const enum max1363_modes max11608_mode_list[] = {
|
static const enum max1363_modes max11608_mode_list[] = {
|
||||||
_s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
|
_s0, _s1, _s2, _s3, _s4, _s5, _s6, _s7,
|
||||||
s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s0to7,
|
s0to1, s0to2, s0to3, s0to4, s0to5, s0to6, s6to7, s0to7,
|
||||||
s6to7,
|
|
||||||
d0m1, d2m3, d4m5, d6m7,
|
d0m1, d2m3, d4m5, d6m7,
|
||||||
d1m0, d3m2, d5m4, d7m6,
|
d1m0, d3m2, d5m4, d7m6,
|
||||||
d0m1to2m3, d0m1to4m5, d0m1to6m7,
|
d0m1to2m3, d0m1to4m5, d0m1to6m7,
|
||||||
@ -609,14 +608,14 @@ static const enum max1363_modes max11608_mode_list[] = {
|
|||||||
MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
|
MAX1363_CHAN_U(5, _s5, 5, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
|
MAX1363_CHAN_U(6, _s6, 6, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
|
MAX1363_CHAN_U(7, _s7, 7, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(0, 1, d0m1, 8, bits, NULL, 0), \
|
MAX1363_CHAN_B(0, 1, d0m1, 12, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(2, 3, d2m3, 9, bits, NULL, 0), \
|
MAX1363_CHAN_B(2, 3, d2m3, 13, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(4, 5, d4m5, 10, bits, NULL, 0), \
|
MAX1363_CHAN_B(4, 5, d4m5, 14, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(6, 7, d6m7, 11, bits, NULL, 0), \
|
MAX1363_CHAN_B(6, 7, d6m7, 15, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(1, 0, d1m0, 12, bits, NULL, 0), \
|
MAX1363_CHAN_B(1, 0, d1m0, 18, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(3, 2, d3m2, 13, bits, NULL, 0), \
|
MAX1363_CHAN_B(3, 2, d3m2, 19, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(5, 4, d5m4, 14, bits, NULL, 0), \
|
MAX1363_CHAN_B(5, 4, d5m4, 20, bits, NULL, 0), \
|
||||||
MAX1363_CHAN_B(7, 6, d7m6, 15, bits, NULL, 0), \
|
MAX1363_CHAN_B(7, 6, d7m6, 21, bits, NULL, 0), \
|
||||||
IIO_CHAN_SOFT_TIMESTAMP(16) \
|
IIO_CHAN_SOFT_TIMESTAMP(16) \
|
||||||
}
|
}
|
||||||
static const struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
|
static const struct iio_chan_spec max11602_channels[] = MAX1363_8X_CHANS(8);
|
||||||
|
@ -430,10 +430,9 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < priv->cfg->num_irqs; i++) {
|
for (i = 0; i < priv->cfg->num_irqs; i++)
|
||||||
irq_set_chained_handler(priv->irq[i], stm32_adc_irq_handler);
|
irq_set_chained_handler_and_data(priv->irq[i],
|
||||||
irq_set_handler_data(priv->irq[i], priv);
|
stm32_adc_irq_handler, priv);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
st_accel_set_fullscale_error:
|
st_accel_set_fullscale_error:
|
||||||
dev_err(&indio_dev->dev, "failed to set new fullscale.\n");
|
dev_err(indio_dev->dev.parent, "failed to set new fullscale.\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,8 +231,7 @@ int st_sensors_power_enable(struct iio_dev *indio_dev)
|
|||||||
ARRAY_SIZE(regulator_names),
|
ARRAY_SIZE(regulator_names),
|
||||||
regulator_names);
|
regulator_names);
|
||||||
if (err)
|
if (err)
|
||||||
return dev_err_probe(&indio_dev->dev, err,
|
return dev_err_probe(parent, err, "unable to enable supplies\n");
|
||||||
"unable to enable supplies\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -241,13 +240,14 @@ EXPORT_SYMBOL_NS(st_sensors_power_enable, "IIO_ST_SENSORS");
|
|||||||
static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
|
static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
|
||||||
struct st_sensors_platform_data *pdata)
|
struct st_sensors_platform_data *pdata)
|
||||||
{
|
{
|
||||||
|
struct device *parent = indio_dev->dev.parent;
|
||||||
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
||||||
|
|
||||||
/* Sensor does not support interrupts */
|
/* Sensor does not support interrupts */
|
||||||
if (!sdata->sensor_settings->drdy_irq.int1.addr &&
|
if (!sdata->sensor_settings->drdy_irq.int1.addr &&
|
||||||
!sdata->sensor_settings->drdy_irq.int2.addr) {
|
!sdata->sensor_settings->drdy_irq.int2.addr) {
|
||||||
if (pdata->drdy_int_pin)
|
if (pdata->drdy_int_pin)
|
||||||
dev_info(&indio_dev->dev,
|
dev_info(parent,
|
||||||
"DRDY on pin INT%d specified, but sensor does not support interrupts\n",
|
"DRDY on pin INT%d specified, but sensor does not support interrupts\n",
|
||||||
pdata->drdy_int_pin);
|
pdata->drdy_int_pin);
|
||||||
return 0;
|
return 0;
|
||||||
@ -256,29 +256,27 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
|
|||||||
switch (pdata->drdy_int_pin) {
|
switch (pdata->drdy_int_pin) {
|
||||||
case 1:
|
case 1:
|
||||||
if (!sdata->sensor_settings->drdy_irq.int1.mask) {
|
if (!sdata->sensor_settings->drdy_irq.int1.mask) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent, "DRDY on INT1 not available.\n");
|
||||||
"DRDY on INT1 not available.\n");
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
sdata->drdy_int_pin = 1;
|
sdata->drdy_int_pin = 1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (!sdata->sensor_settings->drdy_irq.int2.mask) {
|
if (!sdata->sensor_settings->drdy_irq.int2.mask) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent, "DRDY on INT2 not available.\n");
|
||||||
"DRDY on INT2 not available.\n");
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
sdata->drdy_int_pin = 2;
|
sdata->drdy_int_pin = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n");
|
dev_err(parent, "DRDY on pdata not valid.\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pdata->open_drain) {
|
if (pdata->open_drain) {
|
||||||
if (!sdata->sensor_settings->drdy_irq.int1.addr_od &&
|
if (!sdata->sensor_settings->drdy_irq.int1.addr_od &&
|
||||||
!sdata->sensor_settings->drdy_irq.int2.addr_od)
|
!sdata->sensor_settings->drdy_irq.int2.addr_od)
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent,
|
||||||
"open drain requested but unsupported.\n");
|
"open drain requested but unsupported.\n");
|
||||||
else
|
else
|
||||||
sdata->int_pin_open_drain = true;
|
sdata->int_pin_open_drain = true;
|
||||||
@ -336,6 +334,7 @@ EXPORT_SYMBOL_NS(st_sensors_dev_name_probe, "IIO_ST_SENSORS");
|
|||||||
int st_sensors_init_sensor(struct iio_dev *indio_dev,
|
int st_sensors_init_sensor(struct iio_dev *indio_dev,
|
||||||
struct st_sensors_platform_data *pdata)
|
struct st_sensors_platform_data *pdata)
|
||||||
{
|
{
|
||||||
|
struct device *parent = indio_dev->dev.parent;
|
||||||
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
||||||
struct st_sensors_platform_data *of_pdata;
|
struct st_sensors_platform_data *of_pdata;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@ -343,7 +342,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
|
|||||||
mutex_init(&sdata->odr_lock);
|
mutex_init(&sdata->odr_lock);
|
||||||
|
|
||||||
/* If OF/DT pdata exists, it will take precedence of anything else */
|
/* If OF/DT pdata exists, it will take precedence of anything else */
|
||||||
of_pdata = st_sensors_dev_probe(indio_dev->dev.parent, pdata);
|
of_pdata = st_sensors_dev_probe(parent, pdata);
|
||||||
if (IS_ERR(of_pdata))
|
if (IS_ERR(of_pdata))
|
||||||
return PTR_ERR(of_pdata);
|
return PTR_ERR(of_pdata);
|
||||||
if (of_pdata)
|
if (of_pdata)
|
||||||
@ -370,7 +369,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
} else
|
} else
|
||||||
dev_info(&indio_dev->dev, "Full-scale not possible\n");
|
dev_info(parent, "Full-scale not possible\n");
|
||||||
|
|
||||||
err = st_sensors_set_odr(indio_dev, sdata->odr);
|
err = st_sensors_set_odr(indio_dev, sdata->odr);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -405,7 +404,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
|
|||||||
mask = sdata->sensor_settings->drdy_irq.int2.mask_od;
|
mask = sdata->sensor_settings->drdy_irq.int2.mask_od;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(&indio_dev->dev,
|
dev_info(parent,
|
||||||
"set interrupt line to open drain mode on pin %d\n",
|
"set interrupt line to open drain mode on pin %d\n",
|
||||||
sdata->drdy_int_pin);
|
sdata->drdy_int_pin);
|
||||||
err = st_sensors_write_data_with_mask(indio_dev, addr,
|
err = st_sensors_write_data_with_mask(indio_dev, addr,
|
||||||
@ -593,20 +592,19 @@ EXPORT_SYMBOL_NS(st_sensors_get_settings_index, "IIO_ST_SENSORS");
|
|||||||
int st_sensors_verify_id(struct iio_dev *indio_dev)
|
int st_sensors_verify_id(struct iio_dev *indio_dev)
|
||||||
{
|
{
|
||||||
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
||||||
|
struct device *parent = indio_dev->dev.parent;
|
||||||
int wai, err;
|
int wai, err;
|
||||||
|
|
||||||
if (sdata->sensor_settings->wai_addr) {
|
if (sdata->sensor_settings->wai_addr) {
|
||||||
err = regmap_read(sdata->regmap,
|
err = regmap_read(sdata->regmap,
|
||||||
sdata->sensor_settings->wai_addr, &wai);
|
sdata->sensor_settings->wai_addr, &wai);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&indio_dev->dev,
|
return dev_err_probe(parent, err,
|
||||||
"failed to read Who-Am-I register.\n");
|
"failed to read Who-Am-I register.\n");
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdata->sensor_settings->wai != wai) {
|
if (sdata->sensor_settings->wai != wai) {
|
||||||
dev_warn(&indio_dev->dev,
|
dev_warn(parent, "%s: WhoAmI mismatch (0x%x).\n",
|
||||||
"%s: WhoAmI mismatch (0x%x).\n",
|
|
||||||
indio_dev->name, wai);
|
indio_dev->name, wai);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||||||
sdata->trig = devm_iio_trigger_alloc(parent, "%s-trigger",
|
sdata->trig = devm_iio_trigger_alloc(parent, "%s-trigger",
|
||||||
indio_dev->name);
|
indio_dev->name);
|
||||||
if (sdata->trig == NULL) {
|
if (sdata->trig == NULL) {
|
||||||
dev_err(&indio_dev->dev, "failed to allocate iio trigger.\n");
|
dev_err(parent, "failed to allocate iio trigger.\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||||||
case IRQF_TRIGGER_FALLING:
|
case IRQF_TRIGGER_FALLING:
|
||||||
case IRQF_TRIGGER_LOW:
|
case IRQF_TRIGGER_LOW:
|
||||||
if (!sdata->sensor_settings->drdy_irq.addr_ihl) {
|
if (!sdata->sensor_settings->drdy_irq.addr_ihl) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent,
|
||||||
"falling/low specified for IRQ but hardware supports only rising/high: will request rising/high\n");
|
"falling/low specified for IRQ but hardware supports only rising/high: will request rising/high\n");
|
||||||
if (irq_trig == IRQF_TRIGGER_FALLING)
|
if (irq_trig == IRQF_TRIGGER_FALLING)
|
||||||
irq_trig = IRQF_TRIGGER_RISING;
|
irq_trig = IRQF_TRIGGER_RISING;
|
||||||
@ -156,21 +156,19 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||||||
sdata->sensor_settings->drdy_irq.mask_ihl, 1);
|
sdata->sensor_settings->drdy_irq.mask_ihl, 1);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
dev_info(&indio_dev->dev,
|
dev_info(parent,
|
||||||
"interrupts on the falling edge or active low level\n");
|
"interrupts on the falling edge or active low level\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IRQF_TRIGGER_RISING:
|
case IRQF_TRIGGER_RISING:
|
||||||
dev_info(&indio_dev->dev,
|
dev_info(parent, "interrupts on the rising edge\n");
|
||||||
"interrupts on the rising edge\n");
|
|
||||||
break;
|
break;
|
||||||
case IRQF_TRIGGER_HIGH:
|
case IRQF_TRIGGER_HIGH:
|
||||||
dev_info(&indio_dev->dev,
|
dev_info(parent, "interrupts active high level\n");
|
||||||
"interrupts active high level\n");
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* This is the most preferred mode, if possible */
|
/* This is the most preferred mode, if possible */
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent,
|
||||||
"unsupported IRQ trigger specified (%lx), enforce rising edge\n", irq_trig);
|
"unsupported IRQ trigger specified (%lx), enforce rising edge\n", irq_trig);
|
||||||
irq_trig = IRQF_TRIGGER_RISING;
|
irq_trig = IRQF_TRIGGER_RISING;
|
||||||
}
|
}
|
||||||
@ -179,7 +177,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||||||
if (irq_trig == IRQF_TRIGGER_FALLING ||
|
if (irq_trig == IRQF_TRIGGER_FALLING ||
|
||||||
irq_trig == IRQF_TRIGGER_RISING) {
|
irq_trig == IRQF_TRIGGER_RISING) {
|
||||||
if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr) {
|
if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr) {
|
||||||
dev_err(&indio_dev->dev,
|
dev_err(parent,
|
||||||
"edge IRQ not supported w/o stat register.\n");
|
"edge IRQ not supported w/o stat register.\n");
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
@ -214,13 +212,13 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
|||||||
sdata->trig->name,
|
sdata->trig->name,
|
||||||
sdata->trig);
|
sdata->trig);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&indio_dev->dev, "failed to request trigger IRQ.\n");
|
dev_err(parent, "failed to request trigger IRQ.\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = devm_iio_trigger_register(parent, sdata->trig);
|
err = devm_iio_trigger_register(parent, sdata->trig);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
|
dev_err(parent, "failed to register iio trigger.\n");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
indio_dev->trig = iio_trigger_get(sdata->trig);
|
indio_dev->trig = iio_trigger_get(sdata->trig);
|
||||||
|
@ -166,7 +166,9 @@ static ssize_t ad3530r_set_dac_powerdown(struct iio_dev *indio_dev,
|
|||||||
AD3530R_OUTPUT_OPERATING_MODE_0 :
|
AD3530R_OUTPUT_OPERATING_MODE_0 :
|
||||||
AD3530R_OUTPUT_OPERATING_MODE_1;
|
AD3530R_OUTPUT_OPERATING_MODE_1;
|
||||||
pdmode = powerdown ? st->chan[chan->channel].powerdown_mode : 0;
|
pdmode = powerdown ? st->chan[chan->channel].powerdown_mode : 0;
|
||||||
mask = AD3530R_OP_MODE_CHAN_MSK(chan->channel);
|
mask = chan->channel < AD3531R_MAX_CHANNELS ?
|
||||||
|
AD3530R_OP_MODE_CHAN_MSK(chan->channel) :
|
||||||
|
AD3530R_OP_MODE_CHAN_MSK(chan->channel - 4);
|
||||||
val = field_prep(mask, pdmode);
|
val = field_prep(mask, pdmode);
|
||||||
|
|
||||||
ret = regmap_update_bits(st->regmap, reg, mask, val);
|
ret = regmap_update_bits(st->regmap, reg, mask, val);
|
||||||
|
@ -155,11 +155,14 @@ static ssize_t iio_backend_debugfs_write_reg(struct file *file,
|
|||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (count >= sizeof(buf))
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, userbuf, count);
|
rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, userbuf, count);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
buf[count] = '\0';
|
buf[rc] = '\0';
|
||||||
|
|
||||||
ret = sscanf(buf, "%i %i", &back->cached_reg_addr, &val);
|
ret = sscanf(buf, "%i %i", &back->cached_reg_addr, &val);
|
||||||
|
|
||||||
|
@ -411,12 +411,15 @@ static ssize_t iio_debugfs_write_reg(struct file *file,
|
|||||||
char buf[80];
|
char buf[80];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (count >= sizeof(buf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, userbuf,
|
ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, userbuf,
|
||||||
count);
|
count);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
buf[count] = '\0';
|
buf[ret] = '\0';
|
||||||
|
|
||||||
ret = sscanf(buf, "%i %i", ®, &val);
|
ret = sscanf(buf, "%i %i", ®, &val);
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#define ICC_DYN_ID_START 10000
|
#define ICC_DYN_ID_START 100000
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
@ -819,6 +819,9 @@ static struct icc_node *icc_node_create_nolock(int id)
|
|||||||
{
|
{
|
||||||
struct icc_node *node;
|
struct icc_node *node;
|
||||||
|
|
||||||
|
if (id >= ICC_DYN_ID_START)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
/* check if node already exists */
|
/* check if node already exists */
|
||||||
node = node_find(id);
|
node = node_find(id);
|
||||||
if (node)
|
if (node)
|
||||||
@ -906,10 +909,35 @@ void icc_node_destroy(int id)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
kfree(node->links);
|
kfree(node->links);
|
||||||
|
if (node->id >= ICC_DYN_ID_START)
|
||||||
|
kfree(node->name);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(icc_node_destroy);
|
EXPORT_SYMBOL_GPL(icc_node_destroy);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* icc_node_set_name() - set node name
|
||||||
|
* @node: node
|
||||||
|
* @provider: node provider
|
||||||
|
* @name: node name
|
||||||
|
*
|
||||||
|
* Return: 0 on success, or -ENOMEM on allocation failure
|
||||||
|
*/
|
||||||
|
int icc_node_set_name(struct icc_node *node, const struct icc_provider *provider, const char *name)
|
||||||
|
{
|
||||||
|
if (node->id >= ICC_DYN_ID_START) {
|
||||||
|
node->name = kasprintf(GFP_KERNEL, "%s@%s", name,
|
||||||
|
dev_name(provider->dev));
|
||||||
|
if (!node->name)
|
||||||
|
return -ENOMEM;
|
||||||
|
} else {
|
||||||
|
node->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(icc_node_set_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* icc_link_nodes() - create link between two nodes
|
* icc_link_nodes() - create link between two nodes
|
||||||
* @src_node: source node
|
* @src_node: source node
|
||||||
@ -1038,10 +1066,6 @@ void icc_node_add(struct icc_node *node, struct icc_provider *provider)
|
|||||||
node->avg_bw = node->init_avg;
|
node->avg_bw = node->init_avg;
|
||||||
node->peak_bw = node->init_peak;
|
node->peak_bw = node->init_peak;
|
||||||
|
|
||||||
if (node->id >= ICC_DYN_ID_START)
|
|
||||||
node->name = devm_kasprintf(provider->dev, GFP_KERNEL, "%s@%s",
|
|
||||||
node->name, dev_name(provider->dev));
|
|
||||||
|
|
||||||
if (node->avg_bw || node->peak_bw) {
|
if (node->avg_bw || node->peak_bw) {
|
||||||
if (provider->pre_aggregate)
|
if (provider->pre_aggregate)
|
||||||
provider->pre_aggregate(node);
|
provider->pre_aggregate(node);
|
||||||
|
@ -117,6 +117,7 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
|||||||
|
|
||||||
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_master", data[i].name);
|
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_master", data[i].name);
|
||||||
if (!node->name) {
|
if (!node->name) {
|
||||||
|
icc_node_destroy(node->id);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -135,6 +136,7 @@ struct icc_provider *icc_clk_register(struct device *dev,
|
|||||||
|
|
||||||
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name);
|
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name);
|
||||||
if (!node->name) {
|
if (!node->name) {
|
||||||
|
icc_node_destroy(node->id);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -293,7 +293,12 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
|
|||||||
goto err_remove_nodes;
|
goto err_remove_nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->name = qn->name;
|
ret = icc_node_set_name(node, provider, qn->name);
|
||||||
|
if (ret) {
|
||||||
|
icc_node_destroy(node->id);
|
||||||
|
goto err_remove_nodes;
|
||||||
|
}
|
||||||
|
|
||||||
node->data = qn;
|
node->data = qn;
|
||||||
icc_node_add(node, provider);
|
icc_node_add(node, provider);
|
||||||
|
|
||||||
|
@ -236,7 +236,12 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->name = qnodes[i]->name;
|
ret = icc_node_set_name(node, provider, qnodes[i]->name);
|
||||||
|
if (ret) {
|
||||||
|
icc_node_destroy(node->id);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cast away const and add it back in qcom_osm_l3_set() */
|
/* Cast away const and add it back in qcom_osm_l3_set() */
|
||||||
node->data = (void *)qnodes[i];
|
node->data = (void *)qnodes[i];
|
||||||
icc_node_add(node, provider);
|
icc_node_add(node, provider);
|
||||||
|
@ -238,6 +238,7 @@ static struct qcom_icc_node xm_pcie3_1 = {
|
|||||||
.id = SC7280_MASTER_PCIE_1,
|
.id = SC7280_MASTER_PCIE_1,
|
||||||
.channels = 1,
|
.channels = 1,
|
||||||
.buswidth = 8,
|
.buswidth = 8,
|
||||||
|
.num_links = 1,
|
||||||
.links = { SC7280_SLAVE_ANOC_PCIE_GEM_NOC },
|
.links = { SC7280_SLAVE_ANOC_PCIE_GEM_NOC },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -134,6 +134,11 @@ static int exynos_generic_icc_probe(struct platform_device *pdev)
|
|||||||
priv->node = icc_node;
|
priv->node = icc_node;
|
||||||
icc_node->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn",
|
icc_node->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn",
|
||||||
bus_dev->of_node);
|
bus_dev->of_node);
|
||||||
|
if (!icc_node->name) {
|
||||||
|
icc_node_destroy(pdev->id);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
if (of_property_read_u32(bus_dev->of_node, "samsung,data-clock-ratio",
|
if (of_property_read_u32(bus_dev->of_node, "samsung,data-clock-ratio",
|
||||||
&priv->bus_clk_ratio))
|
&priv->bus_clk_ratio))
|
||||||
priv->bus_clk_ratio = EXYNOS_ICC_DEFAULT_BUS_CLK_RATIO;
|
priv->bus_clk_ratio = EXYNOS_ICC_DEFAULT_BUS_CLK_RATIO;
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
#define RD_MCA_CMD 0x86
|
#define RD_MCA_CMD 0x86
|
||||||
|
|
||||||
/* CPUID MCAMSR mask & index */
|
/* CPUID MCAMSR mask & index */
|
||||||
#define CPUID_MCA_THRD_MASK GENMASK(15, 0)
|
|
||||||
#define CPUID_MCA_THRD_INDEX 32
|
#define CPUID_MCA_THRD_INDEX 32
|
||||||
#define CPUID_MCA_FUNC_MASK GENMASK(31, 0)
|
#define CPUID_MCA_FUNC_MASK GENMASK(31, 0)
|
||||||
#define CPUID_EXT_FUNC_INDEX 56
|
#define CPUID_EXT_FUNC_INDEX 56
|
||||||
@ -129,7 +128,7 @@ static int rmi_cpuid_read(struct sbrmi_data *data,
|
|||||||
goto exit_unlock;
|
goto exit_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread = msg->cpu_in_out << CPUID_MCA_THRD_INDEX & CPUID_MCA_THRD_MASK;
|
thread = msg->cpu_in_out >> CPUID_MCA_THRD_INDEX;
|
||||||
|
|
||||||
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */
|
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */
|
||||||
if (thread > 127) {
|
if (thread > 127) {
|
||||||
@ -210,7 +209,7 @@ static int rmi_mca_msr_read(struct sbrmi_data *data,
|
|||||||
goto exit_unlock;
|
goto exit_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread = msg->mcamsr_in_out << CPUID_MCA_THRD_INDEX & CPUID_MCA_THRD_MASK;
|
thread = msg->mcamsr_in_out >> CPUID_MCA_THRD_INDEX;
|
||||||
|
|
||||||
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */
|
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */
|
||||||
if (thread > 127) {
|
if (thread > 127) {
|
||||||
@ -321,6 +320,10 @@ int rmi_mailbox_xfer(struct sbrmi_data *data,
|
|||||||
ret = regmap_read(data->regmap, SBRMI_OUTBNDMSG7, &ec);
|
ret = regmap_read(data->regmap, SBRMI_OUTBNDMSG7, &ec);
|
||||||
if (ret || ec)
|
if (ret || ec)
|
||||||
goto exit_clear_alert;
|
goto exit_clear_alert;
|
||||||
|
|
||||||
|
/* Clear the input value before updating the output data */
|
||||||
|
msg->mb_in_out = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For a read operation, the initiator (BMC) reads the firmware
|
* For a read operation, the initiator (BMC) reads the firmware
|
||||||
* response Command Data Out[31:0] from SBRMI::OutBndMsg_inst[4:1]
|
* response Command Data Out[31:0] from SBRMI::OutBndMsg_inst[4:1]
|
||||||
@ -373,7 +376,8 @@ static int apml_rmi_reg_xfer(struct sbrmi_data *data,
|
|||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
|
|
||||||
if (msg.rflag && !ret)
|
if (msg.rflag && !ret)
|
||||||
return copy_to_user(arg, &msg, sizeof(struct apml_reg_xfer_msg));
|
if (copy_to_user(arg, &msg, sizeof(struct apml_reg_xfer_msg)))
|
||||||
|
return -EFAULT;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +395,9 @@ static int apml_mailbox_xfer(struct sbrmi_data *data, struct apml_mbox_msg __use
|
|||||||
if (ret && ret != -EPROTOTYPE)
|
if (ret && ret != -EPROTOTYPE)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return copy_to_user(arg, &msg, sizeof(struct apml_mbox_msg));
|
if (copy_to_user(arg, &msg, sizeof(struct apml_mbox_msg)))
|
||||||
|
return -EFAULT;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int apml_cpuid_xfer(struct sbrmi_data *data, struct apml_cpuid_msg __user *arg)
|
static int apml_cpuid_xfer(struct sbrmi_data *data, struct apml_cpuid_msg __user *arg)
|
||||||
@ -408,7 +414,9 @@ static int apml_cpuid_xfer(struct sbrmi_data *data, struct apml_cpuid_msg __user
|
|||||||
if (ret && ret != -EPROTOTYPE)
|
if (ret && ret != -EPROTOTYPE)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return copy_to_user(arg, &msg, sizeof(struct apml_cpuid_msg));
|
if (copy_to_user(arg, &msg, sizeof(struct apml_cpuid_msg)))
|
||||||
|
return -EFAULT;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int apml_mcamsr_xfer(struct sbrmi_data *data, struct apml_mcamsr_msg __user *arg)
|
static int apml_mcamsr_xfer(struct sbrmi_data *data, struct apml_mcamsr_msg __user *arg)
|
||||||
@ -425,7 +433,9 @@ static int apml_mcamsr_xfer(struct sbrmi_data *data, struct apml_mcamsr_msg __us
|
|||||||
if (ret && ret != -EPROTOTYPE)
|
if (ret && ret != -EPROTOTYPE)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return copy_to_user(arg, &msg, sizeof(struct apml_mcamsr_msg));
|
if (copy_to_user(arg, &msg, sizeof(struct apml_mcamsr_msg)))
|
||||||
|
return -EFAULT;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long sbrmi_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
|
static long sbrmi_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
|
||||||
|
@ -48,6 +48,7 @@ config MUX_GPIO
|
|||||||
config MUX_MMIO
|
config MUX_MMIO
|
||||||
tristate "MMIO/Regmap register bitfield-controlled Multiplexer"
|
tristate "MMIO/Regmap register bitfield-controlled Multiplexer"
|
||||||
depends on OF
|
depends on OF
|
||||||
|
select REGMAP_MMIO
|
||||||
help
|
help
|
||||||
MMIO/Regmap register bitfield-controlled Multiplexer controller.
|
MMIO/Regmap register bitfield-controlled Multiplexer controller.
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/if_ether.h> /* ETH_ALEN */
|
||||||
|
|
||||||
enum fuse_type {
|
enum fuse_type {
|
||||||
FUSE_FSB = BIT(0),
|
FUSE_FSB = BIT(0),
|
||||||
@ -118,9 +119,11 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Deal with some post processing of nvmem cell data */
|
/* Deal with some post processing of nvmem cell data */
|
||||||
if (id && !strcmp(id, "mac-address"))
|
if (id && !strcmp(id, "mac-address")) {
|
||||||
|
bytes = min(bytes, ETH_ALEN);
|
||||||
for (i = 0; i < bytes / 2; i++)
|
for (i = 0; i < bytes / 2; i++)
|
||||||
swap(buf[i], buf[bytes - i - 1]);
|
swap(buf[i], buf[bytes - i - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/if_ether.h> /* ETH_ALEN */
|
||||||
|
|
||||||
#define IMX_OCOTP_OFFSET_B0W0 0x400 /* Offset from base address of the
|
#define IMX_OCOTP_OFFSET_B0W0 0x400 /* Offset from base address of the
|
||||||
* OTP Bank0 Word0
|
* OTP Bank0 Word0
|
||||||
@ -227,9 +228,11 @@ static int imx_ocotp_cell_pp(void *context, const char *id, int index,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Deal with some post processing of nvmem cell data */
|
/* Deal with some post processing of nvmem cell data */
|
||||||
if (id && !strcmp(id, "mac-address"))
|
if (id && !strcmp(id, "mac-address")) {
|
||||||
|
bytes = min(bytes, ETH_ALEN);
|
||||||
for (i = 0; i < bytes / 2; i++)
|
for (i = 0; i < bytes / 2; i++)
|
||||||
swap(buf[i], buf[bytes - i - 1]);
|
swap(buf[i], buf[bytes - i - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ int u_boot_env_parse(struct device *dev, struct nvmem_device *nvmem,
|
|||||||
size_t crc32_data_offset;
|
size_t crc32_data_offset;
|
||||||
size_t crc32_data_len;
|
size_t crc32_data_len;
|
||||||
size_t crc32_offset;
|
size_t crc32_offset;
|
||||||
__le32 *crc32_addr;
|
uint32_t *crc32_addr;
|
||||||
size_t data_offset;
|
size_t data_offset;
|
||||||
size_t data_len;
|
size_t data_len;
|
||||||
size_t dev_size;
|
size_t dev_size;
|
||||||
@ -143,8 +143,8 @@ int u_boot_env_parse(struct device *dev, struct nvmem_device *nvmem,
|
|||||||
goto err_kfree;
|
goto err_kfree;
|
||||||
}
|
}
|
||||||
|
|
||||||
crc32_addr = (__le32 *)(buf + crc32_offset);
|
crc32_addr = (uint32_t *)(buf + crc32_offset);
|
||||||
crc32 = le32_to_cpu(*crc32_addr);
|
crc32 = *crc32_addr;
|
||||||
crc32_data_len = dev_size - crc32_data_offset;
|
crc32_data_len = dev_size - crc32_data_offset;
|
||||||
data_len = dev_size - data_offset;
|
data_len = dev_size - data_offset;
|
||||||
|
|
||||||
|
@ -119,6 +119,7 @@ int icc_std_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
|
|||||||
struct icc_node *icc_node_create_dyn(void);
|
struct icc_node *icc_node_create_dyn(void);
|
||||||
struct icc_node *icc_node_create(int id);
|
struct icc_node *icc_node_create(int id);
|
||||||
void icc_node_destroy(int id);
|
void icc_node_destroy(int id);
|
||||||
|
int icc_node_set_name(struct icc_node *node, const struct icc_provider *provider, const char *name);
|
||||||
int icc_link_nodes(struct icc_node *src_node, struct icc_node **dst_node);
|
int icc_link_nodes(struct icc_node *src_node, struct icc_node **dst_node);
|
||||||
int icc_link_create(struct icc_node *node, const int dst_id);
|
int icc_link_create(struct icc_node *node, const int dst_id);
|
||||||
void icc_node_add(struct icc_node *node, struct icc_provider *provider);
|
void icc_node_add(struct icc_node *node, struct icc_provider *provider);
|
||||||
@ -152,6 +153,12 @@ static inline void icc_node_destroy(int id)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int icc_node_set_name(struct icc_node *node, const struct icc_provider *provider,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int icc_link_nodes(struct icc_node *src_node, struct icc_node **dst_node)
|
static inline int icc_link_nodes(struct icc_node *src_node, struct icc_node **dst_node)
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
Loading…
Reference in New Issue
Block a user