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

Commit 8a191dc2 authored by Subbaraman Narayanamurthy's avatar Subbaraman Narayanamurthy
Browse files

power: qpnp-fg-gen3: add support to register with thermal core framework



Add support to register FG driver to register with thermal core
framework so that the battery temperature can be monitored by any
thermal governor and userspace is one of them.

Change-Id: Ia7e491b249e688c7b5d84b13caf1d390d24714b1
Signed-off-by: default avatarSubbaraman Narayanamurthy <subbaram@codeaurora.org>
parent fc5a098f
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ First Level Node - FG Gen3 device
	Definition: For details about IIO bindings see:
		    Documentation/devicetree/bindings/iio/iio-bindings.txt

- #thermal-sensor-cells: Should be 0. See thermal.txt for a description.

- qcom,rradc-base
	Usage:      required
	Value type: <u32>
@@ -489,6 +491,7 @@ pmi8998_fg: qpnp,fg {
	qcom,slope-limit-temp-threshold = <100>;
	qcom,slope-limit-coeffs = <10 11 12 13>;
	qcom,battery-thermal-coefficients = [9d 50 ff];
	#thermal-sensor-cells = <0>;
	status = "okay";

	qcom,fg-batt-soc@4000 {
@@ -517,3 +520,32 @@ pmi8998_fg: qpnp,fg {
		reg = <0x4400 0x100>;
	};
};

======================================
Example for thermal zone configuration
======================================

thermal_zones {
	pmi8998_fg {
		polling-delay-passive = <200>;
		polling-delay = <200>;
		thermal-governor = <userspace>;
		thermal-sensors = <&pmi8998_fg>;

		pmi8998_fg_trip1: pmi8998-fg-trip0 {
			temperature = <45000>;
			hysteresis = <0>;
			type = "passive";
		};
		pmi8998_fg_trip2: pmi8998-fg-trip2 {
			temperature = <50000>;
			hysteresis = <0>;
			type = "hot";
		};
		pmi8998_fg_trip3: pmi8998-fg-trip3 {
			temperature = <60000>;
			hysteresis = <0>;
			type = "alert";
		};
	};
};
+1 −0
Original line number Diff line number Diff line
@@ -412,6 +412,7 @@ static const struct fg_pt fg_tsmc_osc_table[] = {
};

struct fg_chip {
	struct thermal_zone_device	*tz_dev;
	struct device		*dev;
	struct pmic_revid_data	*pmic_rev_id;
	struct regmap		*regmap;
+35 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/of_platform.h>
#include <linux/of_batterydata.h>
#include <linux/platform_device.h>
#include <linux/thermal.h>
#include <linux/iio/consumer.h>
#include <linux/qpnp/qpnp-revid.h>
#include "fg-core.h"
@@ -5355,6 +5356,29 @@ static void fg_cleanup(struct fg_chip *chip)
	dev_set_drvdata(chip->dev, NULL);
}

static int fg_tz_get_temp(void *data, int *temperature)
{
	struct fg_chip *chip = (struct fg_chip *)data;
	int rc, batt_temp = 0;

	if (!temperature)
		return -EINVAL;

	rc = fg_get_battery_temp(chip, &batt_temp);
	if (rc < 0) {
		pr_err("Error in getting batt_temp\n");
		return rc;
	}

	/* Convert deciDegC to milliDegC */
	*temperature = batt_temp * 100;
	return 0;
}

static struct thermal_zone_of_device_ops fg_gen3_tz_ops = {
	.get_temp = fg_tz_get_temp,
};

static int fg_gen3_probe(struct platform_device *pdev)
{
	struct fg_chip *chip;
@@ -5537,6 +5561,15 @@ static int fg_gen3_probe(struct platform_device *pdev)
			pr_err("Error in configuring ESR filter rc:%d\n", rc);
	}

	chip->tz_dev = thermal_zone_of_sensor_register(chip->dev, 0, chip,
							&fg_gen3_tz_ops);
	if (IS_ERR_OR_NULL(chip->tz_dev)) {
		rc = PTR_ERR(chip->tz_dev);
		chip->tz_dev = NULL;
		dev_err(chip->dev, "thermal_zone_of_sensor_register() failed rc:%d\n",
			rc);
	}

	device_init_wakeup(chip->dev, true);
	schedule_delayed_work(&chip->profile_load_work, 0);

@@ -5601,6 +5634,8 @@ static int fg_gen3_remove(struct platform_device *pdev)
{
	struct fg_chip *chip = dev_get_drvdata(&pdev->dev);

	if (chip->tz_dev)
		thermal_zone_of_sensor_unregister(chip->dev, chip->tz_dev);
	fg_cleanup(chip);
	return 0;
}