summaryrefslogtreecommitdiff
path: root/drivers/genpd
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2023-07-26 14:49:36 +0300
committerArnd Bergmann <arnd@arndb.de>2023-07-26 15:41:01 +0300
commit7ed363cd8d0a3e4fbe3c37b7458420f82ef9a106 (patch)
tree57b56425a5d4ade9d224c2c9d685da1e207d56fd /drivers/genpd
parent00eb53b08cf5f4d8919a49c10ffd122647478aae (diff)
downloadlinux-7ed363cd8d0a3e4fbe3c37b7458420f82ef9a106.tar.xz
genpd: move owl-sps-helper.c from drivers/soc
Moving only one of the two files in drivers/soc/actions to drivers/genpd caused a link failure in allmodconfig, as drivers/genpd is entered for compile testing, but drivers/soc/actions accidentally got skipped: x86_64-linux-gnu-ld: vmlinux.o: in function `owl_sps_set_power': owl-sps.c:(.text+0x16e259d): undefined reference to `owl_sps_set_pg' Move the other one as well to allow build testing to work correctly. Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/genpd')
-rw-r--r--drivers/genpd/actions/Makefile1
-rw-r--r--drivers/genpd/actions/owl-sps-helper.c48
2 files changed, 49 insertions, 0 deletions
diff --git a/drivers/genpd/actions/Makefile b/drivers/genpd/actions/Makefile
index e78c420a2454..7e8aa473d12d 100644
--- a/drivers/genpd/actions/Makefile
+++ b/drivers/genpd/actions/Makefile
@@ -1,2 +1,3 @@
# SPDX-License-Identifier: GPL-2.0+
+obj-$(CONFIG_OWL_PM_DOMAINS_HELPER) += owl-sps-helper.o
obj-$(CONFIG_OWL_PM_DOMAINS) += owl-sps.o
diff --git a/drivers/genpd/actions/owl-sps-helper.c b/drivers/genpd/actions/owl-sps-helper.c
new file mode 100644
index 000000000000..e3f36603dd53
--- /dev/null
+++ b/drivers/genpd/actions/owl-sps-helper.c
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Actions Semi Owl Smart Power System (SPS) shared helpers
+ *
+ * Copyright 2012 Actions Semi Inc.
+ * Author: Actions Semi, Inc.
+ *
+ * Copyright (c) 2017 Andreas Färber
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/soc/actions/owl-sps.h>
+
+#define OWL_SPS_PG_CTL 0x0
+
+int owl_sps_set_pg(void __iomem *base, u32 pwr_mask, u32 ack_mask, bool enable)
+{
+ u32 val;
+ bool ack;
+ int timeout;
+
+ val = readl(base + OWL_SPS_PG_CTL);
+ ack = val & ack_mask;
+ if (ack == enable)
+ return 0;
+
+ if (enable)
+ val |= pwr_mask;
+ else
+ val &= ~pwr_mask;
+
+ writel(val, base + OWL_SPS_PG_CTL);
+
+ for (timeout = 5000; timeout > 0; timeout -= 50) {
+ val = readl(base + OWL_SPS_PG_CTL);
+ if ((val & ack_mask) == (enable ? ack_mask : 0))
+ break;
+ udelay(50);
+ }
+ if (timeout <= 0)
+ return -ETIMEDOUT;
+
+ udelay(10);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(owl_sps_set_pg);