Lines Matching refs:adc
98 int (*init_clk_div)(struct device *dev, struct ingenic_adc *adc);
112 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_set_adcmd() local
114 mutex_lock(&adc->lock); in ingenic_adc_set_adcmd()
117 readl(adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
124 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
130 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
138 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
144 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
151 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
156 adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
160 writel(0, adc->base + JZ_ADC_REG_ADCMD); in ingenic_adc_set_adcmd()
162 mutex_unlock(&adc->lock); in ingenic_adc_set_adcmd()
165 static void ingenic_adc_set_config(struct ingenic_adc *adc, in ingenic_adc_set_config() argument
171 mutex_lock(&adc->lock); in ingenic_adc_set_config()
173 cfg = readl(adc->base + JZ_ADC_REG_CFG) & ~mask; in ingenic_adc_set_config()
175 writel(cfg, adc->base + JZ_ADC_REG_CFG); in ingenic_adc_set_config()
177 mutex_unlock(&adc->lock); in ingenic_adc_set_config()
180 static void ingenic_adc_enable_unlocked(struct ingenic_adc *adc, in ingenic_adc_enable_unlocked() argument
186 val = readb(adc->base + JZ_ADC_REG_ENABLE); in ingenic_adc_enable_unlocked()
193 writeb(val, adc->base + JZ_ADC_REG_ENABLE); in ingenic_adc_enable_unlocked()
196 static void ingenic_adc_enable(struct ingenic_adc *adc, in ingenic_adc_enable() argument
200 mutex_lock(&adc->lock); in ingenic_adc_enable()
201 ingenic_adc_enable_unlocked(adc, engine, enabled); in ingenic_adc_enable()
202 mutex_unlock(&adc->lock); in ingenic_adc_enable()
205 static int ingenic_adc_capture(struct ingenic_adc *adc, in ingenic_adc_capture() argument
217 mutex_lock(&adc->lock); in ingenic_adc_capture()
218 cfg = readl(adc->base + JZ_ADC_REG_CFG); in ingenic_adc_capture()
219 writel(cfg & ~JZ_ADC_REG_CFG_CMD_SEL, adc->base + JZ_ADC_REG_CFG); in ingenic_adc_capture()
221 ingenic_adc_enable_unlocked(adc, engine, true); in ingenic_adc_capture()
222 ret = readb_poll_timeout(adc->base + JZ_ADC_REG_ENABLE, val, in ingenic_adc_capture()
225 ingenic_adc_enable_unlocked(adc, engine, false); in ingenic_adc_capture()
227 writel(cfg, adc->base + JZ_ADC_REG_CFG); in ingenic_adc_capture()
228 mutex_unlock(&adc->lock); in ingenic_adc_capture()
239 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_write_raw() local
247 if (!adc->soc_data->battery_vref_mode) in ingenic_adc_write_raw()
250 ret = clk_enable(adc->clk); in ingenic_adc_write_raw()
258 ingenic_adc_set_config(adc, in ingenic_adc_write_raw()
261 adc->low_vref_mode = false; in ingenic_adc_write_raw()
263 ingenic_adc_set_config(adc, in ingenic_adc_write_raw()
266 adc->low_vref_mode = true; in ingenic_adc_write_raw()
269 clk_disable(adc->clk); in ingenic_adc_write_raw()
306 static int jz4725b_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc) in jz4725b_adc_init_clk_div() argument
312 parent_clk = clk_get_parent(adc->clk); in jz4725b_adc_init_clk_div()
337 adc->base + JZ_ADC_REG_ADCLK); in jz4725b_adc_init_clk_div()
342 static int jz4770_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc) in jz4770_adc_init_clk_div() argument
348 parent_clk = clk_get_parent(adc->clk); in jz4770_adc_init_clk_div()
375 adc->base + JZ_ADC_REG_ADCLK); in jz4770_adc_init_clk_div()
550 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_read_avail() local
555 *length = adc->soc_data->battery_raw_avail_size; in ingenic_adc_read_avail()
556 *vals = adc->soc_data->battery_raw_avail; in ingenic_adc_read_avail()
560 *length = adc->soc_data->battery_scale_avail_size; in ingenic_adc_read_avail()
561 *vals = adc->soc_data->battery_scale_avail; in ingenic_adc_read_avail()
573 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_read_chan_info_raw() local
575 ret = clk_enable(adc->clk); in ingenic_adc_read_chan_info_raw()
583 mutex_lock(&adc->aux_lock); in ingenic_adc_read_chan_info_raw()
584 if (adc->soc_data->has_aux2 && engine == 0) { in ingenic_adc_read_chan_info_raw()
586 ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_AUX_MD, bit); in ingenic_adc_read_chan_info_raw()
589 ret = ingenic_adc_capture(adc, engine); in ingenic_adc_read_chan_info_raw()
596 *val = readw(adc->base + JZ_ADC_REG_ADSDAT); in ingenic_adc_read_chan_info_raw()
599 *val = readw(adc->base + JZ_ADC_REG_ADBDAT); in ingenic_adc_read_chan_info_raw()
605 mutex_unlock(&adc->aux_lock); in ingenic_adc_read_chan_info_raw()
606 clk_disable(adc->clk); in ingenic_adc_read_chan_info_raw()
617 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_read_raw() local
630 if (adc->low_vref_mode) { in ingenic_adc_read_raw()
634 *val = adc->soc_data->battery_high_vref; in ingenic_adc_read_raw()
635 *val2 = adc->soc_data->battery_high_vref_bits; in ingenic_adc_read_raw()
675 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_buffer_enable() local
678 ret = clk_enable(adc->clk); in ingenic_adc_buffer_enable()
687 ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_TOUCH_OPS_MASK, in ingenic_adc_buffer_enable()
691 writew(80, adc->base + JZ_ADC_REG_ADWAIT); in ingenic_adc_buffer_enable()
692 writew(2, adc->base + JZ_ADC_REG_ADSAME); in ingenic_adc_buffer_enable()
693 writeb((u8)~JZ_ADC_IRQ_TOUCH, adc->base + JZ_ADC_REG_CTRL); in ingenic_adc_buffer_enable()
694 writel(0, adc->base + JZ_ADC_REG_ADTCH); in ingenic_adc_buffer_enable()
696 ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_CMD_SEL, in ingenic_adc_buffer_enable()
700 ingenic_adc_enable(adc, 2, true); in ingenic_adc_buffer_enable()
707 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_buffer_disable() local
709 ingenic_adc_enable(adc, 2, false); in ingenic_adc_buffer_disable()
711 ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_CMD_SEL, 0); in ingenic_adc_buffer_disable()
713 writeb(0xff, adc->base + JZ_ADC_REG_CTRL); in ingenic_adc_buffer_disable()
714 writeb(0xff, adc->base + JZ_ADC_REG_STATUS); in ingenic_adc_buffer_disable()
715 ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_TOUCH_OPS_MASK, 0); in ingenic_adc_buffer_disable()
716 writew(0, adc->base + JZ_ADC_REG_ADSAME); in ingenic_adc_buffer_disable()
717 writew(0, adc->base + JZ_ADC_REG_ADWAIT); in ingenic_adc_buffer_disable()
718 clk_disable(adc->clk); in ingenic_adc_buffer_disable()
731 struct ingenic_adc *adc = iio_priv(iio_dev); in ingenic_adc_irq() local
738 tdat[i] = readl(adc->base + JZ_ADC_REG_ADTCH); in ingenic_adc_irq()
744 writeb(JZ_ADC_IRQ_TOUCH, adc->base + JZ_ADC_REG_STATUS); in ingenic_adc_irq()
753 struct ingenic_adc *adc; in ingenic_adc_probe() local
761 iio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in ingenic_adc_probe()
765 adc = iio_priv(iio_dev); in ingenic_adc_probe()
766 mutex_init(&adc->lock); in ingenic_adc_probe()
767 mutex_init(&adc->aux_lock); in ingenic_adc_probe()
768 adc->soc_data = soc_data; in ingenic_adc_probe()
781 adc->base = devm_platform_ioremap_resource(pdev, 0); in ingenic_adc_probe()
782 if (IS_ERR(adc->base)) in ingenic_adc_probe()
783 return PTR_ERR(adc->base); in ingenic_adc_probe()
785 adc->clk = devm_clk_get(dev, "adc"); in ingenic_adc_probe()
786 if (IS_ERR(adc->clk)) { in ingenic_adc_probe()
788 return PTR_ERR(adc->clk); in ingenic_adc_probe()
791 ret = clk_prepare_enable(adc->clk); in ingenic_adc_probe()
799 ret = soc_data->init_clk_div(dev, adc); in ingenic_adc_probe()
801 clk_disable_unprepare(adc->clk); in ingenic_adc_probe()
807 writeb(0x00, adc->base + JZ_ADC_REG_ENABLE); in ingenic_adc_probe()
808 writeb(0xff, adc->base + JZ_ADC_REG_CTRL); in ingenic_adc_probe()
810 clk_disable(adc->clk); in ingenic_adc_probe()
812 ret = devm_add_action_or_reset(dev, ingenic_adc_clk_cleanup, adc->clk); in ingenic_adc_probe()