media: video: tegra: add EMC clock rate control
Jihoon Bang [Thu, 3 May 2012 19:20:00 +0000 (12:20 -0700)]
Add EMC clock rate control to tegra_camera ioctl.
This change allows user space to change EMC clock requirement
for camera based on use case and resolution.

For example, video recording use case needs more than double
memory bandwidth of preview use case.

Bug 964635

Change-Id: Ibe5a77a810869b53b6e057f2ee62ebb96997c2f4
Signed-off-by: Jihoon Bang <jbang@nvidia.com>
Reviewed-on: http://git-master/r/101274
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Dan Willemsen <dwillemsen@nvidia.com>

drivers/media/video/tegra/tegra_camera.c
include/media/tegra_camera.h

index 36ecde0..de0c662 100644 (file)
@@ -96,17 +96,9 @@ static int tegra_camera_disable_clk(struct tegra_camera_dev *dev)
 
 static int tegra_camera_enable_emc(struct tegra_camera_dev *dev)
 {
-       /*
-        * tegra_camera wasn't added as a user of emc_clk until 3x.
-        * set to 150 MHz, will likely need to be increased as we support
-        * sensors with higher framerates and resolutions.
-        */
        clk_enable(dev->emc_clk);
-
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
        clk_set_rate(dev->emc_clk, 300000000);
-#else
-       clk_set_rate(dev->emc_clk, 150000000);
 #endif
        return 0;
 }
@@ -130,7 +122,8 @@ static int tegra_camera_clk_set_rate(struct tegra_camera_dev *dev)
                return -EINVAL;
        }
 
-       if (info->id != TEGRA_CAMERA_MODULE_VI) {
+       if (info->id != TEGRA_CAMERA_MODULE_VI &&
+               info->id != TEGRA_CAMERA_MODULE_EMC) {
                dev_err(dev->dev,
                                "%s: set rate only aplies to vi module %d\n",
                                __func__, info->id);
@@ -144,6 +137,14 @@ static int tegra_camera_clk_set_rate(struct tegra_camera_dev *dev)
        case TEGRA_CAMERA_VI_SENSOR_CLK:
                clk = dev->vi_sensor_clk;
                break;
+       case TEGRA_CAMERA_EMC_CLK:
+               clk = dev->emc_clk;
+#ifndef CONFIG_ARCH_TEGRA_2x_SOC
+               dev_dbg(dev->dev, "%s: emc_clk rate=%lu\n",
+                       __func__, info->rate);
+               clk_set_rate(dev->emc_clk, info->rate);
+#endif
+               goto set_rate_end;
        default:
                dev_err(dev->dev,
                                "%s: invalid clk id for set rate %d\n",
@@ -189,6 +190,7 @@ static int tegra_camera_clk_set_rate(struct tegra_camera_dev *dev)
 #endif
        }
 
+set_rate_end:
        info->rate = clk_get_rate(clk);
        dev_dbg(dev->dev, "%s: get_rate=%lu",
                        __func__, info->rate);
index 8ee2907..9dea148 100644 (file)
@@ -23,12 +23,14 @@ enum {
        TEGRA_CAMERA_MODULE_ISP = 0,
        TEGRA_CAMERA_MODULE_VI,
        TEGRA_CAMERA_MODULE_CSI,
-       TEGRA_CAMERA_MODULE_MAX,
+       TEGRA_CAMERA_MODULE_EMC,
+       TEGRA_CAMERA_MODULE_MAX
 };
 
 enum {
        TEGRA_CAMERA_VI_CLK,
        TEGRA_CAMERA_VI_SENSOR_CLK,
+       TEGRA_CAMERA_EMC_CLK
 };
 
 struct tegra_camera_clk_info {