From 57116bb96fc8f4b8c9a5d7fc4f0bd57273d87ff7 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Thu, 10 Sep 2020 10:13:57 +0800 Subject: [PATCH] nvmem: rockchip-otp: Add mutex for read/write Change-Id: I4d8b1b3d8e4ad729d3beeccf2357342e45643676 Signed-off-by: Sugar Zhang --- drivers/nvmem/rockchip-otp.c | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c index 0b2bcc78403e..4609b2a97499 100644 --- a/drivers/nvmem/rockchip-otp.c +++ b/drivers/nvmem/rockchip-otp.c @@ -70,6 +70,8 @@ #define RV1126_OTP_NVM_PRSTART 0x44 #define RV1126_OTP_NVM_PRSTATE 0x48 +struct rockchip_data; + struct rockchip_otp { struct device *dev; void __iomem *base; @@ -77,6 +79,8 @@ struct rockchip_otp { int num_clks; struct reset_control *rst; struct nvmem_config *config; + const struct rockchip_data *data; + struct mutex mutex; }; struct rockchip_data { @@ -303,10 +307,40 @@ static int rv1126_otp_oem_write(void *context, unsigned int offset, void *val, return rv1126_otp_write(context, offset, val, bytes); } +static int rockchip_otp_read(void *context, unsigned int offset, void *val, + size_t bytes) +{ + struct rockchip_otp *otp = context; + int ret = -EINVAL; + + mutex_lock(&otp->mutex); + if (otp->data && otp->data->reg_read) + ret = otp->data->reg_read(context, offset, val, bytes); + mutex_unlock(&otp->mutex); + + return ret; +} + +static int rockchip_otp_write(void *context, unsigned int offset, void *val, + size_t bytes) +{ + struct rockchip_otp *otp = context; + int ret = -EINVAL; + + mutex_lock(&otp->mutex); + if (otp->data && otp->data->reg_write) + ret = otp->data->reg_write(context, offset, val, bytes); + mutex_unlock(&otp->mutex); + + return ret; +} + static struct nvmem_config otp_config = { .name = "rockchip-otp", .owner = THIS_MODULE, .read_only = true, + .reg_read = rockchip_otp_read, + .reg_write = rockchip_otp_write, .stride = 1, .word_size = 1, }; @@ -371,6 +405,8 @@ static int rockchip_otp_probe(struct platform_device *pdev) if (!otp) return -ENOMEM; + mutex_init(&otp->mutex); + otp->data = data; otp->dev = dev; otp->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(otp->base)) @@ -395,8 +431,6 @@ static int rockchip_otp_probe(struct platform_device *pdev) otp->config = &otp_config; otp->config->size = data->size; - otp->config->reg_read = data->reg_read; - otp->config->reg_write = data->reg_write; otp->config->priv = otp; otp->config->dev = dev;