From patchwork Mon May 14 10:31:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Silvan Murer X-Patchwork-Id: 912842 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=devicetree-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kD5fnuNt"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40kxnj4dm2z9s02 for ; Mon, 14 May 2018 20:31:37 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752207AbeENKbg (ORCPT ); Mon, 14 May 2018 06:31:36 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:34868 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752082AbeENKbe (ORCPT ); Mon, 14 May 2018 06:31:34 -0400 Received: by mail-wm0-f65.google.com with SMTP id o78-v6so14198265wmg.0; Mon, 14 May 2018 03:31:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=EcLPNdgkDOyJktCHuFq/XgvPp8/0Sant8lY+rebYIfE=; b=kD5fnuNtEcwFbT/0q/iCbi1DS02FV7t+Py6Iim2pv8T5NJvkR5VQdcjiyGylvsGneu 2Z60KAAoL03GslglAvKuvp6TAe6O7mDl4DpuvR5LFRAVr7zoVr2uwHj5cNjW5t4T6HYQ NTOJpIk3aj713JrPmBY452Qj5ZACdSmO7eS1MKwaw2+AAVz0Tm1BGiNnlJG+9IymmwwG vArOHGlw5usjBWcCwqiJjDfrZKpZlQahhZBbCRRQY4A3dT8r6w2WwXag1jjHveQJ7RAi K+RhxIaZui95QKRps6s2EiMo8RwKHZEWOtkZymzKD6kplMiDi8dNpK0udVut8ECh4Yt9 fh3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=EcLPNdgkDOyJktCHuFq/XgvPp8/0Sant8lY+rebYIfE=; b=Z6XbJEbhYjQYQbPghsTDL3kKRhXfgocCEzrppfwsc74Tqz7PmfmSytEym2HX7Pm814 WDpgTNnuhW5z7mW8JGrV3Hv/WF8g2ueO4+O4yF+ugYvI1k0fihrKVfbvZTlzc4tEi868 mOZm94HvNpDwZ3f2EZQSxhkFYeIV1CRheiMUs3t96ZlCzjhNnYhXjUOzElrB2JEL5qbr JQd6j5NwtcvNc5ewFV9H4sJhOkADdJ/7i4vlUpHThNWb/OBv4C1t36iefBcb9J9zCHy5 bcBiHlWN6r2TumxxX4/ZAwtC74JDYGiSe/noAsxP0dJ/qrHXMl4DMRmVeDiiOJSTo7yN VCdg== X-Gm-Message-State: ALKqPweuVtEhKHgfX+Ydu+1PcODok/w/iEv95YT/3rqStBLHRixgO3qj nnhNWMZehBGCmtYQHhMejaF+fw== X-Google-Smtp-Source: AB8JxZq5tFuAVoRrKRyPwT8QU3R52qrm7hXZ+2aW9B6MjQZptVxPDppPpAl6OdiaPTpj/a1E2ekEBQ== X-Received: by 2002:a50:9746:: with SMTP id d6-v6mr12232190edb.174.1526293893338; Mon, 14 May 2018 03:31:33 -0700 (PDT) Received: from heldsksm.heliotis.ads (154.40.3.213.static.wline.lns.sme.cust.swisscom.ch. [213.3.40.154]) by smtp.gmail.com with ESMTPSA id t19-v6sm4781481edh.31.2018.05.14.03.31.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 14 May 2018 03:31:32 -0700 (PDT) Message-ID: <1526293892.12966.21.camel@gmail.com> Subject: [PATCH] iio: dac: Add regulator framework to LTC2632 device driver From: Silvan Murer To: Jonathan Cameron Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Date: Mon, 14 May 2018 12:31:32 +0200 X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This patch adds support for external reference voltage through the regulator framework. The patch add also the remove function to the device driver. Signed-off-by: Silvan Murer ---  .../devicetree/bindings/iio/dac/ltc2632.txt        |  9 +++  drivers/iio/dac/ltc2632.c                          | 86 +++++++++++++++++-----  2 files changed, 78 insertions(+), 17 deletions(-) --  2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/Documentation/devicetree/bindings/iio/dac/ltc2632.txt b/Documentation/devicetree/bindings/iio/dac/ltc2632.txt index eb911e5..d369a4b 100644 --- a/Documentation/devicetree/bindings/iio/dac/ltc2632.txt +++ b/Documentation/devicetree/bindings/iio/dac/ltc2632.txt @@ -14,10 +14,19 @@ apply. In particular, "reg" and "spi-max-frequency" properties must be given.    Example:   + vref: regulator-vref { + compatible = "regulator-fixed"; + regulator-name = "vref-ltc2632"; + regulator-min-microvolt = <1250000>; + regulator-max-microvolt = <1250000>; + regulator-always-on; + }; +   spi_master {   dac: ltc2632@0 {   compatible = "lltc,ltc2632-l12";   reg = <0>; /* CS0 */   spi-max-frequency = <1000000>; + vref-supply = <&vref>; /* optional */   };   }; diff --git a/drivers/iio/dac/ltc2632.c b/drivers/iio/dac/ltc2632.c index ac5e05f..4a5c5bd 100644 --- a/drivers/iio/dac/ltc2632.c +++ b/drivers/iio/dac/ltc2632.c @@ -2,6 +2,7 @@   * LTC2632 Digital to analog convertors spi driver   *   * Copyright 2017 Maxime Roussin-Bélanger + * expanded by Silvan Murer   *   * Licensed under the GPL-2.   */ @@ -10,6 +11,7 @@  #include  #include  #include +#include    #define LTC2632_DAC_CHANNELS                    2   @@ -28,7 +30,7 @@  /**   * struct ltc2632_chip_info - chip specific information   * @channels: channel spec for the DAC - * @vref_mv: reference voltage + * @vref_mv: internal reference voltage   */  struct ltc2632_chip_info {   const struct iio_chan_spec *channels; @@ -39,10 +41,14 @@ struct ltc2632_chip_info {   * struct ltc2632_state - driver instance specific data   * @spi_dev: pointer to the spi_device struct   * @powerdown_cache_mask used to show current channel powerdown state + * @vref_mv used reference voltage (internal or external) + * @vref_reg regulator for the reference voltage   */  struct ltc2632_state {   struct spi_device *spi_dev;   unsigned int powerdown_cache_mask; + int vref_mv; + struct regulator *vref_reg;  };    enum ltc2632_supported_device_ids { @@ -90,7 +96,7 @@ static int ltc2632_read_raw(struct iio_dev *indio_dev,     switch (m) {   case IIO_CHAN_INFO_SCALE: - *val = chip_info->vref_mv; + *val = st->vref_mv;   *val2 = chan->scan_type.realbits;   return IIO_VAL_FRACTIONAL_LOG2;   } @@ -247,6 +253,41 @@ static int ltc2632_probe(struct spi_device *spi)   chip_info = (struct ltc2632_chip_info *)   spi_get_device_id(spi)->driver_data;   + st->vref_reg = devm_regulator_get_optional(&spi->dev, "vref"); + if (IS_ERR(st->vref_reg)) { + /* use internal reference voltage */ + st->vref_reg = NULL; + st->vref_mv = chip_info->vref_mv; + + ret = ltc2632_spi_write(spi, LTC2632_CMD_INTERNAL_REFER, + 0, 0, 0); + if (ret) { + dev_err(&spi->dev, + "Set internal reference command failed, %d\n", + ret); + return ret; + } + } else { + /* use external reference voltage */ + ret = regulator_enable(st->vref_reg); + if (ret) { + dev_err(&spi->dev, + "enable reference regulator failed, %d\n", + ret); + return ret; + } + st->vref_mv = regulator_get_voltage(st->vref_reg)/1000; + + ret = ltc2632_spi_write(spi, LTC2632_CMD_EXTERNAL_REFER, + 0, 0, 0); + if (ret) { + dev_err(&spi->dev, + "Set external reference command failed, %d\n", + ret); + return ret; + } + } +   indio_dev->dev.parent = &spi->dev;   indio_dev->name = dev_of_node(&spi->dev) ? dev_of_node(&spi->dev)->name    : spi_get_device_id(spi)->name; @@ -255,14 +296,23 @@ static int ltc2632_probe(struct spi_device *spi)   indio_dev->channels = chip_info->channels;   indio_dev->num_channels = LTC2632_DAC_CHANNELS;   - ret = ltc2632_spi_write(spi, LTC2632_CMD_INTERNAL_REFER, 0, 0, 0); - if (ret) { - dev_err(&spi->dev, - "Set internal reference command failed, %d\n", ret); - return ret; + return devm_iio_device_register(&spi->dev, indio_dev); +} + +static int ltc2632_remove(struct spi_device *spi) +{ + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ltc2632_state *st = iio_priv(indio_dev); + + devm_iio_device_unregister(&spi->dev, indio_dev); + + if (st->vref_reg != NULL) { + regulator_disable(st->vref_reg); + devm_regulator_put(st->vref_reg);   }   - return devm_iio_device_register(&spi->dev, indio_dev); + devm_iio_device_free(&spi->dev, indio_dev); + return 0;  }    static const struct spi_device_id ltc2632_id[] = { @@ -276,15 +326,6 @@ static const struct spi_device_id ltc2632_id[] = {  };  MODULE_DEVICE_TABLE(spi, ltc2632_id);   -static struct spi_driver ltc2632_driver = { - .driver = { - .name = "ltc2632", - }, - .probe = ltc2632_probe, - .id_table = ltc2632_id, -}; -module_spi_driver(ltc2632_driver); -  static const struct of_device_id ltc2632_of_match[] = {   {   .compatible = "lltc,ltc2632-l12", @@ -309,6 +350,17 @@ static const struct of_device_id ltc2632_of_match[] = {  };  MODULE_DEVICE_TABLE(of, ltc2632_of_match);   +static struct spi_driver ltc2632_driver = { + .driver = { + .name = "ltc2632", + .of_match_table = of_match_ptr(ltc2632_of_match), + }, + .probe = ltc2632_probe, + .remove     = ltc2632_remove, + .id_table = ltc2632_id, +}; +module_spi_driver(ltc2632_driver); +  MODULE_AUTHOR("Maxime Roussin-Belanger ");  MODULE_DESCRIPTION("LTC2632 DAC SPI driver");  MODULE_LICENSE("GPL v2");