Lines Matching refs:regs

153 static void wait_busy(struct ocotp_regs *regs, unsigned int delay_us)  in wait_busy()  argument
155 while (readl(&regs->ctrl) & BM_CTRL_BUSY) in wait_busy()
159 static void clear_error(struct ocotp_regs *regs) in clear_error() argument
161 writel(BM_CTRL_ERROR, &regs->ctrl_clr); in clear_error()
164 static int prepare_access(struct ocotp_regs **regs, u32 bank, u32 word, in prepare_access() argument
167 *regs = (struct ocotp_regs *)OCOTP_BASE_ADDR; in prepare_access()
170 word >= ARRAY_SIZE((*regs)->bank[0].fuse_regs) >> 2 || in prepare_access()
178 word >= ARRAY_SIZE((*regs)->bank[0].fuse_regs) >> 3) { in prepare_access()
186 wait_busy(*regs, 1); in prepare_access()
187 clear_error(*regs); in prepare_access()
192 static int finish_access(struct ocotp_regs *regs, const char *caller) in finish_access() argument
196 err = !!(readl(&regs->ctrl) & BM_CTRL_ERROR); in finish_access()
197 clear_error(regs); in finish_access()
201 writel(1, &regs->pdn); in finish_access()
211 static int prepare_read(struct ocotp_regs **regs, u32 bank, u32 word, u32 *val, in prepare_read() argument
214 return prepare_access(regs, bank, word, val != NULL, caller); in prepare_read()
219 struct ocotp_regs *regs; in fuse_read() local
224 ret = prepare_read(&regs, bank, word, val, __func__); in fuse_read()
231 *val = readl(&regs->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_read()
234 if (readl(&regs->out_status) & BM_OUT_STATUS_DED) { in fuse_read()
235 writel(BM_OUT_STATUS_DED, &regs->out_status_clr); in fuse_read()
240 return finish_access(regs, __func__); in fuse_read()
244 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
258 clrsetbits_le32(&regs->timing, BM_TIMING_FSOURCE | BM_TIMING_PROG, in set_timing()
262 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
268 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
286 clrsetbits_le32(&regs->timing, BM_TIMING_STROBE_READ | BM_TIMING_RELAX | in set_timing()
291 static void setup_direct_access(struct ocotp_regs *regs, u32 bank, u32 word, in setup_direct_access() argument
307 set_timing(regs); in setup_direct_access()
308 clrsetbits_le32(&regs->ctrl, BM_CTRL_WR_UNLOCK | BM_CTRL_ADDR, in setup_direct_access()
315 struct ocotp_regs *regs; in fuse_sense() local
318 ret = prepare_read(&regs, bank, word, val, __func__); in fuse_sense()
322 setup_direct_access(regs, bank, word, false); in fuse_sense()
323 writel(BM_READ_CTRL_READ_FUSE, &regs->read_ctrl); in fuse_sense()
324 wait_busy(regs, 1); in fuse_sense()
326 *val = readl((&regs->read_fuse_data0) + (word << 2)); in fuse_sense()
328 *val = readl(&regs->read_fuse_data); in fuse_sense()
332 if (readl(&regs->out_status) & BM_OUT_STATUS_DED) { in fuse_sense()
333 writel(BM_OUT_STATUS_DED, &regs->out_status_clr); in fuse_sense()
339 return finish_access(regs, __func__); in fuse_sense()
342 static int prepare_write(struct ocotp_regs **regs, u32 bank, u32 word, in prepare_write() argument
345 return prepare_access(regs, bank, word, true, caller); in prepare_write()
350 struct ocotp_regs *regs; in fuse_prog() local
353 ret = prepare_write(&regs, bank, word, __func__); in fuse_prog()
357 setup_direct_access(regs, bank, word, true); in fuse_prog()
361 writel(0, &regs->data1); in fuse_prog()
362 writel(0, &regs->data2); in fuse_prog()
363 writel(0, &regs->data3); in fuse_prog()
364 writel(val, &regs->data0); in fuse_prog()
367 writel(val, &regs->data1); in fuse_prog()
368 writel(0, &regs->data2); in fuse_prog()
369 writel(0, &regs->data3); in fuse_prog()
370 writel(0, &regs->data0); in fuse_prog()
373 writel(0, &regs->data1); in fuse_prog()
374 writel(val, &regs->data2); in fuse_prog()
375 writel(0, &regs->data3); in fuse_prog()
376 writel(0, &regs->data0); in fuse_prog()
379 writel(0, &regs->data1); in fuse_prog()
380 writel(0, &regs->data2); in fuse_prog()
381 writel(val, &regs->data3); in fuse_prog()
382 writel(0, &regs->data0); in fuse_prog()
385 wait_busy(regs, BV_TIMING_PROG_US); in fuse_prog()
387 writel(val, &regs->data); in fuse_prog()
388 wait_busy(regs, BV_TIMING_STROBE_PROG_US); in fuse_prog()
393 if (readl(&regs->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_prog()
394 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), &regs->out_status_clr); in fuse_prog()
400 return finish_access(regs, __func__); in fuse_prog()
405 struct ocotp_regs *regs; in fuse_override() local
410 ret = prepare_write(&regs, bank, word, __func__); in fuse_override()
417 writel(val, &regs->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_override()
420 if (readl(&regs->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_override()
421 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), &regs->out_status_clr); in fuse_override()
427 return finish_access(regs, __func__); in fuse_override()