media: tegra_v4l2_camera: use port num to init clk
Bryan Wu [Thu, 18 Sep 2014 01:04:17 +0000 (18:04 -0700)]
Change clks_init() internal API to use CSI port number to enable clks
instead of using dev_id which is incorrect sometime, since vi.0 might
also assigned to CSI_B/CSI_C port.

Bug 1560636

Change-Id: I0e26308ec885e2e34fe8faa63fca404c911912c4
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/539002
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
(cherry picked from commit c66d8e5880589b0d95dba63d10daff53e47e8628)
Reviewed-on: http://git-master/r/665995
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Winnie Hsu <whsu@nvidia.com>

arch/arm/mach-tegra/tegra12_clocks.c
drivers/media/platform/soc_camera/tegra_camera/common.c
drivers/media/platform/soc_camera/tegra_camera/common.h
drivers/media/platform/soc_camera/tegra_camera/vi.c
drivers/media/platform/soc_camera/tegra_camera/vi2.c

index d89cda8..bb738a8 100644 (file)
@@ -8620,9 +8620,14 @@ struct clk_duplicate tegra_clk_duplicates[] = {
        CLK_DUPLICATE("csi", "tegra_vi.0", "csi"),
        CLK_DUPLICATE("csi", "tegra_vi.1", "csi"),
        CLK_DUPLICATE("csus", "tegra_vi.0", "csus"),
+       CLK_DUPLICATE("csus", "tegra_vi.1", "csus"),
+       CLK_DUPLICATE("vim2_clk", "tegra_vi.0", "vim2_clk"),
        CLK_DUPLICATE("vim2_clk", "tegra_vi.1", "vim2_clk"),
        CLK_DUPLICATE("cilab", "tegra_vi.0", "cilab"),
+       CLK_DUPLICATE("cilab", "tegra_vi.1", "cilab"),
+       CLK_DUPLICATE("cilcd", "tegra_vi.0", "cilcd"),
        CLK_DUPLICATE("cilcd", "tegra_vi.1", "cilcd"),
+       CLK_DUPLICATE("cile", "tegra_vi.0", "cile"),
        CLK_DUPLICATE("cile", "tegra_vi.1", "cile"),
        CLK_DUPLICATE("i2s0", NULL, "i2s0"),
        CLK_DUPLICATE("i2s1", NULL, "i2s1"),
index 6274696..bcaf607 100644 (file)
@@ -132,9 +132,13 @@ static const struct soc_mbus_pixelfmt tegra_camera_rgb_formats[] = {
        },
 };
 
-static int tegra_camera_activate(struct tegra_camera_dev *cam)
+static int tegra_camera_activate(struct tegra_camera_dev *cam,
+                                struct soc_camera_device *icd)
 {
        struct tegra_camera_ops *cam_ops = cam->ops;
+       struct soc_camera_subdev_desc *ssdesc = &icd->sdesc->subdev_desc;
+       struct tegra_camera_platform_data *pdata = ssdesc->drv_priv;
+       int port = pdata->port;
        int ret;
 
        ret = nvhost_module_busy_ext(cam->ndev);
@@ -156,6 +160,10 @@ static int tegra_camera_activate(struct tegra_camera_dev *cam)
        /* Unpowergate VE */
        tegra_unpowergate_partition(TEGRA_POWERGATE_VENC);
 
+       /* Init Clocks */
+       if (cam_ops->clks_init)
+               cam_ops->clks_init(cam, port);
+
        if (cam_ops->clks_enable)
                cam_ops->clks_enable(cam);
 
@@ -174,6 +182,9 @@ static void tegra_camera_deactivate(struct tegra_camera_dev *cam)
        if (cam_ops->clks_disable)
                cam_ops->clks_disable(cam);
 
+       if (cam->ops->clks_deinit)
+               cam->ops->clks_deinit(cam);
+
        if (cam_ops->deactivate)
                cam_ops->deactivate(cam);
 
@@ -225,7 +236,7 @@ static int tegra_camera_capture_frame(struct tegra_camera_dev *cam)
        if (!retry) {
                tegra_camera_deactivate(cam);
                mdelay(5);
-               tegra_camera_activate(cam);
+               tegra_camera_activate(cam, icd);
                if (cam->active)
                        cam->ops->capture_setup(cam);
        }
@@ -577,7 +588,7 @@ static int tegra_camera_add_device(struct soc_camera_device *icd)
        int ret;
 
        if (!cam->enable_refcnt) {
-               ret = tegra_camera_activate(cam);
+               ret = tegra_camera_activate(cam, icd);
                if (ret)
                        return ret;
                cam->num_frames = 0;
@@ -914,16 +925,13 @@ static int tegra_camera_probe(struct platform_device *pdev)
 #endif
        }
 
-       /* Init Clocks */
-       cam->ops->clks_init(cam);
-
        /* Init Regulator */
        cam->reg = devm_regulator_get(&pdev->dev, cam->regulator_name);
        if (IS_ERR_OR_NULL(cam->reg)) {
                dev_err(&pdev->dev, "%s: couldn't get regulator %s, err %ld\n",
                        __func__, cam->regulator_name, PTR_ERR(cam->reg));
                cam->reg = NULL;
-               goto exit_deinit_clk;
+               goto exit;
        }
 
        mutex_init(&ndata->lock);
@@ -932,7 +940,7 @@ static int tegra_camera_probe(struct platform_device *pdev)
        if (err) {
                dev_err(&pdev->dev, "%s: nvhost get resources failed %d\n",
                                __func__, err);
-               goto exit_deinit_clk;
+               goto exit;
        }
 
        /* Init syncpts */
@@ -983,8 +991,6 @@ exit_cleanup_alloc_ctx:
        vb2_dma_contig_cleanup_ctx(cam->alloc_ctx);
 exit_free_syncpts:
        cam->ops->free_syncpts(cam);
-exit_deinit_clk:
-       cam->ops->clks_deinit(cam);
 exit:
        return err;
 }
@@ -1006,9 +1012,6 @@ static int tegra_camera_remove(struct platform_device *pdev)
        if (cam->ops)
                cam->ops->free_syncpts(cam);
 
-       if (cam->ops)
-               cam->ops->clks_deinit(cam);
-
        dev_notice(&pdev->dev, "Tegra camera host driver unloaded\n");
 
        return 0;
index ab1a9af..084d45f 100644 (file)
@@ -56,7 +56,7 @@ struct tegra_camera_clk {
 };
 
 struct tegra_camera_ops {
-       int (*clks_init)(struct tegra_camera_dev *cam);
+       int (*clks_init)(struct tegra_camera_dev *cam, int port);
        void (*clks_deinit)(struct tegra_camera_dev *cam);
        void (*clks_enable)(struct tegra_camera_dev *cam);
        void (*clks_disable)(struct tegra_camera_dev *cam);
index 1f07d68..1fa0d09 100644 (file)
@@ -302,7 +302,7 @@ static struct tegra_camera_clk vi_clks[] = {
 #endif
 };
 
-static int vi_clks_init(struct tegra_camera_dev *cam)
+static int vi_clks_init(struct tegra_camera_dev *cam, int port)
 {
        struct platform_device *pdev = cam->ndev;
        struct tegra_camera_clk *clks;
index 00b4007..09a3a61 100644 (file)
@@ -344,7 +344,7 @@ static struct tegra_camera_clk vi2_clks1[] = {
                .use_devname = 1,
        },
        {
-               .name = "vi_sensor",
+               .name = "vi_sensor2",
                .freq = 24000000,
        },
        {
@@ -366,12 +366,12 @@ static struct tegra_camera_clk vi2_clks1[] = {
        },
        {
                .name = "cilcd",
-               .freq = 0,
+               .freq = 102000000,
                .use_devname = 1,
        },
        {
                .name = "cile",
-               .freq = 0,
+               .freq = 102000000,
                .use_devname = 1,
        },
        /* Always put "p11_d" at the end */
@@ -383,23 +383,24 @@ static struct tegra_camera_clk vi2_clks1[] = {
 
 #define MAX_DEVID_LENGTH       16
 
-static int vi2_clks_init(struct tegra_camera_dev *cam)
+static int vi2_clks_init(struct tegra_camera_dev *cam, int port)
 {
        struct platform_device *pdev = cam->ndev;
        struct tegra_camera_clk *clks;
        int i;
 
-       switch (pdev->id) {
-       case 0:
+       switch (port) {
+       case TEGRA_CAMERA_PORT_CSI_A:
                cam->num_clks = ARRAY_SIZE(vi2_clks0);
                cam->clks = vi2_clks0;
                break;
-       case 1:
+       case TEGRA_CAMERA_PORT_CSI_B:
+       case TEGRA_CAMERA_PORT_CSI_C:
                cam->num_clks = ARRAY_SIZE(vi2_clks1);
                cam->clks = vi2_clks1;
                break;
        default:
-               dev_err(&pdev->dev, "Wrong device ID %d\n", pdev->id);
+               dev_err(&pdev->dev, "Wrong port number %d\n", port);
                return -ENODEV;
        }