From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91EEBC433DB for ; Fri, 22 Jan 2021 13:03:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5776C23444 for ; Fri, 22 Jan 2021 13:03:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727869AbhAVND1 (ORCPT ); Fri, 22 Jan 2021 08:03:27 -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-Google-Smtp-Source: ABdhPJzF7RWNhnyFcB3wiTOL99LPVoNx7wnkjoc35sgnKb4ToGcGD0ixlxJvCoN6a77ExsSS9LXd0zUSejjp8Wsij9U= 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 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 30890C433E0 for ; Fri, 22 Jan 2021 13:03:12 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D88EC23437 for ; Fri, 22 Jan 2021 13:03:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D88EC23437 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=raspberrypi.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=rdx0qfsX2WyYQbYhIuOK9nYQerWRnFd7DWr1xrsqLdo=; b=ntH65gv6RJqaUxiXxeFoj+ls7 x0SXCIF71tnXR4ilJZgdGHbOjt0kijaLTs6seGPCkfYn1sBFkOu8so/ujJp4uQT8PPjjFyDktGcB4 PdyYUuOAOwM2bbEJep9Z9e0zz0EqMCieVq9ED3pO8aKFdVI56HEjNWdrwxKLT/gMqIoyFKnbIrhjm M/yUlAk2dPrH1w1PPYbAcYBFomww90vUDs55h+TF4XNKqiHN5Bkk642AzE0XpEV/Wqrtc8hXjNGVe 2GXRbUQo0n4l2gI/AHznoCeTgdwPFkBOeDH9uAgSzv4JrA7VoFyzN3IdaJ/gVYCWuU9S2et/4q+M6 llEZLtEkg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2w4E-0000Te-So; Fri, 22 Jan 2021 13:01:34 +0000 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l2w4A-0000R6-Bn for linux-arm-kernel@lists.infradead.org; Fri, 22 Jan 2021 13:01:31 +0000 Received: by mail-wm1-x332.google.com with SMTP id y187so4271157wmd.3 for ; Fri, 22 Jan 2021 05:01:29 -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=X+ZX58cphMyK9bzcIYqzJv0GEe+n0QcL+U+yQH/DfoG/LGZUEmQI4yeF5Y5y7EXCD4 AqHLQsIz0QoWcSCeOKZDvCMmS6cLNup7o4GaMsLaZ8PtNtn3FPNePOCM2CT9zcfCim4l lpGUSeAC3n6Y6CjUBnBRwlnspABN294HrUGRhdZl3ZpwntnsPRF8NmwsGFwl3faLWpr0 bWZ4HFqTzekfh2I6CS9mVTJ5pxBt+2koAPZDZTXEv/czQxr/OF4+UqPdDG4OBQk6kUI8 Ar30CrZL6TDbnWJ5Vj075eEqPuOe2KiWxztlaL71onA3HVbEHG7zA6yNHe6WjGQ6Dhka CeJg== X-Gm-Message-State: AOAM5335VDeUC0U+m7v33MiUngoWRzyclEINQPJ3CLRcwVywgT9JQrRu eweetDu3DlpKmPjpHQxqOWk5kg5zE8nmMU+q1Xbi7A== X-Google-Smtp-Source: ABdhPJzF7RWNhnyFcB3wiTOL99LPVoNx7wnkjoc35sgnKb4ToGcGD0ixlxJvCoN6a77ExsSS9LXd0zUSejjp8Wsij9U= 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210122_080130_484904_11CEDA38 X-CRM114-Status: GOOD ( 21.31 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , Maarten Lankhorst , LKML , DRI Development , Eric Anholt , bcm-kernel-feedback-list@broadcom.com, linux-rpi-kernel@lists.infradead.org, Thomas Zimmermann , Hans Verkuil , Daniel Vetter , Mauro Carvalho Chehab , linux-arm-kernel@lists.infradead.org, Linux Media Mailing List Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F10DBC433E0 for ; Fri, 22 Jan 2021 13:01:31 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B4A08230FC for ; Fri, 22 Jan 2021 13:01:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B4A08230FC Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=raspberrypi.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 06D7389E0D; Fri, 22 Jan 2021 13:01:31 +0000 (UTC) Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by gabe.freedesktop.org (Postfix) with ESMTPS id 334E189E0D for ; Fri, 22 Jan 2021 13:01:30 +0000 (UTC) Received: by mail-wm1-x335.google.com with SMTP id i63so4234933wma.4 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=H1crXew14R+5/24ynt7EKR3Cyib4jO+g5v7Sf9r+rIumr8yWj9zKVj6wlzc0HX2I3J XudxDw3x0CYzMQZ/vosrl5Tg8GHNWzbNrwC4qim6mwvMcf0pczawLCjOx3otP0Oons/5 yw+CqtyuG41Yb6/wlXh2/vUZfj3CAzOsMw3GW0p40X473aKM2zJZFX3Mhtw5kCq2IQ9x dnIefAQcDn6Oux0j0FTK3Sb23ReCXNgvSMyWgLBiCxZcBNAQQi4zZODk07z2f2bjVYeZ Ao8tTNRcrWkxNoDjEVwJLPvzH0NItGx6fTZAuRCjlNwwUsoiC3mYR3SEu/fP5W/rdnH7 C8rA== X-Gm-Message-State: AOAM533bWbE6iTZoBs1WueVa1Suk50IqC4uVD0/f6ySIKABaKBMlVl0I TahN34QjKE8ZU2oFcMeYxV3f7XyLs5HNX+aj9TzCIg== X-Google-Smtp-Source: ABdhPJzF7RWNhnyFcB3wiTOL99LPVoNx7wnkjoc35sgnKb4ToGcGD0ixlxJvCoN6a77ExsSS9LXd0zUSejjp8Wsij9U= 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 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , LKML , DRI Development , bcm-kernel-feedback-list@broadcom.com, linux-rpi-kernel@lists.infradead.org, Thomas Zimmermann , Hans Verkuil , Daniel Vetter , Mauro Carvalho Chehab , linux-arm-kernel@lists.infradead.org, Linux Media Mailing List Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" 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 > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel