Lines Matching refs:pcdev
774 static struct device *pcdev_to_dev(struct pxa_camera_dev *pcdev) in pcdev_to_dev() argument
776 return pcdev->v4l2_dev.dev; in pcdev_to_dev()
784 static void pxa_camera_dma_irq(struct pxa_camera_dev *pcdev,
789 struct pxa_camera_dev *pcdev = data; in pxa_camera_dma_irq_y() local
791 pxa_camera_dma_irq(pcdev, DMA_Y); in pxa_camera_dma_irq_y()
796 struct pxa_camera_dev *pcdev = data; in pxa_camera_dma_irq_u() local
798 pxa_camera_dma_irq(pcdev, DMA_U); in pxa_camera_dma_irq_u()
803 struct pxa_camera_dev *pcdev = data; in pxa_camera_dma_irq_v() local
805 pxa_camera_dma_irq(pcdev, DMA_V); in pxa_camera_dma_irq_v()
820 static int pxa_init_dma_channel(struct pxa_camera_dev *pcdev, in pxa_init_dma_channel() argument
824 struct dma_chan *dma_chan = pcdev->dma_chans[channel]; in pxa_init_dma_channel()
830 dev_err(pcdev_to_dev(pcdev), in pxa_init_dma_channel()
835 tx->callback_param = pcdev; in pxa_init_dma_channel()
851 dev_dbg(pcdev_to_dev(pcdev), in pxa_init_dma_channel()
858 static void pxa_video_buf_set_actdma(struct pxa_camera_dev *pcdev, in pxa_video_buf_set_actdma() argument
873 static void pxa_dma_start_channels(struct pxa_camera_dev *pcdev) in pxa_dma_start_channels() argument
877 for (i = 0; i < pcdev->channels; i++) { in pxa_dma_start_channels()
878 dev_dbg(pcdev_to_dev(pcdev), in pxa_dma_start_channels()
880 dma_async_issue_pending(pcdev->dma_chans[i]); in pxa_dma_start_channels()
884 static void pxa_dma_stop_channels(struct pxa_camera_dev *pcdev) in pxa_dma_stop_channels() argument
888 for (i = 0; i < pcdev->channels; i++) { in pxa_dma_stop_channels()
889 dev_dbg(pcdev_to_dev(pcdev), in pxa_dma_stop_channels()
891 dmaengine_terminate_all(pcdev->dma_chans[i]); in pxa_dma_stop_channels()
895 static void pxa_dma_add_tail_buf(struct pxa_camera_dev *pcdev, in pxa_dma_add_tail_buf() argument
900 for (i = 0; i < pcdev->channels; i++) { in pxa_dma_add_tail_buf()
902 dev_dbg(pcdev_to_dev(pcdev), in pxa_dma_add_tail_buf()
916 static void pxa_camera_start_capture(struct pxa_camera_dev *pcdev) in pxa_camera_start_capture() argument
920 dev_dbg(pcdev_to_dev(pcdev), "%s\n", __func__); in pxa_camera_start_capture()
921 __raw_writel(__raw_readl(pcdev->base + CISR), pcdev->base + CISR); in pxa_camera_start_capture()
923 cicr0 = __raw_readl(pcdev->base + CICR0) | CICR0_ENB; in pxa_camera_start_capture()
925 __raw_writel(cicr0, pcdev->base + CICR0); in pxa_camera_start_capture()
928 static void pxa_camera_stop_capture(struct pxa_camera_dev *pcdev) in pxa_camera_stop_capture() argument
932 pxa_dma_stop_channels(pcdev); in pxa_camera_stop_capture()
934 cicr0 = __raw_readl(pcdev->base + CICR0) & ~CICR0_ENB; in pxa_camera_stop_capture()
935 __raw_writel(cicr0, pcdev->base + CICR0); in pxa_camera_stop_capture()
937 pcdev->active = NULL; in pxa_camera_stop_capture()
938 dev_dbg(pcdev_to_dev(pcdev), "%s\n", __func__); in pxa_camera_stop_capture()
941 static void pxa_camera_wakeup(struct pxa_camera_dev *pcdev, in pxa_camera_wakeup() argument
951 vbuf->sequence = pcdev->buf_sequence++; in pxa_camera_wakeup()
954 dev_dbg(pcdev_to_dev(pcdev), "%s dequeued buffer (buf=0x%p)\n", in pxa_camera_wakeup()
957 if (list_empty(&pcdev->capture)) { in pxa_camera_wakeup()
958 pxa_camera_stop_capture(pcdev); in pxa_camera_wakeup()
962 pcdev->active = list_entry(pcdev->capture.next, in pxa_camera_wakeup()
984 static void pxa_camera_check_link_miss(struct pxa_camera_dev *pcdev, in pxa_camera_check_link_miss() argument
990 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_check_link_miss()
992 __func__, pcdev->active, is_dma_stopped); in pxa_camera_check_link_miss()
994 if (pcdev->active && is_dma_stopped) in pxa_camera_check_link_miss()
995 pxa_camera_start_capture(pcdev); in pxa_camera_check_link_miss()
998 static void pxa_camera_dma_irq(struct pxa_camera_dev *pcdev, in pxa_camera_dma_irq() argument
1008 spin_lock_irqsave(&pcdev->lock, flags); in pxa_camera_dma_irq()
1010 camera_status = __raw_readl(pcdev->base + CISR); in pxa_camera_dma_irq()
1011 dev_dbg(pcdev_to_dev(pcdev), "camera dma irq, cisr=0x%x dma=%d\n", in pxa_camera_dma_irq()
1014 if (pcdev->channels == 3) in pxa_camera_dma_irq()
1029 if (!pcdev->active) in pxa_camera_dma_irq()
1032 buf = pcdev->active; in pxa_camera_dma_irq()
1050 last_buf = list_entry(pcdev->capture.prev, in pxa_camera_dma_irq()
1052 last_status = dma_async_is_tx_complete(pcdev->dma_chans[chan], in pxa_camera_dma_irq()
1057 dev_dbg(pcdev_to_dev(pcdev), "FIFO overrun! CISR: %x\n", in pxa_camera_dma_irq()
1059 pxa_camera_stop_capture(pcdev); in pxa_camera_dma_irq()
1060 list_for_each_entry(buf, &pcdev->capture, queue) in pxa_camera_dma_irq()
1061 pxa_dma_add_tail_buf(pcdev, buf); in pxa_camera_dma_irq()
1062 pxa_camera_start_capture(pcdev); in pxa_camera_dma_irq()
1067 pxa_camera_wakeup(pcdev, buf, VB2_BUF_STATE_DONE); in pxa_camera_dma_irq()
1068 pxa_camera_check_link_miss(pcdev, last_buf->cookie[chan], in pxa_camera_dma_irq()
1073 spin_unlock_irqrestore(&pcdev->lock, flags); in pxa_camera_dma_irq()
1077 struct pxa_camera_dev *pcdev) in mclk_get_divisor() argument
1079 unsigned long mclk = pcdev->mclk; in mclk_get_divisor()
1083 lcdclk = clk_get_rate(pcdev->clk); in mclk_get_divisor()
1084 pcdev->ciclk = lcdclk; in mclk_get_divisor()
1097 if (pcdev->platform_flags & PXA_CAMERA_MCLK_EN) in mclk_get_divisor()
1098 pcdev->mclk = lcdclk / (2 * (div + 1)); in mclk_get_divisor()
1106 static void recalculate_fifo_timeout(struct pxa_camera_dev *pcdev, in recalculate_fifo_timeout() argument
1110 u32 ciclk_per_pixel = pcdev->ciclk / pclk + 1; in recalculate_fifo_timeout()
1112 __raw_writel(ciclk_per_pixel, pcdev->base + CITOR); in recalculate_fifo_timeout()
1115 static void pxa_camera_activate(struct pxa_camera_dev *pcdev) in pxa_camera_activate() argument
1120 __raw_writel(0x3ff, pcdev->base + CICR0); in pxa_camera_activate()
1122 if (pcdev->platform_flags & PXA_CAMERA_PCLK_EN) in pxa_camera_activate()
1124 if (pcdev->platform_flags & PXA_CAMERA_MCLK_EN) in pxa_camera_activate()
1126 if (pcdev->platform_flags & PXA_CAMERA_PCP) in pxa_camera_activate()
1128 if (pcdev->platform_flags & PXA_CAMERA_HSP) in pxa_camera_activate()
1130 if (pcdev->platform_flags & PXA_CAMERA_VSP) in pxa_camera_activate()
1133 __raw_writel(pcdev->mclk_divisor | cicr4, pcdev->base + CICR4); in pxa_camera_activate()
1135 if (pcdev->platform_flags & PXA_CAMERA_MCLK_EN) in pxa_camera_activate()
1137 recalculate_fifo_timeout(pcdev, pcdev->mclk); in pxa_camera_activate()
1140 recalculate_fifo_timeout(pcdev, 13000000); in pxa_camera_activate()
1142 clk_prepare_enable(pcdev->clk); in pxa_camera_activate()
1145 static void pxa_camera_deactivate(struct pxa_camera_dev *pcdev) in pxa_camera_deactivate() argument
1147 clk_disable_unprepare(pcdev->clk); in pxa_camera_deactivate()
1152 struct pxa_camera_dev *pcdev = from_work(pcdev, t, eof_bh_work); in pxa_camera_eof_bh_work() local
1156 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_eof_bh_work()
1158 __raw_readl(pcdev->base + CISR)); in pxa_camera_eof_bh_work()
1161 cifr = __raw_readl(pcdev->base + CIFR) | CIFR_RESET_F; in pxa_camera_eof_bh_work()
1162 __raw_writel(cifr, pcdev->base + CIFR); in pxa_camera_eof_bh_work()
1164 pcdev->active = list_first_entry(&pcdev->capture, in pxa_camera_eof_bh_work()
1166 buf = pcdev->active; in pxa_camera_eof_bh_work()
1167 pxa_video_buf_set_actdma(pcdev, buf); in pxa_camera_eof_bh_work()
1169 pxa_dma_start_channels(pcdev); in pxa_camera_eof_bh_work()
1174 struct pxa_camera_dev *pcdev = data; in pxa_camera_irq() local
1177 status = __raw_readl(pcdev->base + CISR); in pxa_camera_irq()
1178 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_irq()
1184 __raw_writel(status, pcdev->base + CISR); in pxa_camera_irq()
1187 cicr0 = __raw_readl(pcdev->base + CICR0) | CICR0_EOFM; in pxa_camera_irq()
1188 __raw_writel(cicr0, pcdev->base + CICR0); in pxa_camera_irq()
1189 queue_work(system_bh_wq, &pcdev->eof_bh_work); in pxa_camera_irq()
1195 static void pxa_camera_setup_cicr(struct pxa_camera_dev *pcdev, in pxa_camera_setup_cicr() argument
1200 int ret = sensor_call(pcdev, sensor, g_skip_top_lines, &y_skip_top); in pxa_camera_setup_cicr()
1209 switch (pcdev->current_fmt->host_fmt->bits_per_sample) { in pxa_camera_setup_cicr()
1228 if (pcdev->platform_flags & PXA_CAMERA_PCLK_EN) in pxa_camera_setup_cicr()
1230 if (pcdev->platform_flags & PXA_CAMERA_MCLK_EN) in pxa_camera_setup_cicr()
1239 cicr0 = __raw_readl(pcdev->base + CICR0); in pxa_camera_setup_cicr()
1241 __raw_writel(cicr0 & ~CICR0_ENB, pcdev->base + CICR0); in pxa_camera_setup_cicr()
1243 cicr1 = CICR1_PPL_VAL(pcdev->current_pix.width - 1) | bpp | dw; in pxa_camera_setup_cicr()
1247 pcdev->channels = 3; in pxa_camera_setup_cicr()
1273 cicr3 = CICR3_LPF_VAL(pcdev->current_pix.height - 1) | in pxa_camera_setup_cicr()
1275 cicr4 |= pcdev->mclk_divisor; in pxa_camera_setup_cicr()
1277 __raw_writel(cicr1, pcdev->base + CICR1); in pxa_camera_setup_cicr()
1278 __raw_writel(cicr2, pcdev->base + CICR2); in pxa_camera_setup_cicr()
1279 __raw_writel(cicr3, pcdev->base + CICR3); in pxa_camera_setup_cicr()
1280 __raw_writel(cicr4, pcdev->base + CICR4); in pxa_camera_setup_cicr()
1283 cicr0 = (cicr0 & CICR0_ENB) | (pcdev->platform_flags & PXA_CAMERA_MASTER ? in pxa_camera_setup_cicr()
1286 __raw_writel(cicr0, pcdev->base + CICR0); in pxa_camera_setup_cicr()
1307 static int pxa_buffer_init(struct pxa_camera_dev *pcdev, in pxa_buffer_init() argument
1312 int nb_channels = pcdev->channels; in pxa_buffer_init()
1333 dev_err(pcdev_to_dev(pcdev), in pxa_buffer_init()
1338 ret = pxa_init_dma_channel(pcdev, buf, i, in pxa_buffer_init()
1353 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue); in pxac_vb2_cleanup() local
1355 dev_dbg(pcdev_to_dev(pcdev), in pxac_vb2_cleanup()
1363 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue); in pxac_vb2_queue() local
1365 dev_dbg(pcdev_to_dev(pcdev), in pxac_vb2_queue()
1367 __func__, vb, pcdev->channels, vb2_get_plane_payload(vb, 0), in pxac_vb2_queue()
1368 pcdev->active); in pxac_vb2_queue()
1370 list_add_tail(&buf->queue, &pcdev->capture); in pxac_vb2_queue()
1372 pxa_dma_add_tail_buf(pcdev, buf); in pxac_vb2_queue()
1383 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue); in pxac_vb2_prepare() local
1390 switch (pcdev->channels) { in pxac_vb2_prepare()
1393 vb2_set_plane_payload(vb, 0, pcdev->current_pix.sizeimage); in pxac_vb2_prepare()
1399 dev_dbg(pcdev_to_dev(pcdev), in pxac_vb2_prepare()
1401 __func__, vb, pcdev->channels, vb2_get_plane_payload(vb, 0)); in pxac_vb2_prepare()
1403 WARN_ON(!pcdev->current_fmt); in pxac_vb2_prepare()
1420 pxa_video_buf_set_actdma(pcdev, buf); in pxac_vb2_prepare()
1427 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue); in pxac_vb2_init() local
1430 dev_dbg(pcdev_to_dev(pcdev), in pxac_vb2_init()
1432 __func__, pcdev->channels); in pxac_vb2_init()
1434 return pxa_buffer_init(pcdev, buf); in pxac_vb2_init()
1442 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vq); in pxac_vb2_queue_setup() local
1443 int size = pcdev->current_pix.sizeimage; in pxac_vb2_queue_setup()
1445 dev_dbg(pcdev_to_dev(pcdev), in pxac_vb2_queue_setup()
1457 switch (pcdev->channels) { in pxac_vb2_queue_setup()
1474 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vq); in pxac_vb2_start_streaming() local
1476 dev_dbg(pcdev_to_dev(pcdev), "%s(count=%d) active=%p\n", in pxac_vb2_start_streaming()
1477 __func__, count, pcdev->active); in pxac_vb2_start_streaming()
1479 pcdev->buf_sequence = 0; in pxac_vb2_start_streaming()
1480 if (!pcdev->active) in pxac_vb2_start_streaming()
1481 pxa_camera_start_capture(pcdev); in pxac_vb2_start_streaming()
1488 struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vq); in pxac_vb2_stop_streaming() local
1491 dev_dbg(pcdev_to_dev(pcdev), "%s active=%p\n", in pxac_vb2_stop_streaming()
1492 __func__, pcdev->active); in pxac_vb2_stop_streaming()
1493 pxa_camera_stop_capture(pcdev); in pxac_vb2_stop_streaming()
1495 list_for_each_entry_safe(buf, tmp, &pcdev->capture, queue) in pxac_vb2_stop_streaming()
1496 pxa_camera_wakeup(pcdev, buf, VB2_BUF_STATE_ERROR); in pxac_vb2_stop_streaming()
1509 static int pxa_camera_init_videobuf2(struct pxa_camera_dev *pcdev) in pxa_camera_init_videobuf2() argument
1512 struct vb2_queue *vq = &pcdev->vb2_vq; in pxa_camera_init_videobuf2()
1517 vq->drv_priv = pcdev; in pxa_camera_init_videobuf2()
1520 vq->dev = pcdev->v4l2_dev.dev; in pxa_camera_init_videobuf2()
1524 vq->lock = &pcdev->mlock; in pxa_camera_init_videobuf2()
1527 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_init_videobuf2()
1536 static int pxa_camera_set_bus_param(struct pxa_camera_dev *pcdev) in pxa_camera_set_bus_param() argument
1538 unsigned int bus_width = pcdev->current_fmt->host_fmt->bits_per_sample; in pxa_camera_set_bus_param()
1540 u32 pixfmt = pcdev->current_fmt->host_fmt->fourcc; in pxa_camera_set_bus_param()
1544 if (!((1 << (bus_width - 1)) & pcdev->width_flags)) { in pxa_camera_set_bus_param()
1545 dev_err(pcdev_to_dev(pcdev), "Unsupported bus width %u", in pxa_camera_set_bus_param()
1550 pcdev->channels = 1; in pxa_camera_set_bus_param()
1554 if (pcdev->platform_flags & PXA_CAMERA_MASTER) in pxa_camera_set_bus_param()
1559 if (pcdev->platform_flags & PXA_CAMERA_HSP) in pxa_camera_set_bus_param()
1564 if (pcdev->platform_flags & PXA_CAMERA_VSP) in pxa_camera_set_bus_param()
1569 if (pcdev->platform_flags & PXA_CAMERA_PCP) in pxa_camera_set_bus_param()
1575 ret = sensor_call(pcdev, pad, get_mbus_config, 0, &cfg); in pxa_camera_set_bus_param()
1577 dev_err(pcdev_to_dev(pcdev), in pxa_camera_set_bus_param()
1596 dev_err(pcdev_to_dev(pcdev), in pxa_camera_set_bus_param()
1602 dev_err(pcdev_to_dev(pcdev), in pxa_camera_set_bus_param()
1608 pxa_camera_setup_cicr(pcdev, cfg.bus.parallel.flags, pixfmt); in pxa_camera_set_bus_param()
1638 struct pxa_camera_dev *pcdev = v4l2_dev_to_pcdev(v4l2_dev); in pxa_camera_get_formats() local
1646 ret = sensor_call(pcdev, pad, enum_mbus_code, NULL, &code); in pxa_camera_get_formats()
1653 dev_err(pcdev_to_dev(pcdev), in pxa_camera_get_formats()
1665 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_get_formats()
1676 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_get_formats()
1684 dev_dbg(pcdev_to_dev(pcdev), in pxa_camera_get_formats()
1701 static int pxa_camera_build_formats(struct pxa_camera_dev *pcdev) in pxa_camera_build_formats() argument
1705 xlate = pxa_mbus_build_fmts_xlate(&pcdev->v4l2_dev, pcdev->sensor, in pxa_camera_build_formats()
1710 pcdev->user_formats = xlate; in pxa_camera_build_formats()
1714 static void pxa_camera_destroy_formats(struct pxa_camera_dev *pcdev) in pxa_camera_destroy_formats() argument
1716 kfree(pcdev->user_formats); in pxa_camera_destroy_formats()
1730 struct pxa_camera_dev *pcdev = video_drvdata(file); in pxac_vidioc_g_register() local
1735 reg->val = __raw_readl(pcdev->base + reg->reg); in pxac_vidioc_g_register()
1743 struct pxa_camera_dev *pcdev = video_drvdata(file); in pxac_vidioc_s_register() local
1749 __raw_writel(reg->val, pcdev->base + reg->reg); in pxac_vidioc_s_register()
1757 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_vidioc_enum_fmt_vid_cap() local
1761 for (idx = 0; pcdev->user_formats[idx].code; idx++); in pxac_vidioc_enum_fmt_vid_cap()
1765 format = pcdev->user_formats[f->index].host_fmt; in pxac_vidioc_enum_fmt_vid_cap()
1773 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_vidioc_g_fmt_vid_cap() local
1776 pix->width = pcdev->current_pix.width; in pxac_vidioc_g_fmt_vid_cap()
1777 pix->height = pcdev->current_pix.height; in pxac_vidioc_g_fmt_vid_cap()
1778 pix->bytesperline = pcdev->current_pix.bytesperline; in pxac_vidioc_g_fmt_vid_cap()
1779 pix->sizeimage = pcdev->current_pix.sizeimage; in pxac_vidioc_g_fmt_vid_cap()
1780 pix->field = pcdev->current_pix.field; in pxac_vidioc_g_fmt_vid_cap()
1781 pix->pixelformat = pcdev->current_fmt->host_fmt->fourcc; in pxac_vidioc_g_fmt_vid_cap()
1782 pix->colorspace = pcdev->current_pix.colorspace; in pxac_vidioc_g_fmt_vid_cap()
1783 dev_dbg(pcdev_to_dev(pcdev), "current_fmt->fourcc: 0x%08x\n", in pxac_vidioc_g_fmt_vid_cap()
1784 pcdev->current_fmt->host_fmt->fourcc); in pxac_vidioc_g_fmt_vid_cap()
1791 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_vidioc_try_fmt_vid_cap() local
1805 xlate = pxa_mbus_xlate_by_fourcc(pcdev->user_formats, pixfmt); in pxac_vidioc_try_fmt_vid_cap()
1807 dev_warn(pcdev_to_dev(pcdev), "Format %x not found\n", pixfmt); in pxac_vidioc_try_fmt_vid_cap()
1822 ret = sensor_call(pcdev, pad, set_fmt, &pad_state, &format); in pxac_vidioc_try_fmt_vid_cap()
1836 dev_err(pcdev_to_dev(pcdev), "Field type %d unsupported.\n", in pxac_vidioc_try_fmt_vid_cap()
1858 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_vidioc_s_fmt_vid_cap() local
1867 dev_dbg(pcdev_to_dev(pcdev), in pxac_vidioc_s_fmt_vid_cap()
1871 spin_lock_irqsave(&pcdev->lock, flags); in pxac_vidioc_s_fmt_vid_cap()
1872 is_busy = pcdev->active || vb2_is_busy(&pcdev->vb2_vq); in pxac_vidioc_s_fmt_vid_cap()
1873 spin_unlock_irqrestore(&pcdev->lock, flags); in pxac_vidioc_s_fmt_vid_cap()
1882 xlate = pxa_mbus_xlate_by_fourcc(pcdev->user_formats, in pxac_vidioc_s_fmt_vid_cap()
1885 ret = sensor_call(pcdev, pad, set_fmt, NULL, &format); in pxac_vidioc_s_fmt_vid_cap()
1887 dev_warn(pcdev_to_dev(pcdev), in pxac_vidioc_s_fmt_vid_cap()
1891 dev_warn(pcdev_to_dev(pcdev), in pxac_vidioc_s_fmt_vid_cap()
1897 pcdev->current_fmt = xlate; in pxac_vidioc_s_fmt_vid_cap()
1898 pcdev->current_pix = *pix; in pxac_vidioc_s_fmt_vid_cap()
1900 ret = pxa_camera_set_bus_param(pcdev); in pxac_vidioc_s_fmt_vid_cap()
1940 static int pxac_sensor_set_power(struct pxa_camera_dev *pcdev, int on) in pxac_sensor_set_power() argument
1944 ret = sensor_call(pcdev, core, s_power, on); in pxac_sensor_set_power()
1948 dev_warn(pcdev_to_dev(pcdev), in pxac_sensor_set_power()
1958 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_fops_camera_open() local
1961 mutex_lock(&pcdev->mlock); in pxac_fops_camera_open()
1969 ret = pxac_sensor_set_power(pcdev, 1); in pxac_fops_camera_open()
1973 mutex_unlock(&pcdev->mlock); in pxac_fops_camera_open()
1979 struct pxa_camera_dev *pcdev = video_drvdata(filp); in pxac_fops_camera_release() local
1983 mutex_lock(&pcdev->mlock); in pxac_fops_camera_release()
1990 ret = pxac_sensor_set_power(pcdev, 0); in pxac_fops_camera_release()
1992 mutex_unlock(&pcdev->mlock); in pxac_fops_camera_release()
2050 struct pxa_camera_dev *pcdev = v4l2_dev_to_pcdev(v4l2_dev); in pxa_camera_sensor_bound() local
2051 struct video_device *vdev = &pcdev->vdev; in pxa_camera_sensor_bound()
2052 struct v4l2_pix_format *pix = &pcdev->current_pix; in pxa_camera_sensor_bound()
2058 dev_info(pcdev_to_dev(pcdev), "%s(): trying to bind a device\n", in pxa_camera_sensor_bound()
2060 mutex_lock(&pcdev->mlock); in pxa_camera_sensor_bound()
2063 vdev->lock = &pcdev->mlock; in pxa_camera_sensor_bound()
2064 pcdev->sensor = subdev; in pxa_camera_sensor_bound()
2065 pcdev->vdev.queue = &pcdev->vb2_vq; in pxa_camera_sensor_bound()
2066 pcdev->vdev.v4l2_dev = &pcdev->v4l2_dev; in pxa_camera_sensor_bound()
2067 pcdev->vdev.ctrl_handler = subdev->ctrl_handler; in pxa_camera_sensor_bound()
2068 video_set_drvdata(&pcdev->vdev, pcdev); in pxa_camera_sensor_bound()
2070 err = pxa_camera_build_formats(pcdev); in pxa_camera_sensor_bound()
2072 dev_err(pcdev_to_dev(pcdev), "building formats failed: %d\n", in pxa_camera_sensor_bound()
2077 pcdev->current_fmt = pcdev->user_formats; in pxa_camera_sensor_bound()
2083 pcdev->current_fmt->host_fmt); in pxa_camera_sensor_bound()
2085 pxa_mbus_image_size(pcdev->current_fmt->host_fmt, in pxa_camera_sensor_bound()
2087 pix->pixelformat = pcdev->current_fmt->host_fmt->fourcc; in pxa_camera_sensor_bound()
2088 v4l2_fill_mbus_format(mf, pix, pcdev->current_fmt->code); in pxa_camera_sensor_bound()
2090 err = pxac_sensor_set_power(pcdev, 1); in pxa_camera_sensor_bound()
2094 err = sensor_call(pcdev, pad, set_fmt, NULL, &format); in pxa_camera_sensor_bound()
2102 err = pxa_camera_init_videobuf2(pcdev); in pxa_camera_sensor_bound()
2106 err = video_register_device(&pcdev->vdev, VFL_TYPE_VIDEO, -1); in pxa_camera_sensor_bound()
2109 pcdev->sensor = NULL; in pxa_camera_sensor_bound()
2111 dev_info(pcdev_to_dev(pcdev), in pxa_camera_sensor_bound()
2117 err = pxac_sensor_set_power(pcdev, 0); in pxa_camera_sensor_bound()
2119 mutex_unlock(&pcdev->mlock); in pxa_camera_sensor_bound()
2127 struct pxa_camera_dev *pcdev = v4l2_dev_to_pcdev(notifier->v4l2_dev); in pxa_camera_sensor_unbind() local
2129 mutex_lock(&pcdev->mlock); in pxa_camera_sensor_unbind()
2130 dev_info(pcdev_to_dev(pcdev), in pxa_camera_sensor_unbind()
2135 __raw_writel(0x3ff, pcdev->base + CICR0); in pxa_camera_sensor_unbind()
2138 pxa_dma_stop_channels(pcdev); in pxa_camera_sensor_unbind()
2140 pxa_camera_destroy_formats(pcdev); in pxa_camera_sensor_unbind()
2142 video_unregister_device(&pcdev->vdev); in pxa_camera_sensor_unbind()
2143 pcdev->sensor = NULL; in pxa_camera_sensor_unbind()
2145 mutex_unlock(&pcdev->mlock); in pxa_camera_sensor_unbind()
2158 struct pxa_camera_dev *pcdev = dev_get_drvdata(dev); in pxa_camera_suspend() local
2161 pcdev->save_cicr[i++] = __raw_readl(pcdev->base + CICR0); in pxa_camera_suspend()
2162 pcdev->save_cicr[i++] = __raw_readl(pcdev->base + CICR1); in pxa_camera_suspend()
2163 pcdev->save_cicr[i++] = __raw_readl(pcdev->base + CICR2); in pxa_camera_suspend()
2164 pcdev->save_cicr[i++] = __raw_readl(pcdev->base + CICR3); in pxa_camera_suspend()
2165 pcdev->save_cicr[i++] = __raw_readl(pcdev->base + CICR4); in pxa_camera_suspend()
2167 if (pcdev->sensor) in pxa_camera_suspend()
2168 ret = pxac_sensor_set_power(pcdev, 0); in pxa_camera_suspend()
2175 struct pxa_camera_dev *pcdev = dev_get_drvdata(dev); in pxa_camera_resume() local
2178 __raw_writel(pcdev->save_cicr[i++] & ~CICR0_ENB, pcdev->base + CICR0); in pxa_camera_resume()
2179 __raw_writel(pcdev->save_cicr[i++], pcdev->base + CICR1); in pxa_camera_resume()
2180 __raw_writel(pcdev->save_cicr[i++], pcdev->base + CICR2); in pxa_camera_resume()
2181 __raw_writel(pcdev->save_cicr[i++], pcdev->base + CICR3); in pxa_camera_resume()
2182 __raw_writel(pcdev->save_cicr[i++], pcdev->base + CICR4); in pxa_camera_resume()
2184 if (pcdev->sensor) { in pxa_camera_resume()
2185 ret = pxac_sensor_set_power(pcdev, 1); in pxa_camera_resume()
2189 if (!ret && pcdev->active) in pxa_camera_resume()
2190 pxa_camera_start_capture(pcdev); in pxa_camera_resume()
2196 struct pxa_camera_dev *pcdev) in pxa_camera_pdata_from_dt() argument
2205 pcdev->platform_flags |= PXA_CAMERA_MCLK_EN; in pxa_camera_pdata_from_dt()
2206 pcdev->mclk = mclk_rate; in pxa_camera_pdata_from_dt()
2223 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_4; in pxa_camera_pdata_from_dt()
2226 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_5; in pxa_camera_pdata_from_dt()
2229 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_8; in pxa_camera_pdata_from_dt()
2232 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_9; in pxa_camera_pdata_from_dt()
2235 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_10; in pxa_camera_pdata_from_dt()
2242 pcdev->platform_flags |= PXA_CAMERA_MASTER; in pxa_camera_pdata_from_dt()
2244 pcdev->platform_flags |= PXA_CAMERA_HSP; in pxa_camera_pdata_from_dt()
2246 pcdev->platform_flags |= PXA_CAMERA_VSP; in pxa_camera_pdata_from_dt()
2248 pcdev->platform_flags |= PXA_CAMERA_PCLK_EN | PXA_CAMERA_PCP; in pxa_camera_pdata_from_dt()
2250 pcdev->platform_flags |= PXA_CAMERA_PCLK_EN; in pxa_camera_pdata_from_dt()
2252 asd = v4l2_async_nf_add_fwnode_remote(&pcdev->notifier, in pxa_camera_pdata_from_dt()
2265 struct pxa_camera_dev *pcdev; in pxa_camera_probe() local
2280 pcdev = devm_kzalloc(&pdev->dev, sizeof(*pcdev), GFP_KERNEL); in pxa_camera_probe()
2281 if (!pcdev) { in pxa_camera_probe()
2286 pcdev->clk = devm_clk_get(&pdev->dev, NULL); in pxa_camera_probe()
2287 if (IS_ERR(pcdev->clk)) in pxa_camera_probe()
2288 return PTR_ERR(pcdev->clk); in pxa_camera_probe()
2297 pcdev->irq = irq; in pxa_camera_probe()
2298 pcdev->base = base; in pxa_camera_probe()
2300 err = v4l2_device_register(&pdev->dev, &pcdev->v4l2_dev); in pxa_camera_probe()
2304 v4l2_async_nf_init(&pcdev->notifier, &pcdev->v4l2_dev); in pxa_camera_probe()
2305 pcdev->res = res; in pxa_camera_probe()
2306 pcdev->pdata = pdev->dev.platform_data; in pxa_camera_probe()
2307 if (pcdev->pdata) { in pxa_camera_probe()
2310 pcdev->platform_flags = pcdev->pdata->flags; in pxa_camera_probe()
2311 pcdev->mclk = pcdev->pdata->mclk_10khz * 10000; in pxa_camera_probe()
2312 asd = v4l2_async_nf_add_i2c(&pcdev->notifier, in pxa_camera_probe()
2313 pcdev->pdata->sensor_i2c_adapter_id, in pxa_camera_probe()
2314 pcdev->pdata->sensor_i2c_address, in pxa_camera_probe()
2319 err = pxa_camera_pdata_from_dt(&pdev->dev, pcdev); in pxa_camera_probe()
2326 if (!(pcdev->platform_flags & (PXA_CAMERA_DATAWIDTH_8 | in pxa_camera_probe()
2333 pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_10; in pxa_camera_probe()
2335 if (pcdev->platform_flags & PXA_CAMERA_DATAWIDTH_8) in pxa_camera_probe()
2336 pcdev->width_flags = 1 << 7; in pxa_camera_probe()
2337 if (pcdev->platform_flags & PXA_CAMERA_DATAWIDTH_9) in pxa_camera_probe()
2338 pcdev->width_flags |= 1 << 8; in pxa_camera_probe()
2339 if (pcdev->platform_flags & PXA_CAMERA_DATAWIDTH_10) in pxa_camera_probe()
2340 pcdev->width_flags |= 1 << 9; in pxa_camera_probe()
2341 if (!pcdev->mclk) { in pxa_camera_probe()
2344 pcdev->mclk = 20000000; in pxa_camera_probe()
2347 pcdev->mclk_divisor = mclk_get_divisor(pdev, pcdev); in pxa_camera_probe()
2349 INIT_LIST_HEAD(&pcdev->capture); in pxa_camera_probe()
2350 spin_lock_init(&pcdev->lock); in pxa_camera_probe()
2351 mutex_init(&pcdev->mlock); in pxa_camera_probe()
2354 pcdev->dma_chans[0] = dma_request_chan(&pdev->dev, "CI_Y"); in pxa_camera_probe()
2355 if (IS_ERR(pcdev->dma_chans[0])) { in pxa_camera_probe()
2357 err = PTR_ERR(pcdev->dma_chans[0]); in pxa_camera_probe()
2361 pcdev->dma_chans[1] = dma_request_chan(&pdev->dev, "CI_U"); in pxa_camera_probe()
2362 if (IS_ERR(pcdev->dma_chans[1])) { in pxa_camera_probe()
2364 err = PTR_ERR(pcdev->dma_chans[1]); in pxa_camera_probe()
2368 pcdev->dma_chans[2] = dma_request_chan(&pdev->dev, "CI_V"); in pxa_camera_probe()
2369 if (IS_ERR(pcdev->dma_chans[2])) { in pxa_camera_probe()
2371 err = PTR_ERR(pcdev->dma_chans[2]); in pxa_camera_probe()
2376 config.src_addr = pcdev->res->start + CIBR0 + i * 8; in pxa_camera_probe()
2377 err = dmaengine_slave_config(pcdev->dma_chans[i], &config); in pxa_camera_probe()
2385 INIT_WORK(&pcdev->eof_bh_work, pxa_camera_eof_bh_work); in pxa_camera_probe()
2387 pxa_camera_activate(pcdev); in pxa_camera_probe()
2389 platform_set_drvdata(pdev, pcdev); in pxa_camera_probe()
2391 err = pxa_camera_init_videobuf2(pcdev); in pxa_camera_probe()
2396 err = devm_request_irq(&pdev->dev, pcdev->irq, pxa_camera_irq, 0, in pxa_camera_probe()
2397 PXA_CAM_DRV_NAME, pcdev); in pxa_camera_probe()
2403 pcdev->notifier.ops = &pxa_camera_sensor_ops; in pxa_camera_probe()
2404 err = v4l2_async_nf_register(&pcdev->notifier); in pxa_camera_probe()
2410 pxa_camera_deactivate(pcdev); in pxa_camera_probe()
2411 cancel_work_sync(&pcdev->eof_bh_work); in pxa_camera_probe()
2413 dma_release_channel(pcdev->dma_chans[2]); in pxa_camera_probe()
2415 dma_release_channel(pcdev->dma_chans[1]); in pxa_camera_probe()
2417 dma_release_channel(pcdev->dma_chans[0]); in pxa_camera_probe()
2419 v4l2_async_nf_cleanup(&pcdev->notifier); in pxa_camera_probe()
2421 v4l2_device_unregister(&pcdev->v4l2_dev); in pxa_camera_probe()
2427 struct pxa_camera_dev *pcdev = platform_get_drvdata(pdev); in pxa_camera_remove() local
2429 pxa_camera_deactivate(pcdev); in pxa_camera_remove()
2430 cancel_work_sync(&pcdev->eof_bh_work); in pxa_camera_remove()
2431 dma_release_channel(pcdev->dma_chans[0]); in pxa_camera_remove()
2432 dma_release_channel(pcdev->dma_chans[1]); in pxa_camera_remove()
2433 dma_release_channel(pcdev->dma_chans[2]); in pxa_camera_remove()
2435 v4l2_async_nf_unregister(&pcdev->notifier); in pxa_camera_remove()
2436 v4l2_async_nf_cleanup(&pcdev->notifier); in pxa_camera_remove()
2438 v4l2_device_unregister(&pcdev->v4l2_dev); in pxa_camera_remove()