Skip to content

Commit

Permalink
drivers: thermal: tsens: Add support for combined interrupt
Browse files Browse the repository at this point in the history
Despite using tsens v2.3 IP, IPQ8074 and IPQ6018 only have one IRQ for
signaling both up/low and critical trips.

Signed-off-by: Robert Marko <robimarko@gmail.com>
  • Loading branch information
robimarko committed Apr 28, 2022
1 parent 0c81e57 commit b03a435
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 4 deletions.
1 change: 1 addition & 0 deletions drivers/thermal/qcom/tsens-8960.c
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions drivers/thermal/qcom/tsens-v0_1.c
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions drivers/thermal/qcom/tsens-v1.c
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions drivers/thermal/qcom/tsens-v2.c
Expand Up @@ -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,
Expand Down
34 changes: 30 additions & 4 deletions drivers/thermal/qcom/tsens.c
Expand Up @@ -532,6 +532,26 @@ 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);
ret = tsens_irq_thread(irq, data);

return ret;
}

static int tsens_set_trips(void *_sensor, int low, int high)
{
struct tsens_sensor *s = _sensor;
Expand Down Expand Up @@ -1080,14 +1100,20 @@ static int tsens_register(struct tsens_priv *priv)
tsens_mC_to_hw(priv->sensor, 0));
}

ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
if (ret < 0)
return ret;
if (!priv->feat->combo_int) {

This comment has been minimized.

Copy link
@Ansuel

Ansuel Apr 28, 2022

Mhhh can't we improve this? They will 99% complain about these 3 if

Something like

if (!priv->feat->combo_int)
else

or even the opposite to make it clear the difference between split and combined irq

This comment has been minimized.

Copy link
@robimarko

robimarko Apr 29, 2022

Author Owner

Well, I don't know if that cleans things up as only uplow IRQ was always requested, critical was optional.
So we gonna end with the same number of if-s, though it might make it clear that if combined IRQ is used those 2 are intentionally not used.

ret = tsens_register_irq(priv, "uplow", tsens_irq_thread);
if (ret < 0)
return ret;
}

if (priv->feat->crit_int)
if (priv->feat->crit_int && !priv->feat->combo_int)
ret = tsens_register_irq(priv, "critical",
tsens_critical_irq_thread);

if (priv->feat->combo_int)
ret = tsens_register_irq(priv, "combined",
tsens_combined_irq_thread);

return ret;
}

Expand Down
2 changes: 2 additions & 0 deletions drivers/thermal/qcom/tsens.h
Expand Up @@ -495,6 +495,7 @@ enum regfield_ids {
* struct tsens_features - Features supported by the IP
* @ver_major: Major number of IP version
* @crit_int: does the IP support critical interrupts?
* @combo_int: does the IP use one IRQ for up, low and critical thresholds?
* @adc: do the sensors only output adc code (instead of temperature)?
* @srot_split: does the IP neatly splits the register space into SROT and TM,
* with SROT only being available to secure boot firmware?
Expand All @@ -504,6 +505,7 @@ enum regfield_ids {
struct tsens_features {
unsigned int ver_major;
unsigned int crit_int:1;
unsigned int combo_int:1;
unsigned int adc:1;
unsigned int srot_split:1;
unsigned int has_watchdog:1;
Expand Down

0 comments on commit b03a435

Please sign in to comment.