From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752944AbdEIIfT (ORCPT ); Tue, 9 May 2017 04:35:19 -0400 Received: from mail-by2nam01on0073.outbound.protection.outlook.com ([104.47.34.73]:56694 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751312AbdEIIfQ (ORCPT ); Tue, 9 May 2017 04:35:16 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; From: To: CC: , Priyanka Jain , Zhang Ying-22455 Subject: [PATCH] i2c: pca954x: Add option to skip disabling PCA954x Mux device Date: Tue, 9 May 2017 16:20:05 +0800 Message-ID: <1494318005-38424-1-git-send-email-ying.zhang22455@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131387925137704651;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(336005)(39850400002)(39840400002)(39410400002)(39380400002)(39450400003)(39860400002)(39400400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(9170700003)(77096006)(50466002)(6916009)(305945005)(6666003)(356003)(48376002)(104016004)(86362001)(36756003)(53936002)(33646002)(38730400002)(110136004)(2351001)(2906002)(106466001)(105606002)(8936002)(86152003)(54906002)(50986999)(81166006)(2876002)(8656002)(5660300001)(85426001)(5003940100001)(189998001)(498600001)(8676002)(4326008)(47776003)(50226002);DIR:OUT;SFP:1101;SCL:1;SRVR:BN3PR0301MB0899;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;MLV:ovrnspm;MX:1;A:1;PTR:InfoDomainNonexistent;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD010;1:u+C+mK9hSkZCkCV5UGKiCDJva+VBxNki4RdqWvjvpBwzjM39Gr/zOWOs5ju/iBUhBkjXuUQymx4UOJopJAVB9wE6hKxJK2dw/CofBF0rpt1WpqrjsjMdLTl/CAnCoiLLlP98pumecjkU+OQo5A0KiFMsCgQF3GpKVJFO/jLrj4TfjHeXYt5ldP8qcNoIyhlF/t6jN+FAhZBA8/2lz6DaI69PTPlIkRjm7NHRNh60pPNYA6gZ14JJX2ROC1BmcHD53CnmAtxlXHjeqYOja6IQkyypdMvBwatt3m36ucAFKJRy3UmS3NZ/4bVAS3pGyqWWDHe1qof1M1YwaCIJGR77g/rYUZgghfeDD0H31imdjaab232bm91FodO15bYeXNOghaCtalufY2yP4uTSNsIYISNtNyrR18TFwPjRLmSaRogC5YkCyutI81tdIOGmMbQdSPkQiddImzhVoi6pa6jcnugtlRw971cQ0t6smsIVVhVrWrU2f7PGUJsinziBt9QCdrajY4JpdfwiGqXOTQNEsvBmEhT33o5tuwXW1MmrH9mmPGNwJy5thOL6pF+jb9Xnk4F1jst3SEG/lDA4q3M34GYdN1qfIWM0iB2dFolFOhDMe3m5kXVq12GUOY24Wb3Mh5n0m0G07FYRrXeEoGbh4InJci/vHLGpNUDYLhKOoNAfWHvyAhohQkUTiyqb2PogKKf+LKFxwCRAe5yICNoNkCSft6t6kp1s0sHi8adtukI= MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b32c5672-226b-4283-c6cb-08d496b65012 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131430075)(201703131517081);SRVR:BN3PR0301MB0899; X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB0899;3:NheHjwFNBOb34C9ift6/+COlX6zQ6TqqgtnDt7UsVu554QlI1Q5nE01Q7keUN16j+FUHwC6NfZCTejA7wdZQuyfYxD9L47I18o63EALLYmjgZrLnMs2rQGk6Ebc3aeuORUcIL4hpwmkSufMAdRxTnsGuZjDI6d05oLFNubDsJheeu/gz6J8w2MmealmizePIGSxflr0bi9Jz8UMSziymB/YoFlxhJZ40Wnu07KQ+mkGOtNZwRFBbT1IZTguq5oCQTV+z8LgXvC0E5LsCdKDYihJiFitFBkSu20I3TocQn7EUmo5a1ER3Ei7fR41+CW2f5lqI011/iIQHE6LFrNrdY4lPaw0Ebqkj4IdYfqjbiwYdQ63Lj64+XQSUmVEnMQGNI0ibMI1Z6J+vNohEcCxqtjDca6jn3OVJq7ellnITQ6egBvyGNCjj9w7CRRiglAbx;25:68hLjYuOyVVw4AECXPkX5gvYoPVDB1A4VEHcY/jRtu3eDbOPFL8hhTgc0MA70nPV1ddyz1HA/vIsNDEu4kISceMFMGqAC84FEv6LHeeV0x5XIqwNQrxPualkaqsr9Sdz/ZGsS+swZAKDjNiONZW2fzsaOWiu3O83MTO27PfrCBRwC1haN5TLGZGbrYRRWabH9u3lGI1RU0hWX+A4VFn4JP+H2LMfY2Oi3Zga0pfBOAQeZTqVgFzzY2NPahZifx+45pVm+dWd+IyQwQ6rdwyoTOLqbhnoA7S4cwb3GKrt3LzodNI/opCirDDVFORWmjdUlB4ev2xXZamQNiwoafXTFFX4wHd+NDJJ3cwUxTVwcatOIIJWirhsbk2E1QINiUm6D+NN7ZyhlLAcCvd/C1psLQf8BHRjSZlw4XMW7CF/F3O6q+9n3zBLWCWkpPQAzyfq5wWPeQga20aekNkGNhyMXA== X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB0899;31:TDrAzm3TGm9Q0ie77D7v1OAlsekieGDL5nakbKssyg3ESoS8KHT1Vxd53ttJDwBdR97HvP2LOvokPhgO6u9tzMLq/IVlK0B99DCOtH5INtaSWtUgLWuur/Xud6FtoMNERVQ6IYYICE6i3liUYcsw5GGEbsEOxNpqNECk+5bj0M2f4uwVFXanoFlYXk9HJMreuSfYpQ3ugGknl9bylhiyqXS0P6V8+JnAyxI4DQZzOATeQ6rCjm3+gC8Th32ymEdwSEuAHbLYWzLKLD/1at1e/Q== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095135)(601004)(2401047)(5005006)(13015025)(13017025)(13023025)(13024025)(8121501046)(13018025)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123563025)(20161123561025)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123565025)(20161123559100)(20161123556025);SRVR:BN3PR0301MB0899;BCL:0;PCL:0;RULEID:(400006);SRVR:BN3PR0301MB0899; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR0301MB0899;4:4qzac76e1tnsp1tcESoWtRBEUup5+6Nk/i02TlTL?= =?us-ascii?Q?ten1iSkXmMy3peAxuJhayWXnSwJYCDXQ3sgz8gQtn9NiI1Eqw6//aD6N8CxD?= =?us-ascii?Q?ZmSktZ6/ZUTGq6S5ClHxsG+aMDwavcxGPjBLeE17UPfYSzymbufmEhMABOUK?= =?us-ascii?Q?aEq5XRUiTCDaInho2ME8FaLvE02qMinWDYEPu6GK3gtr1e5uUidWyHLY0Sl2?= =?us-ascii?Q?eHGmsBJmbzCWwWtuvsCqgtRkjaexkDmrZtmjajYE8nMU5q8FPBRPwCzXzk8d?= =?us-ascii?Q?PR/Vx9C55WhOREIsJN1YSjPmkWKykqlcYeNTPAEd8NHOI6rm1bBAFJ+iE0x1?= =?us-ascii?Q?frGs2EhFuguGhKq+9vG14TaP6lY8Mj3zKAWo5f8kpL8kZziSw0gn1zmiw09T?= =?us-ascii?Q?g6vLwQG/KDOU+tolbC70Ha1+5TS4ELPzLe6ZU6ms7UP+4NJ5G1PBKFiS9gMA?= =?us-ascii?Q?uWgHpHf+UGIq1QucKjyMrsTs4vPL6bDf6BAoYPhCWzGoOl9TBluSzS1PmqEN?= =?us-ascii?Q?r63mQUz02iXhPUs/VlsH3QI8iBS8zh5eHbcNqIKC0Fk6vVb5Ob7yaAX6aoDV?= =?us-ascii?Q?Tb6bs2c3ewefsOf+5lZNqlca0fQYg3IhQOMSpWca4ru0hP2PHZEJKxbpJ+XV?= =?us-ascii?Q?SZ+BZiaFLraIIAIGOBmnIXX7Cx7PR4MVFX0q19SU2txJnLErrgOp3KL1LBod?= =?us-ascii?Q?pgwjxQGwdTNsnLawR4LvDhm5NKei+L3C8ywHUk184cdmNNSaCHo+OjKMBKta?= =?us-ascii?Q?QW/ehGFXMWuuXEuvyEs5sXbnX8qFQIVCrmyGqtFRn/U5FayBerRKP5Ulsq1M?= =?us-ascii?Q?on291Nee357cQt6KUlPmkEmpp7P3bP6TA891uJfnuz/V5meD3fQe64WSMwrw?= =?us-ascii?Q?9vlFT34mbkiHoTPcbu2XpEmW+DIoVSUzTrI+p08qmx2HnI8udub6/K32KfP+?= =?us-ascii?Q?QM36hN26FHC/j8HbwqHFafA3Lz5Lc5gYRO0dEV4ws6zlYCxAdui0OzY73JxL?= =?us-ascii?Q?NVI=3D?= X-Forefront-PRVS: 0302D4F392 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR0301MB0899;23:rbbNzaIMHS0lspbAqP1PA9nH5OfTz8g9VLWwuE+?= =?us-ascii?Q?upwrDhfG7+COVAzoLiDvRo3gt7FD/Rl2Tcx9OwredmS1iblM/OHHcPgjO1gD?= =?us-ascii?Q?51HCLWcKN3X9H445I5xl4q+osA8nbKoXXkboJkAY/oU0ij+fRZkuopxauihZ?= =?us-ascii?Q?XEe8TCcIVHIKaM6unsDSSAXbMxsqmokzQb/Dq04+AgGSSjRgmNncN/2KZlcZ?= =?us-ascii?Q?TYeg2I4ndFFJeSh4UktGWCZ1pagjN08OnaPAroQkef7lKAMqcYjkjRRQZnAa?= =?us-ascii?Q?13kc/atPxdTj08q2wxyMDe10Bqi/7Tz+GeMO1gkGEIFEwiV/hRFAoSvxUGZU?= =?us-ascii?Q?h2jGZIPyIcCTeBwZWPD+F/2dIrrycKtRaIToyK5bEVVVxLh/nTFnZtvNSzwu?= =?us-ascii?Q?fGVyDC1e+Xeu4dxER2RFBGjXLU+1N3YLWhlLAKHPkqsOyBd2rKM2YgUXZVKQ?= =?us-ascii?Q?mglAa0SuHR2jTCj0uD55T8/rsVs4e1vkMkRjv4YRjx8i4avm0R9AmAJeFwtY?= =?us-ascii?Q?DCT1rfy00pLMwer2FgzPFgNH/0txIsLP5xiL/1N75I5CJX+JA1CX1OeFdGU2?= =?us-ascii?Q?t+txjyIf5B/IquiixdH2hpf/8410vNY0d6qlAj9hfYcLgTeFvY7J0BCdQ0d+?= =?us-ascii?Q?GBpI4cJdOl5hWAtGMFKaO42rF80JH/1ym4Pd8vJd6+uq1q55zMk5IWk4bUeo?= =?us-ascii?Q?/FMy9gzIy9n45KNDd6ZtouNm1HB6VsVan2C/Xp+FPtin1WrMWvDtNPHQLsFb?= =?us-ascii?Q?kgl2df/I5ianZEOIVCoWYCrDElUv/n4kTwE1MvtgA1/Ae0lFq4p/lcGL7RHd?= =?us-ascii?Q?3dLNEigkB1TyJty62S7VFxTx0Cpje2Y7GEaxoMJW5OVY/ZqpoTtWUdHrDoYu?= =?us-ascii?Q?O8pGWsS6/7064QaPF1ZXMh0Ju23gl2K5l+zIK23AOaONi5QloiUIgdNmECDX?= =?us-ascii?Q?3c7q7U+YZy86+QJWe+MrA6Bzmi2Y2GiLmw7kiM2fWcCBml3T+YKXKKyLDP6z?= =?us-ascii?Q?FH50Z/RUDchT8OdsQw7xMl77s/tbxJmM78c8DoYvEHcOZP4L2B1OHfYTOKJm?= =?us-ascii?Q?iTlqgaXTFozmb/Vph9wpJH2cTTtvyy9KdjIGz1RAVjxVkeKsQ7L4q2GVK8D5?= =?us-ascii?Q?V4ONmmi/RE4eWCG2XeiVJ576dR2RnJq8frd06bZqKIb/vFaFFAeEryUSIC72?= =?us-ascii?Q?Tw8mvwxSCaTQLdlPtmls8QzBfO9sIKI+G9jdbSsvDn/3kPTlzg8aGAPgiTA?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB0899;6:XctVqYOks6iayT6hTGutq/eQuAyJAco68+YbIu6GKdJnDp5ZezcMpkji8Y+MOflMxdsxJN0cZiMMxhYjGvw0VpI6ox7BPJIts9BxjQ7Em6X+2W5vQsn4AsseToGMUvwsSidEwuIfNb21Z2Z5EkDz6u3fNnH84mcrHRpqWXQ0BlVv3s6i7Eean6ZXeWixHa9f3fibtQ1uE7caLl6CONnmxp/KKyeTCTVeuz4sp+2HFkHs/XsH3faPffzL8c/g9ArNpOpBmTnUiQr5aqzeoNxFJt4kGq7u5/oA5nSBg5LF4Jzc6h5QZ6VwDv5huNK96tDXiyshUwQ1M8YimM9SA2JEUvhoygD6ZTPgR4x+gdhhfnY8VM8CgPecnzS8B6q6lLqFWUzoueyeh+o4OKxRYt/nVwoR6EcGIXdjFXWKAAiSWUsTaMQi32YJ4f1rrpB2oNxWX7ILFZfX+vUc1/xdsjHv5OyZlHW5wtYdqfZyuj6CNSIBvCHeMk02PgMf3+repD/H;5:RP8U+/QJnNsVCcgilWlvtcXiJ8D8GQmbUD2KfV2QH7samJWVgLOGkE8JZAuSFane/Z8xS0zPsZ5wgV+cc12YeP0OLXtNwekJH3J14QO1p0RYDQIU4wQH6/0thDqgP0HFmoFg5bbl1AIG8ncuXFNAU3H5CAYqwYzN2/tLSlcoJkmI+g9oZ73JC8qhT76Jim+g;24:fcXEtrmfkZguMsAawMtMSyr6LpU1Q4HnjWJLX8XxSbMPYbZsIOoDA9yXwDRKedQ/WKXcYeGCgN6sNypy+39tNJFadSphT5XAbzs/6k6sWLw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB0899;7:mP2sV3NOC1DVSLZTXVHnJB00wTNkZ4s1gL/JwPf0T0BcIE2hXvmwPg3KgcYh2r23XFLB883Jynyx2p+adDTKwkmhZIhaq7E2h7D3e/wDREjoSPge9qdlTQ0231NvsnGIsTuFCMRLs73nei/oIO6ROnlIIzf5IU8hIGBC26sAwzlxGNr1t+TP6YpIkGM8rBpW4mnuZQzYfiJ1EarTE65KOXxk42u2yHEjr2qAbdKYidmKA8TUvKtwzgl7TxnEkxt8Q8kZPXZGnkE4T5jXl6xhWTm/1ZCWR70VvpI4qRB3n3lSSFcJrPIGkl5K4f1w/yovdePGp9Qh2Ffe8jm6E3d2tA== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 May 2017 08:35:13.5208 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR0301MB0899 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Priyanka Jain On some Layerscape boards like LS2085ARDB/LS2080ARDB, input pull-up resistors on PCA954x Mux device are missing on board. So, if mux are disabled after powered-on, input lines will float leading to incorrect functionality. Hence, PCA954x Mux device should never be turned-off after power-on. Add option to skip disabling PCA954x Mux device if device tree contians "i2c-mux-never-disable" property for pca954x device node. Signed-off-by: Zhang Ying-22455 --- drivers/i2c/muxes/i2c-mux-pca954x.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c index f1751c2..4d18fc0 100644 --- a/drivers/i2c/muxes/i2c-mux-pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c @@ -85,6 +85,7 @@ struct pca954x { struct irq_domain *irq; unsigned int irq_mask; raw_spinlock_t lock; + u8 disable_mux; /* do not disable mux if val not 0 */ }; /* Provide specs for the PCA954x types we know about */ @@ -221,6 +222,13 @@ static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) if (!(data->deselect & (1 << chan))) return 0; +#ifdef CONFIG_ARCH_LAYERSCAPE + if (data->disable_mux != 0) + data->last_chan = data->chip->nchans; + else + data->last_chan = 0; + return pca954x_reg_write(muxc->parent, client, data->disable_mux); +#endif /* Deselect active channel */ data->last_chan = 0; return pca954x_reg_write(muxc->parent, client, data->last_chan); @@ -361,6 +369,22 @@ static int pca954x_probe(struct i2c_client *client, return -ENOMEM; data = i2c_mux_priv(muxc); +#ifdef CONFIG_ARCH_LAYERSCAPE + /* The point here is that you must not disable a mux if there + * are no pullups on the input or you mess up the I2C. This + * needs to be put into the DTS really as the kernel cannot + * know this otherwise. + */ + data->disable_mux = of_node && + of_property_read_bool(of_node, "i2c-mux-never-disable") && + data->chip->muxtype == pca954x_ismux ? + data->chip->enable : 0; + /* force the first selection */ + if (data->disable_mux != 0) + data->last_chan = data->chip->nchans; + else + data->last_chan = 0; +#endif i2c_set_clientdata(client, muxc); data->client = client; @@ -373,7 +397,11 @@ static int pca954x_probe(struct i2c_client *client, * that the mux is in fact present. This also * initializes the mux to disconnected state. */ +#ifdef CONFIG_ARCH_LAYERSCAPE + if (i2c_smbus_write_byte(client, data->disable_mux) < 0) { +#else if (i2c_smbus_write_byte(client, 0) < 0) { +#endif dev_warn(&client->dev, "probe failed\n"); return -ENODEV; } @@ -384,7 +412,9 @@ static int pca954x_probe(struct i2c_client *client, else data->chip = &chips[id->driver_data]; +#ifndef CONFIG_ARCH_LAYERSCAPE data->last_chan = 0; /* force the first selection */ +#endif idle_disconnect_dt = of_node && of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); @@ -454,6 +484,13 @@ static int pca954x_resume(struct device *dev) struct i2c_mux_core *muxc = i2c_get_clientdata(client); struct pca954x *data = i2c_mux_priv(muxc); +#ifdef CONFIG_ARCH_LAYERSCAPE + if (data->disable_mux != 0) + data->last_chan = data->chip->nchans; + else + data->last_chan = 0; + return i2c_smbus_write_byte(client, data->disable_mux); +#endif data->last_chan = 0; return i2c_smbus_write_byte(client, 0); } -- 2.1.0.27.g96db324