diff --git a/drivers/flash/flash_realtek_rts5912.c b/drivers/flash/flash_realtek_rts5912.c index 4bfa19d1f1e..0708f593c7c 100644 --- a/drivers/flash/flash_realtek_rts5912.c +++ b/drivers/flash/flash_realtek_rts5912.c @@ -427,9 +427,36 @@ static int flash_read_sr2(const struct device *dev, uint8_t *val) } #endif +#ifdef CONFIG_FLASH_EX_OP_ENABLED +static int flash_set_wp(const struct device *dev, uint8_t *val) +{ + const struct flash_rts5912_dev_config *config = dev->config; + volatile struct reg_spic_reg *spic_reg = config->regs; + + if (!val) { + return -EINVAL; + } + + if (*val) { + spic_reg->CTRLR2 |= SPIC_CTRLR2_WPN_SET; + } + + return 0; +} + +static int flash_get_wp(const struct device *dev, uint8_t *val) +{ + const struct flash_rts5912_dev_config *config = dev->config; + volatile struct reg_spic_reg *spic_reg = config->regs; + + *val = (uint8_t)(spic_reg->CTRLR2 & SPIC_CTRLR2_WPN_SET); + + return 0; +} +#endif + static int flash_wait_till_ready(const struct device *dev) { - int ret; int timeout = TIMEOUT_SPIBUSY; uint8_t sr = 0; @@ -437,10 +464,7 @@ static int flash_wait_till_ready(const struct device *dev) * while a program page requires about 40 cycles. */ do { - ret = flash_read_sr(dev, &sr); - if (ret < 0) { - return ret; - } + flash_read_sr(dev, &sr); if (!(sr & SPI_NOR_WIP_BIT)) { return 0; } @@ -751,6 +775,12 @@ static int flash_rts5912_ex_op(const struct device *dev, uint16_t opcode, const case FLASH_RTS5912_EX_OP_RD_SR2: ret = flash_read_sr2(dev, (uint8_t *)in); break; + case FLASH_RTS5912_EX_OP_SET_WP: + ret = flash_set_wp(dev, (uint8_t *)out); + break; + case FLASH_RTS5912_EX_OP_GET_WP: + ret = flash_get_wp(dev, (uint8_t *)in); + break; } k_sem_give(&dev_data->sem); diff --git a/include/zephyr/drivers/flash/rts5912_flash_api_ex.h b/include/zephyr/drivers/flash/rts5912_flash_api_ex.h index bb5220b29f8..62d99d2bd45 100644 --- a/include/zephyr/drivers/flash/rts5912_flash_api_ex.h +++ b/include/zephyr/drivers/flash/rts5912_flash_api_ex.h @@ -13,6 +13,8 @@ enum flash_rts5912_ex_ops { FLASH_RTS5912_EX_OP_WR_SR2, FLASH_RTS5912_EX_OP_RD_SR, FLASH_RTS5912_EX_OP_RD_SR2, + FLASH_RTS5912_EX_OP_SET_WP, + FLASH_RTS5912_EX_OP_GET_WP, }; #endif /* __ZEPHYR_INCLUDE_DRIVERS_RTS5912_FLASH_API_EX_H__ */ diff --git a/soc/realtek/ec/rts5912/reg/reg_spic.h b/soc/realtek/ec/rts5912/reg/reg_spic.h index 902fa65b422..961756b7de7 100644 --- a/soc/realtek/ec/rts5912/reg/reg_spic.h +++ b/soc/realtek/ec/rts5912/reg/reg_spic.h @@ -37,7 +37,8 @@ struct reg_spic_reg { uint16_t HALF; uint32_t WORD; } DR; - const uint32_t RESERVED2[44]; + const uint32_t RESERVED2[43]; + uint32_t CTRLR2; uint32_t FBAUD; uint32_t USERLENGTH; const uint32_t RESERVED3[3]; @@ -107,6 +108,8 @@ struct reg_spic_reg { #define SPIC_RISR_FSEIR BIT(5UL) #define SPIC_RISR_USEIR BIT(9UL) #define SPIC_RISR_TFSIR BIT(10UL) +/* CTRLR2 */ +#define SPIC_CTRLR2_WPN_SET BIT(1UL) /* USERLENGTH */ #define SPIC_USERLENGTH_RDDUMMYLEN_Pos (0UL) #define SPIC_USERLENGTH_RDDUMMYLEN_Msk GENMASK(11, 0)