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

Commit e0abee5f authored by Aparna Das's avatar Aparna Das Committed by Stephen Boyd
Browse files

coresight: configure sdc io regulator for tpiu trace via sdc



For trace via sdc the sdc io regulator needs to be configured and enabled.
Add support for this in CoreSight driver instead of depending upon the
configured values of sdc io regulator on bootup.

Change-Id: I65f341c1dde58ee5e66372bcfb11393fc33bef54
Signed-off-by: default avatarAparna Das <adas@codeaurora.org>
parent b018b886
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -100,11 +100,18 @@ Optional properties:
- qcom,reset-flush-race : indicates if a race exists between flushing and ddr
			  being put into self-refresh during watchdog reset
- qcom,write-64bit : only 64bit data writes supported by stm
- vdd-supply: phandle to the regulator device tree node. Used for tpiu component
- qcom,vdd-voltage-level : specifies voltage level for vdd supply. Should be
			   specified in pairs (min, max) with units being uV
- qcom,vdd-current-level : specifies current load levels for vdd supply. Should
			   be specified in paris (lpm, hpm) with units being uA
- <supply-name>-supply: phandle to the regulator device tree node. The required
			<supply-name> is "vdd" for SD card and "vdd-io" for SD
			I/O supply. Used for tpiu component
- qcom,<supply>-voltage-level : specifies voltage level for vdd supply. Should
				be specified in pairs (min, max) with units
				being uV. Here <supply> can be "vdd" for SD card
				vdd supply or "vdd-io" for SD I/O vdd supply.
- qcom,<supply>-current-level : specifies current load levels for vdd supply.
				Should be specified in pairs (lpm, hpm) with
				units being uA. Here <supply> can be "vdd" for
				SD card vdd supply or "vdd-io" for SD I/O vdd
				supply.
- qcom,seta-gpios : specifies gpios included in set A that are routed to the
		    mictor connector. Used for tpiu component
- qcom,seta-gpios-func : active function select for set A gpios
+49 −1
Original line number Diff line number Diff line
@@ -88,6 +88,11 @@ struct tpiu_drvdata {
	unsigned int		reg_high;
	unsigned int		reg_lpm;
	unsigned int		reg_hpm;
	struct regulator        *reg_io;
	unsigned int            reg_low_io;
	unsigned int            reg_high_io;
	unsigned int            reg_lpm_io;
	unsigned int            reg_hpm_io;
	enum tpiu_set		set;
	unsigned int		seta_gpiocnt;
	unsigned int		*seta_gpios;
@@ -240,7 +245,7 @@ static int __tpiu_enable_to_sdc(struct tpiu_drvdata *drvdata)
{
	int ret;

	if (!drvdata->reg)
	if (!drvdata->reg || !drvdata->reg_io)
		return -EINVAL;

	ret = tpiu_reg_set_optimum_mode(drvdata->reg, drvdata->reg_hpm);
@@ -253,6 +258,16 @@ static int __tpiu_enable_to_sdc(struct tpiu_drvdata *drvdata)
	ret = regulator_enable(drvdata->reg);
	if (ret)
		goto err1;
	ret = tpiu_reg_set_optimum_mode(drvdata->reg_io, drvdata->reg_hpm_io);
	if (ret < 0)
		goto err2;
	ret = tpiu_reg_set_voltage(drvdata->reg_io, drvdata->reg_low_io,
				   drvdata->reg_high_io);
	if (ret)
		goto err3;
	ret = regulator_enable(drvdata->reg_io);
	if (ret)
		goto err4;

	msm_tlmm_misc_reg_write(TLMM_SDC2_HDRV_PULL_CTL, 0x16D);
	msm_tlmm_misc_reg_write(TLMM_ETM_MODE_REG, 1);
@@ -265,6 +280,12 @@ static int __tpiu_enable_to_sdc(struct tpiu_drvdata *drvdata)
	TPIU_LOCK(drvdata);

	return 0;
err4:
	tpiu_reg_set_voltage(drvdata->reg_io, 0, drvdata->reg_high_io);
err3:
	tpiu_reg_set_optimum_mode(drvdata->reg_io, 0);
err2:
	regulator_disable(drvdata->reg);
err1:
	tpiu_reg_set_voltage(drvdata->reg, 0, drvdata->reg_high);
err0:
@@ -566,6 +587,33 @@ static int tpiu_parse_of_data(struct platform_device *pdev,
		dev_err(dev, "sdc voltage supply not specified or available\n");
	}

	reg_node = of_parse_phandle(node, "vdd-io-supply", 0);
	if (reg_node) {
		drvdata->reg_io = devm_regulator_get(dev, "vdd-io");
		if (IS_ERR(drvdata->reg_io))
			return PTR_ERR(drvdata->reg_io);

		prop = of_get_property(node, "qcom,vdd-io-voltage-level", &len);
		if (!prop || (len != (2 * sizeof(__be32)))) {
			dev_err(dev, "sdc io voltage levels not specified\n");
		} else {
			drvdata->reg_low_io = be32_to_cpup(&prop[0]);
			drvdata->reg_high_io = be32_to_cpup(&prop[1]);
		}

		prop = of_get_property(node, "qcom,vdd-io-current-level", &len);
		if (!prop || (len != (2 * sizeof(__be32)))) {
			dev_err(dev, "sdc io current levels not specified\n");
		} else {
			drvdata->reg_lpm_io = be32_to_cpup(&prop[0]);
			drvdata->reg_hpm_io = be32_to_cpup(&prop[1]);
		}
		of_node_put(reg_node);
	} else {
		dev_err(dev,
			"sdc io voltage supply not specified or available\n");
	}

	drvdata->out_mode = TPIU_OUT_MODE_MICTOR;
	drvdata->set = TPIU_SET_B;