Commit 49bbd8bb authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal

Pull thermal SoC fixes from Eduardo Valentin:

 - revert pinctrl settings on rockchip which causes boot failure on
   rk3288. The proper follow-up patch is being discussed, meanwhile
   the revert gets those booting again.

 - minor fixes on rcar and tegra

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal:
  thermal: rcar_gen3_thermal: Update temperature conversion method
  thermal: rcar_gen3_thermal: Update calculation formula of IRQTEMP
  thermal: rcar_gen3_thermal: Update value of Tj_1
  thermal: tegra: Make tegra210_tsensor_thermtrips static
  Revert "thermal: rockchip: fix up the tsadc pinctrl setting error"
parents e50e6798 6a310f8f
...@@ -62,6 +62,13 @@ ...@@ -62,6 +62,13 @@
#define TSC_MAX_NUM 3 #define TSC_MAX_NUM 3
/* default THCODE values if FUSEs are missing */
static const int thcode[TSC_MAX_NUM][3] = {
{ 3397, 2800, 2221 },
{ 3393, 2795, 2216 },
{ 3389, 2805, 2237 },
};
/* Structure for thermal temperature calculation */ /* Structure for thermal temperature calculation */
struct equation_coefs { struct equation_coefs {
int a1; int a1;
...@@ -76,6 +83,8 @@ struct rcar_gen3_thermal_tsc { ...@@ -76,6 +83,8 @@ struct rcar_gen3_thermal_tsc {
struct equation_coefs coef; struct equation_coefs coef;
int low; int low;
int high; int high;
int tj_t;
int id; /* thermal channel id */
}; };
struct rcar_gen3_thermal_priv { struct rcar_gen3_thermal_priv {
...@@ -122,30 +131,28 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc, ...@@ -122,30 +131,28 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc,
#define RCAR3_THERMAL_GRAN 500 /* mili Celsius */ #define RCAR3_THERMAL_GRAN 500 /* mili Celsius */
/* no idea where these constants come from */ /* no idea where these constants come from */
#define TJ_1 116
#define TJ_3 -41 #define TJ_3 -41
static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef, static void rcar_gen3_thermal_calc_coefs(struct rcar_gen3_thermal_tsc *tsc,
int *ptat, int *thcode) int *ptat, const int *thcode,
int ths_tj_1)
{ {
int tj_2;
/* TODO: Find documentation and document constant calculation formula */ /* TODO: Find documentation and document constant calculation formula */
/* /*
* Division is not scaled in BSP and if scaled it might overflow * Division is not scaled in BSP and if scaled it might overflow
* the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled * the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled
*/ */
tj_2 = (FIXPT_INT((ptat[1] - ptat[2]) * 157) tsc->tj_t = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
/ (ptat[0] - ptat[2])) - FIXPT_INT(41); / (ptat[0] - ptat[2])) + FIXPT_INT(TJ_3);
coef->a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]), tsc->coef.a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
tj_2 - FIXPT_INT(TJ_3)); tsc->tj_t - FIXPT_INT(TJ_3));
coef->b1 = FIXPT_INT(thcode[2]) - coef->a1 * TJ_3; tsc->coef.b1 = FIXPT_INT(thcode[2]) - tsc->coef.a1 * TJ_3;
coef->a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]), tsc->coef.a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
tj_2 - FIXPT_INT(TJ_1)); tsc->tj_t - FIXPT_INT(ths_tj_1));
coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * TJ_1; tsc->coef.b2 = FIXPT_INT(thcode[0]) - tsc->coef.a2 * ths_tj_1;
} }
static int rcar_gen3_thermal_round(int temp) static int rcar_gen3_thermal_round(int temp)
...@@ -161,15 +168,19 @@ static int rcar_gen3_thermal_round(int temp) ...@@ -161,15 +168,19 @@ static int rcar_gen3_thermal_round(int temp)
static int rcar_gen3_thermal_get_temp(void *devdata, int *temp) static int rcar_gen3_thermal_get_temp(void *devdata, int *temp)
{ {
struct rcar_gen3_thermal_tsc *tsc = devdata; struct rcar_gen3_thermal_tsc *tsc = devdata;
int mcelsius, val1, val2; int mcelsius, val;
u32 reg; u32 reg;
/* Read register and convert to mili Celsius */ /* Read register and convert to mili Celsius */
reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK; reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK;
val1 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1, tsc->coef.a1); if (reg <= thcode[tsc->id][1])
val2 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2, tsc->coef.a2); val = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1,
mcelsius = FIXPT_TO_MCELSIUS((val1 + val2) / 2); tsc->coef.a1);
else
val = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2,
tsc->coef.a2);
mcelsius = FIXPT_TO_MCELSIUS(val);
/* Make sure we are inside specifications */ /* Make sure we are inside specifications */
if ((mcelsius < MCELSIUS(-40)) || (mcelsius > MCELSIUS(125))) if ((mcelsius < MCELSIUS(-40)) || (mcelsius > MCELSIUS(125)))
...@@ -184,13 +195,15 @@ static int rcar_gen3_thermal_get_temp(void *devdata, int *temp) ...@@ -184,13 +195,15 @@ static int rcar_gen3_thermal_get_temp(void *devdata, int *temp)
static int rcar_gen3_thermal_mcelsius_to_temp(struct rcar_gen3_thermal_tsc *tsc, static int rcar_gen3_thermal_mcelsius_to_temp(struct rcar_gen3_thermal_tsc *tsc,
int mcelsius) int mcelsius)
{ {
int celsius, val1, val2; int celsius, val;
celsius = DIV_ROUND_CLOSEST(mcelsius, 1000); celsius = DIV_ROUND_CLOSEST(mcelsius, 1000);
val1 = celsius * tsc->coef.a1 + tsc->coef.b1; if (celsius <= INT_FIXPT(tsc->tj_t))
val2 = celsius * tsc->coef.a2 + tsc->coef.b2; val = celsius * tsc->coef.a1 + tsc->coef.b1;
else
val = celsius * tsc->coef.a2 + tsc->coef.b2;
return INT_FIXPT((val1 + val2) / 2); return INT_FIXPT(val);
} }
static int rcar_gen3_thermal_set_trips(void *devdata, int low, int high) static int rcar_gen3_thermal_set_trips(void *devdata, int low, int high)
...@@ -294,12 +307,29 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc) ...@@ -294,12 +307,29 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc)
usleep_range(1000, 2000); usleep_range(1000, 2000);
} }
static const int rcar_gen3_ths_tj_1 = 126;
static const int rcar_gen3_ths_tj_1_m3_w = 116;
static const struct of_device_id rcar_gen3_thermal_dt_ids[] = { static const struct of_device_id rcar_gen3_thermal_dt_ids[] = {
{ .compatible = "renesas,r8a774a1-thermal", }, {
{ .compatible = "renesas,r8a7795-thermal", }, .compatible = "renesas,r8a774a1-thermal",
{ .compatible = "renesas,r8a7796-thermal", }, .data = &rcar_gen3_ths_tj_1_m3_w,
{ .compatible = "renesas,r8a77965-thermal", }, },
{ .compatible = "renesas,r8a77980-thermal", }, {
.compatible = "renesas,r8a7795-thermal",
.data = &rcar_gen3_ths_tj_1,
},
{
.compatible = "renesas,r8a7796-thermal",
.data = &rcar_gen3_ths_tj_1_m3_w,
},
{
.compatible = "renesas,r8a77965-thermal",
.data = &rcar_gen3_ths_tj_1,
},
{
.compatible = "renesas,r8a77980-thermal",
.data = &rcar_gen3_ths_tj_1,
},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids); MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids);
...@@ -328,6 +358,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) ...@@ -328,6 +358,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
{ {
struct rcar_gen3_thermal_priv *priv; struct rcar_gen3_thermal_priv *priv;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
const int *rcar_gen3_ths_tj_1 = of_device_get_match_data(dev);
struct resource *res; struct resource *res;
struct thermal_zone_device *zone; struct thermal_zone_device *zone;
int ret, irq, i; int ret, irq, i;
...@@ -336,11 +367,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) ...@@ -336,11 +367,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
/* default values if FUSEs are missing */ /* default values if FUSEs are missing */
/* TODO: Read values from hardware on supported platforms */ /* TODO: Read values from hardware on supported platforms */
int ptat[3] = { 2631, 1509, 435 }; int ptat[3] = { 2631, 1509, 435 };
int thcode[TSC_MAX_NUM][3] = {
{ 3397, 2800, 2221 },
{ 3393, 2795, 2216 },
{ 3389, 2805, 2237 },
};
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
...@@ -395,11 +421,13 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev) ...@@ -395,11 +421,13 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
ret = PTR_ERR(tsc->base); ret = PTR_ERR(tsc->base);
goto error_unregister; goto error_unregister;
} }
tsc->id = i;
priv->tscs[i] = tsc; priv->tscs[i] = tsc;
priv->thermal_init(tsc); priv->thermal_init(tsc);
rcar_gen3_thermal_calc_coefs(&tsc->coef, ptat, thcode[i]); rcar_gen3_thermal_calc_coefs(tsc, ptat, thcode[i],
*rcar_gen3_ths_tj_1);
zone = devm_thermal_zone_of_sensor_register(dev, i, tsc, zone = devm_thermal_zone_of_sensor_register(dev, i, tsc,
&rcar_gen3_tz_of_ops); &rcar_gen3_tz_of_ops);
......
...@@ -172,9 +172,6 @@ struct rockchip_thermal_data { ...@@ -172,9 +172,6 @@ struct rockchip_thermal_data {
int tshut_temp; int tshut_temp;
enum tshut_mode tshut_mode; enum tshut_mode tshut_mode;
enum tshut_polarity tshut_polarity; enum tshut_polarity tshut_polarity;
struct pinctrl *pinctrl;
struct pinctrl_state *gpio_state;
struct pinctrl_state *otp_state;
}; };
/** /**
...@@ -1283,8 +1280,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1283,8 +1280,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
return error; return error;
} }
thermal->chip->control(thermal->regs, false);
error = clk_prepare_enable(thermal->clk); error = clk_prepare_enable(thermal->clk);
if (error) { if (error) {
dev_err(&pdev->dev, "failed to enable converter clock: %d\n", dev_err(&pdev->dev, "failed to enable converter clock: %d\n",
...@@ -1310,30 +1305,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1310,30 +1305,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
thermal->chip->initialize(thermal->grf, thermal->regs, thermal->chip->initialize(thermal->grf, thermal->regs,
thermal->tshut_polarity); thermal->tshut_polarity);
if (thermal->tshut_mode == TSHUT_MODE_GPIO) {
thermal->pinctrl = devm_pinctrl_get(&pdev->dev);
if (IS_ERR(thermal->pinctrl)) {
dev_err(&pdev->dev, "failed to find thermal pinctrl\n");
return PTR_ERR(thermal->pinctrl);
}
thermal->gpio_state = pinctrl_lookup_state(thermal->pinctrl,
"gpio");
if (IS_ERR_OR_NULL(thermal->gpio_state)) {
dev_err(&pdev->dev, "failed to find thermal gpio state\n");
return -EINVAL;
}
thermal->otp_state = pinctrl_lookup_state(thermal->pinctrl,
"otpout");
if (IS_ERR_OR_NULL(thermal->otp_state)) {
dev_err(&pdev->dev, "failed to find thermal otpout state\n");
return -EINVAL;
}
pinctrl_select_state(thermal->pinctrl, thermal->otp_state);
}
for (i = 0; i < thermal->chip->chn_num; i++) { for (i = 0; i < thermal->chip->chn_num; i++) {
error = rockchip_thermal_register_sensor(pdev, thermal, error = rockchip_thermal_register_sensor(pdev, thermal,
&thermal->sensors[i], &thermal->sensors[i],
...@@ -1404,8 +1375,8 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev) ...@@ -1404,8 +1375,8 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
clk_disable(thermal->pclk); clk_disable(thermal->pclk);
clk_disable(thermal->clk); clk_disable(thermal->clk);
if (thermal->tshut_mode == TSHUT_MODE_GPIO)
pinctrl_select_state(thermal->pinctrl, thermal->gpio_state); pinctrl_pm_select_sleep_state(dev);
return 0; return 0;
} }
...@@ -1450,8 +1421,7 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev) ...@@ -1450,8 +1421,7 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev)
for (i = 0; i < thermal->chip->chn_num; i++) for (i = 0; i < thermal->chip->chn_num; i++)
rockchip_thermal_toggle_sensor(&thermal->sensors[i], true); rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
if (thermal->tshut_mode == TSHUT_MODE_GPIO) pinctrl_pm_select_default_state(dev);
pinctrl_select_state(thermal->pinctrl, thermal->otp_state);
return 0; return 0;
} }
......
...@@ -208,7 +208,7 @@ static const struct tegra_soctherm_fuse tegra210_soctherm_fuse = { ...@@ -208,7 +208,7 @@ static const struct tegra_soctherm_fuse tegra210_soctherm_fuse = {
.fuse_spare_realignment = 0, .fuse_spare_realignment = 0,
}; };
struct tsensor_group_thermtrips tegra210_tsensor_thermtrips[] = { static struct tsensor_group_thermtrips tegra210_tsensor_thermtrips[] = {
{.id = TEGRA124_SOCTHERM_SENSOR_NUM}, {.id = TEGRA124_SOCTHERM_SENSOR_NUM},
{.id = TEGRA124_SOCTHERM_SENSOR_NUM}, {.id = TEGRA124_SOCTHERM_SENSOR_NUM},
{.id = TEGRA124_SOCTHERM_SENSOR_NUM}, {.id = TEGRA124_SOCTHERM_SENSOR_NUM},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment