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

Commit 80a1140e authored by Jigarkumar Zala's avatar Jigarkumar Zala Committed by Gerrit - the friendly Code Review server
Browse files

msm: camera: add spi read sequence support



Add SPI read sequence support for eeprom in order to perform
sequential read opreation.

Change-Id: Ibfe0f3157c3257912a5e233b4896f5b6fe86ccac
Signed-off-by: default avatarJigarkumar Zala <jzala@codeaurora.org>
parent c6c090bd
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -278,6 +278,46 @@ First Level Node - CAM EEPROM device
  Value type: <u32>
  Definition: should specify the power on sequence delay time in ms.

- spiop-read
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI read operation related data.

- spiop-readseq
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI read sequence operation realted data.

- spiop-queryid
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI query eeprom id operation related data.

- spiop-pprog:
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI page program operation related data.

- spiop-wenable
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI write enable operation related data.

- spiop-readst
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI read destination operation related data.

- spiop-erase
  Usage: required
  Value type: <u32>
  Definition: this array provides SPI erase operation related data.

- eeprom-idx
  Usage: required
  Value type: <u32>
  Definition: this array provides eeprom id realted data.

- xxxx-supply
  Usage: required
  Value type: <phandle>
@@ -385,6 +425,10 @@ Example:
		cell-index = <0>;
		reg = <0x0>;
		qcom,eeprom-name = "msm_eeprom";
		eeprom-id0 = <0xF8 0x15>;
		eeprom-id1 = <0xEF 0x15>;
		eeprom-id2 = <0xC2 0x36>;
		eeprom-id3 = <0xC8 0x15>;
		compatible = "qcom,eeprom";
		qcom,slave-addr = <0x60>;
		qcom,num-blocks = <2>;
@@ -400,6 +444,13 @@ Example:
		qcom,cmm-data-compressed;
		qcom,cmm-data-offset = <0>;
		qcom,cmm-data-size = <0>;
		spiop-read = <0x03 3 0 0 0>;
		spiop-readseq = <0x03 3 0 0 0>;
		spiop-queryid = <0x90 3 0 0 0>;
		spiop-pprog = <0x02 3 0 3 100>;
		spiop-wenable = <0x06 0 0 0 0>;
		spiop-readst = <0x05 0 0 0 0>;
		spiop-erase = <0x20 3 0 10 100>;
		qcom,cam-power-seq-type = "sensor_vreg",
			"sensor_vreg", "sensor_clk",
			"sensor_gpio", "sensor_gpio";
+1 −0
Original line number Diff line number Diff line
@@ -286,6 +286,7 @@ static int32_t cam_actuator_driver_platform_probe(
	}

	/* Fill platform device id*/
	a_ctrl->id = a_ctrl->soc_info.index;
	pdev->id = a_ctrl->id;

	rc = cam_actuator_init_subdev(a_ctrl);
+2 −1
Original line number Diff line number Diff line
@@ -243,7 +243,8 @@ static int cam_eeprom_match_id(struct cam_eeprom_ctrl_t *e_ctrl)
	struct camera_io_master *client = &e_ctrl->io_master_info;
	uint8_t                  id[2];

	rc = cam_spi_query_id(client, 0, &id[0], 2);
	rc = cam_spi_query_id(client, 0, CAMERA_SENSOR_I2C_TYPE_WORD,
		&id[0], 2);
	if (rc)
		return rc;
	CAM_DBG(CAM_EEPROM, "read 0x%x 0x%x, check 0x%x 0x%x",
+12 −0
Original line number Diff line number Diff line
@@ -152,6 +152,12 @@ static int cam_eeprom_i2c_driver_probe(struct i2c_client *client,
		goto probe_failure;
	}

	soc_private = kzalloc(sizeof(*soc_private), GFP_KERNEL);
	if (!soc_private)
		goto ectrl_free;

	e_ctrl->soc_info.soc_private = soc_private;

	i2c_set_clientdata(client, e_ctrl);

	mutex_init(&(e_ctrl->eeprom_mutex));
@@ -307,6 +313,12 @@ static int cam_eeprom_spi_setup(struct spi_device *spi)
		goto board_free;
	}

	rc = cam_eeprom_spi_parse_of(spi_client);
	if (rc) {
		CAM_ERR(CAM_EEPROM, "Device tree parsing error");
		goto board_free;
	}

	if (e_ctrl->userspace_probe == false) {
		rc = cam_eeprom_parse_read_memory_map(soc_info->dev->of_node,
			e_ctrl);
+90 −0
Original line number Diff line number Diff line
@@ -20,6 +20,96 @@
#include "cam_eeprom_soc.h"
#include "cam_debug_util.h"

#define cam_eeprom_spi_parse_cmd(spi_dev, name, out)          \
	{                                                     \
		spi_dev->cmd_tbl.name.opcode = out[0];        \
		spi_dev->cmd_tbl.name.addr_len = out[1];      \
		spi_dev->cmd_tbl.name.dummy_len = out[2];     \
		spi_dev->cmd_tbl.name.delay_intv = out[3];    \
		spi_dev->cmd_tbl.name.delay_count = out[4];   \
	}

int cam_eeprom_spi_parse_of(struct cam_sensor_spi_client *spi_dev)
{
	int rc = -EFAULT;
	uint32_t tmp[5];

	rc  = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-read", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, read, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get read data");
		return -EFAULT;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-readseq", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, read_seq, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get readseq data");
		return -EFAULT;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-queryid", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, query_id, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get queryid data");
		return -EFAULT;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-pprog", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, page_program, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get page program data");
		return -EFAULT;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-wenable", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, write_enable, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get write enable data");
		return rc;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-readst", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, read_status, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get readdst data");
		return rc;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"spiop-erase", tmp, 5);
	if (!rc) {
		cam_eeprom_spi_parse_cmd(spi_dev, erase, tmp);
	} else {
		CAM_ERR(CAM_EEPROM, "Failed to get erase data");
		return rc;
	}

	rc = of_property_read_u32_array(spi_dev->spi_master->dev.of_node,
		"eeprom-id", tmp, 2);
	if (rc) {
		CAM_ERR(CAM_EEPROM, "Failed to get eeprom id");
		return rc;
	}

	spi_dev->mfr_id0 = tmp[0];
	spi_dev->device_id0 = tmp[1];

	return 0;
}

/*
 * cam_eeprom_parse_memory_map() - parse memory map in device node
 * @of:         device node
Loading