0001
0002
0003
0004 #include <linux/clk.h>
0005 #include <linux/delay.h>
0006 #include <linux/hwspinlock.h>
0007 #include <linux/io.h>
0008 #include <linux/module.h>
0009 #include <linux/nvmem-provider.h>
0010 #include <linux/of_device.h>
0011 #include <linux/platform_device.h>
0012
0013 #define SPRD_EFUSE_ENABLE 0x20
0014 #define SPRD_EFUSE_ERR_FLAG 0x24
0015 #define SPRD_EFUSE_ERR_CLR 0x28
0016 #define SPRD_EFUSE_MAGIC_NUM 0x2c
0017 #define SPRD_EFUSE_FW_CFG 0x50
0018 #define SPRD_EFUSE_PW_SWT 0x54
0019 #define SPRD_EFUSE_MEM(val) (0x1000 + ((val) << 2))
0020
0021 #define SPRD_EFUSE_VDD_EN BIT(0)
0022 #define SPRD_EFUSE_AUTO_CHECK_EN BIT(1)
0023 #define SPRD_EFUSE_DOUBLE_EN BIT(2)
0024 #define SPRD_EFUSE_MARGIN_RD_EN BIT(3)
0025 #define SPRD_EFUSE_LOCK_WR_EN BIT(4)
0026
0027 #define SPRD_EFUSE_ERR_CLR_MASK GENMASK(13, 0)
0028
0029 #define SPRD_EFUSE_ENK1_ON BIT(0)
0030 #define SPRD_EFUSE_ENK2_ON BIT(1)
0031 #define SPRD_EFUSE_PROG_EN BIT(2)
0032
0033 #define SPRD_EFUSE_MAGIC_NUMBER 0x8810
0034
0035
0036 #define SPRD_EFUSE_BLOCK_WIDTH 4
0037
0038
0039
0040
0041
0042
0043 #define SPRD_EFUSE_NORMAL_BLOCK_NUMS 24
0044 #define SPRD_EFUSE_NORMAL_BLOCK_OFFSET 72
0045
0046
0047 #define SPRD_EFUSE_HWLOCK_TIMEOUT 5000
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 struct sprd_efuse_variant_data {
0058 u32 blk_nums;
0059 u32 blk_offset;
0060 bool blk_double;
0061 };
0062
0063 struct sprd_efuse {
0064 struct device *dev;
0065 struct clk *clk;
0066 struct hwspinlock *hwlock;
0067 struct mutex mutex;
0068 void __iomem *base;
0069 const struct sprd_efuse_variant_data *data;
0070 };
0071
0072 static const struct sprd_efuse_variant_data ums312_data = {
0073 .blk_nums = SPRD_EFUSE_NORMAL_BLOCK_NUMS,
0074 .blk_offset = SPRD_EFUSE_NORMAL_BLOCK_OFFSET,
0075 .blk_double = false,
0076 };
0077
0078
0079
0080
0081
0082
0083 static int sprd_efuse_lock(struct sprd_efuse *efuse)
0084 {
0085 int ret;
0086
0087 mutex_lock(&efuse->mutex);
0088
0089 ret = hwspin_lock_timeout_raw(efuse->hwlock,
0090 SPRD_EFUSE_HWLOCK_TIMEOUT);
0091 if (ret) {
0092 dev_err(efuse->dev, "timeout get the hwspinlock\n");
0093 mutex_unlock(&efuse->mutex);
0094 return ret;
0095 }
0096
0097 return 0;
0098 }
0099
0100 static void sprd_efuse_unlock(struct sprd_efuse *efuse)
0101 {
0102 hwspin_unlock_raw(efuse->hwlock);
0103 mutex_unlock(&efuse->mutex);
0104 }
0105
0106 static void sprd_efuse_set_prog_power(struct sprd_efuse *efuse, bool en)
0107 {
0108 u32 val = readl(efuse->base + SPRD_EFUSE_PW_SWT);
0109
0110 if (en)
0111 val &= ~SPRD_EFUSE_ENK2_ON;
0112 else
0113 val &= ~SPRD_EFUSE_ENK1_ON;
0114
0115 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
0116
0117
0118 usleep_range(1000, 1200);
0119
0120 if (en)
0121 val |= SPRD_EFUSE_ENK1_ON;
0122 else
0123 val |= SPRD_EFUSE_ENK2_ON;
0124
0125 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
0126
0127
0128 usleep_range(1000, 1200);
0129 }
0130
0131 static void sprd_efuse_set_read_power(struct sprd_efuse *efuse, bool en)
0132 {
0133 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
0134
0135 if (en)
0136 val |= SPRD_EFUSE_VDD_EN;
0137 else
0138 val &= ~SPRD_EFUSE_VDD_EN;
0139
0140 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
0141
0142
0143 usleep_range(1000, 1200);
0144 }
0145
0146 static void sprd_efuse_set_prog_lock(struct sprd_efuse *efuse, bool en)
0147 {
0148 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
0149
0150 if (en)
0151 val |= SPRD_EFUSE_LOCK_WR_EN;
0152 else
0153 val &= ~SPRD_EFUSE_LOCK_WR_EN;
0154
0155 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
0156 }
0157
0158 static void sprd_efuse_set_auto_check(struct sprd_efuse *efuse, bool en)
0159 {
0160 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
0161
0162 if (en)
0163 val |= SPRD_EFUSE_AUTO_CHECK_EN;
0164 else
0165 val &= ~SPRD_EFUSE_AUTO_CHECK_EN;
0166
0167 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
0168 }
0169
0170 static void sprd_efuse_set_data_double(struct sprd_efuse *efuse, bool en)
0171 {
0172 u32 val = readl(efuse->base + SPRD_EFUSE_ENABLE);
0173
0174 if (en)
0175 val |= SPRD_EFUSE_DOUBLE_EN;
0176 else
0177 val &= ~SPRD_EFUSE_DOUBLE_EN;
0178
0179 writel(val, efuse->base + SPRD_EFUSE_ENABLE);
0180 }
0181
0182 static void sprd_efuse_set_prog_en(struct sprd_efuse *efuse, bool en)
0183 {
0184 u32 val = readl(efuse->base + SPRD_EFUSE_PW_SWT);
0185
0186 if (en)
0187 val |= SPRD_EFUSE_PROG_EN;
0188 else
0189 val &= ~SPRD_EFUSE_PROG_EN;
0190
0191 writel(val, efuse->base + SPRD_EFUSE_PW_SWT);
0192 }
0193
0194 static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub,
0195 bool lock, u32 *data)
0196 {
0197 u32 status;
0198 int ret = 0;
0199
0200
0201
0202
0203
0204
0205 writel(SPRD_EFUSE_MAGIC_NUMBER,
0206 efuse->base + SPRD_EFUSE_MAGIC_NUM);
0207
0208
0209
0210
0211
0212 sprd_efuse_set_prog_power(efuse, true);
0213 sprd_efuse_set_prog_en(efuse, true);
0214 sprd_efuse_set_data_double(efuse, doub);
0215
0216
0217
0218
0219
0220 if (lock)
0221 sprd_efuse_set_auto_check(efuse, true);
0222
0223 writel(*data, efuse->base + SPRD_EFUSE_MEM(blk));
0224
0225
0226 if (lock)
0227 sprd_efuse_set_auto_check(efuse, false);
0228 sprd_efuse_set_data_double(efuse, false);
0229
0230
0231
0232
0233
0234 status = readl(efuse->base + SPRD_EFUSE_ERR_FLAG);
0235 if (status) {
0236 dev_err(efuse->dev,
0237 "write error status %u of block %d\n", status, blk);
0238
0239 writel(SPRD_EFUSE_ERR_CLR_MASK,
0240 efuse->base + SPRD_EFUSE_ERR_CLR);
0241 ret = -EBUSY;
0242 } else if (lock) {
0243 sprd_efuse_set_prog_lock(efuse, lock);
0244 writel(0, efuse->base + SPRD_EFUSE_MEM(blk));
0245 sprd_efuse_set_prog_lock(efuse, false);
0246 }
0247
0248 sprd_efuse_set_prog_power(efuse, false);
0249 writel(0, efuse->base + SPRD_EFUSE_MAGIC_NUM);
0250
0251 return ret;
0252 }
0253
0254 static int sprd_efuse_raw_read(struct sprd_efuse *efuse, int blk, u32 *val,
0255 bool doub)
0256 {
0257 u32 status;
0258
0259
0260
0261
0262
0263 sprd_efuse_set_read_power(efuse, true);
0264
0265
0266 sprd_efuse_set_data_double(efuse, doub);
0267
0268
0269 *val = readl(efuse->base + SPRD_EFUSE_MEM(blk));
0270
0271
0272 sprd_efuse_set_data_double(efuse, false);
0273
0274
0275 sprd_efuse_set_read_power(efuse, false);
0276
0277
0278
0279
0280
0281 status = readl(efuse->base + SPRD_EFUSE_ERR_FLAG);
0282 if (status) {
0283 dev_err(efuse->dev,
0284 "read error status %d of block %d\n", status, blk);
0285
0286 writel(SPRD_EFUSE_ERR_CLR_MASK,
0287 efuse->base + SPRD_EFUSE_ERR_CLR);
0288 return -EBUSY;
0289 }
0290
0291 return 0;
0292 }
0293
0294 static int sprd_efuse_read(void *context, u32 offset, void *val, size_t bytes)
0295 {
0296 struct sprd_efuse *efuse = context;
0297 bool blk_double = efuse->data->blk_double;
0298 u32 index = offset / SPRD_EFUSE_BLOCK_WIDTH + efuse->data->blk_offset;
0299 u32 blk_offset = (offset % SPRD_EFUSE_BLOCK_WIDTH) * BITS_PER_BYTE;
0300 u32 data;
0301 int ret;
0302
0303 ret = sprd_efuse_lock(efuse);
0304 if (ret)
0305 return ret;
0306
0307 ret = clk_prepare_enable(efuse->clk);
0308 if (ret)
0309 goto unlock;
0310
0311 ret = sprd_efuse_raw_read(efuse, index, &data, blk_double);
0312 if (!ret) {
0313 data >>= blk_offset;
0314 memcpy(val, &data, bytes);
0315 }
0316
0317 clk_disable_unprepare(efuse->clk);
0318
0319 unlock:
0320 sprd_efuse_unlock(efuse);
0321 return ret;
0322 }
0323
0324 static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
0325 {
0326 struct sprd_efuse *efuse = context;
0327 bool blk_double = efuse->data->blk_double;
0328 bool lock;
0329 int ret;
0330
0331 ret = sprd_efuse_lock(efuse);
0332 if (ret)
0333 return ret;
0334
0335 ret = clk_prepare_enable(efuse->clk);
0336 if (ret)
0337 goto unlock;
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347 if (bytes < SPRD_EFUSE_BLOCK_WIDTH)
0348 lock = false;
0349 else
0350 lock = true;
0351
0352 ret = sprd_efuse_raw_prog(efuse, offset, blk_double, lock, val);
0353
0354 clk_disable_unprepare(efuse->clk);
0355
0356 unlock:
0357 sprd_efuse_unlock(efuse);
0358 return ret;
0359 }
0360
0361 static int sprd_efuse_probe(struct platform_device *pdev)
0362 {
0363 struct device_node *np = pdev->dev.of_node;
0364 struct nvmem_device *nvmem;
0365 struct nvmem_config econfig = { };
0366 struct sprd_efuse *efuse;
0367 const struct sprd_efuse_variant_data *pdata;
0368 int ret;
0369
0370 pdata = of_device_get_match_data(&pdev->dev);
0371 if (!pdata) {
0372 dev_err(&pdev->dev, "No matching driver data found\n");
0373 return -EINVAL;
0374 }
0375
0376 efuse = devm_kzalloc(&pdev->dev, sizeof(*efuse), GFP_KERNEL);
0377 if (!efuse)
0378 return -ENOMEM;
0379
0380 efuse->base = devm_platform_ioremap_resource(pdev, 0);
0381 if (IS_ERR(efuse->base))
0382 return PTR_ERR(efuse->base);
0383
0384 ret = of_hwspin_lock_get_id(np, 0);
0385 if (ret < 0) {
0386 dev_err(&pdev->dev, "failed to get hwlock id\n");
0387 return ret;
0388 }
0389
0390 efuse->hwlock = devm_hwspin_lock_request_specific(&pdev->dev, ret);
0391 if (!efuse->hwlock) {
0392 dev_err(&pdev->dev, "failed to request hwlock\n");
0393 return -ENXIO;
0394 }
0395
0396 efuse->clk = devm_clk_get(&pdev->dev, "enable");
0397 if (IS_ERR(efuse->clk)) {
0398 dev_err(&pdev->dev, "failed to get enable clock\n");
0399 return PTR_ERR(efuse->clk);
0400 }
0401
0402 mutex_init(&efuse->mutex);
0403 efuse->dev = &pdev->dev;
0404 efuse->data = pdata;
0405
0406 econfig.stride = 1;
0407 econfig.word_size = 1;
0408 econfig.read_only = false;
0409 econfig.name = "sprd-efuse";
0410 econfig.size = efuse->data->blk_nums * SPRD_EFUSE_BLOCK_WIDTH;
0411 econfig.reg_read = sprd_efuse_read;
0412 econfig.reg_write = sprd_efuse_write;
0413 econfig.priv = efuse;
0414 econfig.dev = &pdev->dev;
0415 nvmem = devm_nvmem_register(&pdev->dev, &econfig);
0416 if (IS_ERR(nvmem)) {
0417 dev_err(&pdev->dev, "failed to register nvmem\n");
0418 return PTR_ERR(nvmem);
0419 }
0420
0421 return 0;
0422 }
0423
0424 static const struct of_device_id sprd_efuse_of_match[] = {
0425 { .compatible = "sprd,ums312-efuse", .data = &ums312_data },
0426 { }
0427 };
0428
0429 static struct platform_driver sprd_efuse_driver = {
0430 .probe = sprd_efuse_probe,
0431 .driver = {
0432 .name = "sprd-efuse",
0433 .of_match_table = sprd_efuse_of_match,
0434 },
0435 };
0436
0437 module_platform_driver(sprd_efuse_driver);
0438
0439 MODULE_AUTHOR("Freeman Liu <freeman.liu@spreadtrum.com>");
0440 MODULE_DESCRIPTION("Spreadtrum AP efuse driver");
0441 MODULE_LICENSE("GPL v2");