ux500 : decouple/recouple gic from the PRCMU
Subsystems (2)
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
@@ -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
@@ -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
@@ -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
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.
Signed-off-by Daniel Lezcano<[email protected]>--- 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@@ -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@@ -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@@ -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 ())
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.cfile. 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_maskfunction?
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 */
voidux500_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 */
voidux500_pm_gic_recouple(void)
{
prcmu_write_masked(PRCM_A9_MASK_REQ,PRCM_A9_MASK_REQ_PRCM_A9_MASK_REQ,
0);
}BR
Rickard Andersson& Jonas AbergQuoted 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.
Signed-off-by Daniel Lezcano<[email protected]>---
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@@ -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 voidconfig_wakeups(void)
{include/linux/mfd/db8500-prcmu.h +0
-0@@ -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); intdb8500_prcmu_set_epod(u16 epod_id, u8 epod_state); intdb8500_prcmu_request_clock(u8 clock, bool enable);include/linux/mfd/dbx500-prcmu.h +16
-0@@ -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
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.cfile. 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
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.cfile. 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
PATCH 1/1 ux500 : decouple/recouple gic from the PRCMU
In reply to Daniel LezcanoQuoted 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.cfile. 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_maskfunction?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
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.cfile. 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_maskfunction?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
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.cfile. 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_maskfunction?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.
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_maskfunction?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
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_maskfunction?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 SoCsFollow 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