Lines Matching refs:st
135 #define AT91_ADC_CHAN(st, ch) \
136 (st->registers->channel_base + (ch * 4))
137 #define at91_adc_readl(st, reg) \
138 (readl_relaxed(st->reg_base + reg))
139 #define at91_adc_writel(st, reg, val) \
140 (writel_relaxed(val, st->reg_base + reg))
267 struct at91_adc_state *st = iio_priv(idev);
275 st->buffer[j] = at91_adc_readl(st, AT91_ADC_CHAN(st, chan->channel));
279 iio_push_to_buffers_with_timestamp(idev, st->buffer, pf->timestamp);
284 at91_adc_readl(st, AT91_ADC_LCDR);
286 enable_irq(st->irq);
294 struct at91_adc_state *st = iio_priv(idev);
300 st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
302 at91_adc_readl(st, AT91_ADC_LCDR);
303 st->done = true;
304 wake_up_interruptible(&st->wq_data_avail);
310 struct at91_adc_state *st = iio_priv(idev);
316 unsigned int xyz_mask_bits = st->res;
321 reg = at91_adc_readl(st, AT91_ADC_TSXPOSR);
332 reg = at91_adc_readl(st, AT91_ADC_TSYPOSR);
343 reg = at91_adc_readl(st, AT91_ADC_TSPRESSR);
351 pres = st->ts_pressure_threshold; /* no pen contacted */
356 if (pres < st->ts_pressure_threshold) {
359 input_report_abs(st->ts_input, ABS_X, x);
360 input_report_abs(st->ts_input, ABS_Y, y);
361 input_report_abs(st->ts_input, ABS_PRESSURE, pres);
362 input_report_key(st->ts_input, BTN_TOUCH, 1);
363 input_sync(st->ts_input);
374 struct at91_adc_state *st = iio_priv(idev);
375 u32 status = at91_adc_readl(st, st->registers->status_register);
378 status &= at91_adc_readl(st, AT91_ADC_IMR);
379 if (status & GENMASK(st->num_channels - 1, 0))
384 reg = at91_adc_readl(st, AT91_ADC_MR);
386 at91_adc_writel(st, AT91_ADC_MR, reg);
388 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN);
389 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_NOPEN
392 at91_adc_writel(st, st->registers->trigger_register,
394 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val));
396 reg = at91_adc_readl(st, AT91_ADC_MR);
397 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC;
398 at91_adc_writel(st, AT91_ADC_MR, reg);
399 at91_adc_writel(st, st->registers->trigger_register,
402 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_NOPEN
404 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN);
405 st->ts_bufferedmeasure = false;
406 input_report_key(st->ts_input, BTN_TOUCH, 0);
407 input_sync(st->ts_input);
408 } else if (status & AT91_ADC_EOC(3) && st->ts_input) {
410 if (st->ts_bufferedmeasure) {
416 input_report_abs(st->ts_input, ABS_X, st->ts_prev_absx);
417 input_report_abs(st->ts_input, ABS_Y, st->ts_prev_absy);
418 input_report_key(st->ts_input, BTN_TOUCH, 1);
419 input_sync(st->ts_input);
421 st->ts_bufferedmeasure = true;
424 st->ts_prev_absx = at91_adc_readl(st, AT91_ADC_CHAN(st, 3))
426 st->ts_prev_absx /= at91_adc_readl(st, AT91_ADC_CHAN(st, 2));
428 st->ts_prev_absy = at91_adc_readl(st, AT91_ADC_CHAN(st, 1))
430 st->ts_prev_absy /= at91_adc_readl(st, AT91_ADC_CHAN(st, 0));
439 struct at91_adc_state *st = iio_priv(idev);
440 u32 status = at91_adc_readl(st, st->registers->status_register);
446 if (status & GENMASK(st->num_channels - 1, 0))
450 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN);
451 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_NOPEN |
454 at91_adc_writel(st, st->registers->trigger_register,
456 AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val));
458 at91_adc_writel(st, st->registers->trigger_register, 0);
459 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_NOPEN |
461 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN);
463 input_report_key(st->ts_input, BTN_TOUCH, 0);
464 input_sync(st->ts_input);
475 at91_adc_readl(st, AT91_ADC_TSXPOSR);
476 at91_adc_readl(st, AT91_ADC_TSYPOSR);
477 at91_adc_readl(st, AT91_ADC_TSPRESSR);
486 struct at91_adc_state *st = iio_priv(idev);
492 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE)
494 else if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_5WIRE)
498 st->channels_mask &= ~rsvd_mask;
500 idev->num_channels = bitmap_weight(&st->channels_mask,
501 st->num_channels) + 1;
511 for_each_set_bit(bit, &st->channels_mask, st->num_channels) {
519 chan->scan_type.realbits = st->res;
542 struct at91_adc_state *st = iio_priv(idev);
545 for (i = 0; i < st->caps->trigger_number; i++) {
570 struct at91_adc_state *st = iio_priv(idev);
571 const struct at91_adc_reg_desc *reg = st->registers;
572 u32 status = at91_adc_readl(st, reg->trigger_register);
577 st->caps->triggers,
583 st->buffer = kmalloc(idev->scan_bytes, GFP_KERNEL);
584 if (st->buffer == NULL)
587 at91_adc_writel(st, reg->trigger_register,
591 st->num_channels) {
593 at91_adc_writel(st, AT91_ADC_CHER,
597 at91_adc_writel(st, AT91_ADC_IER, reg->drdy_mask);
600 at91_adc_writel(st, AT91_ADC_IDR, reg->drdy_mask);
602 at91_adc_writel(st, reg->trigger_register,
606 st->num_channels) {
608 at91_adc_writel(st, AT91_ADC_CHDR,
611 kfree(st->buffer);
646 struct at91_adc_state *st = iio_priv(idev);
649 st->trig = devm_kcalloc(&idev->dev,
650 st->caps->trigger_number, sizeof(*st->trig),
653 if (st->trig == NULL) {
658 for (i = 0; i < st->caps->trigger_number; i++) {
659 if (st->caps->triggers[i].is_external && !(st->use_external))
662 st->trig[i] = at91_adc_allocate_trigger(idev,
663 st->caps->triggers + i);
664 if (st->trig[i] == NULL) {
676 iio_trigger_unregister(st->trig[i]);
677 iio_trigger_free(st->trig[i]);
685 struct at91_adc_state *st = iio_priv(idev);
688 for (i = 0; i < st->caps->trigger_number; i++) {
689 iio_trigger_unregister(st->trig[i]);
690 iio_trigger_free(st->trig[i]);
709 struct at91_adc_state *st = iio_priv(idev);
714 mutex_lock(&st->lock);
716 st->chnb = chan->channel;
717 at91_adc_writel(st, AT91_ADC_CHER,
719 at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel));
720 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START);
722 ret = wait_event_interruptible_timeout(st->wq_data_avail,
723 st->done,
729 at91_adc_writel(st, AT91_ADC_CHDR,
731 at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel));
735 *val = st->last_value;
736 st->last_value = 0;
737 st->done = false;
746 mutex_unlock(&st->lock);
750 *val = st->vref_mv;
800 struct at91_adc_state *st, struct device *dev)
814 st->touchscreen_type = prop;
821 if (!st->caps->has_tsmr)
825 st->ts_pressure_threshold = prop;
826 if (st->ts_pressure_threshold) {
841 struct at91_adc_state *st = input_get_drvdata(dev);
843 if (st->caps->has_tsmr)
844 at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN);
846 at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN);
852 struct at91_adc_state *st = input_get_drvdata(dev);
854 if (st->caps->has_tsmr)
855 at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN);
857 at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN);
862 struct at91_adc_state *st = iio_priv(idev);
871 st->ts_pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz /
874 while (st->ts_pendbc >> ++i)
876 if (abs(st->ts_pendbc - (1 << i)) < abs(st->ts_pendbc - (1 << (i - 1))))
877 st->ts_pendbc = i;
879 st->ts_pendbc = i - 1;
881 if (!st->caps->has_tsmr) {
882 reg = at91_adc_readl(st, AT91_ADC_MR);
885 reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC;
886 at91_adc_writel(st, AT91_ADC_MR, reg);
889 at91_adc_writel(st, AT91_ADC_TSR, reg);
891 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US_RL *
905 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE)
911 reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average)
913 reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC;
918 at91_adc_writel(st, AT91_ADC_TSMR, reg);
925 at91_adc_writel(st, AT91_ADC_ACR, st->caps->ts_pen_detect_sensitivity
929 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US *
938 struct at91_adc_state *st = iio_priv(idev);
957 if (st->caps->has_tsmr) {
964 if (st->touchscreen_type != ATMEL_ADC_TOUCHSCREEN_4WIRE) {
977 st->ts_input = input;
978 input_set_drvdata(input, st);
987 input_free_device(st->ts_input);
991 static void at91_ts_unregister(struct at91_adc_state *st)
993 input_unregister_device(st->ts_input);
1002 struct at91_adc_state *st;
1010 st = iio_priv(idev);
1012 st->caps = of_device_get_match_data(&pdev->dev);
1014 st->use_external = of_property_read_bool(node, "atmel,adc-use-external-triggers");
1020 st->channels_mask = prop;
1022 st->sleep_mode = of_property_read_bool(node, "atmel,adc-sleep-mode");
1028 st->startup_time = prop;
1032 st->sample_hold_time = prop;
1038 st->vref_mv = prop;
1040 st->res = st->caps->high_res_bits;
1041 if (st->caps->low_res_bits &&
1044 st->res = st->caps->low_res_bits;
1046 dev_info(&idev->dev, "Resolution used: %u bits\n", st->res);
1048 st->registers = &st->caps->registers;
1049 st->num_channels = st->caps->num_channels;
1052 if (st->caps->has_ts) {
1053 ret = at91_adc_probe_dt_ts(node, st, &idev->dev);
1064 st->irq = platform_get_irq(pdev, 0);
1065 if (st->irq < 0)
1068 st->reg_base = devm_platform_ioremap_resource(pdev, 0);
1069 if (IS_ERR(st->reg_base))
1070 return PTR_ERR(st->reg_base);
1076 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_SWRST);
1077 at91_adc_writel(st, AT91_ADC_IDR, 0xFFFFFFFF);
1079 if (st->caps->has_tsmr)
1080 ret = request_irq(st->irq, at91_adc_9x5_interrupt, 0,
1083 ret = request_irq(st->irq, at91_adc_rl_interrupt, 0,
1090 st->clk = devm_clk_get(&pdev->dev, "adc_clk");
1091 if (IS_ERR(st->clk)) {
1093 ret = PTR_ERR(st->clk);
1097 ret = clk_prepare_enable(st->clk);
1104 st->adc_clk = devm_clk_get(&pdev->dev, "adc_op_clk");
1105 if (IS_ERR(st->adc_clk)) {
1107 ret = PTR_ERR(st->adc_clk);
1111 ret = clk_prepare_enable(st->adc_clk);
1123 mstrclk = clk_get_rate(st->clk);
1124 adc_clk = clk_get_rate(st->adc_clk);
1132 if (!st->startup_time) {
1137 ticks = (*st->caps->calc_startup_ticks)(st->startup_time, adc_clk_khz);
1144 if (st->sample_hold_time > 0)
1145 shtim = round_up((st->sample_hold_time * adc_clk_khz / 1000)
1150 reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask;
1151 reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask;
1152 if (st->res == st->caps->low_res_bits)
1154 if (st->sleep_mode)
1157 at91_adc_writel(st, AT91_ADC_MR, reg);
1166 init_waitqueue_head(&st->wq_data_avail);
1167 mutex_init(&st->lock);
1174 if (!st->touchscreen_type) {
1204 if (!st->touchscreen_type) {
1208 at91_ts_unregister(st);
1211 clk_disable_unprepare(st->adc_clk);
1213 clk_disable_unprepare(st->clk);
1215 free_irq(st->irq, idev);
1222 struct at91_adc_state *st = iio_priv(idev);
1225 if (!st->touchscreen_type) {
1229 at91_ts_unregister(st);
1231 clk_disable_unprepare(st->adc_clk);
1232 clk_disable_unprepare(st->clk);
1233 free_irq(st->irq, idev);
1241 struct at91_adc_state *st = iio_priv(idev);
1244 clk_disable_unprepare(st->clk);
1252 struct at91_adc_state *st = iio_priv(idev);
1254 clk_prepare_enable(st->clk);