• Home
  • Raw
  • Download

Lines Matching refs:regs

157 static void wait_busy(struct ocotp_regs *regs, unsigned int delay_us)  in wait_busy()  argument
159 while (readl(&regs->ctrl) & BM_CTRL_BUSY) in wait_busy()
163 static void clear_error(struct ocotp_regs *regs) in clear_error() argument
165 writel(BM_CTRL_ERROR, &regs->ctrl_clr); in clear_error()
168 static int prepare_access(struct ocotp_regs **regs, u32 bank, u32 word, in prepare_access() argument
171 *regs = (struct ocotp_regs *)OCOTP_BASE_ADDR; in prepare_access()
174 word >= ARRAY_SIZE((*regs)->bank[0].fuse_regs) >> 2 || in prepare_access()
182 word >= ARRAY_SIZE((*regs)->bank[0].fuse_regs) >> 3) { in prepare_access()
190 wait_busy(*regs, 1); in prepare_access()
191 clear_error(*regs); in prepare_access()
196 static int finish_access(struct ocotp_regs *regs, const char *caller) in finish_access() argument
200 err = !!(readl(&regs->ctrl) & BM_CTRL_ERROR); in finish_access()
201 clear_error(regs); in finish_access()
205 writel(1, &regs->pdn); in finish_access()
215 static int prepare_read(struct ocotp_regs **regs, u32 bank, u32 word, u32 *val, in prepare_read() argument
218 return prepare_access(regs, bank, word, val != NULL, caller); in prepare_read()
223 struct ocotp_regs *regs; in fuse_read() local
228 ret = prepare_read(&regs, bank, word, val, __func__); in fuse_read()
235 *val = readl(&regs->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_read()
238 if (readl(&regs->out_status) & BM_OUT_STATUS_DED) { in fuse_read()
239 writel(BM_OUT_STATUS_DED, &regs->out_status_clr); in fuse_read()
244 return finish_access(regs, __func__); in fuse_read()
248 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
262 clrsetbits_le32(&regs->timing, BM_TIMING_FSOURCE | BM_TIMING_PROG, in set_timing()
266 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
272 static void set_timing(struct ocotp_regs *regs) in set_timing() argument
290 clrsetbits_le32(&regs->timing, BM_TIMING_STROBE_READ | BM_TIMING_RELAX | in set_timing()
295 static void setup_direct_access(struct ocotp_regs *regs, u32 bank, u32 word, in setup_direct_access() argument
313 set_timing(regs); in setup_direct_access()
314 clrsetbits_le32(&regs->ctrl, BM_CTRL_WR_UNLOCK | BM_CTRL_ADDR, in setup_direct_access()
321 struct ocotp_regs *regs; in fuse_sense() local
329 ret = prepare_read(&regs, bank, word, val, __func__); in fuse_sense()
333 setup_direct_access(regs, bank, word, false); in fuse_sense()
334 writel(BM_READ_CTRL_READ_FUSE, &regs->read_ctrl); in fuse_sense()
335 wait_busy(regs, 1); in fuse_sense()
337 *val = readl((&regs->read_fuse_data0) + (word << 2)); in fuse_sense()
339 *val = readl(&regs->read_fuse_data); in fuse_sense()
343 if (readl(&regs->out_status) & BM_OUT_STATUS_DED) { in fuse_sense()
344 writel(BM_OUT_STATUS_DED, &regs->out_status_clr); in fuse_sense()
350 return finish_access(regs, __func__); in fuse_sense()
353 static int prepare_write(struct ocotp_regs **regs, u32 bank, u32 word, in prepare_write() argument
377 return prepare_access(regs, bank, word, true, caller); in prepare_write()
382 struct ocotp_regs *regs; in fuse_prog() local
385 ret = prepare_write(&regs, bank, word, __func__); in fuse_prog()
389 setup_direct_access(regs, bank, word, true); in fuse_prog()
393 writel(0, &regs->data1); in fuse_prog()
394 writel(0, &regs->data2); in fuse_prog()
395 writel(0, &regs->data3); in fuse_prog()
396 writel(val, &regs->data0); in fuse_prog()
399 writel(val, &regs->data1); in fuse_prog()
400 writel(0, &regs->data2); in fuse_prog()
401 writel(0, &regs->data3); in fuse_prog()
402 writel(0, &regs->data0); in fuse_prog()
405 writel(0, &regs->data1); in fuse_prog()
406 writel(val, &regs->data2); in fuse_prog()
407 writel(0, &regs->data3); in fuse_prog()
408 writel(0, &regs->data0); in fuse_prog()
411 writel(0, &regs->data1); in fuse_prog()
412 writel(0, &regs->data2); in fuse_prog()
413 writel(val, &regs->data3); in fuse_prog()
414 writel(0, &regs->data0); in fuse_prog()
417 wait_busy(regs, BV_TIMING_PROG_US); in fuse_prog()
419 writel(val, &regs->data); in fuse_prog()
420 wait_busy(regs, BV_TIMING_STROBE_PROG_US); in fuse_prog()
425 if (readl(&regs->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_prog()
426 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), &regs->out_status_clr); in fuse_prog()
432 return finish_access(regs, __func__); in fuse_prog()
437 struct ocotp_regs *regs; in fuse_override() local
442 ret = prepare_write(&regs, bank, word, __func__); in fuse_override()
449 writel(val, &regs->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_override()
452 if (readl(&regs->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_override()
453 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), &regs->out_status_clr); in fuse_override()
459 return finish_access(regs, __func__); in fuse_override()