Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1979770pxk; Sat, 26 Sep 2020 11:52:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxktuwC+t/FyBxNGZSG8cYlPPVTtjMuVto8GLVRaatCwCGRPXduFEdOR9caUlQAhQiM7A8b X-Received: by 2002:a17:906:eced:: with SMTP id qt13mr8309199ejb.357.1601146373056; Sat, 26 Sep 2020 11:52:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601146373; cv=none; d=google.com; s=arc-20160816; b=W1DTX/KT6HlexjzgVrUFLmgDVxyLkHoTpMG63665XGki0QNGIEk7T9Uiapk6rwM0fq r/Kes7M1i/MZOsJSzWG1TV9o8SFqNs96e0dtgSZFrq0n+JWtShZOn9VrQq38D6faqEVW dIy506Kef5radhSQRCDNmSqNn0SdzdG9L4uksaBW+7EnDAWdBFnGRninWiV/wVJbkznT 2CRwxYK4eS8yQ495IQ5Wp98dNqxRQU9QCtBLZChQ5UJyAKtQfajuFD384ehUrYEDPWRM K8/Ko6bvf28bjZHtbBEkWjVE0u0JFUz+x6CFvOtFSygL2Ml/ReSCsyj7uOEvn84NUq/h X2mA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=IdAelDIxW3856dxnZuvTxoUYapnPGL5ViemXVFw/GGs=; b=cnd+KktQdK16udL9XrzvE+/OPfkJ4hJTwLUf1DVeYYionuQXFXHiw97YMKN0tXJ0ft c5l01SqsUrpMq/Pz7UD6py79JgpOzEsIWkbq+GinvMK8llx/fNObqh9ZHfUPLSrN+ffc xVEGmGy1iIMDurrKp6YT7Iq//I2THbAVh87E4AmR1iMESDI2KsovulF2O5qFFaAdLT9i pI7KHzqKoWCVUsLNHcASgTlKQyLBv+VPnOSsMTXQyAaTkLXZN8bPZbdMv0QT8pnB1E/F QD4K5QF+L4OM6JwYn0HXPtiVli/zKriWMQpzY6KXRV2ipyujaUNMp4ywmYJRKiF7f3C/ Yflg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a5si4840866edx.243.2020.09.26.11.52.29; Sat, 26 Sep 2020 11:52:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730133AbgIZStZ (ORCPT + 99 others); Sat, 26 Sep 2020 14:49:25 -0400 Received: from asavdk4.altibox.net ([109.247.116.15]:46574 "EHLO asavdk4.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726183AbgIZStY (ORCPT ); Sat, 26 Sep 2020 14:49:24 -0400 Received: from ravnborg.org (unknown [188.228.123.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk4.altibox.net (Postfix) with ESMTPS id 0AC068067F; Sat, 26 Sep 2020 20:49:20 +0200 (CEST) Date: Sat, 26 Sep 2020 20:49:19 +0200 From: Sam Ravnborg To: Alexandru Gagniuc Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, Jernej Skrabec , Mauro Carvalho Chehab , Neil Armstrong , David Airlie , Mark Brown , Jonas Karlman , linux-kernel@vger.kernel.org, Andrzej Hajda , Rob Herring , Thomas Bogendoerfer , Laurent Pinchart Subject: Re: [PATCH 1/2] drm/bridge: sii902x: Enable I/O and core VCC supplies if present Message-ID: <20200926184919.GB98875@ravnborg.org> References: <20200924200507.1175888-1-mr.nuke.me@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200924200507.1175888-1-mr.nuke.me@gmail.com> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=A5ZCwZeG c=1 sm=1 tr=0 a=S6zTFyMACwkrwXSdXUNehg==:117 a=S6zTFyMACwkrwXSdXUNehg==:17 a=kj9zAlcOel0A:10 a=pGLkceISAAAA:8 a=e5mUnYsNAAAA:8 a=YsLWCyS0S5thGiuXXI8A:9 a=CjuIK1q_8ugA:10 a=Vxmtnl_E_bksehYqCbjh:22 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Alexandru On Thu, Sep 24, 2020 at 03:05:05PM -0500, Alexandru Gagniuc wrote: > On the SII9022, the IOVCC and CVCC12 supplies must reach the correct > voltage before the reset sequence is initiated. On most boards, this > assumption is true at boot-up, so initialization succeeds. > > However, when we try to initialize the chip with incorrect supply > voltages, it will not respond to I2C requests. sii902x_probe() fails > with -ENXIO. > > To resolve this, look for the "iovcc" and "cvcc12" regulators, and > make sure they are enabled before starting the reset sequence. If > these supplies are not available in devicetree, then they will default > to dummy-regulator. In that case everything will work like before. > > This was observed on a STM32MP157C-DK2 booting in u-boot falcon mode. > On this board, the supplies would be set by the second stage > bootloader, which does not run in falcon mode. > > Signed-off-by: Alexandru Gagniuc One nitpick here. The binding should be present in the tree before you start using it. So this patch should be applied after the binding. One detail below - I think others have already commented on the rest. Sam > --- > drivers/gpu/drm/bridge/sii902x.c | 54 ++++++++++++++++++++++++++++---- > 1 file changed, 48 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c > index 33fd33f953ec..a5558d83e4c5 100644 > --- a/drivers/gpu/drm/bridge/sii902x.c > +++ b/drivers/gpu/drm/bridge/sii902x.c > @@ -17,6 +17,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -168,6 +169,8 @@ struct sii902x { > struct drm_connector connector; > struct gpio_desc *reset_gpio; > struct i2c_mux_core *i2cmux; > + struct regulator *iovcc; > + struct regulator *cvcc12; > /* > * Mutex protects audio and video functions from interfering > * each other, by keeping their i2c command sequences atomic. > @@ -954,13 +957,13 @@ static const struct drm_bridge_timings default_sii902x_timings = { > | DRM_BUS_FLAG_DE_HIGH, > }; > > +static int sii902x_init(struct sii902x *sii902x); > + > static int sii902x_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > struct device *dev = &client->dev; > - unsigned int status = 0; > struct sii902x *sii902x; > - u8 chipid[4]; > int ret; > > ret = i2c_check_functionality(client->adapter, > @@ -989,6 +992,43 @@ static int sii902x_probe(struct i2c_client *client, > > mutex_init(&sii902x->mutex); > > + sii902x->iovcc = devm_regulator_get(dev, "iovcc"); > + if (IS_ERR(sii902x->iovcc)) > + return PTR_ERR(sii902x->iovcc); Consider using dev_err_probe() here. > + > + sii902x->cvcc12 = devm_regulator_get(dev, "cvcc12"); > + if (IS_ERR(sii902x->cvcc12)) > + return PTR_ERR(sii902x->cvcc12); Consider using dev_err_probe() here. > + > + ret = regulator_enable(sii902x->iovcc); > + if (ret < 0) { > + dev_err(dev, "Failed to enable iovcc supply: %d\n", ret); > + return ret; > + } > + > + ret = regulator_enable(sii902x->cvcc12); > + if (ret < 0) { > + dev_err(dev, "Failed to enable cvcc12 supply: %d\n", ret); > + regulator_disable(sii902x->iovcc); > + return PTR_ERR(sii902x->cvcc12); > + } > + > + ret = sii902x_init(sii902x); > + if (ret < 0) { > + regulator_disable(sii902x->cvcc12); > + regulator_disable(sii902x->iovcc); > + } > + > + return ret; > +} > + > +static int sii902x_init(struct sii902x *sii902x) > +{ > + struct device *dev = &sii902x->i2c->dev; > + unsigned int status = 0; > + u8 chipid[4]; > + int ret; > + > sii902x_reset(sii902x); > > ret = regmap_write(sii902x->regmap, SII902X_REG_TPI_RQB, 0x0); > @@ -1012,11 +1052,11 @@ static int sii902x_probe(struct i2c_client *client, > regmap_read(sii902x->regmap, SII902X_INT_STATUS, &status); > regmap_write(sii902x->regmap, SII902X_INT_STATUS, status); > > - if (client->irq > 0) { > + if (sii902x->i2c->irq > 0) { > regmap_write(sii902x->regmap, SII902X_INT_ENABLE, > SII902X_HOTPLUG_EVENT); > > - ret = devm_request_threaded_irq(dev, client->irq, NULL, > + ret = devm_request_threaded_irq(dev, sii902x->i2c->irq, NULL, > sii902x_interrupt, > IRQF_ONESHOT, dev_name(dev), > sii902x); > @@ -1031,9 +1071,9 @@ static int sii902x_probe(struct i2c_client *client, > > sii902x_audio_codec_init(sii902x, dev); > > - i2c_set_clientdata(client, sii902x); > + i2c_set_clientdata(sii902x->i2c, sii902x); > > - sii902x->i2cmux = i2c_mux_alloc(client->adapter, dev, > + sii902x->i2cmux = i2c_mux_alloc(sii902x->i2c->adapter, dev, > 1, 0, I2C_MUX_GATE, > sii902x_i2c_bypass_select, > sii902x_i2c_bypass_deselect); > @@ -1051,6 +1091,8 @@ static int sii902x_remove(struct i2c_client *client) > > i2c_mux_del_adapters(sii902x->i2cmux); > drm_bridge_remove(&sii902x->bridge); > + regulator_disable(sii902x->cvcc12); > + regulator_disable(sii902x->iovcc); > > return 0; > } > -- > 2.25.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel