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=-8.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 7C1F8C4CECE for ; Sat, 14 Mar 2020 00:41:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 561AF2074C for ; Sat, 14 Mar 2020 00:41:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="J19NXz25" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727705AbgCNAlL (ORCPT ); Fri, 13 Mar 2020 20:41:11 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:35941 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727703AbgCNAlL (ORCPT ); Fri, 13 Mar 2020 20:41:11 -0400 Received: by mail-pf1-f196.google.com with SMTP id i13so6306878pfe.3 for ; Fri, 13 Mar 2020 17:41:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=+YSW3mt80z9CCjuJH3Ji36iqGwKRMrlrk+wnvIOhyhk=; b=J19NXz25semJfpPmXTe2dsLok9m4rW42I1oyw5NHxb0O2a6Vjl62K+sZ9w/SQORQO9 L1Rbe1NFtubgURSHIWzm5RxqISGjxGR4aJkxCdsPpHwp8ezEA3nD9X8jjMILcriSbUgm f771O4qHMnRMrjejAFe65UCv5+yRetWPts7QI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=+YSW3mt80z9CCjuJH3Ji36iqGwKRMrlrk+wnvIOhyhk=; b=X0laWFBhNIps8JlyAhKoO0fdhm27olrYi/Ywcd10hMFraO1TLn1W4nvTY0Lcw1RqQY 8iaqbzvU6nPtTZpnZ+jJaRnpIUxLa6f23HjrPjW4ceU6XDGw+h6xsaG3MeiWQRVK0F6h Ueph9OKobnN+o2dgb17+qy0nvqAYR5jYOM6AWemi3kA2pOsLNh17i2MWNG4eDQHuqfft LSInE5YUlbrYrtYyiZROAG+Lwj04AfeqUt7jeZJqs4xfuYTILOGYzqvpnbFkYCjd1iIw 03724q/K6OW3z8I5DO9nuDSwmavBmMR+WtHKbjY+cAGElTqy/1SxdciYkcyorXyMKy9x b8aA== X-Gm-Message-State: ANhLgQ1RU6zYRZW8lhcoYG0/fSCz9Lemd3KI/FUwk1+47CF2V9Ck5PQS kv/jEkaOC9SCerBX08yb+EXmGA== X-Google-Smtp-Source: ADFU+vuslQLGf4xcYGRQe1z6Yvr3ZzcUBM4XSOaWv9bdeBRUPS3wI9MzredWsYK1bA8n9Q8+YpIbDg== X-Received: by 2002:aa7:914b:: with SMTP id 11mr16871749pfi.69.1584146468392; Fri, 13 Mar 2020 17:41:08 -0700 (PDT) Received: from localhost ([2620:15c:202:1:4fff:7a6b:a335:8fde]) by smtp.gmail.com with ESMTPSA id q30sm13469970pjh.5.2020.03.13.17.41.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 13 Mar 2020 17:41:07 -0700 (PDT) Date: Fri, 13 Mar 2020 17:41:06 -0700 From: Matthias Kaehlcke To: Akash Asthana Cc: gregkh@linuxfoundation.org, agross@kernel.org, bjorn.andersson@linaro.org, wsa@the-dreams.de, broonie@kernel.org, mark.rutland@arm.com, robh+dt@kernel.org, linux-i2c@vger.kernel.org, linux-spi@vger.kernel.org, devicetree@vger.kernel.org, swboyd@chromium.org, mgautam@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-serial@vger.kernel.org, dianders@chromium.org, evgreen@chromium.org Subject: Re: [PATCH V2 6/8] spi: spi-geni-qcom: Add interconnect support Message-ID: <20200314004106.GM144492@google.com> References: <1584105134-13583-1-git-send-email-akashast@codeaurora.org> <1584105134-13583-7-git-send-email-akashast@codeaurora.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1584105134-13583-7-git-send-email-akashast@codeaurora.org> User-Agent: Mutt/1.12.2 (2019-09-21) Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Akash, On Fri, Mar 13, 2020 at 06:42:12PM +0530, Akash Asthana wrote: > Get the interconnect paths for SPI based Serial Engine device > and vote according to the current bus speed of the driver. > > Signed-off-by: Akash Asthana > --- > - As per Bjorn's comment, removed se == NULL check from geni_spi_icc_get > - As per Bjorn's comment, removed code to set se->icc_path* to NULL in failure > - As per Bjorn's comment, introduced and using devm_of_icc_get API for getting > path handle > - As per Matthias comment, added error handling for icc_set_bw call > > drivers/spi/spi-geni-qcom.c | 74 ++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 73 insertions(+), 1 deletion(-) > > diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c > index c397242..09c4709 100644 > --- a/drivers/spi/spi-geni-qcom.c > +++ b/drivers/spi/spi-geni-qcom.c > @@ -118,6 +118,19 @@ static int get_spi_clk_cfg(unsigned int speed_hz, > return ret; > } > > +static int geni_spi_icc_get(struct geni_se *se) > +{ > + se->icc_path_geni_to_core = devm_of_icc_get(se->dev, "qup-core"); > + if (IS_ERR(se->icc_path_geni_to_core)) > + return PTR_ERR(se->icc_path_geni_to_core); > + > + se->icc_path_cpu_to_geni = devm_of_icc_get(se->dev, "qup-config"); > + if (IS_ERR(se->icc_path_cpu_to_geni)) > + return PTR_ERR(se->icc_path_cpu_to_geni); > + > + return 0; > +} As per my comments on (https://patchwork.kernel.org/patch/11436895/#23222713), the above function could be replaced by calling a 'geni_icc_get()' (or so, to be created) provided by the geni SE driver. > + > static void handle_fifo_timeout(struct spi_master *spi, > struct spi_message *msg) > { > @@ -234,6 +247,20 @@ static int setup_fifo_params(struct spi_device *spi_slv, > return ret; > } > > + /* > + * Set BW quota for CPU as driver supports FIFO mode only. > + * Assume peak bw as twice of avg bw. > + */ > + se->avg_bw_cpu = Bps_to_icc(mas->cur_speed_hz); > + se->peak_bw_cpu = Bps_to_icc(2 * mas->cur_speed_hz); > + ret = icc_set_bw(se->icc_path_cpu_to_geni, se->avg_bw_cpu, > + se->peak_bw_cpu); > + if (ret) { > + dev_err(mas->dev, "%s: ICC BW voting failed for cpu\n", > + __func__); > + return ret; > + } > + > clk_sel = idx & CLK_SEL_MSK; > m_clk_cfg = (div << CLK_DIV_SHFT) | SER_CLK_EN; > spi_setup_word_len(mas, spi_slv->mode, spi_slv->bits_per_word); > @@ -578,6 +605,15 @@ static int spi_geni_probe(struct platform_device *pdev) > spin_lock_init(&mas->lock); > pm_runtime_enable(dev); > > + ret = geni_spi_icc_get(&mas->se); > + if (ret) > + goto spi_geni_probe_runtime_disable; > + /* Set the bus quota to a reasonable value for register access */ > + mas->se.avg_bw_core = Bps_to_icc(CORE_2X_50_MHZ); > + mas->se.peak_bw_core = Bps_to_icc(CORE_2X_100_MHZ); > + mas->se.avg_bw_cpu = Bps_to_icc(1000); > + mas->se.peak_bw_cpu = Bps_to_icc(1000); > + > ret = spi_geni_init(mas); > if (ret) > goto spi_geni_probe_runtime_disable; > @@ -616,14 +652,50 @@ static int __maybe_unused spi_geni_runtime_suspend(struct device *dev) > { > struct spi_master *spi = dev_get_drvdata(dev); > struct spi_geni_master *mas = spi_master_get_devdata(spi); > + int ret; > + > + ret = geni_se_resources_off(&mas->se); > + if (ret) > + return ret; > > - return geni_se_resources_off(&mas->se); > + ret = icc_set_bw(mas->se.icc_path_geni_to_core, 0, 0); > + if (ret) { > + dev_err_ratelimited(mas->dev, "%s: ICC BW remove failed for core\n", > + __func__); > + return ret; > + } > + > + ret = icc_set_bw(mas->se.icc_path_cpu_to_geni, 0, 0); > + if (ret) { > + dev_err_ratelimited(mas->dev, "%s: ICC BW remove failed for cpu\n", > + __func__); > + return ret; > + } the ICC stuff above would become: ret = geni_icc_vote_off(&mas->se); if (ret) return ret; with the consolidated code in geni SE. > + > + return 0; > } > > static int __maybe_unused spi_geni_runtime_resume(struct device *dev) > { > struct spi_master *spi = dev_get_drvdata(dev); > struct spi_geni_master *mas = spi_master_get_devdata(spi); > + int ret; > + > + ret = icc_set_bw(mas->se.icc_path_geni_to_core, mas->se.avg_bw_core, > + mas->se.peak_bw_core); > + if (ret) { > + dev_err_ratelimited(mas->dev, "%s: ICC BW voting failed for core\n", > + __func__); > + return ret; > + } > + > + ret = icc_set_bw(mas->se.icc_path_cpu_to_geni, mas->se.avg_bw_cpu, > + mas->se.peak_bw_cpu); > + if (ret) { > + dev_err_ratelimited(mas->dev, "%s: ICC BW voting failed for cpu\n", > + __func__); > + return ret; > + } and this: ret = geni_icc_vote_on(&mas->se); if (ret) return ret; > return geni_se_resources_on(&mas->se); possibly you could even do the ICC voting from geni_se_resources_on/off() it seems the two are always done together for UART, I2C and SPI.