Skip to contentSkip to conversation

ux500 : decouple/recouple gic from the PRCMU

PATCH New Daniel Lezcano 4 participants 10 messages Feb 3, 2012 – Feb 7, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

This patch allows to decouple and recouple the gic from the PRCMU. This is needed to put the A9 core in retention mode with the cpuidle driver.

---
 drivers/mfd/db8500-prcmu.c       |   42 ++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/db8500-prcmu.h |    2 +
 include/linux/mfd/dbx500-prcmu.h |   16 ++++++++++++++
 3 files changed, 60 insertions(+), 0 deletions(-)
drivers/mfd/db8500-prcmu.c +42 -0
index af8e0ef..c708431 100644
@@ -528,6 +528,10 @@ static const char *hwacc_ret_regulator_name[NUM_HW_ACC] = {
 
 #define PRCMU_PLLDSI_LOCKP_LOCKED	0x3
 
+#define PRCMU_A9_MASK_REQ               0x00000328
+#define PRCMU_A9_MASK_REQ_MASK          0x00000001
+#define PRCMU_A9_MASK_ACK               0x0000032C
+
 static struct {
 	u8 project_number;
 	u8 api_version;
@@ -787,6 +791,44 @@ int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll)
 	return 0;
 }
 
+/*
+ * prcmu_gic_mask - apply the mask to the mask request
+ * register. This mask has the bits [1-31] reserved and
+ * the request applies to the bit 0 of this register.
+ */
+static inline void prcmu_gic_mask(u32 mask)
+{
+	u32 val = readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ);
+	writel((val & ~PRCMU_A9_MASK_REQ_MASK) | mask,
+	       _PRCMU_BASE + PRCMU_A9_MASK_REQ);
+}
+
+/*
+ * db8500_prcmu_gic_disable - This function decouple the gic
+ * from the prcmu.
+ */
+void db8500_prcmu_gic_disable(void)
+{
+	prcmu_gic_mask(PRCMU_A9_MASK_REQ_MASK);
+
+	/* Wait for gic mask register update */
+	while (!(readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ) &
+		 PRCMU_A9_MASK_REQ_MASK))
+		cpu_relax();
+
+	/* Wait a few cycles for the gic mask completion */
+	udelay(1);
+}
+
+/*
+ * db8500_prcmu_gic_enable - This function recouple the gic
+ * with the prcmu.
+ */
+void db8500_prcmu_gic_enable(void)
+{
+	prcmu_gic_mask(0);
+}
+
 /* This function should only be called while mb0_transfer.lock is held. */
 static void config_wakeups(void)
 {
include/linux/mfd/db8500-prcmu.h +2 -0
index 60d27f7..4a1032c 100644
@@ -536,6 +536,8 @@ int prcmu_load_a9wdog(u8 id, u32 val);
 
 void db8500_prcmu_system_reset(u16 reset_code);
 int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll);
+void db8500_prcmu_gic_disable(void);
+void db8500_prcmu_gic_enable(void);
 void db8500_prcmu_enable_wakeups(u32 wakeups);
 int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state);
 int db8500_prcmu_request_clock(u8 clock, bool enable);
include/linux/mfd/dbx500-prcmu.h +16 -0
index bac942f..a5fee69 100644
@@ -237,6 +237,22 @@ static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk,
 			keep_ap_pll);
 }
 
+static inline void prcmu_gic_disable(void)
+{
+	if (machine_is_u5500())
+		return;
+	else
+		return db8500_prcmu_gic_disable();
+}
+
+static inline void prcmu_gic_enable(void)
+{
+	if (machine_is_u5500())
+		return;
+	else
+		return db8500_prcmu_gic_enable();
+}
+
 static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)
 {
 	if (machine_is_u5500())
Signature · 1 line
1.7.5.4
#1 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Hi!

Our comments:

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.
- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?
- why the gic_mask function?
- The original code has been updated and now looks like this:

/* Decouple GIC from the interrupt bus */
void ux500_pm_gic_decouple(void)

{
         prcmu_write_masked(PRCM_A9_MASK_REQ,
                            PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
                            PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ);

         (void)prcmu_read(PRCM_A9_MASK_REQ);

         udelay(GIC_FREEZE_DELAY); /* Wait for the GIC to freeze */
}

/* Recouple GIC with the interrupt bus */
void ux500_pm_gic_recouple(void)

{
         prcmu_write_masked(PRCM_A9_MASK_REQ,
                            PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
                            0);
}

BR
Rickard Andersson& Jonas Aberg

Quoted 111 lines

This patch allows to decouple and recouple the gic from the PRCMU. This is needed to put the A9 core in retention mode with the cpuidle driver.

---
  drivers/mfd/db8500-prcmu.c       |   42 ++++++++++++++++++++++++++++++++++++++
  include/linux/mfd/db8500-prcmu.h |    2 +
  include/linux/mfd/dbx500-prcmu.h |   16 ++++++++++++++
  3 files changed, 60 insertions(+), 0 deletions(-)
drivers/mfd/db8500-prcmu.c +42 -0
index af8e0ef..c708431 100644
@@ -528,6 +528,10 @@ static const char *hwacc_ret_regulator_name[NUM_HW_ACC] = {
 
  #define PRCMU_PLLDSI_LOCKP_LOCKED	0x3
 
+#define PRCMU_A9_MASK_REQ               0x00000328
+#define PRCMU_A9_MASK_REQ_MASK          0x00000001
+#define PRCMU_A9_MASK_ACK               0x0000032C
+
  static struct {
  	u8 project_number;
  	u8 api_version;
@@ -787,6 +791,44 @@ int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll)
  	return 0;
  }
 
+/*
+ * prcmu_gic_mask - apply the mask to the mask request
+ * register. This mask has the bits [1-31] reserved and
+ * the request applies to the bit 0 of this register.
+ */
+static inline void prcmu_gic_mask(u32 mask)
+{
+	u32 val = readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ);
+	writel((val&  ~PRCMU_A9_MASK_REQ_MASK) | mask,
+	       _PRCMU_BASE + PRCMU_A9_MASK_REQ);
+}
+
+/*
+ * db8500_prcmu_gic_disable - This function decouple the gic
+ * from the prcmu.
+ */
+void db8500_prcmu_gic_disable(void)
+{
+	prcmu_gic_mask(PRCMU_A9_MASK_REQ_MASK);
+
+	/* Wait for gic mask register update */
+	while (!(readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ)&
+		 PRCMU_A9_MASK_REQ_MASK))
+		cpu_relax();
+
+	/* Wait a few cycles for the gic mask completion */
+	udelay(1);
+}
+
+/*
+ * db8500_prcmu_gic_enable - This function recouple the gic
+ * with the prcmu.
+ */
+void db8500_prcmu_gic_enable(void)
+{
+	prcmu_gic_mask(0);
+}
+
  /* This function should only be called while mb0_transfer.lock is held. */
  static void config_wakeups(void)
  {
include/linux/mfd/db8500-prcmu.h +2 -0
index 60d27f7..4a1032c 100644
@@ -536,6 +536,8 @@ int prcmu_load_a9wdog(u8 id, u32 val);
 
  void db8500_prcmu_system_reset(u16 reset_code);
  int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll);
+void db8500_prcmu_gic_disable(void);
+void db8500_prcmu_gic_enable(void);
  void db8500_prcmu_enable_wakeups(u32 wakeups);
  int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state);
  int db8500_prcmu_request_clock(u8 clock, bool enable);
include/linux/mfd/dbx500-prcmu.h +16 -0
index bac942f..a5fee69 100644
@@ -237,6 +237,22 @@ static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk,
  			keep_ap_pll);
  }
 
+static inline void prcmu_gic_disable(void)
+{
+	if (machine_is_u5500())
+		return;
+	else
+		return db8500_prcmu_gic_disable();
+}
+
+static inline void prcmu_gic_enable(void)
+{
+	if (machine_is_u5500())
+		return;
+	else
+		return db8500_prcmu_gic_enable();
+}
+
  static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)
  {
  	if (machine_is_u5500())
#2 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 3 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 3 lines

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Thanks
-- Daniel

Quoted 142 lines

/* Decouple GIC from the interrupt bus */
void ux500_pm_gic_decouple(void)
{
prcmu_write_masked(PRCM_A9_MASK_REQ,
PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ);

(void)prcmu_read(PRCM_A9_MASK_REQ);

udelay(GIC_FREEZE_DELAY); /* Wait for the GIC to freeze */ }

/* Recouple GIC with the interrupt bus */
void ux500_pm_gic_recouple(void)
{
prcmu_write_masked(PRCM_A9_MASK_REQ,
PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
0);
}

BR
Rickard Andersson& Jonas Aberg

Quoted 118 lines

This patch allows to decouple and recouple the gic from the PRCMU. This is needed to put the A9 core in retention mode with the cpuidle driver.

---
drivers/mfd/db8500-prcmu.c | 42 ++++++++++++++++++++++++++++++++++++++ include/linux/mfd/db8500-prcmu.h | 2 + include/linux/mfd/dbx500-prcmu.h | 16 ++++++++++++++

3 files changed, 60 insertions(+), 0 deletions(-)
drivers/mfd/db8500-prcmu.c +4 -0
index af8e0ef..c708431 100644
@@ -528,6 +528,10 @@ static const char
 *hwacc_ret_regulator_name[NUM_HW_ACC] = {
 
 #define PRCMU_PLLDSI_LOCKP_LOCKED 0x3
 
+#define PRCMU_A9_MASK_REQ 0x00000328
+#define PRCMU_A9_MASK_REQ_MASK 0x00000001
+#define PRCMU_A9_MASK_ACK 0x0000032C
+
 static struct {
 u8 project_number;

u8 api_version;

drivers/mfd/db8500-prcmu.c +38 -0
@@ -787,6 +791,44 @@ int db8500_prcmu_set_power_state(u8 state, bool
 keep_ulp_clk, bool keep_ap_pll)
 return 0;
 }
 
+/*
+ * prcmu_gic_mask - apply the mask to the mask request
+ * register. This mask has the bits [1-31] reserved and
+ * the request applies to the bit 0 of this register.
+ */
+static inline void prcmu_gic_mask(u32 mask)
+{
+ u32 val = readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ);
+ writel((val& ~PRCMU_A9_MASK_REQ_MASK) | mask,
+ _PRCMU_BASE + PRCMU_A9_MASK_REQ);
+}
+
+/*
+ * db8500_prcmu_gic_disable - This function decouple the gic
+ * from the prcmu.
+ */
+void db8500_prcmu_gic_disable(void)
+{
+ prcmu_gic_mask(PRCMU_A9_MASK_REQ_MASK);
+
+ /* Wait for gic mask register update */
+ while (!(readl(_PRCMU_BASE + PRCMU_A9_MASK_REQ)&
+ PRCMU_A9_MASK_REQ_MASK))
+ cpu_relax();
+
+ /* Wait a few cycles for the gic mask completion */
+ udelay(1);
+}
+
+/*
+ * db8500_prcmu_gic_enable - This function recouple the gic
+ * with the prcmu.
+ */
+void db8500_prcmu_gic_enable(void)
+{
+ prcmu_gic_mask(0);
+}
+
 /* This function should only be called while mb0_transfer.lock is

held. */
static void config_wakeups(void)
{

include/linux/mfd/db8500-prcmu.h +0 -0
index 60d27f7..4a1032c 100644
@@ -536,6 +536,8 @@ int prcmu_load_a9wdog(u8 id, u32 val);
 
 void db8500_prcmu_system_reset(u16 reset_code);

int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll);

include/linux/mfd/db8500-prcmu.h +2 -0
+void db8500_prcmu_gic_disable(void);
+void db8500_prcmu_gic_enable(void);

void db8500_prcmu_enable_wakeups(u32 wakeups); int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state); int db8500_prcmu_request_clock(u8 clock, bool enable);

include/linux/mfd/dbx500-prcmu.h +16 -0
index bac942f..a5fee69 100644
@@ -237,6 +237,22 @@ static inline int prcmu_set_power_state(u8 state,
 bool keep_ulp_clk,
 keep_ap_pll);
 }
 
+static inline void prcmu_gic_disable(void)
+{
+ if (machine_is_u5500())
+ return;
+ else
+ return db8500_prcmu_gic_disable();
+}
+
+static inline void prcmu_gic_enable(void)
+{
+ if (machine_is_u5500())
+ return;
+ else
+ return db8500_prcmu_gic_enable();
+}
+
 static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)
 {

if (machine_is_u5500())

Signature · 5 lines
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#3 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 9 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

I have no strong opinions on this. When I discussed it with Mattias who wrote much of the driver we concluded that the PRCMU drivers needs a lot of shaping up. Mainly it may need to be split into two parts: one which is a "pure" MFD device (register access part) one MFD firmware interaction part, and then a platform-specific (U8500) part.

This would help getting code in more logical places.

For now I would suggest not moving stuff around, I thin Mattias is onto cleaning up the structure as per above and we could be messing it up for him, which is not good.

Yours,
Linus Walleij

#4 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 18 lines · Linus Walleij
Quoted 9 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

I have no strong opinions on this. When I discussed it with Mattias who wrote much of the driver we concluded that the PRCMU drivers needs a lot of shaping up. Mainly it may need to be split into two parts: one which is a "pure" MFD device (register access part) one MFD firmware interaction part, and then a platform-specific (U8500) part.

Quoted 5 lines

This would help getting code in more logical places.

For now I would suggest not moving stuff around, I thin Mattias is onto cleaning up the structure as per above and we could be messing it up for him, which is not good.

Ok, I will resend the patch with the name changed to decouple/recouple. Is the patch acceptable as it is ?

Thanks
-- Daniel

Signature · 5 lines
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#5 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

In reply to Daniel Lezcano
Quoted 14 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 3 lines

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Quoted 7 lines

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

This is will most likely not happen. If that happens we could add that function then. We should remove it for now.

Quoted 3 lines
Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Yes, but in theory you can be stuck forever in that loop, so please remove the loop.

BR
Rickard

#6 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 22 lines · Rickard Andersson
Quoted 14 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 3 lines

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Quoted 7 lines

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

Quoted 7 lines

This is will most likely not happen. If that happens we could add that function then. We should remove it for now.

Quoted 3 lines
Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Yes, but in theory you can be stuck forever in that loop, so please remove the loop.

Mmmh, can you elaborate please ? I think a comment and/or an error should be returned in this case, no ?

Signature · 5 lines
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#7 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 25 lines · Daniel Lezcano
Quoted 24 lines · Rickard Andersson
Quoted 14 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 3 lines

- there is no reason to place these functions inside the db8500-prcmu.c file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Quoted 7 lines

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

This is will most likely not happen. If that happens we could add that function then. We should remove it for now.

Quoted 8 lines
Quoted 5 lines
Quoted 3 lines
Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Yes, but in theory you can be stuck forever in that loop, so please remove the loop.

Mmmh, can you elaborate please ? I think a comment and/or an error should be returned in this case, no ?

We do not need the loop. PRCMU FW does decouple of the GIC and if they for some reason does that at the same time (they should not) we will be stuck.

#8 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 30 lines · Rickard Andersson
Quoted 29 lines · Daniel Lezcano
Quoted 28 lines · Rickard Andersson
Quoted 15 lines · Daniel Lezcano
Quoted 3 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 4 lines

- there is no reason to place these functions inside the db8500-prcmu.c
file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Quoted 7 lines

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

This is will most likely not happen. If that happens we could add that function then. We should remove it for now.

Quoted 3 lines
Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Yes, but in theory you can be stuck forever in that loop, so please remove the loop.

Mmmh, can you elaborate please ? I think a comment and/or an error should be returned in this case, no ?

We do not need the loop. PRCMU FW does decouple of the GIC and if they for some reason does that at the same time (they should not) we will be stuck.

Sorry, but I still don't get it. What is "they" ? Do you mean one cpu can decouples the cpu while the other cpu recouples it ?

Taking the routine, why is needed the "read" if we don't care the return value ?

void ux500_pm_gic_decouple(void)

{
         prcmu_write_masked(PRCM_A9_MASK_REQ,
                            PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
                            PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ);

         (void)prcmu_read(PRCM_A9_MASK_REQ);

         udelay(GIC_FREEZE_DELAY); /* Wait for the GIC to freeze */
}

Thanks
-- Daniel

Signature · 5 lines
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#9 lore raw

PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU

Quoted 50 lines · Daniel Lezcano
Quoted 49 lines · Rickard Andersson
Quoted 47 lines · Daniel Lezcano
Quoted 34 lines · Rickard Andersson
Quoted 20 lines · Daniel Lezcano
Quoted 4 lines · Rickard Andersson

Hi!

Our comments:

Thanks Rickard and Jonas for your comments.

Quoted 3 lines

- function names don't match commit comment disable/enable vs recouple/decouple. Decouple is a better name than disable, because GIC is not really disabled it is just disconnected.

Ok, that makes sense.

Quoted 4 lines

- there is no reason to place these functions inside the db8500-prcmu.c
file. There is so much stuff in the PRCMU register base so we can not have everything in one file. Why not have it as it is?

Quoted 8 lines

Why spread the prcmu code when it is related to the prcmu ?

Linus ? What do you think ?

Quoted 1 line

- why the gic_mask function?

Because the register has 31 bits reserved which could be used later without modifying this function.

This is will most likely not happen. If that happens we could add that function then. We should remove it for now.

Quoted 1 line
Quoted 1 line
Quoted 7 lines
Quoted 4 lines
Quoted 1 line

- The original code has been updated and now looks like this:

That is the same code, except the while loop where, if this code assumption is correct, means we will do only one iteration in the loop.

Yes, but in theory you can be stuck forever in that loop, so please remove the loop.

Mmmh, can you elaborate please ? I think a comment and/or an error should be returned in this case, no ?

Quoted 8 lines
Quoted 3 lines

We do not need the loop. PRCMU FW does decouple of the GIC and if they for some reason does that at the same time (they should not) we will be stuck.

Sorry, but I still don't get it. What is "they" ? Do you mean one cpu can decouples the cpu while the other cpu recouples it ?

Normally, the cpu decouples the gic and the prcmu recouples it so if cpu decouples the gic and the prcmu recouples it between the write and the read access, you will never read the value PRCMU_A9_MASK_REQ_MASK and stay in your loop. This should not occurs because the prcmu has no reason to recouple at this moment

Quoted 2 lines

Taking the routine, why is needed the "read" if we don't care the return value ?

IMHO, the read access is used to ensure that your write access has really been done in the register and is not still in the system bus

Quoted 29 lines

void ux500_pm_gic_decouple(void)
{
? ? ? ?prcmu_write_masked(PRCM_A9_MASK_REQ,
? ? ? ? ? ? ? ? ? ? ? ? ? PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ, ? ? ? ? ? ? ? ? ? ? ? ? ? PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ);

? ? ? ?(void)prcmu_read(PRCM_A9_MASK_REQ);

? ? ? ?udelay(GIC_FREEZE_DELAY); /* Wait for the GIC to freeze */ }

Thanks
?-- Daniel

--
?<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro: ?<http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

_______________________________________________
linaro-dev mailing list
linaro-dev at lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev