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

Staging: iio: meter: ade7758_core: implement IIO_CHAN_INFO_SAMP_FREQ

This driver predates the availability of IIO_CHAN_INFO_SAMP_FREQ attribute
wherein usage has some advantages like it can be accessed by in-kernel
consumers as well as reduces the code size.

Hence moving functionality from IIO_DEV_ATTR_SAMP_FREQ attribute into
IIO_CHAN_INFO_SAMP_FREQ handlers. Also Adding ade7758_read_raw() and
ade7758_write_raw() to allow reading/writing the element as well.

Signed-off-by: Sandhya Bankar <bankarsandhya512@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Sandhya Bankar and committed by
Jonathan Cameron
73d2ad96 eceb0460

+63 -23
+63 -23
drivers/staging/iio/meter/ade7758_core.c
··· 465 465 return ret; 466 466 } 467 467 468 - static ssize_t ade7758_read_frequency(struct device *dev, 469 - struct device_attribute *attr, char *buf) 468 + static int ade7758_read_samp_freq(struct device *dev, int *val) 470 469 { 471 470 int ret; 472 471 u8 t; 473 - int sps; 474 472 475 473 ret = ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, &t); 476 474 if (ret) 477 475 return ret; 478 476 479 477 t = (t >> 5) & 0x3; 480 - sps = 26040 / (1 << t); 478 + *val = 26040 / (1 << t); 481 479 482 - return sprintf(buf, "%d SPS\n", sps); 480 + return 0; 483 481 } 484 482 485 - static ssize_t ade7758_write_frequency(struct device *dev, 486 - struct device_attribute *attr, 487 - const char *buf, size_t len) 483 + static int ade7758_write_samp_freq(struct device *dev, int val) 488 484 { 489 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 490 - u16 val; 491 485 int ret; 492 486 u8 reg, t; 493 - 494 - ret = kstrtou16(buf, 10, &val); 495 - if (ret) 496 - return ret; 497 - 498 - mutex_lock(&indio_dev->mlock); 499 487 500 488 switch (val) { 501 489 case 26040: ··· 513 525 ret = ade7758_spi_write_reg_8(dev, ADE7758_WAVMODE, reg); 514 526 515 527 out: 516 - mutex_unlock(&indio_dev->mlock); 528 + return ret; 529 + } 517 530 518 - return ret ? ret : len; 531 + static int ade7758_read_raw(struct iio_dev *indio_dev, 532 + struct iio_chan_spec const *chan, 533 + int *val, 534 + int *val2, 535 + long mask) 536 + { 537 + int ret; 538 + 539 + switch (mask) { 540 + case IIO_CHAN_INFO_SAMP_FREQ: 541 + mutex_lock(&indio_dev->mlock); 542 + ret = ade7758_read_samp_freq(&indio_dev->dev, val); 543 + mutex_unlock(&indio_dev->mlock); 544 + return ret; 545 + default: 546 + return -EINVAL; 547 + } 548 + 549 + return ret; 550 + } 551 + 552 + static int ade7758_write_raw(struct iio_dev *indio_dev, 553 + struct iio_chan_spec const *chan, 554 + int val, int val2, long mask) 555 + { 556 + int ret; 557 + 558 + switch (mask) { 559 + case IIO_CHAN_INFO_SAMP_FREQ: 560 + if (val2) 561 + return -EINVAL; 562 + mutex_lock(&indio_dev->mlock); 563 + ret = ade7758_write_samp_freq(&indio_dev->dev, val); 564 + mutex_unlock(&indio_dev->mlock); 565 + return ret; 566 + default: 567 + return -EINVAL; 568 + } 569 + 570 + return ret; 519 571 } 520 572 521 573 static IIO_DEV_ATTR_TEMP_RAW(ade7758_read_8bit); ··· 581 553 static IIO_DEV_ATTR_CVAHR(ade7758_read_16bit, 582 554 ADE7758_CVAHR); 583 555 584 - static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 585 - ade7758_read_frequency, 586 - ade7758_write_frequency); 587 - 588 556 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("26040 13020 6510 3255"); 589 557 590 558 static struct attribute *ade7758_attributes[] = { 591 559 &iio_dev_attr_in_temp_raw.dev_attr.attr, 592 560 &iio_const_attr_in_temp_offset.dev_attr.attr, 593 561 &iio_const_attr_in_temp_scale.dev_attr.attr, 594 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 595 562 &iio_const_attr_sampling_frequency_available.dev_attr.attr, 596 563 &iio_dev_attr_awatthr.dev_attr.attr, 597 564 &iio_dev_attr_bwatthr.dev_attr.attr, ··· 634 611 .type = IIO_VOLTAGE, 635 612 .indexed = 1, 636 613 .channel = 0, 614 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 637 615 .address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE), 638 616 .scan_index = 0, 639 617 .scan_type = { ··· 646 622 .type = IIO_CURRENT, 647 623 .indexed = 1, 648 624 .channel = 0, 625 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 649 626 .address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT), 650 627 .scan_index = 1, 651 628 .scan_type = { ··· 659 634 .indexed = 1, 660 635 .channel = 0, 661 636 .extend_name = "apparent", 637 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 662 638 .address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR), 663 639 .scan_index = 2, 664 640 .scan_type = { ··· 672 646 .indexed = 1, 673 647 .channel = 0, 674 648 .extend_name = "active", 649 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 675 650 .address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR), 676 651 .scan_index = 3, 677 652 .scan_type = { ··· 685 658 .indexed = 1, 686 659 .channel = 0, 687 660 .extend_name = "reactive", 661 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 688 662 .address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR), 689 663 .scan_index = 4, 690 664 .scan_type = { ··· 697 669 .type = IIO_VOLTAGE, 698 670 .indexed = 1, 699 671 .channel = 1, 672 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 700 673 .address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE), 701 674 .scan_index = 5, 702 675 .scan_type = { ··· 709 680 .type = IIO_CURRENT, 710 681 .indexed = 1, 711 682 .channel = 1, 683 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 712 684 .address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT), 713 685 .scan_index = 6, 714 686 .scan_type = { ··· 722 692 .indexed = 1, 723 693 .channel = 1, 724 694 .extend_name = "apparent", 695 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 725 696 .address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR), 726 697 .scan_index = 7, 727 698 .scan_type = { ··· 735 704 .indexed = 1, 736 705 .channel = 1, 737 706 .extend_name = "active", 707 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 738 708 .address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR), 739 709 .scan_index = 8, 740 710 .scan_type = { ··· 748 716 .indexed = 1, 749 717 .channel = 1, 750 718 .extend_name = "reactive", 719 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 751 720 .address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR), 752 721 .scan_index = 9, 753 722 .scan_type = { ··· 760 727 .type = IIO_VOLTAGE, 761 728 .indexed = 1, 762 729 .channel = 2, 730 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 763 731 .address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE), 764 732 .scan_index = 10, 765 733 .scan_type = { ··· 772 738 .type = IIO_CURRENT, 773 739 .indexed = 1, 774 740 .channel = 2, 741 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 775 742 .address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT), 776 743 .scan_index = 11, 777 744 .scan_type = { ··· 785 750 .indexed = 1, 786 751 .channel = 2, 787 752 .extend_name = "apparent", 753 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 788 754 .address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR), 789 755 .scan_index = 12, 790 756 .scan_type = { ··· 798 762 .indexed = 1, 799 763 .channel = 2, 800 764 .extend_name = "active", 765 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 801 766 .address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR), 802 767 .scan_index = 13, 803 768 .scan_type = { ··· 811 774 .indexed = 1, 812 775 .channel = 2, 813 776 .extend_name = "reactive", 777 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 814 778 .address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR), 815 779 .scan_index = 14, 816 780 .scan_type = { ··· 825 787 826 788 static const struct iio_info ade7758_info = { 827 789 .attrs = &ade7758_attribute_group, 790 + .read_raw = &ade7758_read_raw, 791 + .write_raw = &ade7758_write_raw, 828 792 .driver_module = THIS_MODULE, 829 793 }; 830 794