From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753114AbdC0MTC (ORCPT ); Mon, 27 Mar 2017 08:19:02 -0400 Received: from mail-eopbgr30137.outbound.protection.outlook.com ([40.107.3.137]:61246 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752930AbdC0MSL (ORCPT ); Mon, 27 Mar 2017 08:18:11 -0400 Authentication-Results: linuxfoundation.org; dkim=none (message not signed) header.d=none;linuxfoundation.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" Subject: [PATCH v11 10/12] mux: adg792a: add mux controller driver for ADG792A/G Date: Mon, 27 Mar 2017 14:17:47 +0200 Message-ID: <1490617069-13119-11-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490617069-13119-1-git-send-email-peda@axentia.se> References: <1490617069-13119-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: HE1PR0402CA0008.eurprd04.prod.outlook.com (10.175.27.18) To DB6PR0202MB2550.eurprd02.prod.outlook.com (10.169.211.8) X-MS-Office365-Filtering-Correlation-Id: 6286bf90-d648-40d7-ebbb-08d4750b2228 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0202MB2550; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0202MB2550;3:SzCFTNvP2kt5WnCkDAEALNE+HSm6SuxLXF46+Ukee67X2xkRnJbiQFQTV1Yi2lWHRK6oJ8GzGWSAi573hl1lEsfGFErkRXgDW6c2vkyrJ3ffToi/K4njfR9UeSaQIw6Fg6g8C7v0/YqLTyx1HhDeJI2/oc/l2SD6vWeRjFsuYO8KA2CejVAtoeJZlhYRDP5YyyJvdWX2bTjVWmn6b3BNRkYXsVcVNaYQVKugSiWPrr1kTHc8n0eny8keZ8B5OWP38F8voEHO/z7WAObLW8A8hQ==;25:2kgCG3TPhtRfO2F+Yu17MrN5KARM5vnOna567J4RxDIuCL2bU5TDaGGVBhAAwsfBF9ep3gNuj49nqsMgX85KNxiLcWiTrK1VkUmWL9L8YeSdIth8ZLE8cs7bMvqIa95u4bFPB3ifMs9KKIYtbdzCR/56f7yQ4fSU2jFVC4RuLZ7/t0NIeVwt3o3g6Wjj1MejkTmTmCL/XkH3QrE5iUA5hq07evnSqGcIQHwvcn3Aw5dBNIIWojCnHSsh2ZGg0HFsimkSs+TltyozklVFPOI0sLKKm2VGzwAEWAzkRK6gdrhvXlRICOSr77KRlR9j10lxUk0PRXSbzpiJ4LJF7F3TNEX+K2UeIpljqTIG5vUEVDO5BUvc0tlcJX3fLUDAkQoD7MSCDLyc5m8Eshve4/BARMZK7IqNKgtFmozQHaMtY2ylemjcuDWv4mkmvOhS7ozjcS7wMIXPHrnSvBDgB+u6jg== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0202MB2550;31:O1VXNme9BfH3/GYfjDa356cSQfhnHcGFjChMFCGpKhGaCNV2Z9P281cizrn6EXiaGHb8JzJQcKE7m0Gr2bs2D/z8XjpsxnkBFpiHe3HLMs+0d49SWU58V+ZOs3ji72VuFwmo0Y6ojp0Wea0nGNKPQd0y/Dx2U0erqjkJfc+U/xcdaqIY/3xlhsUNFQLmWF91dK1Hzz9a0MRw03aSu470P19vP/HplhyOiC2AqYu8hC6oPQUWT7n8gToLtih+UIVo;4:3HohbiObA1EO45rnaCmtyVkPxTcrySXvLhwR0t/YDF+hr2fCkJVgSVy6byhy42Ia+03SAP0Yo5psQraD2rVwHqOls+jqkOwTGQUUcIGDfWon9RDPL3QL8sqC9Ew64SzPHa57gkrem7xd8sAHkTyniYGLbX+C5Xpu2R3jY76lAg1N4ZSD81OXK0C8azir4HR0nf7X+UhJfcMyc2C6aa9I/9YXV995NeG+RJ8CbpjSSpozAEIH0Eg4Q3pUoontEn8pzA9d6i7A9nikwVPKuf93HHWuV/Orw2/BUh5ghs8wl9nW4N/jH+dyvlC8No/ZK0zNYt2+hN7ugh1mR8W2JUryq8oxzaD2hr2Xb8iAyoe+YDwOuAtIifA2qLpFi2a0NIkEySMYKHENbWw7QViSX3uDnOXvnVjz6vAm/7JltQRBvp6TJPXPjOypFZRe3HH8wjBVHZRI+/Hg5InhJZ25X+lom2rmw7z4D/pQ+ZVN3kkriMq5WbEJelIaUxSq8nefEx6dNn2f2f4ThQ64G9vwX8H8cqwMnjdgHcBDWZ7CGJPXrdlWVMlafPzL2oNHdC5m0U+hLbxYZhB7oFhkKZTDms2zK90AgPg4PzjIoTtWn17xEgkEILCxxnBfWWRumVjrEZl7tdz18OAF1wcp89+1APxvHdbBZmvuQCkKO8v35+mhKiE= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(20161123555025)(20161123558025)(20161123564025)(2016111802025)(20161123562025)(20161123560025)(6072148)(6043046);SRVR:DB6PR0202MB2550;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0202MB2550; X-Forefront-PRVS: 02596AB7DA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(39840400002)(39410400002)(39450400003)(36756003)(4326008)(50466002)(5003940100001)(33646002)(76176999)(53936002)(66066001)(6506006)(47776003)(6486002)(7736002)(8666007)(50986999)(54906002)(38730400002)(50226002)(86362001)(48376002)(6512007)(3846002)(6116002)(110136004)(8676002)(2906002)(189998001)(81166006)(42186005)(7416002)(6916009)(305945005)(74482002)(2950100002)(25786009)(5660300001)(2004002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0202MB2550;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0202MB2550;23:8Asu8zjB6xW0+FCI/Svs047Z/lLDbXToBt1Mhgw?= =?us-ascii?Q?Bykapls4bt+eB/QDbw59h0tONv9KkZ55T0PXT2XZmdcTGsrLtWQppNIp6gQq?= =?us-ascii?Q?d38QUkoh/g1L2VOsQzQf1T7A4yidmB3N6BqEGKUpgk5CVX9Kp8NgEpSYpx5V?= =?us-ascii?Q?Srjbm/ir7JITTSr6T8C22EsgBTak/bWrZa/xPE5t23xGs75MnLOwIsY6KFil?= =?us-ascii?Q?faw/A5Ha8+xCfRg7/KOy+QkcFcK1RfHfeRhe9Pght09dTvcLu5vHU+vAbL9R?= =?us-ascii?Q?DQZ6pV/UsxSMxz+My8G+98i/85pvWEBUhwHRXmWKcumBenyj++o4GqyetfAm?= =?us-ascii?Q?0nAJw7+vmiJxQ1TKcxdAASy1vs0r9+Envi2Zy2Z/FJxOerC2b6GmBu1zdWBm?= =?us-ascii?Q?ltHy1Xysgn4voC2Dze3HGtWjb8hgnwmzKFEzgjgAoa8gQ5uicA3e8q1gNpCk?= =?us-ascii?Q?PGmAzsDUxyQwtyuWeALRk2U9xOET4NqsYB49I1C+WmjTMd4XAM3+VKFW3YiW?= =?us-ascii?Q?qltkGUytbVpirUj/n4v1U55ciyJwMfNilSmVVT3BDj/BsVFtPlBMTKlJxHF+?= =?us-ascii?Q?PyNtcx+48uUqi5M6zyqN74sqg5IfCQbVWH84X6z2Oo3wSXKMGMfTb6g4qEDd?= =?us-ascii?Q?kvsxdBixHQHz6lJMP/NAp3MKQ0SprT4zGaTqUf4SxPog935TsKeMB8sDtA5f?= =?us-ascii?Q?t7DGNxtqfisedQVqxfHzBdylcIZRJdRC+9WvCV5vgGPASHdfMDO1tDJLast6?= =?us-ascii?Q?03NbIOJ6kqHjONwhw6KsD+QYJLVF6wfQWNT/HBOVno4J9FOtPqaQb2Y91Mge?= =?us-ascii?Q?Bqfdx4YCvIXsnFN4234EWW+Gkt6beXBkxOmyzQZbgjJj73mpjQm5KnlHZhFj?= =?us-ascii?Q?K40uRaQeYmEKvr0IXshfAtz0y5lwCUMB9Qfs73h/mnIVr7PJDLkAGQaK5s9T?= =?us-ascii?Q?1MaynzB4TWR4m+ud0bZWtTG7y1WJh+hCp7PA6fgDVeWDsxme6jK3tG5//8LL?= =?us-ascii?Q?O1bwnm6b/3lSQmfSSlFlZC/q7XpdQn+mFxKqQcFbi8OeP5JlhhZNA9irq1k+?= =?us-ascii?Q?FVZjC0hiivIsLbVx6ITakdR2jeg77?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0202MB2550;6:MuH/TnqV4yVtTWtPASrj0zt4yQIuvviJC81/hNitUCSIGXzk5RzXlmy8aIfpJGFJdmKHP0mucZaflR9AvC+xEhg17GNLnsyneqzxt46XOGNeXHr1aMfe4h97fFONCPpGolIiibN7t0FTJbtfQwW/heDm/PrHq5SCZn01R799UfuexQxqGI0ODS0JsShIM9e51NBn9fIsUylS1/ZgXyt3ukaN2VWo0sDC6fGcjfQ0NDreoQOLXxJ8q8UprA4LPSBuoXv+Ye7VfM8zlfGqDzjwBD6TPwnSpdipyXzHnG/2QV0Noqfn3JMN/q079VqVl6B1bljhoKvubSAxE15yTw+ybUEvtnTFVCY1KwmKpHOGmgRqc4asJRuel39NpLkKoWfa+2c5WInEInk3nfa6gISBmA==;5:GXbzNKrbbeTglxSctEagiElWvz2MGC/BJIVNhUsXu+hgMovgCn5UwJJg9QXEYslj51AJfHAMyyvAQF49V4dir2z/+rSqfvGkDIdy5iE1z5NJGqjlHf7T6E5HsVOJI5FyT6npX9RGxgMahyRznfxqqw==;24:n66f043fjjL+tGjmP5ia1UqFceMInNPNmj5aiaKn7/vjnt10ad83IsG7wVbZtkS2t+oB0R1Av2TBP/aIkQgZ39NUoilUON4AaUIcXwNE52s= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0202MB2550;7:m0IAWmJovfHliWymR+LZZ55dvYYMZo+HQoxdQlpL+kvV8hYLbrG6pvTpDyw5qzekK8fmdQx9mmyIt2/qR/TpkG6kgav+/FDlihRqk9AXtl7OQgmCgI7FHT9HtdNE09shcntdmxZbbM7Hc2M2laQqkwxSRh8M910a0AtBkpvMzxdX3d+hzlKTH601h6n7bEfOXIITlhrSz+kp5ftTNxPc15To6s0CGPpkqOREbZyNkGnGd4MmbxfZTeRO6jU/ozFvt+HLC3j5sYv0GmLSOAEM7rAZKnPnmDCrHLRHaFi/G/Pt/5uuMDa0bAPvlUFqmDsRKnM6ALQicjxzKM58Zy/3YA== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Mar 2017 12:16:42.2381 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0202MB2550 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Analog Devices ADG792A/G is a triple 4:1 mux. Reviewed-by: Jonathan Cameron Signed-off-by: Peter Rosin --- drivers/mux/Kconfig | 12 ++++ drivers/mux/Makefile | 1 + drivers/mux/mux-adg792a.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 drivers/mux/mux-adg792a.c diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig index 41dfe08ead84..86668b4d2fc5 100644 --- a/drivers/mux/Kconfig +++ b/drivers/mux/Kconfig @@ -17,6 +17,18 @@ menuconfig MULTIPLEXER if MULTIPLEXER +config MUX_ADG792A + tristate "Analog Devices ADG792A/ADG792G Multiplexers" + depends on I2C + help + ADG792A and ADG792G Wide Bandwidth Triple 4:1 Multiplexers + + The driver supports both operating the three multiplexers in + parallel and operating them independently. + + To compile the driver as a module, choose M here: the module will + be called mux-adg792a. + config MUX_GPIO tristate "GPIO-controlled Multiplexer" depends on OF && GPIOLIB diff --git a/drivers/mux/Makefile b/drivers/mux/Makefile index bb16953f6290..b00a7d37d2fb 100644 --- a/drivers/mux/Makefile +++ b/drivers/mux/Makefile @@ -3,4 +3,5 @@ # obj-$(CONFIG_MULTIPLEXER) += mux-core.o +obj-$(CONFIG_MUX_ADG792A) += mux-adg792a.o obj-$(CONFIG_MUX_GPIO) += mux-gpio.o diff --git a/drivers/mux/mux-adg792a.c b/drivers/mux/mux-adg792a.c new file mode 100644 index 000000000000..4820f82e849c --- /dev/null +++ b/drivers/mux/mux-adg792a.c @@ -0,0 +1,140 @@ +/* + * Multiplexer driver for Analog Devices ADG792A/G Triple 4:1 mux + * + * Copyright (C) 2017 Axentia Technologies AB + * + * Author: Peter Rosin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include + +#define ADG792A_LDSW BIT(0) +#define ADG792A_RESET BIT(1) +#define ADG792A_DISABLE(mux) (0x50 | (mux)) +#define ADG792A_DISABLE_ALL (0x5f) +#define ADG792A_MUX(mux, state) (0xc0 | (((mux) + 1) << 2) | (state)) +#define ADG792A_MUX_ALL(state) (0xc0 | (state)) + +static int adg792a_set(struct mux_control *mux, int state) +{ + struct i2c_client *i2c = to_i2c_client(mux->chip->dev.parent); + u8 cmd; + + if (mux->chip->controllers == 1) { + /* parallel mux controller operation */ + if (state == MUX_IDLE_DISCONNECT) + cmd = ADG792A_DISABLE_ALL; + else + cmd = ADG792A_MUX_ALL(state); + } else { + unsigned int controller = mux_control_get_index(mux); + + if (state == MUX_IDLE_DISCONNECT) + cmd = ADG792A_DISABLE(controller); + else + cmd = ADG792A_MUX(controller, state); + } + + return i2c_smbus_write_byte_data(i2c, cmd, ADG792A_LDSW); +} + +static const struct mux_control_ops adg792a_ops = { + .set = adg792a_set, +}; + +static int adg792a_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct device *dev = &i2c->dev; + struct mux_chip *mux_chip; + u32 cells; + int ret; + int i; + + ret = of_property_read_u32(dev->of_node, "#mux-control-cells", &cells); + if (ret < 0) + return ret; + if (cells >= 2) + return -EINVAL; + + mux_chip = devm_mux_chip_alloc(dev, cells ? 3 : 1, 0); + if (!mux_chip) + return -ENOMEM; + + mux_chip->ops = &adg792a_ops; + + ret = i2c_smbus_write_byte_data(i2c, ADG792A_DISABLE_ALL, + ADG792A_RESET | ADG792A_LDSW); + if (ret < 0) + return ret; + + for (i = 0; i < mux_chip->controllers; ++i) { + struct mux_control *mux = &mux_chip->mux[i]; + s32 idle_state; + + mux->states = 4; + + ret = of_property_read_u32_index(dev->of_node, "idle-state", i, + (s32 *)&idle_state); + if (ret < 0) + continue; + + switch (idle_state) { + case 0 ... 4: + case MUX_IDLE_DISCONNECT: + mux_chip->mux[i].idle_state = idle_state; + break; + case MUX_IDLE_AS_IS: + break; + default: + dev_err(dev, "invalid idle-state %d\n", idle_state); + return -EINVAL; + } + } + + ret = devm_mux_chip_register(dev, mux_chip); + if (ret < 0) + return ret; + + if (cells) + dev_info(dev, "3x single pole quadruple throw muxes registered\n"); + else + dev_info(dev, "triple pole quadruple throw mux registered\n"); + + return 0; +} + +static const struct i2c_device_id adg792a_id[] = { + { .name = "adg792a", }, + { .name = "adg792g", }, + { } +}; +MODULE_DEVICE_TABLE(i2c, adg792a_id); + +static const struct of_device_id adg792a_of_match[] = { + { .compatible = "adi,adg792a", }, + { .compatible = "adi,adg792g", }, + { } +}; +MODULE_DEVICE_TABLE(of, adg792a_of_match); + +static struct i2c_driver adg792a_driver = { + .driver = { + .name = "adg792a", + .of_match_table = of_match_ptr(adg792a_of_match), + }, + .probe = adg792a_probe, + .id_table = adg792a_id, +}; +module_i2c_driver(adg792a_driver); + +MODULE_DESCRIPTION("Analog Devices ADG792A/G Triple 4:1 mux driver"); +MODULE_AUTHOR("Peter Rosin "); +MODULE_LICENSE("GPL v2"); -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Rosin Subject: [PATCH v11 10/12] mux: adg792a: add mux controller driver for ADG792A/G Date: Mon, 27 Mar 2017 14:17:47 +0200 Message-ID: <1490617069-13119-11-git-send-email-peda@axentia.se> References: <1490617069-13119-1-git-send-email-peda@axentia.se> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1490617069-13119-1-git-send-email-peda-koto5C5qi+TLoDKTGw+V6w@public.gmane.org> Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org 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 , linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Andrew Morton , Colin Ian King , Paul Gortmaker List-Id: devicetree@vger.kernel.org Analog Devices ADG792A/G is a triple 4:1 mux. Reviewed-by: Jonathan Cameron Signed-off-by: Peter Rosin --- drivers/mux/Kconfig | 12 ++++ drivers/mux/Makefile | 1 + drivers/mux/mux-adg792a.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 drivers/mux/mux-adg792a.c diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig index 41dfe08ead84..86668b4d2fc5 100644 --- a/drivers/mux/Kconfig +++ b/drivers/mux/Kconfig @@ -17,6 +17,18 @@ menuconfig MULTIPLEXER if MULTIPLEXER +config MUX_ADG792A + tristate "Analog Devices ADG792A/ADG792G Multiplexers" + depends on I2C + help + ADG792A and ADG792G Wide Bandwidth Triple 4:1 Multiplexers + + The driver supports both operating the three multiplexers in + parallel and operating them independently. + + To compile the driver as a module, choose M here: the module will + be called mux-adg792a. + config MUX_GPIO tristate "GPIO-controlled Multiplexer" depends on OF && GPIOLIB diff --git a/drivers/mux/Makefile b/drivers/mux/Makefile index bb16953f6290..b00a7d37d2fb 100644 --- a/drivers/mux/Makefile +++ b/drivers/mux/Makefile @@ -3,4 +3,5 @@ # obj-$(CONFIG_MULTIPLEXER) += mux-core.o +obj-$(CONFIG_MUX_ADG792A) += mux-adg792a.o obj-$(CONFIG_MUX_GPIO) += mux-gpio.o diff --git a/drivers/mux/mux-adg792a.c b/drivers/mux/mux-adg792a.c new file mode 100644 index 000000000000..4820f82e849c --- /dev/null +++ b/drivers/mux/mux-adg792a.c @@ -0,0 +1,140 @@ +/* + * Multiplexer driver for Analog Devices ADG792A/G Triple 4:1 mux + * + * Copyright (C) 2017 Axentia Technologies AB + * + * Author: Peter Rosin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include + +#define ADG792A_LDSW BIT(0) +#define ADG792A_RESET BIT(1) +#define ADG792A_DISABLE(mux) (0x50 | (mux)) +#define ADG792A_DISABLE_ALL (0x5f) +#define ADG792A_MUX(mux, state) (0xc0 | (((mux) + 1) << 2) | (state)) +#define ADG792A_MUX_ALL(state) (0xc0 | (state)) + +static int adg792a_set(struct mux_control *mux, int state) +{ + struct i2c_client *i2c = to_i2c_client(mux->chip->dev.parent); + u8 cmd; + + if (mux->chip->controllers == 1) { + /* parallel mux controller operation */ + if (state == MUX_IDLE_DISCONNECT) + cmd = ADG792A_DISABLE_ALL; + else + cmd = ADG792A_MUX_ALL(state); + } else { + unsigned int controller = mux_control_get_index(mux); + + if (state == MUX_IDLE_DISCONNECT) + cmd = ADG792A_DISABLE(controller); + else + cmd = ADG792A_MUX(controller, state); + } + + return i2c_smbus_write_byte_data(i2c, cmd, ADG792A_LDSW); +} + +static const struct mux_control_ops adg792a_ops = { + .set = adg792a_set, +}; + +static int adg792a_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct device *dev = &i2c->dev; + struct mux_chip *mux_chip; + u32 cells; + int ret; + int i; + + ret = of_property_read_u32(dev->of_node, "#mux-control-cells", &cells); + if (ret < 0) + return ret; + if (cells >= 2) + return -EINVAL; + + mux_chip = devm_mux_chip_alloc(dev, cells ? 3 : 1, 0); + if (!mux_chip) + return -ENOMEM; + + mux_chip->ops = &adg792a_ops; + + ret = i2c_smbus_write_byte_data(i2c, ADG792A_DISABLE_ALL, + ADG792A_RESET | ADG792A_LDSW); + if (ret < 0) + return ret; + + for (i = 0; i < mux_chip->controllers; ++i) { + struct mux_control *mux = &mux_chip->mux[i]; + s32 idle_state; + + mux->states = 4; + + ret = of_property_read_u32_index(dev->of_node, "idle-state", i, + (s32 *)&idle_state); + if (ret < 0) + continue; + + switch (idle_state) { + case 0 ... 4: + case MUX_IDLE_DISCONNECT: + mux_chip->mux[i].idle_state = idle_state; + break; + case MUX_IDLE_AS_IS: + break; + default: + dev_err(dev, "invalid idle-state %d\n", idle_state); + return -EINVAL; + } + } + + ret = devm_mux_chip_register(dev, mux_chip); + if (ret < 0) + return ret; + + if (cells) + dev_info(dev, "3x single pole quadruple throw muxes registered\n"); + else + dev_info(dev, "triple pole quadruple throw mux registered\n"); + + return 0; +} + +static const struct i2c_device_id adg792a_id[] = { + { .name = "adg792a", }, + { .name = "adg792g", }, + { } +}; +MODULE_DEVICE_TABLE(i2c, adg792a_id); + +static const struct of_device_id adg792a_of_match[] = { + { .compatible = "adi,adg792a", }, + { .compatible = "adi,adg792g", }, + { } +}; +MODULE_DEVICE_TABLE(of, adg792a_of_match); + +static struct i2c_driver adg792a_driver = { + .driver = { + .name = "adg792a", + .of_match_table = of_match_ptr(adg792a_of_match), + }, + .probe = adg792a_probe, + .id_table = adg792a_id, +}; +module_i2c_driver(adg792a_driver); + +MODULE_DESCRIPTION("Analog Devices ADG792A/G Triple 4:1 mux driver"); +MODULE_AUTHOR("Peter Rosin "); +MODULE_LICENSE("GPL v2"); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html