Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Staging/iio/adc/touchscreen/MXS: simplify register access

Replace the individual register access by a few shared access function to make the
code easier to read and in order to add the i.MX23 SoC in the next step.

Signed-off-by: Juergen Beisert <jbe@pengutronix.de>
Tested-by: Marek Vasut <marex@denx.de>
Acked-by: Marek Vasut <marex@denx.de>
Tested-by: Lothar Waßmann <LW@KARO-electronics.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

CC: linux-arm-kernel@lists.infradead.org
CC: linux-input@vger.kernel.org
CC: devel@driverdev.osuosl.org
CC: Marek Vasut <marex@denx.de>
CC: Fabio Estevam <fabio.estevam@freescale.com>

authored by

Juergen Beisert and committed by
Jonathan Cameron
f0b83cc8 7e4d4a6f

+119 -83
+119 -83
drivers/staging/iio/adc/mxs-lradc.c
··· 238 238 #define LRADC_RESOLUTION 12 239 239 #define LRADC_SINGLE_SAMPLE_MASK ((1 << LRADC_RESOLUTION) - 1) 240 240 241 + static void mxs_lradc_reg_set(struct mxs_lradc *lradc, u32 val, u32 reg) 242 + { 243 + writel(val, lradc->base + reg + STMP_OFFSET_REG_SET); 244 + } 245 + 246 + static void mxs_lradc_reg_clear(struct mxs_lradc *lradc, u32 val, u32 reg) 247 + { 248 + writel(val, lradc->base + reg + STMP_OFFSET_REG_CLR); 249 + } 250 + 251 + static void mxs_lradc_reg_wrt(struct mxs_lradc *lradc, u32 val, u32 reg) 252 + { 253 + writel(val, lradc->base + reg); 254 + } 255 + 256 + static u32 mxs_lradc_plate_mask(struct mxs_lradc *lradc) 257 + { 258 + return LRADC_CTRL0_MX28_PLATE_MASK; 259 + } 260 + 261 + static u32 mxs_lradc_irq_en_mask(struct mxs_lradc *lradc) 262 + { 263 + return LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK; 264 + } 265 + 266 + static u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc) 267 + { 268 + return LRADC_CTRL1_MX28_LRADC_IRQ_MASK; 269 + } 270 + 271 + static u32 mxs_lradc_touch_detect_bit(struct mxs_lradc *lradc) 272 + { 273 + return LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE; 274 + } 275 + 276 + static u32 mxs_lradc_drive_x_plate(struct mxs_lradc *lradc) 277 + { 278 + return LRADC_CTRL0_MX28_XPPSW | LRADC_CTRL0_MX28_XNNSW; 279 + } 280 + 281 + static u32 mxs_lradc_drive_y_plate(struct mxs_lradc *lradc) 282 + { 283 + return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_YNNSW; 284 + } 285 + 286 + static u32 mxs_lradc_drive_pressure(struct mxs_lradc *lradc) 287 + { 288 + return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW; 289 + } 290 + 241 291 /* 242 292 * Raw I/O operations 243 293 */ ··· 322 272 * Virtual channel 0 is always used here as the others are always not 323 273 * used if doing raw sampling. 324 274 */ 325 - writel(LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 326 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 327 - writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 275 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 276 + LRADC_CTRL1); 277 + mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 328 278 329 279 /* Clean the slot's previous content, then set new one. */ 330 - writel(LRADC_CTRL4_LRADCSELECT_MASK(0), 331 - lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 332 - writel(chan->channel, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 280 + mxs_lradc_reg_clear(lradc, LRADC_CTRL4_LRADCSELECT_MASK(0), LRADC_CTRL4); 281 + mxs_lradc_reg_set(lradc, chan->channel, LRADC_CTRL4); 333 282 334 - writel(0, lradc->base + LRADC_CH(0)); 283 + mxs_lradc_reg_wrt(lradc, 0, LRADC_CH(0)); 335 284 336 285 /* Enable the IRQ and start sampling the channel. */ 337 - writel(LRADC_CTRL1_LRADC_IRQ_EN(0), 338 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 339 - writel(1 << 0, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 286 + mxs_lradc_reg_set(lradc, LRADC_CTRL1_LRADC_IRQ_EN(0), LRADC_CTRL1); 287 + mxs_lradc_reg_set(lradc, 1 << 0, LRADC_CTRL0); 340 288 341 289 /* Wait for completion on the channel, 1 second max. */ 342 290 ret = wait_for_completion_killable_timeout(&lradc->completion, HZ); ··· 348 300 ret = IIO_VAL_INT; 349 301 350 302 err: 351 - writel(LRADC_CTRL1_LRADC_IRQ_EN(0), 352 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 303 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ_EN(0), LRADC_CTRL1); 353 304 354 305 mutex_unlock(&lradc->lock); 355 306 ··· 374 327 uint32_t reg; 375 328 376 329 /* Enable touch detection. */ 377 - writel(LRADC_CTRL0_MX28_PLATE_MASK, 378 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 379 - writel(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE, 380 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 330 + mxs_lradc_reg_clear(lradc, mxs_lradc_plate_mask(lradc), LRADC_CTRL0); 331 + mxs_lradc_reg_set(lradc, mxs_lradc_touch_detect_bit(lradc), 332 + LRADC_CTRL0); 381 333 382 334 msleep(LRADC_TS_SAMPLE_DELAY_MS); 383 335 ··· 421 375 */ 422 376 switch (plate) { 423 377 case LRADC_SAMPLE_X: 424 - ctrl0 = LRADC_CTRL0_MX28_XPPSW | LRADC_CTRL0_MX28_XNNSW; 378 + ctrl0 = mxs_lradc_drive_x_plate(lradc); 425 379 chan = 3; 426 380 break; 427 381 case LRADC_SAMPLE_Y: 428 - ctrl0 = LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_YNNSW; 382 + ctrl0 = mxs_lradc_drive_y_plate(lradc); 429 383 chan = 4; 430 384 break; 431 385 case LRADC_SAMPLE_PRESSURE: 432 - ctrl0 = LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW; 386 + ctrl0 = mxs_lradc_drive_pressure(lradc); 433 387 chan = 5; 434 388 break; 435 389 } 436 390 437 391 if (change) { 438 - writel(LRADC_CTRL0_MX28_PLATE_MASK, 439 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 440 - writel(ctrl0, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 392 + mxs_lradc_reg_clear(lradc, mxs_lradc_plate_mask(lradc), 393 + LRADC_CTRL0); 394 + mxs_lradc_reg_set(lradc, ctrl0, LRADC_CTRL0); 441 395 442 - writel(LRADC_CTRL4_LRADCSELECT_MASK(slot), 443 - lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 444 - writel(chan << LRADC_CTRL4_LRADCSELECT_OFFSET(slot), 445 - lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 396 + mxs_lradc_reg_clear(lradc, LRADC_CTRL4_LRADCSELECT_MASK(slot), 397 + LRADC_CTRL4); 398 + mxs_lradc_reg_set(lradc, 399 + chan << LRADC_CTRL4_LRADCSELECT_OFFSET(slot), 400 + LRADC_CTRL4); 446 401 } 447 402 448 - writel(0xffffffff, lradc->base + LRADC_CH(slot) + STMP_OFFSET_REG_CLR); 449 - writel(1 << slot, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 403 + mxs_lradc_reg_clear(lradc, 0xffffffff, LRADC_CH(slot)); 404 + mxs_lradc_reg_set(lradc, 1 << slot, LRADC_CTRL0); 450 405 451 406 delay = jiffies + msecs_to_jiffies(LRADC_TS_SAMPLE_DELAY_MS); 452 407 do { ··· 457 410 break; 458 411 } while (time_before(jiff, delay)); 459 412 460 - writel(LRADC_CTRL1_LRADC_IRQ(slot), 461 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 413 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_LRADC_IRQ(slot), LRADC_CTRL1); 462 414 463 415 if (time_after_eq(jiff, delay)) 464 416 return -ETIMEDOUT; ··· 496 450 497 451 while (mxs_lradc_ts_touched(lradc)) { 498 452 /* Disable touch detector so we can sample the touchscreen. */ 499 - writel(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE, 500 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 453 + mxs_lradc_reg_clear(lradc, mxs_lradc_touch_detect_bit(lradc), 454 + LRADC_CTRL0); 501 455 502 456 if (likely(valid)) { 503 457 input_report_abs(lradc->ts_input, ABS_X, val_x); ··· 531 485 return; 532 486 533 487 /* Restart the touchscreen interrupts. */ 534 - writel(LRADC_CTRL1_TOUCH_DETECT_IRQ, 535 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 536 - writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 537 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 488 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ, LRADC_CTRL1); 489 + mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); 538 490 } 539 491 540 492 static int mxs_lradc_ts_open(struct input_dev *dev) ··· 543 499 lradc->stop_touchscreen = false; 544 500 545 501 /* Enable the touch-detect circuitry. */ 546 - writel(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE, 547 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 502 + mxs_lradc_reg_set(lradc, mxs_lradc_touch_detect_bit(lradc), 503 + LRADC_CTRL0); 548 504 549 505 /* Enable the touch-detect IRQ. */ 550 - writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 551 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 506 + mxs_lradc_reg_set(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, LRADC_CTRL1); 552 507 553 508 return 0; 554 509 } ··· 564 521 cancel_work_sync(&lradc->ts_work); 565 522 566 523 /* Disable touchscreen touch-detect IRQ. */ 567 - writel(LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 568 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 524 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_TOUCH_DETECT_IRQ_EN, 525 + LRADC_CTRL1); 569 526 570 527 /* Power-down touchscreen touch-detect circuitry. */ 571 - writel(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE, 572 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 528 + mxs_lradc_reg_clear(lradc, mxs_lradc_touch_detect_bit(lradc), LRADC_CTRL0); 573 529 } 574 530 575 531 static int mxs_lradc_ts_register(struct mxs_lradc *lradc) ··· 631 589 LRADC_CTRL1_TOUCH_DETECT_IRQ_EN | 632 590 LRADC_CTRL1_TOUCH_DETECT_IRQ; 633 591 634 - if (!(reg & LRADC_CTRL1_MX28_LRADC_IRQ_MASK)) 592 + if (!(reg & mxs_lradc_irq_mask(lradc))) 635 593 return IRQ_NONE; 636 594 637 595 /* ··· 640 598 * it ASAP 641 599 */ 642 600 if (reg & LRADC_CTRL1_TOUCH_DETECT_IRQ) { 643 - writel(ts_irq_mask, 644 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 601 + mxs_lradc_reg_clear(lradc, ts_irq_mask, LRADC_CTRL1); 645 602 if (!lradc->stop_touchscreen) 646 603 schedule_work(&lradc->ts_work); 647 604 } ··· 650 609 else if (reg & LRADC_CTRL1_LRADC_IRQ(0)) 651 610 complete(&lradc->completion); 652 611 653 - writel(reg & LRADC_CTRL1_MX28_LRADC_IRQ_MASK, 654 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 612 + mxs_lradc_reg_clear(lradc, reg & mxs_lradc_irq_mask(lradc), LRADC_CTRL1); 655 613 656 614 return IRQ_HANDLED; 657 615 } ··· 669 629 670 630 for_each_set_bit(i, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) { 671 631 lradc->buffer[j] = readl(lradc->base + LRADC_CH(j)); 672 - writel(chan_value, lradc->base + LRADC_CH(j)); 632 + mxs_lradc_reg_wrt(lradc, chan_value, LRADC_CH(j)); 673 633 lradc->buffer[j] &= LRADC_CH_VALUE_MASK; 674 634 lradc->buffer[j] /= LRADC_DELAY_TIMER_LOOP; 675 635 j++; ··· 688 648 struct mxs_lradc *lradc = iio_priv(iio); 689 649 const uint32_t st = state ? STMP_OFFSET_REG_SET : STMP_OFFSET_REG_CLR; 690 650 691 - writel(LRADC_DELAY_KICK, lradc->base + LRADC_DELAY(0) + st); 651 + mxs_lradc_reg_wrt(lradc, LRADC_DELAY_KICK, LRADC_DELAY(0) + st); 692 652 693 653 return 0; 694 654 } ··· 764 724 if (ret < 0) 765 725 goto err_buf; 766 726 767 - writel(LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 768 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 769 - writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 727 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 728 + LRADC_CTRL1); 729 + mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 770 730 771 731 for_each_set_bit(chan, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) { 772 732 ctrl4_set |= chan << LRADC_CTRL4_LRADCSELECT_OFFSET(ofs); 773 733 ctrl4_clr |= LRADC_CTRL4_LRADCSELECT_MASK(ofs); 774 734 ctrl1_irq |= LRADC_CTRL1_LRADC_IRQ_EN(ofs); 775 - writel(chan_value, lradc->base + LRADC_CH(ofs)); 735 + mxs_lradc_reg_wrt(lradc, chan_value, LRADC_CH(ofs)); 776 736 bitmap_set(&enable, ofs, 1); 777 737 ofs++; 778 738 } 779 739 780 - writel(LRADC_DELAY_TRIGGER_LRADCS_MASK | LRADC_DELAY_KICK, 781 - lradc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_CLR); 782 - 783 - writel(ctrl4_clr, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); 784 - writel(ctrl4_set, lradc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); 785 - 786 - writel(ctrl1_irq, lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); 787 - 788 - writel(enable << LRADC_DELAY_TRIGGER_LRADCS_OFFSET, 789 - lradc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_SET); 740 + mxs_lradc_reg_clear(lradc, LRADC_DELAY_TRIGGER_LRADCS_MASK | 741 + LRADC_DELAY_KICK, LRADC_DELAY(0)); 742 + mxs_lradc_reg_clear(lradc, ctrl4_clr, LRADC_CTRL4); 743 + mxs_lradc_reg_set(lradc, ctrl4_set, LRADC_CTRL4); 744 + mxs_lradc_reg_set(lradc, ctrl1_irq, LRADC_CTRL1); 745 + mxs_lradc_reg_set(lradc, enable << LRADC_DELAY_TRIGGER_LRADCS_OFFSET, 746 + LRADC_DELAY(0)); 790 747 791 748 return 0; 792 749 ··· 798 761 { 799 762 struct mxs_lradc *lradc = iio_priv(iio); 800 763 801 - writel(LRADC_DELAY_TRIGGER_LRADCS_MASK | LRADC_DELAY_KICK, 802 - lradc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_CLR); 764 + mxs_lradc_reg_clear(lradc, LRADC_DELAY_TRIGGER_LRADCS_MASK | 765 + LRADC_DELAY_KICK, LRADC_DELAY(0)); 803 766 804 - writel(0xff, lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 805 - writel(LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 806 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 767 + mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 768 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 769 + LRADC_CTRL1); 807 770 808 771 kfree(lradc->buffer); 809 772 mutex_unlock(&lradc->lock); ··· 898 861 return ret; 899 862 900 863 /* Configure DELAY CHANNEL 0 for generic ADC sampling. */ 901 - writel(adc_cfg, lradc->base + LRADC_DELAY(0)); 864 + mxs_lradc_reg_wrt(lradc, adc_cfg, LRADC_DELAY(0)); 902 865 903 866 /* Disable remaining DELAY CHANNELs */ 904 - writel(0, lradc->base + LRADC_DELAY(1)); 905 - writel(0, lradc->base + LRADC_DELAY(2)); 906 - writel(0, lradc->base + LRADC_DELAY(3)); 867 + mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(1)); 868 + mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(2)); 869 + mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(3)); 907 870 908 871 /* Configure the touchscreen type */ 909 - writel(LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 910 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); 872 + mxs_lradc_reg_clear(lradc, LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 873 + LRADC_CTRL0); 911 874 912 - if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_5WIRE) { 913 - writel(LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 914 - lradc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); 875 + if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_5WIRE) 876 + mxs_lradc_reg_set(lradc, LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 877 + LRADC_CTRL0); 915 878 } 916 879 917 880 /* Start internal temperature sensing. */ 918 - writel(0, lradc->base + LRADC_CTRL2); 881 + mxs_lradc_reg_wrt(lradc, 0, LRADC_CTRL2); 919 882 920 883 return 0; 921 884 } ··· 924 887 { 925 888 int i; 926 889 927 - writel(LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 928 - lradc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); 890 + mxs_lradc_reg_clear(lradc, mxs_lradc_irq_en_mask(lradc), LRADC_CTRL1); 929 891 930 892 for (i = 0; i < LRADC_MAX_DELAY_CHANS; i++) 931 - writel(0, lradc->base + LRADC_DELAY(i)); 893 + mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(i)); 932 894 } 933 895 934 896 static const struct of_device_id mxs_lradc_dt_ids[] = {