Lines Matching full:cam
125 #define sensor_call(cam, optype, func, args...) \ argument
126 v4l2_subdev_call(cam->sensor, optype, func, ##args)
131 #define cam_err(cam, fmt, arg...) \ argument
132 dev_err(&(cam)->platdev->dev, fmt, ##arg);
133 #define cam_warn(cam, fmt, arg...) \ argument
134 dev_warn(&(cam)->platdev->dev, fmt, ##arg);
135 #define cam_dbg(cam, fmt, arg...) \ argument
136 dev_dbg(&(cam)->platdev->dev, fmt, ##arg);
180 static int via_sensor_power_setup(struct via_camera *cam) in via_sensor_power_setup() argument
184 cam->power_gpio = viafb_gpio_lookup("VGPIO3"); in via_sensor_power_setup()
185 cam->reset_gpio = viafb_gpio_lookup("VGPIO2"); in via_sensor_power_setup()
186 if (!gpio_is_valid(cam->power_gpio) || !gpio_is_valid(cam->reset_gpio)) { in via_sensor_power_setup()
187 dev_err(&cam->platdev->dev, "Unable to find GPIO lines\n"); in via_sensor_power_setup()
190 ret = gpio_request(cam->power_gpio, "viafb-camera"); in via_sensor_power_setup()
192 dev_err(&cam->platdev->dev, "Unable to request power GPIO\n"); in via_sensor_power_setup()
195 ret = gpio_request(cam->reset_gpio, "viafb-camera"); in via_sensor_power_setup()
197 dev_err(&cam->platdev->dev, "Unable to request reset GPIO\n"); in via_sensor_power_setup()
198 gpio_free(cam->power_gpio); in via_sensor_power_setup()
201 gpio_direction_output(cam->power_gpio, 0); in via_sensor_power_setup()
202 gpio_direction_output(cam->reset_gpio, 0); in via_sensor_power_setup()
209 static void via_sensor_power_up(struct via_camera *cam) in via_sensor_power_up() argument
211 gpio_set_value(cam->power_gpio, 1); in via_sensor_power_up()
212 gpio_set_value(cam->reset_gpio, 0); in via_sensor_power_up()
214 gpio_set_value(cam->reset_gpio, 1); in via_sensor_power_up()
218 static void via_sensor_power_down(struct via_camera *cam) in via_sensor_power_down() argument
220 gpio_set_value(cam->power_gpio, 0); in via_sensor_power_down()
221 gpio_set_value(cam->reset_gpio, 0); in via_sensor_power_down()
225 static void via_sensor_power_release(struct via_camera *cam) in via_sensor_power_release() argument
227 via_sensor_power_down(cam); in via_sensor_power_release()
228 gpio_free(cam->power_gpio); in via_sensor_power_release()
229 gpio_free(cam->reset_gpio); in via_sensor_power_release()
238 static int viacam_set_flip(struct via_camera *cam) in viacam_set_flip() argument
245 return v4l2_s_ctrl(NULL, cam->sensor->ctrl_handler, &ctrl); in viacam_set_flip()
252 static int viacam_configure_sensor(struct via_camera *cam) in viacam_configure_sensor() argument
259 v4l2_fill_mbus_format(&format.format, &cam->sensor_format, cam->mbus_code); in viacam_configure_sensor()
260 ret = sensor_call(cam, core, init, 0); in viacam_configure_sensor()
262 ret = sensor_call(cam, pad, set_fmt, NULL, &format); in viacam_configure_sensor()
267 ret = viacam_set_flip(cam); in viacam_configure_sensor()
281 static inline void viacam_write_reg(struct via_camera *cam, in viacam_write_reg() argument
284 iowrite32(value, cam->mmio + reg); in viacam_write_reg()
287 static inline int viacam_read_reg(struct via_camera *cam, int reg) in viacam_read_reg() argument
289 return ioread32(cam->mmio + reg); in viacam_read_reg()
292 static inline void viacam_write_reg_mask(struct via_camera *cam, in viacam_write_reg_mask() argument
295 int tmp = viacam_read_reg(cam, reg); in viacam_write_reg_mask()
298 viacam_write_reg(cam, reg, tmp); in viacam_write_reg_mask()
307 struct via_camera *cam = data; in viacam_quick_irq() local
315 spin_lock(&cam->viadev->reg_lock); in viacam_quick_irq()
316 icv = viacam_read_reg(cam, VCR_INTCTRL); in viacam_quick_irq()
319 viacam_write_reg(cam, VCR_INTCTRL, icv); in viacam_quick_irq()
322 spin_unlock(&cam->viadev->reg_lock); in viacam_quick_irq()
329 static struct videobuf_buffer *viacam_next_buffer(struct via_camera *cam) in viacam_next_buffer() argument
334 spin_lock_irqsave(&cam->viadev->reg_lock, flags); in viacam_next_buffer()
335 if (cam->opstate != S_RUNNING) in viacam_next_buffer()
337 if (list_empty(&cam->buffer_queue)) in viacam_next_buffer()
339 buf = list_entry(cam->buffer_queue.next, struct videobuf_buffer, queue); in viacam_next_buffer()
347 spin_unlock_irqrestore(&cam->viadev->reg_lock, flags); in viacam_next_buffer()
358 struct via_camera *cam = data; in viacam_irq() local
365 vb = viacam_next_buffer(cam); in viacam_irq()
371 bufn = (viacam_read_reg(cam, VCR_INTCTRL) & VCR_IC_ACTBUF) >> 3; in viacam_irq()
374 bufn = cam->n_cap_bufs - 1; in viacam_irq()
379 viafb_dma_copy_out_sg(cam->cb_offsets[bufn], vdma->sglist, vdma->sglen); in viacam_irq()
381 vb->size = cam->user_format.sizeimage; in viacam_irq()
395 static void viacam_int_enable(struct via_camera *cam) in viacam_int_enable() argument
397 viacam_write_reg(cam, VCR_INTCTRL, in viacam_int_enable()
402 static void viacam_int_disable(struct via_camera *cam) in viacam_int_disable() argument
405 viacam_write_reg(cam, VCR_INTCTRL, 0); in viacam_int_disable()
416 static int viacam_ctlr_cbufs(struct via_camera *cam) in viacam_ctlr_cbufs() argument
418 int nbuf = cam->viadev->camera_fbmem_size/cam->sensor_format.sizeimage; in viacam_ctlr_cbufs()
426 cam->n_cap_bufs = 3; in viacam_ctlr_cbufs()
427 viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_3BUFS, in viacam_ctlr_cbufs()
430 cam->n_cap_bufs = 2; in viacam_ctlr_cbufs()
431 viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_3BUFS); in viacam_ctlr_cbufs()
433 cam_warn(cam, "Insufficient frame buffer memory\n"); in viacam_ctlr_cbufs()
439 offset = cam->fb_offset; in viacam_ctlr_cbufs()
440 for (i = 0; i < cam->n_cap_bufs; i++) { in viacam_ctlr_cbufs()
441 cam->cb_offsets[i] = offset; in viacam_ctlr_cbufs()
442 cam->cb_addrs[i] = cam->fbmem + offset; in viacam_ctlr_cbufs()
443 viacam_write_reg(cam, VCR_VBUF1 + i*4, offset & VCR_VBUF_MASK); in viacam_ctlr_cbufs()
444 offset += cam->sensor_format.sizeimage; in viacam_ctlr_cbufs()
466 static void viacam_set_scale(struct via_camera *cam) in viacam_set_scale() argument
471 if (cam->user_format.width == VGA_WIDTH) in viacam_set_scale()
474 sf = (cam->user_format.width*2048)/VGA_WIDTH; in viacam_set_scale()
477 if (cam->user_format.height < VGA_HEIGHT) { in viacam_set_scale()
478 sf = (1024*cam->user_format.height)/VGA_HEIGHT; in viacam_set_scale()
481 viacam_write_reg(cam, VCR_AVSCALE, avscale); in viacam_set_scale()
488 static void viacam_ctlr_image(struct via_camera *cam) in viacam_ctlr_image() argument
496 viacam_write_reg(cam, VCR_CAPINTC, ~(VCR_CI_ENABLE|VCR_CI_CLKEN)); in viacam_ctlr_image()
501 viacam_write_reg(cam, VCR_HORRANGE, 0x06200120); in viacam_ctlr_image()
502 viacam_write_reg(cam, VCR_VERTRANGE, 0x01de0000); in viacam_ctlr_image()
503 viacam_set_scale(cam); in viacam_ctlr_image()
507 viacam_write_reg(cam, VCR_MAXDATA, in viacam_ctlr_image()
508 (cam->sensor_format.height << 16) | in viacam_ctlr_image()
509 (cam->sensor_format.bytesperline >> 3)); in viacam_ctlr_image()
510 viacam_write_reg(cam, VCR_MAXVBI, 0); in viacam_ctlr_image()
511 viacam_write_reg(cam, VCR_VSTRIDE, in viacam_ctlr_image()
512 cam->user_format.bytesperline & VCR_VS_STRIDE); in viacam_ctlr_image()
526 if (cam->n_cap_bufs == 3) in viacam_ctlr_image()
531 if (cam->user_format.pixelformat == V4L2_PIX_FMT_YUYV) in viacam_ctlr_image()
535 viacam_write_reg(cam, VCR_CAPINTC, cicreg); in viacam_ctlr_image()
539 static int viacam_config_controller(struct via_camera *cam) in viacam_config_controller() argument
544 spin_lock_irqsave(&cam->viadev->reg_lock, flags); in viacam_config_controller()
545 ret = viacam_ctlr_cbufs(cam); in viacam_config_controller()
547 viacam_ctlr_image(cam); in viacam_config_controller()
548 spin_unlock_irqrestore(&cam->viadev->reg_lock, flags); in viacam_config_controller()
549 clear_bit(CF_CONFIG_NEEDED, &cam->flags); in viacam_config_controller()
556 static void viacam_start_engine(struct via_camera *cam) in viacam_start_engine() argument
558 spin_lock_irq(&cam->viadev->reg_lock); in viacam_start_engine()
559 cam->next_buf = 0; in viacam_start_engine()
560 viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_ENABLE, VCR_CI_ENABLE); in viacam_start_engine()
561 viacam_int_enable(cam); in viacam_start_engine()
562 (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */ in viacam_start_engine()
563 cam->opstate = S_RUNNING; in viacam_start_engine()
564 spin_unlock_irq(&cam->viadev->reg_lock); in viacam_start_engine()
568 static void viacam_stop_engine(struct via_camera *cam) in viacam_stop_engine() argument
570 spin_lock_irq(&cam->viadev->reg_lock); in viacam_stop_engine()
571 viacam_int_disable(cam); in viacam_stop_engine()
572 viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_ENABLE); in viacam_stop_engine()
573 (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */ in viacam_stop_engine()
574 cam->opstate = S_IDLE; in viacam_stop_engine()
575 spin_unlock_irq(&cam->viadev->reg_lock); in viacam_stop_engine()
590 struct via_camera *cam = q->priv_data; in viacam_vb_buf_setup() local
592 *size = cam->user_format.sizeimage; in viacam_vb_buf_setup()
604 struct via_camera *cam = q->priv_data; in viacam_vb_buf_prepare() local
606 vb->size = cam->user_format.sizeimage; in viacam_vb_buf_prepare()
607 vb->width = cam->user_format.width; /* bytesperline???? */ in viacam_vb_buf_prepare()
608 vb->height = cam->user_format.height; in viacam_vb_buf_prepare()
627 struct via_camera *cam = q->priv_data; in viacam_vb_buf_queue() local
634 list_add_tail(&vb->queue, &cam->buffer_queue); in viacam_vb_buf_queue()
643 struct via_camera *cam = q->priv_data; in viacam_vb_buf_release() local
645 videobuf_dma_unmap(&cam->platdev->dev, videobuf_to_dma(vb)); in viacam_vb_buf_release()
662 struct via_camera *cam = video_drvdata(filp); in viacam_open() local
664 filp->private_data = cam; in viacam_open()
669 mutex_lock(&cam->lock); in viacam_open()
670 if (cam->users == 0) { in viacam_open()
674 mutex_unlock(&cam->lock); in viacam_open()
677 via_sensor_power_up(cam); in viacam_open()
678 set_bit(CF_CONFIG_NEEDED, &cam->flags); in viacam_open()
682 videobuf_queue_sg_init(&cam->vb_queue, &viacam_vb_ops, in viacam_open()
683 &cam->platdev->dev, &cam->viadev->reg_lock, in viacam_open()
685 sizeof(struct videobuf_buffer), cam, NULL); in viacam_open()
687 (cam->users)++; in viacam_open()
688 mutex_unlock(&cam->lock); in viacam_open()
694 struct via_camera *cam = video_drvdata(filp); in viacam_release() local
696 mutex_lock(&cam->lock); in viacam_release()
697 (cam->users)--; in viacam_release()
702 if (filp == cam->owner) { in viacam_release()
703 videobuf_stop(&cam->vb_queue); in viacam_release()
710 if (cam->opstate != S_IDLE) in viacam_release()
711 viacam_stop_engine(cam); in viacam_release()
712 cam->owner = NULL; in viacam_release()
717 if (cam->users == 0) { in viacam_release()
718 videobuf_mmap_free(&cam->vb_queue); in viacam_release()
719 via_sensor_power_down(cam); in viacam_release()
722 mutex_unlock(&cam->lock); in viacam_release()
732 struct via_camera *cam = video_drvdata(filp); in viacam_read() local
735 mutex_lock(&cam->lock); in viacam_read()
739 if (cam->owner && cam->owner != filp) { in viacam_read()
743 cam->owner = filp; in viacam_read()
747 if (test_bit(CF_CONFIG_NEEDED, &cam->flags)) { in viacam_read()
748 ret = viacam_configure_sensor(cam); in viacam_read()
750 ret = viacam_config_controller(cam); in viacam_read()
759 INIT_LIST_HEAD(&cam->buffer_queue); in viacam_read()
760 viacam_start_engine(cam); in viacam_read()
761 ret = videobuf_read_stream(&cam->vb_queue, buffer, len, pos, 0, in viacam_read()
763 viacam_stop_engine(cam); in viacam_read()
767 mutex_unlock(&cam->lock); in viacam_read()
774 struct via_camera *cam = video_drvdata(filp); in viacam_poll() local
776 return videobuf_poll_stream(filp, &cam->vb_queue, pt); in viacam_poll()
782 struct via_camera *cam = video_drvdata(filp); in viacam_mmap() local
784 return videobuf_mmap_mapper(&cam->vb_queue, vma); in viacam_mmap()
906 static int viacam_do_try_fmt(struct via_camera *cam, in viacam_do_try_fmt() argument
919 ret = sensor_call(cam, pad, set_fmt, &pad_cfg, &format); in viacam_do_try_fmt()
930 struct via_camera *cam = priv; in viacam_try_fmt_vid_cap() local
934 mutex_lock(&cam->lock); in viacam_try_fmt_vid_cap()
935 ret = viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix); in viacam_try_fmt_vid_cap()
936 mutex_unlock(&cam->lock); in viacam_try_fmt_vid_cap()
944 struct via_camera *cam = priv; in viacam_g_fmt_vid_cap() local
946 mutex_lock(&cam->lock); in viacam_g_fmt_vid_cap()
947 fmt->fmt.pix = cam->user_format; in viacam_g_fmt_vid_cap()
948 mutex_unlock(&cam->lock); in viacam_g_fmt_vid_cap()
955 struct via_camera *cam = priv; in viacam_s_fmt_vid_cap() local
964 mutex_lock(&cam->lock); in viacam_s_fmt_vid_cap()
965 if (cam->opstate != S_IDLE) { in viacam_s_fmt_vid_cap()
973 ret = viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix); in viacam_s_fmt_vid_cap()
979 cam->user_format = fmt->fmt.pix; in viacam_s_fmt_vid_cap()
980 cam->sensor_format = sfmt.fmt.pix; in viacam_s_fmt_vid_cap()
981 cam->mbus_code = f->mbus_code; in viacam_s_fmt_vid_cap()
982 ret = viacam_configure_sensor(cam); in viacam_s_fmt_vid_cap()
984 ret = viacam_config_controller(cam); in viacam_s_fmt_vid_cap()
986 mutex_unlock(&cam->lock); in viacam_s_fmt_vid_cap()
1007 struct via_camera *cam = priv; in viacam_reqbufs() local
1009 return videobuf_reqbufs(&cam->vb_queue, rb); in viacam_reqbufs()
1015 struct via_camera *cam = priv; in viacam_querybuf() local
1017 return videobuf_querybuf(&cam->vb_queue, buf); in viacam_querybuf()
1022 struct via_camera *cam = priv; in viacam_qbuf() local
1024 return videobuf_qbuf(&cam->vb_queue, buf); in viacam_qbuf()
1029 struct via_camera *cam = priv; in viacam_dqbuf() local
1031 return videobuf_dqbuf(&cam->vb_queue, buf, filp->f_flags & O_NONBLOCK); in viacam_dqbuf()
1036 struct via_camera *cam = priv; in viacam_streamon() local
1042 mutex_lock(&cam->lock); in viacam_streamon()
1043 if (cam->opstate != S_IDLE) { in viacam_streamon()
1050 if (cam->owner && cam->owner != filp) { in viacam_streamon()
1054 cam->owner = filp; in viacam_streamon()
1058 if (test_bit(CF_CONFIG_NEEDED, &cam->flags)) { in viacam_streamon()
1059 ret = viacam_configure_sensor(cam); in viacam_streamon()
1062 ret = viacam_config_controller(cam); in viacam_streamon()
1072 pm_qos_add_request(&cam->qos_request, PM_QOS_CPU_DMA_LATENCY, 50); in viacam_streamon()
1076 INIT_LIST_HEAD(&cam->buffer_queue); in viacam_streamon()
1077 ret = videobuf_streamon(&cam->vb_queue); in viacam_streamon()
1079 viacam_start_engine(cam); in viacam_streamon()
1081 mutex_unlock(&cam->lock); in viacam_streamon()
1087 struct via_camera *cam = priv; in viacam_streamoff() local
1092 mutex_lock(&cam->lock); in viacam_streamoff()
1093 if (cam->opstate != S_RUNNING) { in viacam_streamoff()
1097 pm_qos_remove_request(&cam->qos_request); in viacam_streamoff()
1098 viacam_stop_engine(cam); in viacam_streamoff()
1104 ret = videobuf_streamoff(&cam->vb_queue); in viacam_streamoff()
1105 INIT_LIST_HEAD(&cam->buffer_queue); in viacam_streamoff()
1107 mutex_unlock(&cam->lock); in viacam_streamoff()
1116 struct via_camera *cam = priv; in viacam_g_parm() local
1119 mutex_lock(&cam->lock); in viacam_g_parm()
1120 ret = v4l2_g_parm_cap(video_devdata(filp), cam->sensor, parm); in viacam_g_parm()
1121 mutex_unlock(&cam->lock); in viacam_g_parm()
1122 parm->parm.capture.readbuffers = cam->n_cap_bufs; in viacam_g_parm()
1129 struct via_camera *cam = priv; in viacam_s_parm() local
1132 mutex_lock(&cam->lock); in viacam_s_parm()
1133 ret = v4l2_s_parm_cap(video_devdata(filp), cam->sensor, parm); in viacam_s_parm()
1134 mutex_unlock(&cam->lock); in viacam_s_parm()
1135 parm->parm.capture.readbuffers = cam->n_cap_bufs; in viacam_s_parm()
1156 struct via_camera *cam = priv; in viacam_enum_frameintervals() local
1159 .code = cam->mbus_code, in viacam_enum_frameintervals()
1160 .width = cam->sensor_format.width, in viacam_enum_frameintervals()
1161 .height = cam->sensor_format.height, in viacam_enum_frameintervals()
1166 mutex_lock(&cam->lock); in viacam_enum_frameintervals()
1167 ret = sensor_call(cam, pad, enum_frame_interval, NULL, &fie); in viacam_enum_frameintervals()
1168 mutex_unlock(&cam->lock); in viacam_enum_frameintervals()
1210 struct via_camera *cam = priv; in viacam_suspend() local
1211 enum viacam_opstate state = cam->opstate; in viacam_suspend()
1213 if (cam->opstate != S_IDLE) { in viacam_suspend()
1214 viacam_stop_engine(cam); in viacam_suspend()
1215 cam->opstate = state; /* So resume restarts */ in viacam_suspend()
1223 struct via_camera *cam = priv; in viacam_resume() local
1231 viacam_int_disable(cam); in viacam_resume()
1232 set_bit(CF_CONFIG_NEEDED, &cam->flags); in viacam_resume()
1236 if (cam->users > 0) in viacam_resume()
1237 via_sensor_power_up(cam); in viacam_resume()
1239 via_sensor_power_down(cam); in viacam_resume()
1243 if (cam->opstate != S_IDLE) { in viacam_resume()
1244 mutex_lock(&cam->lock); in viacam_resume()
1245 ret = viacam_configure_sensor(cam); in viacam_resume()
1247 ret = viacam_config_controller(cam); in viacam_resume()
1248 mutex_unlock(&cam->lock); in viacam_resume()
1250 viacam_start_engine(cam); in viacam_resume()
1332 struct via_camera *cam; in viacam_probe() local
1357 cam = kzalloc (sizeof(struct via_camera), GFP_KERNEL); in viacam_probe()
1358 if (cam == NULL) in viacam_probe()
1360 via_cam_info = cam; in viacam_probe()
1361 cam->platdev = pdev; in viacam_probe()
1362 cam->viadev = viadev; in viacam_probe()
1363 cam->users = 0; in viacam_probe()
1364 cam->owner = NULL; in viacam_probe()
1365 cam->opstate = S_IDLE; in viacam_probe()
1366 cam->user_format = cam->sensor_format = viacam_def_pix_format; in viacam_probe()
1367 mutex_init(&cam->lock); in viacam_probe()
1368 INIT_LIST_HEAD(&cam->buffer_queue); in viacam_probe()
1369 cam->mmio = viadev->engine_mmio; in viacam_probe()
1370 cam->fbmem = viadev->fbmem; in viacam_probe()
1371 cam->fb_offset = viadev->camera_fbmem_offset; in viacam_probe()
1372 cam->flags = 1 << CF_CONFIG_NEEDED; in viacam_probe()
1373 cam->mbus_code = via_def_mbus_code; in viacam_probe()
1377 ret = v4l2_device_register(&pdev->dev, &cam->v4l2_dev); in viacam_probe()
1382 ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10); in viacam_probe()
1385 cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler; in viacam_probe()
1400 ret = via_sensor_power_setup(cam); in viacam_probe()
1403 via_sensor_power_up(cam); in viacam_probe()
1410 cam->sensor = v4l2_i2c_new_subdev_board(&cam->v4l2_dev, sensor_adapter, in viacam_probe()
1412 if (cam->sensor == NULL) { in viacam_probe()
1420 viacam_int_disable(cam); in viacam_probe()
1422 viacam_irq, IRQF_SHARED, "via-camera", cam); in viacam_probe()
1428 cam->vdev = viacam_v4l_template; in viacam_probe()
1429 cam->vdev.v4l2_dev = &cam->v4l2_dev; in viacam_probe()
1430 ret = video_register_device(&cam->vdev, VFL_TYPE_GRABBER, -1); in viacam_probe()
1433 video_set_drvdata(&cam->vdev, cam); in viacam_probe()
1439 viacam_pm_hooks.private = cam; in viacam_probe()
1444 via_sensor_power_down(cam); in viacam_probe()
1448 free_irq(viadev->pdev->irq, cam); in viacam_probe()
1450 via_sensor_power_release(cam); in viacam_probe()
1452 v4l2_ctrl_handler_free(&cam->ctrl_handler); in viacam_probe()
1454 v4l2_device_unregister(&cam->v4l2_dev); in viacam_probe()
1456 kfree(cam); in viacam_probe()
1462 struct via_camera *cam = via_cam_info; in viacam_remove() local
1465 video_unregister_device(&cam->vdev); in viacam_remove()
1466 v4l2_device_unregister(&cam->v4l2_dev); in viacam_remove()
1467 free_irq(viadev->pdev->irq, cam); in viacam_remove()
1468 via_sensor_power_release(cam); in viacam_remove()
1469 v4l2_ctrl_handler_free(&cam->ctrl_handler); in viacam_remove()
1470 kfree(cam); in viacam_remove()