Lines Matching refs:regs
153 static void wait_busy(struct ocotp_regs *regs, unsigned int delay_us) in wait_busy() argument
155 while (readl(®s->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, ®s->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(®s->ctrl) & BM_CTRL_ERROR); in finish_access()
197 clear_error(regs); in finish_access()
201 writel(1, ®s->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(®s, bank, word, val, __func__); in fuse_read()
231 *val = readl(®s->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_read()
234 if (readl(®s->out_status) & BM_OUT_STATUS_DED) { in fuse_read()
235 writel(BM_OUT_STATUS_DED, ®s->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(®s->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(®s->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(®s->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(®s, 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, ®s->read_ctrl); in fuse_sense()
324 wait_busy(regs, 1); in fuse_sense()
326 *val = readl((®s->read_fuse_data0) + (word << 2)); in fuse_sense()
328 *val = readl(®s->read_fuse_data); in fuse_sense()
332 if (readl(®s->out_status) & BM_OUT_STATUS_DED) { in fuse_sense()
333 writel(BM_OUT_STATUS_DED, ®s->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(®s, bank, word, __func__); in fuse_prog()
357 setup_direct_access(regs, bank, word, true); in fuse_prog()
361 writel(0, ®s->data1); in fuse_prog()
362 writel(0, ®s->data2); in fuse_prog()
363 writel(0, ®s->data3); in fuse_prog()
364 writel(val, ®s->data0); in fuse_prog()
367 writel(val, ®s->data1); in fuse_prog()
368 writel(0, ®s->data2); in fuse_prog()
369 writel(0, ®s->data3); in fuse_prog()
370 writel(0, ®s->data0); in fuse_prog()
373 writel(0, ®s->data1); in fuse_prog()
374 writel(val, ®s->data2); in fuse_prog()
375 writel(0, ®s->data3); in fuse_prog()
376 writel(0, ®s->data0); in fuse_prog()
379 writel(0, ®s->data1); in fuse_prog()
380 writel(0, ®s->data2); in fuse_prog()
381 writel(val, ®s->data3); in fuse_prog()
382 writel(0, ®s->data0); in fuse_prog()
385 wait_busy(regs, BV_TIMING_PROG_US); in fuse_prog()
387 writel(val, ®s->data); in fuse_prog()
388 wait_busy(regs, BV_TIMING_STROBE_PROG_US); in fuse_prog()
393 if (readl(®s->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_prog()
394 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), ®s->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(®s, bank, word, __func__); in fuse_override()
417 writel(val, ®s->bank[phy_bank].fuse_regs[phy_word << 2]); in fuse_override()
420 if (readl(®s->out_status) & (BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED)) { in fuse_override()
421 writel((BM_OUT_STATUS_PROGFAIL | BM_OUT_STATUS_LOCKED), ®s->out_status_clr); in fuse_override()
427 return finish_access(regs, __func__); in fuse_override()