Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp259989pxb; Fri, 16 Apr 2021 05:08:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz4YRPV91x2SvaQTbxbRXHCL7epNN0sPbxKVSgguY9RuCrGxE3HYK2O/y50bUDp6usfLKsr X-Received: by 2002:a05:6402:706:: with SMTP id w6mr2729441edx.15.1618574921709; Fri, 16 Apr 2021 05:08:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618574921; cv=none; d=google.com; s=arc-20160816; b=d8PbEUe3UNdg35Ws/87YX1aYvmNTcN/ngsWPvYNQYDFA/WUyI8zRbK0mkIVbY2x/1r Ct8m/VBDuJO6H2QXwOPpVyx9t8Dv0BDZTg/bqnJqdZMVYVsRI3ID/olXJKJFBW/b9/u6 eL/WC+qnhwrztIuaIzjg2smLhjqMnvjIhgdIHXzp0zLCE/WIBlXyW2G6kpmn7RKXK7/y c9RcGYr8BRQADXBMWenVDyxGGT5OkHKbUqyqtnRsGffk3dULvjjjv8rbYh99Mt1pZR32 cjJV5/vry9/WRyu7niBc9RHOUDEwij+FD2VIgUAC2opKm7ZyJc1DEparUtOsdMeeKCuw /UCw== 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 :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id; bh=v+63l0Umk8ETP29tJ8qEANf3jDdFoqLZT3p6CAtfPw4=; b=NXNWFf7OHMWfyyLECOE6Ql11KID8fmCKKapr8IKFSYkS0kW5i70oEQ/pWF1ZV2OeKh puuRGrV2Oo4gdfVMujdwXvJPxUsd9ceHN3Bbrnq/SYVaxn/qpYmETKMNGyGrHd8t4dh9 L57lqnRRf13SfZ9CnIlOO0Ifab61LiITWDLgqNHz/YRmIA5NDANNEObPz6FvdeyOh7Gu 8Mn9GFqUD04YzupqRgqZacheWCBjKguuXRE5czpkVukiwpRPHVeTVm4hpTO19AjVCfcL DXiYt3bADE8E1JkzCtEFjfdzwMXJrUFYs8Olai9X4btxIthLDwXkiHjE8O6VWr4kyNKV vglw== 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 dt19si4283827ejc.144.2021.04.16.05.08.17; Fri, 16 Apr 2021 05:08:41 -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 S242503AbhDPKzD (ORCPT + 99 others); Fri, 16 Apr 2021 06:55:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51788 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242497AbhDPKzD (ORCPT ); Fri, 16 Apr 2021 06:55:03 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9FBBC061574 for ; Fri, 16 Apr 2021 03:54:38 -0700 (PDT) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lXM7C-0004vQ-27; Fri, 16 Apr 2021 12:54:22 +0200 Message-ID: <7bcbb787d82f21d42563d8fb7e3c2e7d40123932.camel@pengutronix.de> Subject: Re: [PATCH v9 03/13] media: hantro: Use syscon instead of 'ctrl' register From: Lucas Stach To: Benjamin Gaignard , ezequiel@collabora.com, p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, lee.jones@linaro.org, gregkh@linuxfoundation.org, mripard@kernel.org, paul.kocialkowski@bootlin.com, wens@csie.org, jernej.skrabec@siol.net, hverkuil-cisco@xs4all.nl, emil.l.velikov@gmail.com, "Peng Fan (OSS)" , Jacky Bai Cc: devel@driverdev.osuosl.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-imx@nxp.com, kernel@pengutronix.de, kernel@collabora.com, cphealy@gmail.com, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Date: Fri, 16 Apr 2021 12:54:16 +0200 In-Reply-To: <20210407073534.376722-4-benjamin.gaignard@collabora.com> References: <20210407073534.376722-1-benjamin.gaignard@collabora.com> <20210407073534.376722-4-benjamin.gaignard@collabora.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Mittwoch, dem 07.04.2021 um 09:35 +0200 schrieb Benjamin Gaignard: > In order to be able to share the control hardware block between > VPUs use a syscon instead a ioremap it in the driver. > To keep the compatibility with older DT if 'nxp,imx8mq-vpu-ctrl' > phandle is not found look at 'ctrl' reg-name. > With the method it becomes useless to provide a list of register > names so remove it. Sorry for putting a spoke in the wheel after many iterations of the series. We just discussed a way forward on how to handle the clocks and resets provided by the blkctl block on i.MX8MM and later and it seems there is a consensus on trying to provide virtual power domains from a blkctl driver, controlling clocks and resets for the devices in the power domain. I would like to avoid introducing yet another way of handling the blkctl and thus would like to align the i.MX8MQ VPU blkctl with what we are planning to do on the later chip generations. CC'ing Jacky Bai and Peng Fan from NXP, as they were going to give this virtual power domain thing a shot. Regards, Lucas > Signed-off-by: Benjamin Gaignard > Reviewed-by: Philipp Zabel > --- > version 9: >  - Corrections in commit message > > version 7: >  - Add Philipp reviewed-by tag. >  - Change syscon phandle name. >   > > > > version 5: >  - use syscon instead of VPU reset driver. >  - if DT doesn't provide syscon keep backward compatibilty by using >    'ctrl' reg-name. > >  drivers/staging/media/hantro/hantro.h | 5 +- >  drivers/staging/media/hantro/imx8m_vpu_hw.c | 52 ++++++++++++--------- >  2 files changed, 34 insertions(+), 23 deletions(-) > > diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h > index 6c1b888abe75..37b9ce04bd4e 100644 > --- a/drivers/staging/media/hantro/hantro.h > +++ b/drivers/staging/media/hantro/hantro.h > @@ -13,6 +13,7 @@ >  #define HANTRO_H_ >   > > > >  #include > +#include >  #include >  #include >  #include > @@ -167,7 +168,7 @@ hantro_vdev_to_func(struct video_device *vdev) >   * @reg_bases: Mapped addresses of VPU registers. >   * @enc_base: Mapped address of VPU encoder register for convenience. >   * @dec_base: Mapped address of VPU decoder register for convenience. > - * @ctrl_base: Mapped address of VPU control block. > + * @ctrl_base: Regmap of VPU control block. >   * @vpu_mutex: Mutex to synchronize V4L2 calls. >   * @irqlock: Spinlock to synchronize access to data structures >   * shared with interrupt handlers. > @@ -186,7 +187,7 @@ struct hantro_dev { >   void __iomem **reg_bases; >   void __iomem *enc_base; >   void __iomem *dec_base; > - void __iomem *ctrl_base; > + struct regmap *ctrl_base; >   > > > >   struct mutex vpu_mutex; /* video_device lock */ >   spinlock_t irqlock; > diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c > index c222de075ef4..8d0c3425234b 100644 > --- a/drivers/staging/media/hantro/imx8m_vpu_hw.c > +++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c > @@ -7,6 +7,7 @@ >   > > > >  #include >  #include > +#include >   > > > >  #include "hantro.h" >  #include "hantro_jpeg.h" > @@ -24,30 +25,28 @@ >  #define CTRL_G1_PP_FUSE 0x0c >  #define CTRL_G2_DEC_FUSE 0x10 >   > > > > +static const struct regmap_config ctrl_regmap_ctrl = { > + .reg_bits = 32, > + .val_bits = 32, > + .reg_stride = 0x14, > +}; > + >  static void imx8m_soft_reset(struct hantro_dev *vpu, u32 reset_bits) >  { > - u32 val; > - >   /* Assert */ > - val = readl(vpu->ctrl_base + CTRL_SOFT_RESET); > - val &= ~reset_bits; > - writel(val, vpu->ctrl_base + CTRL_SOFT_RESET); > + regmap_update_bits(vpu->ctrl_base, CTRL_SOFT_RESET, reset_bits, 0); >   > > > >   udelay(2); >   > > > >   /* Release */ > - val = readl(vpu->ctrl_base + CTRL_SOFT_RESET); > - val |= reset_bits; > - writel(val, vpu->ctrl_base + CTRL_SOFT_RESET); > + regmap_update_bits(vpu->ctrl_base, CTRL_SOFT_RESET, > + reset_bits, reset_bits); >  } >   > > > >  static void imx8m_clk_enable(struct hantro_dev *vpu, u32 clock_bits) >  { > - u32 val; > - > - val = readl(vpu->ctrl_base + CTRL_CLOCK_ENABLE); > - val |= clock_bits; > - writel(val, vpu->ctrl_base + CTRL_CLOCK_ENABLE); > + regmap_update_bits(vpu->ctrl_base, CTRL_CLOCK_ENABLE, > + clock_bits, clock_bits); >  } >   > > > >  static int imx8mq_runtime_resume(struct hantro_dev *vpu) > @@ -64,9 +63,9 @@ static int imx8mq_runtime_resume(struct hantro_dev *vpu) >   imx8m_clk_enable(vpu, CLOCK_G1 | CLOCK_G2); >   > > > >   /* Set values of the fuse registers */ > - writel(0xffffffff, vpu->ctrl_base + CTRL_G1_DEC_FUSE); > - writel(0xffffffff, vpu->ctrl_base + CTRL_G1_PP_FUSE); > - writel(0xffffffff, vpu->ctrl_base + CTRL_G2_DEC_FUSE); > + regmap_write(vpu->ctrl_base, CTRL_G1_DEC_FUSE, 0xffffffff); > + regmap_write(vpu->ctrl_base, CTRL_G1_PP_FUSE, 0xffffffff); > + regmap_write(vpu->ctrl_base, CTRL_G2_DEC_FUSE, 0xffffffff); >   > > > >   clk_bulk_disable_unprepare(vpu->variant->num_clocks, vpu->clocks); >   > > > > @@ -150,8 +149,22 @@ static irqreturn_t imx8m_vpu_g1_irq(int irq, void *dev_id) >   > > > >  static int imx8mq_vpu_hw_init(struct hantro_dev *vpu) >  { > - vpu->dec_base = vpu->reg_bases[0]; > - vpu->ctrl_base = vpu->reg_bases[vpu->variant->num_regs - 1]; > + struct device_node *np = vpu->dev->of_node; > + > + vpu->ctrl_base = syscon_regmap_lookup_by_phandle(np, "nxp,imx8m-vpu-ctrl"); > + if (IS_ERR(vpu->ctrl_base)) { > + struct resource *res; > + void __iomem *ctrl; > + > + res = platform_get_resource_byname(vpu->pdev, IORESOURCE_MEM, "ctrl"); > + ctrl = devm_ioremap_resource(vpu->dev, res); > + if (IS_ERR(ctrl)) > + return PTR_ERR(ctrl); > + > + vpu->ctrl_base = devm_regmap_init_mmio(vpu->dev, ctrl, &ctrl_regmap_ctrl); > + if (IS_ERR(vpu->ctrl_base)) > + return PTR_ERR(vpu->ctrl_base); > + } >   > > > >   return 0; >  } > @@ -198,7 +211,6 @@ static const struct hantro_irq imx8mq_irqs[] = { >  }; >   > > > >  static const char * const imx8mq_clk_names[] = { "g1", "g2", "bus" }; > -static const char * const imx8mq_reg_names[] = { "g1", "g2", "ctrl" }; >   > > > >  const struct hantro_variant imx8mq_vpu_variant = { >   .dec_fmts = imx8m_vpu_dec_fmts, > @@ -215,6 +227,4 @@ const struct hantro_variant imx8mq_vpu_variant = { >   .num_irqs = ARRAY_SIZE(imx8mq_irqs), >   .clk_names = imx8mq_clk_names, >   .num_clocks = ARRAY_SIZE(imx8mq_clk_names), > - .reg_names = imx8mq_reg_names, > - .num_regs = ARRAY_SIZE(imx8mq_reg_names) >  };