From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754695AbcG0Ip3 (ORCPT ); Wed, 27 Jul 2016 04:45:29 -0400 Received: from mail-db5eur01on0130.outbound.protection.outlook.com ([104.47.2.130]:27899 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753432AbcG0IpP (ORCPT ); Wed, 27 Jul 2016 04:45:15 -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 7/7] i2c: pca954x: add device tree binding Date: Wed, 27 Jul 2016 10:43:30 +0200 Message-ID: <1469609010-23049-8-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: 88916749-30bb-44d5-4a41-08d3b5fa51b9 X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB1306;2:TTeCMK4O4lhLu72dbqUuX2X8oPkdv7enK98iaOrH4OdfIIG9eFKdywnv4GjdpNe9e3NUbcLWlvE9q3uYHC1KDa+bY3fChN5MUEj6gYLRvfrlOHKl5lY8W9ZvZX3/wP+JBdTk/76+v8tq8XfwPXvQyJ7oSdquKSigjSCPnRxU7WOi60+IRFEIYxVQoWGuPcum;3:FW6VU5BhBecim0wW89kPBAMdVBMxg21BAG/x1LueahAw7QDyzbtPjnCcDKQ4Ed8xlwocSEQuy4cFcoYAu+SeTVWmzgsh7XWtK7QwGX1+nJEJR3ZjNpSbE9qKEMvD0Jcg;25:dFQ7tjG5EpeYlqPMmPwJtDcgNFK+x8QMc1HC4tL/Pbax0PwuBOkdZdjXq+IYT3Sji97IEbYSGrW2kCDbrXPTKp7PXahD2ZhI5k5cGa5NGUwAkz8c8e0qOfBrlsgDyd0S0MVU9ty7F76IEcHqFojA+L7NM4Q4+9sJQjP7x9Y1tZKgPWS7rNLqAxbSGnKY3kHXfEn5A/fSdb+lK7MOipN+IvtDHxMtJ66AFE+XKq/0QRjf8+HPqpWcckZt60V5eUr/yBq1U4FrWGcmgImVKE0aD+Xs6KwSQmeIFEvdKQm3EpRvXTMsVeHOgsoaNXcwqDwRQodnNIIvxALQmITvbREK9FRTCECASJziJyJjbGUfNLdT6YZCV2i9aqHD4Kf1CC0XHsEtePHRln2c/hrcxmxCIkxQgxojU8aXbDUJx1FHcq4=;31:iuIFAaVbDbTpO79Yzi4HwukrhVvX0+6A3Ooxl7aPs5u1D/TWhuUrbRqTT+Z59kRzLJ5Qg31cOXCKTi8tOM5cdvHld5lTj+ZE9fINgH1XUHL8r68bGrayJ77o7BXm3OwN4Ve4ZBrPLoW2NiDLfFRUPNTS932UKAhnuCQ7ibHHJGb1COIL+f5/RYwtzPtYlhLsLNnJB0B9kjhRIyl8d81cKg== 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:2XVtWVFZ5J1HZoZW6uHs3Bly+bGVok/EAQlx/oquPAyn0xrQpBqnpB8sESZeVEaUfgVckQtaZe4S8MyzgWqXpa8/oMvdAWtzadmKJtNIztj01iWcc4DhnXBFi/XT3o9FneWz+5NMynI11gzQVbrzeN3uD742IP2vLa9DQh0IMR5+kxdFhO2OlcH9OK9/158Pl2VmlBLPTY+mVie7YKqokeGXt2Ardwpe2D4zvhMAKMgg9ovJamr1II/Kby/XG/6qUpwCzk4ciXyd0H2gU30X1DwI8qtY6z7K/f5HNrQo/jCeohTZSCcf5bgvj506ortXLg2+K7qjGkDG/lNtd201R2osJCT47Nv9IsfR381fB9uLT4j8dfcr/bkEu8yD34n4Y3+ySMEnffJ42W8Ts0CafuAkibNdfV2WVZ2530IY2Ow= 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:vFgLTK8JFDKZqzgeFIeriWMLn+hLjzZblGBdbRq2A?= =?us-ascii?Q?6wi46EDHZTcHLr/ZfopyYY9YD7U6ZlmVlYjpu+Xp6/lDMCgVTHjrUta3Xrrw?= =?us-ascii?Q?SMrz0HdMRYLea8KJfwsFtITPr2+c5vSgklI9QfFLloeOOWDnIih0YpcOQ7XU?= =?us-ascii?Q?qhkRc4vM89xxzyIDdfNerCVLgnQ7lQOjFkcpkKz9RRvaLeEPh34XiPKHusRe?= =?us-ascii?Q?hgiZw7b2MUdXEewYcUTEu7OloURd9Myd+BuGvwh5nI6jAD3g+lu3eCiV5NLE?= =?us-ascii?Q?TnGqTPVEKaQoiI320ZVRO2b052/Ljc5WxjGAcJQPOOmOHLiiiA9AQqfOkEFj?= =?us-ascii?Q?/UoWGwey8k49v49VfCzpL3piefDzrgNc6nyiiEtkjbD2G+c8D5dnoeMPN5EL?= =?us-ascii?Q?HIwGddqvVjUgMvczWsUq3XFJqFT1IqHow5NV3TBk2tz6PRD7XUnhqUjnSN5Y?= =?us-ascii?Q?6QPSUTEwsaf9ufyxJPvADxrdmbxTSfh18yFI1j4PfFWN/xHvbSHkmcnBD1eG?= =?us-ascii?Q?71L/jH7FhJ/WF4wzBLytbbpr/k9fK136e/VrrXV2Ef4r8qldPLGDcmXQvVBZ?= =?us-ascii?Q?S8WiI2YimS4X2rJ5SvuWNpeEM6Iuy7No5MTjSeM6WJuNLaV9m/QyRwKjl4jM?= =?us-ascii?Q?XEGj/2r5mxlClJs3mD2rd/XrsHQ5vpfPSb5SzTuajrEdiKzicVVu8GcXUx+q?= =?us-ascii?Q?J6uLlMmd9Zn+dGZr+QvlBGCvFwAZTaniz7FgtnWL1u8lue9addJUTjGFVg7D?= =?us-ascii?Q?utsc4/sDvlePFO9evdKeUWFqjXkRZtI8gK7QWfzo4+wjWxLc8RrQYJ4Tb7J3?= =?us-ascii?Q?0m2mxPtOZs/qSv3sIp1OE9w1PEt7LG8oyyFqIv3fhiZx+9WemAf3DGkdx6Kb?= =?us-ascii?Q?XJUOlxpUzqeZ8FHW0PcxvbdEIwU+FJ5RIpNPsd5p7B4wq9UpE1wn+vMdL6Na?= =?us-ascii?Q?mhAlmQcH2408qlguwzLZyN7EyglQ20DRrBebqmqyL/ReKx/F/py+fVgu3IrY?= =?us-ascii?Q?YXEi3tYaAxkdYhuXVZVKFq55n5/rQqEynXQQ0fSsgtZhZhj0rPYuCA9Vbc9S?= =?us-ascii?Q?cLN2YP0kw3r1pJB1JoMMtCbGfTYQry+j1uhSTvuao7VaCbXNVrMHXBp9NZM/?= =?us-ascii?Q?Ox2tSLeQKk=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB1306;6:+pS/YmdVXEyOJLga73Ue6CfwkaFUSI6sXb++6xVBrjfiSLPYV6SUGDYkAAAnLEOmrvpM0g7+k3cRWeVxgWQ9RSRl7EOIKTAmxd3113oMcvq8YtENyxivUZief05gP+BXStRyzDohei0/ZExcYrscqIOJpi08qEHJOu/Cv70VASdnJY5g341Ifyyd6djQcdxdpR53WAhpXf/IgyP0+dubqbbNA4hWtnYTyODBRlFIUT+x6hjpVjG81kwfLmyo/Ow93m7oi7bmi2T99RX0kYfxlEVQusA0PRAXPYxh6UTG6mkLqGerlSxZLyKBYsL79LSZ;5:AA1E3G+EJ3APrWCGKUs4iKUj3il56DEj4Buj6Y5FaJl5cchT5HS709xsDklbp0I8xnzj9MPkAGbA8Ii9Jz/xQwVJyQE/x+KYGWkxmiiju2xXRlnga5AsolTk79tR1eP71GYENyB6lowBN9dPolGS5w==;24:4B1KMbUFnt2NHFdA796anFEisSfQzhRQIA6fes0ubwtuPbXP0agy+MC61MTk7/1senY5bKgR0fmgGOrhxoQVrt5VQCehejzEXnbtS3hxXXE=;7:mAFtxOZRlYwPvxaW4GHNVI7ErIPnJU5WNW4SFG8QMNQnNrJzpAxF+yRgfb8sLMPdBUEkRoktj6bxcxAViCX8zwMIkZPY2u29lHUGeIucU76kPcp09H4nY9g881nBmzBUazFZ0UIzP8Z0OV7b8+klw0rkW6e5utFjwqjaDlf52JoiJhLX4suZi2G2+wTclMBc0E/v1vlU7zngaElRYv6uvhYhPDAtBWWCAvz6XHOA+EQn6w5W82q/MT0xiXcLlzQh SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jul 2016 08:45:07.3413 (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 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