Received: by 10.223.164.202 with SMTP id h10csp4772189wrb; Mon, 20 Nov 2017 22:49:00 -0800 (PST) X-Google-Smtp-Source: AGs4zMabAr55tK7FRradQNkp2kF3LEGdaEKFs5HMHpjDDNAKChnYrvPAGK310YTxuTs48YfwJRsL X-Received: by 10.84.131.12 with SMTP id 12mr16336690pld.418.1511246940379; Mon, 20 Nov 2017 22:49:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511246940; cv=none; d=google.com; s=arc-20160816; b=Iy3LQfKJ9/HTjq1XV0JgqYljwdApg60Jyr50i8Lb7EblG7YresjwnDmDiF7SiOqMjr tkA+Z/FRDOYD617he7ppuqC86PzZAlGCKyIQNre8NjiRfreK1dH2kcZBZo842qdvncJY j4oA+YSGZzMevg3nGCBmvazCrAEBkDr1K1tHBBE/fFz3ys+WOtw3DYn9IoGG8YHjy0Am dHwHLlTLBplOd4biYoKi6jKrF28+JumXsPud72Dr9gCAa/U7ZSEKlvSo6HYKjy7ddcI1 RLMVK2Da8JMr3Pze42FjUmgJjDqDS7b0xTDgeboUmyFVzbMvYXoOk8bnyY+lYtHuR1zj DEIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:organization:message-id:date:subject:cc:to :from:dkim-signature:arc-authentication-results; bh=S7TKNzZB0vA3tAiSHNDPEScxu3CdT1IrlCPXSaWVv40=; b=WaNhDCIs6t9SVAT4aOOVla8NMj9M03IWOnrPIIn7Rv5bTl5ag46C5wNE2zQv2wfa0u inqh/r4KBNbMdFXZiMIc1Hos9F+TWRHdUz3eidJRJ/+JSKdhx83YhWT+mWnz7sH/UYa6 CRGdhdcLytXEnNaUTaO9OtSpxdPGmvwJoSOygd6A8Enrf32l7uZ3pKaw/csFpzm0yPuK mSfAZvmjYKPvps3jvJ6A+VNWPtCRZCHnhDY8dVB1sq/ouR0uo1siuxNa1v5LbOhngQaz /t2qFH5fPsQTejfH6lq/tCVZimde6vgAoIBPqvClXu5OaNFCuEXo1Et5EsVFICTHNkt5 DpCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=Ut6TOcLi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 33si5679422pls.46.2017.11.20.22.48.43; Mon, 20 Nov 2017 22:49:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=Ut6TOcLi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752964AbdKUGrt (ORCPT + 73 others); Tue, 21 Nov 2017 01:47:49 -0500 Received: from galahad.ideasonboard.com ([185.26.127.97]:40176 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752432AbdKUGrs (ORCPT ); Tue, 21 Nov 2017 01:47:48 -0500 Received: from avalon.localnet (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id A8F1E201C5; Tue, 21 Nov 2017 07:46:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1511246780; bh=LAuHuMJe8kF7v0Gw/+l691lpf3w7h+C7ZKIKYyUafrk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ut6TOcLilRN6a/evSVrpo3BDo0uV3uie+Y0gNFA1dNHmNGOHKlrrPAfAtl673RByI Ju+6OgvgKAsdH+rASXuEEsNqcTsARh9CUJBK2qH9bL3C7Q6u5fk7cM5vlYBOyP15sQ h3zXz0ga63Fw+Bqh0kpNrp6tYLOl6DocTuNaxEIs= From: Laurent Pinchart To: Hans Verkuil Cc: Arnd Bergmann , Bhumika Goyal , David Airlie , lkml , dri-devel@lists.freedesktop.org, Hans Verkuil , Dan Carpenter , John Stultz Subject: Re: [PATCHv2] drm: adv7511/33: Fix adv7511_cec_init() failure handling Date: Tue, 21 Nov 2017 08:48:01 +0200 Message-ID: <2716873.T4RGvjZqqn@avalon> Organization: Ideas on Board Oy In-Reply-To: <8f5c59f4-1cbf-0198-663d-2410e3826579@xs4all.nl> References: <8f5c59f4-1cbf-0198-663d-2410e3826579@xs4all.nl> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Hans, Thank you for the patch. On Monday, 20 November 2017 22:57:34 EET Hans Verkuil wrote: > If the device tree for a board did not specify a cec clock, then > adv7511_cec_init would return an error, which would cause adv7511_probe() > to fail and thus there is no HDMI output. > > There is no need to have adv7511_probe() fail if the CEC initialization > fails, so just change adv7511_cec_init() to a void function. In addition, > adv7511_cec_init() should just return silently if the cec clock isn't > found and show a message for any other errors. I don't think that's correct. You at least need to defer probing if the clock is specified in DT but has no provider available yet. For other errors I agree that we can still initialize the ADV7511 in a degraded mode without CEC support, although I would prefer to also error out in case of invalid DT to ensure that DT errors are caught as early as possible. > An otherwise correct cleanup patch from Dan Carpenter turned this broken > failure handling into a kernel Oops, so bisection points to commit > 7af35b0addbc ("drm/kirin: Checking for IS_ERR() instead of NULL") rather > than 3b1b975003e4 ("drm: adv7511/33: add HDMI CEC support"). > > Based on earlier patches from Arnd and John. > > Reported-by: Naresh Kamboju > Cc: Xinliang Liu > Cc: Dan Carpenter > Cc: Sean Paul > Cc: Archit Taneja > Cc: John Stultz > Link: https://bugs.linaro.org/show_bug.cgi?id=3345 > Link: https://lkft.validation.linaro.org/scheduler/job/48017#L3551 > Fixes: 7af35b0addbc ("drm/kirin: Checking for IS_ERR() instead of NULL") > Fixes: 3b1b975003e4 ("drm: adv7511/33: add HDMI CEC support") > Signed-off-by: Hans Verkuil > Tested-by: Hans Verkuil > --- > This rework of Arnd and John's patches goes a bit further and makes > cec_init a void function and just silently exits if there is no cec clock > defined in the dts. I'm sure that's the reason why the kirin board failed > on this. BTW: if the kirin board DOES support cec, then it would be nice > if it can be hooked up in the dts! > > Tested with my Dragonboard and Renesas Koelsch board. > > Change since my previous RFC PATCH: > > - added static inline adv7511_cec_init to avoid #ifdef in the probe function > as suggested by John Stultz. > > Regards, > > Hans > --- > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511.h > b/drivers/gpu/drm/bridge/adv7511/adv7511.h index 543a5eb91624..16051bfa5578 > 100644 > --- a/drivers/gpu/drm/bridge/adv7511/adv7511.h > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511.h > @@ -374,9 +374,17 @@ struct adv7511 { > }; > > #ifdef CONFIG_DRM_I2C_ADV7511_CEC > -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511, > - unsigned int offset); > +void adv7511_cec_init(struct device *dev, struct adv7511 *adv7511, > + unsigned int offset); > void adv7511_cec_irq_process(struct adv7511 *adv7511, unsigned int irq1); > +#else > +static inline void adv7511_cec_init(struct device *dev, > + struct adv7511 *adv7511, > + unsigned int offset) > +{ > + regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, > + ADV7511_CEC_CTRL_POWER_DOWN); > +} > #endif > > #ifdef CONFIG_DRM_I2C_ADV7533 > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c > b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c index > b33d730e4d73..c1cd471d31fa 100644 > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_cec.c > @@ -300,18 +300,20 @@ static int adv7511_cec_parse_dt(struct device *dev, > struct adv7511 *adv7511) return 0; > } > > -int adv7511_cec_init(struct device *dev, struct adv7511 *adv7511, > - unsigned int offset) > +void adv7511_cec_init(struct device *dev, struct adv7511 *adv7511, > + unsigned int offset) > { > int ret = adv7511_cec_parse_dt(dev, adv7511); > > if (ret) > - return ret; > + goto disable_cec; > > adv7511->cec_adap = cec_allocate_adapter(&adv7511_cec_adap_ops, > adv7511, dev_name(dev), CEC_CAP_DEFAULTS, ADV7511_MAX_ADDRS); > - if (IS_ERR(adv7511->cec_adap)) > - return PTR_ERR(adv7511->cec_adap); > + if (IS_ERR(adv7511->cec_adap)) { > + ret = PTR_ERR(adv7511->cec_adap); > + goto fail; > + } > > regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, 0); > /* cec soft reset */ > @@ -329,9 +331,15 @@ int adv7511_cec_init(struct device *dev, struct adv7511 > *adv7511, ((adv7511->cec_clk_freq / 750000) - 1) << 2); > > ret = cec_register_adapter(adv7511->cec_adap, dev); > - if (ret) { > - cec_delete_adapter(adv7511->cec_adap); > - adv7511->cec_adap = NULL; > - } > - return ret; > + if (!ret) > + return; This confused me for an instant, I think a goto error_cec_delete would be clearer, but that's up to you (maybe I just wasn't awake enough). > + cec_delete_adapter(adv7511->cec_adap); > + adv7511->cec_adap = NULL; > + > +fail: Nitpicking, I'd name this error to match the labels in the probe function. > + dev_info(dev, "Initializing CEC failed with error %d, disabling CEC\n", > + ret); > +disable_cec: > + regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, > + ADV7511_CEC_CTRL_POWER_DOWN); > } > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index > 3a33075dbb22..2eb465827bcd 100644 > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c > @@ -1200,15 +1200,7 @@ static int adv7511_probe(struct i2c_client *i2c, > const struct i2c_device_id *id) adv7511_audio_init(dev, adv7511); > > offset = adv7511->type == ADV7533 ? ADV7533_REG_CEC_OFFSET : 0; > - > -#ifdef CONFIG_DRM_I2C_ADV7511_CEC > - ret = adv7511_cec_init(dev, adv7511, offset); > - if (ret) > - goto err_unregister_cec; > -#else > - regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL + offset, > - ADV7511_CEC_CTRL_POWER_DOWN); > -#endif > + adv7511_cec_init(dev, adv7511, offset); Now that the offset is only passed to this function, how about computing it in adv7511_cec_init() to store as much CEC code as possible in drivers/gpu/drm/ bridge/adv7511/adv7511_cec.c ? > > return 0; -- Regards, Laurent Pinchart From 1584628645796317020@xxx Mon Nov 20 23:14:00 +0000 2017 X-GM-THRID: 1584301987366027145 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread