From nobody Sun Jun 28 05:30:28 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10381C433F5 for ; Mon, 14 Feb 2022 11:04:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233779AbiBNLFC (ORCPT ); Mon, 14 Feb 2022 06:05:02 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:36278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349902AbiBNLER (ORCPT ); Mon, 14 Feb 2022 06:04:17 -0500 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 489DD9BF41 for ; Mon, 14 Feb 2022 02:32:24 -0800 (PST) Received: by mail-ej1-x62f.google.com with SMTP id e7so32304400ejn.13 for ; Mon, 14 Feb 2022 02:32:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bo43NL5WgxumOcYzft9YAYcZtXZd3PhX1zRfnI8bjDk=; b=PwKUejzP04bJB9L/Xde/ppijUOqMNVBq9vZlUz8ZRPTY1pYD15Qe45sYIb0L4FtYjb IyHnd2MnK/h2O2Tgfk/gptsiXpiVPFmpyOiMIYZ3h3GbbMT/zThfR804PQhY1IP7zIdJ aMQnJLR8dJcolWGL9V1jh44yloHcNd2XxkIMe4SSC2qDHeTUVItjzrlvlA7Au4Vgr7cU Zato8b5lzV8arQ0jk1QCL32j3v8TLC6ia37OUo60O5jGLZj5GiSQCyrH4oAjLMK42LG+ n4E4U7nK62f6MkYa12GS9HsWkddfGsrl5IgLk6bOn73UlNxOHunebmRMBirlqw7M/v83 2AfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bo43NL5WgxumOcYzft9YAYcZtXZd3PhX1zRfnI8bjDk=; b=a6S5wrIiUmEp3kbOuyJb+F568cJ9f3UHxIpK3PRbY+YRBWYfRrGxJQM3sQUHRZ9DG/ SLyEVae6i+8KtFTnKPB+mEKJ3ARgNFKuHrPbjohTgnq/ZtlbyZUWDF4W0ou6krnfc3h8 W1abdx41EcFRD6Z1tNl9UeTnTsQdM+Op+EaU8R10l/kDqWuOGH6+Lqy8WYUeOoyHwKPG 4amvt9MFUKL3DiMTLI4SMRWA2hytzUAVdlsEqRwV/koq0BN9MCM28UGsRRNx2Qw81S4u D2nBt/CGVLL0USRVDxTqTfAV8itD3rCoFnhTo3WmmFgIWskgMvb8CUOjrQUqBzJNOZPF +EVQ== X-Gm-Message-State: AOAM531l1l6ZQC7vwYRN9LLK3ibuLB6IW7aXRHjFWv17tqi14ygFz7HE Hw/RF+GiPIts9TL5sApTuQiaFw== X-Google-Smtp-Source: ABdhPJzudq88kL+Iol19BJzjrgl1fm4cOkIenjo5ffzfo2Cq+RmmG6+GIBXvUdT1/FwGqrO8PNu6hA== X-Received: by 2002:a17:907:a42a:: with SMTP id sg42mr11159538ejc.723.1644834742774; Mon, 14 Feb 2022 02:32:22 -0800 (PST) Received: from fedora.lab.9e.network (ip-078-094-000-051.um19.pools.vodafone-ip.de. [78.94.0.51]) by smtp.gmail.com with ESMTPSA id b19sm1857940ede.37.2022.02.14.02.32.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 02:32:22 -0800 (PST) From: Patrick Rudolph To: Peter Rosin , Laurent Pinchart Cc: Patrick Rudolph , Rob Herring , linux-i2c@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [v5 1/3] dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants Date: Mon, 14 Feb 2022 11:31:14 +0100 Message-Id: <20220214103116.68472-2-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220214103116.68472-1-patrick.rudolph@9elements.com> References: <20220214103116.68472-1-patrick.rudolph@9elements.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Update the pca954x bindings to add support for the Maxim MAX735x/MAX736x chips. The functionality will be provided by the exisintg pca954x driver. While on it make the interrupts support conditionally as not all of the existing chips have interrupts. For chips that are powered off by default add an optional regulator called vdd-supply. Signed-off-by: Patrick Rudolph --- .../bindings/i2c/i2c-mux-pca954x.yaml | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml b/D= ocumentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml index 9f1726d0356b..8d90127b06ce 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +++ b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml @@ -4,21 +4,48 @@ $id: http://devicetree.org/schemas/i2c/i2c-mux-pca954x.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: NXP PCA954x I2C bus switch +title: NXP PCA954x I2C and compatible bus switches =20 maintainers: - Laurent Pinchart =20 description: - The binding supports NXP PCA954x and PCA984x I2C mux/switch devices. + The binding supports NXP PCA954x and PCA984x I2C mux/switch devices, + and the Maxim MAX735x and MAX736x I2C mux/switch devices. =20 allOf: - $ref: /schemas/i2c/i2c-mux.yaml# + - if: + properties: + compatible: + contains: + enum: + - maxim,max7367 + - maxim,max7369 + - nxp,pca9542 + - nxp,pca9543 + - nxp,pca9544 + - nxp,pca9545 + then: + properties: + interrupts: + maxitems: 1 + + "#interrupt-cells": + const: 2 + + interrupt-controller: true =20 properties: compatible: oneOf: - enum: + - maxim,max7356 + - maxim,max7357 + - maxim,max7358 + - maxim,max7367 + - maxim,max7368 + - maxim,max7369 - nxp,pca9540 - nxp,pca9542 - nxp,pca9543 @@ -38,14 +65,6 @@ properties: reg: maxItems: 1 =20 - interrupts: - maxItems: 1 - - "#interrupt-cells": - const: 2 - - interrupt-controller: true - reset-gpios: maxItems: 1 =20 @@ -59,6 +78,9 @@ properties: description: if present, overrides i2c-mux-idle-disconnect $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state =20 + vdd-supply: + description: A voltage regulator supplying power to the chip. + required: - compatible - reg @@ -79,6 +101,8 @@ examples: #size-cells =3D <0>; reg =3D <0x74>; =20 + vdd-supply =3D <&p3v3>; + interrupt-parent =3D <&ipic>; interrupts =3D <17 IRQ_TYPE_LEVEL_LOW>; interrupt-controller; --=20 2.34.1 From nobody Sun Jun 28 05:30:28 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D2BCC433FE for ; Mon, 14 Feb 2022 11:04:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349936AbiBNLE6 (ORCPT ); Mon, 14 Feb 2022 06:04:58 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:36266 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349703AbiBNLER (ORCPT ); Mon, 14 Feb 2022 06:04:17 -0500 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5A859BF52 for ; Mon, 14 Feb 2022 02:32:26 -0800 (PST) Received: by mail-ej1-x62b.google.com with SMTP id gb39so1796533ejc.1 for ; Mon, 14 Feb 2022 02:32:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=O0k8KhFMdBtBZFFVKWcjCSCyxGIr4s4QCXxRmW6v5O8=; b=hh537IpuHjN++zw9cPdTPn8wUTX2b96zFwYpgrp9m6KaUzicbSbTROJb2dskmvtOf0 RsP5HRXXTdqCCC7o1xFFwcYCmgS3OXmgaJ+TYzH+tjkYB8sQ63TY+wh3GUdmeDZsLWcl pTHx5x7ASVJuHo/yGdaTUJPA0WXWElvmEde7hi4MJ61mc9YRR7rsdi5zJCtjSdzGCaVK 7vI/AVUr4JEQRLMfd3Ju3n6BE4ouVMPvjXKaNBYXrmWHfMR5SY3uc8fiGTp2kG2w4SKM 0rqPIE0ztVxG2dCYK3Sz5UWt2O8LXNFa+4wfN2XEZpt/I7yAzbxduCAVmT8mGR46tDH+ /bxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=O0k8KhFMdBtBZFFVKWcjCSCyxGIr4s4QCXxRmW6v5O8=; b=oMTYmecaYKUft4dL5OXU8L2rH3CbkYSHWbxcr5bxw3xS2TRU3C4nB7USyiAWT9HdOz PsQU3XX46NZFKbpOIwDjqlY9FeBAJDvL3+1XcDjyHDnOEEKSmgP9/Gq6PlReRhXhx7HU wiYTQSk4MOU30ZH5nRxgR8a3TuW0/AZ3di2cquIxNwq8012t+YoYr3pURY+Q12886iDm FxxZk/FfGC5lLqxnZj3xussKe/bIWT8OmgFmbvqatEGy/6vg1pHvB1e6eZMTj0IGWsIg WkS2FH3AIiwvilmg59oyc3ePe7mHvsmTDgnA0hK8qxXUYyw2ST8TRHhvP0ezg2677/kH Ur+Q== X-Gm-Message-State: AOAM533w4xNRegkS2OYpDo4c5XRmpe5REkAXuo6Q2W1BxTt1bNC4P2gd HPlqiAfDqraSZDDRbij1x/bUBai4qT4KDw== X-Google-Smtp-Source: ABdhPJzVKzbuuVuEekf3tvi5C/XTfYg2tA9s0mzsdDxjSRK7jm4B59aw4SSlQFo/RfSvRhnR4PcaSw== X-Received: by 2002:a17:907:7f8b:: with SMTP id qk11mr10882967ejc.72.1644834745195; Mon, 14 Feb 2022 02:32:25 -0800 (PST) Received: from fedora.lab.9e.network (ip-078-094-000-051.um19.pools.vodafone-ip.de. [78.94.0.51]) by smtp.gmail.com with ESMTPSA id b19sm1857940ede.37.2022.02.14.02.32.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 02:32:24 -0800 (PST) From: Patrick Rudolph To: Peter Rosin Cc: Patrick Rudolph , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [v5 2/3] i2c: muxes: pca954x: Add MAX735x/MAX736x support Date: Mon, 14 Feb 2022 11:31:15 +0100 Message-Id: <20220214103116.68472-3-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220214103116.68472-1-patrick.rudolph@9elements.com> References: <20220214103116.68472-1-patrick.rudolph@9elements.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add support for the following Maxim chips using the existing PCA954x driver: - MAX7356 - MAX7357 - MAX7358 - MAX7367 - MAX7368 - MAX7369 All added Maxim chips behave like the PCA954x, where a single SMBUS byte write selects up to 8 channels to be bridged to the primary bus. The MAX7357 exposes 6 additional registers at Power-On-Reset and is configured to: - Disabled interrupts on bus locked up detection - Enable bus locked-up clearing - Disconnect only locked bus instead of all channels While the MAX7357/MAX7358 have interrupt support, they don't act as interrupt controller like the PCA9545 does. Thus don't enable IRQ support and handle them like the PCA9548. Tested using the MAX7357 and verified that the stalled bus is disconnected while the other channels remain operational. Signed-off-by: Patrick Rudolph --- drivers/i2c/muxes/Kconfig | 4 +- drivers/i2c/muxes/i2c-mux-pca954x.c | 92 +++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig index 1708b1a82da2..2ac99d044199 100644 --- a/drivers/i2c/muxes/Kconfig +++ b/drivers/i2c/muxes/Kconfig @@ -65,11 +65,11 @@ config I2C_MUX_PCA9541 will be called i2c-mux-pca9541. =20 config I2C_MUX_PCA954x - tristate "NXP PCA954x and PCA984x I2C Mux/switches" + tristate "NXP PCA954x/PCA984x and Maxim MAX735x/MAX736x I2C Mux/switches" depends on GPIOLIB || COMPILE_TEST help If you say yes here you get support for the NXP PCA954x - and PCA984x I2C mux/switch devices. + and PCA984x and Maxim MAX735x/MAX736x I2C mux/switch devices. =20 This driver can also be built as a module. If so, the module will be called i2c-mux-pca954x. diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mu= x-pca954x.c index 4ad665757dd8..33b9a6a1fffa 100644 --- a/drivers/i2c/muxes/i2c-mux-pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c @@ -4,6 +4,7 @@ * * Copyright (c) 2008-2009 Rodolfo Giometti * Copyright (c) 2008-2009 Eurotech S.p.A. + * Copyright (c) 2022 Patrick Rudolph * * This module supports the PCA954x and PCA984x series of I2C multiplexer/= switch * chips made by NXP Semiconductors. @@ -11,6 +12,12 @@ * PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547, * PCA9548, PCA9846, PCA9847, PCA9848 and PCA9849. * + * It's also compatible to Maxims MAX735x I2C switch chips, which are cont= rolled + * as the NXP PCA9548 and the MAX736x chips that act like the PCA9544. + * + * This includes the: + * MAX7356, MAX7357, MAX7358, MAX7367, MAX7368 and MAX7369 + * * These chips are all controlled via the I2C bus itself, and all have a * single 8-bit register. The upstream "parent" bus fans out to two, * four, or eight downstream busses or channels; which of these @@ -50,7 +57,30 @@ =20 #define PCA954X_IRQ_OFFSET 4 =20 +/* + * MAX7357 exposes 7 registers on POR which allow to configure additional + * features. Disable interrupts, enable bus locked-up clearing, + * isolate only the locked channel instead of all channels. + */ +#define MAX7357_CONF_INT_ENABLE BIT(0) +#define MAX7357_CONF_FLUSH_OUT BIT(1) +#define MAX7357_CONF_RELEASE_INT BIT(2) +#define MAX7357_CONF_LOCK_UP_CLEAR BIT(3) +#define MAX7357_CONF_DISCON_SINGLE_CHAN BIT(4) +#define MAX7357_CONF_BUS_LOCKUP_DETECTION BIT(5) +#define MAX7357_CONF_ENABLE_BASIC_MODE BIT(6) +#define MAX7357_CONF_PRECONNECT_TEST BIT(7) + +#define MAX7357_CONF_DEFAULTS (MAX7357_CONF_FLUSH_OUT | \ + MAX7357_CONF_DISCON_SINGLE_CHAN) + enum pca_type { + max_7367, + max_7368, + max_7369, + max_7356, + max_7357, + max_7358, pca_9540, pca_9542, pca_9543, @@ -69,6 +99,7 @@ struct chip_desc { u8 nchans; u8 enable; /* used for muxes only */ u8 has_irq; + u8 max7357; enum muxtype { pca954x_ismux =3D 0, pca954x_isswi @@ -90,8 +121,42 @@ struct pca954x { raw_spinlock_t lock; }; =20 -/* Provide specs for the PCA954x types we know about */ +/* Provide specs for the PCA954x and MAX735x types we know about */ static const struct chip_desc chips[] =3D { + [max_7356] =3D { + .nchans =3D 8, + .muxtype =3D pca954x_isswi, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, + [max_7357] =3D { + .nchans =3D 8, + .muxtype =3D pca954x_isswi, + .max7357 =3D 1, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, + [max_7358] =3D { + .nchans =3D 8, + .muxtype =3D pca954x_isswi, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, + [max_7367] =3D { + .nchans =3D 4, + .muxtype =3D pca954x_isswi, + .has_irq =3D 1, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, + [max_7368] =3D { + .nchans =3D 4, + .muxtype =3D pca954x_isswi, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, + [max_7369] =3D { + .nchans =3D 4, + .enable =3D 0x4, + .muxtype =3D pca954x_ismux, + .has_irq =3D 1, + .id =3D { .manufacturer_id =3D I2C_DEVICE_ID_NONE }, + }, [pca_9540] =3D { .nchans =3D 2, .enable =3D 0x4, @@ -177,6 +242,12 @@ static const struct chip_desc chips[] =3D { }; =20 static const struct i2c_device_id pca954x_id[] =3D { + { "max7356", max_7356 }, + { "max7357", max_7357 }, + { "max7358", max_7358 }, + { "max7367", max_7367 }, + { "max7368", max_7368 }, + { "max7369", max_7369 }, { "pca9540", pca_9540 }, { "pca9542", pca_9542 }, { "pca9543", pca_9543 }, @@ -194,6 +265,12 @@ static const struct i2c_device_id pca954x_id[] =3D { MODULE_DEVICE_TABLE(i2c, pca954x_id); =20 static const struct of_device_id pca954x_of_match[] =3D { + { .compatible =3D "maxim,max7356", .data =3D &chips[max_7356] }, + { .compatible =3D "maxim,max7357", .data =3D &chips[max_7357] }, + { .compatible =3D "maxim,max7358", .data =3D &chips[max_7358] }, + { .compatible =3D "maxim,max7367", .data =3D &chips[max_7367] }, + { .compatible =3D "maxim,max7368", .data =3D &chips[max_7368] }, + { .compatible =3D "maxim,max7369", .data =3D &chips[max_7369] }, { .compatible =3D "nxp,pca9540", .data =3D &chips[pca_9540] }, { .compatible =3D "nxp,pca9542", .data =3D &chips[pca_9542] }, { .compatible =3D "nxp,pca9543", .data =3D &chips[pca_9543] }, @@ -401,9 +478,16 @@ static int pca954x_init(struct i2c_client *client, str= uct pca954x *data) else data->last_chan =3D 0; /* Disconnect multiplexer */ =20 - ret =3D i2c_smbus_write_byte(client, data->last_chan); - if (ret < 0) - data->last_chan =3D 0; + if (data->chip->max7357) { + ret =3D i2c_smbus_write_byte_data(client, data->last_chan, + MAX7357_CONF_DEFAULTS); + if (ret < 0) + data->last_chan =3D 0; + } else { + ret =3D i2c_smbus_write_byte(client, data->last_chan); + if (ret < 0) + data->last_chan =3D 0; + } =20 return ret; } --=20 2.34.1 From nobody Sun Jun 28 05:30:28 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1FB65C433EF for ; Mon, 14 Feb 2022 11:04:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349443AbiBNLEw (ORCPT ); Mon, 14 Feb 2022 06:04:52 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:34378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350043AbiBNLET (ORCPT ); Mon, 14 Feb 2022 06:04:19 -0500 Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A53542AFD for ; Mon, 14 Feb 2022 02:32:28 -0800 (PST) Received: by mail-ed1-x531.google.com with SMTP id y17so24304658edd.10 for ; Mon, 14 Feb 2022 02:32:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9elements.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UXFVdha6mdWIMpTuHA+4tNIC4aJVupleztPzYIr+WPI=; b=I7At3oMdPup7wbHPzTD4p91kx9RZF33ZicvN6qyKhF8FgVHcF/XjWK60kE8i/18t/D hKzdoTAdQpZ858vM1aqy3u444vLxTXbX8pwQufaoOPupaKJvsle9wAOhflXtLBz09W9p 0ciQ/Y5SNnIYddiSceKzMtYvYe8VvrLjI/XHwy4V4mbbXgShwuEfWlFNJIX+1Vadd3Rr XkmuJLzRc2N3S0ZLN1p0h3hqvq8qikaobE97MBnWQbM62BfheAE7zNIj2Tps7pdAClLj sks7cpHtLsEuMci+DdcAciCYQMN0tj6X8utiSR1c+fLEHl0/71M4XFSUqj/JBgeNs/z8 XxlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UXFVdha6mdWIMpTuHA+4tNIC4aJVupleztPzYIr+WPI=; b=57JG7xM0zQs4G5TWUO4+OmDDZADDHCtXTyNQQFT8vK6Zpo7KYqo1Cr8K/JPWejS7f9 +XU6p3vU4LIAX2scEt3icydgGf+57GBTU4cph9gt1sgH1h2PDAqcT53s90wEnvByIGnG vVgnOYAFa0J1agT4Us2BVkwCKU8pXpHa5LUJYkP7guocAgc8JZdirdiK8l1b2hWGVQha IxNacrCwXuE1kOVkMknvp+wMi9zFJWhZvLaE1Ymar12uiLl4RdM6fysuGyHdkJD3Z19s KfFVS9Da9rMpu7c3SQ3s+yYF543kKbwg6KLHvMM/W5JbYdyXcv/ACmO5bNrcD1MRXu7E f0xg== X-Gm-Message-State: AOAM530fuM/v4FiTG+mERRSdwU21U4wyzmpffEzonBkkNqMaBTup6ugV o9i5+1r4g+2oR4nH4Z2r3/0SMA== X-Google-Smtp-Source: ABdhPJzD5nvFKd1Dvw1B4oitBAMAX+1avm4qT6z5dihr5dJiuH11VWW/zmw0n+tZaRQuqEEr4mrvPw== X-Received: by 2002:a05:6402:520e:: with SMTP id s14mr14645822edd.401.1644834746954; Mon, 14 Feb 2022 02:32:26 -0800 (PST) Received: from fedora.lab.9e.network (ip-078-094-000-051.um19.pools.vodafone-ip.de. [78.94.0.51]) by smtp.gmail.com with ESMTPSA id b19sm1857940ede.37.2022.02.14.02.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 02:32:26 -0800 (PST) From: Patrick Rudolph To: Peter Rosin Cc: Patrick Rudolph , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [v5 3/3] i2c: muxes: pca954x: Add regulator support Date: Mon, 14 Feb 2022 11:31:16 +0100 Message-Id: <20220214103116.68472-4-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220214103116.68472-1-patrick.rudolph@9elements.com> References: <20220214103116.68472-1-patrick.rudolph@9elements.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a vdd regulator and enable it for boards that have the mux powered off by default. Signed-off-by: Patrick Rudolph --- drivers/i2c/muxes/i2c-mux-pca954x.c | 34 ++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mu= x-pca954x.c index 33b9a6a1fffa..e25383752616 100644 --- a/drivers/i2c/muxes/i2c-mux-pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -119,6 +120,7 @@ struct pca954x { struct irq_domain *irq; unsigned int irq_mask; raw_spinlock_t lock; + struct regulator *supply; }; =20 /* Provide specs for the PCA954x and MAX735x types we know about */ @@ -459,6 +461,9 @@ static void pca954x_cleanup(struct i2c_mux_core *muxc) struct pca954x *data =3D i2c_mux_priv(muxc); int c, irq; =20 + if (!IS_ERR_OR_NULL(data->supply)) + regulator_disable(data->supply); + if (data->irq) { for (c =3D 0; c < data->chip->nchans; c++) { irq =3D irq_find_mapping(data->irq, c); @@ -513,15 +518,32 @@ static int pca954x_probe(struct i2c_client *client, pca954x_select_chan, pca954x_deselect_mux); if (!muxc) return -ENOMEM; + data =3D i2c_mux_priv(muxc); =20 i2c_set_clientdata(client, muxc); data->client =3D client; =20 + data->supply =3D devm_regulator_get(dev, "vdd"); + if (IS_ERR(data->supply)) { + ret =3D PTR_ERR(data->supply); + if (ret !=3D -EPROBE_DEFER) + dev_err(dev, "Failed to request regulator: %d\n", ret); + return ret; + } + + ret =3D regulator_enable(data->supply); + if (ret) { + dev_err(dev, "Failed to enable regulator: %d\n", ret); + return ret; + } + /* Reset the mux if a reset GPIO is specified. */ gpio =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); - if (IS_ERR(gpio)) - return PTR_ERR(gpio); + if (IS_ERR(gpio)) { + ret =3D PTR_ERR(gpio); + goto fail_cleanup; + } if (gpio) { udelay(1); gpiod_set_value_cansleep(gpio, 0); @@ -538,7 +560,7 @@ static int pca954x_probe(struct i2c_client *client, =20 ret =3D i2c_get_device_id(client, &id); if (ret && ret !=3D -EOPNOTSUPP) - return ret; + goto fail_cleanup; =20 if (!ret && (id.manufacturer_id !=3D data->chip->id.manufacturer_id || @@ -546,7 +568,8 @@ static int pca954x_probe(struct i2c_client *client, dev_warn(dev, "unexpected device id %03x-%03x-%x\n", id.manufacturer_id, id.part_id, id.die_revision); - return -ENODEV; + ret =3D -ENODEV; + goto fail_cleanup; } } =20 @@ -565,7 +588,8 @@ static int pca954x_probe(struct i2c_client *client, ret =3D pca954x_init(client, data); if (ret < 0) { dev_warn(dev, "probe failed\n"); - return -ENODEV; + ret =3D -ENODEV; + goto fail_cleanup; } =20 ret =3D pca954x_irq_setup(muxc); --=20 2.34.1