diff mbox series

[09/11] soc: bcm: bcm2835-power: Resolve ASB register macros

Message ID 20220515202032.3046-10-stefan.wahren@i2se.com (mailing list archive)
State New, archived
Headers show
Series soc: bcm2835-power: Prepare BCM2711 V3D support | expand

Commit Message

Stefan Wahren May 15, 2022, 8:20 p.m. UTC
The macros in order to access the ASB registers have a hard coded base
address. So extending them for other platforms would make them harder
to read. As a solution resolve these macros.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
---
 drivers/soc/bcm/bcm2835-power.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

Comments

Peter Robinson May 31, 2022, 3:47 p.m. UTC | #1
On Sun, May 15, 2022 at 9:21 PM Stefan Wahren <stefan.wahren@i2se.com> wrote:
>
> The macros in order to access the ASB registers have a hard coded base
> address. So extending them for other platforms would make them harder
> to read. As a solution resolve these macros.
>
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
A minor query below:
Reviewed-by: Peter Robinson <pbrobinson@gmail.com>
> ---
>  drivers/soc/bcm/bcm2835-power.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
> index 77dc9e62b207..fa0a13035794 100644
> --- a/drivers/soc/bcm/bcm2835-power.c
> +++ b/drivers/soc/bcm/bcm2835-power.c
> @@ -126,9 +126,6 @@
>
>  #define ASB_AXI_BRDG_ID                        0x20
>
> -#define ASB_READ(reg) readl(power->asb + (reg))
> -#define ASB_WRITE(reg, val) writel(PM_PASSWORD | (val), power->asb + (reg))
> -
>  struct bcm2835_power_domain {
>         struct generic_pm_domain base;
>         struct bcm2835_power *power;
> @@ -150,7 +147,10 @@ struct bcm2835_power {
>
>  static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable)
>  {
> +       void __iomem *base = power->asb;

I wonder the perf of defining base here vs the readability of
power->asb; throughout.

>         u64 start;
> +       u32 val;
> +
>
>         if (!reg)
>                 return 0;
> @@ -159,12 +159,13 @@ static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable
>
>         /* Enable the module's async AXI bridges. */
>         if (enable) {
> -               ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
> +               val = readl(base + reg) & ~ASB_REQ_STOP;
>         } else {
> -               ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
> +               val = readl(base + reg) | ASB_REQ_STOP;
>         }
> +       writel(PM_PASSWORD | val, base + reg);
>
> -       while (ASB_READ(reg) & ASB_ACK) {
> +       while (readl(base + reg) & ASB_ACK) {
>                 cpu_relax();
>                 if (ktime_get_ns() - start >= 1000)
>                         return -ETIMEDOUT;
> @@ -622,7 +623,7 @@ static int bcm2835_power_probe(struct platform_device *pdev)
>         power->base = pm->base;
>         power->asb = pm->asb;
>
> -       id = ASB_READ(ASB_AXI_BRDG_ID);
> +       id = readl(power->asb + ASB_AXI_BRDG_ID);
>         if (id != 0x62726467 /* "BRDG" */) {
>                 dev_err(dev, "ASB register ID returned 0x%08x\n", id);
>                 return -ENODEV;
> --
> 2.25.1
>
Stefan Wahren May 31, 2022, 5:34 p.m. UTC | #2
Hi Peter,

Am 31.05.22 um 17:47 schrieb Peter Robinson:
> On Sun, May 15, 2022 at 9:21 PM Stefan Wahren <stefan.wahren@i2se.com> wrote:
>> The macros in order to access the ASB registers have a hard coded base
>> address. So extending them for other platforms would make them harder
>> to read. As a solution resolve these macros.
>>
>> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
> A minor query below:
> Reviewed-by: Peter Robinson <pbrobinson@gmail.com>
>> ---
>>   drivers/soc/bcm/bcm2835-power.c | 15 ++++++++-------
>>   1 file changed, 8 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
>> index 77dc9e62b207..fa0a13035794 100644
>> --- a/drivers/soc/bcm/bcm2835-power.c
>> +++ b/drivers/soc/bcm/bcm2835-power.c
>> @@ -126,9 +126,6 @@
>>
>>   #define ASB_AXI_BRDG_ID                        0x20
>>
>> -#define ASB_READ(reg) readl(power->asb + (reg))
>> -#define ASB_WRITE(reg, val) writel(PM_PASSWORD | (val), power->asb + (reg))
>> -
>>   struct bcm2835_power_domain {
>>          struct generic_pm_domain base;
>>          struct bcm2835_power *power;
>> @@ -150,7 +147,10 @@ struct bcm2835_power {
>>
>>   static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable)
>>   {
>> +       void __iomem *base = power->asb;
> I wonder the perf of defining base here vs the readability of
> power->asb; throughout.
this is the whole "trick" in order to change the base to rpivid_asb in 
patch #10.
>
>>          u64 start;
>> +       u32 val;
>> +
>>
>>          if (!reg)
>>                  return 0;
>> @@ -159,12 +159,13 @@ static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable
>>
>>          /* Enable the module's async AXI bridges. */
>>          if (enable) {
>> -               ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
>> +               val = readl(base + reg) & ~ASB_REQ_STOP;
>>          } else {
>> -               ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
>> +               val = readl(base + reg) | ASB_REQ_STOP;
>>          }
>> +       writel(PM_PASSWORD | val, base + reg);
>>
>> -       while (ASB_READ(reg) & ASB_ACK) {
>> +       while (readl(base + reg) & ASB_ACK) {
>>                  cpu_relax();
>>                  if (ktime_get_ns() - start >= 1000)
>>                          return -ETIMEDOUT;
>> @@ -622,7 +623,7 @@ static int bcm2835_power_probe(struct platform_device *pdev)
>>          power->base = pm->base;
>>          power->asb = pm->asb;
>>
>> -       id = ASB_READ(ASB_AXI_BRDG_ID);
>> +       id = readl(power->asb + ASB_AXI_BRDG_ID);
>>          if (id != 0x62726467 /* "BRDG" */) {
>>                  dev_err(dev, "ASB register ID returned 0x%08x\n", id);
>>                  return -ENODEV;
>> --
>> 2.25.1
>>
diff mbox series

Patch

diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c
index 77dc9e62b207..fa0a13035794 100644
--- a/drivers/soc/bcm/bcm2835-power.c
+++ b/drivers/soc/bcm/bcm2835-power.c
@@ -126,9 +126,6 @@ 
 
 #define ASB_AXI_BRDG_ID			0x20
 
-#define ASB_READ(reg) readl(power->asb + (reg))
-#define ASB_WRITE(reg, val) writel(PM_PASSWORD | (val), power->asb + (reg))
-
 struct bcm2835_power_domain {
 	struct generic_pm_domain base;
 	struct bcm2835_power *power;
@@ -150,7 +147,10 @@  struct bcm2835_power {
 
 static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable)
 {
+	void __iomem *base = power->asb;
 	u64 start;
+	u32 val;
+
 
 	if (!reg)
 		return 0;
@@ -159,12 +159,13 @@  static int bcm2835_asb_control(struct bcm2835_power *power, u32 reg, bool enable
 
 	/* Enable the module's async AXI bridges. */
 	if (enable) {
-		ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
+		val = readl(base + reg) & ~ASB_REQ_STOP;
 	} else {
-		ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
+		val = readl(base + reg) | ASB_REQ_STOP;
 	}
+	writel(PM_PASSWORD | val, base + reg);
 
-	while (ASB_READ(reg) & ASB_ACK) {
+	while (readl(base + reg) & ASB_ACK) {
 		cpu_relax();
 		if (ktime_get_ns() - start >= 1000)
 			return -ETIMEDOUT;
@@ -622,7 +623,7 @@  static int bcm2835_power_probe(struct platform_device *pdev)
 	power->base = pm->base;
 	power->asb = pm->asb;
 
-	id = ASB_READ(ASB_AXI_BRDG_ID);
+	id = readl(power->asb + ASB_AXI_BRDG_ID);
 	if (id != 0x62726467 /* "BRDG" */) {
 		dev_err(dev, "ASB register ID returned 0x%08x\n", id);
 		return -ENODEV;