Loading Documentation/devicetree/bindings/media/video/msm-cam-eeprom.txt +51 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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>; Loading @@ -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"; Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.c +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c +2 −1 Original line number Diff line number Diff line Loading @@ -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", Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c +12 −0 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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); Loading drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c +90 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
Documentation/devicetree/bindings/media/video/msm-cam-eeprom.txt +51 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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>; Loading @@ -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"; Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_dev.c +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c +2 −1 Original line number Diff line number Diff line Loading @@ -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", Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c +12 −0 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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); Loading
drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_soc.c +90 −0 Original line number Diff line number Diff line Loading @@ -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