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

Commit 5223a005 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: sensor: Add sensor_id_mask"

parents 12489dbf 420f6336
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ Required properties:

Optional properties:
- qcom,slave-id : should contain i2c slave address, device id address
    and expected id read value
    ,expected id read value and device id mask
- qcom,sensor-name : should contain unique sensor name to differentiate from
    other sensor
    - "s5k3l1yx"
+49 −10
Original line number Diff line number Diff line
@@ -123,7 +123,10 @@ static int32_t msm_sensor_get_dt_data(struct device_node *of_node,
	struct msm_camera_sensor_board_info *sensordata = NULL;
	uint16_t *gpio_array = NULL;
	uint16_t gpio_array_size = 0;
	uint32_t id_info[3];
	uint32_t id_info[MSM_SENSOR_NUM_ID_INFO_DATA];
	uint32_t count;
	const uint32_t *p;
	struct msm_camera_slave_info *slave_info;

	s_ctrl->sensordata = kzalloc(sizeof(
		struct msm_camera_sensor_board_info),
@@ -287,21 +290,38 @@ static int32_t msm_sensor_get_dt_data(struct device_node *of_node,
		goto FREE_ACTUATOR_INFO;
	}

	slave_info = sensordata->slave_info;

	p = of_get_property(of_node, "qcom,slave-id", &count);
	if (!p || !count) {
		pr_err("%s failed %d\n", __func__, __LINE__);
		goto FREE_SLAVE_INFO;
	}

	if (count > MSM_SENSOR_NUM_ID_INFO_DATA) {
		pr_err("%s failed %d\n", __func__, __LINE__);
		goto FREE_SLAVE_INFO;
	}

	memset(id_info, 0, sizeof(*id_info)*MSM_SENSOR_NUM_ID_INFO_DATA);

	rc = of_property_read_u32_array(of_node, "qcom,slave-id",
		id_info, 3);
		id_info, count);
	if (rc < 0) {
		pr_err("%s failed %d\n", __func__, __LINE__);
		goto FREE_SLAVE_INFO;
	}

	sensordata->slave_info->sensor_slave_addr = id_info[0];
	sensordata->slave_info->sensor_id_reg_addr = id_info[1];
	sensordata->slave_info->sensor_id = id_info[2];
	CDBG("%s:%d slave addr 0x%x sensor reg 0x%x id 0x%x\n",
	slave_info->sensor_slave_addr = id_info[MSM_SENSOR_SLAVEADDR_DATA];
	slave_info->sensor_id_reg_addr = id_info[MSM_SENSOR_IDREGADDR_DATA];
	slave_info->sensor_id = id_info[MSM_SENSOR_SENSOR_ID_DATA];
	slave_info->sensor_id_mask = id_info[MSM_SENSOR_SENIDMASK_DATA];
	CDBG("%s:%d slave addr 0x%x sensor reg 0x%x id 0x%x mask 0x%x\n",
		__func__, __LINE__,
		sensordata->slave_info->sensor_slave_addr,
		sensordata->slave_info->sensor_id_reg_addr,
		sensordata->slave_info->sensor_id);
		slave_info->sensor_slave_addr,
		slave_info->sensor_id_reg_addr,
		slave_info->sensor_id,
		slave_info->sensor_id_mask);

	/*Optional property, don't return error if absent */
	ret = of_property_read_string(of_node, "qcom,vdd-cx-name",
@@ -485,6 +505,25 @@ int msm_sensor_power_up(struct msm_sensor_ctrl_t *s_ctrl)
	return rc;
}

static uint16_t msm_sensor_id_by_mask(struct msm_sensor_ctrl_t *s_ctrl,
	uint16_t chipid)
{
	uint16_t sensor_id = chipid;
	int16_t sensor_id_mask = s_ctrl->sensordata->slave_info->sensor_id_mask;

	if (!sensor_id_mask)
		sensor_id_mask = ~sensor_id_mask;

	sensor_id &= sensor_id_mask;
	sensor_id_mask &= -sensor_id_mask;
	sensor_id_mask -= 1;
	while (sensor_id_mask) {
		sensor_id_mask >>= 1;
		sensor_id >>= 1;
	}
	return sensor_id;
}

int msm_sensor_match_id(struct msm_sensor_ctrl_t *s_ctrl)
{
	int rc = 0;
@@ -519,7 +558,7 @@ int msm_sensor_match_id(struct msm_sensor_ctrl_t *s_ctrl)

	CDBG("%s: read id: 0x%x expected id 0x%x:\n", __func__, chipid,
		slave_info->sensor_id);
	if (chipid != slave_info->sensor_id) {
	if (msm_sensor_id_by_mask(s_ctrl, chipid) != slave_info->sensor_id) {
		pr_err("msm_sensor_match_id chip id doesnot match\n");
		return -ENODEV;
	}
+8 −0
Original line number Diff line number Diff line
@@ -38,6 +38,14 @@
#define DEFINE_MSM_MUTEX(mutexname) \
	static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)

enum msm_sensor_sensor_slave_info_type {
	MSM_SENSOR_SLAVEADDR_DATA,
	MSM_SENSOR_IDREGADDR_DATA,
	MSM_SENSOR_SENSOR_ID_DATA,
	MSM_SENSOR_SENIDMASK_DATA,
	MSM_SENSOR_NUM_ID_INFO_DATA,
};

struct msm_sensor_ctrl_t;

enum msm_sensor_state_t {
+2 −0
Original line number Diff line number Diff line
@@ -713,6 +713,7 @@ int32_t msm_sensor_driver_probe(void *setting,
	CDBG("sensor_id_reg_addr 0x%x",
		slave_info->sensor_id_info.sensor_id_reg_addr);
	CDBG("sensor_id 0x%x", slave_info->sensor_id_info.sensor_id);
	CDBG("sensor id mask %d", slave_info->sensor_id_info.sensor_id_mask);
	CDBG("size %d", slave_info->power_setting_array.size);
	CDBG("size down %d", slave_info->power_setting_array.size_down);

@@ -787,6 +788,7 @@ int32_t msm_sensor_driver_probe(void *setting,
	camera_info->sensor_id_reg_addr =
		slave_info->sensor_id_info.sensor_id_reg_addr;
	camera_info->sensor_id = slave_info->sensor_id_info.sensor_id;
	camera_info->sensor_id_mask = slave_info->sensor_id_info.sensor_id_mask;

	/* Fill CCI master, slave address and CCI default params */
	if (!s_ctrl->sensor_i2c_client) {
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ struct msm_camera_slave_info {
	uint16_t sensor_slave_addr;
	uint16_t sensor_id_reg_addr;
	uint16_t sensor_id;
	uint16_t sensor_id_mask;
};

struct msm_cam_clk_info {
Loading