Lines Matching refs:vfe
20 #define IS_LITE (vfe->id >= 2 ? 1 : 0)
28 static inline int reg_update_rdi(struct vfe_device *vfe, int n) in reg_update_rdi() argument
51 static inline int bus_irq_mask_0_rdi_rup(struct vfe_device *vfe, int n) in bus_irq_mask_0_rdi_rup() argument
57 static inline int bus_irq_mask_0_comp_done(struct vfe_device *vfe, int n) in bus_irq_mask_0_comp_done() argument
97 static u32 vfe_hw_version(struct vfe_device *vfe) in vfe_hw_version() argument
99 u32 hw_version = readl_relaxed(vfe->base + VFE_HW_VERSION); in vfe_hw_version()
105 dev_dbg(vfe->camss->dev, "VFE HW Version = %u.%u.%u\n", gen, rev, step); in vfe_hw_version()
110 static void vfe_global_reset(struct vfe_device *vfe) in vfe_global_reset() argument
112 writel_relaxed(IRQ_MASK_0_RESET_ACK, vfe->base + VFE_IRQ_MASK(0)); in vfe_global_reset()
113 writel_relaxed(GLOBAL_RESET_HW_AND_REG, vfe->base + VFE_GLOBAL_RESET_CMD); in vfe_global_reset()
116 static void vfe_wm_start(struct vfe_device *vfe, u8 wm, struct vfe_line *line) in vfe_wm_start() argument
124 writel_relaxed(WM_CGC_OVERRIDE_ALL, vfe->base + VFE_BUS_WM_CGC_OVERRIDE); in vfe_wm_start()
126 writel_relaxed(0x0, vfe->base + VFE_BUS_WM_TEST_BUS_CTRL); in vfe_wm_start()
129 vfe->base + VFE_BUS_WM_FRAME_INCR(wm)); in vfe_wm_start()
130 writel_relaxed(0xf, vfe->base + VFE_BUS_WM_BURST_LIMIT(wm)); in vfe_wm_start()
132 vfe->base + VFE_BUS_WM_IMAGE_CFG_0(wm)); in vfe_wm_start()
134 vfe->base + VFE_BUS_WM_IMAGE_CFG_2(wm)); in vfe_wm_start()
135 writel_relaxed(0, vfe->base + VFE_BUS_WM_PACKER_CFG(wm)); in vfe_wm_start()
138 writel_relaxed(0, vfe->base + VFE_BUS_WM_FRAMEDROP_PERIOD(wm)); in vfe_wm_start()
139 writel_relaxed(1, vfe->base + VFE_BUS_WM_FRAMEDROP_PATTERN(wm)); in vfe_wm_start()
140 writel_relaxed(0, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PERIOD(wm)); in vfe_wm_start()
141 writel_relaxed(1, vfe->base + VFE_BUS_WM_IRQ_SUBSAMPLE_PATTERN(wm)); in vfe_wm_start()
144 vfe->base + VFE_BUS_WM_CFG(wm)); in vfe_wm_start()
147 static void vfe_wm_stop(struct vfe_device *vfe, u8 wm) in vfe_wm_stop() argument
150 writel_relaxed(0, vfe->base + VFE_BUS_WM_CFG(wm)); in vfe_wm_stop()
153 static void vfe_wm_update(struct vfe_device *vfe, u8 wm, u32 addr, in vfe_wm_update() argument
157 writel_relaxed(addr, vfe->base + VFE_BUS_WM_IMAGE_ADDR(wm)); in vfe_wm_update()
160 static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id) in vfe_reg_update() argument
162 vfe->reg_update |= REG_UPDATE_RDI(vfe, line_id); in vfe_reg_update()
163 writel_relaxed(vfe->reg_update, vfe->base + VFE_REG_UPDATE_CMD); in vfe_reg_update()
166 static inline void vfe_reg_update_clear(struct vfe_device *vfe, in vfe_reg_update_clear() argument
169 vfe->reg_update &= ~REG_UPDATE_RDI(vfe, line_id); in vfe_reg_update_clear()
172 static void vfe_enable_irq_common(struct vfe_device *vfe) in vfe_enable_irq_common() argument
176 vfe->base + VFE_IRQ_MASK(0)); in vfe_enable_irq_common()
177 writel_relaxed(BUS_IRQ_MASK_0_RDI_RUP(vfe, 0) | in vfe_enable_irq_common()
178 BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(0)), in vfe_enable_irq_common()
179 vfe->base + VFE_BUS_IRQ_MASK(0)); in vfe_enable_irq_common()
182 static void vfe_isr_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id);
183 static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm);
194 struct vfe_device *vfe = dev; in vfe_isr() local
197 status = readl_relaxed(vfe->base + VFE_IRQ_STATUS(0)); in vfe_isr()
198 writel_relaxed(status, vfe->base + VFE_IRQ_CLEAR(0)); in vfe_isr()
199 writel_relaxed(IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_IRQ_CMD); in vfe_isr()
202 vfe_isr_reset_ack(vfe); in vfe_isr()
205 u32 status = readl_relaxed(vfe->base + VFE_BUS_IRQ_STATUS(0)); in vfe_isr()
207 writel_relaxed(status, vfe->base + VFE_BUS_IRQ_CLEAR(0)); in vfe_isr()
208 writel_relaxed(1, vfe->base + VFE_BUS_IRQ_CLEAR_GLOBAL); in vfe_isr()
210 if (status & BUS_IRQ_MASK_0_RDI_RUP(vfe, 0)) in vfe_isr()
211 vfe_isr_reg_update(vfe, 0); in vfe_isr()
213 if (status & BUS_IRQ_MASK_0_COMP_DONE(vfe, RDI_COMP_GROUP(0))) in vfe_isr()
214 vfe_isr_wm_done(vfe, 0); in vfe_isr()
226 static int vfe_halt(struct vfe_device *vfe) in vfe_halt() argument
234 struct vfe_device *vfe = to_vfe(line); in vfe_get_output() local
239 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_get_output()
243 dev_err(vfe->camss->dev, "Output is running\n"); in vfe_get_output()
249 wm_idx = vfe_reserve_wm(vfe, line->id); in vfe_get_output()
251 dev_err(vfe->camss->dev, "Can not reserve wm\n"); in vfe_get_output()
258 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_get_output()
263 vfe_release_wm(vfe, output->wm_idx[0]); in vfe_get_output()
266 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_get_output()
273 struct vfe_device *vfe = to_vfe(line); in vfe_enable_output() local
278 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_enable_output()
280 vfe_reg_update_clear(vfe, line->id); in vfe_enable_output()
283 dev_err(vfe->camss->dev, "Output is not in reserved state %d\n", in vfe_enable_output()
285 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_enable_output()
297 vfe_wm_start(vfe, output->wm_idx[0], line); in vfe_enable_output()
304 vfe_wm_update(vfe, output->wm_idx[0], output->buf[i]->addr[0], line); in vfe_enable_output()
307 vfe_reg_update(vfe, line->id); in vfe_enable_output()
309 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_enable_output()
316 struct vfe_device *vfe = to_vfe(line); in vfe_disable_output() local
324 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_disable_output()
326 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_disable_output()
330 dev_err(vfe->camss->dev, "VFE idle timeout - resetting\n"); in vfe_disable_output()
331 vfe_reset(vfe); in vfe_disable_output()
337 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_disable_output()
339 vfe_wm_stop(vfe, output->wm_idx[i]); in vfe_disable_output()
340 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_disable_output()
353 struct vfe_device *vfe = to_vfe(line); in vfe_enable() local
356 mutex_lock(&vfe->stream_lock); in vfe_enable()
358 if (!vfe->stream_count) in vfe_enable()
359 vfe_enable_irq_common(vfe); in vfe_enable()
361 vfe->stream_count++; in vfe_enable()
363 mutex_unlock(&vfe->stream_lock); in vfe_enable()
373 vfe->was_streaming = 1; in vfe_enable()
381 mutex_lock(&vfe->stream_lock); in vfe_enable()
383 vfe->stream_count--; in vfe_enable()
385 mutex_unlock(&vfe->stream_lock); in vfe_enable()
398 struct vfe_device *vfe = to_vfe(line); in vfe_disable() local
404 mutex_lock(&vfe->stream_lock); in vfe_disable()
406 vfe->stream_count--; in vfe_disable()
408 mutex_unlock(&vfe->stream_lock); in vfe_disable()
418 static void vfe_isr_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id) in vfe_isr_reg_update() argument
423 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_isr_reg_update()
424 vfe_reg_update_clear(vfe, line_id); in vfe_isr_reg_update()
426 output = &vfe->line[line_id].output; in vfe_isr_reg_update()
433 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_reg_update()
441 static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm) in vfe_isr_wm_done() argument
443 struct vfe_line *line = &vfe->line[vfe->wm_output_map[wm]]; in vfe_isr_wm_done()
450 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_isr_wm_done()
452 if (vfe->wm_output_map[wm] == VFE_LINE_NONE) { in vfe_isr_wm_done()
453 dev_err_ratelimited(vfe->camss->dev, in vfe_isr_wm_done()
457 output = &vfe->line[vfe->wm_output_map[wm]].output; in vfe_isr_wm_done()
461 dev_err_ratelimited(vfe->camss->dev, in vfe_isr_wm_done()
477 vfe_wm_update(vfe, output->wm_idx[0], output->buf[index]->addr[0], line); in vfe_isr_wm_done()
481 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_wm_done()
488 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_isr_wm_done()
495 static void vfe_pm_domain_off(struct vfe_device *vfe) in vfe_pm_domain_off() argument
504 static int vfe_pm_domain_on(struct vfe_device *vfe) in vfe_pm_domain_on() argument
523 struct vfe_device *vfe = to_vfe(line); in vfe_queue_buffer() local
529 spin_lock_irqsave(&vfe->output_lock, flags); in vfe_queue_buffer()
533 vfe_wm_update(vfe, output->wm_idx[0], buf->addr[0], line); in vfe_queue_buffer()
538 spin_unlock_irqrestore(&vfe->output_lock, flags); in vfe_queue_buffer()
548 static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) in vfe_subdev_init() argument
550 vfe->video_ops = vfe_video_ops_480; in vfe_subdev_init()
551 vfe->line_num = 1; in vfe_subdev_init()