Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1008026pxb; Fri, 22 Jan 2021 05:07:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJyzpXnFWMkfQJMf6s2BubpNwSibFjjeWZN+HqMlKZDXxDuuoTWmbrHenx3Uok3GK8SIQ+A9 X-Received: by 2002:a50:8b02:: with SMTP id l2mr3058189edl.322.1611320852312; Fri, 22 Jan 2021 05:07:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611320852; cv=none; d=google.com; s=arc-20160816; b=wrNILpFPieKeLTsrK368h87oZVwZR90Bzun3Cg+Qnl1MPjUGj5dQMGKR3VdUy0id5t FjEr5SckFZwgD3CQzfuomTgsR1Sank2FEyvj40wFeVbzCPlGiIoYHsRQDyMO+o4r5CLP Qy/QGmFv6YZbO+CK3vukPmz0E9zJ00KEITh+T43ceiZWDkb0uOaQXFY9j3Kkbe5NjbN9 7/fXsEmAYmtOxSZuFN8xILuno3Pr8cKrZOQzHDkuVqR1POe9t4ZeZI4i1fZBfmZl6JOE ED9iHozpJedjYiXGlD/LhW7vVpZNpWbb/V1DwjeHaf1GzdPYOKkGpikFokiqqB89kmOP K+NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=G0ng+OZa3Vuf9YdIl1xtH1whS14V+BAXkcJKtu9qil4=; b=wyXODXNpyCj8QAquwQIAD3m12rMtPaNLYmgzUQI25xj9mUAf7TmA+4yzgI+fGZl+QM 0Fu6PkW1sQXmEkuF/7ofeVhD22Axj5hxyJoD+GcHgSMx2K2myOc64pHg5u2vDlEoWCUH moKPQ47HSh4BbX+AtOESDjnf+6xxvOx1lScgtviE7FnRgd5qcGeKuNtZYW6YEVy4HyVc Ie8n5rg8St9PuMaIKL67cAxk+7/prZjdkErOhdK3fuTiw943cmlhnqTemyXHdU46NbCb gInlxZ6ZN2+Vf2bhIBiivOCYeMqd/WOp9SSZZwNCN6g6XXR7SfAOYKzE6dsiBB9ltFGj Guzw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@raspberrypi.com header.s=google header.b=LXlZLfwJ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=raspberrypi.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g3si4117059edp.148.2021.01.22.05.07.01; Fri, 22 Jan 2021 05:07:32 -0800 (PST) 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; dkim=pass header.i=@raspberrypi.com header.s=google header.b=LXlZLfwJ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=raspberrypi.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727301AbhAVNDG (ORCPT + 99 others); Fri, 22 Jan 2021 08:03:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727052AbhAVNCN (ORCPT ); Fri, 22 Jan 2021 08:02:13 -0500 Received: from mail-wm1-x32e.google.com (mail-wm1-x32e.google.com [IPv6:2a00:1450:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1B798C061786 for ; Fri, 22 Jan 2021 05:01:30 -0800 (PST) Received: by mail-wm1-x32e.google.com with SMTP id c128so4266056wme.2 for ; Fri, 22 Jan 2021 05:01:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=G0ng+OZa3Vuf9YdIl1xtH1whS14V+BAXkcJKtu9qil4=; b=LXlZLfwJlLR08wLynX4+9UKOdiejRTjAGFeteUdPwwTtFfGze69EjLcTnHIivc2oE0 pWyeJ5TOi/AmJ/V/Y+RAG+o85BEeP01Sae3w2FPv5ZAAXjzi/5IjFCdfUm912gi1gmdr 5jQsaQUCnkfISv7/pwttFGpQfK7kgff4Wpuy4zz5TBnAzpfCdL6YM5xcyYiL1wNDEKpw VInLcbeeehceKdChTuiYQSZbh6W87GC6ZwAAyft8TEEh7GokL5EV2BpWGU7KWzsp9HAr H2DBne6G3oOWM4eybQLbWOe8DumaaGT2I/6mg98kfj9Dtn6jKgJQlOJTRyL5GXY+9gpn a93g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=G0ng+OZa3Vuf9YdIl1xtH1whS14V+BAXkcJKtu9qil4=; b=EXlZ6G7KCweIqDi7MUZ1qrhjwA91TA8lZasIEP74/e9aqnbha8n9/6rZfEC2S+cg4S wOCpAo0VcLVOP2iy+SRb6AyMWUXdheARtdO2mN+ZDauz1IlHdPSbSbYqK9+Q3tPjQ2T0 /SZ2SCMhJwd66i6IRsMVQ7Vm729hTyfqRo8zbvMv5eyKTylNgnFctzar0BQmAIj+SxOT xwE7dvMx+EILdhI2S88Rj5Mg0jNVEstf0m4OoavPTAL6ng2hSA0GQV2+E8+HEqCBsVF3 wChUJruViZCHeUcJ78xCoKNicaE9S7OeaUe4B1JmfHhMrfLm04C5Ev3jkXuqPZAKYEdO XKBg== X-Gm-Message-State: AOAM531Xn2AEfOnwlKHDD15w8s5ybdm7hr2XM1vHNWIUpCGwlCFmJBVq iQONi0z0bPu3w4RoQVl3V4YdnfweN8USbtvc2tnx1w== X-Received: by 2002:a7b:cbd7:: with SMTP id n23mr3906940wmi.116.1611320488755; Fri, 22 Jan 2021 05:01:28 -0800 (PST) MIME-Version: 1.0 References: <20210111142309.193441-1-maxime@cerno.tech> <20210111142309.193441-10-maxime@cerno.tech> In-Reply-To: <20210111142309.193441-10-maxime@cerno.tech> From: Dave Stevenson Date: Fri, 22 Jan 2021 13:01:13 +0000 Message-ID: Subject: Re: [PATCH v2 09/15] drm/vc4: hdmi: Split the interrupt handlers To: Maxime Ripard Cc: Eric Anholt , Maarten Lankhorst , Thomas Zimmermann , Daniel Vetter , David Airlie , linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Hans Verkuil , LKML , DRI Development , bcm-kernel-feedback-list@broadcom.com, Mauro Carvalho Chehab , Linux Media Mailing List Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Maxime On Mon, 11 Jan 2021 at 14:23, Maxime Ripard wrote: > > The BCM2711 has two different interrupt sources to transmit and receive > CEC messages, provided through an external interrupt chip shared between > the two HDMI interrupt controllers. > > The rest of the CEC controller is identical though so we need to change > a bit the code organisation to share the code as much as possible, yet > still allowing to register independant handlers. s/independant/independent > > Signed-off-by: Maxime Ripard With that Reviewed-by: Dave Stevenson > --- > drivers/gpu/drm/vc4/vc4_hdmi.c | 86 +++++++++++++++++++++++++--------- > 1 file changed, 65 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c > index 7b5c92df8f1b..12ca5f3084af 100644 > --- a/drivers/gpu/drm/vc4/vc4_hdmi.c > +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c > @@ -1454,15 +1454,22 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) > } > > #ifdef CONFIG_DRM_VC4_HDMI_CEC > -static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) > +static irqreturn_t vc4_cec_irq_handler_rx_thread(int irq, void *priv) > { > struct vc4_hdmi *vc4_hdmi = priv; > > - if (vc4_hdmi->cec_irq_was_rx) { > - if (vc4_hdmi->cec_rx_msg.len) > - cec_received_msg(vc4_hdmi->cec_adap, > - &vc4_hdmi->cec_rx_msg); > - } else if (vc4_hdmi->cec_tx_ok) { > + if (vc4_hdmi->cec_rx_msg.len) > + cec_received_msg(vc4_hdmi->cec_adap, > + &vc4_hdmi->cec_rx_msg); > + > + return IRQ_HANDLED; > +} > + > +static irqreturn_t vc4_cec_irq_handler_tx_thread(int irq, void *priv) > +{ > + struct vc4_hdmi *vc4_hdmi = priv; > + > + if (vc4_hdmi->cec_tx_ok) { > cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, > 0, 0, 0, 0); > } else { > @@ -1476,6 +1483,19 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) > return IRQ_HANDLED; > } > > +static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) > +{ > + struct vc4_hdmi *vc4_hdmi = priv; > + irqreturn_t ret; > + > + if (vc4_hdmi->cec_irq_was_rx) > + ret = vc4_cec_irq_handler_rx_thread(irq, priv); > + else > + ret = vc4_cec_irq_handler_tx_thread(irq, priv); > + > + return ret; > +} > + > static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) > { > struct drm_device *dev = vc4_hdmi->connector.dev; > @@ -1500,31 +1520,55 @@ static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) > } > } > > +static irqreturn_t vc4_cec_irq_handler_tx_bare(int irq, void *priv) > +{ > + struct vc4_hdmi *vc4_hdmi = priv; > + u32 cntrl1; > + > + cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1); > + vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD; > + cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN; > + HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1); > + > + return IRQ_WAKE_THREAD; > +} > + > +static irqreturn_t vc4_cec_irq_handler_rx_bare(int irq, void *priv) > +{ > + struct vc4_hdmi *vc4_hdmi = priv; > + u32 cntrl1; > + > + vc4_hdmi->cec_rx_msg.len = 0; > + cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1); > + vc4_cec_read_msg(vc4_hdmi, cntrl1); > + cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF; > + HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1); > + cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF; > + > + HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1); > + > + return IRQ_WAKE_THREAD; > +} > + > static irqreturn_t vc4_cec_irq_handler(int irq, void *priv) > { > struct vc4_hdmi *vc4_hdmi = priv; > u32 stat = HDMI_READ(HDMI_CEC_CPU_STATUS); > - u32 cntrl1, cntrl5; > + irqreturn_t ret; > + u32 cntrl5; > > if (!(stat & VC4_HDMI_CPU_CEC)) > return IRQ_NONE; > - vc4_hdmi->cec_rx_msg.len = 0; > - cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1); > + > cntrl5 = HDMI_READ(HDMI_CEC_CNTRL_5); > vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT; > - if (vc4_hdmi->cec_irq_was_rx) { > - vc4_cec_read_msg(vc4_hdmi, cntrl1); > - cntrl1 |= VC4_HDMI_CEC_CLEAR_RECEIVE_OFF; > - HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1); > - cntrl1 &= ~VC4_HDMI_CEC_CLEAR_RECEIVE_OFF; > - } else { > - vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD; > - cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN; > - } > - HDMI_WRITE(HDMI_CEC_CNTRL_1, cntrl1); > + if (vc4_hdmi->cec_irq_was_rx) > + ret = vc4_cec_irq_handler_rx_bare(irq, priv); > + else > + ret = vc4_cec_irq_handler_tx_bare(irq, priv); > + > HDMI_WRITE(HDMI_CEC_CPU_CLEAR, VC4_HDMI_CPU_CEC); > - > - return IRQ_WAKE_THREAD; > + return ret; > } > > static int vc4_hdmi_cec_adap_enable(struct cec_adapter *adap, bool enable) > -- > 2.29.2 >