Skip to content

Commit 0fb5118

Browse files
committed
drivers: flash: stm32h7 flash has a write_optb function to set rdp level
Move the stm32h7 flash register manipulation in a write_optb() to be called by the flash_stm32_set_rdp_level Signed-off-by: Francois Ramu <[email protected]>
1 parent eaaecc2 commit 0fb5118

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

drivers/flash/flash_stm32h7x.c

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -62,44 +62,55 @@ struct flash_stm32_sector_t {
6262
volatile uint32_t *sr;
6363
};
6464

65-
#if defined(CONFIG_FLASH_STM32_READOUT_PROTECTION)
66-
uint8_t flash_stm32_get_rdp_level(const struct device *dev)
67-
{
68-
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
69-
70-
return (regs->OPTSR_CUR & FLASH_OPTSR_RDP_Msk) >> FLASH_OPTSR_RDP_Pos;
71-
}
72-
73-
void flash_stm32_set_rdp_level(const struct device *dev, uint8_t level)
65+
static __unused int write_optb(const struct device *dev, uint32_t mask,
66+
uint32_t value)
7467
{
7568
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
76-
uint32_t value = (uint32_t)level << FLASH_OPTSR_RDP_Pos;
69+
int rc;
7770

7871
if (regs->OPTCR & FLASH_OPTCR_OPTLOCK) {
7972
LOG_ERR("Option bytes locked");
80-
return;
73+
return -EIO;
8174
}
8275

83-
if ((regs->OPTCR & FLASH_OPTSR_RDP_Msk) == value) {
76+
if ((regs->OPTCR & mask) == value) {
8477
/* Done already */
85-
return;
78+
return 0;
8679
}
8780

88-
if (flash_stm32_wait_flash_idle(dev) != 0) {
81+
rc = flash_stm32_wait_flash_idle(dev);
82+
if (rc < 0) {
8983
LOG_ERR("Err flash no idle");
90-
return;
84+
return rc;
9185
}
9286

93-
regs->OPTCR = (regs->OPTCR & ~FLASH_OPTSR_RDP_Msk) | value;
87+
regs->OPTCR = (regs->OPTCR & ~mask) | value;
9488
regs->OPTCR |= FLASH_OPTCR_OPTSTART;
9589

9690
/* Make sure previous write is completed. */
9791
barrier_dsync_fence_full();
9892

99-
if (flash_stm32_wait_flash_idle(dev) != 0) {
93+
rc = flash_stm32_wait_flash_idle(dev);
94+
if (rc < 0) {
10095
LOG_ERR("Err flash no idle");
101-
return;
96+
return rc;
10297
}
98+
99+
return 0;
100+
}
101+
102+
#if defined(CONFIG_FLASH_STM32_READOUT_PROTECTION)
103+
uint8_t flash_stm32_get_rdp_level(const struct device *dev)
104+
{
105+
FLASH_TypeDef *regs = FLASH_STM32_REGS(dev);
106+
107+
return (regs->OPTSR_CUR & FLASH_OPTSR_RDP_Msk) >> FLASH_OPTSR_RDP_Pos;
108+
}
109+
110+
void flash_stm32_set_rdp_level(const struct device *dev, uint8_t level)
111+
{
112+
write_optb(dev, FLASH_OPTSR_RDP_Msk,
113+
(uint32_t)level << FLASH_OPTSR_RDP_Pos);
103114
}
104115
#endif /* CONFIG_FLASH_STM32_READOUT_PROTECTION */
105116

0 commit comments

Comments
 (0)