diff options
author | Robert Jarzmik <robert.jarzmik@free.fr> | 2014-06-29 10:19:59 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-30 18:32:14 -0400 |
commit | e9a1d94fa85542d4f3046ac82d234a3c8349c948 (patch) | |
tree | af2db35c7543ba473631934d279a87a087b41cf4 | |
parent | c5f176dc19870a424d6089317030f7b59ea1bafc (diff) |
[media] media: pxa_camera device-tree support
Add device-tree support to pxa_camera host driver.
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
[g.liakhovetski@gmx.de: added of_node_put()]
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/platform/soc_camera/pxa_camera.c | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/drivers/media/platform/soc_camera/pxa_camera.c b/drivers/media/platform/soc_camera/pxa_camera.c index d4df305fcc18..64dc80ccd6f9 100644 --- a/drivers/media/platform/soc_camera/pxa_camera.c +++ b/drivers/media/platform/soc_camera/pxa_camera.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <media/videobuf-dma-sg.h> | 34 | #include <media/videobuf-dma-sg.h> |
35 | #include <media/soc_camera.h> | 35 | #include <media/soc_camera.h> |
36 | #include <media/soc_mediabus.h> | 36 | #include <media/soc_mediabus.h> |
37 | #include <media/v4l2-of.h> | ||
37 | 38 | ||
38 | #include <linux/videodev2.h> | 39 | #include <linux/videodev2.h> |
39 | 40 | ||
@@ -1650,6 +1651,68 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = { | |||
1650 | .set_bus_param = pxa_camera_set_bus_param, | 1651 | .set_bus_param = pxa_camera_set_bus_param, |
1651 | }; | 1652 | }; |
1652 | 1653 | ||
1654 | static int pxa_camera_pdata_from_dt(struct device *dev, | ||
1655 | struct pxa_camera_dev *pcdev) | ||
1656 | { | ||
1657 | u32 mclk_rate; | ||
1658 | struct device_node *np = dev->of_node; | ||
1659 | struct v4l2_of_endpoint ep; | ||
1660 | int err = of_property_read_u32(np, "clock-frequency", | ||
1661 | &mclk_rate); | ||
1662 | if (!err) { | ||
1663 | pcdev->platform_flags |= PXA_CAMERA_MCLK_EN; | ||
1664 | pcdev->mclk = mclk_rate; | ||
1665 | } | ||
1666 | |||
1667 | np = of_graph_get_next_endpoint(np, NULL); | ||
1668 | if (!np) { | ||
1669 | dev_err(dev, "could not find endpoint\n"); | ||
1670 | return -EINVAL; | ||
1671 | } | ||
1672 | |||
1673 | err = v4l2_of_parse_endpoint(np, &ep); | ||
1674 | if (err) { | ||
1675 | dev_err(dev, "could not parse endpoint\n"); | ||
1676 | goto out; | ||
1677 | } | ||
1678 | |||
1679 | switch (ep.bus.parallel.bus_width) { | ||
1680 | case 4: | ||
1681 | pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_4; | ||
1682 | break; | ||
1683 | case 5: | ||
1684 | pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_5; | ||
1685 | break; | ||
1686 | case 8: | ||
1687 | pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_8; | ||
1688 | break; | ||
1689 | case 9: | ||
1690 | pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_9; | ||
1691 | break; | ||
1692 | case 10: | ||
1693 | pcdev->platform_flags |= PXA_CAMERA_DATAWIDTH_10; | ||
1694 | break; | ||
1695 | default: | ||
1696 | break; | ||
1697 | }; | ||
1698 | |||
1699 | if (ep.bus.parallel.flags & V4L2_MBUS_MASTER) | ||
1700 | pcdev->platform_flags |= PXA_CAMERA_MASTER; | ||
1701 | if (ep.bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) | ||
1702 | pcdev->platform_flags |= PXA_CAMERA_HSP; | ||
1703 | if (ep.bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) | ||
1704 | pcdev->platform_flags |= PXA_CAMERA_VSP; | ||
1705 | if (ep.bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_RISING) | ||
1706 | pcdev->platform_flags |= PXA_CAMERA_PCLK_EN | PXA_CAMERA_PCP; | ||
1707 | if (ep.bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_FALLING) | ||
1708 | pcdev->platform_flags |= PXA_CAMERA_PCLK_EN; | ||
1709 | |||
1710 | out: | ||
1711 | of_node_put(np); | ||
1712 | |||
1713 | return err; | ||
1714 | } | ||
1715 | |||
1653 | static int pxa_camera_probe(struct platform_device *pdev) | 1716 | static int pxa_camera_probe(struct platform_device *pdev) |
1654 | { | 1717 | { |
1655 | struct pxa_camera_dev *pcdev; | 1718 | struct pxa_camera_dev *pcdev; |
@@ -1676,7 +1739,15 @@ static int pxa_camera_probe(struct platform_device *pdev) | |||
1676 | pcdev->res = res; | 1739 | pcdev->res = res; |
1677 | 1740 | ||
1678 | pcdev->pdata = pdev->dev.platform_data; | 1741 | pcdev->pdata = pdev->dev.platform_data; |
1679 | pcdev->platform_flags = pcdev->pdata->flags; | 1742 | if (&pdev->dev.of_node && !pcdev->pdata) { |
1743 | err = pxa_camera_pdata_from_dt(&pdev->dev, pcdev); | ||
1744 | } else { | ||
1745 | pcdev->platform_flags = pcdev->pdata->flags; | ||
1746 | pcdev->mclk = pcdev->pdata->mclk_10khz * 10000; | ||
1747 | } | ||
1748 | if (err < 0) | ||
1749 | return err; | ||
1750 | |||
1680 | if (!(pcdev->platform_flags & (PXA_CAMERA_DATAWIDTH_8 | | 1751 | if (!(pcdev->platform_flags & (PXA_CAMERA_DATAWIDTH_8 | |
1681 | PXA_CAMERA_DATAWIDTH_9 | PXA_CAMERA_DATAWIDTH_10))) { | 1752 | PXA_CAMERA_DATAWIDTH_9 | PXA_CAMERA_DATAWIDTH_10))) { |
1682 | /* | 1753 | /* |
@@ -1693,7 +1764,6 @@ static int pxa_camera_probe(struct platform_device *pdev) | |||
1693 | pcdev->width_flags |= 1 << 8; | 1764 | pcdev->width_flags |= 1 << 8; |
1694 | if (pcdev->platform_flags & PXA_CAMERA_DATAWIDTH_10) | 1765 | if (pcdev->platform_flags & PXA_CAMERA_DATAWIDTH_10) |
1695 | pcdev->width_flags |= 1 << 9; | 1766 | pcdev->width_flags |= 1 << 9; |
1696 | pcdev->mclk = pcdev->pdata->mclk_10khz * 10000; | ||
1697 | if (!pcdev->mclk) { | 1767 | if (!pcdev->mclk) { |
1698 | dev_warn(&pdev->dev, | 1768 | dev_warn(&pdev->dev, |
1699 | "mclk == 0! Please, fix your platform data. " | 1769 | "mclk == 0! Please, fix your platform data. " |
@@ -1799,10 +1869,17 @@ static const struct dev_pm_ops pxa_camera_pm = { | |||
1799 | .resume = pxa_camera_resume, | 1869 | .resume = pxa_camera_resume, |
1800 | }; | 1870 | }; |
1801 | 1871 | ||
1872 | static const struct of_device_id pxa_camera_of_match[] = { | ||
1873 | { .compatible = "marvell,pxa270-qci", }, | ||
1874 | {}, | ||
1875 | }; | ||
1876 | MODULE_DEVICE_TABLE(of, pxa_camera_of_match); | ||
1877 | |||
1802 | static struct platform_driver pxa_camera_driver = { | 1878 | static struct platform_driver pxa_camera_driver = { |
1803 | .driver = { | 1879 | .driver = { |
1804 | .name = PXA_CAM_DRV_NAME, | 1880 | .name = PXA_CAM_DRV_NAME, |
1805 | .pm = &pxa_camera_pm, | 1881 | .pm = &pxa_camera_pm, |
1882 | .of_match_table = of_match_ptr(pxa_camera_of_match), | ||
1806 | }, | 1883 | }, |
1807 | .probe = pxa_camera_probe, | 1884 | .probe = pxa_camera_probe, |
1808 | .remove = pxa_camera_remove, | 1885 | .remove = pxa_camera_remove, |