Lines Matching refs:pcdev

183 static void cam_write(struct omap1_cam_dev *pcdev, u16 reg, u32 val)  in cam_write()  argument
185 pcdev->reg_cache[reg / sizeof(u32)] = val; in cam_write()
186 __raw_writel(val, pcdev->base + reg); in cam_write()
189 static u32 cam_read(struct omap1_cam_dev *pcdev, u16 reg, bool from_cache) in cam_read() argument
191 return !from_cache ? __raw_readl(pcdev->base + reg) : in cam_read()
192 pcdev->reg_cache[reg / sizeof(u32)]; in cam_read()
195 #define CAM_READ(pcdev, reg) \ argument
196 cam_read(pcdev, REG_##reg, false)
197 #define CAM_WRITE(pcdev, reg, val) \ argument
198 cam_write(pcdev, REG_##reg, val)
199 #define CAM_READ_CACHE(pcdev, reg) \ argument
200 cam_read(pcdev, REG_##reg, true)
210 struct omap1_cam_dev *pcdev = ici->priv; in omap1_videobuf_setup() local
214 if (!*count || *count < OMAP1_CAMERA_MIN_BUF_COUNT(pcdev->vb_mode)) in omap1_videobuf_setup()
215 *count = OMAP1_CAMERA_MIN_BUF_COUNT(pcdev->vb_mode); in omap1_videobuf_setup()
255 struct omap1_cam_dev *pcdev = ici->priv; in omap1_videobuf_prepare() local
292 free_buffer(vq, buf, pcdev->vb_mode); in omap1_videobuf_prepare()
345 static struct omap1_cam_buf *prepare_next_vb(struct omap1_cam_dev *pcdev) in prepare_next_vb() argument
353 buf = pcdev->ready; in prepare_next_vb()
355 if (list_empty(&pcdev->capture)) in prepare_next_vb()
357 buf = list_entry(pcdev->capture.next, in prepare_next_vb()
360 pcdev->ready = buf; in prepare_next_vb()
364 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in prepare_next_vb()
370 set_dma_dest_params(pcdev->dma_ch, buf, pcdev->vb_mode); in prepare_next_vb()
426 static void start_capture(struct omap1_cam_dev *pcdev) in start_capture() argument
428 struct omap1_cam_buf *buf = pcdev->active; in start_capture()
429 u32 ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); in start_capture()
430 u32 mode = CAM_READ_CACHE(pcdev, MODE) & ~EN_V_DOWN; in start_capture()
443 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in start_capture()
445 CAM_WRITE(pcdev, MODE, mode | RAZ_FIFO); in start_capture()
447 omap_start_dma(pcdev->dma_ch); in start_capture()
449 if (pcdev->vb_mode == OMAP1_CAM_DMA_SG) { in start_capture()
455 try_next_sgbuf(pcdev->dma_ch, buf); in start_capture()
459 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock | LCLK_EN); in start_capture()
461 CAM_WRITE(pcdev, MODE, mode); in start_capture()
464 static void suspend_capture(struct omap1_cam_dev *pcdev) in suspend_capture() argument
466 u32 ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); in suspend_capture()
468 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in suspend_capture()
469 omap_stop_dma(pcdev->dma_ch); in suspend_capture()
472 static void disable_capture(struct omap1_cam_dev *pcdev) in disable_capture() argument
474 u32 mode = CAM_READ_CACHE(pcdev, MODE); in disable_capture()
476 CAM_WRITE(pcdev, MODE, mode & ~(IRQ_MASK | DMA)); in disable_capture()
484 struct omap1_cam_dev *pcdev = ici->priv; in omap1_videobuf_queue() local
488 list_add_tail(&vb->queue, &pcdev->capture); in omap1_videobuf_queue()
491 if (pcdev->active) { in omap1_videobuf_queue()
503 WARN_ON(pcdev->ready); in omap1_videobuf_queue()
505 buf = prepare_next_vb(pcdev); in omap1_videobuf_queue()
509 pcdev->active = buf; in omap1_videobuf_queue()
510 pcdev->ready = NULL; in omap1_videobuf_queue()
514 mode = CAM_READ_CACHE(pcdev, MODE) & ~THRESHOLD_MASK; in omap1_videobuf_queue()
515 mode |= THRESHOLD_LEVEL(pcdev->vb_mode) << THRESHOLD_SHIFT; in omap1_videobuf_queue()
516 CAM_WRITE(pcdev, MODE, mode | EN_FIFO_FULL | DMA); in omap1_videobuf_queue()
518 if (pcdev->vb_mode == OMAP1_CAM_DMA_SG) { in omap1_videobuf_queue()
524 try_next_sgbuf(pcdev->dma_ch, buf); in omap1_videobuf_queue()
527 start_capture(pcdev); in omap1_videobuf_queue()
538 struct omap1_cam_dev *pcdev = ici->priv; in omap1_videobuf_release() local
558 free_buffer(vq, buf, pcdev->vb_mode); in omap1_videobuf_release()
561 static void videobuf_done(struct omap1_cam_dev *pcdev, in videobuf_done() argument
564 struct omap1_cam_buf *buf = pcdev->active; in videobuf_done()
566 struct device *dev = pcdev->soc_host.icd->parent; in videobuf_done()
569 suspend_capture(pcdev); in videobuf_done()
570 disable_capture(pcdev); in videobuf_done()
575 suspend_capture(pcdev); in videobuf_done()
579 if (!pcdev->ready && result != VIDEOBUF_ERROR) { in videobuf_done()
591 suspend_capture(pcdev); in videobuf_done()
600 buf = pcdev->ready; in videobuf_done()
601 pcdev->active = buf; in videobuf_done()
602 pcdev->ready = NULL; in videobuf_done()
611 prepare_next_vb(pcdev); in videobuf_done()
613 buf = pcdev->ready; in videobuf_done()
614 pcdev->active = buf; in videobuf_done()
615 pcdev->ready = NULL; in videobuf_done()
617 } else if (pcdev->ready) { in videobuf_done()
627 pcdev->active = pcdev->ready; in videobuf_done()
629 if (pcdev->vb_mode == OMAP1_CAM_DMA_SG) { in videobuf_done()
637 pcdev->ready = buf; in videobuf_done()
639 buf = pcdev->active; in videobuf_done()
645 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in videobuf_done()
663 suspend_capture(pcdev); in videobuf_done()
671 disable_capture(pcdev); in videobuf_done()
675 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in videobuf_done()
695 try_next_sgbuf(pcdev->dma_ch, buf); in videobuf_done()
701 start_capture(pcdev); in videobuf_done()
714 prepare_next_vb(pcdev); in videobuf_done()
719 struct omap1_cam_dev *pcdev = data; in dma_isr() local
720 struct omap1_cam_buf *buf = pcdev->active; in dma_isr()
723 spin_lock_irqsave(&pcdev->lock, flags); in dma_isr()
726 suspend_capture(pcdev); in dma_isr()
727 disable_capture(pcdev); in dma_isr()
731 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in dma_isr()
739 CAM_WRITE(pcdev, MODE, in dma_isr()
740 CAM_READ_CACHE(pcdev, MODE) & ~EN_V_DOWN); in dma_isr()
741 videobuf_done(pcdev, VIDEOBUF_DONE); in dma_isr()
754 try_next_sgbuf(pcdev->dma_ch, buf); in dma_isr()
773 buf = prepare_next_vb(pcdev); in dma_isr()
777 try_next_sgbuf(pcdev->dma_ch, buf); in dma_isr()
782 videobuf_done(pcdev, buf->result); in dma_isr()
786 spin_unlock_irqrestore(&pcdev->lock, flags); in dma_isr()
791 struct omap1_cam_dev *pcdev = data; in cam_isr() local
792 struct device *dev = pcdev->soc_host.icd->parent; in cam_isr()
793 struct omap1_cam_buf *buf = pcdev->active; in cam_isr()
797 it_status = CAM_READ(pcdev, IT_STATUS); in cam_isr()
801 spin_lock_irqsave(&pcdev->lock, flags); in cam_isr()
806 suspend_capture(pcdev); in cam_isr()
807 disable_capture(pcdev); in cam_isr()
816 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in cam_isr()
841 if (pcdev->vb_mode == OMAP1_CAM_DMA_CONTIG) { in cam_isr()
846 mode = CAM_READ_CACHE(pcdev, MODE); in cam_isr()
853 mode = CAM_READ_CACHE(pcdev, MODE) & ~EN_V_UP; in cam_isr()
860 CAM_WRITE(pcdev, MODE, mode); in cam_isr()
869 videobuf_done(pcdev, VIDEOBUF_ERROR); in cam_isr()
871 spin_unlock_irqrestore(&pcdev->lock, flags); in cam_isr()
887 static void sensor_reset(struct omap1_cam_dev *pcdev, bool reset) in sensor_reset() argument
890 if (pcdev->pflags & OMAP1_CAMERA_RST_HIGH) in sensor_reset()
891 CAM_WRITE(pcdev, GPIO, reset); in sensor_reset()
892 else if (pcdev->pflags & OMAP1_CAMERA_RST_LOW) in sensor_reset()
893 CAM_WRITE(pcdev, GPIO, !reset); in sensor_reset()
916 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_clock_start() local
919 clk_enable(pcdev->clk); in omap1_cam_clock_start()
922 ctrlclock = CAM_READ(pcdev, CTRLCLOCK); in omap1_cam_clock_start()
924 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_clock_start()
927 switch (pcdev->camexclk) { in omap1_cam_clock_start()
945 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~DPLL_EN); in omap1_cam_clock_start()
949 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_clock_start()
951 sensor_reset(pcdev, false); in omap1_cam_clock_start()
958 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_clock_stop() local
961 suspend_capture(pcdev); in omap1_cam_clock_stop()
962 disable_capture(pcdev); in omap1_cam_clock_stop()
964 sensor_reset(pcdev, true); in omap1_cam_clock_stop()
967 ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); in omap1_cam_clock_stop()
969 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_clock_stop()
972 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_clock_stop()
973 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock | MCLK_EN); in omap1_cam_clock_stop()
975 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~MCLK_EN); in omap1_cam_clock_stop()
977 clk_disable(pcdev->clk); in omap1_cam_clock_stop()
1157 #define subdev_call_with_sense(pcdev, dev, icd, sd, function, args...) \ argument
1160 .master_clock = pcdev->camexclk, \
1165 if (pcdev->pdata) \
1166 sense.pixel_clock_max = pcdev->pdata->lclk_khz_max * 1000; \
1182 static int set_mbus_format(struct omap1_cam_dev *pcdev, struct device *dev, in set_mbus_format() argument
1188 int ret = subdev_call_with_sense(pcdev, dev, icd, sd, s_mbus_fmt, mf); in set_mbus_format()
1207 if (!is_dma_aligned(bytes_per_line, mf->height, pcdev->vb_mode)) { in set_mbus_format()
1223 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_crop() local
1227 ret = subdev_call_with_sense(pcdev, dev, icd, sd, s_crop, crop); in omap1_cam_set_crop()
1240 ret = dma_align(&mf.width, &mf.height, xlate->host_fmt, pcdev->vb_mode, in omap1_cam_set_crop()
1251 ret = set_mbus_format(pcdev, dev, icd, sd, &mf, xlate); in omap1_cam_set_crop()
1271 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_fmt() local
1289 ret = dma_align(&mf.width, &mf.height, xlate->host_fmt, pcdev->vb_mode, in omap1_cam_set_fmt()
1298 ret = set_mbus_format(pcdev, dev, icd, sd, &mf, xlate); in omap1_cam_set_fmt()
1362 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_mmap_mapper() local
1365 ret = pcdev->mmap_mapper(q, buf, vma); in omap1_cam_mmap_mapper()
1377 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_init_videobuf() local
1381 icd->parent, &pcdev->lock, in omap1_cam_init_videobuf()
1386 icd->parent, &pcdev->lock, in omap1_cam_init_videobuf()
1391 pcdev->vb_mode = sg_mode ? OMAP1_CAM_DMA_SG : OMAP1_CAM_DMA_CONTIG; in omap1_cam_init_videobuf()
1399 pcdev->mmap_mapper = q->int_ops->mmap_mapper; in omap1_cam_init_videobuf()
1441 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_bus_param() local
1468 if (!pcdev->pdata || in omap1_cam_set_bus_param()
1469 pcdev->pdata->flags & OMAP1_CAMERA_LCLK_RISING) in omap1_cam_set_bus_param()
1483 ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); in omap1_cam_set_bus_param()
1485 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in omap1_cam_set_bus_param()
1494 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in omap1_cam_set_bus_param()
1497 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_set_bus_param()
1503 mode = CAM_READ(pcdev, MODE) & ~(RAZ_FIFO | IRQ_MASK | DMA); in omap1_cam_set_bus_param()
1506 CAM_WRITE(pcdev, MODE, mode & ~ORDERCAMD); in omap1_cam_set_bus_param()
1509 CAM_WRITE(pcdev, MODE, mode | ORDERCAMD); in omap1_cam_set_bus_param()
1551 struct omap1_cam_dev *pcdev; in omap1_cam_probe() local
1571 pcdev = kzalloc(sizeof(*pcdev) + resource_size(res), GFP_KERNEL); in omap1_cam_probe()
1572 if (!pcdev) { in omap1_cam_probe()
1578 pcdev->res = res; in omap1_cam_probe()
1579 pcdev->clk = clk; in omap1_cam_probe()
1581 pcdev->pdata = pdev->dev.platform_data; in omap1_cam_probe()
1582 if (pcdev->pdata) { in omap1_cam_probe()
1583 pcdev->pflags = pcdev->pdata->flags; in omap1_cam_probe()
1584 pcdev->camexclk = pcdev->pdata->camexclk_khz * 1000; in omap1_cam_probe()
1587 switch (pcdev->camexclk) { in omap1_cam_probe()
1600 pcdev->pdata->camexclk_khz); in omap1_cam_probe()
1601 pcdev->camexclk = 0; in omap1_cam_probe()
1606 INIT_LIST_HEAD(&pcdev->capture); in omap1_cam_probe()
1607 spin_lock_init(&pcdev->lock); in omap1_cam_probe()
1622 pcdev->irq = irq; in omap1_cam_probe()
1623 pcdev->base = base; in omap1_cam_probe()
1625 sensor_reset(pcdev, true); in omap1_cam_probe()
1628 dma_isr, (void *)pcdev, &pcdev->dma_ch); in omap1_cam_probe()
1634 dev_dbg(&pdev->dev, "got DMA channel %d\n", pcdev->dma_ch); in omap1_cam_probe()
1637 omap_set_dma_src_params(pcdev->dma_ch, OMAP_DMA_PORT_TIPB, in omap1_cam_probe()
1640 omap_set_dma_dest_burst_mode(pcdev->dma_ch, OMAP_DMA_DATA_BURST_4); in omap1_cam_probe()
1642 omap_dma_link_lch(pcdev->dma_ch, pcdev->dma_ch); in omap1_cam_probe()
1644 err = request_irq(pcdev->irq, cam_isr, 0, DRIVER_NAME, pcdev); in omap1_cam_probe()
1650 pcdev->soc_host.drv_name = DRIVER_NAME; in omap1_cam_probe()
1651 pcdev->soc_host.ops = &omap1_host_ops; in omap1_cam_probe()
1652 pcdev->soc_host.priv = pcdev; in omap1_cam_probe()
1653 pcdev->soc_host.v4l2_dev.dev = &pdev->dev; in omap1_cam_probe()
1654 pcdev->soc_host.nr = pdev->id; in omap1_cam_probe()
1656 err = soc_camera_host_register(&pcdev->soc_host); in omap1_cam_probe()
1665 free_irq(pcdev->irq, pcdev); in omap1_cam_probe()
1667 omap_free_dma(pcdev->dma_ch); in omap1_cam_probe()
1673 kfree(pcdev); in omap1_cam_probe()
1683 struct omap1_cam_dev *pcdev = container_of(soc_host, in omap1_cam_remove() local
1687 free_irq(pcdev->irq, pcdev); in omap1_cam_remove()
1689 omap_free_dma(pcdev->dma_ch); in omap1_cam_remove()
1693 iounmap(pcdev->base); in omap1_cam_remove()
1695 res = pcdev->res; in omap1_cam_remove()
1698 clk_put(pcdev->clk); in omap1_cam_remove()
1700 kfree(pcdev); in omap1_cam_remove()