Commit db6bcb8c authored by Tomer Maimon's avatar Tomer Maimon Committed by Jonathan Cameron
Browse files

iio: adc: modify NPCM reset support



Modify NPCM ADC reset support from
direct register access to reset controller support.

please make sure to modify NPCM adc device tree
parameters as described at nuvoton,npcm-adc.txt
document for using this change.

Note for anyone noting that this is a breaking change, this is on
a BMC and effectively in a close ecosystem so it is fine to rely
on DT and kernel being updated together.

Signed-off-by: default avatarTomer Maimon <tmaimon77@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 816abe42
Loading
Loading
Loading
Loading
+9 −21
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/regulator/consumer.h>
#include <linux/spinlock.h>
#include <linux/uaccess.h>
#include <linux/reset.h>

struct npcm_adc {
	bool int_status;
@@ -23,13 +24,9 @@ struct npcm_adc {
	struct clk *adc_clk;
	wait_queue_head_t wq;
	struct regulator *vref;
	struct regmap *rst_regmap;
	struct reset_control *reset;
};

/* NPCM7xx reset module */
#define NPCM7XX_IPSRST1_OFFSET		0x020
#define NPCM7XX_IPSRST1_ADC_RST		BIT(27)

/* ADC registers */
#define NPCM_ADCCON	 0x00
#define NPCM_ADCDATA	 0x04
@@ -106,13 +103,11 @@ static int npcm_adc_read(struct npcm_adc *info, int *val, u8 channel)
					       msecs_to_jiffies(10));
	if (ret == 0) {
		regtemp = ioread32(info->regs + NPCM_ADCCON);
		if ((regtemp & NPCM_ADCCON_ADC_CONV) && info->rst_regmap) {
		if (regtemp & NPCM_ADCCON_ADC_CONV) {
			/* if conversion failed - reset ADC module */
			regmap_write(info->rst_regmap, NPCM7XX_IPSRST1_OFFSET,
				     NPCM7XX_IPSRST1_ADC_RST);
			reset_control_assert(info->reset);
			msleep(100);
			regmap_write(info->rst_regmap, NPCM7XX_IPSRST1_OFFSET,
				     0x0);
			reset_control_deassert(info->reset);
			msleep(100);

			/* Enable ADC and start conversion module */
@@ -186,7 +181,6 @@ static int npcm_adc_probe(struct platform_device *pdev)
	struct npcm_adc *info;
	struct iio_dev *indio_dev;
	struct device *dev = &pdev->dev;
	struct device_node *np = pdev->dev.of_node;

	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
	if (!indio_dev)
@@ -199,6 +193,10 @@ static int npcm_adc_probe(struct platform_device *pdev)
	if (IS_ERR(info->regs))
		return PTR_ERR(info->regs);

	info->reset = devm_reset_control_get(&pdev->dev, NULL);
	if (IS_ERR(info->reset))
		return PTR_ERR(info->reset);

	info->adc_clk = devm_clk_get(&pdev->dev, NULL);
	if (IS_ERR(info->adc_clk)) {
		dev_warn(&pdev->dev, "ADC clock failed: can't read clk\n");
@@ -211,16 +209,6 @@ static int npcm_adc_probe(struct platform_device *pdev)
	div = div >> NPCM_ADCCON_DIV_SHIFT;
	info->adc_sample_hz = clk_get_rate(info->adc_clk) / ((div + 1) * 2);

	if (of_device_is_compatible(np, "nuvoton,npcm750-adc")) {
		info->rst_regmap = syscon_regmap_lookup_by_compatible
			("nuvoton,npcm750-rst");
		if (IS_ERR(info->rst_regmap)) {
			dev_err(&pdev->dev, "Failed to find nuvoton,npcm750-rst\n");
			ret = PTR_ERR(info->rst_regmap);
			goto err_disable_clk;
		}
	}

	irq = platform_get_irq(pdev, 0);
	if (irq <= 0) {
		ret = -EINVAL;