Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751517AbdIEMPG (ORCPT ); Tue, 5 Sep 2017 08:15:06 -0400 Received: from mail-sn1nam01on0057.outbound.protection.outlook.com ([104.47.32.57]:52544 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751386AbdIEMO7 (ORCPT ); Tue, 5 Sep 2017 08:14:59 -0400 Authentication-Results: spf=pass (sender IP is 137.71.25.55) smtp.mailfrom=analog.com; pmeerw.net; dkim=none (message not signed) header.d=none;pmeerw.net; dmarc=bestguesspass action=none header.from=analog.com; From: Dragos Bogdan To: Lars-Peter Clausen , Michael Hennerich , Jonathan Cameron CC: Hartmut Knaack , Peter Meerwald-Stadler , , , Dragos Bogdan Subject: [PATCH 1/2] iio: ad_sigma_delta: Implement a dedicated reset function Date: Tue, 5 Sep 2017 15:14:45 +0300 Message-ID: <20170905121445.26913-1-dragos.bogdan@analog.com> X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:137.71.25.55;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(39860400002)(2980300002)(438002)(189002)(199003)(626005)(6666003)(189998001)(246002)(4326008)(107886003)(5003940100001)(5660300001)(50986999)(47776003)(54906002)(7636002)(8666007)(36756003)(2906002)(72206003)(478600001)(1076002)(575784001)(86362001)(50466002)(356003)(8676002)(48376002)(50226002)(8936002)(305945005)(106466001)(33646002)(53416004)(77096006);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR03MB2702;H:nwd2mta1.analog.com;FPR:;SPF:Pass;PTR:nwd2mail10.analog.com;MX:1;A:1;LANG:en; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e347821c-bb4e-4dfc-8ffe-08d4f457b8a1 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(8251501002)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:MWHPR03MB2702; X-MS-TrafficTypeDiagnostic: MWHPR03MB2702: X-Forefront-Antispam-Report-Untrusted: X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2702;20:dDlvg6LHKPDk+vwul1GOuh9aFrqAgX0Dwl2fJOqetyZhbcX4S17fjeceU72UZM14mvJgSwROkThNh8A9yWtWGHHK3W40MOSpffraeSKnVNVQWaKe6GYsHG3xIKYv7l1+RvHboPGMXK3x46oO+LYanKmIZoLD86qTvb7mp+NvdirNG7Wg44yLgmob/AFWd+j6Tcd+hZ/Y+bFSIoqAg2tv+BHy15luP5gGIthkKL+Pbky4/u16kJeOc+5/n/3GAlHW6RUVcdKioz7yfW+pnCJ/9Iy4ztynvSjSnp1J0w17sOlXXavfJ7dkpMzWe7Tos0mR66H6rgwflBmxi5CogyRjUvp296ZLJlTL8wFXyXed8ui0P7kL28DIY++Scv0le9CNfCQM888VLxBVooJkEUJ8kgdOMNjtvgd/N/u8kbgc46xXB1UvmAdMjniUibXY874HkA3PJ3S3peodJONsOVoLjsqAMYl2hZ4X7dcbS1PctiLw1pr1I8LcySrXmv9XbG+z;4:5c8h2IlZQ4ikSseapMWDmzS3bzsgSeS9X5QmFMvYKMXCL+NZfH9MyKwMAt+cRkm04mSLVQA+ailL5aDdJBNXYFhhLhLdg+x53gTOKMoZoRNi+J0D7MErray3Bu4igQRKPc7ZgdSha9J3sq1kIY1FTLU8wuBW4HqOB7T6IWXciSLnCGOaCF3DzW3LbwnFYTD1+ph79pRPRpWnodH8kHliYdhW5jUu/p4Hp6XrUO6csjb+yzJya3c1XIQm4459ljDMto1C5aGw0ZtZnrZalK0ktT6dglEV0Fz7YkfE+Rddu2Y= X-Exchange-Antispam-Report-Test: UriScan:(232431446821674); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(10201501046)(100000703101)(100105400095)(3002001)(93006095)(93004095)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MWHPR03MB2702;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:MWHPR03MB2702; X-Forefront-PRVS: 0421BF7135 X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2702;23:1Kj7rpK9PZVNhJpPDZhQis/Z51FGzn9TlyHuZqX80Tpz3AKyCVgeOhM/ipYa6I/Z6ltgjIZpbjLKuV7Wm4gTMk6Ytr5KD46fhU1Avrzh1Tddx97T0GSagp+0+kjIlZ1dT+GAGsBqDI7WKbmyCqRoDEG23BAIgWmPo8qrxHFKCucbMDs8jNguXL2ZM5UzGrrtlzKR1S0WL6KD5a79PsrdcXEie832SspN51Pw4sTgpMJMkPXF1ipuKUNRysBAa53rJ6g3+8KZ1ak1nv0vbLRbGNBA6OxH6TYqDnsRmkXh44UibZQEDl+vTmTUyy/DUNHjGJwflfaOyLrknZ45V5yBMqBCQpuvN03ReUvjBdyR1jP6/iuxeRXuccrcUvMSz5QrAiOg360OCjlA7tkyB4OD4tZELpqkQR8srMYLEgvW+ErsRbvJbvQHkdutdypDD2fMVNwDHVcvtYZ+6TRnhPyQhDvboBqT9hJKZCcn5ftpvyQfpKupReE26titNgqsJkmrAeRVhW9LGmuUfAV1WeGvwInT7dOMEQV092CncmLqw9G7tPyfRLWW+zdddW1fudFaRMERHZCj9qBT7cE28S6c7z1Ppzd8BOwrA5b8PvqYeGlxxoILPNQNr71EKsRxRrmCJVkoYmdL2A6UBd+OTyHr7suxX75FY6vQse5DaR/lS/jfFsC917ZzXBx4jB8ZDe5EpZhFUyO6a/0zznLAKjoamYUh+6ZnxWrHLCJvXKO/obCAvuGzE7NyK5W//+r9dje/ZzTdIEXUb7VrqZsyDX3P52maUViKMQWhKhbPMUhlA0smTZ92vXcaw3ZE7iKpBdoW/qDdv6GL49kUVmFT12e3ydcAY7Cr1dD89S41ajfp5/CJx4WZrHrEb3aiw3xHEEd4JILxsnNPlMoT5vnO4YDiPA== X-Microsoft-Exchange-Diagnostics: 1;MWHPR03MB2702;6:yLjuVD8uFqxknHUAAzxkB9+28Rob3mT769VBb6e6krYhn+pw5f92aI4A1LgHqB0NZy0Ea+9oKwRo2MUo74Ap001SgwhZH8f8DBMvC+nFkMn6knaqRo2FP4EQtRmLwVq6g0Pfj7Fqg0YhlfkFzzNpzyk7qrGUiL/UoYpUB3v4Ov7drbHtBlPdyO6WH366dyBqfvOL0mkRlgwYO99Z0geAXUsIbjpoVxQOL4OpuYHLd8yzip6NOXVzZaM1KUBAwT8X+3Nbi/JHqa3gpJ2IySUrtCPDip+ESu5fjlubl5MRd8nwyBSf+LcjtW47FM3zl1jaIphV5EpCxtl6/3zAYifBLQ==;5:mWzjr9YbtoUiMrbEGSDxu2VpRae7Oq1DDEG9VQeaZw5eNt4pCvoV5X6Rm6j5yxPJzl6yEmPW+pzkuKvzHyzqoB5FD27K+UcJDJH8G1NQFE0lX2dZ93aP2YLgykMxNoN1foDPKFV/cqjIs/m6JwtF8Q==;24:iD/GjFGqdy47G4giRG6FW0fC40lraOinhbdb9droT/XOKtdjSJYzS1M66buAcniGvn/ZK8t0gAIWJyd6yQ3+NuI0i5TzmmUUBodd/SgrmNw=;7:e4+TSAY4dynw1ybnk78GYaUPdt70TTIOKanNcRasBM3fFVRkaDyb5uUX2is9kH2ABr1qQpcRaqy4NQxHWgb24TW8V8IOLFXaeOaa9i0jiSsSpoomq9P8Rnx4OzpON+k6ysBth99QJBhna/H33bmu9g5d3OsfqR3oy+3HTHYkUpL7YPJLfXtnDWhu8AN8g9izTX5QkNow1623EoJl1sQNoQaRrYMSvI1YPT4GFjOXnFc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2017 12:14:56.1606 (UTC) X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=eaa689b4-8f87-40e0-9c6f-7228de4d754a;Ip=[137.71.25.55];Helo=[nwd2mta1.analog.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2702 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2134 Lines: 65 Since most of the SD ADCs have the option of reseting the serial interface by sending a number of SCLKs with CS = 0 and DIN = 1, a dedicated function that can do this is usefull. Signed-off-by: Dragos Bogdan --- drivers/iio/adc/ad_sigma_delta.c | 28 ++++++++++++++++++++++++++++ include/linux/iio/adc/ad_sigma_delta.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index d10bd0c97233..22c4c17cd996 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -177,6 +177,34 @@ int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, } EXPORT_SYMBOL_GPL(ad_sd_read_reg); +/** + * ad_sd_reset() - Reset the serial interface + * + * @sigma_delta: The sigma delta device + * @reset_length: Number of SCLKs with DIN = 1 + * + * Returns 0 on success, an error code otherwise. + **/ +int ad_sd_reset(struct ad_sigma_delta *sigma_delta, + unsigned int reset_length) +{ + uint8_t *buf; + unsigned int size; + int ret; + + size = DIV_ROUND_UP(reset_length, 8); + buf = kcalloc(size, sizeof(*buf), GFP_KERNEL); + if (!buf) + return -ENOMEM; + + memset(buf, 0xff, size); + ret = spi_write(sigma_delta->spi, buf, size); + kfree(buf); + + return ret; +} +EXPORT_SYMBOL_GPL(ad_sd_reset); + static int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, unsigned int mode, unsigned int channel) { diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h index 5ba430cc9a87..1fc7abd28b0b 100644 --- a/include/linux/iio/adc/ad_sigma_delta.h +++ b/include/linux/iio/adc/ad_sigma_delta.h @@ -111,6 +111,9 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, unsigned int size, unsigned int *val); +int ad_sd_reset(struct ad_sigma_delta *sigma_delta, + unsigned int reset_length); + int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, int *val); int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta, -- 2.11.0