From patchwork Tue May 15 20:14:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Silvan Murer X-Patchwork-Id: 913944 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="cfNS5QI4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40lpgX0VbVz9s0y for ; Wed, 16 May 2018 06:14:16 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752133AbeEOUOO (ORCPT ); Tue, 15 May 2018 16:14:14 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36203 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752059AbeEOUON (ORCPT ); Tue, 15 May 2018 16:14:13 -0400 Received: by mail-wm0-f65.google.com with SMTP id n10-v6so3445229wmc.1; Tue, 15 May 2018 13:14:12 -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=9er6ZatLPJXe+bGcPsrz30IjgdR6oA1c0qAg8NEz8ns=; b=cfNS5QI4iAkeGaJElLMxj+/FaCSll+lByTFUb/i8ZD/suIra859MlJYrp5hwDQeBMS 0Ll6brLPy+GegTcvzrFay8s+ZSo0AtfPlIjClG0++he/kWMh9v55/8ELNpKuK/MjaF+X QCM0HOmhsUou53TUkL2aRW0mXNchLiVNGSE9JPKxM5h0+/oFbCBZdMFVfJaXo44I1dTN oVSKe3f9htSd05gD2fJfNWKS6wf3N+DRcioO0ay4h19PNxZQLku/cbp3kWyY2WVrgy3v XgsO9UPz6crNDM1/Xu9oGsKKqnlBnrnzkPoHn+K2HfXdGlmEJADsAbNI7pqXkwiws59y DxJg== 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=9er6ZatLPJXe+bGcPsrz30IjgdR6oA1c0qAg8NEz8ns=; b=KrEsbxDJwUQNtDnt68GBq/Fxj61QQfM3/GD1OrqB3AeLD1ghx3JoiIF2cb7onMsvvJ J6ARZ3vjPhuwNYiwMtyXySKErl5Gb6tGYad1UihDhJOl1KlDrzrrIaoOgvvsHxSUeHxr KKMW2MmOsPdAmfQ5RTSI4Y9iGow92qL4ytUduge2Sh/cTjy32cOAn87dcXM7iRAflQgK FFpk3jheoYkS1Xv7Z25jpIzIIGdx233z/uuAV2dzQD4h8oWwFnOk70HBc0Ylr5k0K5FI 6zNIfy3luCsvR4/pqiLYFAS7c7CNIA/p/SqIDah0+cxMI0Oa0OJJqrBgk1/t6cLnmtFe NVtQ== X-Gm-Message-State: ALKqPwdF/5KMHkkP0R6HfVSJKZeOh9V6yLWz73E8uVUYapxWanArcS/e D59hzsrJJpri4sMGVhzHmpY= X-Google-Smtp-Source: AB8JxZqwQ6vDHEjbnaaN1BQ4lDbyCmzen0TkDyG0gfNxKHmJq4GExcLDqjaS8TR6EoXmBn3vHdTpoQ== X-Received: by 2002:a50:b175:: with SMTP id l50-v6mr19291495edd.65.1526415251624; Tue, 15 May 2018 13:14:11 -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 c15-v6sm472962edr.78.2018.05.15.13.14.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 May 2018 13:14:11 -0700 (PDT) Message-ID: <1526415250.32235.17.camel@gmail.com> Subject: [PATCH v2] Add support for external reference voltage through the regulator framework From: Silvan Murer To: lars@metafoo.de, jic23@kernel.org Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Date: Tue, 15 May 2018 22:14:10 +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 Add support for external reference voltage through the regulator framework. Signed-off-by: Silvan Murer Reviewed-by: Lars-Peter Clausen --- Changes in v2: - Add 'optional properties' documentation - Return an error when a regulator is specified - Use internal reference when no regulator is specified - Use iio_device_register instead of devm_iio_device_register  .../devicetree/bindings/iio/dac/ltc2632.txt        | 14 +++++  drivers/iio/dac/ltc2632.c                          | 70 +++++++++++++++++++---  2 files changed, 75 insertions(+), 9 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..e0d5fea 100644 --- a/Documentation/devicetree/bindings/iio/dac/ltc2632.txt +++ b/Documentation/devicetree/bindings/iio/dac/ltc2632.txt @@ -12,12 +12,26 @@ Required properties:  Property rules described in Documentation/devicetree/bindings/spi/spi-bus.txt  apply. In particular, "reg" and "spi-max-frequency" properties must be given.   +Optional properties: + - vref-supply: Phandle to the external reference voltage supply. This should +   only be set if there is an external reference voltage connected to the VREF +   pin. If the property is not set the internal reference is used. +  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 d322b78..7127cf6 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,45 @@ 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 (PTR_ERR(st->vref_reg) == -ENODEV) { + /* 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 if (IS_ERR(st->vref_reg)) { + dev_err(&spi->dev, + "Error getting voltage reference regulator\n"); + return PTR_ERR(st->vref_reg); + } 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 +300,20 @@ 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 iio_device_register(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); + + iio_device_unregister(indio_dev); + + if (st->vref_reg) + regulator_disable(st->vref_reg);   - return devm_iio_device_register(&spi->dev, indio_dev); + return 0;  }    static const struct spi_device_id ltc2632_id[] = { @@ -306,6 +357,7 @@ static struct spi_driver ltc2632_driver = {   .of_match_table = of_match_ptr(ltc2632_of_match),   },   .probe = ltc2632_probe, + .remove = ltc2632_remove,   .id_table = ltc2632_id,  };  module_spi_driver(ltc2632_driver);