From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755222AbdDMQmJ (ORCPT ); Thu, 13 Apr 2017 12:42:09 -0400 Received: from mail-eopbgr30098.outbound.protection.outlook.com ([40.107.3.98]:55296 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755175AbdDMQl4 (ORCPT ); Thu, 13 Apr 2017 12:41:56 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=axentia.se; From: Peter Rosin To: , Greg Kroah-Hartman CC: Peter Rosin , Wolfram Sang , Rob Herring , Mark Rutland , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Jonathan Corbet , , , , , Andrew Morton , Colin Ian King , Paul Gortmaker , Philipp Zabel , Subject: [PATCH v13 04/10] iio: inkern: api for manipulating ext_info of iio channels Date: Thu, 13 Apr 2017 18:43:08 +0200 Message-ID: <1492101794-13444-5-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1492101794-13444-1-git-send-email-peda@axentia.se> References: <1492101794-13444-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: AM4PR05CA0010.eurprd05.prod.outlook.com (10.171.184.151) To AM5PR0202MB2547.eurprd02.prod.outlook.com (10.173.89.8) X-MS-Office365-Filtering-Correlation-Id: f5aef558-723a-451d-77c6-08d4828bf626 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075);SRVR:AM5PR0202MB2547; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2547;3:FqJUtkVfVmm9MmRrH9kAjytsYdq44Q2xrdOyH2Ei67xyqX7uX71xu4i1iUWXR7kZUikL871DaKNLPKBlRV+Kr8BuIfvpiFYwRbkhI0mTv6wuIJolvbMYmFtAgFHb7zthd29tNTxWILZIZ7PBt9Bg4dZZ81QZm8T+s0EdHmn/L5ySUXbJl9dZzXdCjB4t/YcgNQBqggWYLUfJVAQOws01344JHn/e1EJ23EGtQo6r3+xBFGzPMZ+Zw1W0Q0LMQ08IuwKeX6ZfD+3JAH4HRroUKwsglj3lqtXYnQ5a/GZ2MLfE3t0eCPFtab1/tpLo8sJ3;25:mrjrQYwP82HBeMAC3jTzh4Y09JHEm9d4kWUjglIe4mkvOZ7UMMwxJWgaxSLIetJIafzrWRVYvRQ+s6WG4GaKQIYLTNitIMyHzgl5Ax8NRFNRZ5v54vKyMKCkEZyHB01mkZQfdGXKsH6tuNhRzwcyoYodfJ4GGGVpiDtRzo/Q1PlRtgPh0l5NqWn0bGcpsf9vFLCGm9/82eZInFErmHzxiOVM40ZBEd98xHzIelTMslaRRVD3Km9/cYbQJwPJFWow0K4Jl5T39LOHJDGfQC6cW6i/ARTCiqCtce3XZ+0GuDtj0476UivHIHCpZgsc//XISQEl7px8hK4xOrqJXrpamsqooQ+3pphyGXstWyLsNZqpiWTqdX2ofpgLZTvWUuds5N0erXNnT9hDNPhZY0gK+VFr7B/aGjzZMeVRutrSDnPeV43O1F5U0DhbE4pZ/anPF+5Dj2X8tv/gRiIgGpvQjw== X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2547;31:cQI9n2jiyIVif1moaJteSIkjEA+MWuEqXFlym4My/XWFL0KGmZmIgk+qPqvXKaisUn1oBuH1Klq02l5vwpXFAWjQcd0KpBmNiRb+O9nHLZiwdemIN9AH5WPetPc0dWxBPpTIT+lGJYglmd2lnQsox+fHLajG9yEMp4fu1R/DppLt8E13SS5vgG1pnT/WKwRt+v6DTbQ5e/kGEKPfUZlJF4Dcbp6k5sWmxo/ZPkLsER4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(10201501046)(6041248)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(20161123562025)(2016111802025)(20161123555025)(20161123560025)(6043046)(6072148);SRVR:AM5PR0202MB2547;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0202MB2547; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2547;4:5tNQC/u27yXSKgZxD3WaD3zeIcNS0iKFu8H81xsIZjc10ByeqQt5TYcg5v5yVL4MMNXmPcL667O/6vLVZ7a8pWn0IjgngwZImURTWmNrDvAtPSx4K8gxcyRGnXYAyCjQuPQiDAgs4uGNboRSKvfln07J3CNC4balOsIILJa35zLu5L+jhcrT+YXt1RjV3Y0hPDV+HOyyqujw+vW5cQBj4S84SwTaPyHoD+Ps0a8u7J2Ijvss85YtZcU5JVCfKfPui3wx7ovMUl0OQ39t5+1iyDmVCAKuFnKxdFOAU/U3/8ajue9aDG3BIO8/yrDzLOHXc5DEWLqDo/+rDBqu5+UY5khmGwuk7LEigykZvYvdHWq1s/xaX7YJnNHBwXQ4vTR7f8nBUNRnNq/ZsUH3s22mgXpf6OcefG78h1nfBnc424Nfr1/xRzb8WVvSqEde4VtgxQ0PADL3TTbQWll14DLKYP5VzwTnQr8+T5icMqIuTaz/FVWPaemTqdPIVoOhdrY9PaqmMFExWpSjtjrXPr7VVPdoNFY7VpzLKkawCE7DYL0R1h2xCzQIKnshqu0i77q98pOjSLsKVGqRn9m2Ucvmboil5OrzocYwi4RnuwTrpTQ6XXqbC6TDZ9OKx5BoXTfdMJ7j8suZ9uuU/10eBCcfrJplOL3sDo6RQURzdoA0BTv4hoC4EHPDM5xdRNrH4LO5184iNu4FStVLhYNd0UF9olVTqntHC2QCVEEdOCVBvZfCZKysUd6PPfmVGeiMgONK9b3AndhRfpaSuoT8QOc1Cg== X-Forefront-PRVS: 02760F0D1C X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6069001)(39450400003)(39410400002)(39840400002)(4326008)(25786009)(48376002)(47776003)(50466002)(6116002)(8666007)(50986999)(81166006)(33646002)(74482002)(86362001)(189998001)(66066001)(3846002)(6486002)(6512007)(305945005)(2950100002)(6666003)(53936002)(54906002)(76176999)(7736002)(5660300001)(7416002)(42186005)(38730400002)(8676002)(36756003)(6506006)(50226002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0202MB2547;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0202MB2547;23:wBjfRpNZvqdwx3mE53xQS5VJZRVh4Mddg1DW8T/?= =?us-ascii?Q?yt1FeYVI+pMQS4h5SOobivqO1AoR5WsSEJqG2vmtZyajzjburawq/mS90tW6?= =?us-ascii?Q?oaley/wGeOen/2Cupx53cVgW7zLVMFUKX0HgQA8zKGKECnM6BJBsKLzKvTWi?= =?us-ascii?Q?MNdAyZMqVrXXo0Zn4sBCZHth5NpsuEr0X9UlYPx46fza5nrGHhFpnxUsQl6r?= =?us-ascii?Q?DuXg6odD/KQ7NwYh0ZIMfbDI0d360/1EAFY8YAUgDqr33vSXmBQiFF+R+boI?= =?us-ascii?Q?i9hzk2u3umLCwa1HkefkJ9tnqU58DrJhrn74P/Ex9wXi+4fNaeqS0wvqdAwA?= =?us-ascii?Q?KyHTZEQguVgGbGX2++eQXAYd6v21b2Iyie3EJv3CqO9uWjv20kfet3X/Obwj?= =?us-ascii?Q?LuHmNdj6bZ+q6ceI+1bQ7jEsSca24Uznfgwq+0idY+LV+IKa0KbljKJjDIXo?= =?us-ascii?Q?8osOlDpILxxBhps8QG/QpqD6qWFikFvVhIXiVq4gK7O9xsmjQ4Pnybil0rFw?= =?us-ascii?Q?qq1kFoMhNNmXbhG1UzwzrMCepocpicpFKDxxYcQImODVSTOA2w8SvJ5eTJfa?= =?us-ascii?Q?P2B2RaKkaRmT6Q4uEbbJ5uUZ0B6GCV9dyyRu88g68QYdkg2H5jNCFEBjCWuC?= =?us-ascii?Q?utTtyfIbXjGQO+Ve0f0Ug335/kVd3F1tKCgu7CfgsOPHv/tuESRAxRVcAkzp?= =?us-ascii?Q?bUt4shGSvY0+A4HEjeOLdkBYaKnWF66t19Y8AHIcX+N06Q+7sLz12Ters81K?= =?us-ascii?Q?VGLrIKfFdh+AsUr8rDJAEE1RjJk3xr81+fk6HY23J7OxAdg+QZqWmGe/rNm1?= =?us-ascii?Q?Tx3hyRWqIzYpQPU1qskESg32/qyiRrqzJHnFSwToreKBYrsCxvZviuiOpj5q?= =?us-ascii?Q?uekjh8JTiWu/K0cWAxaKX9dh6VC4Nx+N+f4bkJidAMlxqzDb9WV3HhsGEjcY?= =?us-ascii?Q?/RAAsM0YJ/vo7ETLPmvmLBN7qQgmkcniyvzr8/8A8ow=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2547;6:x28/SRbe+HwbeuaiRPAYirDivOcEOV0nH4HF64OI7I6urOB3oOWODcMQl3vuPb5qHPdRWDO1wl+DcQabONPyO/ZposT1w1BSoQ98VTgmAn1c4lmy+cN6p85zChX8+EBzlSA2+dErxXpvprRA3+GtdugH7qGKl4KUcqMQfu4sb2XOu/ABVzN1EQ8QVSZn0vNCiFCL6jF0vCE2QJdyC/uEVo1balf6pWxWxYPAg6HhUgqJljd45KmWMX/ASgi8c8Noj2tE6v7MVJ5Zt5qfbO63D6/4Qry4FZxbyLJotkAFL05itA/bsmdDwZ0WnmEoRZKZLq2xbguK/Vs1i5S65vT6eflTYIn7WXjw7rW2fPMXkC76iaHhDj/GKgRMnAD/iACHOyfNHA+tK8/Em2mNV2OeYvA/zkd0THKYgb9VzblH/UfTG51UtsqUvhGJWJhgRINHhaKAwsfUtb/jI7GIFna+3g==;5:a79zJU94bm3EhYxqn2qTCCVr9tgNdDoPN96tUs7TNqw1Q8/FaaQeCuCTTaGgtWP7CuEgJz9SGlusrJUi3fbS2gDmy/h+AxILNiUIOpvZLUNqryqmg0oQHOZR7amkaLOvN6lwKjkvikuLskdXhDMQTjb1RFx3dDqFWFvB4/sdbvg=;24:la1nMGsqiRlyjs5GPI7qqpcGQHZ5r7PH8t5jsxPqEh9jrnS5YRTXycmNufmROGHqa4NBl/phy76JuH5eZuj0cjvPKCNuNSisiAsNZRQlwS8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0202MB2547;7:m3fbdmzfXmybx9a7plwO8VVwPTOiYjLPCQZw9Y1GXhvwIRcvt3i4ES2vnyDsY83RATYLCDfUGPnticcZEsJDN+ynStvzS5OmgQt+SABJlZxtsOUEfz0/szV8rneEgrhS9meLtuKMgJHmMWxhW5RDh2Wrmrdm+EmqCFHJvOw0bKpi/EqPUPV55JzTKuhmislty7Exxh8t1EqBr9TuBN1xXG2FH3KKZ57ppAKUILnnorY6nzp4HdiKC7BHCTlxqPGkZtXHqME8T8DPJkhQfHUDQAZH5kt92jgaw7GxtScGMGcHEahUXpT+gP45CpfBL1ogARysgVUGn3A2iNdah70gRQ== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2017 16:41:39.2841 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0202MB2547 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@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 -- 2.1.4