From patchwork Wed Feb 3 09:23:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hsin-Yi Wang X-Patchwork-Id: 12063881 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=-19.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, 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,USER_AGENT_GIT 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 C75EBC433E0 for ; Wed, 3 Feb 2021 09:27:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6841564F49 for ; Wed, 3 Feb 2021 09:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232815AbhBCJ0u (ORCPT ); Wed, 3 Feb 2021 04:26:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45834 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233379AbhBCJYt (ORCPT ); Wed, 3 Feb 2021 04:24:49 -0500 Received: from mail-pg1-x534.google.com (mail-pg1-x534.google.com [IPv6:2607:f8b0:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D3CA0C0613D6 for ; Wed, 3 Feb 2021 01:24:08 -0800 (PST) Received: by mail-pg1-x534.google.com with SMTP id o16so16920396pgg.5 for ; Wed, 03 Feb 2021 01:24:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HZ6BkzwJWuysG9Ncleyt9tGqJKvRpmo0CkvfsB7TcKk=; b=Ann/UFGcEilfP4bbNvsmSpXNxAD6le02tln9ZZDTT8t0N8m2tunukhf/ECBfEAztwT 78yf8YtmRnWyKRPunIopa4FAFk1DgkrmMMr65nbMX+wzzIvrTfxHI4M5JJf/cdZDFerJ 1bDMnebwuCPZ86HY5vFXTJ7EJ+w5FFdCEkB9g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HZ6BkzwJWuysG9Ncleyt9tGqJKvRpmo0CkvfsB7TcKk=; b=gjrmMWS3xkWzv3crgHE8KoCSPkbDIRwY58+fnmeLeND8E9NNjkmQj/4SlyVZvlk8sz eVpDglIbV/Dj7ZX0XiqU/FqGDzAdnYnZNY5+XY3ElwQXhTMPT4Ey6seJVzAEFwpyWyhg 43mDE9eZ+J/ypIqjG7Iyg8O3J4MeV61jlJAkv6bUD900fr5D2h4vouFhKGl7/KsLKhCN MEtMkm6y7ejHFHiAGyW956EG35ISEraMOuQIXcxf54zqHGrksuRbYS8AT1Qbk3aW06oP ns7f8x75CZn0tj+7a0GWSsi2ulh3dDPyRJBTyjWndSvUgaqgiCvxA+V1zz8N+1axxH31 Jp3Q== X-Gm-Message-State: AOAM530Le6yj4FsPrHimQoz9kvgqCToRyXIZ6YDFYaoLZ2fDiribJhLV 4RUjNYrOQOk32/3G9tlz9gE6sA== X-Google-Smtp-Source: ABdhPJz/j4xh8w6XxMxxJwJ/o/Xf5CJ9htyCuf1i+pbedtZmRSmpT/VYjt4uWrexiDblCLNIHx5RRQ== X-Received: by 2002:a62:7650:0:b029:1bb:aa42:aa96 with SMTP id r77-20020a6276500000b02901bbaa42aa96mr2211330pfc.33.1612344248257; Wed, 03 Feb 2021 01:24:08 -0800 (PST) Received: from hsinyi-z840.tpe.corp.google.com ([2401:fa00:1:10:743e:7944:50c8:ff72]) by smtp.gmail.com with ESMTPSA id u20sm932294pjy.36.2021.02.03.01.24.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Feb 2021 01:24:07 -0800 (PST) From: Hsin-Yi Wang To: Viresh Kumar , linux-pm@vger.kernel.org Cc: Nishanth Menon , Stephen Boyd , "Rafael J . Wysocki" , linux-kernel@vger.kernel.org, "MyungJoo Ham )" , Kyungmin Park , Chanwoo Choi , Saravana Kannan Subject: [PATCH v5 1/3] OPP: Add function to look up required OPP's for a given OPP Date: Wed, 3 Feb 2021 17:23:58 +0800 Message-Id: <20210203092400.1791884-2-hsinyi@chromium.org> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog In-Reply-To: <20210203092400.1791884-1-hsinyi@chromium.org> References: <20210203092400.1791884-1-hsinyi@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Saravana Kannan Add a function that allows looking up required OPPs given a source OPP table, destination OPP table and the source OPP. Signed-off-by: Saravana Kannan Signed-off-by: Hsin-Yi Wang --- drivers/opp/core.c | 58 ++++++++++++++++++++++++++++++++++++++++++ include/linux/pm_opp.h | 11 ++++++++ 2 files changed, 69 insertions(+) diff --git a/drivers/opp/core.c b/drivers/opp/core.c index dc95d29e94c1b..878f066b972cc 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -2398,6 +2398,64 @@ devm_pm_opp_attach_genpd(struct device *dev, const char **names, } EXPORT_SYMBOL_GPL(devm_pm_opp_attach_genpd); +/** + * dev_pm_opp_xlate_required_opp() - Find required OPP for @src_table OPP. + * @src_table: OPP table which has @dst_table as one of its required OPP table. + * @dst_table: Required OPP table of the @src_table. + * + * This function returns the OPP (present in @dst_table) pointed out by the + * "required-opps" property of the OPP (present in @src_table). + * + * The callers are required to call dev_pm_opp_put() for the returned OPP after + * use. + * + * Return: destination table OPP on success, otherwise NULL on errors. + */ +struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, + struct opp_table *dst_table, + struct dev_pm_opp *src_opp) +{ + struct dev_pm_opp *opp, *dest_opp = NULL; + int i; + + if (!src_table || !dst_table || !src_opp || + !src_table->required_opp_tables) + return NULL; + + /* required-opps not fully initialized yet */ + if (lazy_linking_pending(src_table)) + return NULL; + + for (i = 0; i < src_table->required_opp_count; i++) { + if (src_table->required_opp_tables[i] == dst_table) + break; + } + + if (unlikely(i == src_table->required_opp_count)) { + pr_err("%s: Couldn't find matching OPP table (%p: %p)\n", + __func__, src_table, dst_table); + return NULL; + } + + mutex_lock(&src_table->lock); + + list_for_each_entry(opp, &src_table->opp_list, node) { + if (opp == src_opp) { + dest_opp = opp->required_opps[i]; + dev_pm_opp_get(dest_opp); + goto unlock; + } + } + + pr_err("%s: Couldn't find matching OPP (%p: %p)\n", __func__, src_table, + dst_table); + +unlock: + mutex_unlock(&src_table->lock); + + return dest_opp; +} + /** * dev_pm_opp_xlate_performance_state() - Find required OPP's pstate for src_table. * @src_table: OPP table which has dst_table as one of its required OPP table. diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index ab1d15ce559db..6f5f72a7f601c 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -156,6 +156,9 @@ struct opp_table *devm_pm_opp_register_set_opp_helper(struct device *dev, int (* struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, const char **names, struct device ***virt_devs); void dev_pm_opp_detach_genpd(struct opp_table *opp_table); struct opp_table *devm_pm_opp_attach_genpd(struct device *dev, const char **names, struct device ***virt_devs); +struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, + struct opp_table *dst_table, + struct dev_pm_opp *src_opp); int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate); int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq); int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp); @@ -367,6 +370,14 @@ static inline struct opp_table *devm_pm_opp_attach_genpd(struct device *dev, return ERR_PTR(-EOPNOTSUPP); } +static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp( + struct opp_table *src_table, + struct opp_table *dst_table, + struct dev_pm_opp *src_opp) +{ + return NULL; +} + static inline int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate) { return -EOPNOTSUPP; From patchwork Wed Feb 3 09:23:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hsin-Yi Wang X-Patchwork-Id: 12063883 X-Patchwork-Delegate: cw00.choi@samsung.com 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=-19.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, 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,USER_AGENT_GIT 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 0AB7AC433DB for ; Wed, 3 Feb 2021 09:28:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id ADD1264F61 for ; Wed, 3 Feb 2021 09:28:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233439AbhBCJ2C (ORCPT ); Wed, 3 Feb 2021 04:28:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46098 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233459AbhBCJ0F (ORCPT ); Wed, 3 Feb 2021 04:26:05 -0500 Received: from mail-pf1-x436.google.com (mail-pf1-x436.google.com [IPv6:2607:f8b0:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F2AFEC061788 for ; Wed, 3 Feb 2021 01:24:10 -0800 (PST) Received: by mail-pf1-x436.google.com with SMTP id y205so16261981pfc.5 for ; Wed, 03 Feb 2021 01:24:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BUo70dpbWZG2th1HyMSGNG98xfWBgw6XoNhP4iRnwRU=; b=PolVeq0gP5/5egZAteKRDbawZu0yybIhpZS9jypjX6nuquWFQZse/nNqVIeb+heNWi Q0zRn4kap/a+7AQ9cXHDGy7CortJiwMhtX2oj3GgaueNYvoSA3qeT0WNepyeP4OTBVYq 8+2xK4PGN4APrnQwi+kxVKdeeNdFK/NYOECzQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BUo70dpbWZG2th1HyMSGNG98xfWBgw6XoNhP4iRnwRU=; b=X2TUhVvX1pHnOP6WtxBLuvQOkf4MvxQjOrKkaMOz39gO3F4tBLPSPNwclkfDTCRHtr s77qwQX63eSu6HrMA1sq5rZ3KkyuUzbyO96L9i82lcxwHMp174CCqNHnCmVIoamP59ye wepVlJS+W4AbKiPFxqo3wcYmcfZLPsXGp95mvdFbGpficN8wqhrpENmTH1gaz4J/yLGu BGiytN5rUFPRXzKpm3jawzZ6l/moa9PusdGDobNLF+7WvOD026mtwgvXRru9x+YsMZTG 9htJwz40dhHXFYJDmdkjMKOhoT3KilA9CM8bzAZvyCVVVgWMxQ8JNd1cw/SN4F3gCKWe ux5Q== X-Gm-Message-State: AOAM5324TdmUpnzj+Fyr122zVJsYYCt1C7fk6Sgw8nzLtgvueDIcsDdh x250fmRKF+X8Pqk5/iKSHzMQrg== X-Google-Smtp-Source: ABdhPJypAXiKQeV7+kTP25ChJV2GX9+q7S7jk6HODiK/eZQUPss02etbFuNRkSxR/FZIxIESY3Y0+g== X-Received: by 2002:a63:5223:: with SMTP id g35mr2660671pgb.255.1612344250566; Wed, 03 Feb 2021 01:24:10 -0800 (PST) Received: from hsinyi-z840.tpe.corp.google.com ([2401:fa00:1:10:743e:7944:50c8:ff72]) by smtp.gmail.com with ESMTPSA id u20sm932294pjy.36.2021.02.03.01.24.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Feb 2021 01:24:10 -0800 (PST) From: Hsin-Yi Wang To: Viresh Kumar , linux-pm@vger.kernel.org Cc: Nishanth Menon , Stephen Boyd , "Rafael J . Wysocki" , linux-kernel@vger.kernel.org, "MyungJoo Ham )" , Kyungmin Park , Chanwoo Choi , Saravana Kannan Subject: [PATCH v5 2/3] PM / devfreq: Cache OPP table reference in devfreq Date: Wed, 3 Feb 2021 17:23:59 +0800 Message-Id: <20210203092400.1791884-3-hsinyi@chromium.org> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog In-Reply-To: <20210203092400.1791884-1-hsinyi@chromium.org> References: <20210203092400.1791884-1-hsinyi@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Saravana Kannan The OPP table can be used often in devfreq. Trying to get it each time can be expensive, so cache it in the devfreq struct. Signed-off-by: Saravana Kannan Reviewed-by: Chanwoo Choi Acked-by: MyungJoo Ham Signed-off-by: Hsin-Yi Wang --- drivers/devfreq/devfreq.c | 6 ++++++ include/linux/devfreq.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 6aa10de792b33..a5899c9ae16fc 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -757,6 +757,8 @@ static void devfreq_dev_release(struct device *dev) if (devfreq->profile->exit) devfreq->profile->exit(devfreq->dev.parent); + if (devfreq->opp_table) + dev_pm_opp_put_opp_table(devfreq->opp_table); mutex_destroy(&devfreq->lock); kfree(devfreq); } @@ -844,6 +846,10 @@ struct devfreq *devfreq_add_device(struct device *dev, } devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev); + devfreq->opp_table = dev_pm_opp_get_opp_table(dev); + if (IS_ERR(devfreq->opp_table)) + devfreq->opp_table = NULL; + atomic_set(&devfreq->suspend_count, 0); dev_set_name(&devfreq->dev, "%s", dev_name(dev)); diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index b6d3bae1c74d8..26ea0850be9bb 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -137,6 +137,7 @@ struct devfreq_stats { * using devfreq. * @profile: device-specific devfreq profile * @governor: method how to choose frequency based on the usage. + * @opp_table: Reference to OPP table of dev.parent, if one exists. * @nb: notifier block used to notify devfreq object that it should * reevaluate operable frequencies. Devfreq users may use * devfreq.nb to the corresponding register notifier call chain. @@ -173,6 +174,7 @@ struct devfreq { struct device dev; struct devfreq_dev_profile *profile; const struct devfreq_governor *governor; + struct opp_table *opp_table; struct notifier_block nb; struct delayed_work work; From patchwork Wed Feb 3 09:24:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hsin-Yi Wang X-Patchwork-Id: 12063885 X-Patchwork-Delegate: cw00.choi@samsung.com 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=-19.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, 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,USER_AGENT_GIT 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 42440C433E0 for ; Wed, 3 Feb 2021 09:28:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DFFF764F49 for ; Wed, 3 Feb 2021 09:28:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233315AbhBCJ2G (ORCPT ); Wed, 3 Feb 2021 04:28:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233348AbhBCJ0F (ORCPT ); Wed, 3 Feb 2021 04:26:05 -0500 Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 55EACC06178B for ; Wed, 3 Feb 2021 01:24:13 -0800 (PST) Received: by mail-pf1-x42d.google.com with SMTP id w14so16279637pfi.2 for ; Wed, 03 Feb 2021 01:24:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/YBwKXZIAHM5O75qgqkZJUqkDsfjvCGWB4Ihiew6J+E=; b=ETNwtu1ZmDOZdrKuPYq2aSu+6XDPB8j3IGJZEojQZ9QEyMLBFOvJ8LchGtb3G/14/o KsdqcZ49CAKSR1t1HG6/OwyMHbIPHjIKzm/yyu/kDrjqkLNz1gxVZ7T9wpPJxkc07gGN 34tftBwM35J4Y7cZQvDXNbqgSWAqPDcElU5JQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/YBwKXZIAHM5O75qgqkZJUqkDsfjvCGWB4Ihiew6J+E=; b=cQxbfFIvaeFMY1XlcDnYzZ0vx1Fgp69lSen0Drng8p3Of9cyw1M6u+7ZNykeOAeB6t +J05Xv+XkJppKosYTfGAQPMZxqGxstQ+hG+sfdTjzaTxCtCI3N/KD8oUKy3aRPOSYyCl QnbV/0YUo9GseRF8pHpoX0v+UaLITpi07F3tKqqbt5yAdnsapi4KH0D9ft5kPNdIcWBq IdscITjE5qoHkZbToE0HaznzHQ0egGdMF0k4pWiXr3NLHuGkNSj5eT+7i4E0J0JTYzPM M/8bc3YppAPLilCcHJpu17Ag1vhi1x9P9BIHMwul85ILu0XlpfSie4NEZRlodxgzBRtB l8Zg== X-Gm-Message-State: AOAM53291j5M7pijuakMPFgMrxL1sWGntpaEFC+YqkSPbvtwR3AkahYJ egqGg35kB2uD5msROe3NeSaYFg== X-Google-Smtp-Source: ABdhPJzn9NcUV4ulcmPDo2XoIO/8wiG2wV/vpqORSuLF06mHkmkpUrnO2XbJdABrNL4qEc8b2Hhvlg== X-Received: by 2002:a63:43c6:: with SMTP id q189mr2641475pga.245.1612344252875; Wed, 03 Feb 2021 01:24:12 -0800 (PST) Received: from hsinyi-z840.tpe.corp.google.com ([2401:fa00:1:10:743e:7944:50c8:ff72]) by smtp.gmail.com with ESMTPSA id u20sm932294pjy.36.2021.02.03.01.24.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Feb 2021 01:24:12 -0800 (PST) From: Hsin-Yi Wang To: Viresh Kumar , linux-pm@vger.kernel.org Cc: Nishanth Menon , Stephen Boyd , "Rafael J . Wysocki" , linux-kernel@vger.kernel.org, "MyungJoo Ham )" , Kyungmin Park , Chanwoo Choi , Saravana Kannan Subject: [PATCH v5 3/3] PM / devfreq: Add required OPPs support to passive governor Date: Wed, 3 Feb 2021 17:24:00 +0800 Message-Id: <20210203092400.1791884-4-hsinyi@chromium.org> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog In-Reply-To: <20210203092400.1791884-1-hsinyi@chromium.org> References: <20210203092400.1791884-1-hsinyi@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Saravana Kannan Look at the required OPPs of the "parent" device to determine the OPP that is required from the slave device managed by the passive governor. This allows having mappings between a parent device and a slave device even when they don't have the same number of OPPs. Signed-off-by: Saravana Kannan Acked-by: MyungJoo Ham Acked-by: Chanwoo Choi Signed-off-by: Hsin-Yi Wang --- drivers/devfreq/governor_passive.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c index 63332e4a65ae8..8d92b1964f9c3 100644 --- a/drivers/devfreq/governor_passive.c +++ b/drivers/devfreq/governor_passive.c @@ -19,7 +19,7 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, = (struct devfreq_passive_data *)devfreq->data; struct devfreq *parent_devfreq = (struct devfreq *)p_data->parent; unsigned long child_freq = ULONG_MAX; - struct dev_pm_opp *opp; + struct dev_pm_opp *opp = NULL, *p_opp = NULL; int i, count, ret = 0; /* @@ -56,13 +56,20 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, * list of parent device. Because in this case, *freq is temporary * value which is decided by ondemand governor. */ - opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); - if (IS_ERR(opp)) { - ret = PTR_ERR(opp); + p_opp = devfreq_recommended_opp(parent_devfreq->dev.parent, freq, 0); + if (IS_ERR(p_opp)) { + ret = PTR_ERR(p_opp); goto out; } - dev_pm_opp_put(opp); + if (devfreq->opp_table && parent_devfreq->opp_table) + opp = dev_pm_opp_xlate_required_opp(parent_devfreq->opp_table, + devfreq->opp_table, p_opp); + if (opp) { + *freq = dev_pm_opp_get_freq(opp); + dev_pm_opp_put(opp); + goto out; + } /* * Get the OPP table's index of decided freqeuncy by governor @@ -89,6 +96,9 @@ static int devfreq_passive_get_target_freq(struct devfreq *devfreq, *freq = child_freq; out: + if (!IS_ERR_OR_NULL(opp)) + dev_pm_opp_put(p_opp); + return ret; }