aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristina Martšenko <kristina.martsenko@gmail.com>2015-01-25 11:28:19 -0500
committerJonathan Cameron <jic23@kernel.org>2015-01-26 15:57:37 -0500
commitf81197b8a31b8fb287ae57f597b5b6841e1ece92 (patch)
tree1f429f871d970e4d9f5cab5ffdc3521c87ac22b3
parent4f33fbae555000bf73aaacbc4f5b24668afc8c7a (diff)
iio: mxs-lradc: separate touchscreen and buffer virtual channels
The touchscreen was initially designed [1] to map all of its physical channels to one virtual channel, leaving buffered capture to use the remaining 7 virtual channels. When the touchscreen was reimplemented [2], it was made to use four virtual channels, which overlap and conflict with the channels the buffer uses. As a result, when the buffer is enabled, the touchscreen's virtual channels are remapped to whichever physical channels the buffer was configured with, causing the touchscreen to read those instead of the touch measurement channels. Effectively the touchscreen stops working. So here we separate the channels again, giving the touchscreen 2 virtual channels and the buffer 6. We can't give the touchscreen just 1 channel as before, as the current pressure calculation requires 2 channels to be read at the same time. This makes the touchscreen continue to work during buffered capture. It has been tested on i.MX28, but not on i.MX23. [1] 06ddd353f5c8 ("iio: mxs: Implement support for touchscreen") [2] dee05308f602 ("Staging/iio/adc/touchscreen/MXS: add interrupt driven touch detection") Signed-off-by: Kristina Martšenko <kristina.martsenko@gmail.com> Reviewed-by: Marek Vasut <marex@denx.de> Cc: Stable@vger.kernel.org Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/staging/iio/adc/mxs-lradc.c166
1 files changed, 75 insertions, 91 deletions
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c
index f053535385bf..4e574b76ead0 100644
--- a/drivers/staging/iio/adc/mxs-lradc.c
+++ b/drivers/staging/iio/adc/mxs-lradc.c
@@ -214,11 +214,14 @@ struct mxs_lradc {
214 unsigned long is_divided; 214 unsigned long is_divided;
215 215
216 /* 216 /*
217 * Touchscreen LRADC channels receives a private slot in the CTRL4 217 * When the touchscreen is enabled, we give it two private virtual
218 * register, the slot #7. Therefore only 7 slots instead of 8 in the 218 * channels: #6 and #7. This means that only 6 virtual channels (instead
219 * CTRL4 register can be mapped to LRADC channels when using the 219 * of 8) will be available for buffered capture.
220 * touchscreen. 220 */
221 * 221#define TOUCHSCREEN_VCHANNEL1 7
222#define TOUCHSCREEN_VCHANNEL2 6
223
224 /*
222 * Furthermore, certain LRADC channels are shared between touchscreen 225 * Furthermore, certain LRADC channels are shared between touchscreen
223 * and/or touch-buttons and generic LRADC block. Therefore when using 226 * and/or touch-buttons and generic LRADC block. Therefore when using
224 * either of these, these channels are not available for the regular 227 * either of these, these channels are not available for the regular
@@ -342,6 +345,9 @@ struct mxs_lradc {
342#define LRADC_CTRL4 0x140 345#define LRADC_CTRL4 0x140
343#define LRADC_CTRL4_LRADCSELECT_MASK(n) (0xf << ((n) * 4)) 346#define LRADC_CTRL4_LRADCSELECT_MASK(n) (0xf << ((n) * 4))
344#define LRADC_CTRL4_LRADCSELECT_OFFSET(n) ((n) * 4) 347#define LRADC_CTRL4_LRADCSELECT_OFFSET(n) ((n) * 4)
348#define LRADC_CTRL4_LRADCSELECT(n, x) \
349 (((x) << LRADC_CTRL4_LRADCSELECT_OFFSET(n)) & \
350 LRADC_CTRL4_LRADCSELECT_MASK(n))
345 351
346#define LRADC_RESOLUTION 12 352#define LRADC_RESOLUTION 12
347#define LRADC_SINGLE_SAMPLE_MASK ((1 << LRADC_RESOLUTION) - 1) 353#define LRADC_SINGLE_SAMPLE_MASK ((1 << LRADC_RESOLUTION) - 1)
@@ -416,6 +422,14 @@ static bool mxs_lradc_check_touch_event(struct mxs_lradc *lradc)
416 LRADC_STATUS_TOUCH_DETECT_RAW); 422 LRADC_STATUS_TOUCH_DETECT_RAW);
417} 423}
418 424
425static void mxs_lradc_map_channel(struct mxs_lradc *lradc, unsigned vch,
426 unsigned ch)
427{
428 mxs_lradc_reg_clear(lradc, LRADC_CTRL4_LRADCSELECT_MASK(vch),
429 LRADC_CTRL4);
430 mxs_lradc_reg_set(lradc, LRADC_CTRL4_LRADCSELECT(vch, ch), LRADC_CTRL4);
431}
432
419static void mxs_lradc_setup_ts_channel(struct mxs_lradc *lradc, unsigned ch) 433static void mxs_lradc_setup_ts_channel(struct mxs_lradc *lradc, unsigned ch)
420{ 434{
421 /* 435 /*
@@ -443,12 +457,8 @@ static void mxs_lradc_setup_ts_channel(struct mxs_lradc *lradc, unsigned ch)
443 LRADC_DELAY_DELAY(lradc->over_sample_delay - 1), 457 LRADC_DELAY_DELAY(lradc->over_sample_delay - 1),
444 LRADC_DELAY(3)); 458 LRADC_DELAY(3));
445 459
446 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(2) | 460 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(ch), LRADC_CTRL1);
447 LRADC_CTRL1_LRADC_IRQ(3) | LRADC_CTRL1_LRADC_IRQ(4) |
448 LRADC_CTRL1_LRADC_IRQ(5), LRADC_CTRL1);
449 461
450 /* wake us again, when the complete conversion is done */
451 mxs_lradc_reg_set(lradc, LRADC_CTRL1_LRADC_IRQ_EN(ch), LRADC_CTRL1);
452 /* 462 /*
453 * after changing the touchscreen plates setting 463 * after changing the touchscreen plates setting
454 * the signals need some initial time to settle. Start the 464 * the signals need some initial time to settle. Start the
@@ -502,12 +512,8 @@ static void mxs_lradc_setup_ts_pressure(struct mxs_lradc *lradc, unsigned ch1,
502 LRADC_DELAY_DELAY(lradc->over_sample_delay - 1), 512 LRADC_DELAY_DELAY(lradc->over_sample_delay - 1),
503 LRADC_DELAY(3)); 513 LRADC_DELAY(3));
504 514
505 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(2) | 515 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(ch2), LRADC_CTRL1);
506 LRADC_CTRL1_LRADC_IRQ(3) | LRADC_CTRL1_LRADC_IRQ(4) |
507 LRADC_CTRL1_LRADC_IRQ(5), LRADC_CTRL1);
508 516
509 /* wake us again, when the conversions are done */
510 mxs_lradc_reg_set(lradc, LRADC_CTRL1_LRADC_IRQ_EN(ch2), LRADC_CTRL1);
511 /* 517 /*
512 * after changing the touchscreen plates setting 518 * after changing the touchscreen plates setting
513 * the signals need some initial time to settle. Start the 519 * the signals need some initial time to settle. Start the
@@ -573,36 +579,6 @@ static unsigned mxs_lradc_read_ts_pressure(struct mxs_lradc *lradc,
573#define TS_CH_XM 4 579#define TS_CH_XM 4
574#define TS_CH_YM 5 580#define TS_CH_YM 5
575 581
576static int mxs_lradc_read_ts_channel(struct mxs_lradc *lradc)
577{
578 u32 reg;
579 int val;
580
581 reg = readl(lradc->base + LRADC_CTRL1);
582
583 /* only channels 3 to 5 are of interest here */
584 if (reg & LRADC_CTRL1_LRADC_IRQ(TS_CH_YP)) {
585 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ_EN(TS_CH_YP) |
586 LRADC_CTRL1_LRADC_IRQ(TS_CH_YP), LRADC_CTRL1);
587 val = mxs_lradc_read_raw_channel(lradc, TS_CH_YP);
588 } else if (reg & LRADC_CTRL1_LRADC_IRQ(TS_CH_XM)) {
589 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ_EN(TS_CH_XM) |
590 LRADC_CTRL1_LRADC_IRQ(TS_CH_XM), LRADC_CTRL1);
591 val = mxs_lradc_read_raw_channel(lradc, TS_CH_XM);
592 } else if (reg & LRADC_CTRL1_LRADC_IRQ(TS_CH_YM)) {
593 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ_EN(TS_CH_YM) |
594 LRADC_CTRL1_LRADC_IRQ(TS_CH_YM), LRADC_CTRL1);
595 val = mxs_lradc_read_raw_channel(lradc, TS_CH_YM);
596 } else {
597 return -EIO;
598 }
599
600 mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(2));
601 mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(3));
602
603 return val;
604}
605
606/* 582/*
607 * YP(open)--+-------------+ 583 * YP(open)--+-------------+
608 * | |--+ 584 * | |--+
@@ -646,7 +622,8 @@ static void mxs_lradc_prepare_x_pos(struct mxs_lradc *lradc)
646 mxs_lradc_reg_set(lradc, mxs_lradc_drive_x_plate(lradc), LRADC_CTRL0); 622 mxs_lradc_reg_set(lradc, mxs_lradc_drive_x_plate(lradc), LRADC_CTRL0);
647 623
648 lradc->cur_plate = LRADC_SAMPLE_X; 624 lradc->cur_plate = LRADC_SAMPLE_X;
649 mxs_lradc_setup_ts_channel(lradc, TS_CH_YP); 625 mxs_lradc_map_channel(lradc, TOUCHSCREEN_VCHANNEL1, TS_CH_YP);
626 mxs_lradc_setup_ts_channel(lradc, TOUCHSCREEN_VCHANNEL1);
650} 627}
651 628
652/* 629/*
@@ -667,7 +644,8 @@ static void mxs_lradc_prepare_y_pos(struct mxs_lradc *lradc)
667 mxs_lradc_reg_set(lradc, mxs_lradc_drive_y_plate(lradc), LRADC_CTRL0); 644 mxs_lradc_reg_set(lradc, mxs_lradc_drive_y_plate(lradc), LRADC_CTRL0);
668 645
669 lradc->cur_plate = LRADC_SAMPLE_Y; 646 lradc->cur_plate = LRADC_SAMPLE_Y;
670 mxs_lradc_setup_ts_channel(lradc, TS_CH_XM); 647 mxs_lradc_map_channel(lradc, TOUCHSCREEN_VCHANNEL1, TS_CH_XM);
648 mxs_lradc_setup_ts_channel(lradc, TOUCHSCREEN_VCHANNEL1);
671} 649}
672 650
673/* 651/*
@@ -688,7 +666,10 @@ static void mxs_lradc_prepare_pressure(struct mxs_lradc *lradc)
688 mxs_lradc_reg_set(lradc, mxs_lradc_drive_pressure(lradc), LRADC_CTRL0); 666 mxs_lradc_reg_set(lradc, mxs_lradc_drive_pressure(lradc), LRADC_CTRL0);
689 667
690 lradc->cur_plate = LRADC_SAMPLE_PRESSURE; 668 lradc->cur_plate = LRADC_SAMPLE_PRESSURE;
691 mxs_lradc_setup_ts_pressure(lradc, TS_CH_XP, TS_CH_YM); 669 mxs_lradc_map_channel(lradc, TOUCHSCREEN_VCHANNEL1, TS_CH_YM);
670 mxs_lradc_map_channel(lradc, TOUCHSCREEN_VCHANNEL2, TS_CH_XP);
671 mxs_lradc_setup_ts_pressure(lradc, TOUCHSCREEN_VCHANNEL2,
672 TOUCHSCREEN_VCHANNEL1);
692} 673}
693 674
694static void mxs_lradc_enable_touch_detection(struct mxs_lradc *lradc) 675static void mxs_lradc_enable_touch_detection(struct mxs_lradc *lradc)
@@ -701,6 +682,19 @@ static void mxs_lradc_enable_touch_detection(struct mxs_lradc *lradc)
701 mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); 682 mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1);
702} 683}
703 684
685static void mxs_lradc_start_touch_event(struct mxs_lradc *lradc)
686{
687 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
688 LRADC_CTRL1);
689 mxs_lradc_reg_set(lradc,
690 LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1), LRADC_CTRL1);
691 /*
692 * start with the Y-pos, because it uses nearly the same plate
693 * settings like the touch detection
694 */
695 mxs_lradc_prepare_y_pos(lradc);
696}
697
704static void mxs_lradc_report_ts_event(struct mxs_lradc *lradc) 698static void mxs_lradc_report_ts_event(struct mxs_lradc *lradc)
705{ 699{
706 input_report_abs(lradc->ts_input, ABS_X, lradc->ts_x_pos); 700 input_report_abs(lradc->ts_input, ABS_X, lradc->ts_x_pos);
@@ -718,10 +712,12 @@ static void mxs_lradc_complete_touch_event(struct mxs_lradc *lradc)
718 * start a dummy conversion to burn time to settle the signals 712 * start a dummy conversion to burn time to settle the signals
719 * note: we are not interested in the conversion's value 713 * note: we are not interested in the conversion's value
720 */ 714 */
721 mxs_lradc_reg_wrt(lradc, 0, LRADC_CH(5)); 715 mxs_lradc_reg_wrt(lradc, 0, LRADC_CH(TOUCHSCREEN_VCHANNEL1));
722 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(5), LRADC_CTRL1); 716 mxs_lradc_reg_clear(lradc,
723 mxs_lradc_reg_set(lradc, LRADC_CTRL1_LRADC_IRQ_EN(5), LRADC_CTRL1); 717 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
724 mxs_lradc_reg_wrt(lradc, LRADC_DELAY_TRIGGER(1 << 5) | 718 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2), LRADC_CTRL1);
719 mxs_lradc_reg_wrt(lradc,
720 LRADC_DELAY_TRIGGER(1 << TOUCHSCREEN_VCHANNEL1) |
725 LRADC_DELAY_KICK | LRADC_DELAY_DELAY(10), /* waste 5 ms */ 721 LRADC_DELAY_KICK | LRADC_DELAY_DELAY(10), /* waste 5 ms */
726 LRADC_DELAY(2)); 722 LRADC_DELAY(2));
727} 723}
@@ -753,59 +749,45 @@ static void mxs_lradc_finish_touch_event(struct mxs_lradc *lradc, bool valid)
753 749
754 /* if it is released, wait for the next touch via IRQ */ 750 /* if it is released, wait for the next touch via IRQ */
755 lradc->cur_plate = LRADC_TOUCH; 751 lradc->cur_plate = LRADC_TOUCH;
756 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); 752 mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(2));
753 mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(3));
754 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ |
755 LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1) |
756 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1), LRADC_CTRL1);
757 mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); 757 mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1);
758} 758}
759 759
760/* touchscreen's state machine */ 760/* touchscreen's state machine */
761static void mxs_lradc_handle_touch(struct mxs_lradc *lradc) 761static void mxs_lradc_handle_touch(struct mxs_lradc *lradc)
762{ 762{
763 int val;
764
765 switch (lradc->cur_plate) { 763 switch (lradc->cur_plate) {
766 case LRADC_TOUCH: 764 case LRADC_TOUCH:
767 /* 765 if (mxs_lradc_check_touch_event(lradc))
768 * start with the Y-pos, because it uses nearly the same plate 766 mxs_lradc_start_touch_event(lradc);
769 * settings like the touch detection
770 */
771 if (mxs_lradc_check_touch_event(lradc)) {
772 mxs_lradc_reg_clear(lradc,
773 LRADC_CTRL1_TOUCH_DETECT_IRQ_EN,
774 LRADC_CTRL1);
775 mxs_lradc_prepare_y_pos(lradc);
776 }
777 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, 767 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ,
778 LRADC_CTRL1); 768 LRADC_CTRL1);
779 return; 769 return;
780 770
781 case LRADC_SAMPLE_Y: 771 case LRADC_SAMPLE_Y:
782 val = mxs_lradc_read_ts_channel(lradc); 772 lradc->ts_y_pos = mxs_lradc_read_raw_channel(lradc,
783 if (val < 0) { 773 TOUCHSCREEN_VCHANNEL1);
784 mxs_lradc_enable_touch_detection(lradc); /* re-start */
785 return;
786 }
787 lradc->ts_y_pos = val;
788 mxs_lradc_prepare_x_pos(lradc); 774 mxs_lradc_prepare_x_pos(lradc);
789 return; 775 return;
790 776
791 case LRADC_SAMPLE_X: 777 case LRADC_SAMPLE_X:
792 val = mxs_lradc_read_ts_channel(lradc); 778 lradc->ts_x_pos = mxs_lradc_read_raw_channel(lradc,
793 if (val < 0) { 779 TOUCHSCREEN_VCHANNEL1);
794 mxs_lradc_enable_touch_detection(lradc); /* re-start */
795 return;
796 }
797 lradc->ts_x_pos = val;
798 mxs_lradc_prepare_pressure(lradc); 780 mxs_lradc_prepare_pressure(lradc);
799 return; 781 return;
800 782
801 case LRADC_SAMPLE_PRESSURE: 783 case LRADC_SAMPLE_PRESSURE:
802 lradc->ts_pressure = 784 lradc->ts_pressure = mxs_lradc_read_ts_pressure(lradc,
803 mxs_lradc_read_ts_pressure(lradc, TS_CH_XP, TS_CH_YM); 785 TOUCHSCREEN_VCHANNEL2,
786 TOUCHSCREEN_VCHANNEL1);
804 mxs_lradc_complete_touch_event(lradc); 787 mxs_lradc_complete_touch_event(lradc);
805 return; 788 return;
806 789
807 case LRADC_SAMPLE_VALID: 790 case LRADC_SAMPLE_VALID:
808 val = mxs_lradc_read_ts_channel(lradc); /* ignore the value */
809 mxs_lradc_finish_touch_event(lradc, 1); 791 mxs_lradc_finish_touch_event(lradc, 1);
810 break; 792 break;
811 } 793 }
@@ -1083,9 +1065,8 @@ static void mxs_lradc_disable_ts(struct mxs_lradc *lradc)
1083{ 1065{
1084 /* stop all interrupts from firing */ 1066 /* stop all interrupts from firing */
1085 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN | 1067 mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN |
1086 LRADC_CTRL1_LRADC_IRQ_EN(2) | LRADC_CTRL1_LRADC_IRQ_EN(3) | 1068 LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL1) |
1087 LRADC_CTRL1_LRADC_IRQ_EN(4) | LRADC_CTRL1_LRADC_IRQ_EN(5), 1069 LRADC_CTRL1_LRADC_IRQ_EN(TOUCHSCREEN_VCHANNEL2), LRADC_CTRL1);
1088 LRADC_CTRL1);
1089 1070
1090 /* Power-down touchscreen touch-detect circuitry. */ 1071 /* Power-down touchscreen touch-detect circuitry. */
1091 mxs_lradc_reg_clear(lradc, mxs_lradc_plate_mask(lradc), LRADC_CTRL0); 1072 mxs_lradc_reg_clear(lradc, mxs_lradc_plate_mask(lradc), LRADC_CTRL0);
@@ -1151,26 +1132,29 @@ static irqreturn_t mxs_lradc_handle_irq(int irq, void *data)
1151 struct iio_dev *iio = data; 1132 struct iio_dev *iio = data;
1152 struct mxs_lradc *lradc = iio_priv(iio); 1133 struct mxs_lradc *lradc = iio_priv(iio);
1153 unsigned long reg = readl(lradc->base + LRADC_CTRL1); 1134 unsigned long reg = readl(lradc->base + LRADC_CTRL1);
1135 uint32_t clr_irq = mxs_lradc_irq_mask(lradc);
1154 const uint32_t ts_irq_mask = 1136 const uint32_t ts_irq_mask =
1155 LRADC_CTRL1_TOUCH_DETECT_IRQ | 1137 LRADC_CTRL1_TOUCH_DETECT_IRQ |
1156 LRADC_CTRL1_LRADC_IRQ(2) | 1138 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
1157 LRADC_CTRL1_LRADC_IRQ(3) | 1139 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2);
1158 LRADC_CTRL1_LRADC_IRQ(4) |
1159 LRADC_CTRL1_LRADC_IRQ(5);
1160 1140
1161 if (!(reg & mxs_lradc_irq_mask(lradc))) 1141 if (!(reg & mxs_lradc_irq_mask(lradc)))
1162 return IRQ_NONE; 1142 return IRQ_NONE;
1163 1143
1164 if (lradc->use_touchscreen && (reg & ts_irq_mask)) 1144 if (lradc->use_touchscreen && (reg & ts_irq_mask)) {
1165 mxs_lradc_handle_touch(lradc); 1145 mxs_lradc_handle_touch(lradc);
1166 1146
1147 /* Make sure we don't clear the next conversion's interrupt. */
1148 clr_irq &= ~(LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL1) |
1149 LRADC_CTRL1_LRADC_IRQ(TOUCHSCREEN_VCHANNEL2));
1150 }
1151
1167 if (iio_buffer_enabled(iio)) 1152 if (iio_buffer_enabled(iio))
1168 iio_trigger_poll(iio->trig); 1153 iio_trigger_poll(iio->trig);
1169 else if (reg & LRADC_CTRL1_LRADC_IRQ(0)) 1154 else if (reg & LRADC_CTRL1_LRADC_IRQ(0))
1170 complete(&lradc->completion); 1155 complete(&lradc->completion);
1171 1156
1172 mxs_lradc_reg_clear(lradc, reg & mxs_lradc_irq_mask(lradc), 1157 mxs_lradc_reg_clear(lradc, reg & clr_irq, LRADC_CTRL1);
1173 LRADC_CTRL1);
1174 1158
1175 return IRQ_HANDLED; 1159 return IRQ_HANDLED;
1176} 1160}
@@ -1346,7 +1330,7 @@ static bool mxs_lradc_validate_scan_mask(struct iio_dev *iio,
1346 if (lradc->use_touchbutton) 1330 if (lradc->use_touchbutton)
1347 rsvd_chans++; 1331 rsvd_chans++;
1348 if (lradc->use_touchscreen) 1332 if (lradc->use_touchscreen)
1349 rsvd_chans++; 1333 rsvd_chans += 2;
1350 1334
1351 /* Test for attempts to map channels with special mode of operation. */ 1335 /* Test for attempts to map channels with special mode of operation. */
1352 if (bitmap_intersects(mask, &rsvd_mask, LRADC_MAX_TOTAL_CHANS)) 1336 if (bitmap_intersects(mask, &rsvd_mask, LRADC_MAX_TOTAL_CHANS))