Message ID | 20240223-saradcv2-chan-mask-v1-2-84b06a0f623a@theobroma-systems.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iio: adc: rockchip_saradc: fix bitmasking and remove custom logic for getting reset | expand |
Am Freitag, 23. Februar 2024, 13:45:22 CET schrieb Quentin Schulz: > From: Quentin Schulz <quentin.schulz@theobroma-systems.com> > > Some of the registers on the SARADCv2 have bits write protected except > if another bit is set. This is usually done by having the lowest 16 bits > store the data to write and the highest 16 bits specify which of the 16 > lowest bits should have their value written to the hardware block. > > The write_enable mask for the channel selection was incorrect because it > was just the value shifted by 16 bits, which means it would only ever > write bits and never clear them. So e.g. if someone starts a conversion > on channel 5, the lowest 4 bits would be 0x5, then starts a conversion > on channel 0, it would still be 5. > > Instead of shifting the value by 16 as the mask, let's use the OR'ing of > the appropriate masks shifted by 16. > > Note that this is not an issue currently because the only SARADCv2 > currently supported has a reset defined in its Device Tree, that reset > resets the SARADC controller before starting a conversion on a channel. > However, this reset is handled as optional by the probe function and > thus proper masking should be used in the event an SARADCv2 without a > reset ever makes it upstream. > > Fixes: 757953f8ec69 ("iio: adc: rockchip_saradc: Add support for RK3588") > Cc: Quentin Schulz <foss+kernel@0leil.net> > Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> Reviewed-by: Heiko Stuebner <heiko@sntech.de>
diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 2da8d6f3241a..1c0042fbbb54 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -102,12 +102,12 @@ static void rockchip_saradc_start_v2(struct rockchip_saradc *info, int chn) writel_relaxed(0xc, info->regs + SARADC_T_DAS_SOC); writel_relaxed(0x20, info->regs + SARADC_T_PD_SOC); val = FIELD_PREP(SARADC2_EN_END_INT, 1); - val |= val << 16; + val |= SARADC2_EN_END_INT << 16; writel_relaxed(val, info->regs + SARADC2_END_INT_EN); val = FIELD_PREP(SARADC2_START, 1) | FIELD_PREP(SARADC2_SINGLE_MODE, 1) | FIELD_PREP(SARADC2_CONV_CHANNELS, chn); - val |= val << 16; + val |= (SARADC2_START | SARADC2_SINGLE_MODE | SARADC2_CONV_CHANNELS) << 16; writel(val, info->regs + SARADC2_CONV_CON); }