forked from Minki/linux
d3be83244c
This patch applies the semantic patch: @@ expression I, P, SP; @@ I = devm_iio_device_alloc(P, SP); ... - I->dev.parent = P; It updates 302 files and does 307 deletions. This semantic patch also removes some comments like '/* Establish that the iio_dev is a child of the i2c device */' But this is is only done in case where the block is left empty. The patch does not seem to cover all cases. It looks like in some cases a different variable is used in some cases to assign the parent, but it points to the same reference. In other cases, the block covered by ... may be just too big to be covered by the semantic patch. However, this looks pretty good as well, as it does cover a big bulk of the drivers that should remove the parent assignment. Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
151 lines
3.4 KiB
C
151 lines
3.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Nano River Technologies viperboard IIO ADC driver
|
|
*
|
|
* (C) 2012 by Lemonage GmbH
|
|
* Author: Lars Poeschel <poeschel@lemonage.de>
|
|
* All rights reserved.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/types.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
#include <linux/usb.h>
|
|
#include <linux/iio/iio.h>
|
|
|
|
#include <linux/mfd/viperboard.h>
|
|
|
|
#define VPRBRD_ADC_CMD_GET 0x00
|
|
|
|
struct vprbrd_adc_msg {
|
|
u8 cmd;
|
|
u8 chan;
|
|
u8 val;
|
|
} __packed;
|
|
|
|
struct vprbrd_adc {
|
|
struct vprbrd *vb;
|
|
};
|
|
|
|
#define VPRBRD_ADC_CHANNEL(_index) { \
|
|
.type = IIO_VOLTAGE, \
|
|
.indexed = 1, \
|
|
.channel = _index, \
|
|
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
|
|
}
|
|
|
|
static struct iio_chan_spec const vprbrd_adc_iio_channels[] = {
|
|
VPRBRD_ADC_CHANNEL(0),
|
|
VPRBRD_ADC_CHANNEL(1),
|
|
VPRBRD_ADC_CHANNEL(2),
|
|
VPRBRD_ADC_CHANNEL(3),
|
|
};
|
|
|
|
static int vprbrd_iio_read_raw(struct iio_dev *iio_dev,
|
|
struct iio_chan_spec const *chan,
|
|
int *val,
|
|
int *val2,
|
|
long info)
|
|
{
|
|
int ret, error = 0;
|
|
struct vprbrd_adc *adc = iio_priv(iio_dev);
|
|
struct vprbrd *vb = adc->vb;
|
|
struct vprbrd_adc_msg *admsg = (struct vprbrd_adc_msg *)vb->buf;
|
|
|
|
switch (info) {
|
|
case IIO_CHAN_INFO_RAW:
|
|
mutex_lock(&vb->lock);
|
|
|
|
admsg->cmd = VPRBRD_ADC_CMD_GET;
|
|
admsg->chan = chan->channel;
|
|
admsg->val = 0x00;
|
|
|
|
ret = usb_control_msg(vb->usb_dev,
|
|
usb_sndctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
|
|
VPRBRD_USB_TYPE_OUT, 0x0000, 0x0000, admsg,
|
|
sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
|
|
if (ret != sizeof(struct vprbrd_adc_msg)) {
|
|
dev_err(&iio_dev->dev, "usb send error on adc read\n");
|
|
error = -EREMOTEIO;
|
|
}
|
|
|
|
ret = usb_control_msg(vb->usb_dev,
|
|
usb_rcvctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
|
|
VPRBRD_USB_TYPE_IN, 0x0000, 0x0000, admsg,
|
|
sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
|
|
|
|
*val = admsg->val;
|
|
|
|
mutex_unlock(&vb->lock);
|
|
|
|
if (ret != sizeof(struct vprbrd_adc_msg)) {
|
|
dev_err(&iio_dev->dev, "usb recv error on adc read\n");
|
|
error = -EREMOTEIO;
|
|
}
|
|
|
|
if (error)
|
|
goto error;
|
|
|
|
return IIO_VAL_INT;
|
|
default:
|
|
error = -EINVAL;
|
|
break;
|
|
}
|
|
error:
|
|
return error;
|
|
}
|
|
|
|
static const struct iio_info vprbrd_adc_iio_info = {
|
|
.read_raw = &vprbrd_iio_read_raw,
|
|
};
|
|
|
|
static int vprbrd_adc_probe(struct platform_device *pdev)
|
|
{
|
|
struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent);
|
|
struct vprbrd_adc *adc;
|
|
struct iio_dev *indio_dev;
|
|
int ret;
|
|
|
|
/* registering iio */
|
|
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc));
|
|
if (!indio_dev) {
|
|
dev_err(&pdev->dev, "failed allocating iio device\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
adc = iio_priv(indio_dev);
|
|
adc->vb = vb;
|
|
indio_dev->name = "viperboard adc";
|
|
indio_dev->info = &vprbrd_adc_iio_info;
|
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
|
indio_dev->channels = vprbrd_adc_iio_channels;
|
|
indio_dev->num_channels = ARRAY_SIZE(vprbrd_adc_iio_channels);
|
|
|
|
ret = devm_iio_device_register(&pdev->dev, indio_dev);
|
|
if (ret) {
|
|
dev_err(&pdev->dev, "could not register iio (adc)");
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver vprbrd_adc_driver = {
|
|
.driver = {
|
|
.name = "viperboard-adc",
|
|
},
|
|
.probe = vprbrd_adc_probe,
|
|
};
|
|
|
|
module_platform_driver(vprbrd_adc_driver);
|
|
|
|
MODULE_AUTHOR("Lars Poeschel <poeschel@lemonage.de>");
|
|
MODULE_DESCRIPTION("IIO ADC driver for Nano River Techs Viperboard");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS("platform:viperboard-adc");
|