From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E5ADB33D4E9 for ; Mon, 10 Aug 2026 14:32:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786372332; cv=none; b=DPX/h/cUbuqaWO9ZFM+HXvfrCtF3u4VYA7XxV2AdjLzn2dztIudh1uX+CGyCGv021i6kEZsU4PqDg03FRRvQ64s7owtxDqWUTp65eYRxuArb8ju3mShrNOKr4PXlWHRGCHO58+r8+qN4Zn1cV1epg+apjSbB6uzfdgDzAiD+Rb0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786372332; c=relaxed/simple; bh=uyZX4gPRQtl4jmnSZx2ZJRKSrL8w6QqMB+qfRovOzv8=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fT8m/ZeaRvWtvRVB86bxMBbMuwkhIZw641KrPlht/V5LhVyn2yWiYd2z9ehAQukUvXS7Fv0wnknhs4H00Y7wQBOYt4x85HEMh3d5NA4QqG5K1Nw2gH3mfwBFEKWcCTzlPPn7cgUtUxPvPUngarN98OQAjLfeS9PVv7KPGQSa26I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=l8schReS; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l8schReS" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-493b966dd74so12124575e9.3 for ; Mon, 10 Aug 2026 07:32:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786372329; x=1786977129; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=M6II6wNoYIH6ltsWqtS7reuxWUbNKPD2fplzN48dIG8=; b=l8schReSWqxrKt70ZcC8bkQJrMLEkUzyVIapzNRb1g+hQa00lWNX8zTjfoUl+V6zcR vgoTuQyJBfeMwNmqk0fq6sPzMOXpu8vLIZu5wOnW4Ld/urFOKT0mYRVE7UWKsjg9gGGg VFCtEm9tt0Pt0Qj+8bICl7WiYcYeungv3HGJwW5Xp69TZAAONqwfMruTuq9ZUwUuhb9N XbvLm/m++gb11f7ODe/apGHRZw+gKS/6xMqz0TsvKbQgpzu6dRlDWm7rBk8I7NcsyUYR W2C0qcx5A4/YxkJl3uq6TD+1pWuarIaRZpHxwi5VQwEEVf0rZ6r/ltAG34PlbJgF5PHa 811A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786372329; x=1786977129; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=M6II6wNoYIH6ltsWqtS7reuxWUbNKPD2fplzN48dIG8=; b=NVstYybejkYF6O6ID1QknU6GB/0cwnqiHOnxUa3Ve32euiMapFTQ9dFBAOckmbQLqn Utrg49SA+rUJ3cR7cLNFkIYhmkGFPBSsoZJDSoHLTM17kdYA8LXXde3AmS3R+HmRVfRn zCvJGoCQd3XPdv/ezxoKCzVNIl7pNTMRBGtN0J29seNM28x5I0f3mP6nT/I7LZiYbzpj NktQMIfk7YBWQ6ApWeMBpA1O+xKKjR07k3fOPNaqkSxH6SWTPhfYDajptFVVeUq8NwVE DeOOc34pCJkgcMuPLJ47Yb9aP25ci76XjWm3n3ZAIEDcMrMRI26fSFKZ1iv0pEagGD3z TnJg== X-Forwarded-Encrypted: i=1; AHgh+Rp1N3iyMgOLgBChsfM+J+EyN/6rJGiyi6RFH6u2i2HzhBy37esf7T8owk+ZA2vfUXXP3VHP6bExD0ffosU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxlkuzr8KxnSz1oUlHIWtt0MR3aoyZMceJ8+aBM3xsVpAZ1dCPO VdwP9zLXOvM4KRy7PD99VUQ7Idw1Jrh905u5Mq3m3ScnUkKJwjS9DSCG X-Gm-Gg: AR+sD12zQH7gfu5h9qj4neJjUodTi8V8kgWB09X4WeGvAk/KTnKGt/wlw4LxbgNnev/ EHV3EX6r6I/ZRRwnUQuQLcmeczCPSWeJFLqz5iaIokAzK+BTAcD1PRbMn5X6NIRygGEVwk3TjL8 h9ayz680URxuJ5pdndsKN5SD/uQZgfclkEmNW2WNssnqOoi0EA2Y21uO7QImOo7w5oUtOcirDP2 9q8Khek+KipvPxeHv/AsKqtdwD9BgRyEGBb7THj/ZOsNxQ9WrX6UcXgpzB8wWx91BJ2r0dUF/iH klrUhen4iuQjHJypFOGmjPyOvufvx2GVau0cl23eqqfG0oeZM+oVIKkgzmB31IHCH0xR9kJNWMu qw9Rc7/zCNn0+59lEz2PtcSzJDQM5BF6822z0SdC8/b5/CffIKFu89B5wHYwjcEMdt5MHxqGgz6 l0bsjDu+iXXtFGoEDIhRQM2ffHukP2nhON6NN1tGp/whCMaRQXrJDABT9M/8ukheuG9GsEEZ4eK T3qygAfTgjLJyC60LAONpsWx39PHZI81qmGo8b6zQtD8xsK X-Received: by 2002:a05:600c:4688:b0:495:4bf3:2150 with SMTP id 5b1f17b1804b1-4997277b7f1mr22756405e9.8.1786372264913; Mon, 10 Aug 2026 07:31:04 -0700 (PDT) Received: from Ansuel-XPS24.localdomain (host-87-20-3-207.retail.telecomitalia.it. [87.20.3.207]) by smtp.googlemail.com with ESMTPSA id 5b1f17b1804b1-4995420bd1csm438950695e9.3.2026.08.10.07.31.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 07:31:04 -0700 (PDT) From: Christian Marangi To: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Christian Marangi , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] PM / devfreq: add Airoha SoC devfreq driver Date: Mon, 10 Aug 2026 16:30:55 +0200 Message-ID: <20260810143057.651478-2-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260810143057.651478-1-ansuelsmth@gmail.com> References: <20260810143057.651478-1-ansuelsmth@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add simple Airoha SoC devfreq driver. This simple driver register a driver from a given clock and register a passive governor to scale the frequency with the CPU frequency. required-opp on the CPU frequency will be used to correctly bind the clock to the related CPU frequency. GSW, NPU, SOE, BUS and many other clock will register this devfreq driver to scale all these internal peripheral from idle to performance mode. Signed-off-by: Christian Marangi --- drivers/devfreq/Kconfig | 10 ++++ drivers/devfreq/Makefile | 1 + drivers/devfreq/airoha-devfreq.c | 99 ++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 drivers/devfreq/airoha-devfreq.c diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig index c999c4a1e567..1e857a7e9caf 100644 --- a/drivers/devfreq/Kconfig +++ b/drivers/devfreq/Kconfig @@ -75,6 +75,16 @@ config DEVFREQ_GOV_PASSIVE comment "DEVFREQ Drivers" +config ARM_AIROHA_DEVFREQ + tristate "Scaling support for Airoha SoC" + depends on ARCH_AIROHA || COMPILE_TEST + select DEVFREQ_GOV_PASSIVE + help + This adds the DEVFREQ driver for the Airoha SoC. + + The driver register with the cpufreq notifier and find the right frequency + based on the required OPP set in DT. + config ARM_EXYNOS_BUS_DEVFREQ tristate "ARM Exynos Generic Memory Bus DEVFREQ Driver" depends on ARCH_EXYNOS || COMPILE_TEST diff --git a/drivers/devfreq/Makefile b/drivers/devfreq/Makefile index 404179d79a9d..5ca27684dee3 100644 --- a/drivers/devfreq/Makefile +++ b/drivers/devfreq/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_DEVFREQ_GOV_USERSPACE) += governor_userspace.o obj-$(CONFIG_DEVFREQ_GOV_PASSIVE) += governor_passive.o # DEVFREQ Drivers +obj-$(CONFIG_ARM_AIROHA_DEVFREQ) += airoha-devfreq.o obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ) += exynos-bus.o obj-$(CONFIG_ARM_HISI_UNCORE_DEVFREQ) += hisi_uncore_freq.o obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ) += imx-bus.o diff --git a/drivers/devfreq/airoha-devfreq.c b/drivers/devfreq/airoha-devfreq.c new file mode 100644 index 000000000000..cb6d8b49e4a4 --- /dev/null +++ b/drivers/devfreq/airoha-devfreq.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct airoha_devfreq_data { + struct clk *clk; + + struct devfreq_passive_data gov_data; +}; + +static int airoha_devfreq_get_cur_freq(struct device *dev, unsigned long *freq) +{ + struct airoha_devfreq_data *data = dev_get_drvdata(dev); + + *freq = clk_get_rate(data->clk); + + return 0; +}; + +static int airoha_devfreq_target(struct device *dev, unsigned long *freq, + u32 flags) +{ + struct airoha_devfreq_data *data = dev_get_drvdata(dev); + + return clk_set_rate(data->clk, *freq); +}; + +static int airoha_devfreq_get_dev_status(struct device *dev, + struct devfreq_dev_status *stat) +{ + struct airoha_devfreq_data *data = dev_get_drvdata(dev); + + stat->busy_time = 0; + stat->total_time = 0; + stat->current_frequency = clk_get_rate(data->clk); + + return 0; +}; + +static struct devfreq_dev_profile airoha_devfreq_devfreq_profile = { + .target = airoha_devfreq_target, + .get_dev_status = airoha_devfreq_get_dev_status, + .get_cur_freq = airoha_devfreq_get_cur_freq +}; + +static int airoha_devfreq_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct airoha_devfreq_data *data; + struct devfreq *devfreq; + int ret; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->clk = devm_clk_get_enabled(dev, NULL); + if (IS_ERR(data->clk)) + return dev_err_probe(dev, PTR_ERR(data->clk), "failed to get clk\n"); + + ret = devm_pm_opp_of_add_table(dev); + if (ret) + return dev_err_probe(dev, ret, "failed to parse fab freq thresholds\n"); + + dev_set_drvdata(dev, data); + + data->gov_data.parent_type = CPUFREQ_PARENT_DEV; + devfreq = devm_devfreq_add_device(dev, &airoha_devfreq_devfreq_profile, + DEVFREQ_GOV_PASSIVE, &data->gov_data); + + return PTR_ERR_OR_ZERO(devfreq); +}; + +static const struct of_device_id airoha_devfreq_match_table[] = { + { .compatible = "airoha,devfreq" }, + {} +}; + +static struct platform_driver airoha_devfreq_driver = { + .probe = airoha_devfreq_probe, + .driver = { + .name = "airoha-devfreq", + .of_match_table = airoha_devfreq_match_table, + }, +}; +module_platform_driver(airoha_devfreq_driver); + +MODULE_DESCRIPTION("Airoha Devfreq driver"); +MODULE_AUTHOR("Christian Marangi "); +MODULE_LICENSE("GPL"); -- 2.53.0