| /* | 
 |  * Copyright (c) 2019 Peter Bigot Consulting, LLC | 
 |  * | 
 |  * SPDX-License-Identifier: Apache-2.0 | 
 |  */ | 
 |  | 
 | #include <drivers/adc.h> | 
 |  | 
 | int adc_gain_invert(enum adc_gain gain, | 
 | 		    int32_t *value) | 
 | { | 
 | 	struct gain_desc { | 
 | 		uint8_t mul; | 
 | 		uint8_t div; | 
 | 	}; | 
 | 	static const struct gain_desc gains[] = { | 
 | 		[ADC_GAIN_1_6] = {.mul = 6, .div = 1}, | 
 | 		[ADC_GAIN_1_5] = {.mul = 5, .div = 1}, | 
 | 		[ADC_GAIN_1_4] = {.mul = 4, .div = 1}, | 
 | 		[ADC_GAIN_1_3] = {.mul = 3, .div = 1}, | 
 | 		[ADC_GAIN_1_2] = {.mul = 2, .div = 1}, | 
 | 		[ADC_GAIN_2_3] = {.mul = 3, .div = 2}, | 
 | 		[ADC_GAIN_1] = {.mul = 1, .div = 1}, | 
 | 		[ADC_GAIN_2] = {.mul = 1, .div = 2}, | 
 | 		[ADC_GAIN_3] = {.mul = 1, .div = 3}, | 
 | 		[ADC_GAIN_4] = {.mul = 1, .div = 4}, | 
 | 		[ADC_GAIN_8] = {.mul = 1, .div = 8}, | 
 | 		[ADC_GAIN_16] = {.mul = 1, .div = 16}, | 
 | 		[ADC_GAIN_32] = {.mul = 1, .div = 32}, | 
 | 		[ADC_GAIN_64] = {.mul = 1, .div = 64}, | 
 | 		[ADC_GAIN_128] = {.mul = 1, .div = 128}, | 
 | 	}; | 
 | 	int rv = -EINVAL; | 
 |  | 
 | 	if ((uint8_t)gain < ARRAY_SIZE(gains)) { | 
 | 		const struct gain_desc *gdp = &gains[gain]; | 
 |  | 
 | 		if ((gdp->mul != 0) && (gdp->div != 0)) { | 
 | 			*value = (gdp->mul * *value) / gdp->div; | 
 | 			rv = 0; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return rv; | 
 | } |