All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Thomas Bonnefille <thomas.bonnefille@bootlin.com>
Cc: "Jonathan Cameron" <jic23@kernel.org>,
	"Lars-Peter Clausen" <lars@metafoo.de>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Chen Wang" <unicorn_wang@outlook.com>,
	"Inochi Amaoto" <inochiama@outlook.com>,
	"Paul Walmsley" <paul.walmsley@sifive.com>,
	"Palmer Dabbelt" <palmer@dabbelt.com>,
	"Albert Ou" <aou@eecs.berkeley.edu>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Miquèl Raynal" <miquel.raynal@bootlin.com>,
	linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org
Subject: Re: [PATCH 2/3] iio: adc: sophgo-saradc: Add driver for Sophgo SARADC
Date: Tue, 2 Jul 2024 18:01:00 +0100	[thread overview]
Message-ID: <20240702180100.00000096@Huawei.com> (raw)
In-Reply-To: <20240702-sg2002-adc-v1-2-ac66e076a756@bootlin.com>

On Tue, 02 Jul 2024 13:52:22 +0200
Thomas Bonnefille <thomas.bonnefille@bootlin.com> wrote:

> This adds a driver for the common Sophgo SARADC.
> 
> Signed-off-by: Thomas Bonnefille <thomas.bonnefille@bootlin.com>

Hi Thomas,

Welcome to IIO.

Various comments inline

Thanks,

Jonathan
> diff --git a/drivers/iio/adc/sophgo-adc.c b/drivers/iio/adc/sophgo-adc.c
> new file mode 100644
> index 000000000000..a94d839d40ec
> --- /dev/null
> +++ b/drivers/iio/adc/sophgo-adc.c
> @@ -0,0 +1,223 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + *  Sophgo SARADC Driver
> + *
> + *  Copyright (C) Bootlin 2024
> + *  Author: Thomas Bonnefille <thomas.bonnefille@bootlin.com>
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/completion.h>
> +#include <linux/dev_printk.h>
> +#include <linux/interrupt.h>
> +#include <linux/iio/iio.h>
> +#include <linux/iopoll.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/of.h>
probably want mod_devicetable.h instead.

> +#include <linux/platform_device.h>
> +
> +#define SOPHGO_SARADC_CTRL_REG			0x04
> +#define		SOPHGO_SARADC_EN		BIT(0)
> +#define		SOPHGO_SARADC_SEL(x)		BIT((x)+4)
> +#define SOPHGO_SARADC_STATUS_REG		0x08
> +#define		SOPHGO_SARADC_BUSY		BIT(0)
> +#define SOPHGO_SARADC_CYC_SET_REG		0x0C
> +#define		SOPHGO_SARADC_DEF_CYC_SETTINGS	0xF1F0F
> +#define SOPHGO_SARADC_CH_RESULT_REG(x)		(0x10+4*(x))
> +#define		SARADC_CH_RESULT(x)		((x) & 0xfff)
> +#define		SARADC_CH_VALID(x)		((x) & BIT(15))

Prefer defined masks and FIELD_GET() to actually get the values.
Also use consistent prefix for defines.


> +#define SOPHGO_SARADC_INTR_EN_REG		0x20
> +#define SOPHGO_SARADC_INTR_CLR_REG		0x24
> +
> +#define SOPHGO_SARADC_CHANNEL(index)					\
> +	{								\
> +		.type = IIO_VOLTAGE,					\
> +		.indexed = 1,						\
> +		.channel = index,					\
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),	\
> +		.scan_index = index,					\
> +		.scan_type = {						\
> +			.sign = 'u',					\
> +			.realbits = 12,					\

No need to define these if not providing buffered capture.


> +		},							\
> +	}
> +
> +struct sophgo_saradc {
> +	struct completion completion;
> +	struct iio_info info;
> +	void __iomem *regs;
> +	struct mutex lock;

Add a comment on what data this lock protects.  

> +	struct clk *clk;
After changes below, probably don't need to hang on to the clk.
> +	int irq;
Rarely need to keep hold of the irq after probe. Use a local variable for
it in instead.

> +};
> +
> +static const struct iio_chan_spec sophgo_channels[] = {
> +	SOPHGO_SARADC_CHANNEL(1),
> +	SOPHGO_SARADC_CHANNEL(2),
> +	SOPHGO_SARADC_CHANNEL(3),
> +};
> +
> +static void sophgo_saradc_start_measurement(struct sophgo_saradc *saradc,
> +					    int channel)
> +{
> +	writel(0, saradc->regs + SOPHGO_SARADC_CTRL_REG);
> +	writel(SOPHGO_SARADC_SEL(channel) | SOPHGO_SARADC_EN,
> +	       saradc->regs + SOPHGO_SARADC_CTRL_REG);
> +}
> +
> +static int sophgo_saradc_wait(struct sophgo_saradc *saradc)
> +{
> +	if (saradc->irq < 0) {
> +		u32 reg;
> +
> +		return readl_poll_timeout(saradc->regs + SOPHGO_SARADC_STATUS_REG,
> +					  reg, !(reg & SOPHGO_SARADC_BUSY),
> +					  500, 1000000);
> +	} else {

Returned above, so no need for else which helps with indent.


> +		int ret;
> +
> +		ret = wait_for_completion_timeout(&saradc->completion,
> +						  msecs_to_jiffies(1000)) > 0
> +						  ? 0 : -ETIMEDOUT;
> +		return ret;
return wait_for_completion.
> +	}
> +}
> +
> +static int sophgo_saradc_read_raw(struct iio_dev *indio_dev,
> +				  struct iio_chan_spec const *chan,
> +				  int *val, int *val2, long mask)
> +{
> +	switch (mask) {
> +	case IIO_CHAN_INFO_RAW:
> +		struct sophgo_saradc *saradc = iio_priv(indio_dev);
> +		u32 sample;
> +		int ret;
> +
> +		mutex_lock(&saradc->lock);

Use scoped_guard() here so you can return directly on error.

> +		sophgo_saradc_start_measurement(saradc, chan->scan_index);
> +		ret = sophgo_saradc_wait(saradc);
> +		if (ret < 0) {
> +			mutex_unlock(&saradc->lock);
> +			return ret;
> +		}
> +
> +		sample = readl(saradc->regs + SOPHGO_SARADC_CH_RESULT_REG(chan->scan_index));
> +		mutex_unlock(&saradc->lock);
> +
> +		if (SARADC_CH_VALID(sample)) {
> +			*val = SARADC_CH_RESULT(sample);
> +			return IIO_VAL_INT;
> +		}
errors out of line preferred.
		if (!SARADC_CH_VALID(sample))
			return -ENODATA;

		*val...

> +		return -ENODATA;
> +	case IIO_CHAN_INFO_SCALE:
> +		*val = 3300;
> +		*val2 = 12;
> +		return IIO_VAL_FRACTIONAL_LOG2;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static irqreturn_t sophgo_saradc_interrupt_handler(int irq, void *dev_id)
> +{
> +	struct sophgo_saradc *saradc = dev_id;

dev_id is an odd name for something that isn't an id.

No register to confirm the interupt status?  Fine if not, but relatively
unusual.

> +
> +	writel(1, saradc->regs + SOPHGO_SARADC_INTR_CLR_REG);
> +	complete(&saradc->completion);
> +	return IRQ_HANDLED;
> +}
> +

Single blank line

> +
> +static const struct of_device_id sophgo_saradc_match[] = {
> +	{ .compatible = "sophgo,cv18xx-saradc", },
> +	{ },
No comma needed on 'null' terminators like this as we won't
ever add anything after them.

> +};
> +MODULE_DEVICE_TABLE(of, sophgo_saradc_match);
> +
> +static int sophgo_saradc_probe(struct platform_device *pdev)
> +{
> +	struct sophgo_saradc *saradc;
> +	struct iio_dev *indio_dev;
> +	int ret;
> +
> +	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*saradc));
> +	if (!indio_dev)
> +		return -ENOMEM;
> +
> +	saradc = iio_priv(indio_dev);
> +	indio_dev->name = "Sophgo SARADC";

Hmm. Whilst the ABI docs don't say it, I don't think we have names with
either capitals or spaces.  sophgo-saradc or similar preferred.

> +	indio_dev->info = &saradc->info;

This is making some static const data dynamic. I can't see why you'd do this

> +	indio_dev->modes = INDIO_DIRECT_MODE;
> +	indio_dev->num_channels = 3;

ARRAY_SIZE(sophgo_channels)

> +	indio_dev->channels = sophgo_channels;
> +
> +	saradc->clk = devm_clk_get(&pdev->dev, NULL);

If it's optional, then use dev_clk_get_optional()

> +	if (IS_ERR(saradc->clk)) {
> +		dev_dbg(&pdev->dev, "Can't get clock from device tree, using No-Die domain");
> +	} else {
> +		ret = clk_prepare_enable(saradc->clk);

Perhaps devm_clk_get_optional_enabled() is appropriate, then
you can use null return to detect that it wasn't present - vs an ERR_PTR() for
it was but didn't enable.

> +		if (ret)
> +			return ret;
> +	}
> +
> +	saradc->regs = devm_platform_ioremap_resource(pdev, 0);
> +	if (IS_ERR(saradc->regs)) {
> +		ret = PTR_ERR(saradc->regs);
> +		goto error_disable_clock;
> +	}
> +
> +	saradc->irq = platform_get_irq_optional(pdev, 0);
> +	if (saradc->irq >= 0) {
> +		ret = devm_request_irq(&pdev->dev, saradc->irq,
> +				sophgo_saradc_interrupt_handler, 0,
> +				dev_name(&pdev->dev), saradc);
> +		if (ret)
> +			goto error_disable_clock;
> +
> +		writel(1, saradc->regs + SOPHGO_SARADC_INTR_EN_REG);
> +
> +		init_completion(&saradc->completion);
Usually best to init a completion that is irq related before requesting
the irq. Avoids any possible races.

> +	}
> +
> +	saradc->info.read_raw = &sophgo_saradc_read_raw;
Why?  
> +
> +	mutex_init(&saradc->lock);
> +	platform_set_drvdata(pdev, indio_dev);
> +	writel(SOPHGO_SARADC_DEF_CYC_SETTINGS, saradc->regs + SOPHGO_SARADC_CYC_SET_REG);
> +	ret = devm_iio_device_register(&pdev->dev, indio_dev);
> +	if (ret)
> +		goto error_disable_clock;
> +
> +	return 0;
> +
> +error_disable_clock:
> +	if (!IS_ERR(saradc->clk))
Don't mix and match devm and non devm management.
As above, I think you can just use devm_clk_get_optional_enabled()

> +		clk_disable_unprepare(saradc->clk);
> +	return ret;
> +}
> +
> +static void sophgo_saradc_remove(struct platform_device *pdev)
> +{
> +	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
> +	struct sophgo_saradc *saradc = iio_priv(indio_dev);
> +
> +	if (!IS_ERR(saradc->clk))
> +		clk_disable_unprepare(saradc->clk);
> +}
> +

Single blank line is enough.

> +
> +static struct platform_driver sophgo_saradc_driver = {
> +	.driver	= {
> +		.name		= "sophgo-saradc",
> +		.of_match_table	= sophgo_saradc_match,
> +	},
> +	.probe = sophgo_saradc_probe,
> +	.remove_new = sophgo_saradc_remove,
> +};
> +module_platform_driver(sophgo_saradc_driver);
> +
> +MODULE_AUTHOR("Thomas Bonnefille <thomas.bonnefille@bootlin.com>");
> +MODULE_DESCRIPTION("Sophgo SARADC driver");
> +MODULE_LICENSE("GPL");
> 


WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Thomas Bonnefille <thomas.bonnefille@bootlin.com>
Cc: "Jonathan Cameron" <jic23@kernel.org>,
	"Lars-Peter Clausen" <lars@metafoo.de>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Chen Wang" <unicorn_wang@outlook.com>,
	"Inochi Amaoto" <inochiama@outlook.com>,
	"Paul Walmsley" <paul.walmsley@sifive.com>,
	"Palmer Dabbelt" <palmer@dabbelt.com>,
	"Albert Ou" <aou@eecs.berkeley.edu>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Miquèl Raynal" <miquel.raynal@bootlin.com>,
	linux-iio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org
Subject: Re: [PATCH 2/3] iio: adc: sophgo-saradc: Add driver for Sophgo SARADC
Date: Tue, 2 Jul 2024 18:01:00 +0100	[thread overview]
Message-ID: <20240702180100.00000096@Huawei.com> (raw)
In-Reply-To: <20240702-sg2002-adc-v1-2-ac66e076a756@bootlin.com>

On Tue, 02 Jul 2024 13:52:22 +0200
Thomas Bonnefille <thomas.bonnefille@bootlin.com> wrote:

> This adds a driver for the common Sophgo SARADC.
> 
> Signed-off-by: Thomas Bonnefille <thomas.bonnefille@bootlin.com>

Hi Thomas,

Welcome to IIO.

Various comments inline

Thanks,

Jonathan
> diff --git a/drivers/iio/adc/sophgo-adc.c b/drivers/iio/adc/sophgo-adc.c
> new file mode 100644
> index 000000000000..a94d839d40ec
> --- /dev/null
> +++ b/drivers/iio/adc/sophgo-adc.c
> @@ -0,0 +1,223 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + *  Sophgo SARADC Driver
> + *
> + *  Copyright (C) Bootlin 2024
> + *  Author: Thomas Bonnefille <thomas.bonnefille@bootlin.com>
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/completion.h>
> +#include <linux/dev_printk.h>
> +#include <linux/interrupt.h>
> +#include <linux/iio/iio.h>
> +#include <linux/iopoll.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/of.h>
probably want mod_devicetable.h instead.

> +#include <linux/platform_device.h>
> +
> +#define SOPHGO_SARADC_CTRL_REG			0x04
> +#define		SOPHGO_SARADC_EN		BIT(0)
> +#define		SOPHGO_SARADC_SEL(x)		BIT((x)+4)
> +#define SOPHGO_SARADC_STATUS_REG		0x08
> +#define		SOPHGO_SARADC_BUSY		BIT(0)
> +#define SOPHGO_SARADC_CYC_SET_REG		0x0C
> +#define		SOPHGO_SARADC_DEF_CYC_SETTINGS	0xF1F0F
> +#define SOPHGO_SARADC_CH_RESULT_REG(x)		(0x10+4*(x))
> +#define		SARADC_CH_RESULT(x)		((x) & 0xfff)
> +#define		SARADC_CH_VALID(x)		((x) & BIT(15))

Prefer defined masks and FIELD_GET() to actually get the values.
Also use consistent prefix for defines.


> +#define SOPHGO_SARADC_INTR_EN_REG		0x20
> +#define SOPHGO_SARADC_INTR_CLR_REG		0x24
> +
> +#define SOPHGO_SARADC_CHANNEL(index)					\
> +	{								\
> +		.type = IIO_VOLTAGE,					\
> +		.indexed = 1,						\
> +		.channel = index,					\
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
> +		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),	\
> +		.scan_index = index,					\
> +		.scan_type = {						\
> +			.sign = 'u',					\
> +			.realbits = 12,					\

No need to define these if not providing buffered capture.


> +		},							\
> +	}
> +
> +struct sophgo_saradc {
> +	struct completion completion;
> +	struct iio_info info;
> +	void __iomem *regs;
> +	struct mutex lock;

Add a comment on what data this lock protects.  

> +	struct clk *clk;
After changes below, probably don't need to hang on to the clk.
> +	int irq;
Rarely need to keep hold of the irq after probe. Use a local variable for
it in instead.

> +};
> +
> +static const struct iio_chan_spec sophgo_channels[] = {
> +	SOPHGO_SARADC_CHANNEL(1),
> +	SOPHGO_SARADC_CHANNEL(2),
> +	SOPHGO_SARADC_CHANNEL(3),
> +};
> +
> +static void sophgo_saradc_start_measurement(struct sophgo_saradc *saradc,
> +					    int channel)
> +{
> +	writel(0, saradc->regs + SOPHGO_SARADC_CTRL_REG);
> +	writel(SOPHGO_SARADC_SEL(channel) | SOPHGO_SARADC_EN,
> +	       saradc->regs + SOPHGO_SARADC_CTRL_REG);
> +}
> +
> +static int sophgo_saradc_wait(struct sophgo_saradc *saradc)
> +{
> +	if (saradc->irq < 0) {
> +		u32 reg;
> +
> +		return readl_poll_timeout(saradc->regs + SOPHGO_SARADC_STATUS_REG,
> +					  reg, !(reg & SOPHGO_SARADC_BUSY),
> +					  500, 1000000);
> +	} else {

Returned above, so no need for else which helps with indent.


> +		int ret;
> +
> +		ret = wait_for_completion_timeout(&saradc->completion,
> +						  msecs_to_jiffies(1000)) > 0
> +						  ? 0 : -ETIMEDOUT;
> +		return ret;
return wait_for_completion.
> +	}
> +}
> +
> +static int sophgo_saradc_read_raw(struct iio_dev *indio_dev,
> +				  struct iio_chan_spec const *chan,
> +				  int *val, int *val2, long mask)
> +{
> +	switch (mask) {
> +	case IIO_CHAN_INFO_RAW:
> +		struct sophgo_saradc *saradc = iio_priv(indio_dev);
> +		u32 sample;
> +		int ret;
> +
> +		mutex_lock(&saradc->lock);

Use scoped_guard() here so you can return directly on error.

> +		sophgo_saradc_start_measurement(saradc, chan->scan_index);
> +		ret = sophgo_saradc_wait(saradc);
> +		if (ret < 0) {
> +			mutex_unlock(&saradc->lock);
> +			return ret;
> +		}
> +
> +		sample = readl(saradc->regs + SOPHGO_SARADC_CH_RESULT_REG(chan->scan_index));
> +		mutex_unlock(&saradc->lock);
> +
> +		if (SARADC_CH_VALID(sample)) {
> +			*val = SARADC_CH_RESULT(sample);
> +			return IIO_VAL_INT;
> +		}
errors out of line preferred.
		if (!SARADC_CH_VALID(sample))
			return -ENODATA;

		*val...

> +		return -ENODATA;
> +	case IIO_CHAN_INFO_SCALE:
> +		*val = 3300;
> +		*val2 = 12;
> +		return IIO_VAL_FRACTIONAL_LOG2;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static irqreturn_t sophgo_saradc_interrupt_handler(int irq, void *dev_id)
> +{
> +	struct sophgo_saradc *saradc = dev_id;

dev_id is an odd name for something that isn't an id.

No register to confirm the interupt status?  Fine if not, but relatively
unusual.

> +
> +	writel(1, saradc->regs + SOPHGO_SARADC_INTR_CLR_REG);
> +	complete(&saradc->completion);
> +	return IRQ_HANDLED;
> +}
> +

Single blank line

> +
> +static const struct of_device_id sophgo_saradc_match[] = {
> +	{ .compatible = "sophgo,cv18xx-saradc", },
> +	{ },
No comma needed on 'null' terminators like this as we won't
ever add anything after them.

> +};
> +MODULE_DEVICE_TABLE(of, sophgo_saradc_match);
> +
> +static int sophgo_saradc_probe(struct platform_device *pdev)
> +{
> +	struct sophgo_saradc *saradc;
> +	struct iio_dev *indio_dev;
> +	int ret;
> +
> +	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*saradc));
> +	if (!indio_dev)
> +		return -ENOMEM;
> +
> +	saradc = iio_priv(indio_dev);
> +	indio_dev->name = "Sophgo SARADC";

Hmm. Whilst the ABI docs don't say it, I don't think we have names with
either capitals or spaces.  sophgo-saradc or similar preferred.

> +	indio_dev->info = &saradc->info;

This is making some static const data dynamic. I can't see why you'd do this

> +	indio_dev->modes = INDIO_DIRECT_MODE;
> +	indio_dev->num_channels = 3;

ARRAY_SIZE(sophgo_channels)

> +	indio_dev->channels = sophgo_channels;
> +
> +	saradc->clk = devm_clk_get(&pdev->dev, NULL);

If it's optional, then use dev_clk_get_optional()

> +	if (IS_ERR(saradc->clk)) {
> +		dev_dbg(&pdev->dev, "Can't get clock from device tree, using No-Die domain");
> +	} else {
> +		ret = clk_prepare_enable(saradc->clk);

Perhaps devm_clk_get_optional_enabled() is appropriate, then
you can use null return to detect that it wasn't present - vs an ERR_PTR() for
it was but didn't enable.

> +		if (ret)
> +			return ret;
> +	}
> +
> +	saradc->regs = devm_platform_ioremap_resource(pdev, 0);
> +	if (IS_ERR(saradc->regs)) {
> +		ret = PTR_ERR(saradc->regs);
> +		goto error_disable_clock;
> +	}
> +
> +	saradc->irq = platform_get_irq_optional(pdev, 0);
> +	if (saradc->irq >= 0) {
> +		ret = devm_request_irq(&pdev->dev, saradc->irq,
> +				sophgo_saradc_interrupt_handler, 0,
> +				dev_name(&pdev->dev), saradc);
> +		if (ret)
> +			goto error_disable_clock;
> +
> +		writel(1, saradc->regs + SOPHGO_SARADC_INTR_EN_REG);
> +
> +		init_completion(&saradc->completion);
Usually best to init a completion that is irq related before requesting
the irq. Avoids any possible races.

> +	}
> +
> +	saradc->info.read_raw = &sophgo_saradc_read_raw;
Why?  
> +
> +	mutex_init(&saradc->lock);
> +	platform_set_drvdata(pdev, indio_dev);
> +	writel(SOPHGO_SARADC_DEF_CYC_SETTINGS, saradc->regs + SOPHGO_SARADC_CYC_SET_REG);
> +	ret = devm_iio_device_register(&pdev->dev, indio_dev);
> +	if (ret)
> +		goto error_disable_clock;
> +
> +	return 0;
> +
> +error_disable_clock:
> +	if (!IS_ERR(saradc->clk))
Don't mix and match devm and non devm management.
As above, I think you can just use devm_clk_get_optional_enabled()

> +		clk_disable_unprepare(saradc->clk);
> +	return ret;
> +}
> +
> +static void sophgo_saradc_remove(struct platform_device *pdev)
> +{
> +	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
> +	struct sophgo_saradc *saradc = iio_priv(indio_dev);
> +
> +	if (!IS_ERR(saradc->clk))
> +		clk_disable_unprepare(saradc->clk);
> +}
> +

Single blank line is enough.

> +
> +static struct platform_driver sophgo_saradc_driver = {
> +	.driver	= {
> +		.name		= "sophgo-saradc",
> +		.of_match_table	= sophgo_saradc_match,
> +	},
> +	.probe = sophgo_saradc_probe,
> +	.remove_new = sophgo_saradc_remove,
> +};
> +module_platform_driver(sophgo_saradc_driver);
> +
> +MODULE_AUTHOR("Thomas Bonnefille <thomas.bonnefille@bootlin.com>");
> +MODULE_DESCRIPTION("Sophgo SARADC driver");
> +MODULE_LICENSE("GPL");
> 


_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

  reply	other threads:[~2024-07-02 17:01 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-02 11:52 [PATCH 0/3] Add SARADC support on Sophgo SoC Thomas Bonnefille
2024-07-02 11:52 ` Thomas Bonnefille
2024-07-02 11:52 ` [PATCH 1/3] dt-bindings: iio: adc: sophgo,cv18xx-saradc.yaml: Add Sophgo SARADC binding documentation Thomas Bonnefille
2024-07-02 11:52   ` Thomas Bonnefille
2024-07-02 13:30   ` Rob Herring (Arm)
2024-07-02 13:30     ` Rob Herring (Arm)
2024-07-03  0:04   ` Chen Wang
2024-07-03  0:04     ` Chen Wang
2024-07-03  5:08   ` Krzysztof Kozlowski
2024-07-03  5:08     ` Krzysztof Kozlowski
2024-07-04  8:35     ` Thomas Bonnefille
2024-07-04  8:35       ` Thomas Bonnefille
2024-07-04  8:39       ` Krzysztof Kozlowski
2024-07-04  8:39         ` Krzysztof Kozlowski
2024-07-04  8:52         ` Thomas Bonnefille
2024-07-04  8:52           ` Thomas Bonnefille
2024-07-04  8:55           ` Inochi Amaoto
2024-07-04  8:55             ` Inochi Amaoto
2024-07-04 10:47           ` Krzysztof Kozlowski
2024-07-04 10:47             ` Krzysztof Kozlowski
2024-07-02 11:52 ` [PATCH 2/3] iio: adc: sophgo-saradc: Add driver for Sophgo SARADC Thomas Bonnefille
2024-07-02 11:52   ` Thomas Bonnefille
2024-07-02 17:01   ` Jonathan Cameron [this message]
2024-07-02 17:01     ` Jonathan Cameron
2024-07-03  0:18   ` Chen Wang
2024-07-03  0:18     ` Chen Wang
2024-07-02 11:52 ` [PATCH 3/3] riscv: dts: sophgo: Add SARADC configuration Thomas Bonnefille
2024-07-02 11:52   ` Thomas Bonnefille
2024-07-03  5:09   ` Krzysztof Kozlowski
2024-07-03  5:09     ` Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240702180100.00000096@Huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=inochiama@outlook.com \
    --cc=jic23@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=robh@kernel.org \
    --cc=thomas.bonnefille@bootlin.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=unicorn_wang@outlook.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.