Skip to content

Commit

Permalink
thermal: armada: Wait sensors validity before exiting the init callback
Browse files Browse the repository at this point in the history
The thermal core will check for sensors validity right after the
initialization callback has returned. As the initialization routine make
a reset, the sensors are not ready immediately and the core spawns an
error in the dmesg. Avoid this annoying situation by polling on the
validity bit before exiting from these routines. This also avoid the use
of blind sleeps.

Suggested-by: David Sniatkiwicz <davidsn@marvell.com>
Signed-off-by: Miquel Raynal <miquel.raynal@free-electrons.com>
Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
  • Loading branch information
Miquel Raynal authored and Eduardo Valentin committed Jan 1, 2018
1 parent 8c0b888 commit 6416368
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions drivers/thermal/armada_thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/platform_device.h>
#include <linux/of_device.h>
#include <linux/thermal.h>
#include <linux/iopoll.h>

/* Thermal Manager Control and Status Register */
#define PMU_TDC0_SW_RST_MASK (0x1 << 1)
Expand Down Expand Up @@ -59,6 +60,9 @@
#define CONTROL1_EXT_TSEN_SW_RESET BIT(7)
#define CONTROL1_EXT_TSEN_HW_RESETn BIT(8)

#define STATUS_POLL_PERIOD_US 1000
#define STATUS_POLL_TIMEOUT_US 100000

struct armada_thermal_data;

/* Marvell EBU Thermal Sensor Dev Structure */
Expand Down Expand Up @@ -155,6 +159,16 @@ static void armada375_init_sensor(struct platform_device *pdev,
msleep(50);
}

static void armada_wait_sensor_validity(struct armada_thermal_priv *priv)
{
u32 reg;

readl_relaxed_poll_timeout(priv->status, reg,
reg & priv->data->is_valid_bit,
STATUS_POLL_PERIOD_US,
STATUS_POLL_TIMEOUT_US);
}

static void armada380_init_sensor(struct platform_device *pdev,
struct armada_thermal_priv *priv)
{
Expand All @@ -164,16 +178,17 @@ static void armada380_init_sensor(struct platform_device *pdev,
reg |= CONTROL1_EXT_TSEN_HW_RESETn;
reg &= ~CONTROL1_EXT_TSEN_SW_RESET;
writel(reg, priv->control1);
msleep(10);

/* Set Tsen Tc Trim to correct default value (errata #132698) */
if (priv->control0) {
reg = readl_relaxed(priv->control0);
reg &= ~CONTROL0_TSEN_TC_TRIM_MASK;
reg |= CONTROL0_TSEN_TC_TRIM_VAL;
writel(reg, priv->control0);
msleep(10);
}

/* Wait the sensors to be valid or the core will warn the user */
armada_wait_sensor_validity(priv);
}

static void armada_ap806_init_sensor(struct platform_device *pdev,
Expand All @@ -185,7 +200,9 @@ static void armada_ap806_init_sensor(struct platform_device *pdev,
reg &= ~CONTROL0_TSEN_RESET;
reg |= CONTROL0_TSEN_START | CONTROL0_TSEN_ENABLE;
writel(reg, priv->control0);
msleep(10);

/* Wait the sensors to be valid or the core will warn the user */
armada_wait_sensor_validity(priv);
}

static bool armada_is_valid(struct armada_thermal_priv *priv)
Expand Down

0 comments on commit 6416368

Please sign in to comment.