Commit 4360af35 authored by Robert Marko's avatar Robert Marko Committed by Daniel Lezcano
Browse files

thermal/drivers/tsens: Add support for combined interrupt



Despite using tsens v2.3 IP, IPQ8074 and IPQ6018 only have one IRQ for
signaling both up/low and critical trips.

Signed-off-by: default avatarRobert Marko <robimarko@gmail.com>
Reviewed-by: default avatarBjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20220818220245.338396-2-robimarko@gmail.com


Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
parent c6db32ec
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ static const struct tsens_ops ops_8960 = {
static struct tsens_features tsens_8960_feat = {
	.ver_major	= VER_0,
	.crit_int	= 0,
	.combo_int	= 0,
	.adc		= 1,
	.srot_split	= 0,
	.max_sensors	= 11,
+1 −0
Original line number Diff line number Diff line
@@ -539,6 +539,7 @@ static int calibrate_9607(struct tsens_priv *priv)
static struct tsens_features tsens_v0_1_feat = {
	.ver_major	= VER_0_1,
	.crit_int	= 0,
	.combo_int	= 0,
	.adc		= 1,
	.srot_split	= 1,
	.max_sensors	= 11,
+1 −0
Original line number Diff line number Diff line
@@ -302,6 +302,7 @@ static int calibrate_8976(struct tsens_priv *priv)
static struct tsens_features tsens_v1_feat = {
	.ver_major	= VER_1_X,
	.crit_int	= 0,
	.combo_int	= 0,
	.adc		= 1,
	.srot_split	= 1,
	.max_sensors	= 11,
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
static struct tsens_features tsens_v2_feat = {
	.ver_major	= VER_2_X,
	.crit_int	= 1,
	.combo_int	= 0,
	.adc		= 0,
	.srot_split	= 1,
	.max_sensors	= 16,
+32 −6
Original line number Diff line number Diff line
@@ -532,6 +532,27 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
	return IRQ_HANDLED;
}

/**
 * tsens_combined_irq_thread() - Threaded interrupt handler for combined interrupts
 * @irq: irq number
 * @data: tsens controller private data
 *
 * Handle the combined interrupt as if it were 2 separate interrupts, so call the
 * critical handler first and then the up/low one.
 *
 * Return: IRQ_HANDLED
 */
static irqreturn_t tsens_combined_irq_thread(int irq, void *data)
{
	irqreturn_t ret;

	ret = tsens_critical_irq_thread(irq, data);
	if (ret != IRQ_HANDLED)
		return ret;

	return tsens_irq_thread(irq, data);
}

static int tsens_set_trips(struct thermal_zone_device *tz, int low, int high)
{
	struct tsens_sensor *s = tz->devdata;
@@ -1071,6 +1092,10 @@ static int tsens_register(struct tsens_priv *priv)
				   tsens_mC_to_hw(priv->sensor, 0));
	}

	if (priv->feat->combo_int) {
		ret = tsens_register_irq(priv, "combined",
					 tsens_combined_irq_thread);
	} else {
		ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
		if (ret < 0)
			return ret;
@@ -1078,6 +1103,7 @@ static int tsens_register(struct tsens_priv *priv)
		if (priv->feat->crit_int)
			ret = tsens_register_irq(priv, "critical",
						 tsens_critical_irq_thread);
	}

	return ret;
}
Loading