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

Commit a7d81ced authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: Populate sensor eeprom subdev id during probe"

parents f41a0505 9779ad77
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -156,6 +156,8 @@ Optional properties:
- qcom,vdd-cx-supply : should contain regulator from which cx voltage is
- qcom,vdd-cx-supply : should contain regulator from which cx voltage is
    supplied
    supplied
- qcom,vdd-cx-name : should contain names of cx regulator
- qcom,vdd-cx-name : should contain names of cx regulator
- qcom,eeprom-src : if eeprom memory is supported by this sensor, this
   property should contain phandle of respective eeprom nodes


* Qualcomm MSM ACTUATOR
* Qualcomm MSM ACTUATOR


@@ -215,6 +217,7 @@ Example:
               qcom,csiphy-sd-index = <2>;
               qcom,csiphy-sd-index = <2>;
               qcom,csid-sd-index = <0>;
               qcom,csid-sd-index = <0>;
               qcom,actuator-src = <&actuator0>;
               qcom,actuator-src = <&actuator0>;
               qcom,eeprom-src = <&eeprom0 &eeprom1>;
               qcom,led-flash-src = <&led_flash0>;
               qcom,led-flash-src = <&led_flash0>;
               qcom,mount-angle = <90>;
               qcom,mount-angle = <90>;
               qcom,sensor-name = "s5k3l1yx";
               qcom,sensor-name = "s5k3l1yx";
+1 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@ struct msm_camera_power_ctrl_t {


struct msm_camera_sensor_board_info {
struct msm_camera_sensor_board_info {
	const char *sensor_name;
	const char *sensor_name;
	const char *eeprom_name;
	struct msm_camera_slave_info *slave_info;
	struct msm_camera_slave_info *slave_info;
	struct msm_camera_csi_lane_params *csi_lane_params;
	struct msm_camera_csi_lane_params *csi_lane_params;
	struct msm_camera_sensor_strobe_flash_data *strobe_flash_data;
	struct msm_camera_sensor_strobe_flash_data *strobe_flash_data;
+86 −3
Original line number Original line Diff line number Diff line
@@ -10,8 +10,6 @@
 * GNU General Public License for more details.
 * GNU General Public License for more details.
 */
 */


#define pr_fmt(fmt) "MSM-SENSOR-DRIVER %s:%d " fmt "\n", __func__, __LINE__

#define SENSOR_DRIVER_I2C "camera"
#define SENSOR_DRIVER_I2C "camera"
/* Header file declaration */
/* Header file declaration */
#include "msm_sensor.h"
#include "msm_sensor.h"
@@ -140,6 +138,81 @@ static int32_t msm_sensor_driver_create_v4l_subdev
	return rc;
	return rc;
}
}


static int32_t msm_sensor_fill_eeprom_subdevid_by_name(
				struct msm_sensor_ctrl_t *s_ctrl)
{
	int32_t rc = 0;
	const char *eeprom_name;
	struct device_node *src_node = NULL;
	uint32_t val = 0, count = 0, eeprom_name_len;
	int i;
	int32_t *eeprom_subdev_id;
	struct  msm_sensor_info_t *sensor_info;
	struct device_node *of_node = s_ctrl->of_node;
	const void *p;

	if (!s_ctrl->sensordata->eeprom_name || !of_node)
		return -EINVAL;

	eeprom_name_len = strlen(s_ctrl->sensordata->eeprom_name);
	if (eeprom_name_len >= MAX_SENSOR_NAME)
		return -EINVAL;

	sensor_info = s_ctrl->sensordata->sensor_info;
	eeprom_subdev_id = &sensor_info->subdev_id[SUB_MODULE_EEPROM];
	/*
	 * string for eeprom name is valid, set sudev id to -1
	 *  and try to found new id
	 */
	*eeprom_subdev_id = -1;

	if (0 == eeprom_name_len)
		return 0;

	CDBG("Try to find eeprom subdev for %s\n",
			s_ctrl->sensordata->eeprom_name);
	p = of_get_property(of_node, "qcom,eeprom-src", &count);
	if (!p || !count)
		return 0;

	count /= sizeof(uint32_t);
	for (i = 0; i < count; i++) {
		eeprom_name = NULL;
		src_node = of_parse_phandle(of_node, "qcom,eeprom-src", i);
		if (!src_node) {
			pr_err("eeprom src node NULL\n");
			continue;
		}
		rc = of_property_read_string(src_node, "qcom,eeprom-name",
			&eeprom_name);
		if (rc < 0) {
			pr_err("failed\n");
			of_node_put(src_node);
			continue;
		}
		if (strcmp(eeprom_name, s_ctrl->sensordata->eeprom_name))
			continue;

		rc = of_property_read_u32(src_node, "cell-index", &val);

		CDBG("%s qcom,eeprom cell index %d, rc %d\n", __func__,
			val, rc);
		if (rc < 0) {
			pr_err("failed\n");
			of_node_put(src_node);
			continue;
		}

		*eeprom_subdev_id = val;
		CDBG("Done. Eeprom subdevice id is %d\n", val);
		of_node_put(src_node);
		src_node = NULL;
		break;
	}

	return rc;
}

/* static function definition */
/* static function definition */
int32_t msm_sensor_driver_probe(void *setting)
int32_t msm_sensor_driver_probe(void *setting)
{
{
@@ -289,8 +362,18 @@ int32_t msm_sensor_driver_probe(void *setting)
		goto FREE_POWER_SETTING;
		goto FREE_POWER_SETTING;
	}
	}


	/* Update sensor name in sensor control structure */
	/* Update sensor and eeprom name in sensor control structure */
	s_ctrl->sensordata->sensor_name = slave_info->sensor_name;
	s_ctrl->sensordata->sensor_name = slave_info->sensor_name;
	s_ctrl->sensordata->eeprom_name = slave_info->eeprom_name;

	/*
	 * Update eeporm subdevice Id by input eeprom name
	 */
	rc = msm_sensor_fill_eeprom_subdevid_by_name(s_ctrl);
	if (rc < 0) {
		pr_err("%s failed %d\n", __func__, __LINE__);
		goto FREE_POWER_SETTING;
	}


	/* Power up and probe sensor */
	/* Power up and probe sensor */
	rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
	rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
+1 −0
Original line number Original line Diff line number Diff line
@@ -249,6 +249,7 @@ enum cci_i2c_master_t {


struct msm_camera_sensor_slave_info {
struct msm_camera_sensor_slave_info {
	char sensor_name[32];
	char sensor_name[32];
	char eeprom_name[32];
	enum msm_sensor_camera_id_t camera_id;
	enum msm_sensor_camera_id_t camera_id;
	uint16_t slave_addr;
	uint16_t slave_addr;
	enum msm_camera_i2c_reg_addr_type addr_type;
	enum msm_camera_i2c_reg_addr_type addr_type;