Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp3460359pxb; Mon, 4 Apr 2022 17:41:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz6iIwlG6BAFpZdwH/aKQSsaCf5YT9lXNZg10MlufSuHRJsKWdDauwhQycJO/iVOp17rfm0 X-Received: by 2002:a17:902:d48c:b0:156:956e:4588 with SMTP id c12-20020a170902d48c00b00156956e4588mr739057plg.105.1649119305981; Mon, 04 Apr 2022 17:41:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649119305; cv=none; d=google.com; s=arc-20160816; b=pTZFVD+im0huNTYi7QAHv16WPum9sB1U5VxDH21Hbcu2MqhM/pRjdO2XiDccX2QhIp 0KJ15gZpc4/7bgGePuzrEpGhCPoBzIGKA8P//D5hQgYdSqke/8kJpcq9m1QTo1l46eDZ GUuvMJNJlvbbsGttZCOzzMA3vF1sweK0zBXPoz7et9z8gd0E9zVJCOuGZA5m3jaGGBGb eko1dgmXDxTS9+z1IQjvJBjUPahRbJUwsLRhScZ9OCcyBcyl/svhzjCtZOefz/3n53ex WVwstvW3esEMg8qVLbcjQViwyWeKoHv0HTDb3kFlrUAHVSgLo8GNMMcO7OfAL+YcdJk9 AWMA== 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 :organization:references:in-reply-to:message-id:subject:cc:to:from :date:dkim-signature; bh=c0zr7u2ZGW8b7dHqUeFZDVs8y9pfDOaTguMgL52CwSQ=; b=lNG+b3hhkv1jt5B97qnL9bKvotmPo9HhV/vFw8QwDo4eFc9L26KjuF5ENFfKpzvyVT vX2tyB4gyJKGsiazi1YNs4u1fnChqskE4EGgZCabQOT65Xef2qcLR1jfyXqTVHJ+TUlM 2jXoKidryoHFmf+8g8r98+ACjMzypfDK5vUbrR7pT8jssFrxDe2JBtOqS8P/kVmBUq2g xDegX/XaB5M7TPmXLOJGyS9LYI+BhWG0lfBT4jRZ8nw5PWz+q4dalhUukj64EkFSDjmj no7x1M2bqSP1hqtnGRHC540S0VTgfki/6vX65bHp7FjagnNe5hlGE2GmIAn97cWKpS7G BwTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=mNvAz6VX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id pc2-20020a17090b3b8200b001c97d373310si591890pjb.102.2022.04.04.17.41.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Apr 2022 17:41:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=mNvAz6VX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 7FE6C95A2D; Mon, 4 Apr 2022 16:55:33 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238089AbiDDIc6 (ORCPT + 99 others); Mon, 4 Apr 2022 04:32:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48442 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238183AbiDDIci (ORCPT ); Mon, 4 Apr 2022 04:32:38 -0400 Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1D1F3584C; Mon, 4 Apr 2022 01:30:40 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id A5B9D2000D; Mon, 4 Apr 2022 08:30:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1649061038; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=c0zr7u2ZGW8b7dHqUeFZDVs8y9pfDOaTguMgL52CwSQ=; b=mNvAz6VXb3UrSawFLoHLhwcW5kR0Ctm1Y4waL3DSwT6opGruoUUiAuaqXA6kibzEb1O9Ah ZYAd/WILTHfI41H4Cy4QCswuL5xBcLurwaeDRWrqp/QXKd+jcsD9e0XzI7R87MAfgV3VIR y1BrI/WIhto3s06zapyK0ngt2z7U1XXyle05/VL1Sgqm34jjFxf4HL/Wsti3YvV+V6Lwgq Vlqf/3D99xE6KrMFxFGcThuJFqssnri/hlMcGIR3fVp5dL4vBBZ7eiHgbtzWNS7SxSWTPo phdpK/cQT7YprV1vf4oi3sXNN4Dn3detD3qkvxH9S6Ft/y/RwCUGbCxEv6NcXg== Date: Mon, 4 Apr 2022 10:30:34 +0200 From: Miquel Raynal To: Liang Yang Cc: , Rob Herring , Richard Weinberger , Vignesh Raghavendra , Jerome Brunet , Neil Armstrong , Martin Blumenstingl , Kevin Hilman , Jianxin Pan , Victor Wan , XianWei Zhao , Kelvin Zhang , BiChao Zheng , YongHui Yu , , , , Subject: Re: [PATCH v4 1/2] mtd: rawnand: meson: discard the common MMC sub clock framework Message-ID: <20220404103034.48ec16b1@xps13> In-Reply-To: <20220402074921.13316-2-liang.yang@amlogic.com> References: <20220402074921.13316-1-liang.yang@amlogic.com> <20220402074921.13316-2-liang.yang@amlogic.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,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 Hi Liang, liang.yang@amlogic.com wrote on Sat, 2 Apr 2022 15:49:19 +0800: > EMMC and NAND have the same clock control register named 'SD_EMMC_CLOCK' = which is > defined in EMMC port internally. bit0~5 of 'SD_EMMC_CLOCK' is the divider= and > bit6~7 is the mux for fix pll and xtal.A common MMC and NAND sub-clock ha= s been > implemented and can be used by the eMMC and NAND controller (which are mu= tually > exclusive anyway). Let's use this new clock. >=20 > Signed-off-by: Liang Yang > --- > drivers/mtd/nand/raw/meson_nand.c | 89 +++++++++++++++---------------- > 1 file changed, 42 insertions(+), 47 deletions(-) >=20 > diff --git a/drivers/mtd/nand/raw/meson_nand.c b/drivers/mtd/nand/raw/mes= on_nand.c > index ac3be92872d0..1b1a9407fb2f 100644 > --- a/drivers/mtd/nand/raw/meson_nand.c > +++ b/drivers/mtd/nand/raw/meson_nand.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -19,6 +20,7 @@ > #include > #include > #include > +#include > #include > =20 > #define NFC_REG_CMD 0x00 > @@ -104,6 +106,9 @@ > =20 > #define PER_INFO_BYTE 8 > =20 > +#define CLK_DIV_SHIFT 0 > +#define CLK_DIV_WIDTH 6 > + > struct meson_nfc_nand_chip { > struct list_head node; > struct nand_chip nand; > @@ -151,15 +156,15 @@ struct meson_nfc { > struct nand_controller controller; > struct clk *core_clk; > struct clk *device_clk; > - struct clk *phase_tx; > - struct clk *phase_rx; > + struct clk *nand_clk; > + struct clk_divider nand_divider; > =20 > unsigned long clk_rate; > u32 bus_timing; > =20 > struct device *dev; > void __iomem *reg_base; > - struct regmap *reg_clk; > + void __iomem *sd_emmc_clock; > struct completion completion; > struct list_head chips; > const struct meson_nfc_data *data; > @@ -235,7 +240,7 @@ static void meson_nfc_select_chip(struct nand_chip *n= and, int chip) > nfc->timing.tbers_max =3D meson_chip->tbers_max; > =20 > if (nfc->clk_rate !=3D meson_chip->clk_rate) { > - ret =3D clk_set_rate(nfc->device_clk, meson_chip->clk_rate); > + ret =3D clk_set_rate(nfc->nand_clk, meson_chip->clk_rate); > if (ret) { > dev_err(nfc->dev, "failed to set clock rate\n"); > return; > @@ -406,7 +411,6 @@ static int meson_nfc_queue_rb(struct meson_nfc *nfc, = int timeout_ms) > cmd =3D NFC_CMD_RB | NFC_CMD_RB_INT > | nfc->param.chip_select | nfc->timing.tbers_max; > writel(cmd, nfc->reg_base + NFC_REG_CMD); > - Please avoid these spacing changes in the middle of a commit. > ret =3D wait_for_completion_timeout(&nfc->completion, > msecs_to_jiffies(timeout_ms)); > if (ret =3D=3D 0) > @@ -985,9 +989,11 @@ static const struct mtd_ooblayout_ops meson_ooblayou= t_ops =3D { > .free =3D meson_ooblayout_free, > }; > =20 > +struct clk_parent_data nfc_divider_parent_data[1]; > static int meson_nfc_clk_init(struct meson_nfc *nfc) > { > int ret; > + struct clk_init_data init =3D {0}; > =20 > /* request core clock */ > nfc->core_clk =3D devm_clk_get(nfc->dev, "core"); > @@ -1002,21 +1008,26 @@ static int meson_nfc_clk_init(struct meson_nfc *n= fc) > return PTR_ERR(nfc->device_clk); > } > =20 > - nfc->phase_tx =3D devm_clk_get(nfc->dev, "tx"); > - if (IS_ERR(nfc->phase_tx)) { > - dev_err(nfc->dev, "failed to get TX clk\n"); > - return PTR_ERR(nfc->phase_tx); > - } > - > - nfc->phase_rx =3D devm_clk_get(nfc->dev, "rx"); > - if (IS_ERR(nfc->phase_rx)) { > - dev_err(nfc->dev, "failed to get RX clk\n"); > - return PTR_ERR(nfc->phase_rx); > - } > + init.name =3D devm_kstrdup(nfc->dev, "nfc#div", GFP_KERNEL); > + init.ops =3D &clk_divider_ops; > + nfc_divider_parent_data[0].fw_name =3D "device"; > + init.parent_data =3D nfc_divider_parent_data; > + init.num_parents =3D 1; > + nfc->nand_divider.reg =3D nfc->sd_emmc_clock; > + nfc->nand_divider.shift =3D CLK_DIV_SHIFT; > + nfc->nand_divider.width =3D CLK_DIV_WIDTH; > + nfc->nand_divider.hw.init =3D &init; > + nfc->nand_divider.flags =3D CLK_DIVIDER_ONE_BASED | > + CLK_DIVIDER_ROUND_CLOSEST | > + CLK_DIVIDER_ALLOW_ZERO; > + > + nfc->nand_clk =3D devm_clk_register(nfc->dev, &nfc->nand_divider.hw); > + if (IS_ERR(nfc->nand_clk)) > + return PTR_ERR(nfc->nand_clk); > =20 > /* init SD_EMMC_CLOCK to sane defaults w/min clock rate */ > - regmap_update_bits(nfc->reg_clk, > - 0, CLK_SELECT_NAND, CLK_SELECT_NAND); > + writel(CLK_SELECT_NAND | readl(nfc->sd_emmc_clock), > + nfc->sd_emmc_clock); > =20 > ret =3D clk_prepare_enable(nfc->core_clk); > if (ret) { > @@ -1030,29 +1041,21 @@ static int meson_nfc_clk_init(struct meson_nfc *n= fc) > goto err_device_clk; > } > =20 > - ret =3D clk_prepare_enable(nfc->phase_tx); > + ret =3D clk_prepare_enable(nfc->nand_clk); > if (ret) { > - dev_err(nfc->dev, "failed to enable TX clock\n"); > - goto err_phase_tx; > + dev_err(nfc->dev, "pre enable NFC divider fail\n"); > + goto err_nand_clk; > } > =20 > - ret =3D clk_prepare_enable(nfc->phase_rx); > - if (ret) { > - dev_err(nfc->dev, "failed to enable RX clock\n"); > - goto err_phase_rx; > - } > - > - ret =3D clk_set_rate(nfc->device_clk, 24000000); > + ret =3D clk_set_rate(nfc->nand_clk, 24000000); Is this rename really useful? > if (ret) > - goto err_disable_rx; > + goto err_disable_clk; > =20 > return 0; > =20 > -err_disable_rx: > - clk_disable_unprepare(nfc->phase_rx); > -err_phase_rx: > - clk_disable_unprepare(nfc->phase_tx); > -err_phase_tx: > +err_disable_clk: > + clk_disable_unprepare(nfc->nand_clk); > +err_nand_clk: > clk_disable_unprepare(nfc->device_clk); > err_device_clk: > clk_disable_unprepare(nfc->core_clk); > @@ -1061,8 +1064,7 @@ static int meson_nfc_clk_init(struct meson_nfc *nfc) > =20 > static void meson_nfc_disable_clk(struct meson_nfc *nfc) > { > - clk_disable_unprepare(nfc->phase_rx); > - clk_disable_unprepare(nfc->phase_tx); > + clk_disable_unprepare(nfc->nand_clk); > clk_disable_unprepare(nfc->device_clk); > clk_disable_unprepare(nfc->core_clk); > } > @@ -1374,7 +1376,6 @@ static int meson_nfc_probe(struct platform_device *= pdev) > { > struct device *dev =3D &pdev->dev; > struct meson_nfc *nfc; > - struct resource *res; > int ret, irq; > =20 > nfc =3D devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); > @@ -1388,21 +1389,15 @@ static int meson_nfc_probe(struct platform_device= *pdev) > nand_controller_init(&nfc->controller); > INIT_LIST_HEAD(&nfc->chips); > init_completion(&nfc->completion); > - Please don't modify spacing in this commit. > nfc->dev =3D dev; > =20 > - res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); > - nfc->reg_base =3D devm_ioremap_resource(dev, res); > + nfc->reg_base =3D devm_platform_ioremap_resource_byname(pdev, "nfc"); This change seems unrelated. > if (IS_ERR(nfc->reg_base)) > return PTR_ERR(nfc->reg_base); > =20 > - nfc->reg_clk =3D > - syscon_regmap_lookup_by_phandle(dev->of_node, > - "amlogic,mmc-syscon"); > - if (IS_ERR(nfc->reg_clk)) { > - dev_err(dev, "Failed to lookup clock base\n"); > - return PTR_ERR(nfc->reg_clk); > - } > + nfc->sd_emmc_clock =3D devm_platform_ioremap_resource_byname(pdev, "emm= c"); > + if (IS_ERR(nfc->sd_emmc_clock)) > + return PTR_ERR(nfc->sd_emmc_clock); While I agree this is much better than the previous solution, we cannot break DT compatibility, so you need to try getting the emmc clock, but if it fails you should fallback to the regmap lookup. > =20 > irq =3D platform_get_irq(pdev, 0); > if (irq < 0) Thanks, Miqu=C3=A8l