diff options
author | Sureshnaidu Laveti <lsuresh@codeaurora.org> | 2016-05-03 15:17:19 -0700 |
---|---|---|
committer | Jeevan Shriram <jshriram@codeaurora.org> | 2016-05-18 13:40:34 -0700 |
commit | a4663702036e6b0ae9b82691027d9913d65d7a02 (patch) | |
tree | 3ec0693cc8ea02289159bbf9d901f7fbf508118d /drivers/media | |
parent | ba939576176482a9d3294dd488c7bd7ce00d3921 (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')
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); |