From patchwork Wed Feb 8 15:41:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Rosin X-Patchwork-Id: 725698 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vJQvT2v45z9s2P for ; Thu, 9 Feb 2017 03:02:13 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=axentiatech.onmicrosoft.com header.i=@axentiatech.onmicrosoft.com header.b="aIwMmoTW"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752577AbdBHQCL (ORCPT ); Wed, 8 Feb 2017 11:02:11 -0500 Received: from mail-db5eur01on0119.outbound.protection.outlook.com ([104.47.2.119]:20641 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752206AbdBHQCJ (ORCPT ); Wed, 8 Feb 2017 11:02:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axentiatech.onmicrosoft.com; s=selector1-axentia-se; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=7gQB1aLXTW0Gl1JGudYA8pgck4FeJXPa/l1fncMvkAM=; b=aIwMmoTWcqD4lZ+gLjtTGtdBkzljDPBcpoyQkwCNgdVKfBFlL8idus6p4h8DUjA1MAf7kBBPR11fmsr7oFFoBr55bdZ6mcny6NDO7B50J23kB3pgK/n8QtQ15UaGpdM7h05W/+c/i+CndwaVnn13P8lWaVyH8d+7Fxj98NGiSUg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; Received: from localhost.localdomain (217.210.101.82) by HE1PR0202MB2555.eurprd02.prod.outlook.com (10.168.184.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16; Wed, 8 Feb 2017 15:42:48 +0000 From: Peter Rosin To: CC: Peter Rosin , Wolfram Sang , "Rob Herring" , Mark Rutland , "Jonathan Cameron" , Hartmut Knaack , "Lars-Peter Clausen" , Peter Meerwald-Stadler , Jonathan Corbet , , , , , Andrew Morton Subject: [PATCH v9 04/10] iio: inkern: api for manipulating ext_info of iio channels Date: Wed, 8 Feb 2017 16:41:51 +0100 Message-ID: <1486568517-6997-5-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1486568517-6997-1-git-send-email-peda@axentia.se> References: <1486568517-6997-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: DB5PR08CA0069.eurprd08.prod.outlook.com (10.166.166.165) To HE1PR0202MB2555.eurprd02.prod.outlook.com (10.168.184.8) X-MS-Office365-Filtering-Correlation-Id: 2caab284-1baa-466d-18ec-08d45039239f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:HE1PR0202MB2555; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0202MB2555; 3:8e2lNOo3cK7ZqPEkqJ6NovXPG453jz/Zkhy6T+PgvdxNNW1Ni7sMtR09z7qFRo627kOlqtayGcPxSVIbu2WLUCKXpURIVCzsWtyTEYw9khMCZHvmA0TdCB5JB9Hs3WZnhlkz7zHY+ISTzhXc968l659nifT4TKvqevpAjAbJqRqtmlNWD3jLXMiBNVudsFOqBSOZwRqiPPLvCbinmKzKR4XI3T/79R0yfkSmoh5Ad8f+LjP349UeA8I+/RCLqL//8cs86LmTJN9DQ8aJNXFdUQ==; 25:2HWP69I7fYeuJMvIu0FrQlbp13egXtxMCZqcjIyL1tEIRoGu8qqbF0VwwmRgExJ2GqvsRG0/dyM+i7D5kdhSGXOioHjVfcihgvuB+76M3M1BWkl01iLsbOVCV4I0d1GiyV0HsbJ1omHYf2CABVaIzqre5hM6IMHq/G82/2XivfymWkIUcIXzO4re0ADFcwmup+BhBz/OgnfvIgpnq452Kw1V83QKtVDpkY+ipHUjsh/m427jkgKOO2EXAK54Xikf3ou7z/INUOvhNlE5dta+rybNqfPyU9z4rFfZoqhYi+8ti+DF+3DuB8AuyVGeucS9m/zvfHeTZeTtoBKW35bNgM2/OEg4Hw2pZVdDNM/vnnopEBhf4DITMAeCAdeU3z7r3Aj83NXO2DL6gSVI29SA2uEXxSm7JqdkADhcqbQIkd4lRhua1jDXQUpO0UiYd91ompRk82B1p45czYx2rz/mKA== X-Microsoft-Exchange-Diagnostics: 1; HE1PR0202MB2555; 31:srzGxNX5DYhp/CNW4800sxMlxc+CHR64j8ZNPt+2vvzdj9h/3q3H5MBSsFnHF2vVfXm0DiCEoqlS3Z8G4r2ID/1Wpn8nlBA1dytcwMwIc7GiHDqVnYjDcHK3uvEK6tK7iV5j+syxrqU5yAUl2wbCJHlvoa0kHmXe3EoDRm0VNxFWWOBfoQ8eXFfllIUu8+JBuURZk2uMeK45hTq6PijjMtu2FvMNuALr3s8+/qxW/uKFcnkq4lBsDFIMABlduJ54MbSvMXB7uq74WUkaGbPerg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(5005006)(2017020702029)(8121501046)(20170203043)(3002001)(10201501046)(6041248)(2016111802025)(20161123564025)(20161123560025)(20161123558025)(20161123562025)(20161123555025)(6043046)(6072148); SRVR:HE1PR0202MB2555; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0202MB2555; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0202MB2555; 4:Ay4XFT1AabX9vaM6j6Ef44uCF5XuWLQv+ENINPg7IafsVWQCT6ITrISXDHu7sZDrNkA//WkG/a8OzDUAfuJrmTiTd9B+sjXv/xSeZuBYfrieYvjbpsYeWzaSzoTkgQLboYBC2bbjg7hTX4VloQ+y7X0mO641LYb1r6iFp52nYFnIE0EiXNvA2ND9p5vqSHEBj3SkqAZnqHtIsTuIAig/40UIKK0YawRMfyFkrwJDvmXG0A6vFrPQeTNauEwHJdkfC5/3IMR3BN8QDMEDLJT/Vlt1NWM3FG90hmtg1/ksugOIQDrgz/vhq0ujO/jTr+RkALb8Oa0Bxg02ZrpNIAgsLkmqHqJv0nLmeAOP5TbqbvZu8SwLwAbo360+w+s3CkJdKXT3f2cQpCUBamIsXJrCcFGjii4f3GKhGVSGFHfqK16XRfUr20nwWi49w5Y0LsHNixt1kIDoHUznvXokxhXqLFjTigrNxI1hUeoiSo12TioV8MXxhAIsShQMmiuQSdA+Ed27oncF+cpkqXLNUPhwKiz02oSfq7y2YnRZdNSPvf6VUjkk6DRunUVul/oTl9PKLrDyEhrjq00FpYnCGdiYSvEctSzo0Wmj9oUYBK9Oo6cFi8LasgMpsFiiPIDY+4HTKkENADpkPOttEzwtsKCJ4lLmZ1a3k4ICcswrBWXOxb++ofDDB5FMTtYGTzZPHIDleHDOuMxn0uAgk/bZr3Lxbw== X-Forefront-PRVS: 0212BDE3BE X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(6069001)(7916002)(39830400002)(39450400003)(39410400002)(199003)(189002)(6116002)(3846002)(7736002)(50466002)(2351001)(38730400002)(74482002)(2906002)(101416001)(305945005)(97736004)(48376002)(8676002)(47776003)(110136004)(81166006)(76176999)(50986999)(81156014)(4326007)(6512007)(53936002)(6486002)(66066001)(86362001)(6506006)(33646002)(92566002)(7416002)(50226002)(6666003)(105586002)(42186005)(36756003)(5660300001)(189998001)(6916009)(25786008)(106356001)(2950100002)(5003940100001)(8666007)(54906002)(68736007)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0202MB2555; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: axentia.se does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0202MB2555; 23:ZMLgbP7I9NUQWpZi1/Tic7/ZhbbFfLHZfKVjSUd?= =?us-ascii?Q?eOmQz6QTkUgJaJ7nUOvmO8hcUyThkxsFG9oz9PS7cBeJAydoDe/OZ2dKpFRN?= =?us-ascii?Q?t1J5jIdQMLHPX27IF9kwNmybD/TPA7u7lT/TwgXOCUklYYKJnEFuvMUQ4RxE?= =?us-ascii?Q?DWA5As9ooWn5v2o+5LeMvWRdHqkj5srmYU0TIIMwMIuajG4EVgkEMDEEnW48?= =?us-ascii?Q?oyhDO5vl3PHokge7Qpc0LuIXCl+0HtbzRndnZk9IulBhOqvq9gCV63g8h2VI?= =?us-ascii?Q?V/q2zUxG0nLkPAzpOYMLpiDEix31UJX2Q58DSRcLgfGrVwCkARub7SflaiC/?= =?us-ascii?Q?X8H5zwu0uXBB0UPIS8H7COoBW+UnzBIoUIWtGZWCkDUC8ulteZX9o0fRi+hP?= =?us-ascii?Q?FgyiP+H1Rq9t9Flj2K6DgOTOla14j8I+gJ8TYdpManbNc9pzf0jJb8Ojr1Xx?= =?us-ascii?Q?ZyjzMkeQxUcRvsgs7u1bfsRdEBMBby84Zhx5p59vdCoTZUUj7mQOKO8F01R6?= =?us-ascii?Q?+Pi+I4bIfy11XEqymrHunLVlphHHviYux8/PrMK5aZAsATy/BsAJA4c4SvA+?= =?us-ascii?Q?2jj3fzlQlGViOXpdlHBvP6gKL7bXClBicaUHzDHU6fITrzhy7x02I0Y5R6nK?= =?us-ascii?Q?IGB90KJQ6HA5TDlDnRBAB3JDj9F+Taz4FQ5p+oGoNsvGOcjFl3VVXV+yL08C?= =?us-ascii?Q?ObRDVbcyuJpjY4j/+mqRdemamRMlhjoFkWvyn622pFw3hjqoEaDjtiOHE/L4?= =?us-ascii?Q?yl2PDanWeUFlY7WWNmP5GFATHYIfd8RnGF8YgGQtrjnFUmJOaYJ/SYSJu/ya?= =?us-ascii?Q?ZSksKIyju1Nm6fUnZApYwe9zc3pK0EO9hs1LZU8nphYThSY4JBv3DUu2vxbo?= =?us-ascii?Q?zTTzRC3BRbktVOgGHSh8jRzVESR5GL5thSILZ+bGo1ACP5Z5vbkH2eW29yRi?= =?us-ascii?Q?FUXJzW1Q4gpYRm9yd2wQGLki05yhUWGY0HzEHBh4fu28Oi8cOEyciAX4+B9u?= =?us-ascii?Q?hP5+x+olzp+/wLUjWA1qqv60MN04Ms8n3KyaWp4iUgsUiVq/zo72sHKTFZgS?= =?us-ascii?Q?7lm+LuSTgBqMzeeOT/f0JjxXZ3R9kwGZFuX8sP4QjKBqekBaOIr5AcKbl/+Z?= =?us-ascii?Q?Yiqqs3GZBCC3AzVnkn07NTg/8oaHNwhNVAmP0jg92iDtZ7+GlGMnXR8z7YMg?= =?us-ascii?Q?ti7f0tQOYKMqHpEtuVLUeSIAYxp1C9Ne1F/on2hnlKhWgTKmXgFWXs1H3OO6?= =?us-ascii?Q?iZ3jZtC66y5xBpP29tmb3Zc8XPGPrraqJBVaVUPos29RnPLUnZF5Ua1CRRAk?= =?us-ascii?Q?fhg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0202MB2555; 6:YKZh+PixcSzocZpoAY5Y3+drtsicSvXcBiee9joxG3ObpPO0mMLluzREgP220Wqac/6htTQ6BRPunONrlAgWZurh3QjntFc1ty7ChPqqCXn95TQ1omssiP/XGymyJcB3MDE8EW1ZTBh9//dlIDiZ4N9mTgC8Axc2K7K5TdLp9KhyWW0shjw3c0M/LGwP//hM4BmWhK7rfEbwww820xAt083gZmFdrYCwFHinR2NjRYOnrm5byJcBBw9HkLArwA5/4O3TYD67dpQrNyCYYeCEGbyD3uGeHfSNxTDthP0T4w+0X0G50jKa1IkHfnCS0CTdYAbbtUTGfnUNIbFWhJBNT4b6fN7J7qe5MkEXGe0Pxndm3INSA8msKchd8n06CY76IptumsS5ftEiplm78qz0AA==; 5:k5T9nAPFZNZ0wRQYcLOzY71ts4nFHBdoNgbdjLWP3icOQLUHNJxh4ST4XZpXWIehue2qhdG+BabvWp+zES5eU4jgojbg7Lj9QvnVMR91LG7J2S8sb+r3TAYi+mvw5CoGsX0pgOrPPJSl9gAyi1BgBg==; 24:/bqMZIivI0HSAypqvs6Q0ry3qGj5eXZEleEyMKzj5tRh7CPyWlopUPdDMsceYKLH1sWholyhG56ANroacwivVRPHIw5LGdRSv2lj74Cs8YI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0202MB2555; 7:gh2Uvo8Erp0O6N7WPm0eWZocwkDnFUzv3/edFdwNHPFBn4Dvh0n9F4CrJeWA559PC5wgHzlagfTyvtYyPTMAXiK0BNnSto6D4VyyYdvWc40umn8pKKaOvZJ++/6UFAKuc9HmhwDIXBtGNF5Sd9X59TfQ2+ooZ7Ix0j+kOUjehL1lxlpgLnMyM3iRwt+6zoNTua3uRgESExGPCN1oBQ4OWwYhV3/SJZfoj7euCjcgR5jFrP5pGI+K/udZMYH0LVsDEVHnWaVZKKIgWRmJbpq33Qo10w9L/Nm0No3NizoFYjgi6lDM13VKaG80easmrMIBZbUphuqsRvDOR/ixxPLr6hAvLYK8tqMPERnhzY992lIYxv2CI2jKpNiF/JKU8KzO/SoFgLGy+tzuCuiuqx2pmQ+n9T8NW3J5LSJCQ1ju6Q5JTTOn0UD/HDhHEQBp87VUuuJVuwiT4jV+lh3OUCEMK43UJ94CfpQNIEGEyWQF7/pPLH0bjqAjUabYKx29MlE9dP4bSAG6xAVAjLGg2AOaiA== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Feb 2017 15:42:48.4991 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0202MB2555 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Extend the inkern api with functions for reading and writing ext_info of iio channels. Acked-by: Jonathan Cameron Signed-off-by: Peter Rosin --- drivers/iio/inkern.c | 60 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/iio/consumer.h | 37 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 7a13535dc3e9..8292ad4435ea 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -869,3 +869,63 @@ int iio_write_channel_raw(struct iio_channel *chan, int val) return ret; } EXPORT_SYMBOL_GPL(iio_write_channel_raw); + +unsigned int iio_get_channel_ext_info_count(struct iio_channel *chan) +{ + 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); + +static const struct iio_chan_spec_ext_info *iio_lookup_ext_info( + const struct iio_channel *chan, + const char *attr) +{ + const struct iio_chan_spec_ext_info *ext_info; + + if (!chan->channel->ext_info) + return NULL; + + for (ext_info = chan->channel->ext_info; ext_info->name; ++ext_info) { + if (!strcmp(attr, ext_info->name)) + return ext_info; + } + + return NULL; +} + +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; + + ext_info = iio_lookup_ext_info(chan, attr); + if (!ext_info) + return -EINVAL; + + return ext_info->read(chan->indio_dev, ext_info->private, + chan->channel, buf); +} +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; + + ext_info = iio_lookup_ext_info(chan, attr); + if (!ext_info) + return -EINVAL; + + return ext_info->write(chan->indio_dev, ext_info->private, + chan->channel, buf, len); +} +EXPORT_SYMBOL_GPL(iio_write_channel_ext_info); diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h index 47eeec3218b5..5e347a9805fd 100644 --- a/include/linux/iio/consumer.h +++ b/include/linux/iio/consumer.h @@ -312,4 +312,41 @@ 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); +/** + * iio_get_channel_ext_info_count() - get number of ext_info attributes + * connected to the channel. + * @chan: The channel being queried + * + * Returns the number of ext_info attributes + */ +unsigned int iio_get_channel_ext_info_count(struct iio_channel *chan); + +/** + * iio_read_channel_ext_info() - read ext_info attribute from a given channel + * @chan: The channel being queried. + * @attr: The ext_info attribute to read. + * @buf: Where to store the attribute value. Assumed to hold + * at least PAGE_SIZE bytes. + * + * Returns the number of bytes written to buf (perhaps w/o zero termination; + * it need not even be a string), or an error code. + */ +ssize_t iio_read_channel_ext_info(struct iio_channel *chan, + const char *attr, char *buf); + +/** + * iio_write_channel_ext_info() - write ext_info attribute from a given channel + * @chan: The channel being queried. + * @attr: The ext_info attribute to read. + * @buf: The new attribute value. Strings needs to be zero- + * terminated, but the terminator should not be included + * in the below len. + * @len: The size of the new attribute value. + * + * Returns the number of accepted bytes, which should be the same as len. + * An error code can also be returned. + */ +ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, + const char *buf, size_t len); + #endif