From patchwork Fri Mar 10 11:10:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Rosin X-Patchwork-Id: 737360 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 3vfl4B0hH6z9s76 for ; Fri, 10 Mar 2017 22:13:14 +1100 (AEDT) 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="HB+QNyX/"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934251AbdCJLNK (ORCPT ); Fri, 10 Mar 2017 06:13:10 -0500 Received: from mail-ve1eur01on0118.outbound.protection.outlook.com ([104.47.1.118]:3671 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934409AbdCJLLk (ORCPT ); Fri, 10 Mar 2017 06:11:40 -0500 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=VzzOw1jk4YPgVnewoRI7uNpIRmWhs+uUd8Vz6AFJ8ks=; b=HB+QNyX/QZy8kmRBw2og0NwL5xV9dTIQGlUFXebmOhhyZIbS1rSvHJi0500/KhMa9U/I+LlWfKTUGXQNzZM2w5HPsdhHuu67Feqqgm8y/yX708eG5a1/0qdbhAPljCJYLc4J1EnWT6Ish5goz+jBjthc7u00XfgwNMEWaS1qhO8= 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 VI1PR0202MB2560.eurprd02.prod.outlook.com (10.173.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.947.12; Fri, 10 Mar 2017 11:11:22 +0000 From: Peter Rosin To: 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 v10 10/11] mux: adg792a: add mux controller driver for ADG792A/G Date: Fri, 10 Mar 2017 12:10:04 +0100 Message-ID: <1489144205-17427-11-git-send-email-peda@axentia.se> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1489144205-17427-1-git-send-email-peda@axentia.se> References: <1489144205-17427-1-git-send-email-peda@axentia.se> MIME-Version: 1.0 X-Originating-IP: [81.224.171.159] X-ClientProxiedBy: HE1PR02CA0050.eurprd02.prod.outlook.com (10.163.170.18) To VI1PR0202MB2560.eurprd02.prod.outlook.com (10.173.79.139) X-MS-Office365-Filtering-Correlation-Id: 43b943ee-5608-475a-fa73-08d467a630ea X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:VI1PR0202MB2560; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 3:BmCEB0QdmrqNG2wqXaCO+ruPDHYOKDchOxCw/dUFQWM5lg/RAW+NfKaXx56SVd4yBhqKW0TJUisdKzB6bhGsISLLCuP7yEfb82ro1gG85E3wNvgTQcdcsvL4c4aaWgkcvct9nZBTId2amHvQS8s9pUSrFbm8T90fkc1zTeivE5om2kPog9h7Cyp23XkBeXrOVM3+z72/vLKzHO66kioqsvFw0SfXUhSuOUVzMKA6lsMHbUxvNPBLln4i5a5e7crh8/X6X71din6e4gsVszuwdQ==; 25:xgo3tDvQBsFMLRQUQQu+JgdBz8gWaqYM2j6x+2zGOhVZjbV7LXnmSD8OMDfK0v/NrmeMUbXVlPxEfgIbKy3CPBY7fTyyCCW/Bv4377lDQys3nGg9laYGcyqHx907R+7OKGy9lcsSCBIXzeH75tvTgJZJMG6vDy40jyirDOBV4rrd75C2Q1G78CDnM7OZ3Uqbot0v667B2rXxkEnMmgO8WifrALBGcxVv3VNYpToyahBbN9sKQq4PiJN+c4PhvvVwAkKLLZ64EFOgT8zTEY+KqD6VSF+XTQWTE9dmc/ybJyNNCYn6grmQ9zSzHAdGGCf6T1rWVBEgBLLSDXOBqEBNrZDPeYB44CuqX452VwDsnIn2MmQ2Wws2eGNsGCeda6nW8ARVHb+QzdcXq8e2ckyBrPElfUeAE2NkP1iXtr3/68ct2Ryg2fAuVLf3UWMdQetNozRnlD7eoPTk8GiADiTr5Q== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 31:b3Aug0XkMAeqh/Mp6DvjfPYmlD7Ik5HXkMWOV0pi6onc0ng855H2/wWSOZXAFcsPJ7dKLTG+uBs0iDprH8tMNFjTS5e1juc5QrfghtKNxOTxn7bxjfKDWpC4Nn5Pz6/TH86Ys5p6dqmQOM/HFyT04jK5/GMPr5ooVD1e8nMOfXSvsO8Dyoe37abfJ3rYyVwY1gP8kWo4xvhzul2vz3bytHgMO27SBFy9waBalL3grTsa5q7Suvzx1t2UkVuhuOQG; 4:9F/dFcRQz/0r/tcCu5F+TX8pHJ0B9kc7YqdkcWnbnDTtfYGuPPktGvHukmlBUK3Ls7eA53aYSgKGASULPq5umJL+vIwcVkRsnfvA3swjXuKh5gEwHV5UGV3xCY2j7mvnHWdhmrLYfSqIZlCkeBU+Aif4n7PQuNXlHA2ScIKiJJibJsZXc9nzLVkVOHvleNDD2wtEUwg/dpylLk9LtFNJ5iKeg1E5+4uLNVpJfxNpjrE091PI/rUSHN1r5gUeOVLHSedt6tPko8Px6bpqX95AZ922kHewa/R0tVJvAllpYwORKH27ohBTgd/M/JcFvnLB78mvTGWF19Iv//mbQhUgq5VRhWDeafl8wMiNVVDOE92MnFBZMrs8rUTwAGclmdEFA1wQ/+BYUoyA04JfIvyy05yykWaMxPPHK5zRNaxlRpUkdUhCMsqT0db5hyss2C8onHDHmRxQm1SJ3FPzjVH9jLBhIUIpmNhLm1qzvXjYQDjT3Qd2Za3CEU3z1VRn82NDQAcnw41SoVq1Uprt8Zg4NtRHXc9t/soGPSie5i3u9RsqTfYTwlRY+3aiYSec52k0ZeFBRI0hRSr2pI+mOEHP7yxbOgiJn2Sg0Kc64j5MmxYKV4yqfmeMfx+2+J6OZVLJB6psyYQxShYaPP9aL/y3psSAFq/fe0rKbNdjvxey02Y= 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)(3002001)(10201501046)(6041248)(2016111802025)(20161123560025)(20161123558025)(20161123555025)(20161123564025)(20161123562025)(6043046)(6072148); SRVR:VI1PR0202MB2560; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0202MB2560; X-Forefront-PRVS: 02426D11FE X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39410400002)(39840400002)(39450400003)(5003940100001)(76176999)(50986999)(305945005)(8676002)(189998001)(47776003)(74482002)(66066001)(81166006)(3846002)(36756003)(6116002)(33646002)(2906002)(6512007)(6666003)(6916009)(38730400002)(6506006)(5660300001)(8666007)(6486002)(2950100002)(2351001)(7736002)(25786008)(42186005)(86362001)(53936002)(48376002)(110136004)(50466002)(50226002)(54906002)(4326008)(42262002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0202MB2560; H:localhost.localdomain; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0202MB2560; 23:6mdqZmwUEPYYOErnzbQkSTC0jkTohmGlmdhwc8Z?= =?us-ascii?Q?CabqPJNKER/XA4Oz0hi2cdrxNZbSctarnnml9JQqdQwH7PQKPkFDBsRBKi4R?= =?us-ascii?Q?FhdNyeiBJ0Ky8EZ6YRv/YdduQdQBw1ad71d6adlyrZla3C07RPJZMKWYtrtU?= =?us-ascii?Q?2QVEsHU4Lyi5Qhtbb6qX+bRaXHqR90iJGueaKr/Pu8RneMbDUHreEdPlaNlH?= =?us-ascii?Q?CqE4748HrIHNydEFihKP226yEJ+QsWqhN6Hi1w+54yW96rLoD+XVsgC/kUxA?= =?us-ascii?Q?t9dHP9rvUJRkXSmxhzMUXknDeU+6cBP7cHtmhA4BRxQ0GA8nbphtL8HC+ygL?= =?us-ascii?Q?zi086aauqWymcUz1iyYC+h0pSrnbboV1t9TJKVRPY4J993BoUmErgp9Cs6YJ?= =?us-ascii?Q?V7Gpmy/o7koQ/JwHHp3RImm6ceSAekZSzY40K31YgEUMyyIdzAnbr+OR9Z0x?= =?us-ascii?Q?Wpu6kCbR0pImu8BZz3zzYCSTpMgjYgcQ/Nk1Me5jLoqCS0DOPg4yULQa7STg?= =?us-ascii?Q?cV0UcWJQQYG9xaWC+Ksgxw5ePG/OyFPuxSzLZAGLXWESTVLYYpDgP8lwy71B?= =?us-ascii?Q?hl3hoPPDGGSdtqiTEew8jGwhL/MelmJ0nhpo6V2BI2ifyzIi103ipk9VqU9f?= =?us-ascii?Q?TC+Ta7srCbpTSMaAfqPVRO5GJ5yA8vI07zqUzJXsKGp0Qtldczb4mITuIlSq?= =?us-ascii?Q?SWl2mkvgZjkzJBM2nTRge3G+Sq8YeIcAO5yXE1jQYYDH2qi9lGuUfdN4jt+V?= =?us-ascii?Q?uVLdJLz+d/7w1lDv/pPr/bKLebYdxJqy2o6N9MjbrDV49b84dM8kzcNIIl00?= =?us-ascii?Q?/en5zzo5u/vVVN+YktiHtvhZnNSZyTDdpkROguClUd+SXIiBKZZqLT8cdR94?= =?us-ascii?Q?bnAtaJUfONa5KYb9mcamYcxhvxnxIUD2KCJLMN9HwzvG7/oYy4L3X0dILpi3?= =?us-ascii?Q?+AnAN1dtv3gCmerJ6KOI5CNz0WkXrzQjIsTURw3whfcFrdnXCUatuZHQpYtQ?= =?us-ascii?Q?mNPncIT4sNR+XNtFG+y5yfpk4hT7L8lr3ushBzDmzyqxRUMNusZ8DUkmYoIe?= =?us-ascii?Q?1A670+JM=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 6:24q6oYF1ZMINsmoB54XXqYamiA9dkOjGCpawq1Dbox3W2Hb3X05fRasMlmRMP/8HXq6cOpxluRcnixmlVYTh8ErSl3lCkPhmA6MsyHUJ2h6ayS4cXyLXpIpG7tf2H9G/mMlhQAsCX6vHI3J6NuKWukI77fPAArOXGNB42TU3n03hZWxIkJnsXT4VU1xoF6q6uaJFAe3A6kHPNYi9upyK/3P5HDlbq+Y8g2yfz8+Xkfy/ups6oljJkmDX/PIAikFFWfx6W9pKIbMf2yql7aB6SWa+lgAgz8Lr4l6evtGKtiiDSsikBEWG0MSqGxgnC1G3chM9R3YVMD3UwDNoJwCxElNsLmTxth0JCQC5RGGDuIohaTYB1NDzh4YUVZF+x0snBaOdJxPrVDjmZxj87OBcNA==; 5:zaCzpzj62KXvImcL71MHVCS/iLAQYeHe+1NfDSShsYoA4YyP/7zd7RZjErlH2XO8fhR8dyfzm8wil4UFuH6PRmxQlHVorYZbRsqNgNxPnMY32jFOsoa8WLO8FhFAJaQDshAv3uyp/d9vPN07/41rW0wDZ1ZKrbw4AV3mTga6LJo=; 24:IwjuwDGN1Ms1tTr+I4CtFVr5EDUGNcDshjzzMYgQfwcztA0rFXikMx/ns4SzhGMrS2opwphgdFlZqBdH6pvgNXWWWjn3p74lq1yGWhiGgoc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0202MB2560; 7:sehFfTmOjhDrAIrMsJa9O9iB+zcYF0zJGRFSis4zyKI8ReikUWbyCjit2q/1kjVG3Q4jfcA2A4MCljULzd1ERu5af+PZ8rRHwDrEF56LNdE/oJUaJTOg1kkeHdcWshIrT9KKlacOW4RXhPp80j4f6fzEhLhEZcVjscXcBhfqx6ttDxeCPcZ507u3wi/nCS2YJRyQSHwJj5TcLZHuHPj+HIhTLYojzbWEag1aSuIrEPOsW2irKypFGngbccdO36NmiUQ23SQj1hiknBWN9IuCVYrN6TJ06bvh5OJjAOA2cofCEpwP1kBdMtm635VFqePMJQzFBFJf28w5nrUmYDjgWw== X-OriginatorOrg: axentia.se X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Mar 2017 11:11:22.9020 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0202MB2560 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 | 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");