forked from Minki/linux
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"
This commit is contained in:
commit
49bbd8bb34
@ -62,6 +62,13 @@
|
||||
|
||||
#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 */
|
||||
struct equation_coefs {
|
||||
int a1;
|
||||
@ -76,6 +83,8 @@ struct rcar_gen3_thermal_tsc {
|
||||
struct equation_coefs coef;
|
||||
int low;
|
||||
int high;
|
||||
int tj_t;
|
||||
int id; /* thermal channel id */
|
||||
};
|
||||
|
||||
struct rcar_gen3_thermal_priv {
|
||||
@ -122,30 +131,28 @@ static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc,
|
||||
#define RCAR3_THERMAL_GRAN 500 /* mili Celsius */
|
||||
|
||||
/* no idea where these constants come from */
|
||||
#define TJ_1 116
|
||||
#define TJ_3 -41
|
||||
|
||||
static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef,
|
||||
int *ptat, int *thcode)
|
||||
static void rcar_gen3_thermal_calc_coefs(struct rcar_gen3_thermal_tsc *tsc,
|
||||
int *ptat, const int *thcode,
|
||||
int ths_tj_1)
|
||||
{
|
||||
int tj_2;
|
||||
|
||||
/* TODO: Find documentation and document constant calculation formula */
|
||||
|
||||
/*
|
||||
* Division is not scaled in BSP and if scaled it might overflow
|
||||
* the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled
|
||||
*/
|
||||
tj_2 = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
|
||||
/ (ptat[0] - ptat[2])) - FIXPT_INT(41);
|
||||
tsc->tj_t = (FIXPT_INT((ptat[1] - ptat[2]) * 157)
|
||||
/ (ptat[0] - ptat[2])) + FIXPT_INT(TJ_3);
|
||||
|
||||
coef->a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
|
||||
tj_2 - FIXPT_INT(TJ_3));
|
||||
coef->b1 = FIXPT_INT(thcode[2]) - coef->a1 * TJ_3;
|
||||
tsc->coef.a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]),
|
||||
tsc->tj_t - FIXPT_INT(TJ_3));
|
||||
tsc->coef.b1 = FIXPT_INT(thcode[2]) - tsc->coef.a1 * TJ_3;
|
||||
|
||||
coef->a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
|
||||
tj_2 - FIXPT_INT(TJ_1));
|
||||
coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * TJ_1;
|
||||
tsc->coef.a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]),
|
||||
tsc->tj_t - FIXPT_INT(ths_tj_1));
|
||||
tsc->coef.b2 = FIXPT_INT(thcode[0]) - tsc->coef.a2 * ths_tj_1;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
struct rcar_gen3_thermal_tsc *tsc = devdata;
|
||||
int mcelsius, val1, val2;
|
||||
int mcelsius, val;
|
||||
u32 reg;
|
||||
|
||||
/* Read register and convert to mili Celsius */
|
||||
reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK;
|
||||
|
||||
val1 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1, tsc->coef.a1);
|
||||
val2 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2, tsc->coef.a2);
|
||||
mcelsius = FIXPT_TO_MCELSIUS((val1 + val2) / 2);
|
||||
if (reg <= thcode[tsc->id][1])
|
||||
val = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1,
|
||||
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 */
|
||||
if ((mcelsius < MCELSIUS(-40)) || (mcelsius > MCELSIUS(125)))
|
||||
@ -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,
|
||||
int mcelsius)
|
||||
{
|
||||
int celsius, val1, val2;
|
||||
int celsius, val;
|
||||
|
||||
celsius = DIV_ROUND_CLOSEST(mcelsius, 1000);
|
||||
val1 = celsius * tsc->coef.a1 + tsc->coef.b1;
|
||||
val2 = celsius * tsc->coef.a2 + tsc->coef.b2;
|
||||
if (celsius <= INT_FIXPT(tsc->tj_t))
|
||||
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)
|
||||
@ -294,12 +307,29 @@ static void rcar_gen3_thermal_init(struct rcar_gen3_thermal_tsc *tsc)
|
||||
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[] = {
|
||||
{ .compatible = "renesas,r8a774a1-thermal", },
|
||||
{ .compatible = "renesas,r8a7795-thermal", },
|
||||
{ .compatible = "renesas,r8a7796-thermal", },
|
||||
{ .compatible = "renesas,r8a77965-thermal", },
|
||||
{ .compatible = "renesas,r8a77980-thermal", },
|
||||
{
|
||||
.compatible = "renesas,r8a774a1-thermal",
|
||||
.data = &rcar_gen3_ths_tj_1_m3_w,
|
||||
},
|
||||
{
|
||||
.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);
|
||||
@ -328,6 +358,7 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rcar_gen3_thermal_priv *priv;
|
||||
struct device *dev = &pdev->dev;
|
||||
const int *rcar_gen3_ths_tj_1 = of_device_get_match_data(dev);
|
||||
struct resource *res;
|
||||
struct thermal_zone_device *zone;
|
||||
int ret, irq, i;
|
||||
@ -336,11 +367,6 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
|
||||
/* default values if FUSEs are missing */
|
||||
/* TODO: Read values from hardware on supported platforms */
|
||||
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);
|
||||
if (!priv)
|
||||
@ -395,11 +421,13 @@ static int rcar_gen3_thermal_probe(struct platform_device *pdev)
|
||||
ret = PTR_ERR(tsc->base);
|
||||
goto error_unregister;
|
||||
}
|
||||
tsc->id = i;
|
||||
|
||||
priv->tscs[i] = 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,
|
||||
&rcar_gen3_tz_of_ops);
|
||||
|
@ -172,9 +172,6 @@ struct rockchip_thermal_data {
|
||||
int tshut_temp;
|
||||
enum tshut_mode tshut_mode;
|
||||
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)
|
||||
return error;
|
||||
}
|
||||
|
||||
thermal->chip->control(thermal->regs, false);
|
||||
|
||||
error = clk_prepare_enable(thermal->clk);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to enable converter clock: %d\n",
|
||||
@ -1310,30 +1305,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
|
||||
thermal->chip->initialize(thermal->grf, thermal->regs,
|
||||
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++) {
|
||||
error = rockchip_thermal_register_sensor(pdev, thermal,
|
||||
&thermal->sensors[i],
|
||||
@ -1404,8 +1375,8 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
|
||||
|
||||
clk_disable(thermal->pclk);
|
||||
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;
|
||||
}
|
||||
@ -1450,8 +1421,7 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev)
|
||||
for (i = 0; i < thermal->chip->chn_num; i++)
|
||||
rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
|
||||
|
||||
if (thermal->tshut_mode == TSHUT_MODE_GPIO)
|
||||
pinctrl_select_state(thermal->pinctrl, thermal->otp_state);
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ static const struct tegra_soctherm_fuse tegra210_soctherm_fuse = {
|
||||
.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},
|
||||
|
Loading…
Reference in New Issue
Block a user