Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2266450pxp; Mon, 21 Mar 2022 15:22:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnR6jMkab1v/KgJexs6XBQk0rJ2Wcvi3npqhJrtamqlLP+ok6ILcLHQn+Ddy52afZ1jsCQ X-Received: by 2002:a17:902:c105:b0:154:81e0:529d with SMTP id 5-20020a170902c10500b0015481e0529dmr848519pli.1.1647901346491; Mon, 21 Mar 2022 15:22:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647901346; cv=none; d=google.com; s=arc-20160816; b=IDhkJsDevuZEYgaTbZEVnRfsR/cWxYS6pDE95E15kta8mq94NVbTqigzSmAJv5WjVu GUg44HPkAfJIvr9s9HM8FUTLdLOf8PxxuIjawME/tkqwLDXH5Dy8ar0sILHy7ux0gqBK xsrVdzMpNK8vKwxAy92rEi65uQYa53gslRrisWEY0MXU0pRNgh8S3MQOtU8qm9oG/t7g +8A0FX8hfP+gcpTrxE/nQesW/7T5MtvZI0UdWaBbcW3TfH4Ej5mV3NLC2ttGAZOC5Rfe pPDkQDJzhAg3AwH2wPQnWiEhVizm5oP7hIhHizaOcXE3YnMI68eV2pAxmen9aiEjXGLY wH1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=Dc08fHOeIpp/zqKHKPZcsQKX+E5+zliKb0EU1qA1Tx0=; b=IJuoTlwxpXbBlyFpbbivJYEP0HRaG1URN2jsJRaNeUR6+btbrogsNkb3MTyFkFZjpu NMihfjbG3QHmD5UxVGtVoG6Vx0TG9aBghrh7YF3283nlhVLc4nGCGbngontPLDPZY3eM F83+mbOyk/ANl11co/Jl7BIPGhHJ98C4/60cRgnpwolkHwIU31LsFILgRHUkc1NCzcfA g30ts+wk8J1AQ8cq5qKTun+7708DXdgUPv5ZX2wqRUI2OrHz9MBz2l5m44xInqhaEHRh B6HitJdaT3wNfMlZ57oah9l2nbog66/irSnxkNt4pRVZohsGwJsfd0ld5moyA7eFFDVS h7nA== ARC-Authentication-Results: i=1; mx.google.com; dkim=temperror (no key for signature) header.i=@pqrs.dk header.s=google header.b=a0XVexLe; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id c29-20020a634e1d000000b003816043ee95si1926487pgb.138.2022.03.21.15.22.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Mar 2022 15:22:26 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=temperror (no key for signature) header.i=@pqrs.dk header.s=google header.b=a0XVexLe; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id B551B38E35B; Mon, 21 Mar 2022 14:38:46 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243463AbiCSPcM (ORCPT + 99 others); Sat, 19 Mar 2022 11:32:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243461AbiCSPcL (ORCPT ); Sat, 19 Mar 2022 11:32:11 -0400 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C3F88762B8 for ; Sat, 19 Mar 2022 08:30:49 -0700 (PDT) Received: by mail-ej1-x633.google.com with SMTP id o10so3407768ejd.1 for ; Sat, 19 Mar 2022 08:30:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pqrs.dk; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=Dc08fHOeIpp/zqKHKPZcsQKX+E5+zliKb0EU1qA1Tx0=; b=a0XVexLezO0KguYm2Gfx89Md+UTJ5XcGyrHziGo50UtYBe1RMkXoom7mQVaGQ4AnIh xmqbMIDW8dukxw9SqzZxiSLnGrHDBluesCZARoLd2EWtdgwfueJtF+hMz/K7topgPAaW y2ukizh4bt/CmR39I4daF0gw7R++8CZhrJaXo= 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:mime-version :content-transfer-encoding; bh=Dc08fHOeIpp/zqKHKPZcsQKX+E5+zliKb0EU1qA1Tx0=; b=09cgtuZyAis50GkVS++MT+BFiX4vmFnxyDFbJoiJQ0natItmg9WaTIY9FOTvz4Qyez aNqGPsFDl8IFUvuT/zH8CXzQbFvH2QvEXuSvE1RJ62AqTl8zKAMjJXdQhih0DH9/+xcW 1FKKeV5Yrl8zGSGH4VWrFzyaxI+RF6271AaxX4uxivphUoHGBDesSXVwg1/vA5FGGb/Z +iZEcQca7EHUprunrsSDGcw3gUPirBaqqLUMk8is2p/EA3f4wn7PQEnB1nBq7VdifAwT 2X6gVO1BaKqoU7N3Bw9mYjBbWAHKqoqvblXk7gWpBlYUq8+vedzq4fsjOf3kIYUiHSwX 3p0w== X-Gm-Message-State: AOAM533eCtL1gO+uH+1gFRXosoC8t9OHRB6qEJFSRSJlqy6oT0v2IZ++ rvlRl5YAgs12BR86SUmsflP16A== X-Received: by 2002:a17:907:1690:b0:6db:325:3088 with SMTP id hc16-20020a170907169000b006db03253088mr13776392ejc.718.1647703847743; Sat, 19 Mar 2022 08:30:47 -0700 (PDT) Received: from capella.. (80.71.142.18.ipv4.parknet.dk. [80.71.142.18]) by smtp.gmail.com with ESMTPSA id f15-20020a50e08f000000b004134a121ed2sm5956000edl.82.2022.03.19.08.30.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Mar 2022 08:30:47 -0700 (PDT) From: =?UTF-8?q?Alvin=20=C5=A0ipraga?= To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , David Airlie , Daniel Vetter Cc: hans.verkuil@cisco.com, =?UTF-8?q?Alvin=20=C5=A0ipraga?= , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH] drm: bridge: adv7511: get edid in hpd_work to update CEC phys address Date: Sat, 19 Mar 2022 16:29:32 +0100 Message-Id: <20220319152932.995904-1-alvin@pqrs.dk> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alvin Šipraga The adv7511 driver is solely responsible for setting the physical address of its CEC adapter. To do this, it must read the EDID. However, EDID is only read when either the drm_bridge_funcs :: get_edid or drm_connector_helper_funcs :: get_modes ops are called. Without loss of generality, it cannot be assumed that these ops are called when a sink gets attached. Therefore there exist scenarios in which the CEC physical address will be invalid (f.f.f.f), rendering the CEC adapter inoperable. Address this problem by always fetching the EDID in the HPD work when we detect a connection. The CEC physical address is set in the process. Signed-off-by: Alvin Šipraga --- Hi, I'm sending this as an RFC patch because: - The added prototype is a bit crude, but I want feedback on the idea first before moving around a bunch of functions to avoid said prototype - I'm not sure if the rationale stated above is correct. I am not very familiar with the drm subsystem so perhaps there is something obvious that I am missing. At any rate, this solved the issue of an inoperable CEC adapter when the downstream MIPI-DSI was not used. I'm also wondering if this is robust enough to work when a sink just pulses HPD to signal that its EDID has changed. Currently the hotplug notifier is only invoked when the connected state changes (e.g. from disconnected to connected), and so I only check the EDID in such scenarios too. But is that always the case? Might we get an HPD interrupt and the connectivity state remains the same? Thanks in advance for any feedback. --- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index 005bf18682ff..fb4ca277e4be 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -424,6 +424,9 @@ static bool adv7511_hpd(struct adv7511 *adv7511) return false; } +static struct edid *adv7511_get_edid(struct adv7511 *adv7511, + struct drm_connector *connector); + static void adv7511_hpd_work(struct work_struct *work) { struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_work); @@ -457,6 +460,9 @@ static void adv7511_hpd_work(struct work_struct *work) if (adv7511->connector.dev) { if (status == connector_status_disconnected) cec_phys_addr_invalidate(adv7511->cec_adap); + else + adv7511_get_edid(adv7511, &adv7511->connector); + drm_kms_helper_hotplug_event(adv7511->connector.dev); } else { drm_bridge_hpd_notify(&adv7511->bridge, status); -- 2.35.1