static int jz4740_adc_cell_disable(struct platform_device *pdev) { struct jz4740_adc *adc = dev_get_drvdata(pdev->dev.parent); jz4740_adc_set_enabled(adc, pdev->id, false); jz4740_adc_clk_disable(adc); return 0; }
long jz4740_adc_read_battery_voltage(struct device *dev, enum jz_adc_battery_scale scale) { struct jz4740_adc *adc = dev_get_drvdata(dev); unsigned long t; long long voltage; uint16_t val; if (!adc) return -ENODEV; jz4740_adc_clk_enable(adc); if (scale == JZ_ADC_BATTERY_SCALE_2V5) jz4740_adc_set_cfg(adc, JZ_ADC_CFG_BAT_MB, JZ_ADC_CFG_BAT_MB); else jz4740_adc_set_cfg(adc, JZ_ADC_CFG_BAT_MB, 0); jz4740_adc_enable_irq(adc, JZ_ADC_IRQ_BATTERY); jz4740_adc_enable_adc(adc, JZ_ADC_ENABLE_BATTERY); t = wait_for_completion_interruptible_timeout(&adc->bat_completion, HZ); jz4740_adc_disable_irq(adc, JZ_ADC_IRQ_BATTERY); if (t <= 0) { jz4740_adc_disable_adc(adc, JZ_ADC_ENABLE_BATTERY); return t ? t : -ETIMEDOUT; } val = readw(adc->base + JZ_REG_ADC_BATTERY); jz4740_adc_clk_disable(adc); if (scale == JZ_ADC_BATTERY_SCALE_2V5) voltage = (((long long)val) * 2500000LL) >> 12LL; else