From patchwork Tue Nov 7 15:36:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Fritz X-Patchwork-Id: 10046943 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8CCDD60247 for ; Tue, 7 Nov 2017 15:37:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7E8562A1F3 for ; Tue, 7 Nov 2017 15:37:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7395B2A222; Tue, 7 Nov 2017 15:37:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F16202A21D for ; Tue, 7 Nov 2017 15:37:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756307AbdKGPhA (ORCPT ); Tue, 7 Nov 2017 10:37:00 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:56982 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751925AbdKGPgz (ORCPT ); Tue, 7 Nov 2017 10:36:55 -0500 Received: by mail-wr0-f194.google.com with SMTP id q66so8618408wrb.13; Tue, 07 Nov 2017 07:36:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZSvEgafH2ZTJnedm+KFsLU9UL23cI2lG3Xh0thqM/g8=; b=FErFJl6esktD8ectltBvQBeFecqsRamwI9qTczY0ao+uBUVtbbNLaFU7ep8mhqoN0O UZFJ7ZWnPw/W7PaSSo9lVKNJe7E+aAUbnUDMAAv6bef7zjT8FyjVWVvOy5VrbV9y983L ECXNF53wtMLmQlrrLxt/9Eqc4A2gQskHqtFsW9iko58J654NqvoeCFiZs0vokBll3Fhh 4x7pon8bQuxr6A/NRUjecIOYpqaYAf7OXPwGMCE2I/E0tzdqfGIbRgycpDZe9ZJ0UozI A2IwtIBjoo8RC7U0SItrtXwOSjvG/gY0o0pVQqBgQ1d9pJVQ50L8Qv5JJI2H9dpZYgTh /ycw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZSvEgafH2ZTJnedm+KFsLU9UL23cI2lG3Xh0thqM/g8=; b=DOURQmXJPILpDODlUt3kc+CJZu2v0EBJgOUESri3lTGrsYM4gJD1GYzicUsnJGcysl XBLVIYY3BpnCx18ZxgHWclaGK/KYYPeMyeLtu9kFI08I15p/01io7aDDGQzOzmAIUeat 1LzGOrXFMEs0UZrdUBNO50MMS1AjAGJFAY4+XFfNdzD2Kuo3BN8iw4Ys1VUa2Se93j7d +fi+rXRWhxZFtwcHnm//rJLRwrGCWDfceixQT+CITc/UIMHhNRJD55zjVZtXqi805qpB HsV5i5LVcvdPEbQMalL9SMfh6mrUpaQMEo1KCO1j3Ps1iHL/Illxwrc0nTRxjvyiiR17 N9vg== X-Gm-Message-State: AMCzsaU/0QYEj0D4P2r+0I/B0Q3tezKfbOd83IxOBUdFBjQ+dnZSP1cz Zr/cPEWBwWqpX//MMF4+5Ug= X-Google-Smtp-Source: ABhQp+QM81olguoomWwOirfg44JF9cinGbGyQSoJZz222PVQLKLP9CZ07+0WL5lBdwHNapCdSaUwXg== X-Received: by 10.223.187.131 with SMTP id q3mr15372159wrg.83.1510069013799; Tue, 07 Nov 2017 07:36:53 -0800 (PST) Received: from mars.fritz.box (HSI-KBW-109-193-021-110.hsi7.kabel-badenwuerttemberg.de. [109.193.21.110]) by smtp.googlemail.com with ESMTPSA id q74sm2934227wrb.51.2017.11.07.07.36.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Nov 2017 07:36:52 -0800 (PST) From: Christoph Fritz To: Jonathan Cameron , Peter Meerwald-Stadler , Rob Herring Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH 3/3] iio: light: isl76683 add way to adjust irq threshold Date: Tue, 7 Nov 2017 16:36:23 +0100 Message-Id: <1510068983-25769-4-git-send-email-chf.fritz@googlemail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1510068983-25769-1-git-send-email-chf.fritz@googlemail.com> References: <1510068983-25769-1-git-send-email-chf.fritz@googlemail.com> Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds sysfs read/write support for upper and lower irq thresholds. So it's possible that only on certain lux ranges the irq triggered measurement happens. Signed-off-by: Christoph Fritz --- .../ABI/testing/sysfs-bus-iio-light-isl76683 | 17 +++++++ drivers/iio/light/isl76683.c | 58 ++++++++++++++++++++-- 2 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-light-isl76683 diff --git a/Documentation/ABI/testing/sysfs-bus-iio-light-isl76683 b/Documentation/ABI/testing/sysfs-bus-iio-light-isl76683 new file mode 100644 index 0000000..c7e08d7 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-iio-light-isl76683 @@ -0,0 +1,17 @@ +What: /sys/bus/iio/devices/iio:deviceX/in_illuminance_threshold_low +Date: November 2017 +KernelVersion: 4.15.0 +Contact: linux-iio@vger.kernel.org +Description: + Raw value of lower threshold for the interrupt. + Reading returns 8-bit MSB data of a 16-bit threshold. + Writing 0...255 represents 8-bit MSB data of a 16-bit threshold. + +What: /sys/bus/iio/devices/iio:deviceX/in_illuminance_threshold_up +Date: November 2017 +KernelVersion: 4.15.0 +Contact: linux-iio@vger.kernel.org +Description: + Raw value of upper threshold for the interrupt. + Reading returns 8-bit MSB data of a 16-bit threshold. + Writing 0...255 represents 8-bit MSB data of a 16-bit threshold. diff --git a/drivers/iio/light/isl76683.c b/drivers/iio/light/isl76683.c index b730276..889fb85 100644 --- a/drivers/iio/light/isl76683.c +++ b/drivers/iio/light/isl76683.c @@ -74,11 +74,14 @@ static const int isl76683_lux_ranges_available[] = { #define ISL76683_KOHM_MAX 1000 #define ISL76683_INTPERS_DEFAULT 0x0 #define ISL76683_THR_DEFAULT 0x7f +#define ISL76683_THR_MAX 0xFF struct isl76683_chip { enum isl76683_lux_range luxrange; int external_resistor; enum isl76683_dmode photodiode; + int threshold_up; + int threshold_low; struct i2c_client *client; struct regmap *rmp; struct completion irq_complete; @@ -159,13 +162,11 @@ static int isl76683_set_config(struct isl76683_chip *chip) if (ret < 0) return ret; - ret = regmap_write(chip->rmp, ISL76683_REG_THR_HI, - ISL76683_THR_DEFAULT); + ret = regmap_write(chip->rmp, ISL76683_REG_THR_HI, chip->threshold_up); if (ret < 0) return ret; - ret = regmap_write(chip->rmp, ISL76683_REG_THR_LO, - ISL76683_THR_DEFAULT); + ret = regmap_write(chip->rmp, ISL76683_REG_THR_LO, chip->threshold_low); if (ret < 0) return ret; @@ -415,11 +416,58 @@ static int isl76683_write_raw(struct iio_dev *indio_dev, return -EINVAL; } +#define ISL76683_SYSFS_STORE(ident, _max) \ +static ssize_t in_illuminance_##ident##_store(struct device *dev, \ + struct device_attribute *attr, \ + const char *buf, size_t len) \ +{ \ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); \ + struct isl76683_chip *chip = iio_priv(indio_dev); \ + unsigned int val; \ + int ret; \ + \ + if (kstrtouint(buf, 10, &val)) \ + return -EINVAL; \ + \ + if (val > _max) \ + return -EINVAL; \ + \ + mutex_lock(&chip->lock); \ + chip->ident = val; \ + ret = isl76683_set_config(chip); \ + mutex_unlock(&chip->lock); \ + \ + if (ret) \ + return -EIO; \ + \ + return len; \ +} + +ISL76683_SYSFS_STORE(threshold_low, ISL76683_THR_MAX) +ISL76683_SYSFS_STORE(threshold_up, ISL76683_THR_MAX) + +#define ISL76683_SYSFS_SHOW(ident, show_val) \ +static ssize_t in_illuminance_##ident##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct iio_dev *indio_dev = dev_to_iio_dev(dev); \ + struct isl76683_chip *chip = iio_priv(indio_dev); \ + \ + return snprintf(buf, PAGE_SIZE, "%i\n", show_val); \ +} + +ISL76683_SYSFS_SHOW(threshold_up, chip->threshold_up) +ISL76683_SYSFS_SHOW(threshold_low, chip->threshold_low) + static IIO_CONST_ATTR(in_illuminance_hardwaregain_available, ISL76683_LUXRANGE_STR); +static IIO_DEVICE_ATTR_RW(in_illuminance_threshold_up, 0); +static IIO_DEVICE_ATTR_RW(in_illuminance_threshold_low, 0); static struct attribute *isl76683_attributes[] = { &iio_const_attr_in_illuminance_hardwaregain_available.dev_attr.attr, + &iio_dev_attr_in_illuminance_threshold_up.dev_attr.attr, + &iio_dev_attr_in_illuminance_threshold_low.dev_attr.attr, NULL }; @@ -535,6 +583,8 @@ static int isl76683_probe(struct i2c_client *client, chip->luxrange = ISL76683_LUX_RANGE_DEFAULT; chip->external_resistor = rs; chip->photodiode = ISL76683_DIODE_DEFAULT; + chip->threshold_up = ISL76683_THR_DEFAULT; + chip->threshold_low = ISL76683_THR_DEFAULT; chip->buffer_running = false; chip->rmp = devm_regmap_init_i2c(client, &isl76683_regmap_config);