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

Commit d4c80c4f authored by Rajesh Bondugula's avatar Rajesh Bondugula
Browse files

msm: camera: sensor: Add support to use custom vregs



Add support to use non standard voltage
regulator names.

Change-Id: I331f65dfa256bac07a7b54e6e5e14eb065707901
Signed-off-by: default avatarRajesh Bondugula <rajeshb@codeaurora.org>
Signed-off-by: default avatarDeepak Kaushal <dkaushal@codeaurora.org>
parent a65cf5a3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -32,8 +32,6 @@ Required properties:
- cam_vio-supply : should contain regulator to be used for the IO vdd.
- qcom,cam-vreg-name : should specify the regulator name to be used for
    this eeprom.
- qcom,cam-vreg-type : should specify the regulator type to be used for
    this eeprom.
- qcom,cam-vreg-min-voltage : should specify minimum voltage level
    for eeprom in uV.
- qcom,cam-vreg-max-voltage : should specify maximum voltage level
@@ -61,6 +59,8 @@ Optional properties:
- qcom,i2c-freq-mode : property should specify the I2C speed mode.
- qcom,gpio-custom1 : should specify the custom non standard gpio1 index.
- qcom,gpio-custom2 : should specify the custom non standard gpio2 index.
- qcom,cam-vreg-type : should specify the regulator type to be used for
    this eeprom. 0 for Default VREG and 1 for custom.

Optional properties -EEPROM Camera Multimodule
- qcom,cmm-data-support - Camera MultiModule data capability flag.
+61 −0
Original line number Diff line number Diff line
@@ -91,6 +91,30 @@ int msm_camera_fill_vreg_params(struct camera_vreg_t *cam_vreg,
			}
			break;

		case CAM_V_CUSTOM1:
			for (j = 0; j < num_vreg; j++) {
				if (!strcmp(cam_vreg[j].reg_name,
					"cam_v_custom1")) {
					pr_err("%s:%d i %d j %d cam_vcustom1\n",
						__func__, __LINE__, i, j);
					power_setting[i].seq_val = j;
					break;
				}
			}
			break;

		case CAM_V_CUSTOM2:
			for (j = 0; j < num_vreg; j++) {
				if (!strcmp(cam_vreg[j].reg_name,
					"cam_v_custom2")) {
					pr_err("%s:%d i %d j %d cam_vcustom2\n",
						__func__, __LINE__, i, j);
					power_setting[i].seq_val = j;
					break;
				}
			}
			break;

		default:
			pr_err("%s:%d invalid seq_val %d\n", __func__,
				__LINE__, power_setting[i].seq_val);
@@ -1025,6 +1049,7 @@ int msm_camera_get_dt_vreg_data(struct device_node *of_node,
	uint32_t count = 0;
	uint32_t *vreg_array = NULL;
	struct camera_vreg_t *vreg = NULL;
	bool custom_vreg_name =  false;

	count = of_property_count_strings(of_node, "qcom,cam-vreg-name");
	CDBG("%s qcom,cam-vreg-name count %d\n", __func__, count);
@@ -1051,6 +1076,22 @@ int msm_camera_get_dt_vreg_data(struct device_node *of_node,
		}
	}

	custom_vreg_name = of_property_read_bool(of_node,
		"qcom,cam-custom-vreg-name");
	if (custom_vreg_name) {
		for (i = 0; i < count; i++) {
			rc = of_property_read_string_index(of_node,
				"qcom,cam-custom-vreg-name", i,
				&vreg[i].custom_vreg_name);
			CDBG("%s sub reg_name[%d] = %s\n", __func__, i,
				vreg[i].custom_vreg_name);
			if (rc < 0) {
				pr_err("%s failed %d\n", __func__, __LINE__);
				goto ERROR1;
			}
		}
	}

	vreg_array = kzalloc(sizeof(uint32_t) * count, GFP_KERNEL);
	if (!vreg_array) {
		pr_err("%s failed %d\n", __func__, __LINE__);
@@ -1058,6 +1099,26 @@ int msm_camera_get_dt_vreg_data(struct device_node *of_node,
		goto ERROR1;
	}

	for (i = 0; i < count; i++)
		vreg[i].type = VREG_TYPE_DEFAULT;

	rc = of_property_read_u32_array(of_node, "qcom,cam-vreg-type",
		vreg_array, count);
	if (rc != -EINVAL) {
		if (rc < 0) {
			pr_err("%s failed %d\n", __func__, __LINE__);
			goto ERROR2;
		} else {
			for (i = 0; i < count; i++) {
				vreg[i].type = vreg_array[i];
				CDBG("%s cam_vreg[%d].type = %d\n", __func__, i,
					vreg[i].type);
			}
		}
	} else {
		rc = 0;
	}

	rc = of_property_read_u32_array(of_node, "qcom,cam-vreg-min-voltage",
		vreg_array, count);
	if (rc < 0) {
+37 −16
Original line number Diff line number Diff line
@@ -138,8 +138,7 @@ int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
	long clk_rate;
	if (enable) {
		for (i = 0; i < num_clk; i++) {
			CDBG("%s enable %s\n", __func__,
				clk_info[i].clk_name);
			CDBG("%s enable %s\n", __func__, clk_info[i].clk_name);
			clk_ptr[i] = clk_get(dev, clk_info[i].clk_name);
			if (IS_ERR(clk_ptr[i])) {
				pr_err("%s get failed\n", clk_info[i].clk_name);
@@ -447,7 +446,7 @@ void msm_camera_bus_scale_cfg(uint32_t bus_perf_client,
	case S_DEFAULT:
		break;
	default:
		pr_debug("%s: INVALID CASE\n", __func__);
		pr_err("%s: INVALID CASE\n", __func__);
	}
}

@@ -477,26 +476,45 @@ int msm_camera_config_single_vreg(struct device *dev,
	struct camera_vreg_t *cam_vreg, struct regulator **reg_ptr, int config)
{
	int rc = 0;
	if (config) {
	const char *vreg_name = NULL;

	if (!dev || !cam_vreg || !reg_ptr) {
		pr_err("%s: get failed NULL parameter\n", __func__);
		goto vreg_get_fail;
	}
		CDBG("%s enable %s\n", __func__, cam_vreg->reg_name);
		*reg_ptr = regulator_get(dev, cam_vreg->reg_name);
		if (IS_ERR_OR_NULL(*reg_ptr)) {
			pr_err("%s: %s get failed\n", __func__,
				cam_vreg->reg_name);
	if (cam_vreg->type == VREG_TYPE_CUSTOM) {
		if (cam_vreg->custom_vreg_name == NULL) {
			pr_err("%s : can't find sub reg name",
				__func__);
			goto vreg_get_fail;
		}
		vreg_name = cam_vreg->custom_vreg_name;
	} else {
		if (cam_vreg->reg_name == NULL) {
			pr_err("%s : can't find reg name", __func__);
			goto vreg_get_fail;
		}
		vreg_name = cam_vreg->reg_name;
	}

	if (config) {
		CDBG("%s enable %s\n", __func__, vreg_name);
		*reg_ptr = regulator_get(dev, vreg_name);
		if (IS_ERR(*reg_ptr)) {
			pr_err("%s: %s get failed\n", __func__, vreg_name);
			*reg_ptr = NULL;
			goto vreg_get_fail;
		}
		if (regulator_count_voltages(*reg_ptr) > 0) {
			CDBG("%s: voltage min=%d, max=%d\n",
				__func__, cam_vreg->min_voltage,
				cam_vreg->max_voltage);
			rc = regulator_set_voltage(
				*reg_ptr, cam_vreg->min_voltage,
				cam_vreg->max_voltage);
			if (rc < 0) {
				pr_err("%s: %s set voltage failed\n",
					__func__, cam_vreg->reg_name);
					__func__, vreg_name);
				goto vreg_set_voltage_fail;
			}
			if (cam_vreg->op_mode >= 0) {
@@ -505,20 +523,21 @@ int msm_camera_config_single_vreg(struct device *dev,
				if (rc < 0) {
					pr_err(
					"%s: %s set optimum mode failed\n",
					__func__, cam_vreg->reg_name);
					__func__, vreg_name);
					goto vreg_set_opt_mode_fail;
				}
			}
		}
		rc = regulator_enable(*reg_ptr);
		if (rc < 0) {
			pr_err("%s: %s enable failed\n",
				__func__, cam_vreg->reg_name);
			pr_err("%s: %s regulator_enable failed\n", __func__,
				vreg_name);
			goto vreg_unconfig;
		}
	} else {
		CDBG("%s disable %s\n", __func__, vreg_name);
		if (*reg_ptr) {
			CDBG("%s disable %s\n", __func__, cam_vreg->reg_name);
			CDBG("%s disable %s\n", __func__, vreg_name);
			regulator_disable(*reg_ptr);
			if (regulator_count_voltages(*reg_ptr) > 0) {
				if (cam_vreg->op_mode >= 0)
@@ -528,6 +547,8 @@ int msm_camera_config_single_vreg(struct device *dev,
			}
			regulator_put(*reg_ptr);
			*reg_ptr = NULL;
		} else {
			pr_err("%s can't disable %s\n", __func__, vreg_name);
		}
	}
	return 0;
+4 −3
Original line number Diff line number Diff line
@@ -148,9 +148,8 @@ enum csiphy_cfg_type_t {
};

enum camera_vreg_type {
	REG_LDO,
	REG_VS,
	REG_GPIO,
	VREG_TYPE_DEFAULT,
	VREG_TYPE_CUSTOM,
};

enum sensor_af_t {
@@ -212,6 +211,8 @@ struct camera_vreg_t {
	int max_voltage;
	int op_mode;
	uint32_t delay;
	const char *custom_vreg_name;
	enum camera_vreg_type type;
};

struct sensorb_cfg_data {
+2 −0
Original line number Diff line number Diff line
@@ -103,6 +103,8 @@ enum msm_camera_vreg_name_t {
	CAM_VIO,
	CAM_VANA,
	CAM_VAF,
	CAM_V_CUSTOM1,
	CAM_V_CUSTOM2,
	CAM_VREG_MAX,
};