From nobody Mon May 11 01:27:07 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 08E64C433EF for ; Tue, 19 Apr 2022 12:41:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352353AbiDSMoC (ORCPT ); Tue, 19 Apr 2022 08:44:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350227AbiDSMnq (ORCPT ); Tue, 19 Apr 2022 08:43:46 -0400 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4AB323615A for ; Tue, 19 Apr 2022 05:41:00 -0700 (PDT) Received: by mail-ed1-x52d.google.com with SMTP id g20so21067839edw.6 for ; Tue, 19 Apr 2022 05:41:00 -0700 (PDT) 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=dFjjMvsqq7b2yA8bGP5tTnOGcb+Gng0k+gEX/WjWfCQ=; b=WeyHKNjyfPNi01d1dQprscoxppa9eOZMVUal5I84WVPQGqyjugb3G2lj1+jV5RXat5 MXPERM7P+t6DRDWjcvHBtYJiCPajQDqbMjG7xfWn1F3YXkaaUfa6lw/TM2h/E40bSwtD q2YQE5czRNJKCUly2nFV+5VBqPbMKWc7/V+TzzAzjlsGHo1RPXXPnb0XBOgmmYwJ0eEI NyU4MCkagHJTltvjRenUgU4o0rE+46fisEXAOLF8qaprOESeUdHg5yMioplBgRW5bTba IVLdsK45NYUEz6U+DNYByeq74Jedcal3GCc2KdFzvdI2kr2AdVtzgAbOap8ixt/DQSd9 5SLA== 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=dFjjMvsqq7b2yA8bGP5tTnOGcb+Gng0k+gEX/WjWfCQ=; b=vk+s0odg0GyPEXaniMS3jfomEHQbUpslORMdfUaPzurnvkxrszLLduUqRyUQ3EAx3c ikqlSXqiw1XQKhF/hKlSZSkZq+UopMhgCdYiKzd3x1r+5gLa/Mm0ByEAiqPaYfwfXTtB Rsde+tMyppd/Z2UG0SXZxY006YWs7BG0zCkhGb3iSed5B6RwEvIvzYAcUHdsL2iapY2v OYGZMS7OTomzEg6axxcsKzIRRBIj/oIXqxeMMiucrWb8Kb7GDZnqX+TMg2oYTmQjzQv9 Ko4PJPEnEpeT3zxzriWgoUQ4f6HnSE1HUUI83hfZUKzZFIEB2JUuexC2Uoe3d6WF66AN X3zA== X-Gm-Message-State: AOAM53074Uv+ncb6jUhlqeJn8jE3sLDR3kxoJ7vdiwBlzfnIYQGhwoB4 1XgCpsfKL924QbMbELzMpE8dcQ== X-Google-Smtp-Source: ABdhPJx659JfC09WdVbA8JxLM2QNhguItcwDj4boycocwoWIY1ZBbpSoij6kP6Oug7yLrDdbPjGVhw== X-Received: by 2002:a05:6402:d0e:b0:413:3d99:f2d6 with SMTP id eb14-20020a0564020d0e00b004133d99f2d6mr17442373edb.189.1650372058590; Tue, 19 Apr 2022 05:40:58 -0700 (PDT) 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 n27-20020a1709062bdb00b006da975173bfsm5709274ejg.170.2022.04.19.05.40.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Apr 2022 05:40:57 -0700 (PDT) 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: [v8 1/3] dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants Date: Tue, 19 Apr 2022 14:40:22 +0200 Message-Id: <20220419124025.1733230-2-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220419124025.1733230-1-patrick.rudolph@9elements.com> References: <20220419124025.1733230-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 Reviewed-by: Laurent Pinchart --- .../bindings/i2c/i2c-mux-pca954x.yaml | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml b/D= ocumentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml index 9f1726d0356b..21ab286c74f2 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml +++ b/Documentation/devicetree/bindings/i2c/i2c-mux-pca954x.yaml @@ -4,21 +4,25 @@ $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. - -allOf: - - $ref: /schemas/i2c/i2c-mux.yaml# + The binding supports NXP PCA954x and PCA984x I2C mux/switch devices, + and the Maxim MAX735x and MAX736x I2C mux/switch devices. =20 properties: compatible: oneOf: - enum: + - maxim,max7356 + - maxim,max7357 + - maxim,max7358 + - maxim,max7367 + - maxim,max7368 + - maxim,max7369 - nxp,pca9540 - nxp,pca9542 - nxp,pca9543 @@ -59,10 +63,33 @@ 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 =20 +allOf: + - $ref: /schemas/i2c/i2c-mux.yaml# + - if: + not: + properties: + compatible: + contains: + enum: + - maxim,max7367 + - maxim,max7369 + - nxp,pca9542 + - nxp,pca9543 + - nxp,pca9544 + - nxp,pca9545 + then: + properties: + interrupts: false + "#interrupt-cells": false + interrupt-controller: false + unevaluatedProperties: false =20 examples: @@ -79,6 +106,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.35.1 From nobody Mon May 11 01:27:07 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 1BCB6C433EF for ; Tue, 19 Apr 2022 12:41:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352345AbiDSMn6 (ORCPT ); Tue, 19 Apr 2022 08:43:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32868 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350215AbiDSMnq (ORCPT ); Tue, 19 Apr 2022 08:43:46 -0400 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAE8932ED6 for ; Tue, 19 Apr 2022 05:41:01 -0700 (PDT) Received: by mail-ed1-x52a.google.com with SMTP id s25so20613396edi.13 for ; Tue, 19 Apr 2022 05:41:01 -0700 (PDT) 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=GiiakbZrYZsutR3hm5vzK0RdBB42qhkHtdNfJL6cDvs=; b=ejE86aBzZk0lLY+LUTq5NPnHSyedt53ZjvUpKNwemaeckBq8/6gjSJ7G4Ay8dDhKIX zbuQ8JGKeYiVgQYCPkE8wWA2yCfgzb5Ta6avm4kpblN699qnWIgLiei4msWKt01LKAV/ h6E9FER+ktjuEoj6YnMZStoo1cJjgydm5CXQ/KG+SzjLPyAVl5N2SmCFMhtoXQoxuMIp 3jB7V9PMAffDl0fibuG7uiXxCCGSXN+NoV/O27tll1RwSOpicmq8eTGCJNhvQh51JdGx hJWtReu8oaugqsVPogHhoyNoUIs5o5w//A6OEw3tRaTERx3FPgPb64DC00MAeExt7LCP olTA== 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=GiiakbZrYZsutR3hm5vzK0RdBB42qhkHtdNfJL6cDvs=; b=bYbQD8Pv58GfSKqNokSbzWky2NfoTlZ0tx1FbrReYZ3e24yFfBoIcajURFfXgAwX37 trkzif5bFwgJytST2t0jK/vBboh9IGc15V4ITwgGTiDGI++/1aNvYRc75NN3Xts1E3xU /76JYzSbItgp7FHXvtWoZebQYuBQ04bBlGoIRgAbPXgF5oMbbkrLL6BVJi+zP2VrAKvB KcMNEUc3bENM2Az4TA1lI+huA6EE3pFTWWq73sQ0nEmrvbFel9JHp1kRPsNhZUnoq8zk /2ijbg6b8e2Aq2VfDq6bqVAO+M99Ptvfcbd1iJvAcqeRyuss/M233Ab7VHV55KeUIjZ7 WD1Q== X-Gm-Message-State: AOAM533VkuTfI1sp25OAZlV/EZazoFnLMkYFw2+M9wdd5IiATEYDybJf NHZK8phnB3VmrBGRJ52gJI4NRQ== X-Google-Smtp-Source: ABdhPJxykgeklQlZyEnFcelvkrkDD3D+CdqmV8LKGKMOVdsQ2r73RUHQ4E8CzLqXFlc9BbHtyk/tlA== X-Received: by 2002:a50:fb0b:0:b0:41d:8cd4:659f with SMTP id d11-20020a50fb0b000000b0041d8cd4659fmr17588944edq.10.1650372060348; Tue, 19 Apr 2022 05:41:00 -0700 (PDT) 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 n27-20020a1709062bdb00b006da975173bfsm5709274ejg.170.2022.04.19.05.40.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Apr 2022 05:40:59 -0700 (PDT) From: Patrick Rudolph To: Peter Rosin Cc: Patrick Rudolph , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [v8 2/3] i2c: muxes: pca954x: Add MAX735x/MAX736x support Date: Tue, 19 Apr 2022 14:40:23 +0200 Message-Id: <20220419124025.1733230-3-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220419124025.1733230-1-patrick.rudolph@9elements.com> References: <20220419124025.1733230-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 and MAX7358 have 6 additional registers called enhanced mode in the following paragraphs. While the MAX7357 exposes those registers without a special sequence, the MAX7358 requires an unlock sequence. The enhanced mode allows to configure optional features which are nice to have on a I2C mux, but are not mandatory for it's general operation. As I don't have a MAX7358 for testing the special unlock sequence the enhanced mode isn't used on the MAX7358, but it could be added later if required. The MAX7357 enhanced mode is used to configure: - 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..122b7a28fc60 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 9elements GmbH * * 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 without extra commands which allow to confi= gure + * 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 maxim_enhanced_mode; 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, + .maxim_enhanced_mode =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->maxim_enhanced_mode) { + 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.35.1 From nobody Mon May 11 01:27:07 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 D20E1C433EF for ; Tue, 19 Apr 2022 12:41:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352364AbiDSMoG (ORCPT ); Tue, 19 Apr 2022 08:44:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350858AbiDSMnq (ORCPT ); Tue, 19 Apr 2022 08:43:46 -0400 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4917E31928 for ; Tue, 19 Apr 2022 05:41:03 -0700 (PDT) Received: by mail-ed1-x535.google.com with SMTP id 11so16055577edw.0 for ; Tue, 19 Apr 2022 05:41:03 -0700 (PDT) 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=CentrNXKSQFtoskGJlxUqU8zX0zrZiDPIjJai3Ha6oE=; b=L5qFBf76Si6AIGEi/Y74BymuYRaRImc3HJIwqI8zppZKsQCg/+5DUo9iOq5nm5vJaw 8+vBU1vSyMTnN1kGy8+FdYZXbjR3Yh7TiC9CTvTmBfWYNcHY1++wradcfCDogj5gsVw3 FlVb97xJDCQsVBF8tcielGJkKLEOxUnO16oePCXuO/bvC/jl8y9BqAhxWyxXUND1Pb5x eUXxSYCXb6K21I56FFQkuJZ7YpFXMUm52BAvQgjw/IMT/I3Y+w8oCXOlZYslW+Cb3exi rgFf1VKJbYsV+rveCwfGlm0zGTuV07THYyQRG4wbmG+Wov1cWAKOq4EbFOkYbTfFmP9e af6g== 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=CentrNXKSQFtoskGJlxUqU8zX0zrZiDPIjJai3Ha6oE=; b=r0a/SiLsX1N23sMwxuYbMkmQRaBDH0CnclAgm/Bc1bIe6HwN4YUvgEENXC0aT6B2lX VbfpmGrsADXtx6gcPXyAyMRYRRDaeLnGSCxeDWXbyf9O2c156uDXggoZ6PKLh7PJrCCP XeJQ4DiSv0AiMhT99kldrE/6Jd7lu0HN+SPQOgY/Dw5/G4qxBb9/pkIG0dIEj5pnpe70 blDTCqnpingnntN9uYIXinNVW0IuI+aTHQMtThiQPCPavUJ+lX791YtQWOC0do1zH4Jz Hg4ASFnsE4wvUTbGjbx7OIlp2cBkWw5GZbryRp2oqXZ77iIUXKQzYsy24g9/dqXEZoU8 xW9A== X-Gm-Message-State: AOAM531S7Mf3XF6s5DFB/QYTn4vnuhSoqp04uEFwK/+KrzxLArLFUW8Y OeNU6CTOmTIbOMTB5/RY8LYc4Q== X-Google-Smtp-Source: ABdhPJz5OZdxiHs9n1uZnwqXmik4cSgvZbFD0OtkKsGyIFzXFLI4Z4Pxf4c4NEql/zBIwVK1OVMynQ== X-Received: by 2002:a05:6402:1908:b0:423:d634:126d with SMTP id e8-20020a056402190800b00423d634126dmr14705201edz.216.1650372061871; Tue, 19 Apr 2022 05:41:01 -0700 (PDT) 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 n27-20020a1709062bdb00b006da975173bfsm5709274ejg.170.2022.04.19.05.41.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Apr 2022 05:41:01 -0700 (PDT) From: Patrick Rudolph To: Peter Rosin Cc: Patrick Rudolph , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [v8 3/3] i2c: muxes: pca954x: Add regulator support Date: Tue, 19 Apr 2022 14:40:24 +0200 Message-Id: <20220419124025.1733230-4-patrick.rudolph@9elements.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220419124025.1733230-1-patrick.rudolph@9elements.com> References: <20220419124025.1733230-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 Reviewed-by: Peter Rosin --- 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 122b7a28fc60..6c43d420e349 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.35.1