public inbox for linux-clk@vger.kernel.org
 help / color / mirror / Atom feed
From: Andreas Kemnade <andreas@kemnade.info>
To: Roger Quadros <rogerq@kernel.org>,
	linux-omap@vger.kernel.org, Stephen Boyd <sboyd@kernel.org>,
	Kevin Hilman <khilman@baylibre.com>,
	Michael Turquette <mturquette@baylibre.com>,
	Aaro Koskinen <aaro.koskinen@iki.fi>,
	linux-kernel@vger.kernel.org, Lee Jones <lee@kernel.org>,
	Tony Lindgren <tony@atomide.com>,
	linux-clk@vger.kernel.org
Cc: Andreas Kemnade <andreas@kemnade.info>
Subject: [PATCH 2/2] clk: twl: add TWL6030 support
Date: Tue, 24 Sep 2024 12:36:09 +0200	[thread overview]
Message-ID: <20240924103609.12513-3-andreas@kemnade.info> (raw)
In-Reply-To: <20240924103609.12513-1-andreas@kemnade.info>

The TWL6030 has similar clocks, so add support for it. Take care of the
resource grouping handling needed.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
---
 drivers/clk/clk-twl.c | 97 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 95 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/clk-twl.c b/drivers/clk/clk-twl.c
index eab9d3c8ed8a..194f11ac5e14 100644
--- a/drivers/clk/clk-twl.c
+++ b/drivers/clk/clk-twl.c
@@ -11,10 +11,22 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 
-#define VREG_STATE              2
+#define VREG_STATE		2
+#define VREG_GRP		0
 #define TWL6030_CFG_STATE_OFF   0x00
 #define TWL6030_CFG_STATE_ON    0x01
 #define TWL6030_CFG_STATE_MASK  0x03
+#define TWL6030_CFG_STATE_GRP_SHIFT	5
+#define TWL6030_CFG_STATE_APP_SHIFT	2
+#define TWL6030_CFG_STATE_MASK		0x03
+#define TWL6030_CFG_STATE_APP_MASK	(0x03 << TWL6030_CFG_STATE_APP_SHIFT)
+#define TWL6030_CFG_STATE_APP(v)	(((v) & TWL6030_CFG_STATE_APP_MASK) >>\
+						TWL6030_CFG_STATE_APP_SHIFT)
+#define P1_GRP BIT(0) /* processor power group */
+#define ALL_GRP (BIT(0) | BIT(1) | BIT(2))
+
+#define DRIVER_DATA_TWL6030 0
+#define DRIVER_DATA_TWL6032 1
 
 struct twl_clock_info {
 	struct device *dev;
@@ -53,6 +65,49 @@ static unsigned long twl_clks_recalc_rate(struct clk_hw *hw,
 	return 32768;
 }
 
+static int twl6030_clks_prepare(struct clk_hw *hw)
+{
+	struct twl_clock_info *cinfo = to_twl_clks_info(hw);
+	int grp;
+
+	grp = twlclk_read(cinfo, TWL_MODULE_PM_RECEIVER, VREG_GRP);
+	if (grp < 0)
+		return grp;
+
+	return twlclk_write(cinfo, TWL_MODULE_PM_RECEIVER, VREG_STATE,
+			    grp << TWL6030_CFG_STATE_GRP_SHIFT |
+			    TWL6030_CFG_STATE_ON);
+}
+
+static void twl6030_clks_unprepare(struct clk_hw *hw)
+{
+	struct twl_clock_info *cinfo = to_twl_clks_info(hw);
+
+	twlclk_write(cinfo, TWL_MODULE_PM_RECEIVER, VREG_STATE,
+		     ALL_GRP << TWL6030_CFG_STATE_GRP_SHIFT |
+		     TWL6030_CFG_STATE_OFF);
+}
+
+static int twl6030_clks_is_prepared(struct clk_hw *hw)
+{
+	struct twl_clock_info *cinfo = to_twl_clks_info(hw);
+	int val;
+
+	val = twlclk_read(cinfo, TWL_MODULE_PM_RECEIVER, VREG_GRP);
+	if (val < 0)
+		return val;
+
+	if (!(val & P1_GRP))
+		return 0;
+
+	val = twlclk_read(cinfo, TWL_MODULE_PM_RECEIVER, VREG_STATE);
+	if (val < 0)
+		return val;
+
+	val = TWL6030_CFG_STATE_APP(val);
+	return val == TWL6030_CFG_STATE_ON;
+}
+
 static int twl6032_clks_prepare(struct clk_hw *hw)
 {
 	struct twl_clock_info *cinfo = to_twl_clks_info(hw);
@@ -93,6 +148,13 @@ static int twl6032_clks_is_prepared(struct clk_hw *hw)
 	return val == TWL6030_CFG_STATE_ON;
 }
 
+static const struct clk_ops twl6030_clks_ops = {
+	.prepare	= twl6030_clks_prepare,
+	.unprepare	= twl6030_clks_unprepare,
+	.is_prepared	= twl6030_clks_is_prepared,
+	.recalc_rate	= twl_clks_recalc_rate,
+};
+
 static const struct clk_ops twl6032_clks_ops = {
 	.prepare	= twl6032_clks_prepare,
 	.unprepare	= twl6032_clks_unprepare,
@@ -105,6 +167,28 @@ struct twl_clks_data {
 	u8 base;
 };
 
+static const struct twl_clks_data twl6030_clks[] = {
+	{
+		.init = {
+			.name = "clk32kg",
+			.ops = &twl6030_clks_ops,
+			.flags = CLK_IGNORE_UNUSED,
+		},
+		.base = 0x8C,
+	},
+	{
+		.init = {
+			.name = "clk32kaudio",
+			.ops = &twl6030_clks_ops,
+			.flags = CLK_IGNORE_UNUSED,
+		},
+		.base = 0x8F,
+	},
+	{
+		/* sentinel */
+	}
+};
+
 static const struct twl_clks_data twl6032_clks[] = {
 	{
 		.init = {
@@ -127,6 +211,11 @@ static const struct twl_clks_data twl6032_clks[] = {
 	}
 };
 
+static const struct twl_clks_data *const twl_clks[] = {
+	[DRIVER_DATA_TWL6030] = twl6030_clks,
+	[DRIVER_DATA_TWL6032] = twl6032_clks,
+};
+
 static int twl_clks_probe(struct platform_device *pdev)
 {
 	struct clk_hw_onecell_data *clk_data;
@@ -137,7 +226,7 @@ static int twl_clks_probe(struct platform_device *pdev)
 	int i;
 	int count;
 
-	hw_data = twl6032_clks;
+	hw_data = twl_clks[platform_get_device_id(pdev)->driver_data];
 	for (count = 0; hw_data[count].init.name; count++)
 		;
 
@@ -176,7 +265,11 @@ static int twl_clks_probe(struct platform_device *pdev)
 
 static const struct platform_device_id twl_clks_id[] = {
 	{
+		.name = "twl6030-clk",
+		.driver_data = DRIVER_DATA_TWL6030,
+	}, {
 		.name = "twl6032-clk",
+		.driver_data = DRIVER_DATA_TWL6032,
 	}, {
 		/* sentinel */
 	}
-- 
2.39.5


  parent reply	other threads:[~2024-09-24 10:36 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-24 10:36 [PATCH 0/2] mfd: twl: Add clock for TWL6030 Andreas Kemnade
2024-09-24 10:36 ` [PATCH 1/2] mfd: twl-core: Add a clock subdevice for the TWL6030 Andreas Kemnade
2024-09-25  6:52   ` Roger Quadros
2024-10-09 13:22   ` Lee Jones
2024-09-24 10:36 ` Andreas Kemnade [this message]
2024-09-25  7:07   ` [PATCH 2/2] clk: twl: add TWL6030 support Roger Quadros
2024-09-25 10:12     ` Andreas Kemnade

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240924103609.12513-3-andreas@kemnade.info \
    --to=andreas@kemnade.info \
    --cc=aaro.koskinen@iki.fi \
    --cc=khilman@baylibre.com \
    --cc=lee@kernel.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=rogerq@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox