Lines Matching refs:vfe

3  * camss-vfe-gen1.c
11 #include "camss-vfe.h"
12 #include "camss-vfe-gen1.h"
18 int vfe_gen1_halt(struct vfe_device *vfe)
22 reinit_completion(&vfe->halt_complete);
24 vfe->ops_gen1->halt_request(vfe);
26 time = wait_for_completion_timeout(&vfe->halt_complete,
29 dev_err(vfe->camss->dev, "VFE halt timeout\n");
38 struct vfe_device *vfe = to_vfe(line);
40 const struct vfe_hw_ops *ops = vfe->ops;
45 spin_lock_irqsave(&vfe->output_lock, flags);
48 spin_unlock_irqrestore(&vfe->output_lock, flags);
52 dev_err(vfe->camss->dev, "VFE sof timeout\n");
54 spin_lock_irqsave(&vfe->output_lock, flags);
56 vfe->ops_gen1->wm_enable(vfe, output->wm_idx[i], 0);
58 ops->reg_update(vfe, line->id);
60 spin_unlock_irqrestore(&vfe->output_lock, flags);
64 dev_err(vfe->camss->dev, "VFE reg update timeout\n");
66 spin_lock_irqsave(&vfe->output_lock, flags);
69 vfe->ops_gen1->wm_frame_based(vfe, output->wm_idx[0], 0);
70 vfe->ops_gen1->bus_disconnect_wm_from_rdi(vfe, output->wm_idx[0], line->id);
71 vfe->ops_gen1->enable_irq_wm_line(vfe, output->wm_idx[0], line->id, 0);
72 vfe->ops_gen1->set_cgc_override(vfe, output->wm_idx[0], 0);
73 spin_unlock_irqrestore(&vfe->output_lock, flags);
76 vfe->ops_gen1->wm_line_based(vfe, output->wm_idx[i], NULL, i, 0);
77 vfe->ops_gen1->set_cgc_override(vfe, output->wm_idx[i], 0);
80 vfe->ops_gen1->enable_irq_pix_line(vfe, 0, line->id, 0);
81 vfe->ops_gen1->set_module_cfg(vfe, 0);
82 vfe->ops_gen1->set_realign_cfg(vfe, line, 0);
83 vfe->ops_gen1->set_xbar_cfg(vfe, output, 0);
84 vfe->ops_gen1->set_camif_cmd(vfe, 0);
86 spin_unlock_irqrestore(&vfe->output_lock, flags);
88 vfe->ops_gen1->camif_wait_for_stop(vfe, vfe->camss->dev);
102 struct vfe_device *vfe = to_vfe(line);
108 mutex_lock(&vfe->stream_lock);
110 if (vfe->stream_count == 1)
111 vfe->ops_gen1->bus_enable_wr_if(vfe, 0);
113 vfe->stream_count--;
115 mutex_unlock(&vfe->stream_lock);
120 static void vfe_output_init_addrs(struct vfe_device *vfe,
141 vfe->ops_gen1->wm_set_ping_addr(vfe, output->wm_idx[i], ping_addr);
142 vfe->ops_gen1->wm_set_pong_addr(vfe, output->wm_idx[i], pong_addr);
144 vfe->ops_gen1->bus_reload_wm(vfe, output->wm_idx[i]);
148 static void vfe_output_frame_drop(struct vfe_device *vfe,
161 vfe->ops_gen1->wm_set_framedrop_period(vfe, output->wm_idx[i], drop_period);
162 vfe->ops_gen1->wm_set_framedrop_pattern(vfe, output->wm_idx[i], drop_pattern);
165 vfe->ops->reg_update(vfe, container_of(output, struct vfe_line, output)->id);
170 struct vfe_device *vfe = to_vfe(line);
172 const struct vfe_hw_ops *ops = vfe->ops;
179 ub_size = vfe->ops_gen1->get_ub_size(vfe->id);
193 spin_lock_irqsave(&vfe->output_lock, flags);
195 ops->reg_update_clear(vfe, line->id);
198 dev_err(vfe->camss->dev, "Output is not in reserved state %d\n", output->state);
199 spin_unlock_irqrestore(&vfe->output_lock, flags);
220 vfe_output_frame_drop(vfe, output, 1 << frame_skip);
223 vfe_output_frame_drop(vfe, output, 3 << frame_skip);
226 vfe_output_frame_drop(vfe, output, 0);
236 vfe_output_init_addrs(vfe, output, 0, line);
239 vfe->ops_gen1->set_cgc_override(vfe, output->wm_idx[0], 1);
240 vfe->ops_gen1->enable_irq_wm_line(vfe, output->wm_idx[0], line->id, 1);
241 vfe->ops_gen1->bus_connect_wm_to_rdi(vfe, output->wm_idx[0], line->id);
242 vfe->ops_gen1->wm_set_subsample(vfe, output->wm_idx[0]);
243 vfe->ops_gen1->set_rdi_cid(vfe, line->id, 0);
244 vfe->ops_gen1->wm_set_ub_cfg(vfe, output->wm_idx[0],
246 vfe->ops_gen1->wm_frame_based(vfe, output->wm_idx[0], 1);
247 vfe->ops_gen1->wm_enable(vfe, output->wm_idx[0], 1);
248 vfe->ops_gen1->bus_reload_wm(vfe, output->wm_idx[0]);
252 vfe->ops_gen1->set_cgc_override(vfe, output->wm_idx[i], 1);
253 vfe->ops_gen1->wm_set_subsample(vfe, output->wm_idx[i]);
254 vfe->ops_gen1->wm_set_ub_cfg(vfe, output->wm_idx[i],
256 vfe->ops_gen1->wm_line_based(vfe, output->wm_idx[i],
258 vfe->ops_gen1->wm_enable(vfe, output->wm_idx[i], 1);
259 vfe->ops_gen1->bus_reload_wm(vfe, output->wm_idx[i]);
261 vfe->ops_gen1->enable_irq_pix_line(vfe, 0, line->id, 1);
262 vfe->ops_gen1->set_module_cfg(vfe, 1);
263 vfe->ops_gen1->set_camif_cfg(vfe, line);
264 vfe->ops_gen1->set_realign_cfg(vfe, line, 1);
265 vfe->ops_gen1->set_xbar_cfg(vfe, output, 1);
266 vfe->ops_gen1->set_demux_cfg(vfe, line);
267 vfe->ops_gen1->set_scale_cfg(vfe, line);
268 vfe->ops_gen1->set_crop_cfg(vfe, line);
269 vfe->ops_gen1->set_clamp_cfg(vfe);
270 vfe->ops_gen1->set_camif_cmd(vfe, 1);
273 ops->reg_update(vfe, line->id);
275 spin_unlock_irqrestore(&vfe->output_lock, flags);
282 struct vfe_device *vfe = to_vfe(line);
289 spin_lock_irqsave(&vfe->output_lock, flags);
293 dev_err(vfe->camss->dev, "Output is running\n");
313 wm_idx = vfe_reserve_wm(vfe, line->id);
315 dev_err(vfe->camss->dev, "Can not reserve wm\n");
323 spin_unlock_irqrestore(&vfe->output_lock, flags);
329 vfe_release_wm(vfe, output->wm_idx[i]);
332 spin_unlock_irqrestore(&vfe->output_lock, flags);
339 struct vfe_device *vfe = to_vfe(line);
342 mutex_lock(&vfe->stream_lock);
344 if (!vfe->stream_count) {
345 vfe->ops_gen1->enable_irq_common(vfe);
346 vfe->ops_gen1->bus_enable_wr_if(vfe, 1);
347 vfe->ops_gen1->set_qos(vfe);
348 vfe->ops_gen1->set_ds(vfe);
351 vfe->stream_count++;
353 mutex_unlock(&vfe->stream_lock);
363 vfe->was_streaming = 1;
371 mutex_lock(&vfe->stream_lock);
373 if (vfe->stream_count == 1)
374 vfe->ops_gen1->bus_enable_wr_if(vfe, 0);
376 vfe->stream_count--;
378 mutex_unlock(&vfe->stream_lock);
383 static void vfe_output_update_ping_addr(struct vfe_device *vfe,
396 vfe->ops_gen1->wm_set_ping_addr(vfe, output->wm_idx[i], addr);
398 vfe->ops_gen1->bus_reload_wm(vfe, output->wm_idx[i]);
402 static void vfe_output_update_pong_addr(struct vfe_device *vfe,
415 vfe->ops_gen1->wm_set_pong_addr(vfe, output->wm_idx[i], addr);
417 vfe->ops_gen1->bus_reload_wm(vfe, output->wm_idx[i]);
421 static void vfe_buf_update_wm_on_next(struct vfe_device *vfe,
426 vfe_output_frame_drop(vfe, output, 3);
430 dev_err_ratelimited(vfe->camss->dev,
437 static void vfe_buf_update_wm_on_last(struct vfe_device *vfe,
443 vfe_output_frame_drop(vfe, output, 1);
447 vfe_output_frame_drop(vfe, output, 0);
450 dev_err_ratelimited(vfe->camss->dev,
457 static void vfe_buf_update_wm_on_new(struct vfe_device *vfe,
472 vfe_output_update_pong_addr(vfe, output, 0, line);
474 vfe_output_update_ping_addr(vfe, output, 0, line);
476 vfe_output_frame_drop(vfe, output, 3);
480 dev_err_ratelimited(vfe->camss->dev,
489 vfe_output_init_addrs(vfe, output, 1, line);
490 vfe_output_frame_drop(vfe, output, 1);
495 dev_err_ratelimited(vfe->camss->dev,
509 * @vfe: VFE Device
511 static void vfe_isr_halt_ack(struct vfe_device *vfe)
513 complete(&vfe->halt_complete);
514 vfe->ops_gen1->halt_clear(vfe);
519 * @vfe: VFE Device
522 static void vfe_isr_sof(struct vfe_device *vfe, enum vfe_line_id line_id)
527 spin_lock_irqsave(&vfe->output_lock, flags);
528 output = &vfe->line[line_id].output;
533 spin_unlock_irqrestore(&vfe->output_lock, flags);
538 * @vfe: VFE Device
541 static void vfe_isr_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id)
544 struct vfe_line *line = &vfe->line[line_id];
547 spin_lock_irqsave(&vfe->output_lock, flags);
548 vfe->ops->reg_update_clear(vfe, line_id);
555 spin_unlock_irqrestore(&vfe->output_lock, flags);
587 vfe_output_frame_drop(vfe, output, 2);
590 vfe_output_frame_drop(vfe, output, 3);
593 vfe_output_frame_drop(vfe, output, 0);
597 vfe_output_init_addrs(vfe, output, 1, &vfe->line[line_id]);
600 spin_unlock_irqrestore(&vfe->output_lock, flags);
605 * @vfe: VFE Device
608 static void vfe_isr_wm_done(struct vfe_device *vfe, u8 wm)
618 active_index = vfe->ops_gen1->wm_get_ping_pong_status(vfe, wm);
620 spin_lock_irqsave(&vfe->output_lock, flags);
622 if (vfe->wm_output_map[wm] == VFE_LINE_NONE) {
623 dev_err_ratelimited(vfe->camss->dev,
627 output = &vfe->line[vfe->wm_output_map[wm]].output;
630 dev_err_ratelimited(vfe->camss->dev,
638 dev_err_ratelimited(vfe->camss->dev,
652 vfe_buf_update_wm_on_last(vfe, output);
655 vfe_buf_update_wm_on_next(vfe, output);
660 vfe->ops_gen1->wm_set_ping_addr(vfe, output->wm_idx[i], new_addr[i]);
663 vfe->ops_gen1->wm_set_pong_addr(vfe, output->wm_idx[i], new_addr[i]);
665 spin_unlock_irqrestore(&vfe->output_lock, flags);
675 spin_unlock_irqrestore(&vfe->output_lock, flags);
691 struct vfe_device *vfe = to_vfe(line);
697 spin_lock_irqsave(&vfe->output_lock, flags);
699 vfe_buf_update_wm_on_new(vfe, output, buf, line);
701 spin_unlock_irqrestore(&vfe->output_lock, flags);