Lines Matching full:st

136 #define AT91_ADC_CHAN(st, ch) \  argument
137 (st->registers->channel_base + (ch * 4))
138 #define at91_adc_readl(st, reg) \ argument
139 (readl_relaxed(st->reg_base + reg))
140 #define at91_adc_writel(st, reg, val) \ argument
141 (writel_relaxed(val, st->reg_base + reg))
268 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_handler() local
276 st->buffer[j] = at91_adc_readl(st, AT91_ADC_CHAN(st, chan->channel)); in at91_adc_trigger_handler()
280 iio_push_to_buffers_with_timestamp(idev, st->buffer, pf->timestamp); in at91_adc_trigger_handler()
285 at91_adc_readl(st, AT91_ADC_LCDR); in at91_adc_trigger_handler()
287 enable_irq(st->irq); in at91_adc_trigger_handler()
295 struct at91_adc_state *st = iio_priv(idev); in handle_adc_eoc_trigger() local
301 st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb)); in handle_adc_eoc_trigger()
303 at91_adc_readl(st, AT91_ADC_LCDR); in handle_adc_eoc_trigger()
304 st->done = true; in handle_adc_eoc_trigger()
305 wake_up_interruptible(&st->wq_data_avail); in handle_adc_eoc_trigger()
311 struct at91_adc_state *st = iio_priv(idev); in at91_ts_sample() local
317 unsigned int xyz_mask_bits = st->res; in at91_ts_sample()
322 reg = at91_adc_readl(st, AT91_ADC_TSXPOSR); in at91_ts_sample()
333 reg = at91_adc_readl(st, AT91_ADC_TSYPOSR); in at91_ts_sample()
344 reg = at91_adc_readl(st, AT91_ADC_TSPRESSR); in at91_ts_sample()
352 pres = st->ts_pressure_threshold; /* no pen contacted */ in at91_ts_sample()
357 if (pres < st->ts_pressure_threshold) { in at91_ts_sample()
360 input_report_abs(st->ts_input, ABS_X, x); in at91_ts_sample()
361 input_report_abs(st->ts_input, ABS_Y, y); in at91_ts_sample()
362 input_report_abs(st->ts_input, ABS_PRESSURE, pres); in at91_ts_sample()
363 input_report_key(st->ts_input, BTN_TOUCH, 1); in at91_ts_sample()
364 input_sync(st->ts_input); in at91_ts_sample()
375 struct at91_adc_state *st = iio_priv(idev); in at91_adc_rl_interrupt() local
376 u32 status = at91_adc_readl(st, st->registers->status_register); in at91_adc_rl_interrupt()
379 status &= at91_adc_readl(st, AT91_ADC_IMR); in at91_adc_rl_interrupt()
380 if (status & GENMASK(st->num_channels - 1, 0)) in at91_adc_rl_interrupt()
385 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_adc_rl_interrupt()
387 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_rl_interrupt()
389 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); in at91_adc_rl_interrupt()
390 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_NOPEN in at91_adc_rl_interrupt()
393 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_rl_interrupt()
395 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val)); in at91_adc_rl_interrupt()
397 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_adc_rl_interrupt()
398 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; in at91_adc_rl_interrupt()
399 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_rl_interrupt()
400 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_rl_interrupt()
403 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_NOPEN in at91_adc_rl_interrupt()
405 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); in at91_adc_rl_interrupt()
406 st->ts_bufferedmeasure = false; in at91_adc_rl_interrupt()
407 input_report_key(st->ts_input, BTN_TOUCH, 0); in at91_adc_rl_interrupt()
408 input_sync(st->ts_input); in at91_adc_rl_interrupt()
409 } else if (status & AT91_ADC_EOC(3) && st->ts_input) { in at91_adc_rl_interrupt()
411 if (st->ts_bufferedmeasure) { in at91_adc_rl_interrupt()
417 input_report_abs(st->ts_input, ABS_X, st->ts_prev_absx); in at91_adc_rl_interrupt()
418 input_report_abs(st->ts_input, ABS_Y, st->ts_prev_absy); in at91_adc_rl_interrupt()
419 input_report_key(st->ts_input, BTN_TOUCH, 1); in at91_adc_rl_interrupt()
420 input_sync(st->ts_input); in at91_adc_rl_interrupt()
422 st->ts_bufferedmeasure = true; in at91_adc_rl_interrupt()
425 st->ts_prev_absx = at91_adc_readl(st, AT91_ADC_CHAN(st, 3)) in at91_adc_rl_interrupt()
427 st->ts_prev_absx /= at91_adc_readl(st, AT91_ADC_CHAN(st, 2)); in at91_adc_rl_interrupt()
429 st->ts_prev_absy = at91_adc_readl(st, AT91_ADC_CHAN(st, 1)) in at91_adc_rl_interrupt()
431 st->ts_prev_absy /= at91_adc_readl(st, AT91_ADC_CHAN(st, 0)); in at91_adc_rl_interrupt()
440 struct at91_adc_state *st = iio_priv(idev); in at91_adc_9x5_interrupt() local
441 u32 status = at91_adc_readl(st, st->registers->status_register); in at91_adc_9x5_interrupt()
447 if (status & GENMASK(st->num_channels - 1, 0)) in at91_adc_9x5_interrupt()
451 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); in at91_adc_9x5_interrupt()
452 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_NOPEN | in at91_adc_9x5_interrupt()
455 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_9x5_interrupt()
457 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val)); in at91_adc_9x5_interrupt()
459 at91_adc_writel(st, st->registers->trigger_register, 0); in at91_adc_9x5_interrupt()
460 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_NOPEN | in at91_adc_9x5_interrupt()
462 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); in at91_adc_9x5_interrupt()
464 input_report_key(st->ts_input, BTN_TOUCH, 0); in at91_adc_9x5_interrupt()
465 input_sync(st->ts_input); in at91_adc_9x5_interrupt()
476 at91_adc_readl(st, AT91_ADC_TSXPOSR); in at91_adc_9x5_interrupt()
477 at91_adc_readl(st, AT91_ADC_TSYPOSR); in at91_adc_9x5_interrupt()
478 at91_adc_readl(st, AT91_ADC_TSPRESSR); in at91_adc_9x5_interrupt()
487 struct at91_adc_state *st = iio_priv(idev); in at91_adc_channel_init() local
493 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE) in at91_adc_channel_init()
495 else if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_5WIRE) in at91_adc_channel_init()
499 st->channels_mask &= ~rsvd_mask; in at91_adc_channel_init()
501 idev->num_channels = bitmap_weight(&st->channels_mask, in at91_adc_channel_init()
502 st->num_channels) + 1; in at91_adc_channel_init()
512 for_each_set_bit(bit, &st->channels_mask, st->num_channels) { in at91_adc_channel_init()
520 chan->scan_type.realbits = st->res; in at91_adc_channel_init()
543 struct at91_adc_state *st = iio_priv(idev); in at91_adc_get_trigger_value_by_name() local
546 for (i = 0; i < st->caps->trigger_number; i++) { in at91_adc_get_trigger_value_by_name()
571 struct at91_adc_state *st = iio_priv(idev); in at91_adc_configure_trigger() local
572 const struct at91_adc_reg_desc *reg = st->registers; in at91_adc_configure_trigger()
573 u32 status = at91_adc_readl(st, reg->trigger_register); in at91_adc_configure_trigger()
578 st->caps->triggers, in at91_adc_configure_trigger()
584 st->buffer = kmalloc(idev->scan_bytes, GFP_KERNEL); in at91_adc_configure_trigger()
585 if (st->buffer == NULL) in at91_adc_configure_trigger()
588 at91_adc_writel(st, reg->trigger_register, in at91_adc_configure_trigger()
592 st->num_channels) { in at91_adc_configure_trigger()
594 at91_adc_writel(st, AT91_ADC_CHER, in at91_adc_configure_trigger()
598 at91_adc_writel(st, AT91_ADC_IER, reg->drdy_mask); in at91_adc_configure_trigger()
601 at91_adc_writel(st, AT91_ADC_IDR, reg->drdy_mask); in at91_adc_configure_trigger()
603 at91_adc_writel(st, reg->trigger_register, in at91_adc_configure_trigger()
607 st->num_channels) { in at91_adc_configure_trigger()
609 at91_adc_writel(st, AT91_ADC_CHDR, in at91_adc_configure_trigger()
612 kfree(st->buffer); in at91_adc_configure_trigger()
645 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_init() local
648 st->trig = devm_kcalloc(&idev->dev, in at91_adc_trigger_init()
649 st->caps->trigger_number, sizeof(*st->trig), in at91_adc_trigger_init()
652 if (st->trig == NULL) { in at91_adc_trigger_init()
657 for (i = 0; i < st->caps->trigger_number; i++) { in at91_adc_trigger_init()
658 if (st->caps->triggers[i].is_external && !(st->use_external)) in at91_adc_trigger_init()
661 st->trig[i] = at91_adc_allocate_trigger(idev, in at91_adc_trigger_init()
662 st->caps->triggers + i); in at91_adc_trigger_init()
663 if (st->trig[i] == NULL) { in at91_adc_trigger_init()
675 iio_trigger_unregister(st->trig[i]); in at91_adc_trigger_init()
676 iio_trigger_free(st->trig[i]); in at91_adc_trigger_init()
684 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_remove() local
687 for (i = 0; i < st->caps->trigger_number; i++) { in at91_adc_trigger_remove()
688 iio_trigger_unregister(st->trig[i]); in at91_adc_trigger_remove()
689 iio_trigger_free(st->trig[i]); in at91_adc_trigger_remove()
708 struct at91_adc_state *st = iio_priv(idev); in at91_adc_read_raw() local
713 mutex_lock(&st->lock); in at91_adc_read_raw()
715 st->chnb = chan->channel; in at91_adc_read_raw()
716 at91_adc_writel(st, AT91_ADC_CHER, in at91_adc_read_raw()
718 at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel)); in at91_adc_read_raw()
719 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START); in at91_adc_read_raw()
721 ret = wait_event_interruptible_timeout(st->wq_data_avail, in at91_adc_read_raw()
722 st->done, in at91_adc_read_raw()
728 at91_adc_writel(st, AT91_ADC_CHDR, in at91_adc_read_raw()
730 at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel)); in at91_adc_read_raw()
734 *val = st->last_value; in at91_adc_read_raw()
735 st->last_value = 0; in at91_adc_read_raw()
736 st->done = false; in at91_adc_read_raw()
745 mutex_unlock(&st->lock); in at91_adc_read_raw()
749 *val = st->vref_mv; in at91_adc_read_raw()
799 struct at91_adc_state *st, struct device *dev) in at91_adc_probe_dt_ts() argument
813 st->touchscreen_type = prop; in at91_adc_probe_dt_ts()
820 if (!st->caps->has_tsmr) in at91_adc_probe_dt_ts()
824 st->ts_pressure_threshold = prop; in at91_adc_probe_dt_ts()
825 if (st->ts_pressure_threshold) { in at91_adc_probe_dt_ts()
840 struct at91_adc_state *st = input_get_drvdata(dev); in atmel_ts_open() local
842 if (st->caps->has_tsmr) in atmel_ts_open()
843 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); in atmel_ts_open()
845 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); in atmel_ts_open()
851 struct at91_adc_state *st = input_get_drvdata(dev); in atmel_ts_close() local
853 if (st->caps->has_tsmr) in atmel_ts_close()
854 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); in atmel_ts_close()
856 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); in atmel_ts_close()
861 struct at91_adc_state *st = iio_priv(idev); in at91_ts_hw_init() local
870 st->ts_pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz / in at91_ts_hw_init()
873 while (st->ts_pendbc >> ++i) in at91_ts_hw_init()
875 if (abs(st->ts_pendbc - (1 << i)) < abs(st->ts_pendbc - (1 << (i - 1)))) in at91_ts_hw_init()
876 st->ts_pendbc = i; in at91_ts_hw_init()
878 st->ts_pendbc = i - 1; in at91_ts_hw_init()
880 if (!st->caps->has_tsmr) { in at91_ts_hw_init()
881 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_ts_hw_init()
884 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; in at91_ts_hw_init()
885 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_ts_hw_init()
888 at91_adc_writel(st, AT91_ADC_TSR, reg); in at91_ts_hw_init()
890 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US_RL * in at91_ts_hw_init()
904 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE) in at91_ts_hw_init()
910 reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average) in at91_ts_hw_init()
912 reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC; in at91_ts_hw_init()
917 at91_adc_writel(st, AT91_ADC_TSMR, reg); in at91_ts_hw_init()
924 at91_adc_writel(st, AT91_ADC_ACR, st->caps->ts_pen_detect_sensitivity in at91_ts_hw_init()
928 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US * in at91_ts_hw_init()
937 struct at91_adc_state *st = iio_priv(idev); in at91_ts_register() local
956 if (st->caps->has_tsmr) { in at91_ts_register()
963 if (st->touchscreen_type != ATMEL_ADC_TOUCHSCREEN_4WIRE) { in at91_ts_register()
976 st->ts_input = input; in at91_ts_register()
977 input_set_drvdata(input, st); in at91_ts_register()
986 input_free_device(st->ts_input); in at91_ts_register()
990 static void at91_ts_unregister(struct at91_adc_state *st) in at91_ts_unregister() argument
992 input_unregister_device(st->ts_input); in at91_ts_unregister()
1001 struct at91_adc_state *st; in at91_adc_probe() local
1009 st = iio_priv(idev); in at91_adc_probe()
1011 st->caps = of_device_get_match_data(&pdev->dev); in at91_adc_probe()
1013 st->use_external = of_property_read_bool(node, "atmel,adc-use-external-triggers"); in at91_adc_probe()
1019 st->channels_mask = prop; in at91_adc_probe()
1021 st->sleep_mode = of_property_read_bool(node, "atmel,adc-sleep-mode"); in at91_adc_probe()
1027 st->startup_time = prop; in at91_adc_probe()
1031 st->sample_hold_time = prop; in at91_adc_probe()
1037 st->vref_mv = prop; in at91_adc_probe()
1039 st->res = st->caps->high_res_bits; in at91_adc_probe()
1040 if (st->caps->low_res_bits && in at91_adc_probe()
1043 st->res = st->caps->low_res_bits; in at91_adc_probe()
1045 dev_info(&idev->dev, "Resolution used: %u bits\n", st->res); in at91_adc_probe()
1047 st->registers = &st->caps->registers; in at91_adc_probe()
1048 st->num_channels = st->caps->num_channels; in at91_adc_probe()
1051 if (st->caps->has_ts) { in at91_adc_probe()
1052 ret = at91_adc_probe_dt_ts(node, st, &idev->dev); in at91_adc_probe()
1063 st->irq = platform_get_irq(pdev, 0); in at91_adc_probe()
1064 if (st->irq < 0) in at91_adc_probe()
1067 st->reg_base = devm_platform_ioremap_resource(pdev, 0); in at91_adc_probe()
1068 if (IS_ERR(st->reg_base)) in at91_adc_probe()
1069 return PTR_ERR(st->reg_base); in at91_adc_probe()
1075 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_SWRST); in at91_adc_probe()
1076 at91_adc_writel(st, AT91_ADC_IDR, 0xFFFFFFFF); in at91_adc_probe()
1078 if (st->caps->has_tsmr) in at91_adc_probe()
1079 ret = request_irq(st->irq, at91_adc_9x5_interrupt, 0, in at91_adc_probe()
1082 ret = request_irq(st->irq, at91_adc_rl_interrupt, 0, in at91_adc_probe()
1089 st->clk = devm_clk_get(&pdev->dev, "adc_clk"); in at91_adc_probe()
1090 if (IS_ERR(st->clk)) { in at91_adc_probe()
1092 ret = PTR_ERR(st->clk); in at91_adc_probe()
1096 ret = clk_prepare_enable(st->clk); in at91_adc_probe()
1103 st->adc_clk = devm_clk_get(&pdev->dev, "adc_op_clk"); in at91_adc_probe()
1104 if (IS_ERR(st->adc_clk)) { in at91_adc_probe()
1106 ret = PTR_ERR(st->adc_clk); in at91_adc_probe()
1110 ret = clk_prepare_enable(st->adc_clk); in at91_adc_probe()
1122 mstrclk = clk_get_rate(st->clk); in at91_adc_probe()
1123 adc_clk = clk_get_rate(st->adc_clk); in at91_adc_probe()
1131 if (!st->startup_time) { in at91_adc_probe()
1136 ticks = (*st->caps->calc_startup_ticks)(st->startup_time, adc_clk_khz); in at91_adc_probe()
1143 if (st->sample_hold_time > 0) in at91_adc_probe()
1144 shtim = round_up((st->sample_hold_time * adc_clk_khz / 1000) in at91_adc_probe()
1149 reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; in at91_adc_probe()
1150 reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; in at91_adc_probe()
1151 if (st->res == st->caps->low_res_bits) in at91_adc_probe()
1153 if (st->sleep_mode) in at91_adc_probe()
1156 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_probe()
1165 init_waitqueue_head(&st->wq_data_avail); in at91_adc_probe()
1166 mutex_init(&st->lock); in at91_adc_probe()
1173 if (!st->touchscreen_type) { in at91_adc_probe()
1203 if (!st->touchscreen_type) { in at91_adc_probe()
1207 at91_ts_unregister(st); in at91_adc_probe()
1210 clk_disable_unprepare(st->adc_clk); in at91_adc_probe()
1212 clk_disable_unprepare(st->clk); in at91_adc_probe()
1214 free_irq(st->irq, idev); in at91_adc_probe()
1221 struct at91_adc_state *st = iio_priv(idev); in at91_adc_remove() local
1224 if (!st->touchscreen_type) { in at91_adc_remove()
1228 at91_ts_unregister(st); in at91_adc_remove()
1230 clk_disable_unprepare(st->adc_clk); in at91_adc_remove()
1231 clk_disable_unprepare(st->clk); in at91_adc_remove()
1232 free_irq(st->irq, idev); in at91_adc_remove()
1241 struct at91_adc_state *st = iio_priv(idev); in at91_adc_suspend() local
1244 clk_disable_unprepare(st->clk); in at91_adc_suspend()
1252 struct at91_adc_state *st = iio_priv(idev); in at91_adc_resume() local
1254 clk_prepare_enable(st->clk); in at91_adc_resume()