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: Tomer Maimon <tmaimon77@gmail.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Родитель
816abe42b8
Коммит
db6bcb8c25
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче