Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp6079744rwr; Tue, 9 May 2023 09:57:35 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ51iDU9G6ouWSwaj6wObFMZfE0+ZmiLSb2QmQwm447Rqxrx67WZiFf+ZPCVXSW9xWI8T6lS X-Received: by 2002:a17:902:da88:b0:1a6:d9de:1887 with SMTP id j8-20020a170902da8800b001a6d9de1887mr18505979plx.53.1683651454969; Tue, 09 May 2023 09:57:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683651454; cv=none; d=google.com; s=arc-20160816; b=iRKZyAv5CHp+4VBbXgpOnw5l59AulYkHd2AJChkFkI+WiaRidjC0ASU/7JAMhd6ysC G8UFN1fo9GwQjvG/ljHxqE9FMDQROH9YhkIVqIWrTnvU3BDQV17FtFZLBSDflTYW8+oT BEku96TdatzmiNTcOgZC9M2YPLWGUHyMsPWlkRGjJuEQRgQCeNvm3DrFoH9hVZ4Y7txh ZqNHiIEGqoxhKN9jG9KC5P82Tm9cGM0mw2grXLika1AYW/TgD0kfFJyJB60t7pQd0l7p wbDJCHWAKOD3GSUHTWaleiubhJM+3JvuVxdfN6zZUL4ygPovwjhDaDbhtH4fNl3wj1+n 69cA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=j6YaVZcFLrRREJc31GU25vmcyfYkbl/arBzNhRfohq8=; b=uHVsDG3/s9W+o10ILSTmuiCts4U08VM8PNnx5oqAyKlVOmv5JzUfaMDEaZcrTZXoML LLOBX2pbjg+XwO6wnUIP8HEv9GeIlneIWPPU5Z60SXQrU4pTUtBQjj/guiVB4D81aCj1 rdnDxIbU+358gbz63h8SZOB/mPRsIQo5rjtv+K2c+I6yD+NB1ROMRk7kXF7bW/UHG1C5 kdixy9hC4vZmLnfco4CsMnsoLlS5KKYdv2aPNqv99/+Lqjs4YGuXeU/QAdg96/4c5rDe +quJGZIaKuP5zyeZKu0z8Xx43I2AnlmfiLbJxQ9vlV0TIOJonv8ET5MzUdJBtAaSeZe6 e3FA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@z3ntu.xyz header.s=z3ntu header.b=C1toL+z2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=z3ntu.xyz Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l9-20020a170903120900b001aaf2ced278si2013906plh.430.2023.05.09.09.57.21; Tue, 09 May 2023 09:57:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@z3ntu.xyz header.s=z3ntu header.b=C1toL+z2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=z3ntu.xyz Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234299AbjEIQrv (ORCPT + 99 others); Tue, 9 May 2023 12:47:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234098AbjEIQrt (ORCPT ); Tue, 9 May 2023 12:47:49 -0400 Received: from mail.z3ntu.xyz (mail.z3ntu.xyz [128.199.32.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BC2A19B9; Tue, 9 May 2023 09:47:46 -0700 (PDT) Received: from g550jk.localnet (unknown [62.108.10.64]) by mail.z3ntu.xyz (Postfix) with ESMTPSA id 64EAFCCC1C; Tue, 9 May 2023 16:47:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=z3ntu.xyz; s=z3ntu; t=1683650864; bh=YmGG9f/8rs6Ur5dwQlDvBfm/MjPA8vPjlGeXn8jDq4U=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=C1toL+z2apKYOKaOtjqiM/Qvm+An9ikl14FEZm3O2cP3KsA4eoFCiqR9iricnsJ3Z dgne9CjGFeFX5smuW9AycrFBhjZ8CgvnNe8VxAmEWnxCbOCQDTYA70gBGP8OoSCRAr 4Yy80kpczNfND68B/hW+UDVQTlyOPm5Gt+epkr0I= From: Luca Weiss To: ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, Andy Gross , Bjorn Andersson , Konrad Dybcio , Rob Clark , Brian Masney , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Dmitry Baryshkov Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: Re: [PATCH 3/6] soc: qcom: ocmem: make iface clock optional Date: Tue, 09 May 2023 18:47:43 +0200 Message-ID: <3479852.e9J7NaK4W3@z3ntu.xyz> In-Reply-To: References: <20230506-msm8226-ocmem-v1-0-3e24e2724f01@z3ntu.xyz> <20230506-msm8226-ocmem-v1-3-3e24e2724f01@z3ntu.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham 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 On Montag, 8. Mai 2023 13:34:23 CEST Dmitry Baryshkov wrote: > On 07/05/2023 12:12, Luca Weiss wrote: > > Some platforms such as msm8226 do not have an iface clk. Since clk_bulk > > APIs don't offer to a way to treat some clocks as optional simply add > > core_clk and iface_clk members to our drvdata. > > What about using devm_clk_bulk_get_optional()? I think it would be > simpler this way. Using that function both clocks would be optional which may or may not be a bad idea. Not sure how much binding yaml and/or driver should try and catch bad usages of the driver. But honestly the current usage of the bulk API seems a bit clunky, we have a static array of clocks that we use (not in struct ocmem for some reason) and then we refer to the core clock by index? Feels better to just have the two clock references in the device struct and then we're good. Let me know. Regards Luca > > > Signed-off-by: Luca Weiss > > --- > > > > drivers/soc/qcom/ocmem.c | 42 ++++++++++++++++++++++++------------------ > > 1 file changed, 24 insertions(+), 18 deletions(-) > > > > diff --git a/drivers/soc/qcom/ocmem.c b/drivers/soc/qcom/ocmem.c > > index a11a955a1327..6235065d3bc9 100644 > > --- a/drivers/soc/qcom/ocmem.c > > +++ b/drivers/soc/qcom/ocmem.c > > @@ -54,6 +54,8 @@ struct ocmem { > > > > const struct ocmem_config *config; > > struct resource *memory; > > void __iomem *mmio; > > > > + struct clk *core_clk; > > + struct clk *iface_clk; > > > > unsigned int num_ports; > > unsigned int num_macros; > > bool interleaved; > > > > @@ -91,16 +93,6 @@ struct ocmem { > > > > #define OCMEM_PSGSC_CTL_MACRO2_MODE(val) FIELD_PREP(0x00000700, (val)) > > #define OCMEM_PSGSC_CTL_MACRO3_MODE(val) FIELD_PREP(0x00007000, (val)) > > > > -#define OCMEM_CLK_CORE_IDX 0 > > -static struct clk_bulk_data ocmem_clks[] = { > > - { > > - .id = "core", > > - }, > > - { > > - .id = "iface", > > - }, > > -}; > > - > > > > static inline void ocmem_write(struct ocmem *ocmem, u32 reg, u32 data) > > { > > > > writel(data, ocmem->mmio + reg); > > > > @@ -316,9 +308,15 @@ static int ocmem_dev_probe(struct platform_device > > *pdev)> > > ocmem->dev = dev; > > ocmem->config = device_get_match_data(dev); > > > > - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(ocmem_clks), ocmem_clks); > > - if (ret) > > - return dev_err_probe(dev, ret, "Unable to get clocks\n"); > > + ocmem->core_clk = devm_clk_get(dev, "core"); > > + if (IS_ERR(ocmem->core_clk)) > > + return dev_err_probe(dev, PTR_ERR(ocmem->core_clk), > > + "Unable to get core clock\n"); > > + > > + ocmem->iface_clk = devm_clk_get_optional(dev, "iface"); > > + if (IS_ERR(ocmem->iface_clk)) > > + return dev_err_probe(dev, PTR_ERR(ocmem->iface_clk), > > + "Unable to get iface clock\n"); > > > > ocmem->mmio = devm_platform_ioremap_resource_byname(pdev, "ctrl"); > > if (IS_ERR(ocmem->mmio)) > > > > @@ -333,11 +331,15 @@ static int ocmem_dev_probe(struct platform_device > > *pdev)> > > } > > > > /* The core clock is synchronous with graphics */ > > > > - WARN_ON(clk_set_rate(ocmem_clks[OCMEM_CLK_CORE_IDX].clk, 1000) < 0); > > + WARN_ON(clk_set_rate(ocmem->core_clk, 1000) < 0); > > + > > + ret = clk_prepare_enable(ocmem->core_clk); > > + if (ret) > > + return dev_err_probe(ocmem->dev, ret, "Failed to enable core clock\n"); > > > > - ret = clk_bulk_prepare_enable(ARRAY_SIZE(ocmem_clks), ocmem_clks); > > + ret = clk_prepare_enable(ocmem->iface_clk); > > > > if (ret) > > > > - return dev_err_probe(ocmem->dev, ret, "Failed to enable clocks\n"); > > + return dev_err_probe(ocmem->dev, ret, "Failed to enable iface > > clock\n"); > > > > if (qcom_scm_restore_sec_cfg_available()) { > > > > dev_dbg(dev, "configuring scm\n"); > > > > @@ -396,13 +398,17 @@ static int ocmem_dev_probe(struct platform_device > > *pdev)> > > return 0; > > > > err_clk_disable: > > - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); > > + clk_disable_unprepare(ocmem->core_clk); > > + clk_disable_unprepare(ocmem->iface_clk); > > > > return ret; > > > > } > > > > static int ocmem_dev_remove(struct platform_device *pdev) > > { > > > > - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); > > + struct ocmem *ocmem = platform_get_drvdata(pdev); > > + > > + clk_disable_unprepare(ocmem->core_clk); > > + clk_disable_unprepare(ocmem->iface_clk); > > > > return 0; > > > > }