Lines Matching refs:cam

128 #define sensor_call(cam, optype, func, args...) \
129 v4l2_subdev_call(cam->sensor, optype, func, ##args)
134 #define cam_err(cam, fmt, arg...) \
135 dev_err(&(cam)->platdev->dev, fmt, ##arg);
136 #define cam_warn(cam, fmt, arg...) \
137 dev_warn(&(cam)->platdev->dev, fmt, ##arg);
138 #define cam_dbg(cam, fmt, arg...) \
139 dev_dbg(&(cam)->platdev->dev, fmt, ##arg);
181 static int via_sensor_power_setup(struct via_camera *cam)
185 cam->power_gpio = viafb_gpio_lookup("VGPIO3");
186 cam->reset_gpio = viafb_gpio_lookup("VGPIO2");
187 if (!gpio_is_valid(cam->power_gpio) || !gpio_is_valid(cam->reset_gpio)) {
188 dev_err(&cam->platdev->dev, "Unable to find GPIO lines\n");
191 ret = gpio_request(cam->power_gpio, "viafb-camera");
193 dev_err(&cam->platdev->dev, "Unable to request power GPIO\n");
196 ret = gpio_request(cam->reset_gpio, "viafb-camera");
198 dev_err(&cam->platdev->dev, "Unable to request reset GPIO\n");
199 gpio_free(cam->power_gpio);
202 gpio_direction_output(cam->power_gpio, 0);
203 gpio_direction_output(cam->reset_gpio, 0);
210 static void via_sensor_power_up(struct via_camera *cam)
212 gpio_set_value(cam->power_gpio, 1);
213 gpio_set_value(cam->reset_gpio, 0);
215 gpio_set_value(cam->reset_gpio, 1);
219 static void via_sensor_power_down(struct via_camera *cam)
221 gpio_set_value(cam->power_gpio, 0);
222 gpio_set_value(cam->reset_gpio, 0);
226 static void via_sensor_power_release(struct via_camera *cam)
228 via_sensor_power_down(cam);
229 gpio_free(cam->power_gpio);
230 gpio_free(cam->reset_gpio);
239 static int viacam_set_flip(struct via_camera *cam)
246 return v4l2_s_ctrl(NULL, cam->sensor->ctrl_handler, &ctrl);
253 static int viacam_configure_sensor(struct via_camera *cam)
260 v4l2_fill_mbus_format(&format.format, &cam->sensor_format, cam->mbus_code);
261 ret = sensor_call(cam, core, init, 0);
263 ret = sensor_call(cam, pad, set_fmt, NULL, &format);
268 ret = viacam_set_flip(cam);
282 static inline void viacam_write_reg(struct via_camera *cam,
285 iowrite32(value, cam->mmio + reg);
288 static inline int viacam_read_reg(struct via_camera *cam, int reg)
290 return ioread32(cam->mmio + reg);
293 static inline void viacam_write_reg_mask(struct via_camera *cam,
296 int tmp = viacam_read_reg(cam, reg);
299 viacam_write_reg(cam, reg, tmp);
308 struct via_camera *cam = data;
316 spin_lock(&cam->viadev->reg_lock);
317 icv = viacam_read_reg(cam, VCR_INTCTRL);
320 viacam_write_reg(cam, VCR_INTCTRL, icv);
323 spin_unlock(&cam->viadev->reg_lock);
330 static struct via_buffer *viacam_next_buffer(struct via_camera *cam)
332 if (cam->opstate != S_RUNNING)
334 if (list_empty(&cam->buffer_queue))
336 return list_entry(cam->buffer_queue.next, struct via_buffer, queue);
344 struct via_camera *cam = data;
349 mutex_lock(&cam->lock);
354 vb = viacam_next_buffer(cam);
360 bufn = (viacam_read_reg(cam, VCR_INTCTRL) & VCR_IC_ACTBUF) >> 3;
363 bufn = cam->n_cap_bufs - 1;
369 viafb_dma_copy_out_sg(cam->cb_offsets[bufn], sgt->sgl, sgt->nents);
370 vb->vbuf.sequence = cam->sequence++;
375 mutex_unlock(&cam->lock);
387 static void viacam_int_enable(struct via_camera *cam)
389 viacam_write_reg(cam, VCR_INTCTRL,
394 static void viacam_int_disable(struct via_camera *cam)
397 viacam_write_reg(cam, VCR_INTCTRL, 0);
408 static int viacam_ctlr_cbufs(struct via_camera *cam)
410 int nbuf = cam->viadev->camera_fbmem_size/cam->sensor_format.sizeimage;
418 cam->n_cap_bufs = 3;
419 viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_3BUFS,
422 cam->n_cap_bufs = 2;
423 viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_3BUFS);
425 cam_warn(cam, "Insufficient frame buffer memory\n");
431 offset = cam->fb_offset;
432 for (i = 0; i < cam->n_cap_bufs; i++) {
433 cam->cb_offsets[i] = offset;
434 cam->cb_addrs[i] = cam->fbmem + offset;
435 viacam_write_reg(cam, VCR_VBUF1 + i*4, offset & VCR_VBUF_MASK);
436 offset += cam->sensor_format.sizeimage;
458 static void viacam_set_scale(struct via_camera *cam)
463 if (cam->user_format.width == VGA_WIDTH)
466 sf = (cam->user_format.width*2048)/VGA_WIDTH;
469 if (cam->user_format.height < VGA_HEIGHT) {
470 sf = (1024*cam->user_format.height)/VGA_HEIGHT;
473 viacam_write_reg(cam, VCR_AVSCALE, avscale);
480 static void viacam_ctlr_image(struct via_camera *cam)
488 viacam_write_reg(cam, VCR_CAPINTC, ~(VCR_CI_ENABLE|VCR_CI_CLKEN));
493 viacam_write_reg(cam, VCR_HORRANGE, 0x06200120);
494 viacam_write_reg(cam, VCR_VERTRANGE, 0x01de0000);
495 viacam_set_scale(cam);
499 viacam_write_reg(cam, VCR_MAXDATA,
500 (cam->sensor_format.height << 16) |
501 (cam->sensor_format.bytesperline >> 3));
502 viacam_write_reg(cam, VCR_MAXVBI, 0);
503 viacam_write_reg(cam, VCR_VSTRIDE,
504 cam->user_format.bytesperline & VCR_VS_STRIDE);
518 if (cam->n_cap_bufs == 3)
523 if (cam->user_format.pixelformat == V4L2_PIX_FMT_YUYV)
527 viacam_write_reg(cam, VCR_CAPINTC, cicreg);
531 static int viacam_config_controller(struct via_camera *cam)
536 spin_lock_irqsave(&cam->viadev->reg_lock, flags);
537 ret = viacam_ctlr_cbufs(cam);
539 viacam_ctlr_image(cam);
540 spin_unlock_irqrestore(&cam->viadev->reg_lock, flags);
541 clear_bit(CF_CONFIG_NEEDED, &cam->flags);
548 static void viacam_start_engine(struct via_camera *cam)
550 spin_lock_irq(&cam->viadev->reg_lock);
551 viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_ENABLE, VCR_CI_ENABLE);
552 viacam_int_enable(cam);
553 (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */
554 cam->opstate = S_RUNNING;
555 spin_unlock_irq(&cam->viadev->reg_lock);
559 static void viacam_stop_engine(struct via_camera *cam)
561 spin_lock_irq(&cam->viadev->reg_lock);
562 viacam_int_disable(cam);
563 viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_ENABLE);
564 (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */
565 cam->opstate = S_IDLE;
566 spin_unlock_irq(&cam->viadev->reg_lock);
582 struct via_camera *cam = vb2_get_drv_priv(vb->vb2_queue);
585 list_add_tail(&via->queue, &cam->buffer_queue);
590 struct via_camera *cam = vb2_get_drv_priv(vb->vb2_queue);
592 if (vb2_plane_size(vb, 0) < cam->user_format.sizeimage) {
593 cam_dbg(cam,
596 cam->user_format.sizeimage);
600 vb2_set_plane_payload(vb, 0, cam->user_format.sizeimage);
610 struct via_camera *cam = vb2_get_drv_priv(vq);
611 int size = cam->user_format.sizeimage;
623 struct via_camera *cam = vb2_get_drv_priv(vq);
627 if (cam->opstate != S_IDLE) {
634 if (test_bit(CF_CONFIG_NEEDED, &cam->flags)) {
635 ret = viacam_configure_sensor(cam);
638 ret = viacam_config_controller(cam);
642 cam->sequence = 0;
649 cpu_latency_qos_add_request(&cam->qos_request, 50);
650 viacam_start_engine(cam);
653 list_for_each_entry_safe(buf, tmp, &cam->buffer_queue, queue) {
662 struct via_camera *cam = vb2_get_drv_priv(vq);
665 cpu_latency_qos_remove_request(&cam->qos_request);
666 viacam_stop_engine(cam);
668 list_for_each_entry_safe(buf, tmp, &cam->buffer_queue, queue) {
689 struct via_camera *cam = video_drvdata(filp);
696 mutex_lock(&cam->lock);
707 via_sensor_power_up(cam);
708 set_bit(CF_CONFIG_NEEDED, &cam->flags);
711 mutex_unlock(&cam->lock);
717 struct via_camera *cam = video_drvdata(filp);
720 mutex_lock(&cam->lock);
727 via_sensor_power_down(cam);
730 mutex_unlock(&cam->lock);
842 static int viacam_do_try_fmt(struct via_camera *cam,
855 ret = sensor_call(cam, pad, set_fmt, &pad_cfg, &format);
866 struct via_camera *cam = video_drvdata(filp);
869 return viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix);
876 struct via_camera *cam = video_drvdata(filp);
878 fmt->fmt.pix = cam->user_format;
885 struct via_camera *cam = video_drvdata(filp);
894 if (cam->opstate != S_IDLE)
900 ret = viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix);
906 cam->user_format = fmt->fmt.pix;
907 cam->sensor_format = sfmt.fmt.pix;
908 cam->mbus_code = f->mbus_code;
909 ret = viacam_configure_sensor(cam);
911 ret = viacam_config_controller(cam);
929 struct via_camera *cam = video_drvdata(filp);
931 return v4l2_g_parm_cap(video_devdata(filp), cam->sensor, parm);
937 struct via_camera *cam = video_drvdata(filp);
939 return v4l2_s_parm_cap(video_devdata(filp), cam->sensor, parm);
966 struct via_camera *cam = video_drvdata(filp);
969 .code = cam->mbus_code,
970 .width = cam->sensor_format.width,
971 .height = cam->sensor_format.height,
985 ret = sensor_call(cam, pad, enum_frame_interval, NULL, &fie);
1028 struct via_camera *cam = priv;
1029 enum viacam_opstate state = cam->opstate;
1031 if (cam->opstate != S_IDLE) {
1032 viacam_stop_engine(cam);
1033 cam->opstate = state; /* So resume restarts */
1041 struct via_camera *cam = priv;
1049 viacam_int_disable(cam);
1050 set_bit(CF_CONFIG_NEEDED, &cam->flags);
1054 if (!list_empty(&cam->vdev.fh_list))
1055 via_sensor_power_up(cam);
1057 via_sensor_power_down(cam);
1061 if (cam->opstate != S_IDLE) {
1062 mutex_lock(&cam->lock);
1063 ret = viacam_configure_sensor(cam);
1065 ret = viacam_config_controller(cam);
1066 mutex_unlock(&cam->lock);
1068 viacam_start_engine(cam);
1152 struct via_camera *cam;
1177 cam = kzalloc (sizeof(struct via_camera), GFP_KERNEL);
1178 if (cam == NULL)
1180 via_cam_info = cam;
1181 cam->platdev = pdev;
1182 cam->viadev = viadev;
1183 cam->opstate = S_IDLE;
1184 cam->user_format = cam->sensor_format = viacam_def_pix_format;
1185 mutex_init(&cam->lock);
1186 INIT_LIST_HEAD(&cam->buffer_queue);
1187 cam->mmio = viadev->engine_mmio;
1188 cam->fbmem = viadev->fbmem;
1189 cam->fb_offset = viadev->camera_fbmem_offset;
1190 cam->flags = 1 << CF_CONFIG_NEEDED;
1191 cam->mbus_code = via_def_mbus_code;
1195 ret = v4l2_device_register(&pdev->dev, &cam->v4l2_dev);
1200 ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10);
1203 cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler;
1218 ret = via_sensor_power_setup(cam);
1221 via_sensor_power_up(cam);
1228 cam->sensor = v4l2_i2c_new_subdev_board(&cam->v4l2_dev, sensor_adapter,
1230 if (cam->sensor == NULL) {
1238 viacam_int_disable(cam);
1240 viacam_irq, IRQF_SHARED, "via-camera", cam);
1244 vq = &cam->vq;
1247 vq->drv_priv = cam;
1250 vq->dev = cam->v4l2_dev.dev;
1254 vq->lock = &cam->lock;
1260 cam->vdev = viacam_v4l_template;
1261 cam->vdev.v4l2_dev = &cam->v4l2_dev;
1262 cam->vdev.lock = &cam->lock;
1263 cam->vdev.queue = vq;
1264 video_set_drvdata(&cam->vdev, cam);
1265 ret = video_register_device(&cam->vdev, VFL_TYPE_VIDEO, -1);
1273 viacam_pm_hooks.private = cam;
1278 via_sensor_power_down(cam);
1282 free_irq(viadev->pdev->irq, cam);
1284 via_sensor_power_release(cam);
1286 v4l2_ctrl_handler_free(&cam->ctrl_handler);
1288 v4l2_device_unregister(&cam->v4l2_dev);
1290 kfree(cam);
1296 struct via_camera *cam = via_cam_info;
1299 video_unregister_device(&cam->vdev);
1300 v4l2_device_unregister(&cam->v4l2_dev);
1304 free_irq(viadev->pdev->irq, cam);
1305 via_sensor_power_release(cam);
1306 v4l2_ctrl_handler_free(&cam->ctrl_handler);
1307 kfree(cam);