Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: adc: Enable multiple consecutive channels based on model data

Add helpers to generate channel masks and enable multiple ADC channels
according to the device model's channel count.

Signed-off-by: Billy Tsai <billy_tsai@aspeedtech.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Billy Tsai and committed by
Jonathan Cameron
9ee1c3be a28069be

+21 -1
+21 -1
drivers/iio/adc/aspeed_adc.c
··· 123 123 struct adc_gain battery_mode_gain; 124 124 }; 125 125 126 + /* 127 + * Enable multiple consecutive channels starting from channel 0. 128 + * This creates a bitmask for channels 0 to (num_channels - 1). 129 + * For example: num_channels=3 creates mask 0x0007 (channels 0,1,2) 130 + */ 131 + static inline u32 aspeed_adc_channels_mask(unsigned int num_channels) 132 + { 133 + if (num_channels > 16) 134 + return GENMASK(15, 0); 135 + 136 + return BIT(num_channels) - 1; 137 + } 138 + 139 + static inline unsigned int aspeed_adc_get_active_channels(const struct aspeed_adc_data *data) 140 + { 141 + return data->model_data->num_channels; 142 + } 143 + 126 144 #define ASPEED_CHAN(_idx, _data_reg_addr) { \ 127 145 .type = IIO_VOLTAGE, \ 128 146 .indexed = 1, \ ··· 630 612 /* Start all channels in normal mode. */ 631 613 adc_engine_control_reg_val = 632 614 readl(data->base + ASPEED_REG_ENGINE_CONTROL); 633 - adc_engine_control_reg_val |= ASPEED_ADC_CTRL_CHANNEL; 615 + FIELD_MODIFY(ASPEED_ADC_CTRL_CHANNEL, &adc_engine_control_reg_val, 616 + aspeed_adc_channels_mask(aspeed_adc_get_active_channels(data))); 617 + 634 618 writel(adc_engine_control_reg_val, 635 619 data->base + ASPEED_REG_ENGINE_CONTROL); 636 620