diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-20 23:44:48 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-20 23:44:47 -0800 |
| commit | ab12376e5f69a7aa4de8f29278002564e334665d (patch) | |
| tree | 64bd6565e5382c8db0252b693cee5b5e4595a3cb | |
| parent | 4802720f7bd5441cfaebbe28061ef3944f07df2b (diff) | |
| parent | 7dcadefa9c28e9c87140112a44e18e55fe1d4090 (diff) | |
Merge "msm: camera: add logic to support sensor compatibility"
| -rw-r--r-- | Documentation/devicetree/bindings/media/video/msm-cci.txt | 2 | ||||
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c | 61 | ||||
| -rw-r--r-- | include/soc/qcom/camera2.h | 3 |
3 files changed, 64 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt index 991c6d4ec255..9fb84020add7 100644 --- a/Documentation/devicetree/bindings/media/video/msm-cci.txt +++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt @@ -172,6 +172,8 @@ Optional properties: should contain phandle of respective ir-led node - qcom,ir-cut-src : if ir cut is supported by this sensor, this property should contain phandle of respective ir-cut node +- qcom,special-support-sensors: if only some special sensors are supported + on this board, add sensor name in this property. * Qualcomm Technologies, Inc. MSM ACTUATOR diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index c1c25b655d1f..1dd2b0d26007 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -677,6 +677,24 @@ static void msm_sensor_fill_sensor_info(struct msm_sensor_ctrl_t *s_ctrl, } /* static function definition */ +static int32_t msm_sensor_driver_is_special_support( + struct msm_sensor_ctrl_t *s_ctrl, + char *sensor_name) +{ + int32_t rc = 0, i = 0; + struct msm_camera_sensor_board_info *sensordata = s_ctrl->sensordata; + + for (i = 0; i < sensordata->special_support_size; i++) { + if (!strcmp(sensordata->special_support_sensors[i], + sensor_name)) { + rc = TRUE; + break; + } + } + return rc; +} + +/* static function definition */ int32_t msm_sensor_driver_probe(void *setting, struct msm_sensor_info_t *probed_info, char *entity_name) { @@ -802,6 +820,16 @@ int32_t msm_sensor_driver_probe(void *setting, CDBG("s_ctrl[%d] %pK", slave_info->camera_id, s_ctrl); + if (s_ctrl->sensordata->special_support_size > 0) { + if (!msm_sensor_driver_is_special_support(s_ctrl, + slave_info->sensor_name)) { + pr_err("%s:%s is not support on this board\n", + __func__, slave_info->sensor_name); + rc = 0; + goto free_slave_info; + } + } + if (s_ctrl->is_probe_succeed == 1) { /* * Different sensor on this camera slot has been connected @@ -1009,10 +1037,10 @@ free_slave_info: static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl) { - int32_t rc = 0; + int32_t rc = 0, i = 0; struct msm_camera_sensor_board_info *sensordata = NULL; struct device_node *of_node = s_ctrl->of_node; - uint32_t cell_id; + uint32_t cell_id; s_ctrl->sensordata = kzalloc(sizeof(*sensordata), GFP_KERNEL); if (!s_ctrl->sensordata) { @@ -1047,6 +1075,35 @@ static int32_t msm_sensor_driver_get_dt_data(struct msm_sensor_ctrl_t *s_ctrl) goto FREE_SENSOR_DATA; } + sensordata->special_support_size = + of_property_count_strings(of_node, + "qcom,special-support-sensors"); + + if (sensordata->special_support_size < 0) + sensordata->special_support_size = 0; + + if (sensordata->special_support_size > MAX_SPECIAL_SUPPORT_SIZE) { + pr_debug("%s:support_size exceed max support size\n", __func__); + sensordata->special_support_size = MAX_SPECIAL_SUPPORT_SIZE; + } + + if (sensordata->special_support_size) { + for (i = 0; i < sensordata->special_support_size; i++) { + rc = of_property_read_string_index(of_node, + "qcom,special-support-sensors", i, + &(sensordata->special_support_sensors[i])); + if (rc < 0) { + /* if read sensor support names failed, + * set support all sensors, break; + */ + sensordata->special_support_size = 0; + break; + } + CDBG("%s special_support_sensors[%d] = %s\n", __func__, + i, sensordata->special_support_sensors[i]); + } + } + /* Read subdev info */ rc = msm_sensor_get_sub_module_index(of_node, &sensordata->sensor_info); if (rc < 0) { diff --git a/include/soc/qcom/camera2.h b/include/soc/qcom/camera2.h index bf9db17e6981..5a61d2b372c3 100644 --- a/include/soc/qcom/camera2.h +++ b/include/soc/qcom/camera2.h @@ -20,6 +20,7 @@ #include <linux/of_device.h> #include <linux/of.h> +#define MAX_SPECIAL_SUPPORT_SIZE 10 enum msm_camera_device_type_t { MSM_CAMERA_I2C_DEVICE, @@ -148,6 +149,8 @@ struct msm_camera_sensor_board_info { const char *actuator_name; const char *ois_name; const char *flash_name; + const char *special_support_sensors[MAX_SPECIAL_SUPPORT_SIZE]; + int32_t special_support_size; struct msm_camera_slave_info *slave_info; struct msm_camera_csi_lane_params *csi_lane_params; struct msm_camera_sensor_strobe_flash_data *strobe_flash_data; |
