summaryrefslogtreecommitdiff
path: root/drivers/soc/bcm
diff options
context:
space:
mode:
authorStefan Wahren <stefan.wahren@i2se.com>2022-06-25 14:36:16 +0300
committerLee Jones <lee.jones@linaro.org>2022-07-04 13:59:21 +0300
commitc494a447c14e7a8b997b4b8c4eaf9808e216ea70 (patch)
tree00e2eeba658f1345274cb33dd3e89279e8ced99d /drivers/soc/bcm
parentdf76234276e22136b2468825c18407fdfbb2076a (diff)
downloadlinux-c494a447c14e7a8b997b4b8c4eaf9808e216ea70.tar.xz
soc: bcm: bcm2835-power: Refactor ASB control
The functions to control the async AXI bridges are almost identical. So define a general function to handle it and keep the original ones as wrapper. This should make this driver easier to extend. Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> Reviewed-by: Peter Robinson <pbrobinson@gmail.com> Acked-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> Link: https://lore.kernel.org/r/20220625113619.15944-9-stefan.wahren@i2se.com
Diffstat (limited to 'drivers/soc/bcm')
-rw-r--r--drivers/soc/bcm/bcm2835-power.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 1e0041ec8132..77dc9e62b207 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -148,7 +148,7 @@ struct bcm2835_power {
struct reset_controller_dev reset;
};
-static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
+static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable)
{
u64 start;
@@ -158,7 +158,12 @@ static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
start = ktime_get_ns();
/* Enable the module's async AXI bridges. */
- ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
+ if (enable) {
+ ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
+ } else {
+ ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
+ }
+
while (ASB_READ(reg) & ASB_ACK) {
cpu_relax();
if (ktime_get_ns() - start >= 1000)
@@ -168,24 +173,14 @@ static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
return 0;
}
-static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
+static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
{
- u64 start;
-
- if (!reg)
- return 0;
-
- start = ktime_get_ns();
-
- /* Enable the module's async AXI bridges. */
- ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
- while (!(ASB_READ(reg) & ASB_ACK)) {
- cpu_relax();
- if (ktime_get_ns() - start >= 1000)
- return -ETIMEDOUT;
- }
+ return bcm2835_asb_control(power, reg, true);
+}
- return 0;
+static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
+{
+ return bcm2835_asb_control(power, reg, false);
}
static int bcm2835_power_power_off(struct bcm2835_power_domain *pd, u32 pm_reg)