Commit 1ed895c2 authored by Wei Ni's avatar Wei Ni Committed by Eduardo Valentin

thermal: tegra: handle HW initialization in one funcotion

Handle HW initialization in one function soctherm_init(),
so that the codes are more clear.
Signed-off-by: default avatarWei Ni <wni@nvidia.com>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 8de2ab02
...@@ -95,19 +95,11 @@ struct tegra_soctherm { ...@@ -95,19 +95,11 @@ struct tegra_soctherm {
struct dentry *debugfs_dir; struct dentry *debugfs_dir;
}; };
static int enable_tsensor(struct tegra_soctherm *tegra, static void enable_tsensor(struct tegra_soctherm *tegra, unsigned int i)
unsigned int i,
const struct tsensor_shared_calib *shared)
{ {
const struct tegra_tsensor *sensor = &tegra->soc->tsensors[i]; const struct tegra_tsensor *sensor = &tegra->soc->tsensors[i];
void __iomem *base = tegra->regs + sensor->base; void __iomem *base = tegra->regs + sensor->base;
u32 *calib = &tegra->calib[i];
unsigned int val; unsigned int val;
int err;
err = tegra_calc_tsensor_calib(sensor, shared, calib);
if (err)
return err;
val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT; val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT;
writel(val, base + SENSOR_CONFIG0); writel(val, base + SENSOR_CONFIG0);
...@@ -118,9 +110,7 @@ static int enable_tsensor(struct tegra_soctherm *tegra, ...@@ -118,9 +110,7 @@ static int enable_tsensor(struct tegra_soctherm *tegra,
val |= SENSOR_CONFIG1_TEMP_ENABLE; val |= SENSOR_CONFIG1_TEMP_ENABLE;
writel(val, base + SENSOR_CONFIG1); writel(val, base + SENSOR_CONFIG1);
writel(*calib, base + SENSOR_CONFIG2); writel(tegra->calib[i], base + SENSOR_CONFIG2);
return 0;
} }
/* /*
...@@ -461,6 +451,34 @@ static int soctherm_clk_enable(struct platform_device *pdev, bool enable) ...@@ -461,6 +451,34 @@ static int soctherm_clk_enable(struct platform_device *pdev, bool enable)
return 0; return 0;
} }
static void soctherm_init(struct platform_device *pdev)
{
struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
const struct tegra_tsensor_group **ttgs = tegra->soc->ttgs;
int i;
u32 pdiv, hotspot;
/* Initialize raw sensors */
for (i = 0; i < tegra->soc->num_tsensors; ++i)
enable_tsensor(tegra, i);
/* program pdiv and hotspot offsets per THERM */
pdiv = readl(tegra->regs + SENSOR_PDIV);
hotspot = readl(tegra->regs + SENSOR_HOTSPOT_OFF);
for (i = 0; i < tegra->soc->num_ttgs; ++i) {
pdiv = REG_SET_MASK(pdiv, ttgs[i]->pdiv_mask,
ttgs[i]->pdiv);
/* hotspot offset from PLLX, doesn't need to configure PLLX */
if (ttgs[i]->id == TEGRA124_SOCTHERM_SENSOR_PLLX)
continue;
hotspot = REG_SET_MASK(hotspot,
ttgs[i]->pllx_hotspot_mask,
ttgs[i]->pllx_hotspot_diff);
}
writel(pdiv, tegra->regs + SENSOR_PDIV);
writel(hotspot, tegra->regs + SENSOR_HOTSPOT_OFF);
}
static const struct of_device_id tegra_soctherm_of_match[] = { static const struct of_device_id tegra_soctherm_of_match[] = {
#ifdef CONFIG_ARCH_TEGRA_124_SOC #ifdef CONFIG_ARCH_TEGRA_124_SOC
{ {
...@@ -488,7 +506,6 @@ static int tegra_soctherm_probe(struct platform_device *pdev) ...@@ -488,7 +506,6 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
struct tegra_soctherm_soc *soc; struct tegra_soctherm_soc *soc;
unsigned int i; unsigned int i;
int err; int err;
u32 pdiv, hotspot;
match = of_match_node(tegra_soctherm_of_match, pdev->dev.of_node); match = of_match_node(tegra_soctherm_of_match, pdev->dev.of_node);
if (!match) if (!match)
...@@ -529,45 +546,31 @@ static int tegra_soctherm_probe(struct platform_device *pdev) ...@@ -529,45 +546,31 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
return PTR_ERR(tegra->clock_soctherm); return PTR_ERR(tegra->clock_soctherm);
} }
err = soctherm_clk_enable(pdev, true);
if (err)
return err;
/* Initialize raw sensors */
tegra->calib = devm_kzalloc(&pdev->dev, tegra->calib = devm_kzalloc(&pdev->dev,
sizeof(u32) * soc->num_tsensors, sizeof(u32) * soc->num_tsensors,
GFP_KERNEL); GFP_KERNEL);
if (!tegra->calib) { if (!tegra->calib)
err = -ENOMEM; return -ENOMEM;
goto disable_clocks;
}
/* calculate shared calibration data */
err = tegra_calc_shared_calib(soc->tfuse, &shared_calib); err = tegra_calc_shared_calib(soc->tfuse, &shared_calib);
if (err) if (err)
goto disable_clocks; return err;
/* calculate tsensor calibaration data */
for (i = 0; i < soc->num_tsensors; ++i) { for (i = 0; i < soc->num_tsensors; ++i) {
err = enable_tsensor(tegra, i, &shared_calib); err = tegra_calc_tsensor_calib(&soc->tsensors[i],
&shared_calib,
&tegra->calib[i]);
if (err) if (err)
goto disable_clocks; return err;
} }
/* Program pdiv and hotspot offsets per THERM */ err = soctherm_clk_enable(pdev, true);
pdiv = readl(tegra->regs + SENSOR_PDIV); if (err)
hotspot = readl(tegra->regs + SENSOR_HOTSPOT_OFF); return err;
for (i = 0; i < soc->num_ttgs; ++i) {
pdiv = REG_SET_MASK(pdiv, soc->ttgs[i]->pdiv_mask, soctherm_init(pdev);
soc->ttgs[i]->pdiv);
/* hotspot offset from PLLX, doesn't need to configure PLLX */
if (soc->ttgs[i]->id == TEGRA124_SOCTHERM_SENSOR_PLLX)
continue;
hotspot = REG_SET_MASK(hotspot,
soc->ttgs[i]->pllx_hotspot_mask,
soc->ttgs[i]->pllx_hotspot_diff);
}
writel(pdiv, tegra->regs + SENSOR_PDIV);
writel(hotspot, tegra->regs + SENSOR_HOTSPOT_OFF);
for (i = 0; i < soc->num_ttgs; ++i) { for (i = 0; i < soc->num_ttgs; ++i) {
struct tegra_thermctl_zone *zone = struct tegra_thermctl_zone *zone =
......
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