From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754600AbcG0IpH (ORCPT ); Wed, 27 Jul 2016 04:45:07 -0400 Received: from mail-db5eur01on0113.outbound.protection.outlook.com ([104.47.2.113]:23745 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754415AbcG0Ioq (ORCPT ); Wed, 27 Jul 2016 04:44:46 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peda@axentia.se; From: Peter Rosin To: CC: Peter Rosin , Wolfram Sang , Rob Herring , Mark Rutland , Guenter Roeck , "David S. Miller" , Greg Kroah-Hartman , Andrew Morton , Kalle Valo , Mauro Carvalho Chehab , Emil Velikov , , , Crestez Dan Leonard Subject: [PATCH 5/7] i2c: mux: add support for 'i2c-mux', 'i2c-arb' and 'i2c-gate' DT subnodes Date: Wed, 27 Jul 2016 10:43:28 +0200 Message-ID: <1469609010-23049-6-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1469609010-23049-1-git-send-email-peda@axentia.se> References: <1469609010-23049-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: DB6PR0701CA0026.eurprd07.prod.outlook.com (10.168.7.164) To HE1PR02MB1306.eurprd02.prod.outlook.com (10.169.115.152) X-MS-Office365-Filtering-Correlation-Id: c06f9436-174a-4514-6499-08d3b5fa3db8 X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB1306;2:U9DI8Qzd2rYrQbR2RvA16M2UwEWi37ayZWonx8d4kX0GH0DcNijElC071mEb67jRUoQ70px0ebSo1BYPP4ZFNJNRxAHs4kJufzSsnHxRYMxp6r3r08oRUeu7F0vGKEMN+ncifuxO67MsGbn/YBSmk/5G7Y0PHDxwE2gdq7AXgJT5insjatJwPhwEJ4njCv/w;3:5hyBoDoXqlHKQARtfHb4iXHJE5tYQieN/wK0X3y9pcL4jYnRLa2IwrKcwifQG8ovCh8qqEJET3LS+5cJpZaYQXBYKo78xFVtv1HfxystEqA1cCx5BjRUwfXVfCtfJQ+7;25:FvmPw7yvvX9z6aklxFqgaN1OXCXI7B+P3JdNv616Z8Vvs0IQQfOUuFTKKSwEAwpfoNJTWaBvtMZ/yzhVago+OKshf3Qzi1v+FpIOOjud3ZKlSZ0HK+EBNn2eGLnrjx8CA1UiBE/bcs73qeQegFER0+ejfV2Q/S2T8dB3qmH/iVM8eKsGRqgoi3aInbeRgjxsXkxBlac3m7GWdkcN+XbfGN4pR51JB2IY3mBxV51DX2q0PqCq5MOKtxW3wjw0OEjHBUmMH+hjFHgXFHe44fNLAjT2Ue79qsJ/HeDmmfp4pg00AFxuJcmMxQzCMPaCwmNWpatiEU9ZA1NUeN/wVqE+8jKDs64C62nqvfWQfj8pkASSI7il2epd2wflTulLo4aVgx58CDKoS/PWom0fFzI6IPh4My1wPj5g7zn8VOismJ8=;31:FCUcQz1thmSSrsCOJ5slHAj4+TkynNV3TxI/WtXS3MIEZuoEwdksh0pu59fYdh3xYdj2I3lo65ZDG/ndEEnDbtL8efmSsIpkZd0km5EfhwWlKlew0q2Nn4ap0nniDp5UKR95xeCyQwtx+oWbZNmc/NxFj4xPdzqo1FLlauMPbyJMd0XhhXgcUNbmACTg5VX/q2WHhsonC4R0Ai71kRRyXg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR02MB1306; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046);SRVR:HE1PR02MB1306;BCL:0;PCL:0;RULEID:;SRVR:HE1PR02MB1306; X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB1306;4:v0g9AiSZ9LCn3uHTrBiAaxu7w8sF0PXrVyJnoWyvxPVeArkfa73VIg2HB5c2rTyQ6zdsFELCsFA/s9/cihpN9dCH6bKkhEX51SdIf9xEevdcpvihP/+/c0SpV4na6QVdmCLNaKyujI8omWjuUfBhn/TyysmL8G4i3osY3VWoZn1L4jlDk92E5NDQrZPY8Lw8VBuozJHWEZcrU4Ptsx6sevn2TNrupgYvvPhxk1NSSIr0El19A4tSlT50Znh2A4LiBCqBLItMMV80IUECPjqyneFxWSs9t06XDbdHgB8xtCInfZviKnlVa+t4BWDQUg18/WoOrqnm26ZzxtBxDYsymCTyDj+pusYF/RbQL09TcfR8zuQWgk5AM9xUk6V4sNQYMZ1dXQH036yw6AD+z4A/tgDCsz7zGAebtXswq1phCOk= X-Forefront-PRVS: 0016DEFF96 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6069001)(7916002)(199003)(189002)(2906002)(74482002)(101416001)(6116002)(36756003)(97736004)(33646002)(2950100001)(3846002)(586003)(106356001)(229853001)(2351001)(8676002)(77096005)(81166006)(81156014)(86362001)(4326007)(7846002)(48376002)(7736002)(305945005)(68736007)(50466002)(5003940100001)(110136002)(189998001)(92566002)(66066001)(42186005)(19580395003)(47776003)(76176999)(105586002)(50226002)(50986999)(19580405001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR02MB1306;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR02MB1306;23:okzHpaqgR3lyr/jzwMPAfGZ+TYiE1aNuxNAYVTK7I?= =?us-ascii?Q?QGVG9bfYZ5gN9FVCcu6uSFvdpsgixLRdtrHcmU0GEhN0ccO+JYV9RrCNVHYX?= =?us-ascii?Q?9vir+vQ2NdXmyr3Y9JfQ2v+3KbF12eFwAC6ct7/YRIFuZJjBcOAbznB1ONh+?= =?us-ascii?Q?0HS1hj3n1nXaIwq7VW5jxW2dVSQBqxY1T+WnMCBBuQX6EjA5fnRRPs2W051i?= =?us-ascii?Q?kWMK2+b8Nf8UMvJ+ckiap5sBIQzOc7OmMzEx1CsnmVVpjaR5llk+cbMZbA5t?= =?us-ascii?Q?q8gXsgz7QU/3MMEG0I//GFCKDpeK1mKG+nLxaFlFcipmQjUah8xkQ3YXX4cY?= =?us-ascii?Q?QdUwgRuAhroZkw+dCQWxU0/DRfmqeQonYowmAcU+g+2yHR0epuBacJtP/ti6?= =?us-ascii?Q?/fQJb9b6Ijae/MPIFHLOqxv0LGVLHC7fvms0F1+7yTAXf92pOvZ6A+EvkOZe?= =?us-ascii?Q?6Al0E5eeFL16w9A+NgltEsTEIWuNx4EGWjJLn/5Ck0qYu7qPRdSQ7Au9YF4e?= =?us-ascii?Q?OqwvNxA1uNGjLQ07GCgGjS9/dA8rhcAtC9AD02TATEme4RU4ufvGar95umNO?= =?us-ascii?Q?zLFtLi6YmXg4B4BiN/WZvJNIoGmtsdI3ZxSyUSPwbuQrVqxZs4ZetUfNO5pQ?= =?us-ascii?Q?16gVHy3wsSEomHBmh61pE3tN/kguoDVSKxU2VjsYAh8Kf6BoTOcOfW+vXzdq?= =?us-ascii?Q?fKhlv6CbxWK7BBfZH47OBqxb7KJBLmpSfAYZcgPmdKyt4dw0DtQwtn3P+GXc?= =?us-ascii?Q?uZhkIKrxFDxUZjOHY20BTN+ssEPwItGyF26lJDRjvTOSgFONzhVtt4S3XdxP?= =?us-ascii?Q?b7Y1YGlS/WMNwbxv5dcSitvvby8NIIC938eb0huinoo3dF8M+VN1vWsHVd++?= =?us-ascii?Q?CYQ/X5X34vQHQSPOIjCHseWKtxPSfIPcfvRDz0qzbWcHEg8GLsOxwXe5xHK1?= =?us-ascii?Q?1iSZTs1HxDQSADFgFrMg0WAIaZJ+M3eqxYywUqOkr8KE5EMCCfhVGF/SlzyJ?= =?us-ascii?Q?Pu4fQXBrUXMhYOVDuJGdHbr5h/9VWlK0vwLATrHgS9DZuzEaxwpH1BQUnlN5?= =?us-ascii?Q?AoyH/ukuERejAUfbToH1ZbLx+8VHhVmvOfNyUS2LwaeMs8yIkbi4rguS75vl?= =?us-ascii?Q?YnVXN20kwo=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB1306;6:X/qzu4PV5SvBs+O+ti33bky3TIiO36rjm1eu5YTT1HvIWbGRnnuuvA3eRj1wIECNIFAKyRi794BcLFiIlMYm33dI4sSy3uueK0Ou4dTgc2sVU0N5cCsd6KXsIJj4ANEpvdPVIN1cTPP+CIgPCXmF43h1PEsPBhJSkQVWM9q8SQUVtrI9JVHSOcd5dRmN9tGL79tBxdF+aWgUCBp4rbg5Q9IdTuGz/xI/cK2EDPUDPJb1GkTXw7KOm5KQDerLs0o+mE4PheecPL/XWXOvZ1Ey+AYC4sSBVaq3fVEAftWK9nsNZIDWhVIY/kPvJeEd4iMp;5:MufozgZhF/vuaW6wkhyVCeFLi9NYClj7K6/8NfFqJFhafB4//HLLZoOIdMCAo23soEi+RpzDH6SYc0qDLLREdFX/cBIdjDr1zqdqVAnLH+jNGn3vB3DjboLY+6yMnpdrF85UwAOGESUnpQVdVrnebQ==;24:+TkcrryJd0MsJtv3HtoI+1Ty6+SceVEzVQOA87B0zFgFcZxxZjl4g2f+iyC4ndBNBXQPJAGjBAESfh7myVVldJ04+/pX8w8BruJLtqcuQKg=;7:z1/v9BSzR9JDl6MM2y85fV/8Ht95g8eARmgpn1amN2GK1uU00zx7TyCsl2SFMgeC5jABz194Ea7VS8QelNDIqqeqh5nMZn4WVM0N95tumCFTPPfMSV65aFOWcWw43Xe51wwvlg57tInvtsza4/zlWTpggpVvO/gTRPIFTEeJh19eSb/PavMcQQmXHHlrSVKY2Wwu6sOk1J/YLeD1Kzbsrmo0oNueFUncftwKCI0Y26j3y77Oxzj55przgmhaKoi4 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jul 2016 08:44:34.5957 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR02MB1306 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Backwards compatibility is preserved; the subnodes are in practice optional. However, the mux core needs to know what subnode it should examine, so add a couple of new flags for i2c_mux_alloc for this purpose. The rule is that if the mux core finds a 'reg' property in the appropriate subnode, e.g. if 'reg' exists in the 'i2c-mux' subnode, then the mux core will assume that this is an old style entry and not an i2c-mux subnode (correspondingly for arbitrators and gates with 'i2c-arb' and 'i2c-gate'). Signed-off-by: Peter Rosin --- drivers/i2c/i2c-mux.c | 44 ++++++++++++++++++++++++++++++++++++-------- include/linux/i2c-mux.h | 8 ++++++-- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 8eee98634cda..c1ae719d1a7a 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -255,6 +255,10 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, muxc->dev = dev; if (flags & I2C_MUX_LOCKED) muxc->mux_locked = true; + if (flags & I2C_MUX_ARBITRATOR) + muxc->arbitrator = true; + if (flags & I2C_MUX_GATE) + muxc->gate = true; muxc->select = select; muxc->deselect = deselect; muxc->max_adapters = max_adapters; @@ -335,18 +339,42 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc, * nothing if !CONFIG_OF. */ if (muxc->dev->of_node) { - struct device_node *child; + struct device_node *dev_node = muxc->dev->of_node; + struct device_node *mux_node, *child = NULL; u32 reg; - for_each_child_of_node(muxc->dev->of_node, child) { - ret = of_property_read_u32(child, "reg", ®); - if (ret) - continue; - if (chan_id == reg) { - priv->adap.dev.of_node = child; - break; + if (muxc->arbitrator) + mux_node = of_get_child_by_name(dev_node, "i2c-arb"); + else if (muxc->gate) + mux_node = of_get_child_by_name(dev_node, "i2c-gate"); + else + mux_node = of_get_child_by_name(dev_node, "i2c-mux"); + + if (mux_node) { + /* A "reg" property indicates an old-style DT entry */ + if (!of_property_read_u32(mux_node, "reg", ®)) { + of_node_put(mux_node); + mux_node = NULL; + } + } + + if (!mux_node) + mux_node = of_node_get(dev_node); + else if (muxc->arbitrator || muxc->gate) + child = of_node_get(mux_node); + + if (!child) { + for_each_child_of_node(mux_node, child) { + ret = of_property_read_u32(child, "reg", ®); + if (ret) + continue; + if (chan_id == reg) + break; } } + + priv->adap.dev.of_node = child; + of_node_put(mux_node); } /* diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h index d4c1d12f900d..bd74d5706f3b 100644 --- a/include/linux/i2c-mux.h +++ b/include/linux/i2c-mux.h @@ -32,7 +32,9 @@ struct i2c_mux_core { struct i2c_adapter *parent; struct device *dev; - bool mux_locked; + unsigned int mux_locked:1; + unsigned int arbitrator:1; + unsigned int gate:1; void *priv; @@ -51,7 +53,9 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, int (*deselect)(struct i2c_mux_core *, u32)); /* flags for i2c_mux_alloc */ -#define I2C_MUX_LOCKED BIT(0) +#define I2C_MUX_LOCKED BIT(0) +#define I2C_MUX_ARBITRATOR BIT(1) +#define I2C_MUX_GATE BIT(2) static inline void *i2c_mux_priv(struct i2c_mux_core *muxc) { -- 2.1.4