From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755012AbcKUQIM (ORCPT ); Mon, 21 Nov 2016 11:08:12 -0500 Received: from mail-eopbgr30104.outbound.protection.outlook.com ([40.107.3.104]:34852 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753056AbcKUQIH (ORCPT ); Mon, 21 Nov 2016 11:08:07 -0500 X-Greylist: delayed 10211 seconds by postgrey-1.27 at vger.kernel.org; Mon, 21 Nov 2016 11:08:05 EST Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; Subject: Re: [RFC PATCH v2 3/7] iio: inkern: api for manipulating ext_info of iio channels To: Lars-Peter Clausen , Jonathan Cameron , References: <1479419289-17553-1-git-send-email-peda@axentia.se> <1479419289-17553-4-git-send-email-peda@axentia.se> <6ea462c2-53ae-0f50-deb9-e500a97f2ac4@metafoo.de> CC: Wolfram Sang , Rob Herring , Mark Rutland , Hartmut Knaack , Peter Meerwald-Stadler , Arnd Bergmann , Greg Kroah-Hartman , , , From: Peter Rosin Organization: Axentia Technologies AB Message-ID: Date: Mon, 21 Nov 2016 17:07:56 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <6ea462c2-53ae-0f50-deb9-e500a97f2ac4@metafoo.de> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: DB5PR09CA0006.eurprd09.prod.outlook.com (10.161.191.16) To VI1PR0201MB2319.eurprd02.prod.outlook.com (10.168.63.21) X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;2:9yu2u7gkUdqBuWcWGJmWR6QYMzBIpwYkGB85aSlDMqKTfVz3rh4KMC0ds1XEEXrpDLAgeGeJ6YlfC/hiIub+DSMjITnZsERWRMb4ZbrZd6VywcUlk58O9oUkav7pR729CY+5GAYVQQtooGO04M7lFw3RjaqfTPmPWIINWUnBHUE=;3:apwX8E45Ep6CDBJZKTlxJ3VcDkQicreWafjFT2jP8SfWLT2/CLacGeIsao3byh4uUrxGu1vYEOHxSyK/KqONZkDJ8IYhirbox9Q1Arz9QyvnikT29is3lVbDksma82cfnCgH1IW8jrhBn6aFLuEPc8S52EDP6+6JnZBe+VTQbQg= X-MS-Office365-Filtering-Correlation-Id: 91d948bf-b4bb-4e03-b531-08d412289256 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0201MB2319; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;25:wXahygALaUL5yKUXhp5GFeg2xlP4e3ZPsyVGmUCQAHXTK/VcEM0ZpvBbaVLXbLHbNwdStjqYMfu1TGQMzL7exJHUI832gfLbc4eB1gDkJXs5sQnPpg6dplOOY+kC0/6IX2qqtxnjvvMG0MsMZt7bjkfSME6wP2wlJMM//oXf/Fpbdltx9oNfGgBhZoXSfJ3ROb2061CcfcfecpfZnVnPqS/jK3QcknTfkMonG7jIXwZ7qeGmM84gQTpxzUAqV4o1xDMTYm7aS17Rnvvp2vG085FUrMin8hKqC1y3BtOotc3J49TTuNHHK3Vy4yhKspFGRvbmcLeSblRwOxkOuIbHaU7bSrjnOhPg5REgv4Tv3tj57YIfYPRyyP6wwxMtqztme96BAhLqwE+okZSEZwwcodvRX7MjQ2WRlVJe0dU6bMZwnuidPxsga8IUEuKvmZZS972IDsnTKTchR+2ndfNfKwxiLCt+daqcnm0gL4RTQxEN1vIn4wO2vbfqLGVN8YHF68hW0uBBNDGGflDTjKlVZOo6Jljm1RdX5m3jaaHudoITig1/3uij+0F98zpp3OkCVX72payZY6npqIzUuJUStjrCElXEJNGbZwgebXlLMjal/m2S/EzBvsUoRd+NoLuV3MDlNredMa8LTo+I94z9+h8kTRvdL+FnK+mvSZUyOlS3jygQY63si+jdqBeFIJVZLb/FCFy5/wVxw2ctPBUN1LmGNQySJ+2CZsEnmqQ18swFHFh2yGqXC0HF48+w0tgspcQrDs83xtKuheosN/Bknw== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;31:7ViNIs9CN9sF824/bis1xDF3xHxXR1qt0YBlA5xaP1fWEQ12klcBkIuqaJj3zKQXj482/mTY7QvlPLgl5b8CRRhcTORJGb2ZmCKaNTZBhy66UkUaq/YWhA2rJcf9H+sXAKeO/N3kpkYBL7FjYvFvv3FJvFr6py2S85v0gtZMUNKXLMqCVTfAVVz2gHvoFiaIbVzG51ytGBSwIEp7/Yx/6PAZm2qx8mD74AIgWFRKM2OFGIaT4AtNyPOmm7b3lTAftGrlUiFlmwTJcNxJVfMDLw==;4:I/kLid22fVti+rDNizysKHuS3sw1pURqaGaTNVaXxq/FiWhEXfyfi9bB7diTnqaJ37gCOcZDHy03or04YhCtLbLRyGXtSPKoknIGJdZ1Er1VHPbc2cnhpFbjjAyaRcHRDSWQxfP2tVMJgXoRtMcheaUsE6JNE2mAX8HVjFV6SAeAuv8epNthTyPI0wXxYnxvDj6Y6+MAsloXhb35WU4rgOS9wW0eFUDo4Q6hIxylAfIV6TQ5Y3Z1OcYuBP43wfVLdtRLmbyr1dH6ADIZ+x8wSJwBOmhgvJvs5IDfjgxTf2se+sdlMTBSgvDMBuC37m5w4zDVxcfXhIAprvXrcuM5NaHQVxjJIF/+ZmVtL5mGiqi3wJuJ4ErkpzHVuuqUN96lqe4p29Pyu1avdVKHCmCaQ6uYDrlhD6pmgmWU5Z4J3Nrc3JTFWeJ6e2cLIQnzN7YBN+x+eYVLXmqGfq3As60mUNmF0fG7naPP+7Gj559L4LjqGxtnCd1aCYyN0hf6ColYOyRchyZXhx1vZ2nAp/1LEA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6060326)(6040307)(6045199)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(6061324)(2016111802025)(6043046);SRVR:VI1PR0201MB2319;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0201MB2319; X-Forefront-PRVS: 01334458E5 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(7916002)(377424004)(24454002)(199003)(377454003)(189002)(106356001)(31696002)(81156014)(97736004)(83506001)(229853002)(117156001)(65806001)(105586002)(81166006)(5660300001)(65826007)(65956001)(23746002)(42186005)(38730400001)(7416002)(2950100002)(66066001)(230700001)(74482002)(31686004)(3846002)(36756003)(47776003)(50986999)(101416001)(305945005)(6116002)(77096005)(7846002)(4001350100001)(6666003)(68736007)(8666005)(4001150100001)(7736002)(64126003)(50466002)(92566002)(93886004)(2906002)(4326007)(8676002)(5001770100001)(76176999)(33646002)(54356999)(189998001)(86362001)(7059030)(217873001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0201MB2319;H:[192.168.0.125];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;VI1PR0201MB2319;23:eT1Ggxg6Kmo2q4h61TfQrhtvg9aRk+fpPSK?= =?Windows-1252?Q?YVcN/iq+iVPWuJaYQ4qUJw7Ia5WExWVL1N2pLVy3mKpc/HM84T6Cihgq?= =?Windows-1252?Q?GzZLe6K109/LbzAeDPGgbEs4hAu3R5QxFw+AZFW+sK33PeOOTALzI1Ou?= =?Windows-1252?Q?DzQ46xb/wwz+vR5ogqE0CCKSfU/B8l5ULooeo8hr+UVkH1HpfSUu9rQa?= =?Windows-1252?Q?JihQV7gfIRpBfys1yBrc9GAsHCN1jj7lFV+7B23DsqPY6burV3anB835?= =?Windows-1252?Q?y9bwR3ISFzEtJiTOihOMhTcYF90SNTFBW7BKsa8dq6qEIFbHmApZUoHh?= =?Windows-1252?Q?tH1ygxmLwlZtASkCrRAVwMzhK/Ikg5vZlW2d6mILtQlEtKYOe6d0R9Ra?= =?Windows-1252?Q?31AR4v8QcxqwnwA9EolxMZo3kmpl58K3O72fsr/ZSy64e7PSRxARJJ2k?= =?Windows-1252?Q?eHc5ueLKw1sFWr16wl/wjVyjnpRONOUHGDUlBsyaccNPtjTNcW+UOxPc?= =?Windows-1252?Q?Yts6Dtp4iA6P0Cc8cvAbbAKG/E3HEYrAWCmm3i+YJWcOTBNTScU6T10C?= =?Windows-1252?Q?en2mhm1Wa8T1lgq+1Q3qbOH8W7XPPonAKSqwky6gTRDCxIbvWFTwEeb/?= =?Windows-1252?Q?/qME7TaFG9lXpo52WF+7+sqLVHhlZnLcr3JO8AfSCdUzc7mOZCPgNGcT?= =?Windows-1252?Q?FNY4Liw9b1NzQK/lR/41WQZVJGwcOLFtlfzHNXfC4/Kus0/Ittld6Ovt?= =?Windows-1252?Q?PeHTQzSX6oi6aB0aMCxyQdyJwE4WTTrmfT3YzpN8X3xEDyma4LJXavQw?= =?Windows-1252?Q?2y6mb8QUBPAaIHHp/Dr0gkAXd+FzplI6z7hMmbR6n6dS1upYR9Cbsjzf?= =?Windows-1252?Q?v7UjpsdLsbwFy3qtl3/4n9k+Qa8LviCmxH95ZmzzJgfVTsEmwCCEhD/f?= =?Windows-1252?Q?Iind7EfiDw29K+8sQVfCWADVT3w3irxEm1VWY9GQYAyje7Uuup+XbT9v?= =?Windows-1252?Q?v+XUgETLdI+2D3ivNJ+N0P6sg5Yksjmluj1mXGrCh6HfYPNlEQEXbyVN?= =?Windows-1252?Q?4iOy2l7IgOOhmHmDNiwkNivC3HQF4TQiP3SYY036+Ie99TvSAYlRuc5/?= =?Windows-1252?Q?/pfhLaNgy+CGBK3lNg96RKYQpEB/MVUtyTld5UUEn7cL1sBLTMducw24?= =?Windows-1252?Q?SQqU+Q50xPQAzzYNeKbSh8zt7uzz2bWDEc7EHcnH67YdOmBm6GCmRPQq?= =?Windows-1252?Q?DoqGnkLVw+RIHwx97KpWO4k3AGkpNyC+dAykFFYsypPz43DAJH5Js58T?= =?Windows-1252?Q?ceVzXQ50/MLTmRy7h0Cd/z2nRHWAwWhvjcGP6yP4GN62t92Y1lEIrkAy?= =?Windows-1252?Q?2IgWvGN96XhQQlO9dvcUns57HlYzX2isRD+wr58Ot+kDQ70uT/QG9jfw?= =?Windows-1252?Q?+AqSJoMftXHqHFLPETy/qoFHF0irGolncjbpI8kVXjGYKCkjGnq/VzRX?= =?Windows-1252?Q?HthgOz856r79OA6oRBurpC4sf2qIYdrAAZKH1c1DeqXlC7L7jH9K7tBk?= =?Windows-1252?Q?Wvelbo2dDskiI+kyROpqRa9fRw59GrjRcwTV3lX0lyqU8/S+NJ7Ts+bQ?= =?Windows-1252?Q?17g=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;6:G/yPn/zHCysUepI+jRQMEruXa0OamKnBAZL4VuWNPureQPGwmVUsro7EmTtxgkXnXHZH22/vIAue0ub5qeioSxzcMGxm9aSHFEvig0qEYDL5b2hZhSUJVkT7mxBgrLKyY8y3VWhlLQD9dpCPSDWQDliY9i92kCe4ggEgFEjXUiEySjB2Nj1JGPaBbVW8E6hyL0+XxebOLweQoQY3QkRPR3oXyUuvko8oHxMYLcrbpxX+Z7EScjfD6ujPpBmEP+bt7ciFHbK9cFVUED3NcHzJs8D7xoybKPXIqRvAv9oHXJfrfjtrSj/QSioWW/jw0hVwttcLlY8Cmz46orBOCt4xC7tuzzi/kQICKzQNVyFWxBrSBFdI8lZn8GDemUqHUOj6;5:6CTlm51Dp4A6+Hxm0xUgP8TQOFUO6lj/tck997iktt6SaOTUiMQdfD52eXbgUqGCKE4M5FwgGMoDWoO99QFTYGMNlqeBN9RYIxcBjTze8m0D8me1ZmCGlHa+eThUwb9cpyzlbFXtGzmWgTFDKgP3yw==;24:oVr8uWkra5uB68+ZxVtVYzz0CF8cX3TlvWpwgz8ryoGB50pyqHD1iVKHqdlSKBfraA9VCxpdijwqAwg246pB5DuSytZ17z9nqFXIJlazUMc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0201MB2319;7:+xb1fTDYw7C2nJkNM2PgQHGLy6zDT/iXt5kgevhayl/GKE/PpHTKhcZnTmwh2uCob1AzrTIScFIRFiz2fPYHZW0CHqwRiFCBRn4AkpaM23Ll805N3mz4XFta5aDESL66P01jPkTKCSi4D1pBVmcUznugDLd/dyYlR6cPqXnrXFtxSrEUImV0pg4Rynts8weRxIG9uBEjkVWU3yolu4BRzJAB97YNDeC5s/3/c1I0hg82wAI9Lw/7RxbJ1pF3zk8R2FuUeSvFosF8kau6AJAMnCvsnoodwaXewkwOA5hy6t4nEGPRBzvGP7kw0BqHT9Zrj0okJCLplCXwiecIE5oMdo0H3lKxnOgCmOkFeXdwUCg= X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Nov 2016 16:08:01.0624 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0201MB2319 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016-11-21 16:45, Lars-Peter Clausen wrote: > On 11/19/2016 04:38 PM, Jonathan Cameron wrote: >> On 17/11/16 21:48, Peter Rosin wrote: >>> Extend the inkern api with functions for reading and writing ext_info >>> of iio channels. >> I'd like Lars' feedback on this one. >> >> Superficially looks fine to me but I am not as familiar with this interface >> as Lars is ;) (he wrote it IIRC:) > > The implementation looks OK. I'm not necessarily convinced about the concept > though, but the code is manageable so I guess it is OK. > > The final version should add kernel API documentation for the new functions. I added that in v3 that I sent earlier today. >>> --- >>> drivers/iio/inkern.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ >>> include/linux/iio/consumer.h | 6 +++++ >>> 2 files changed, 61 insertions(+) >>> >>> diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c >>> index cfca17ba2535..a8099b164222 100644 >>> --- a/drivers/iio/inkern.c >>> +++ b/drivers/iio/inkern.c >>> @@ -850,3 +850,58 @@ int iio_write_channel_raw(struct iio_channel *chan, int val) >>> return ret; >>> } >>> EXPORT_SYMBOL_GPL(iio_write_channel_raw); >>> + >>> +int iio_get_channel_ext_info_count(struct iio_channel *chan) > > should be unsigned. Correct, I had a plan to do that change, but it slipped my mind. Thanks for catching it! >>> +{ >>> + const struct iio_chan_spec_ext_info *ext_info; >>> + unsigned int i = 0; >>> + >>> + if (!chan->channel->ext_info) >>> + return i; >>> + >>> + for (ext_info = chan->channel->ext_info; ext_info->name; ext_info++) >>> + ++i; >>> + >>> + return i; >>> +} >>> +EXPORT_SYMBOL_GPL(iio_get_channel_ext_info_count); >>> + >>> +ssize_t iio_read_channel_ext_info(struct iio_channel *chan, >>> + const char *attr, char *buf) >>> +{ >>> + const struct iio_chan_spec_ext_info *ext_info; >>> + >>> + if (!chan->channel->ext_info) >>> + return -EINVAL; >>> + >>> + for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { >>> + if (strcmp(attr, ext_info->name)) >>> + continue; > > You could factor the lookup out into a helper function that is used for both > read and write. And also stop searching once a match was found. I'll do a lookup helper for v4. But the stop-searching-thing is already done with the return statements at the end of the for-loops. Thanks for looking! Cheers, Peter >>> + >>> + return ext_info->read(chan->indio_dev, ext_info->private, >>> + chan->channel, buf); >>> + } >>> + >>> + return -EINVAL; >>> +} >>> +EXPORT_SYMBOL_GPL(iio_read_channel_ext_info); >>> + >>> +ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, >>> + const char *buf, size_t len) >>> +{ >>> + const struct iio_chan_spec_ext_info *ext_info; >>> + >>> + if (!chan->channel->ext_info) >>> + return -EINVAL; >>> + >>> + for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { >>> + if (strcmp(attr, ext_info->name)) >>> + continue; >>> + >>> + return ext_info->write(chan->indio_dev, ext_info->private, >>> + chan->channel, buf, len); >>> + } >>> + >>> + return -EINVAL; >>> +} >>> +EXPORT_SYMBOL_GPL(iio_write_channel_ext_info); >>> diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h >>> index 9a4f336d8b4a..471dece8729a 100644 >>> --- a/include/linux/iio/consumer.h >>> +++ b/include/linux/iio/consumer.h >>> @@ -299,4 +299,10 @@ int iio_read_channel_scale(struct iio_channel *chan, int *val, >>> int iio_convert_raw_to_processed(struct iio_channel *chan, int raw, >>> int *processed, unsigned int scale); >>> >>> +int iio_get_channel_ext_info_count(struct iio_channel *chan); >>> +ssize_t iio_read_channel_ext_info(struct iio_channel *chan, >>> + const char *attr, char *buf); >>> +ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, >>> + const char *buf, size_t len); >>> + >>> #endif >>> >> >