Ejemplo n.º 1
0
static int jz4740_adc_cell_enable(struct platform_device *pdev)
{
	struct jz4740_adc *adc = dev_get_drvdata(pdev->dev.parent);

	jz4740_adc_clk_enable(adc);
	jz4740_adc_set_enabled(adc, pdev->id, true);

	return 0;
}
Ejemplo n.º 2
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