Lines Matching refs:tscadc
37 void am335x_tsc_se_set_cache(struct ti_tscadc_dev *tscadc, u32 val) in am335x_tsc_se_set_cache() argument
41 spin_lock_irqsave(&tscadc->reg_lock, flags); in am335x_tsc_se_set_cache()
42 tscadc->reg_se_cache |= val; in am335x_tsc_se_set_cache()
43 if (tscadc->adc_waiting) in am335x_tsc_se_set_cache()
44 wake_up(&tscadc->reg_se_wait); in am335x_tsc_se_set_cache()
45 else if (!tscadc->adc_in_use) in am335x_tsc_se_set_cache()
46 regmap_write(tscadc->regmap, REG_SE, tscadc->reg_se_cache); in am335x_tsc_se_set_cache()
48 spin_unlock_irqrestore(&tscadc->reg_lock, flags); in am335x_tsc_se_set_cache()
52 static void am335x_tscadc_need_adc(struct ti_tscadc_dev *tscadc) in am335x_tscadc_need_adc() argument
57 regmap_read(tscadc->regmap, REG_ADCFSM, ®); in am335x_tscadc_need_adc()
59 tscadc->adc_waiting = true; in am335x_tscadc_need_adc()
60 prepare_to_wait(&tscadc->reg_se_wait, &wait, in am335x_tscadc_need_adc()
62 spin_unlock_irq(&tscadc->reg_lock); in am335x_tscadc_need_adc()
66 spin_lock_irq(&tscadc->reg_lock); in am335x_tscadc_need_adc()
67 finish_wait(&tscadc->reg_se_wait, &wait); in am335x_tscadc_need_adc()
73 regmap_read(tscadc->regmap, REG_ADCFSM, ®); in am335x_tscadc_need_adc()
75 tscadc->adc_waiting = false; in am335x_tscadc_need_adc()
77 tscadc->adc_in_use = true; in am335x_tscadc_need_adc()
80 void am335x_tsc_se_set_once(struct ti_tscadc_dev *tscadc, u32 val) in am335x_tsc_se_set_once() argument
82 spin_lock_irq(&tscadc->reg_lock); in am335x_tsc_se_set_once()
83 am335x_tscadc_need_adc(tscadc); in am335x_tsc_se_set_once()
85 regmap_write(tscadc->regmap, REG_SE, val); in am335x_tsc_se_set_once()
86 spin_unlock_irq(&tscadc->reg_lock); in am335x_tsc_se_set_once()
90 void am335x_tsc_se_adc_done(struct ti_tscadc_dev *tscadc) in am335x_tsc_se_adc_done() argument
94 spin_lock_irqsave(&tscadc->reg_lock, flags); in am335x_tsc_se_adc_done()
95 tscadc->adc_in_use = false; in am335x_tsc_se_adc_done()
96 regmap_write(tscadc->regmap, REG_SE, tscadc->reg_se_cache); in am335x_tsc_se_adc_done()
97 spin_unlock_irqrestore(&tscadc->reg_lock, flags); in am335x_tsc_se_adc_done()
101 void am335x_tsc_se_clr(struct ti_tscadc_dev *tscadc, u32 val) in am335x_tsc_se_clr() argument
105 spin_lock_irqsave(&tscadc->reg_lock, flags); in am335x_tsc_se_clr()
106 tscadc->reg_se_cache &= ~val; in am335x_tsc_se_clr()
107 regmap_write(tscadc->regmap, REG_SE, tscadc->reg_se_cache); in am335x_tsc_se_clr()
108 spin_unlock_irqrestore(&tscadc->reg_lock, flags); in am335x_tsc_se_clr()
112 static void tscadc_idle_config(struct ti_tscadc_dev *tscadc) in tscadc_idle_config() argument
119 regmap_write(tscadc->regmap, REG_IDLECONFIG, idleconfig); in tscadc_idle_config()
124 struct ti_tscadc_dev *tscadc; in ti_tscadc_probe() local
171 tscadc = devm_kzalloc(&pdev->dev, sizeof(*tscadc), GFP_KERNEL); in ti_tscadc_probe()
172 if (!tscadc) in ti_tscadc_probe()
175 tscadc->dev = &pdev->dev; in ti_tscadc_probe()
182 tscadc->irq = err; in ti_tscadc_probe()
185 tscadc->tscadc_phys_base = res->start; in ti_tscadc_probe()
186 tscadc->tscadc_base = devm_ioremap_resource(&pdev->dev, res); in ti_tscadc_probe()
187 if (IS_ERR(tscadc->tscadc_base)) in ti_tscadc_probe()
188 return PTR_ERR(tscadc->tscadc_base); in ti_tscadc_probe()
190 tscadc->regmap = devm_regmap_init_mmio(&pdev->dev, in ti_tscadc_probe()
191 tscadc->tscadc_base, &tscadc_regmap_config); in ti_tscadc_probe()
192 if (IS_ERR(tscadc->regmap)) { in ti_tscadc_probe()
194 err = PTR_ERR(tscadc->regmap); in ti_tscadc_probe()
198 spin_lock_init(&tscadc->reg_lock); in ti_tscadc_probe()
199 init_waitqueue_head(&tscadc->reg_se_wait); in ti_tscadc_probe()
219 tscadc->clk_div = clock_rate / ADC_CLK; in ti_tscadc_probe()
222 tscadc->clk_div--; in ti_tscadc_probe()
223 regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div); in ti_tscadc_probe()
227 regmap_write(tscadc->regmap, REG_CTRL, ctrl); in ti_tscadc_probe()
231 tscadc->tsc_wires = tsc_wires; in ti_tscadc_probe()
236 tscadc_idle_config(tscadc); in ti_tscadc_probe()
241 regmap_write(tscadc->regmap, REG_CTRL, ctrl); in ti_tscadc_probe()
243 tscadc->used_cells = 0; in ti_tscadc_probe()
244 tscadc->tsc_cell = -1; in ti_tscadc_probe()
245 tscadc->adc_cell = -1; in ti_tscadc_probe()
249 tscadc->tsc_cell = tscadc->used_cells; in ti_tscadc_probe()
250 cell = &tscadc->cells[tscadc->used_cells++]; in ti_tscadc_probe()
253 cell->platform_data = &tscadc; in ti_tscadc_probe()
254 cell->pdata_size = sizeof(tscadc); in ti_tscadc_probe()
259 tscadc->adc_cell = tscadc->used_cells; in ti_tscadc_probe()
260 cell = &tscadc->cells[tscadc->used_cells++]; in ti_tscadc_probe()
263 cell->platform_data = &tscadc; in ti_tscadc_probe()
264 cell->pdata_size = sizeof(tscadc); in ti_tscadc_probe()
268 tscadc->cells, tscadc->used_cells, NULL, in ti_tscadc_probe()
273 platform_set_drvdata(pdev, tscadc); in ti_tscadc_probe()
285 struct ti_tscadc_dev *tscadc = platform_get_drvdata(pdev); in ti_tscadc_remove() local
287 regmap_write(tscadc->regmap, REG_SE, 0x00); in ti_tscadc_remove()
292 mfd_remove_devices(tscadc->dev); in ti_tscadc_remove()
304 struct ti_tscadc_dev *tscadc = dev_get_drvdata(dev); in tscadc_suspend() local
306 regmap_write(tscadc->regmap, REG_SE, 0x00); in tscadc_suspend()
310 regmap_read(tscadc->regmap, REG_CTRL, &ctrl); in tscadc_suspend()
313 regmap_write(tscadc->regmap, REG_CTRL, ctrl); in tscadc_suspend()
322 struct ti_tscadc_dev *tscadc = dev_get_drvdata(dev); in tscadc_resume() local
329 regmap_write(tscadc->regmap, REG_CTRL, ctrl); in tscadc_resume()
331 if (tscadc->tsc_cell != -1) { in tscadc_resume()
332 if (tscadc->tsc_wires == 5) in tscadc_resume()
336 tscadc_idle_config(tscadc); in tscadc_resume()
339 regmap_write(tscadc->regmap, REG_CTRL, ctrl); in tscadc_resume()
341 regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div); in tscadc_resume()