Lines Matching refs:vfe
20 #define VFE_GLOBAL_RESET_CMD (vfe_is_lite(vfe) ? 0x0c : 0x1c)
21 #define GLOBAL_RESET_HW_AND_REG (vfe_is_lite(vfe) ? BIT(1) : BIT(0))
23 #define VFE_REG_UPDATE_CMD (vfe_is_lite(vfe) ? 0x20 : 0x34)
24 static inline int reg_update_rdi(struct vfe_device *vfe, int n) in reg_update_rdi() argument
26 return vfe_is_lite(vfe) ? BIT(n) : BIT(1 + (n)); in reg_update_rdi()
30 #define VFE_IRQ_CMD (vfe_is_lite(vfe) ? 0x24 : 0x38)
33 #define VFE_IRQ_MASK(n) ((vfe_is_lite(vfe) ? 0x28 : 0x3c) + (n) * 4)
34 #define IRQ_MASK_0_RESET_ACK (vfe_is_lite(vfe) ? BIT(17) : BIT(0))
35 #define IRQ_MASK_0_BUS_TOP_IRQ (vfe_is_lite(vfe) ? BIT(4) : BIT(7))
36 #define VFE_IRQ_CLEAR(n) ((vfe_is_lite(vfe) ? 0x34 : 0x48) + (n) * 4)
37 #define VFE_IRQ_STATUS(n) ((vfe_is_lite(vfe) ? 0x40 : 0x54) + (n) * 4)
39 #define BUS_REG_BASE (vfe_is_lite(vfe) ? 0x1a00 : 0xaa00)
47 static inline int bus_irq_mask_0_rdi_rup(struct vfe_device *vfe, int n) in bus_irq_mask_0_rdi_rup() argument
49 return vfe_is_lite(vfe) ? BIT(n) : BIT(3 + (n)); in bus_irq_mask_0_rdi_rup()
53 static inline int bus_irq_mask_0_comp_done(struct vfe_device *vfe, int n) in bus_irq_mask_0_comp_done() argument
55 return vfe_is_lite(vfe) ? BIT(4 + (n)) : BIT(6 + (n)); in bus_irq_mask_0_comp_done()
90 #define RDI_WM(n) ((vfe_is_lite(vfe) ? 0 : 23) + (n))
91 #define RDI_COMP_GROUP(n) ((vfe_is_lite(vfe) ? 0 : 11) + (n))
95 static u32 vfe_hw_version(struct vfe_device *vfe) in vfe_hw_version() argument
97 u32 hw_version = readl_relaxed(vfe->base + VFE_HW_VERSION); in vfe_hw_version()
103 dev_dbg(vfe->camss->dev, "VFE HW Version = %u.%u.%u\n", gen, rev, step); in vfe_hw_version()
108 static void vfe_global_reset(struct vfe_device *vfe) in vfe_global_reset() argument
110 writel_relaxed(IRQ_MASK_0_RESET_ACK, vfe->base + VFE_IRQ_MASK(0)); in vfe_global_reset()
111 writel_relaxed(GLOBAL_RESET_HW_AND_REG, vfe->base + VFE_GLOBAL_RESET_CMD); in vfe_global_reset()
114 static void vfe_wm_start(struct vfe_device *vfe, u8 wm, struct vfe_line *line) in vfe_wm_start() argument
122 writel_relaxed(WM_CGC_OVERRIDE_ALL, vfe->base + VFE_BUS_WM_CGC_OVERRIDE); in vfe_wm_start()
124 writel_relaxed(0x0, vfe->base + VFE_BUS_WM_TEST_BUS_CTRL); in vfe_wm_start()
127 vfe->base + VFE_BUS_WM_FRAME_INCR(wm)); in vfe_wm_start()
128 writel_relaxed(0xf, vfe->base + VFE_BUS_WM_BURST_LIMIT(wm)); in vfe_wm_start()
130 vfe->base + VFE_BUS_WM_IMAGE_CFG_0(wm)); in vfe_wm_start()
132 vfe->base + VFE_BUS_WM_IMAGE_CFG_2(wm)); in vfe_wm_start()
133 writel_relaxed(0, vfe->base + VFE_BUS_WM_PACKER_CFG(wm)); in vfe_wm_start()
136 writel_relaxed(0, vfe->base + VFE_BUS_WM_FRAMEDROP_PERIOD(wm)); in vfe_wm_start()
137 writel_relaxed(1, vfe->base + VFE_BUS_WM_FRAMEDROP_PATTERN(wm)); in vfe_wm_start()
138 writel_relaxed(0, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PERIOD(wm)); in vfe_wm_start()
139 writel_relaxed(1, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PATTERN(wm)); in vfe_wm_start()
142 vfe->base + VFE_BUS_WM_CFG(wm)); in vfe_wm_start()
145 static void vfe_wm_stop(struct vfe_device *vfe, u8 wm) in vfe_wm_stop() argument
148 writel_relaxed(0, vfe->base + VFE_BUS_WM_CFG(wm)); in vfe_wm_stop()
151 static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr, in vfe_wm_update() argument
155 writel_relaxed(addr, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm)); in vfe_wm_update()
158 static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id) in vfe_reg_update() argument
160 vfe->reg_update |= REG_UPDATE_RDI(vfe, line_id); in vfe_reg_update()
161 writel_relaxed(vfe->reg_update, vfe->base + VFE_REG_UPDATE_CMD); in vfe_reg_update()
164 static inline void vfe_reg_update_clear(struct vfe_device *vfe, in vfe_reg_update_clear() argument
167 vfe->reg_update &= ~REG_UPDATE_RDI(vfe, line_id); in vfe_reg_update_clear()
170 static void vfe_enable_irq_common(struct vfe_device *vfe) in vfe_enable_irq_common() argument
174 vfe->base + VFE_IRQ_MASK(0)); in vfe_enable_irq_common()
177 static void vfe_enable_lines_irq(struct vfe_device *vfe) in vfe_enable_lines_irq() argument
184 if (vfe->line[i].output.state == VFE_OUTPUT_RESERVED || in vfe_enable_lines_irq()
185 vfe->line[i].output.state == VFE_OUTPUT_ON) { in vfe_enable_lines_irq()
186 bus_irq_mask |= BUS_IRQ_MASK_0_RDI_RUP(vfe, i) in vfe_enable_lines_irq()
187 | BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(i)); in vfe_enable_lines_irq()
191 writel_relaxed(bus_irq_mask, vfe->base + VFE_BUS_IRQ_MASK(0)); in vfe_enable_lines_irq()
194 static void vfe_isr_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id);
195 static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm);
206 struct vfe_device *vfe = dev; in vfe_isr() local
210 status = readl_relaxed(vfe->base + VFE_IRQ_STATUS(0)); in vfe_isr()
211 writel_relaxed(status, vfe->base + VFE_IRQ_CLEAR(0)); in vfe_isr()
212 writel_relaxed(IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_IRQ_CMD); in vfe_isr()
215 vfe_isr_reset_ack(vfe); in vfe_isr()
218 u32 status = readl_relaxed(vfe->base + VFE_BUS_IRQ_STATUS(0)); in vfe_isr()
220 writel_relaxed(status, vfe->base + VFE_BUS_IRQ_CLEAR(0)); in vfe_isr()
221 writel_relaxed(1, vfe->base + VFE_BUS_IRQ_CLEAR_GLOBAL); in vfe_isr()
225 if (status & BUS_IRQ_MASK_0_RDI_RUP(vfe, i)) in vfe_isr()
226 vfe_isr_reg_update(vfe, i); in vfe_isr()
228 if (status & BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(i))) in vfe_isr()
229 vfe_isr_wm_done(vfe, i); in vfe_isr()
242 static int vfe_halt(struct vfe_device *vfe) in vfe_halt() argument
250 struct vfe_device *vfe = to_vfe(line); in vfe_get_output() local
254 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_get_output()
258 dev_err(vfe->camss->dev, "Output is running\n"); in vfe_get_output()
269 vfe->wm_output_map[line->id] = line->id; in vfe_get_output()
273 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_get_output()
278 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_get_output()
286 struct vfe_device *vfe = to_vfe(line); in vfe_enable_output() local
291 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_enable_output()
293 vfe_reg_update_clear(vfe, line->id); in vfe_enable_output()
296 dev_err(vfe->camss->dev, "Output is not in reserved state %d\n", in vfe_enable_output()
298 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_enable_output()
310 vfe_wm_start(vfe, output->wm_idx[0], line); in vfe_enable_output()
317 vfe_wm_update(vfe, output->wm_idx[0], output->buf[i]->addr[0], line); in vfe_enable_output()
320 vfe_reg_update(vfe, line->id); in vfe_enable_output()
322 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_enable_output()
335 struct vfe_device *vfe = to_vfe(line); in vfe_enable() local
338 mutex_lock(&vfe->stream_lock); in vfe_enable()
340 if (!vfe->stream_count) in vfe_enable()
341 vfe_enable_irq_common(vfe); in vfe_enable()
343 vfe->stream_count++; in vfe_enable()
345 vfe_enable_lines_irq(vfe); in vfe_enable()
347 mutex_unlock(&vfe->stream_lock); in vfe_enable()
357 vfe->was_streaming = 1; in vfe_enable()
365 mutex_lock(&vfe->stream_lock); in vfe_enable()
367 vfe->stream_count--; in vfe_enable()
369 mutex_unlock(&vfe->stream_lock); in vfe_enable()
379 static void vfe_isr_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id) in vfe_isr_reg_update() argument
384 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_isr_reg_update()
385 vfe_reg_update_clear(vfe, line_id); in vfe_isr_reg_update()
387 output = &vfe->line[line_id].output; in vfe_isr_reg_update()
394 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_reg_update()
402 static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm) in vfe_isr_wm_done() argument
404 struct vfe_line *line = &vfe->line[vfe->wm_output_map[wm]]; in vfe_isr_wm_done()
411 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_isr_wm_done()
413 if (vfe->wm_output_map[wm] == VFE_LINE_NONE) { in vfe_isr_wm_done()
414 dev_err_ratelimited(vfe->camss->dev, in vfe_isr_wm_done()
418 output = &vfe->line[vfe->wm_output_map[wm]].output; in vfe_isr_wm_done()
422 dev_err_ratelimited(vfe->camss->dev, in vfe_isr_wm_done()
438 vfe_wm_update(vfe, output->wm_idx[0], output->buf[index]->addr[0], line); in vfe_isr_wm_done()
442 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_wm_done()
449 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_wm_done()
466 struct vfe_device *vfe = to_vfe(line); in vfe_queue_buffer() local
472 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_queue_buffer()
476 vfe_wm_update(vfe, output->wm_idx[0], buf->addr[0], line); in vfe_queue_buffer()
481 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_queue_buffer()
491 static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) in vfe_subdev_init() argument
493 vfe->video_ops = vfe_video_ops_480; in vfe_subdev_init()