From patchwork Thu Apr 13 16:43:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Rosin X-Patchwork-Id: 750522 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3w3mnH1czWz9s8Q for ; Fri, 14 Apr 2017 02:43:15 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=axentiatech.onmicrosoft.com header.i=@axentiatech.onmicrosoft.com header.b="FswBRYC8"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753915AbdDMQnJ (ORCPT ); Thu, 13 Apr 2017 12:43:09 -0400 Received: from mail-eopbgr10123.outbound.protection.outlook.com ([40.107.1.123]:28087 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755010AbdDMQmh (ORCPT ); Thu, 13 Apr 2017 12:42:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axentiatech.onmicrosoft.com; s=selector1-axentia-se; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=gvBmy7WIzMaEdq2XY+eD9FlH5t/0ha65+m294KAmIBU=; b=FswBRYC8K4ssNVTBCYlfjCEDhK0FCKp5LBmZl8jRH9T0L3fOIXWgFnosq1UQXnXiRDFb6yhyqoIos1AVWuudT/VFKvYk4rBXROVZGDeB/xCnbINmruG+TGRZuiaKm4TY67v5moPf5kHbUvDPP/A4Pc0hyR3mWuBH2xDXanyvvxM= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=axentia.se; Received: from localhost.localdomain (81.224.171.159) by AM5PR0202MB2547.eurprd02.prod.outlook.com (10.173.89.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.17; Thu, 13 Apr 2017 16:42:16 +0000 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 , Philipp Zabel , Subject: [PATCH v13 10/10] mux: adg792a: add mux controller driver for ADG792A/G Date: Thu, 13 Apr 2017 18:43:14 +0200 Message-ID: <1492101794-13444-11-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1492101794-13444-1-git-send-email-peda@axentia.se> References: <1492101794-13444-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: AM4PR05CA0010.eurprd05.prod.outlook.com (10.171.184.151) To AM5PR0202MB2547.eurprd02.prod.outlook.com (10.173.89.8) X-MS-Office365-Filtering-Correlation-Id: 2a5b9b70-e2e3-480e-5e56-08d4828c0c48 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075); SRVR:AM5PR0202MB2547; X-Microsoft-Exchange-Diagnostics: 1; AM5PR0202MB2547; 3:XFzYlc633GG0aFksGeLebQKbJlAHwPOXCEN0V8Bh4f7Un2r2o2PkNPD7LO3uY/0WFa5/XlkFpxAlMZ8fFbSmkjv01tuKVTta0pQIvpBXz3S7IOOlTH6u7VfHKBUvT8sXCZg7EUnNfcNJ+WWd5pFtlSxv97VrzeYQUWAPK3EnV9hDUlEVZ98XVeD8RLlfOZnmmzJ1V80oOrVD0qKXaJ+L5kWovIxmrzevaytZNfKD2KIaKIQT2Du3NNBBMNE/bavieONuSj0TgIZ9GQ8fNLT6SaszfkftZ8wpyixhDnrp9y3pBcvaaHZVx2pE6+Sz+HPH; 25:I9CQ/A+o2In1aS9jyZt+AounTdzJaRnQPkioFcVD65DDQlpELl75PRCtWKgSmRg0+VFPmnr+uIozZCeIwLfdvIkfxdF+tuAEAU/MFjjKBFeJO5zYGal2bRv4meyyMEcRNWBxjYeynWbQn9Tz4Q05vzzyOgTi+gLhWaBdXLUptmFgmH7vSktEtW7b8dizxZDr98tAwSQx9nymQvyO4yonPiKkE9Ie/nREgk1Bd7gEX/SVIzFcKKD0a8F2UoE++gRwa1wkrtiMIcjfxf0OYdG/fFJ7r+iZ6AwZXn4XTSfEoA1a/m8su1W9UB6apAFYMuYnV7wd7oLgBBqnkSmSTQTMYkCCNq/WQGXVaD6C/1wnIGXRpI7VZ8K0Sm2I4yQZK/u384rvGUcIqVtFw4IVbBP+X9soHvwgjVEh03raXWDRNMpwsPOr2smWixK7zfHd+elstm0lMO6tssV3me70n1B/hA== X-Microsoft-Exchange-Diagnostics: 1; AM5PR0202MB2547; 31:rcWubUbYuzLrLLEVCz9ILCKE2CjEUpM5K0XcjKJFiai8ymkQ4dPhm+hdA2WIfJuJYp4KXDDMfw2G4t6NQwPWnSZdGngVm1yih1ORh+4VK52RrsURanExicYYvhbOc9xDkg59OkotcFbuzEjVyI3iWxRiuu4R+x7KjWWfI3y2sVLUpdUwd0VJXetNf0SGoCsJBNS6AOKFnpiuHTs0rwp0Ij8wQGRIaOlov2M7DoYFcjkGclZ18kAytoQFqVKRLXOi X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(10201501046)(6041248)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(20161123562025)(2016111802025)(20161123555025)(20161123560025)(6043046)(6072148); SRVR:AM5PR0202MB2547; BCL:0; PCL:0; RULEID:; SRVR:AM5PR0202MB2547; X-Microsoft-Exchange-Diagnostics: 1; AM5PR0202MB2547; 4:x0mdUVw9AS2zNYgv5DRC0ITpJAp+To6JMoa5a1DvgwsCnlv32hAT2RmXId2zP7T6T+1e7AGAE4ArNXSz+znpIMOsC7vZg/cvvdQ7rG0pyoXqrsxSpq8dYxh4lI2ZEtNw1sxIDK8AX5Xw+86BmCjkZ2oV55/q3kJJzzTeVTaSp/vFkMQmBvVeM2nG8mv4r5dcJPr0Mka17NIspRoEueXYa5vf5p7/Pz4hLvH7CPSH+fLiOeIeE9oDxIwuH61lGPmX0SIYSDLgJW7Z75uG+678tx9vPej3QSadJmAazNTPR0WrJBwKLph5lemUrFqgeEdnQ+tTyjrniVsB8u4ZtG/Q4YeVapYwBOILh6EqQOtLPF6C72cmVlvpErd7KLtIjFv6FF8D+gaupwyR227Eaym0AF0WfB9aU014CrXGZbzL1eh3RleMuqjdk8MlWek+j7qzLs0ybTJjHv504wB6QKwgy1UF6OqCRiB5zzPzEK8iU+KLE/no591xo7FTodcWrxNgiap3dXarJiPrEaPSpj/9oe5QuRX5II0gqqWlabG+KWc2ycJ+1D9ME657mBKmT+yyNOoV6g9I1n1uJrACR6C7xDVd5mCJn1XOOKHjf/OeNI/isC0sa6WrMBPYUj592gn0T+pS8XbY3LnyyvbI4KzNAPUonW7eC2Lqd+K9xO5G6xJ01QBeXzBQazSXjVx2zwP+9nfR5vC2kVaqx5DZHjDDVFYgd0OE3Ve1yk+XRwmweGjTIVIjkfwkvvBpJI9q0AETmn2JFz0O85H6mYnKten6jg== X-Forefront-PRVS: 02760F0D1C X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(6069001)(39450400003)(39410400002)(39840400002)(4326008)(25786009)(48376002)(47776003)(50466002)(6116002)(8666007)(50986999)(81166006)(33646002)(74482002)(86362001)(189998001)(66066001)(575784001)(3846002)(6486002)(6512007)(305945005)(2950100002)(53936002)(54906002)(76176999)(7736002)(5660300001)(7416002)(42186005)(38730400002)(8676002)(36756003)(6506006)(50226002)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:AM5PR0202MB2547; H:localhost.localdomain; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM5PR0202MB2547; 23:3Q30bQEiyuncPNBmUnKkJII4dKoC2hEL9uMN9Fj?= =?us-ascii?Q?hXbgED6IztScHQqiUAJBrVFTYfwJYtfN4yFffyLvedtNCvtD19YrD9mKBmEg?= =?us-ascii?Q?mTDMbO2x4kPH0/toblWm8gZkPXBFIcvYKurrvN8c6epYrkWjGbRQg0AI5uPH?= =?us-ascii?Q?DpDlbfmh22YOnPqjBsyrN4ZKzo0oN7GRzLMVVxqiRIVrFkyzqvhTAYjWqajA?= =?us-ascii?Q?Bd6QuwGzVSHCWuI8shm05rhKUoI4lMvtT0AjCMtOeaP0nPQKnijPcLHB56xT?= =?us-ascii?Q?3NgfkAPpd2jXQbvmNJjJBBc25mQ6kOcZMwqKwKVknPr5nrKiLQpSgCw/seSG?= =?us-ascii?Q?zjeWmUerWKZ+7uO8oBSZQDrlchewhPY5QpiK40FmHQAEmU47eA8fkgrAYTvP?= =?us-ascii?Q?9mpA2ITuSD+bvRgwLVoRTEvY5iwsBymT1hbJ3B12Ts9AaGruG1ZH+jjIBuPx?= =?us-ascii?Q?cOnXX7gBEaqG0M6aYiOUdwdvNiRWI5jIF+lLTvzN5wlkjM1ZQWRdKOZ+NOxn?= =?us-ascii?Q?YW9oY3IXZdmLTjxOEAtV27NzLg/76zMuPz31QCO7PyiicADmqY7xGBVNxAPl?= =?us-ascii?Q?APa4/XxSUNO4mkjGsfOBMgha8Smz1owTFpEGyN7ymf1a6+Bvdj0Fd9XjBQpL?= =?us-ascii?Q?rKknrsNLI8KIhuXMV6dJa3bBcT6hctmR0QI03kYpDYZgDjZmZ8aFl4PJKho9?= =?us-ascii?Q?w+bP5EgR5ws+IFYdAabbohZku9fst4f5eJiJ+Ipdvksalf8ZFzAUxhXcvteC?= =?us-ascii?Q?TpfN2wRJs1ARLwxKOwYSSXgNbKy3MIV1z5Fc0T1vyTEqTBXjpzhqHtikI49q?= =?us-ascii?Q?XjuWZDhJV+hR70budWD68f1jqdKwV37/DJd76oonlBMO9psG8ql47h131OXS?= =?us-ascii?Q?nFUoQrEEP6Ik8Ni2FAa70rzuJsvB7g2YgBgDhNszUz/4aRMb9mbwcNXuAyTO?= =?us-ascii?Q?CYCWiqR2j87fv/0mlktIO0M1qkUppRPYmkttBfBk06rWS+eeuWFXfS+oSsk7?= =?us-ascii?Q?AwTg=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM5PR0202MB2547; 6:Kjg7x6QKchqy/FwqMvej1sOBTCzuKKNW3hWy944j5G3E7FOl/CTTwbgcBTy0Nso9/yIdH9atZ4KPUU1ikzkqKc1fdElsB16X02sNxujSVuvC/kfqDgCcD7JU8csvJ/ONqLVVmY9xBI302GqzQ1wJnNvorTXaBDQF6KXVm00nvqyk3JjWpePgSwvr0c8UQdcACLd531UZmkmfwkogQ5ZfFmbg0NYavnXWcc6u8LRZwUgmLyc2jx5IkgyL2fSQ15iNXSK8YAXEc3P9A+F5mkW6NdDDIr/qPVOZUxIZJVW9L1RUlBYnkeBZ9Ns9ZewOalpKBVMssHb+l9RcFkdmMdF1tmMajFotcwd3e4595yyKhcFZhIdFEQQSR6NeTxfnZzU+pYpJ9dDvjw3191PZuDv4hm8za9YHeCoKt41NyDPyrJduu+Gl4+rPTGqmB3nmX2FYJYJ0YmuTsd5J8qpeKcm7Gg==; 5:nN+1Ni3Tcg1fXb2LsFxBkCjp6TxmkicgGv/MTT/6N83ituTFcnGP0rhZBq9WmCY2Mt+Avjv482VYyxMTaXM3nLzE9GfxEvesPAkPmYWIF7ZXxdNH3NsNo9MYYr+ukPTP914Rr81YcI0vwrWOFusQfKIFXajLdPVAOlYvaNi/shY=; 24:i1W699SDlmf3Pht+UUxPi+9vjrsM4ckF9Uno3WtVvwGvyTVvkTbS8GkBekuBMS/Y59Ifl9olDKH5jqC3dWrplith9T2tj+M3OUpJ8L5zx+4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM5PR0202MB2547; 7:FKhPeOcjqlV/ObsZRbIVFs2LX0/a3nsAAekx6slEJDm7UtoOb7hASjeU2v1aUPhQg0/s5kQ+uTlEWPFfcpAjPEDTELfyZS4PM4fpyIdw8iZBiB0f59Aw9tJG/ivRbmP28oTEY+pfoDJ0HgHXqQLkptT0BrkJkI2kkXKLXjpx/U8B1tDRtoLGgFPBBCw77MOCudMKp9y33afNzqdyMXDNEn/6FjWAwvGO39nzR/KfCPIJREagsoc727hKaOWQVUu2W06wPVZ/CHWjjt7ZJjWgGmlPxazwQtYAz8PCUPnE9NSD2BP5eLy+8zq5O6Y16Mus6yj5ezRGoZROkuMESFMJgw== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2017 16:42:16.3110 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0202MB2547 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@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 | 141 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 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..58c0ecf49a4a --- /dev/null +++ b/drivers/mux/mux-adg792a.c @@ -0,0 +1,141 @@ +/* + * 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_RESETB BIT(1) /* active low, reset when zero */ +#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_RESETB | 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_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");