Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dad83ca9 authored by Sureshnaidu Laveti's avatar Sureshnaidu Laveti Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarSureshnaidu Laveti <lsuresh@codeaurora.org>
parent 0130e341
Loading
Loading
Loading
Loading
+77 −18
Original line number Diff line number Diff line
@@ -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,
+37 −2
Original line number Diff line number Diff line
@@ -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,
+12 −4
Original line number Diff line number Diff line
@@ -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:
@@ -1259,7 +1266,8 @@ static int msm_eeprom_spi_remove(struct spi_device *sdev)
		pr_err("%s: eboard_info is NULL\n", __func__);
		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);
+13 −4
Original line number Diff line number Diff line
@@ -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);
	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;
}
+21 −19
Original line number Diff line number Diff line
@@ -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);