• Home
  • Raw
  • Download

Lines Matching full:st

139 #define AT91_ADC_CHAN(st, ch) \  argument
140 (st->registers->channel_base + (ch * 4))
141 #define at91_adc_readl(st, reg) \ argument
142 (readl_relaxed(st->reg_base + reg))
143 #define at91_adc_writel(st, reg, val) \ argument
144 (writel_relaxed(val, st->reg_base + reg))
250 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_handler() local
258 st->buffer[j] = at91_adc_readl(st, AT91_ADC_CHAN(st, chan->channel)); in at91_adc_trigger_handler()
262 iio_push_to_buffers_with_timestamp(idev, st->buffer, pf->timestamp); in at91_adc_trigger_handler()
267 at91_adc_readl(st, AT91_ADC_LCDR); in at91_adc_trigger_handler()
269 enable_irq(st->irq); in at91_adc_trigger_handler()
277 struct at91_adc_state *st = iio_priv(idev); in handle_adc_eoc_trigger() local
283 st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb)); in handle_adc_eoc_trigger()
285 at91_adc_readl(st, AT91_ADC_LCDR); in handle_adc_eoc_trigger()
286 st->done = true; in handle_adc_eoc_trigger()
287 wake_up_interruptible(&st->wq_data_avail); in handle_adc_eoc_trigger()
291 static int at91_ts_sample(struct at91_adc_state *st) in at91_ts_sample() argument
297 struct iio_dev *idev = iio_priv_to_dev(st); in at91_ts_sample()
299 unsigned int xyz_mask_bits = st->res; in at91_ts_sample()
304 reg = at91_adc_readl(st, AT91_ADC_TSXPOSR); in at91_ts_sample()
315 reg = at91_adc_readl(st, AT91_ADC_TSYPOSR); in at91_ts_sample()
326 reg = at91_adc_readl(st, AT91_ADC_TSPRESSR); in at91_ts_sample()
334 pres = st->ts_pressure_threshold; /* no pen contacted */ in at91_ts_sample()
339 if (pres < st->ts_pressure_threshold) { in at91_ts_sample()
342 input_report_abs(st->ts_input, ABS_X, x); in at91_ts_sample()
343 input_report_abs(st->ts_input, ABS_Y, y); in at91_ts_sample()
344 input_report_abs(st->ts_input, ABS_PRESSURE, pres); in at91_ts_sample()
345 input_report_key(st->ts_input, BTN_TOUCH, 1); in at91_ts_sample()
346 input_sync(st->ts_input); in at91_ts_sample()
357 struct at91_adc_state *st = iio_priv(idev); in at91_adc_rl_interrupt() local
358 u32 status = at91_adc_readl(st, st->registers->status_register); in at91_adc_rl_interrupt()
361 status &= at91_adc_readl(st, AT91_ADC_IMR); in at91_adc_rl_interrupt()
362 if (status & GENMASK(st->num_channels - 1, 0)) in at91_adc_rl_interrupt()
367 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_adc_rl_interrupt()
369 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_rl_interrupt()
371 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); in at91_adc_rl_interrupt()
372 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_NOPEN in at91_adc_rl_interrupt()
375 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_rl_interrupt()
377 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val)); in at91_adc_rl_interrupt()
379 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_adc_rl_interrupt()
380 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; in at91_adc_rl_interrupt()
381 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_rl_interrupt()
382 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_rl_interrupt()
385 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_NOPEN in at91_adc_rl_interrupt()
387 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); in at91_adc_rl_interrupt()
388 st->ts_bufferedmeasure = false; in at91_adc_rl_interrupt()
389 input_report_key(st->ts_input, BTN_TOUCH, 0); in at91_adc_rl_interrupt()
390 input_sync(st->ts_input); in at91_adc_rl_interrupt()
391 } else if (status & AT91_ADC_EOC(3) && st->ts_input) { in at91_adc_rl_interrupt()
393 if (st->ts_bufferedmeasure) { in at91_adc_rl_interrupt()
399 input_report_abs(st->ts_input, ABS_X, st->ts_prev_absx); in at91_adc_rl_interrupt()
400 input_report_abs(st->ts_input, ABS_Y, st->ts_prev_absy); in at91_adc_rl_interrupt()
401 input_report_key(st->ts_input, BTN_TOUCH, 1); in at91_adc_rl_interrupt()
402 input_sync(st->ts_input); in at91_adc_rl_interrupt()
404 st->ts_bufferedmeasure = true; in at91_adc_rl_interrupt()
407 st->ts_prev_absx = at91_adc_readl(st, AT91_ADC_CHAN(st, 3)) in at91_adc_rl_interrupt()
409 st->ts_prev_absx /= at91_adc_readl(st, AT91_ADC_CHAN(st, 2)); in at91_adc_rl_interrupt()
411 st->ts_prev_absy = at91_adc_readl(st, AT91_ADC_CHAN(st, 1)) in at91_adc_rl_interrupt()
413 st->ts_prev_absy /= at91_adc_readl(st, AT91_ADC_CHAN(st, 0)); in at91_adc_rl_interrupt()
422 struct at91_adc_state *st = iio_priv(idev); in at91_adc_9x5_interrupt() local
423 u32 status = at91_adc_readl(st, st->registers->status_register); in at91_adc_9x5_interrupt()
429 if (status & GENMASK(st->num_channels - 1, 0)) in at91_adc_9x5_interrupt()
433 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); in at91_adc_9x5_interrupt()
434 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_NOPEN | in at91_adc_9x5_interrupt()
437 at91_adc_writel(st, st->registers->trigger_register, in at91_adc_9x5_interrupt()
439 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val)); in at91_adc_9x5_interrupt()
441 at91_adc_writel(st, st->registers->trigger_register, 0); in at91_adc_9x5_interrupt()
442 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_NOPEN | in at91_adc_9x5_interrupt()
444 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); in at91_adc_9x5_interrupt()
446 input_report_key(st->ts_input, BTN_TOUCH, 0); in at91_adc_9x5_interrupt()
447 input_sync(st->ts_input); in at91_adc_9x5_interrupt()
453 at91_ts_sample(st); in at91_adc_9x5_interrupt()
458 at91_adc_readl(st, AT91_ADC_TSXPOSR); in at91_adc_9x5_interrupt()
459 at91_adc_readl(st, AT91_ADC_TSYPOSR); in at91_adc_9x5_interrupt()
460 at91_adc_readl(st, AT91_ADC_TSPRESSR); in at91_adc_9x5_interrupt()
469 struct at91_adc_state *st = iio_priv(idev); in at91_adc_channel_init() local
475 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE) in at91_adc_channel_init()
477 else if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_5WIRE) in at91_adc_channel_init()
481 st->channels_mask &= ~rsvd_mask; in at91_adc_channel_init()
483 idev->num_channels = bitmap_weight(&st->channels_mask, in at91_adc_channel_init()
484 st->num_channels) + 1; in at91_adc_channel_init()
494 for_each_set_bit(bit, &st->channels_mask, st->num_channels) { in at91_adc_channel_init()
502 chan->scan_type.realbits = st->res; in at91_adc_channel_init()
525 struct at91_adc_state *st = iio_priv(idev); in at91_adc_get_trigger_value_by_name() local
528 for (i = 0; i < st->trigger_number; i++) { in at91_adc_get_trigger_value_by_name()
553 struct at91_adc_state *st = iio_priv(idev); in at91_adc_configure_trigger() local
554 struct at91_adc_reg_desc *reg = st->registers; in at91_adc_configure_trigger()
555 u32 status = at91_adc_readl(st, reg->trigger_register); in at91_adc_configure_trigger()
560 st->trigger_list, in at91_adc_configure_trigger()
566 st->buffer = kmalloc(idev->scan_bytes, GFP_KERNEL); in at91_adc_configure_trigger()
567 if (st->buffer == NULL) in at91_adc_configure_trigger()
570 at91_adc_writel(st, reg->trigger_register, in at91_adc_configure_trigger()
574 st->num_channels) { in at91_adc_configure_trigger()
576 at91_adc_writel(st, AT91_ADC_CHER, in at91_adc_configure_trigger()
580 at91_adc_writel(st, AT91_ADC_IER, reg->drdy_mask); in at91_adc_configure_trigger()
583 at91_adc_writel(st, AT91_ADC_IDR, reg->drdy_mask); in at91_adc_configure_trigger()
585 at91_adc_writel(st, reg->trigger_register, in at91_adc_configure_trigger()
589 st->num_channels) { in at91_adc_configure_trigger()
591 at91_adc_writel(st, AT91_ADC_CHDR, in at91_adc_configure_trigger()
594 kfree(st->buffer); in at91_adc_configure_trigger()
628 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_init() local
631 st->trig = devm_kcalloc(&idev->dev, in at91_adc_trigger_init()
632 st->trigger_number, sizeof(*st->trig), in at91_adc_trigger_init()
635 if (st->trig == NULL) { in at91_adc_trigger_init()
640 for (i = 0; i < st->trigger_number; i++) { in at91_adc_trigger_init()
641 if (st->trigger_list[i].is_external && !(st->use_external)) in at91_adc_trigger_init()
644 st->trig[i] = at91_adc_allocate_trigger(idev, in at91_adc_trigger_init()
645 st->trigger_list + i); in at91_adc_trigger_init()
646 if (st->trig[i] == NULL) { in at91_adc_trigger_init()
658 iio_trigger_unregister(st->trig[i]); in at91_adc_trigger_init()
659 iio_trigger_free(st->trig[i]); in at91_adc_trigger_init()
667 struct at91_adc_state *st = iio_priv(idev); in at91_adc_trigger_remove() local
670 for (i = 0; i < st->trigger_number; i++) { in at91_adc_trigger_remove()
671 iio_trigger_unregister(st->trig[i]); in at91_adc_trigger_remove()
672 iio_trigger_free(st->trig[i]); in at91_adc_trigger_remove()
691 struct at91_adc_state *st = iio_priv(idev); in at91_adc_read_raw() local
696 mutex_lock(&st->lock); in at91_adc_read_raw()
698 st->chnb = chan->channel; in at91_adc_read_raw()
699 at91_adc_writel(st, AT91_ADC_CHER, in at91_adc_read_raw()
701 at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel)); in at91_adc_read_raw()
702 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START); in at91_adc_read_raw()
704 ret = wait_event_interruptible_timeout(st->wq_data_avail, in at91_adc_read_raw()
705 st->done, in at91_adc_read_raw()
711 at91_adc_writel(st, AT91_ADC_CHDR, in at91_adc_read_raw()
713 at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel)); in at91_adc_read_raw()
717 *val = st->last_value; in at91_adc_read_raw()
718 st->last_value = 0; in at91_adc_read_raw()
719 st->done = false; in at91_adc_read_raw()
728 mutex_unlock(&st->lock); in at91_adc_read_raw()
732 *val = st->vref_mv; in at91_adc_read_raw()
741 static int at91_adc_of_get_resolution(struct at91_adc_state *st, in at91_adc_of_get_resolution() argument
744 struct iio_dev *idev = iio_priv_to_dev(st); in at91_adc_of_get_resolution()
777 st->res = resolutions[i]; in at91_adc_of_get_resolution()
779 st->low_res = true; in at91_adc_of_get_resolution()
781 st->low_res = false; in at91_adc_of_get_resolution()
783 dev_info(&idev->dev, "Resolution used: %u bits\n", st->res); in at91_adc_of_get_resolution()
836 struct at91_adc_state *st, struct device *dev) in at91_adc_probe_dt_ts() argument
850 st->touchscreen_type = prop; in at91_adc_probe_dt_ts()
857 if (!st->caps->has_tsmr) in at91_adc_probe_dt_ts()
861 st->ts_pressure_threshold = prop; in at91_adc_probe_dt_ts()
862 if (st->ts_pressure_threshold) { in at91_adc_probe_dt_ts()
870 static int at91_adc_probe_dt(struct at91_adc_state *st, in at91_adc_probe_dt() argument
873 struct iio_dev *idev = iio_priv_to_dev(st); in at91_adc_probe_dt()
882 st->caps = (struct at91_adc_caps *) in at91_adc_probe_dt()
885 st->use_external = of_property_read_bool(node, "atmel,adc-use-external-triggers"); in at91_adc_probe_dt()
892 st->channels_mask = prop; in at91_adc_probe_dt()
894 st->sleep_mode = of_property_read_bool(node, "atmel,adc-sleep-mode"); in at91_adc_probe_dt()
901 st->startup_time = prop; in at91_adc_probe_dt()
905 st->sample_hold_time = prop; in at91_adc_probe_dt()
912 st->vref_mv = prop; in at91_adc_probe_dt()
914 ret = at91_adc_of_get_resolution(st, pdev); in at91_adc_probe_dt()
918 st->registers = &st->caps->registers; in at91_adc_probe_dt()
919 st->num_channels = st->caps->num_channels; in at91_adc_probe_dt()
920 st->trigger_number = of_get_child_count(node); in at91_adc_probe_dt()
921 st->trigger_list = devm_kcalloc(&idev->dev, in at91_adc_probe_dt()
922 st->trigger_number, in at91_adc_probe_dt()
925 if (!st->trigger_list) { in at91_adc_probe_dt()
932 struct at91_adc_trigger *trig = st->trigger_list + i; in at91_adc_probe_dt()
953 if (st->caps->has_ts) in at91_adc_probe_dt()
954 return at91_adc_probe_dt_ts(node, st, &idev->dev); in at91_adc_probe_dt()
964 static int at91_adc_probe_pdata(struct at91_adc_state *st, in at91_adc_probe_pdata() argument
972 st->caps = (struct at91_adc_caps *) in at91_adc_probe_pdata()
975 st->use_external = pdata->use_external_triggers; in at91_adc_probe_pdata()
976 st->vref_mv = pdata->vref; in at91_adc_probe_pdata()
977 st->channels_mask = pdata->channels_used; in at91_adc_probe_pdata()
978 st->num_channels = st->caps->num_channels; in at91_adc_probe_pdata()
979 st->startup_time = pdata->startup_time; in at91_adc_probe_pdata()
980 st->trigger_number = pdata->trigger_number; in at91_adc_probe_pdata()
981 st->trigger_list = pdata->trigger_list; in at91_adc_probe_pdata()
982 st->registers = &st->caps->registers; in at91_adc_probe_pdata()
983 st->touchscreen_type = pdata->touchscreen_type; in at91_adc_probe_pdata()
995 struct at91_adc_state *st = input_get_drvdata(dev); in atmel_ts_open() local
997 if (st->caps->has_tsmr) in atmel_ts_open()
998 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN); in atmel_ts_open()
1000 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN); in atmel_ts_open()
1006 struct at91_adc_state *st = input_get_drvdata(dev); in atmel_ts_close() local
1008 if (st->caps->has_tsmr) in atmel_ts_close()
1009 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN); in atmel_ts_close()
1011 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN); in atmel_ts_close()
1014 static int at91_ts_hw_init(struct at91_adc_state *st, u32 adc_clk_khz) in at91_ts_hw_init() argument
1016 struct iio_dev *idev = iio_priv_to_dev(st); in at91_ts_hw_init()
1025 st->ts_pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz / in at91_ts_hw_init()
1028 while (st->ts_pendbc >> ++i) in at91_ts_hw_init()
1030 if (abs(st->ts_pendbc - (1 << i)) < abs(st->ts_pendbc - (1 << (i - 1)))) in at91_ts_hw_init()
1031 st->ts_pendbc = i; in at91_ts_hw_init()
1033 st->ts_pendbc = i - 1; in at91_ts_hw_init()
1035 if (!st->caps->has_tsmr) { in at91_ts_hw_init()
1036 reg = at91_adc_readl(st, AT91_ADC_MR); in at91_ts_hw_init()
1039 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC; in at91_ts_hw_init()
1040 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_ts_hw_init()
1043 at91_adc_writel(st, AT91_ADC_TSR, reg); in at91_ts_hw_init()
1045 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US_RL * in at91_ts_hw_init()
1059 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE) in at91_ts_hw_init()
1065 reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average) in at91_ts_hw_init()
1067 reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC; in at91_ts_hw_init()
1072 at91_adc_writel(st, AT91_ADC_TSMR, reg); in at91_ts_hw_init()
1079 at91_adc_writel(st, AT91_ADC_ACR, st->caps->ts_pen_detect_sensitivity in at91_ts_hw_init()
1083 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US * in at91_ts_hw_init()
1089 static int at91_ts_register(struct at91_adc_state *st, in at91_ts_register() argument
1093 struct iio_dev *idev = iio_priv_to_dev(st); in at91_ts_register()
1111 if (st->caps->has_tsmr) { in at91_ts_register()
1118 if (st->touchscreen_type != ATMEL_ADC_TOUCHSCREEN_4WIRE) { in at91_ts_register()
1131 st->ts_input = input; in at91_ts_register()
1132 input_set_drvdata(input, st); in at91_ts_register()
1141 input_free_device(st->ts_input); in at91_ts_register()
1145 static void at91_ts_unregister(struct at91_adc_state *st) in at91_ts_unregister() argument
1147 input_unregister_device(st->ts_input); in at91_ts_unregister()
1155 struct at91_adc_state *st; in at91_adc_probe() local
1163 st = iio_priv(idev); in at91_adc_probe()
1166 ret = at91_adc_probe_dt(st, pdev); in at91_adc_probe()
1168 ret = at91_adc_probe_pdata(st, pdev); in at91_adc_probe()
1182 st->irq = platform_get_irq(pdev, 0); in at91_adc_probe()
1183 if (st->irq < 0) { in at91_adc_probe()
1190 st->reg_base = devm_ioremap_resource(&pdev->dev, res); in at91_adc_probe()
1191 if (IS_ERR(st->reg_base)) in at91_adc_probe()
1192 return PTR_ERR(st->reg_base); in at91_adc_probe()
1198 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_SWRST); in at91_adc_probe()
1199 at91_adc_writel(st, AT91_ADC_IDR, 0xFFFFFFFF); in at91_adc_probe()
1201 if (st->caps->has_tsmr) in at91_adc_probe()
1202 ret = request_irq(st->irq, at91_adc_9x5_interrupt, 0, in at91_adc_probe()
1205 ret = request_irq(st->irq, at91_adc_rl_interrupt, 0, in at91_adc_probe()
1212 st->clk = devm_clk_get(&pdev->dev, "adc_clk"); in at91_adc_probe()
1213 if (IS_ERR(st->clk)) { in at91_adc_probe()
1215 ret = PTR_ERR(st->clk); in at91_adc_probe()
1219 ret = clk_prepare_enable(st->clk); in at91_adc_probe()
1226 st->adc_clk = devm_clk_get(&pdev->dev, "adc_op_clk"); in at91_adc_probe()
1227 if (IS_ERR(st->adc_clk)) { in at91_adc_probe()
1229 ret = PTR_ERR(st->adc_clk); in at91_adc_probe()
1233 ret = clk_prepare_enable(st->adc_clk); in at91_adc_probe()
1245 mstrclk = clk_get_rate(st->clk); in at91_adc_probe()
1246 adc_clk = clk_get_rate(st->adc_clk); in at91_adc_probe()
1254 if (!st->startup_time) { in at91_adc_probe()
1259 ticks = (*st->caps->calc_startup_ticks)(st->startup_time, adc_clk_khz); in at91_adc_probe()
1266 if (st->sample_hold_time > 0) in at91_adc_probe()
1267 shtim = round_up((st->sample_hold_time * adc_clk_khz / 1000) in at91_adc_probe()
1272 reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; in at91_adc_probe()
1273 reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; in at91_adc_probe()
1274 if (st->low_res) in at91_adc_probe()
1276 if (st->sleep_mode) in at91_adc_probe()
1279 at91_adc_writel(st, AT91_ADC_MR, reg); in at91_adc_probe()
1288 init_waitqueue_head(&st->wq_data_avail); in at91_adc_probe()
1289 mutex_init(&st->lock); in at91_adc_probe()
1296 if (!st->touchscreen_type) { in at91_adc_probe()
1310 ret = at91_ts_register(st, pdev); in at91_adc_probe()
1314 at91_ts_hw_init(st, adc_clk_khz); in at91_adc_probe()
1326 if (!st->touchscreen_type) { in at91_adc_probe()
1330 at91_ts_unregister(st); in at91_adc_probe()
1333 clk_disable_unprepare(st->adc_clk); in at91_adc_probe()
1335 clk_disable_unprepare(st->clk); in at91_adc_probe()
1337 free_irq(st->irq, idev); in at91_adc_probe()
1344 struct at91_adc_state *st = iio_priv(idev); in at91_adc_remove() local
1347 if (!st->touchscreen_type) { in at91_adc_remove()
1351 at91_ts_unregister(st); in at91_adc_remove()
1353 clk_disable_unprepare(st->adc_clk); in at91_adc_remove()
1354 clk_disable_unprepare(st->clk); in at91_adc_remove()
1355 free_irq(st->irq, idev); in at91_adc_remove()
1364 struct at91_adc_state *st = iio_priv(idev); in at91_adc_suspend() local
1367 clk_disable_unprepare(st->clk); in at91_adc_suspend()
1375 struct at91_adc_state *st = iio_priv(idev); in at91_adc_resume() local
1377 clk_prepare_enable(st->clk); in at91_adc_resume()