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()
1160 #define subdev_call_with_sense(pcdev, dev, icd, sd, op, function, args...) \ argument
1163 .master_clock = pcdev->camexclk, \
1168 if (pcdev->pdata) \
1169 sense.pixel_clock_max = pcdev->pdata->lclk_khz_max * 1000; \
1185 static int set_format(struct omap1_cam_dev *pcdev, struct device *dev, in set_format() argument
1192 int ret = subdev_call_with_sense(pcdev, dev, icd, sd, pad, set_fmt, NULL, format); in set_format()
1211 if (!is_dma_aligned(bytes_per_line, mf->height, pcdev->vb_mode)) { in set_format()
1227 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_crop() local
1234 ret = subdev_call_with_sense(pcdev, dev, icd, sd, video, s_crop, crop); in omap1_cam_set_crop()
1247 ret = dma_align(&mf->width, &mf->height, xlate->host_fmt, pcdev->vb_mode, in omap1_cam_set_crop()
1258 ret = set_format(pcdev, dev, icd, sd, &fmt, xlate); in omap1_cam_set_crop()
1278 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_fmt() local
1299 ret = dma_align(&mf->width, &mf->height, xlate->host_fmt, pcdev->vb_mode, in omap1_cam_set_fmt()
1308 ret = set_format(pcdev, dev, icd, sd, &format, xlate); in omap1_cam_set_fmt()
1376 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_mmap_mapper() local
1379 ret = pcdev->mmap_mapper(q, buf, vma); in omap1_cam_mmap_mapper()
1391 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_init_videobuf() local
1395 icd->parent, &pcdev->lock, in omap1_cam_init_videobuf()
1400 icd->parent, &pcdev->lock, in omap1_cam_init_videobuf()
1405 pcdev->vb_mode = sg_mode ? OMAP1_CAM_DMA_SG : OMAP1_CAM_DMA_CONTIG; in omap1_cam_init_videobuf()
1413 pcdev->mmap_mapper = q->int_ops->mmap_mapper; in omap1_cam_init_videobuf()
1455 struct omap1_cam_dev *pcdev = ici->priv; in omap1_cam_set_bus_param() local
1482 if (!pcdev->pdata || in omap1_cam_set_bus_param()
1483 pcdev->pdata->flags & OMAP1_CAMERA_LCLK_RISING) in omap1_cam_set_bus_param()
1497 ctrlclock = CAM_READ_CACHE(pcdev, CTRLCLOCK); in omap1_cam_set_bus_param()
1499 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in omap1_cam_set_bus_param()
1508 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock & ~LCLK_EN); in omap1_cam_set_bus_param()
1511 CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); in omap1_cam_set_bus_param()
1517 mode = CAM_READ(pcdev, MODE) & ~(RAZ_FIFO | IRQ_MASK | DMA); in omap1_cam_set_bus_param()
1520 CAM_WRITE(pcdev, MODE, mode & ~ORDERCAMD); in omap1_cam_set_bus_param()
1523 CAM_WRITE(pcdev, MODE, mode | ORDERCAMD); in omap1_cam_set_bus_param()
1565 struct omap1_cam_dev *pcdev; in omap1_cam_probe() local
1585 pcdev = kzalloc(sizeof(*pcdev) + resource_size(res), GFP_KERNEL); in omap1_cam_probe()
1586 if (!pcdev) { in omap1_cam_probe()
1592 pcdev->res = res; in omap1_cam_probe()
1593 pcdev->clk = clk; in omap1_cam_probe()
1595 pcdev->pdata = pdev->dev.platform_data; in omap1_cam_probe()
1596 if (pcdev->pdata) { in omap1_cam_probe()
1597 pcdev->pflags = pcdev->pdata->flags; in omap1_cam_probe()
1598 pcdev->camexclk = pcdev->pdata->camexclk_khz * 1000; in omap1_cam_probe()
1601 switch (pcdev->camexclk) { in omap1_cam_probe()
1614 pcdev->pdata->camexclk_khz); in omap1_cam_probe()
1615 pcdev->camexclk = 0; in omap1_cam_probe()
1620 INIT_LIST_HEAD(&pcdev->capture); in omap1_cam_probe()
1621 spin_lock_init(&pcdev->lock); in omap1_cam_probe()
1636 pcdev->irq = irq; in omap1_cam_probe()
1637 pcdev->base = base; in omap1_cam_probe()
1639 sensor_reset(pcdev, true); in omap1_cam_probe()
1642 dma_isr, (void *)pcdev, &pcdev->dma_ch); in omap1_cam_probe()
1648 dev_dbg(&pdev->dev, "got DMA channel %d\n", pcdev->dma_ch); in omap1_cam_probe()
1651 omap_set_dma_src_params(pcdev->dma_ch, OMAP_DMA_PORT_TIPB, in omap1_cam_probe()
1654 omap_set_dma_dest_burst_mode(pcdev->dma_ch, OMAP_DMA_DATA_BURST_4); in omap1_cam_probe()
1656 omap_dma_link_lch(pcdev->dma_ch, pcdev->dma_ch); in omap1_cam_probe()
1658 err = request_irq(pcdev->irq, cam_isr, 0, DRIVER_NAME, pcdev); in omap1_cam_probe()
1664 pcdev->soc_host.drv_name = DRIVER_NAME; in omap1_cam_probe()
1665 pcdev->soc_host.ops = &omap1_host_ops; in omap1_cam_probe()
1666 pcdev->soc_host.priv = pcdev; in omap1_cam_probe()
1667 pcdev->soc_host.v4l2_dev.dev = &pdev->dev; in omap1_cam_probe()
1668 pcdev->soc_host.nr = pdev->id; in omap1_cam_probe()
1670 err = soc_camera_host_register(&pcdev->soc_host); in omap1_cam_probe()
1679 free_irq(pcdev->irq, pcdev); in omap1_cam_probe()
1681 omap_free_dma(pcdev->dma_ch); in omap1_cam_probe()
1687 kfree(pcdev); in omap1_cam_probe()
1697 struct omap1_cam_dev *pcdev = container_of(soc_host, in omap1_cam_remove() local
1701 free_irq(pcdev->irq, pcdev); in omap1_cam_remove()
1703 omap_free_dma(pcdev->dma_ch); in omap1_cam_remove()
1707 iounmap(pcdev->base); in omap1_cam_remove()
1709 res = pcdev->res; in omap1_cam_remove()
1712 clk_put(pcdev->clk); in omap1_cam_remove()
1714 kfree(pcdev); in omap1_cam_remove()