From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753242AbcHONmV (ORCPT ); Mon, 15 Aug 2016 09:42:21 -0400 Received: from mail-db5eur01on0137.outbound.protection.outlook.com ([104.47.2.137]:2648 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753131AbcHONl7 (ORCPT ); Mon, 15 Aug 2016 09:41:59 -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" , Geert Uytterhoeven , Andrew Morton , Greg Kroah-Hartman , Mauro Carvalho Chehab , , , Crestez Dan Leonard Subject: [PATCH v2 8/8] i2c: pca954x: add device tree binding Date: Mon, 15 Aug 2016 15:40:31 +0200 Message-ID: <1471268431-5148-9-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471268431-5148-1-git-send-email-peda@axentia.se> References: <1471268431-5148-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [217.210.101.82] X-ClientProxiedBy: DB4PR02CA0038.eurprd02.prod.outlook.com (10.242.174.166) To DB6PR0201MB2309.eurprd02.prod.outlook.com (10.169.222.148) X-MS-Office365-Filtering-Correlation-Id: 8b26bbad-9f31-4321-e773-08d3c511eb98 X-Microsoft-Exchange-Diagnostics: 1;DB6PR0201MB2309;2:XUuLG1agPcTrvj12nFG+nKlOO3gFTKw+/kIKuPGVKL0HD3t1k4BFzFs3SyNBoxf440yqky3Sv2sQLfQjRsS5rx1+Co926vHtQMrJR8/6EKhp8RoIyKGT+Z0UE67qDYNMiLjslcL6hu2lZz7Vsia8RWga69SMfstwcbwJ1OFhVl2hdhI/OTftSV+tXpcF1olf;3:IKscPIOvf7jlJV4hkWgSPJPzijk6+hdgOX9fN2erqfdqL+pfyCoYrwRfTHWDlNULLu89Ad90PKwksmEAZ8aDKd5IBPFJ369Kh6kDBr8dycZMYy+iwMY/ZN5scMu10dXA X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0201MB2309; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0201MB2309;25:aXzHZnQuzClqB2e4HR0yt33Ec5awKUuBRhmAEfbJORrQ3m4VcBgm6Y59jF2Fs2/P0ZL2ztRoiCdwr0NkYtwOvd8u7ZMJGQSxXBJ5ACrnxrjWCwcBDXP4KtUfodiOT7KEezczEA87j5e/5iWN4fCCul6pWSinjHLo3EObltww539AaPvB5ZtjXg1PZFEV48w+OiEhXkGWhFhMNgR0gf+bVDqi/vfWOjdyU7LTQTWMcE1OTjc7E92E3wa+cBE0da80+sat77vbutw1/K11KGqo8irBvtStmaSXuMl48fGGNWJjB2E26NXyZvjVP4Tj86sgUEkBUp+g2tYc+rmdV1+ExcN9AtdbUQC5RloYEbo9fjAzkL03beW4oW7Ewr08TB/ZViy/TLV8He3V5ndBkyLeBastOrCdW9S7DN4+LFBMakanzi9Sm5B6m2wdkn/s0hvXdCXFXjazGSR6lxgdQ1/GF92qzWmSr48Vw+bjqKXyeK+kDg0/P9SiYv3y8ZVwTotNUh6JITRIKvbbg4Q687tVmp0e0Apdb97oWtcjvvdLdVcOsfyR/miYrv/L20Z3fZrEzyvm8R1/eJ2kgp7B0sIm9php5DS2EktJw5equ+B9BUEjMmqGmgMcQFWGYl+q8ZKB0hrhZoQM30yB5+59QNb7U1JS6ev18JuFyKARtVoFVei44JLNcQYjfLuviae2BG0OJnU3HBzPAfy323vzzUHIhnhOgCgy4i/Tk+P9zYEwH88= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0201MB2309;31:l+hrM1m3lllcFh9yGf648M0qS9sLSBsetQOCD/OPFC+VeqK4W3ZQrfpGH10OmIGLt/5QvscQvIEAwuaY+KJAPEInRONHAB/s/0q7163J55dAVJZLx4Uk1UYYrnv2B2QguJMamI/gVAE220ew/RvGY2Svio3LfnHUDY6r7R/WpbGdwoMni6hAMXvwha2/NNp00Rxaw9gKEkmAtd8KcZNqRBLI0qTMr4SaUVU/kRxC8/E=;4:o8y5o8aQIWzHw+N4SvLKYNNGfFGR6C/rnRfrblY9AykdgphKwI5uUpfBuM1hvBDIEclPuAQQ0ZY6vnoCaM1yILT7B9gzKe9v2hg8MYd7XTLQlZhKHv2XV9uLjMVkbBFxvwr3GcX70irQn+BB2s9vVC9kd3WwI4ZABq15ZEn8IM7j1AVPMiJsUIARsxZUqLd207V2Etn6tLthyHXbRxauRnCjs0qxTlnv0ImhO9+8FDrD7WVfXHxp9fVn8tjnaajXt/dLJjaiBDXQU5bl5qm+43+SvU8QFecrlZ5ZQFOEbjNMFE1AgkleGsw/99VFxErf01IV9cUzfTWV2xwR1rZx/dbLJtaFizOOmygL/uAdGDMRP36TD7RZfdcz6DXjsSS2fjaTJ3Zf1WhMHmIdlY9zboJ18yQHnXIJeieh2X7/Ll4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6042046)(6043046);SRVR:DB6PR0201MB2309;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0201MB2309; X-Forefront-PRVS: 0035B15214 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(979002)(6009001)(6069001)(7916002)(189002)(199003)(19580405001)(50226002)(106356001)(101416001)(3846002)(36756003)(2351001)(77096005)(74482002)(6116002)(229853001)(105586002)(586003)(19580395003)(189998001)(86362001)(42186005)(5003940100001)(8676002)(7416002)(76176999)(66066001)(2950100001)(50986999)(48376002)(68736007)(47776003)(81166006)(7846002)(92566002)(33646002)(97736004)(305945005)(2906002)(4326007)(110136002)(7736002)(81156014)(50466002)(42262002)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0201MB2309;H:localhost.localdomain;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0201MB2309;23:W/T/nad19wOG3xY8udFZZn/NrJ7X0vUoscWdsCk?= =?us-ascii?Q?64pSLYe9K6jAZvt+CMo0N63SlITyVQZHaG5VWUcVRNIcHyfDG8hj/QiQjxWK?= =?us-ascii?Q?Fpqneo2Q/CR/y6fSP4kBO+H+QOyRKC1QX0FFv6kaBgcg+cJXbnqfacdCWR3A?= =?us-ascii?Q?1e9SCXR5TwLodXwnoMNp9kJOporfx0YZQm1tTmadRXRISD6dyBu+VBOcF5V6?= =?us-ascii?Q?T/VZQ8dZANJxlcpADP4v0sKOht/lrXxDbCk3pAXeqeHB7/0TmWC4foNeV68o?= =?us-ascii?Q?zJ9L9Rk/z5UtL9Ph9Np6omzCLuX7NIGFIwPs3na/p5Q0egqs07H7e8GKVTSs?= =?us-ascii?Q?P2eOciJlzSVv1k64RcsF7G0FfUQLQYoifHOHLrGxtAfkqc/F7dNhzfIT6wxR?= =?us-ascii?Q?QTzBdwP/WK0mlanMU/oDceDyqLLYgIbaJy/cuqfUxI8Sys9aI1ST+jX6WXG2?= =?us-ascii?Q?2aOWMjbL4gRZ+nWnpTwVlv4yJYQhITwRHYSeC+LHxdgxWWHmBOvMRlSO7fmd?= =?us-ascii?Q?U3YZq4PKOtucLH2GbjzXqabHAjHhr7FHKXhey2lrqi4uOmCfHaPOjKGxy3YN?= =?us-ascii?Q?iaolblFqFU0dJyYftj3mAgAHlnwMpoBjgJZa6oSuNk1eKbcZTPoqtGNNeik3?= =?us-ascii?Q?Vqpc5dzK1JwR7pnX0EoHa3h4YdrY0cTvPzb4zH6i7AqIn+W9uLVtxZzx37Kd?= =?us-ascii?Q?fHNx0GI+BOzHNv3ZJ7fRD1gdJlL1Y36m2T3oVbQ0R6HiS8x/1BA8cUMUCzF2?= =?us-ascii?Q?Z+dHU3+XKYGmRXJJJHDtwrEcPdiW607Wk1Z0MImFuOgL+qBFc37tpvhVr6F9?= =?us-ascii?Q?wmniAG8FE9KjU7sZfYEOpn6B0R3rGRnC8PkokoFO+aIqoyPFfyVqO4L1Nd46?= =?us-ascii?Q?QucH/LNWor4ZKrxhS4FcKhr9RwOnl9UbHxhXbryfCq5/wjLoHhQOhSYEaNHI?= =?us-ascii?Q?1bjujSztPHWSmhem0dZ80y3rcsnfuUsfeA/2pe2F6Oy5jvlxx9Ik9Pbg9I6m?= =?us-ascii?Q?oue0saLUF4Du3qQTf/VDeMdUCiXyzsa0ZJ69DfaUNzVN9oMPHsZfWWsygZpC?= =?us-ascii?Q?0eLtRVJy70Rqt9TqFLHJ1rn7tB1du+Jwi7jPjsQYUqLZGGSaGUlbKcE+J3rI?= =?us-ascii?Q?cyA3xxA9ZCxbSJW7BzdMKLjoSVgMjtySsG3NZBCrWGCQaVrJaHRdLVOKbpya?= =?us-ascii?Q?AEmSQuYDEuoG20cHduOBYhrVy61DGZnAYJH1chSA9pvnJq/5myMWeLf6Huyu?= =?us-ascii?Q?8kdntsIzrXmOcEIks+5w=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0201MB2309;6:77ZhQh2YPvDRmYKuvd6tg2p4ss405fWa5jwyaJpjwCZUy1exCpDvtn/v/koi8G+TQkAqI/RPVQRs/TrJLxALsNpE3R6BAuxrB4085yzQWse9nTP+pBU3c0BA5Vm/dzYqjDT/ZogN1RVCRE/CPH1lko6XjsPaX6CO4FP6AR9HAcDX161aYNBCBkT4uNTkQxrgkvhv3tOu3W+mXj0fWyniD15R0WEDT2gY+E+L5m74HUnnmPtpZWDo7nybTOjZwje3WRD8H9j6hejUfC70JyPC4TLA5yF7QIKD345fN3+21+ZAuT7GFIXt3imV1N4sWV5e;5:IGUypwcoX1DCIOhcKumOH2WkjKRWnmlQqLLzDdHT8vBaEYSQYVpTnlTNl2EjiAPeEEJc0NjCTFr7IX4Q+eXpudqVvZQfdH+RuLwpa7L9K9zelyHFqMRo6ZRYXnZ7yvVeBGcNfH5WMrUrie38/Ol0ow==;24:KPqrtJjA7QThT8TW/T2k+bzXc9rYuKP9OPF+x5fTLgbE9eosiAzGqwI5OFNXMHCsNZMdMkEz9kIGcVRvKMxvq+oFpoS4lzXBbz5Dge35Srk=;7:0gGr0Rx5geXk9Mwjpk1WDpHOkHnJx2IS4D3m2MUFWxeiqvcHG8/gBNS0hwW6mmZNpoUB7QKLOcVAiA4SSqDtFemD+898Wp+pbLCRgVAeGoW65xNRDAfIJ6EjgofGhd/t7P1ZnCMMcDTjlyyOL1KXbMjO7MjRZ+d39u4oXll9y7rxUMb+t4zWmE2mt2eqnvOUXpJyRCCSM41Upx+eIInVq3Wz1lEcVZZCeY7D2HjiW7ynm/Sg0ZalcyrRLcQ9A4g2 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Aug 2016 13:41:53.2381 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0201MB2309 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org No longer rely on the implicit matching with the i2c device name, use an explicit compatible string instead. Keep a direct pointer to the chip description instead of an index into the chip description array. Signed-off-by: Peter Rosin --- drivers/i2c/muxes/i2c-mux-pca954x.c | 46 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c index 528e755c468f..6dfd31ba29a0 100644 --- a/drivers/i2c/muxes/i2c-mux-pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -58,14 +59,6 @@ enum pca_type { pca_9548, }; -struct pca954x { - enum pca_type type; - - u8 last_chan; /* last register value */ - u8 deselect; - struct i2c_client *client; -}; - struct chip_desc { u8 nchans; u8 enable; /* used for muxes only */ @@ -75,6 +68,14 @@ struct chip_desc { } muxtype; }; +struct pca954x { + const struct chip_desc *chip; + + u8 last_chan; /* last register value */ + u8 deselect; + struct i2c_client *client; +}; + /* Provide specs for the PCA954x types we know about */ static const struct chip_desc chips[] = { [pca_9540] = { @@ -119,6 +120,20 @@ static const struct i2c_device_id pca954x_id[] = { }; MODULE_DEVICE_TABLE(i2c, pca954x_id); +#ifdef CONFIG_OF +static const struct of_device_id pca954x_of_match[] = { + { .compatible = "nxp,pca9540", .data = &chips[pca_9540] }, + { .compatible = "nxp,pca9542", .data = &chips[pca_9542] }, + { .compatible = "nxp,pca9543", .data = &chips[pca_9543] }, + { .compatible = "nxp,pca9544", .data = &chips[pca_9544] }, + { .compatible = "nxp,pca9545", .data = &chips[pca_9545] }, + { .compatible = "nxp,pca9546", .data = &chips[pca_9546] }, + { .compatible = "nxp,pca9547", .data = &chips[pca_9547] }, + { .compatible = "nxp,pca9548", .data = &chips[pca_9548] }, + {} +}; +#endif + /* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer() for this as they will try to lock adapter a second time */ static int pca954x_reg_write(struct i2c_adapter *adap, @@ -151,7 +166,7 @@ static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) { struct pca954x *data = i2c_mux_priv(muxc); struct i2c_client *client = data->client; - const struct chip_desc *chip = &chips[data->type]; + const struct chip_desc *chip = data->chip; u8 regval; int ret = 0; @@ -197,6 +212,7 @@ static int pca954x_probe(struct i2c_client *client, int num, force, class; struct i2c_mux_core *muxc; struct pca954x *data; + const struct of_device_id *match; int ret; if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) @@ -226,14 +242,19 @@ static int pca954x_probe(struct i2c_client *client, return -ENODEV; } - data->type = id->driver_data; + match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev); + if (match) + data->chip = of_device_get_match_data(&client->dev); + else + data->chip = &chips[id->driver_data]; + data->last_chan = 0; /* force the first selection */ idle_disconnect_dt = of_node && of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); /* Now create an adapter for each channel */ - for (num = 0; num < chips[data->type].nchans; num++) { + for (num = 0; num < data->chip->nchans; num++) { bool idle_disconnect_pd = false; force = 0; /* dynamic adap number */ @@ -263,7 +284,7 @@ static int pca954x_probe(struct i2c_client *client, dev_info(&client->dev, "registered %d multiplexed busses for I2C %s %s\n", - num, chips[data->type].muxtype == pca954x_ismux + num, data->chip->muxtype == pca954x_ismux ? "mux" : "switch", client->name); return 0; @@ -299,6 +320,7 @@ static struct i2c_driver pca954x_driver = { .driver = { .name = "pca954x", .pm = &pca954x_pm, + .of_match_table = of_match_ptr(pca954x_of_match), }, .probe = pca954x_probe, .remove = pca954x_remove, -- 2.1.4