summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorSureshnaidu Laveti <lsuresh@codeaurora.org>2016-05-03 15:17:19 -0700
committerJeevan Shriram <jshriram@codeaurora.org>2016-05-18 13:40:34 -0700
commita4663702036e6b0ae9b82691027d9913d65d7a02 (patch)
tree3ec0693cc8ea02289159bbf9d901f7fbf508118d /drivers/media
parentba939576176482a9d3294dd488c7bd7ce00d3921 (diff)
msm: camera: sensor: Updating soc layer clock API for i2c drivers
Updating SOC layer clock API to support both platform drivers and i2c driver. Change-Id: I3d4a2e5c778c23dd80644080fdad7512c5e71e33 Signed-off-by: Sureshnaidu Laveti <lsuresh@codeaurora.org>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.c95
-rw-r--r--drivers/media/platform/msm/camera_v2/common/cam_soc_api.h39
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c16
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c17
-rw-r--r--drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c40
5 files changed, 160 insertions, 47 deletions
diff --git a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
index 21ac680bc9ae..7f5e49809a26 100644
--- a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
+++ b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.c
@@ -40,7 +40,7 @@ struct msm_cam_bus_pscale_data g_cv[CAM_BUS_CLIENT_MAX];
/* Get all clocks from DT */
-int msm_camera_get_clk_info(struct platform_device *pdev,
+static int msm_camera_get_clk_info_internal(struct device *dev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr,
size_t *num_clk)
@@ -52,10 +52,7 @@ int msm_camera_get_clk_info(struct platform_device *pdev,
bool clock_cntl_support = false;
struct device_node *of_node;
- if (!pdev || !clk_info || !num_clk)
- return -EINVAL;
-
- of_node = pdev->dev.of_node;
+ of_node = dev->of_node;
cnt = of_property_count_strings(of_node, "clock-names");
if (cnt <= 0) {
@@ -93,19 +90,19 @@ int msm_camera_get_clk_info(struct platform_device *pdev,
*num_clk = cnt;
- *clk_info = devm_kcalloc(&pdev->dev, cnt,
+ *clk_info = devm_kcalloc(dev, cnt,
sizeof(struct msm_cam_clk_info), GFP_KERNEL);
if (!*clk_info)
return -ENOMEM;
- *clk_ptr = devm_kcalloc(&pdev->dev, cnt, sizeof(struct clk *),
+ *clk_ptr = devm_kcalloc(dev, cnt, sizeof(struct clk *),
GFP_KERNEL);
if (!*clk_ptr) {
rc = -ENOMEM;
goto err1;
}
- rates = devm_kcalloc(&pdev->dev, cnt, sizeof(long), GFP_KERNEL);
+ rates = devm_kcalloc(dev, cnt, sizeof(long), GFP_KERNEL);
if (!rates) {
rc = -ENOMEM;
goto err2;
@@ -160,7 +157,7 @@ int msm_camera_get_clk_info(struct platform_device *pdev,
i, (*clk_info)[i].clk_rate);
(*clk_ptr)[i] =
- devm_clk_get(&pdev->dev, (*clk_info)[i].clk_name);
+ devm_clk_get(dev, (*clk_info)[i].clk_name);
if (IS_ERR((*clk_ptr)[i])) {
rc = PTR_ERR((*clk_ptr)[i]);
goto err4;
@@ -168,18 +165,50 @@ int msm_camera_get_clk_info(struct platform_device *pdev,
CDBG("clk ptr[%d] :%pK\n", i, (*clk_ptr)[i]);
}
- devm_kfree(&pdev->dev, rates);
+ devm_kfree(dev, rates);
return rc;
err4:
for (--i; i >= 0; i--)
- devm_clk_put(&pdev->dev, (*clk_ptr)[i]);
+ devm_clk_put(dev, (*clk_ptr)[i]);
err3:
- devm_kfree(&pdev->dev, rates);
+ devm_kfree(dev, rates);
err2:
- devm_kfree(&pdev->dev, *clk_ptr);
+ devm_kfree(dev, *clk_ptr);
err1:
- devm_kfree(&pdev->dev, *clk_info);
+ devm_kfree(dev, *clk_info);
+ return rc;
+}
+
+/* Get all clocks from DT for I2C devices */
+int msm_camera_i2c_dev_get_clk_info(struct device *dev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr,
+ size_t *num_clk)
+{
+ int rc = 0;
+
+ if (!dev || !clk_info || !clk_ptr || !num_clk)
+ return -EINVAL;
+
+ rc = msm_camera_get_clk_info_internal(dev, clk_info, clk_ptr, num_clk);
+ return rc;
+}
+EXPORT_SYMBOL(msm_camera_i2c_dev_get_clk_info);
+
+/* Get all clocks from DT for platform devices */
+int msm_camera_get_clk_info(struct platform_device *pdev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr,
+ size_t *num_clk)
+{
+ int rc = 0;
+
+ if (!pdev || !&pdev->dev || !clk_info || !clk_ptr || !num_clk)
+ return -EINVAL;
+
+ rc = msm_camera_get_clk_info_internal(&pdev->dev,
+ clk_info, clk_ptr, num_clk);
return rc;
}
EXPORT_SYMBOL(msm_camera_get_clk_info);
@@ -426,7 +455,7 @@ long msm_camera_clk_set_rate(struct device *dev,
EXPORT_SYMBOL(msm_camera_clk_set_rate);
/* release memory allocated for clocks */
-int msm_camera_put_clk_info(struct platform_device *pdev,
+static int msm_camera_put_clk_info_internal(struct device *dev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, int cnt)
{
@@ -434,16 +463,46 @@ int msm_camera_put_clk_info(struct platform_device *pdev,
for (i = cnt - 1; i >= 0; i--) {
if (clk_ptr[i] != NULL)
- devm_clk_put(&pdev->dev, (*clk_ptr)[i]);
+ devm_clk_put(dev, (*clk_ptr)[i]);
CDBG("clk ptr[%d] :%pK\n", i, (*clk_ptr)[i]);
}
- devm_kfree(&pdev->dev, *clk_info);
- devm_kfree(&pdev->dev, *clk_ptr);
+ devm_kfree(dev, *clk_info);
+ devm_kfree(dev, *clk_ptr);
*clk_info = NULL;
*clk_ptr = NULL;
return 0;
}
+
+/* release memory allocated for clocks for i2c devices */
+int msm_camera_i2c_dev_put_clk_info(struct device *dev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr, int cnt)
+{
+ int rc = 0;
+
+ if (!dev || !clk_info || !clk_ptr)
+ return -EINVAL;
+
+ rc = msm_camera_put_clk_info_internal(dev, clk_info, clk_ptr, cnt);
+ return rc;
+}
+EXPORT_SYMBOL(msm_camera_i2c_dev_put_clk_info);
+
+/* release memory allocated for clocks for platform devices */
+int msm_camera_put_clk_info(struct platform_device *pdev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr, int cnt)
+{
+ int rc = 0;
+
+ if (!pdev || !&pdev->dev || !clk_info || !clk_ptr)
+ return -EINVAL;
+
+ rc = msm_camera_put_clk_info_internal(&pdev->dev,
+ clk_info, clk_ptr, cnt);
+ return rc;
+}
EXPORT_SYMBOL(msm_camera_put_clk_info);
int msm_camera_put_clk_info_and_rates(struct platform_device *pdev,
diff --git a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
index 9724d5951862..d1eeab92773f 100644
--- a/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
+++ b/drivers/media/platform/msm/camera_v2/common/cam_soc_api.h
@@ -53,11 +53,30 @@ struct msm_cam_regulator {
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
-
int msm_camera_get_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr,
size_t *num_clk);
+
+/**
+ * @brief : Gets clock information from dtsi
+ *
+ * This function extracts the clocks information for a specific
+ * i2c device
+ *
+ * @param dev : i2c device to get clocks information
+ * @param clk_info : Pointer to populate clock information array
+ * @param clk_ptr : Pointer to populate clock resource pointers
+ * @param num_clk: Pointer to populate the number of clocks
+ * extracted from dtsi
+ *
+ * @return Status of operation. Negative in case of error. Zero otherwise.
+ */
+int msm_camera_i2c_dev_get_clk_info(struct device *dev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr,
+ size_t *num_clk);
+
/**
* @brief : Gets clock information and rates from dtsi
*
@@ -97,6 +116,23 @@ int msm_camera_get_clk_info_and_rates(
int msm_camera_put_clk_info(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, int cnt);
+
+/**
+ * @brief : Puts clock information
+ *
+ * This function releases the memory allocated for the clocks
+ *
+ * @param dev : Pointer to i2c device
+ * @param clk_info : Pointer to release the allocated memory
+ * @param clk_ptr : Pointer to release the clock resources
+ * @param cnt : Number of clk resources
+ *
+ * @return Status of operation. Negative in case of error. Zero otherwise.
+ */
+int msm_camera_i2c_dev_put_clk_info(struct device *dev,
+ struct msm_cam_clk_info **clk_info,
+ struct clk ***clk_ptr, int cnt);
+
/**
* @brief : Puts clock information
*
@@ -111,7 +147,6 @@ int msm_camera_put_clk_info(struct platform_device *pdev,
*
* @return Status of operation. Negative in case of error. Zero otherwise.
*/
-
int msm_camera_put_clk_info_and_rates(struct platform_device *pdev,
struct msm_cam_clk_info **clk_info,
struct clk ***clk_ptr, uint32_t ***clk_rates,
diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
index 77b7bd58b257..8d7946db838a 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c
@@ -817,7 +817,8 @@ static int msm_eeprom_i2c_probe(struct i2c_client *client,
e_ctrl->eboard_info->i2c_slaveaddr;
/*Get clocks information*/
- rc = msm_camera_get_clk_info(e_ctrl->pdev,
+ rc = msm_camera_i2c_dev_get_clk_info(
+ &e_ctrl->i2c_client.client->dev,
&e_ctrl->eboard_info->power_info.clk_info,
&e_ctrl->eboard_info->power_info.clk_ptr,
&e_ctrl->eboard_info->power_info.clk_info_size);
@@ -868,7 +869,7 @@ static int msm_eeprom_i2c_remove(struct i2c_client *client)
return 0;
}
- msm_camera_put_clk_info(e_ctrl->pdev,
+ msm_camera_i2c_dev_put_clk_info(&e_ctrl->i2c_client.client->dev,
&e_ctrl->eboard_info->power_info.clk_info,
&e_ctrl->eboard_info->power_info.clk_ptr,
e_ctrl->eboard_info->power_info.clk_info_size);
@@ -1123,7 +1124,8 @@ static int msm_eeprom_spi_setup(struct spi_device *spi)
power_info->dev = &spi->dev;
/*Get clocks information*/
- rc = msm_camera_get_clk_info(e_ctrl->pdev,
+ rc = msm_camera_i2c_dev_get_clk_info(
+ &spi->dev,
&power_info->clk_info,
&power_info->clk_ptr,
&power_info->clk_info_size);
@@ -1209,6 +1211,11 @@ power_down:
msm_camera_power_down(power_info, e_ctrl->eeprom_device_type,
&e_ctrl->i2c_client);
caldata_free:
+ msm_camera_i2c_dev_put_clk_info(
+ &e_ctrl->i2c_client.spi_client->spi_master->dev,
+ &e_ctrl->eboard_info->power_info.clk_info,
+ &e_ctrl->eboard_info->power_info.clk_ptr,
+ e_ctrl->eboard_info->power_info.clk_info_size);
kfree(e_ctrl->cal_data.mapdata);
kfree(e_ctrl->cal_data.map);
board_free:
@@ -1255,7 +1262,8 @@ static int msm_eeprom_spi_remove(struct spi_device *sdev)
return 0;
}
- msm_camera_put_clk_info(e_ctrl->pdev,
+ msm_camera_i2c_dev_put_clk_info(
+ &e_ctrl->i2c_client.spi_client->spi_master->dev,
&e_ctrl->eboard_info->power_info.clk_info,
&e_ctrl->eboard_info->power_info.clk_ptr,
e_ctrl->eboard_info->power_info.clk_info_size);
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
index 55d78bdb4680..22d90a2baf7d 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
@@ -91,10 +91,19 @@ int32_t msm_sensor_free_sensor_data(struct msm_sensor_ctrl_t *s_ctrl)
kfree(s_ctrl->sensordata->power_info.power_down_setting);
kfree(s_ctrl->sensordata->csi_lane_params);
kfree(s_ctrl->sensordata->sensor_info);
- msm_camera_put_clk_info(s_ctrl->pdev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- s_ctrl->sensordata->power_info.clk_info_size);
+ if (s_ctrl->sensor_device_type == MSM_CAMERA_I2C_DEVICE) {
+ msm_camera_i2c_dev_put_clk_info(
+ &s_ctrl->sensor_i2c_client->client->dev,
+ &s_ctrl->sensordata->power_info.clk_info,
+ &s_ctrl->sensordata->power_info.clk_ptr,
+ s_ctrl->sensordata->power_info.clk_info_size);
+ } else {
+ msm_camera_put_clk_info(s_ctrl->pdev,
+ &s_ctrl->sensordata->power_info.clk_info,
+ &s_ctrl->sensordata->power_info.clk_ptr,
+ s_ctrl->sensordata->power_info.clk_info_size);
+ }
+
kfree(s_ctrl->sensordata);
return 0;
}
diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
index d71e425519bb..9bf5738d838c 100644
--- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
+++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
@@ -1020,23 +1020,13 @@ static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl)
goto FREE_SENSOR_DATA;
}
- /*Get clocks information*/
- rc = msm_camera_get_clk_info(s_ctrl->pdev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- &s_ctrl->sensordata->power_info.clk_info_size);
- if (rc < 0) {
- pr_err("failed: msm_camera_get_clk_info rc %d", rc);
- goto FREE_SUB_MODULE_DATA;
- }
-
/* Read vreg information */
rc = msm_camera_get_dt_vreg_data(of_node,
&sensordata->power_info.cam_vreg,
&sensordata->power_info.num_vreg);
if (rc < 0) {
pr_err("failed: msm_camera_get_dt_vreg_data rc %d", rc);
- goto FREE_CLK_DATA;
+ goto FREE_SUB_MODULE_DATA;
}
/* Read gpio information */
@@ -1095,12 +1085,6 @@ static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl)
FREE_VREG_DATA:
kfree(sensordata->power_info.cam_vreg);
-FREE_CLK_DATA:
- msm_camera_put_clk_info(s_ctrl->pdev,
- &s_ctrl->sensordata->power_info.clk_info,
- &s_ctrl->sensordata->power_info.clk_ptr,
- s_ctrl->sensordata->power_info.clk_info_size);
-
FREE_SUB_MODULE_DATA:
kfree(sensordata->sensor_info);
FREE_SENSOR_DATA:
@@ -1200,6 +1184,16 @@ static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev)
goto FREE_S_CTRL;
}
+ /* Get clocks information */
+ rc = msm_camera_get_clk_info(s_ctrl->pdev,
+ &s_ctrl->sensordata->power_info.clk_info,
+ &s_ctrl->sensordata->power_info.clk_ptr,
+ &s_ctrl->sensordata->power_info.clk_info_size);
+ if (rc < 0) {
+ pr_err("failed: msm_camera_get_clk_info rc %d", rc);
+ goto FREE_S_CTRL;
+ }
+
/* Fill platform device id*/
pdev->id = s_ctrl->id;
@@ -1245,9 +1239,17 @@ static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client,
if (s_ctrl->sensor_i2c_client != NULL) {
s_ctrl->sensor_i2c_client->client = client;
s_ctrl->sensordata->power_info.dev = &client->dev;
-
}
-
+ /* Get clocks information */
+ rc = msm_camera_i2c_dev_get_clk_info(
+ &s_ctrl->sensor_i2c_client->client->dev,
+ &s_ctrl->sensordata->power_info.clk_info,
+ &s_ctrl->sensordata->power_info.clk_ptr,
+ &s_ctrl->sensordata->power_info.clk_info_size);
+ if (rc < 0) {
+ pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", rc);
+ goto FREE_S_CTRL;
+ }
return rc;
FREE_S_CTRL:
kfree(s_ctrl);