diff options
Diffstat (limited to 'drivers/media/video/mx1_camera.c')
-rw-r--r-- | drivers/media/video/mx1_camera.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/drivers/media/video/mx1_camera.c b/drivers/media/video/mx1_camera.c index 86fab56c5a20..2d075205bdfe 100644 --- a/drivers/media/video/mx1_camera.c +++ b/drivers/media/video/mx1_camera.c | |||
@@ -102,10 +102,10 @@ struct mx1_buffer { | |||
102 | * Interface. If anyone ever builds hardware to enable more than | 102 | * Interface. If anyone ever builds hardware to enable more than |
103 | * one camera, they will have to modify this driver too */ | 103 | * one camera, they will have to modify this driver too */ |
104 | struct mx1_camera_dev { | 104 | struct mx1_camera_dev { |
105 | struct soc_camera_host soc_host; | ||
105 | struct soc_camera_device *icd; | 106 | struct soc_camera_device *icd; |
106 | struct mx1_camera_pdata *pdata; | 107 | struct mx1_camera_pdata *pdata; |
107 | struct mx1_buffer *active; | 108 | struct mx1_buffer *active; |
108 | struct device *dev; | ||
109 | struct resource *res; | 109 | struct resource *res; |
110 | struct clk *clk; | 110 | struct clk *clk; |
111 | struct list_head capture; | 111 | struct list_head capture; |
@@ -219,7 +219,7 @@ static int mx1_camera_setup_dma(struct mx1_camera_dev *pcdev) | |||
219 | int ret; | 219 | int ret; |
220 | 220 | ||
221 | if (unlikely(!pcdev->active)) { | 221 | if (unlikely(!pcdev->active)) { |
222 | dev_err(pcdev->dev, "DMA End IRQ with no active buffer\n"); | 222 | dev_err(pcdev->soc_host.dev, "DMA End IRQ with no active buffer\n"); |
223 | return -EFAULT; | 223 | return -EFAULT; |
224 | } | 224 | } |
225 | 225 | ||
@@ -229,7 +229,7 @@ static int mx1_camera_setup_dma(struct mx1_camera_dev *pcdev) | |||
229 | vbuf->size, pcdev->res->start + | 229 | vbuf->size, pcdev->res->start + |
230 | CSIRXR, DMA_MODE_READ); | 230 | CSIRXR, DMA_MODE_READ); |
231 | if (unlikely(ret)) | 231 | if (unlikely(ret)) |
232 | dev_err(pcdev->dev, "Failed to setup DMA sg list\n"); | 232 | dev_err(pcdev->soc_host.dev, "Failed to setup DMA sg list\n"); |
233 | 233 | ||
234 | return ret; | 234 | return ret; |
235 | } | 235 | } |
@@ -338,14 +338,14 @@ static void mx1_camera_dma_irq(int channel, void *data) | |||
338 | imx_dma_disable(channel); | 338 | imx_dma_disable(channel); |
339 | 339 | ||
340 | if (unlikely(!pcdev->active)) { | 340 | if (unlikely(!pcdev->active)) { |
341 | dev_err(pcdev->dev, "DMA End IRQ with no active buffer\n"); | 341 | dev_err(pcdev->soc_host.dev, "DMA End IRQ with no active buffer\n"); |
342 | goto out; | 342 | goto out; |
343 | } | 343 | } |
344 | 344 | ||
345 | vb = &pcdev->active->vb; | 345 | vb = &pcdev->active->vb; |
346 | buf = container_of(vb, struct mx1_buffer, vb); | 346 | buf = container_of(vb, struct mx1_buffer, vb); |
347 | WARN_ON(buf->inwork || list_empty(&vb->queue)); | 347 | WARN_ON(buf->inwork || list_empty(&vb->queue)); |
348 | dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__, | 348 | dev_dbg(pcdev->soc_host.dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__, |
349 | vb, vb->baddr, vb->bsize); | 349 | vb, vb->baddr, vb->bsize); |
350 | 350 | ||
351 | mx1_camera_wakeup(pcdev, vb, buf); | 351 | mx1_camera_wakeup(pcdev, vb, buf); |
@@ -366,7 +366,7 @@ static void mx1_camera_init_videobuf(struct videobuf_queue *q, | |||
366 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 366 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
367 | struct mx1_camera_dev *pcdev = ici->priv; | 367 | struct mx1_camera_dev *pcdev = ici->priv; |
368 | 368 | ||
369 | videobuf_queue_dma_contig_init(q, &mx1_videobuf_ops, pcdev->dev, | 369 | videobuf_queue_dma_contig_init(q, &mx1_videobuf_ops, ici->dev, |
370 | &pcdev->lock, | 370 | &pcdev->lock, |
371 | V4L2_BUF_TYPE_VIDEO_CAPTURE, | 371 | V4L2_BUF_TYPE_VIDEO_CAPTURE, |
372 | V4L2_FIELD_NONE, | 372 | V4L2_FIELD_NONE, |
@@ -385,7 +385,7 @@ static int mclk_get_divisor(struct mx1_camera_dev *pcdev) | |||
385 | * they get a nice Oops */ | 385 | * they get a nice Oops */ |
386 | div = (lcdclk + 2 * mclk - 1) / (2 * mclk) - 1; | 386 | div = (lcdclk + 2 * mclk - 1) / (2 * mclk) - 1; |
387 | 387 | ||
388 | dev_dbg(pcdev->dev, "System clock %lukHz, target freq %dkHz, " | 388 | dev_dbg(pcdev->soc_host.dev, "System clock %lukHz, target freq %dkHz, " |
389 | "divisor %lu\n", lcdclk / 1000, mclk / 1000, div); | 389 | "divisor %lu\n", lcdclk / 1000, mclk / 1000, div); |
390 | 390 | ||
391 | return div; | 391 | return div; |
@@ -395,7 +395,7 @@ static void mx1_camera_activate(struct mx1_camera_dev *pcdev) | |||
395 | { | 395 | { |
396 | unsigned int csicr1 = CSICR1_EN; | 396 | unsigned int csicr1 = CSICR1_EN; |
397 | 397 | ||
398 | dev_dbg(pcdev->dev, "Activate device\n"); | 398 | dev_dbg(pcdev->soc_host.dev, "Activate device\n"); |
399 | 399 | ||
400 | clk_enable(pcdev->clk); | 400 | clk_enable(pcdev->clk); |
401 | 401 | ||
@@ -411,7 +411,7 @@ static void mx1_camera_activate(struct mx1_camera_dev *pcdev) | |||
411 | 411 | ||
412 | static void mx1_camera_deactivate(struct mx1_camera_dev *pcdev) | 412 | static void mx1_camera_deactivate(struct mx1_camera_dev *pcdev) |
413 | { | 413 | { |
414 | dev_dbg(pcdev->dev, "Deactivate device\n"); | 414 | dev_dbg(pcdev->soc_host.dev, "Deactivate device\n"); |
415 | 415 | ||
416 | /* Disable all CSI interface */ | 416 | /* Disable all CSI interface */ |
417 | __raw_writel(0x00, pcdev->base + CSICR1); | 417 | __raw_writel(0x00, pcdev->base + CSICR1); |
@@ -550,7 +550,7 @@ static int mx1_camera_set_fmt(struct soc_camera_device *icd, | |||
550 | 550 | ||
551 | xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat); | 551 | xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat); |
552 | if (!xlate) { | 552 | if (!xlate) { |
553 | dev_warn(&ici->dev, "Format %x not found\n", pix->pixelformat); | 553 | dev_warn(ici->dev, "Format %x not found\n", pix->pixelformat); |
554 | return -EINVAL; | 554 | return -EINVAL; |
555 | } | 555 | } |
556 | 556 | ||
@@ -633,12 +633,6 @@ static struct soc_camera_host_ops mx1_soc_camera_host_ops = { | |||
633 | .querycap = mx1_camera_querycap, | 633 | .querycap = mx1_camera_querycap, |
634 | }; | 634 | }; |
635 | 635 | ||
636 | /* Should be allocated dynamically too, but we have only one. */ | ||
637 | static struct soc_camera_host mx1_soc_camera_host = { | ||
638 | .drv_name = DRIVER_NAME, | ||
639 | .ops = &mx1_soc_camera_host_ops, | ||
640 | }; | ||
641 | |||
642 | static struct fiq_handler fh = { | 636 | static struct fiq_handler fh = { |
643 | .name = "csi_sof" | 637 | .name = "csi_sof" |
644 | }; | 638 | }; |
@@ -673,7 +667,6 @@ static int __init mx1_camera_probe(struct platform_device *pdev) | |||
673 | goto exit_put_clk; | 667 | goto exit_put_clk; |
674 | } | 668 | } |
675 | 669 | ||
676 | dev_set_drvdata(&pdev->dev, pcdev); | ||
677 | pcdev->res = res; | 670 | pcdev->res = res; |
678 | pcdev->clk = clk; | 671 | pcdev->clk = clk; |
679 | 672 | ||
@@ -707,16 +700,15 @@ static int __init mx1_camera_probe(struct platform_device *pdev) | |||
707 | } | 700 | } |
708 | pcdev->irq = irq; | 701 | pcdev->irq = irq; |
709 | pcdev->base = base; | 702 | pcdev->base = base; |
710 | pcdev->dev = &pdev->dev; | ||
711 | 703 | ||
712 | /* request dma */ | 704 | /* request dma */ |
713 | pcdev->dma_chan = imx_dma_request_by_prio(DRIVER_NAME, DMA_PRIO_HIGH); | 705 | pcdev->dma_chan = imx_dma_request_by_prio(DRIVER_NAME, DMA_PRIO_HIGH); |
714 | if (pcdev->dma_chan < 0) { | 706 | if (pcdev->dma_chan < 0) { |
715 | dev_err(pcdev->dev, "Can't request DMA for MX1 CSI\n"); | 707 | dev_err(&pdev->dev, "Can't request DMA for MX1 CSI\n"); |
716 | err = -EBUSY; | 708 | err = -EBUSY; |
717 | goto exit_iounmap; | 709 | goto exit_iounmap; |
718 | } | 710 | } |
719 | dev_dbg(pcdev->dev, "got DMA channel %d\n", pcdev->dma_chan); | 711 | dev_dbg(&pdev->dev, "got DMA channel %d\n", pcdev->dma_chan); |
720 | 712 | ||
721 | imx_dma_setup_handlers(pcdev->dma_chan, mx1_camera_dma_irq, NULL, | 713 | imx_dma_setup_handlers(pcdev->dma_chan, mx1_camera_dma_irq, NULL, |
722 | pcdev); | 714 | pcdev); |
@@ -729,7 +721,7 @@ static int __init mx1_camera_probe(struct platform_device *pdev) | |||
729 | /* request irq */ | 721 | /* request irq */ |
730 | err = claim_fiq(&fh); | 722 | err = claim_fiq(&fh); |
731 | if (err) { | 723 | if (err) { |
732 | dev_err(pcdev->dev, "Camera interrupt register failed \n"); | 724 | dev_err(&pdev->dev, "Camera interrupt register failed \n"); |
733 | goto exit_free_dma; | 725 | goto exit_free_dma; |
734 | } | 726 | } |
735 | 727 | ||
@@ -746,10 +738,12 @@ static int __init mx1_camera_probe(struct platform_device *pdev) | |||
746 | mxc_set_irq_fiq(irq, 1); | 738 | mxc_set_irq_fiq(irq, 1); |
747 | enable_fiq(irq); | 739 | enable_fiq(irq); |
748 | 740 | ||
749 | mx1_soc_camera_host.priv = pcdev; | 741 | pcdev->soc_host.drv_name = DRIVER_NAME; |
750 | mx1_soc_camera_host.dev.parent = &pdev->dev; | 742 | pcdev->soc_host.ops = &mx1_soc_camera_host_ops; |
751 | mx1_soc_camera_host.nr = pdev->id; | 743 | pcdev->soc_host.priv = pcdev; |
752 | err = soc_camera_host_register(&mx1_soc_camera_host); | 744 | pcdev->soc_host.dev = &pdev->dev; |
745 | pcdev->soc_host.nr = pdev->id; | ||
746 | err = soc_camera_host_register(&pcdev->soc_host); | ||
753 | if (err) | 747 | if (err) |
754 | goto exit_free_irq; | 748 | goto exit_free_irq; |
755 | 749 | ||
@@ -777,7 +771,9 @@ exit: | |||
777 | 771 | ||
778 | static int __exit mx1_camera_remove(struct platform_device *pdev) | 772 | static int __exit mx1_camera_remove(struct platform_device *pdev) |
779 | { | 773 | { |
780 | struct mx1_camera_dev *pcdev = platform_get_drvdata(pdev); | 774 | struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev); |
775 | struct mx1_camera_dev *pcdev = container_of(soc_host, | ||
776 | struct mx1_camera_dev, soc_host); | ||
781 | struct resource *res; | 777 | struct resource *res; |
782 | 778 | ||
783 | imx_dma_free(pcdev->dma_chan); | 779 | imx_dma_free(pcdev->dma_chan); |
@@ -787,7 +783,7 @@ static int __exit mx1_camera_remove(struct platform_device *pdev) | |||
787 | 783 | ||
788 | clk_put(pcdev->clk); | 784 | clk_put(pcdev->clk); |
789 | 785 | ||
790 | soc_camera_host_unregister(&mx1_soc_camera_host); | 786 | soc_camera_host_unregister(soc_host); |
791 | 787 | ||
792 | iounmap(pcdev->base); | 788 | iounmap(pcdev->base); |
793 | 789 | ||