iio: adc: modify NPCM reset support
authorTomer Maimon <tmaimon77@gmail.com>
Mon, 3 Feb 2020 15:09:17 +0000 (17:09 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 14 Feb 2020 15:06:24 +0000 (15:06 +0000)
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: Tomer Maimon <tmaimon77@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/npcm_adc.c

index a6170a3..83bad2d 100644 (file)
@@ -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;