From patchwork Wed Aug 15 20:38:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Frey X-Patchwork-Id: 10566829 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 72B9B14E1 for ; Wed, 15 Aug 2018 20:35:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 325942ACA9 for ; Wed, 15 Aug 2018 20:35:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2483B2AE95; Wed, 15 Aug 2018 20:35:44 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI 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 9BA0B2ACA9 for ; Wed, 15 Aug 2018 20:35:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727321AbeHOX30 (ORCPT ); Wed, 15 Aug 2018 19:29:26 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:35146 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726133AbeHOX3Z (ORCPT ); Wed, 15 Aug 2018 19:29:25 -0400 Received: by mail-pl0-f66.google.com with SMTP id g1-v6so961773plo.2; Wed, 15 Aug 2018 13:35:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+dKG8xiv6F9rgbiTZ0M1SGqr2LyY1PO6ZacRuW2PL+8=; b=Bp78c9CnakZSOluYuCFOt+eE7YLZhxfhi71giBSmOJGp8JyVjCbIUzfjJ4XhhUT93B CpJK7EFiONzaIro1NsnXDXKU47IGkWoARrUEjHvyXgyPJgnl2gMeT9pSQpBbtpBEE4u/ FWMaLfEl4TexVf8MLjddRtRFQf6xNrzHkRBDdvCrvxqCvPTe0cWd4QYVNvgiMsIymJ9q Ef/BpvNyDp0fPF6zOeTR1dF9SAEO1OuMMEezoxKkSl+Q23nQ9T0O3ggB4X6ucqCvLvfn iZNAzAD9plFV53lQXWt0Ne7bNPywS2v9vOYKRga2e4Bnnbx1ZWvCB9UYMk7IOZ/FL+Io JPvQ== 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=+dKG8xiv6F9rgbiTZ0M1SGqr2LyY1PO6ZacRuW2PL+8=; b=eyMhWOBAHJhgYWvG4z6YLItWQFWwTgYWj4T3zFvc4EnjEP4+z6/TaHqVyhZc0JSBqK F6QJM7lDjkTtBBzRCNdfdFgda8Khavptad7/ySMfUYQkEmXQYbbd0abZ8tcakOpYXfLZ 6L016Xp2yn2sfxSB7pJjXXUj2TWtRPOe+3NKJOH5IMCD08X4prwD1hC4tSalnJXBwyz2 lLolBscfvTVbSP8NVBylHsDQnuSH9ypXT5kkTsBbXZep+XnkwPiKZnime8YwsAyCDf8Y GLf+FLE3v8k8X+FaMwracUhxe37Im7ZP+ubbxStCLe7UR1NM0Zu3ENPEZOv4tDB8CZPi j+6w== X-Gm-Message-State: AOUpUlGvqCIDPQKQGK8h3UWm27jKmts7ekQ6rr/oKr7ISmG8A6Ah5F5K FKRPTrGwsjjUv5Q6exDdO0hCI/5J X-Google-Smtp-Source: AA+uWPxGwVe+foarymsdRJuwgCqNgLUZwdxBiQ3gS4WJzAGz3b3Qoq+QM6nqCyRgcVflzIigwtodxw== X-Received: by 2002:a17:902:8d8c:: with SMTP id v12-v6mr25523989plo.94.1534365341833; Wed, 15 Aug 2018 13:35:41 -0700 (PDT) Received: from dfrey-debian-linux.sierrawireless.local ([185.153.179.9]) by smtp.gmail.com with ESMTPSA id d9-v6sm35784055pfb.86.2018.08.15.13.35.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Aug 2018 13:35:40 -0700 (PDT) From: David Frey To: linux-iio@vger.kernel.org Cc: jic23@vger.kernel.org, himanshujha199640@gmail.com, David Frey Subject: [PATCH v2 7/7] iio: chemical: bme680: simplify oversampling handling Date: Wed, 15 Aug 2018 13:38:35 -0700 Message-Id: <20180815203835.21079-8-dpfrey@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180815203835.21079-1-dpfrey@gmail.com> References: <20180815203835.21079-1-dpfrey@gmail.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 Temperature, pressure and humidity all expose and oversampling setting that works in the same way. Provide common handling for the oversampling sysfs attributes. Signed-off-by: David Frey --- drivers/iio/chemical/bme680_core.c | 99 ++++++++++++++------------------------ 1 file changed, 36 insertions(+), 63 deletions(-) diff --git a/drivers/iio/chemical/bme680_core.c b/drivers/iio/chemical/bme680_core.c index c96e4a991a61..799389e8c0d9 100644 --- a/drivers/iio/chemical/bme680_core.c +++ b/drivers/iio/chemical/bme680_core.c @@ -91,8 +91,6 @@ static const struct iio_chan_spec bme680_channels[] = { }, }; -static const int bme680_oversampling_avail[] = { 1, 2, 4, 8, 16 }; - static int bme680_read_calib(struct bme680_data *data, struct bme680_calib *calib) { @@ -503,12 +501,20 @@ static int bme680_set_mode(struct bme680_data *data, bool mode) return ret; } +static u8 bme680_oversampling_to_reg(u8 val) +{ + return ilog2(val) + 1; +} + static int bme680_chip_config(struct bme680_data *data) { struct device *dev = regmap_get_device(data->regmap); int ret; - u8 osrs = FIELD_PREP(BME680_OSRS_HUMIDITY_MASK, - data->oversampling_humid + 1); + u8 osrs; + + osrs = FIELD_PREP( + BME680_OSRS_HUMIDITY_MASK, + bme680_oversampling_to_reg(data->oversampling_humid)); /* * Highly recommended to set oversampling of humidity before * temperature/pressure oversampling. @@ -529,12 +535,12 @@ static int bme680_chip_config(struct bme680_data *data) return ret; } - osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK, data->oversampling_temp + 1) | - FIELD_PREP(BME680_OSRS_PRESS_MASK, data->oversampling_press + 1); - + osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK, + bme680_oversampling_to_reg(data->oversampling_temp)) | + FIELD_PREP(BME680_OSRS_PRESS_MASK, + bme680_oversampling_to_reg(data->oversampling_press)); ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS, - BME680_OSRS_TEMP_MASK | - BME680_OSRS_PRESS_MASK, + BME680_OSRS_TEMP_MASK | BME680_OSRS_PRESS_MASK, osrs); if (ret < 0) dev_err(dev, "failed to write ctrl_meas register\n"); @@ -767,13 +773,13 @@ static int bme680_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_OVERSAMPLING_RATIO: switch (chan->type) { case IIO_TEMP: - *val = 1 << data->oversampling_temp; + *val = data->oversampling_temp; return IIO_VAL_INT; case IIO_PRESSURE: - *val = 1 << data->oversampling_press; + *val = data->oversampling_press; return IIO_VAL_INT; case IIO_HUMIDITYRELATIVE: - *val = 1 << data->oversampling_humid; + *val = data->oversampling_humid; return IIO_VAL_INT; default: return -EINVAL; @@ -783,52 +789,9 @@ static int bme680_read_raw(struct iio_dev *indio_dev, } } -static int bme680_write_oversampling_ratio_temp(struct bme680_data *data, - int val) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) { - if (bme680_oversampling_avail[i] == val) { - data->oversampling_temp = ilog2(val); - - return bme680_chip_config(data); - } - } - - return -EINVAL; -} - -static int bme680_write_oversampling_ratio_press(struct bme680_data *data, - int val) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) { - if (bme680_oversampling_avail[i] == val) { - data->oversampling_press = ilog2(val); - - return bme680_chip_config(data); - } - } - - return -EINVAL; -} - -static int bme680_write_oversampling_ratio_humid(struct bme680_data *data, - int val) +static bool bme680_is_valid_oversampling(int rate) { - int i; - - for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) { - if (bme680_oversampling_avail[i] == val) { - data->oversampling_humid = ilog2(val); - - return bme680_chip_config(data); - } - } - - return -EINVAL; + return (rate > 0 && rate <= 16 && is_power_of_2(rate)); } static int bme680_write_raw(struct iio_dev *indio_dev, @@ -839,16 +802,26 @@ static int bme680_write_raw(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + { + if (!bme680_is_valid_oversampling(val)) + return -EINVAL; + switch (chan->type) { case IIO_TEMP: - return bme680_write_oversampling_ratio_temp(data, val); + data->oversampling_temp = val; + break; case IIO_PRESSURE: - return bme680_write_oversampling_ratio_press(data, val); + data->oversampling_press = val; + break; case IIO_HUMIDITYRELATIVE: - return bme680_write_oversampling_ratio_humid(data, val); + data->oversampling_humid = val; + break; default: return -EINVAL; } + + return bme680_chip_config(data); + } default: return -EINVAL; } @@ -910,9 +883,9 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap, indio_dev->modes = INDIO_DIRECT_MODE; /* default values for the sensor */ - data->oversampling_humid = ilog2(2); /* 2X oversampling rate */ - data->oversampling_press = ilog2(4); /* 4X oversampling rate */ - data->oversampling_temp = ilog2(8); /* 8X oversampling rate */ + data->oversampling_humid = 2; /* 2X oversampling rate */ + data->oversampling_press = 4; /* 4X oversampling rate */ + data->oversampling_temp = 8; /* 8X oversampling rate */ data->heater_temp = 320; /* degree Celsius */ data->heater_dur = 150; /* milliseconds */