On 7 August 2013 12:06, amit daniel kachhap <amit.daniel@xxxxxxxxxxx> wrote: > Hi Naveen, > > On Thu, Aug 1, 2013 at 4:06 PM, Naveen Krishna Chatradhi > <ch.naveen@xxxxxxxxxxx> wrote: >> This patch adds code to handle the misplaced TRIMINFO register >> incase of Exynos5420. >> >> On Exynos5420 we have a TRIMINFO register being misplaced for >> TMU channels 2, 3 and 4 >> >> TRIMINFO at 0x1006c000 contains data for TMU channel 3 >> TRIMINFO at 0x100a0000 contains data for TMU channel 4 >> TRIMINFO at 0x10068000 contains data for TMU channel 2 >> >> The misplaced register address is passed through devicetree and >> map it seperately during probe. >> Also, adds the documentation under devicetree/bindings/thermal/ >> >> Signed-off-by: Naveen Krishna Chatradhi <ch.naveen@xxxxxxxxxxx> >> Reviewed-by: Doug Anderson <dianders@xxxxxxxxxxxx> >> --- >> Changes since v1: >> Rebased on http://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git > Is it rebased against next branch? Sorry, i re based it on to master. >> >> .../devicetree/bindings/thermal/exynos-thermal.txt | 48 ++++++++++++++++++++ >> drivers/thermal/exynos_thermal.c | 26 ++++++++++- > In the new directory structure this file is renamed as > drivers/thermal/samsung/exynos_tmu.c. Yea, just checked it. Will re-base and submit. > > Thanks, > Amit Daniel >> 2 files changed, 72 insertions(+), 2 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/thermal/exynos-thermal.txt >> >> diff --git a/Documentation/devicetree/bindings/thermal/exynos-thermal.txt b/Documentation/devicetree/bindings/thermal/exynos-thermal.txt >> new file mode 100644 >> index 0000000..1db279e >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/thermal/exynos-thermal.txt >> @@ -0,0 +1,48 @@ >> +* Exynos Thermal >> + >> +Required properties: >> +- compatible: should be one of the following. >> + * "samsung,exynos4210-tmu" - for controllers compatible with exynos4210 tmu. >> + * "samsung,exynos5250-tmu" - for controllers compatible with exynos5250 tmu. >> + * "samsung,exynos5420-tmu" - for controllers compatible with exynos5420 tmu. >> + >> +- reg: physical base address of the controller and length of >> + memory mapped region. >> + >> + ** NOTE FOR EXYNOS5420 ** >> + TRIMINFO register is being misplaced for TMU channels 2, 3 and 4 >> + >> + TERMINFO for TMU channel 2 is present in address space of TMU channel 3 >> + TERMINFO for TMU channel 3 is present in address space of TMU channel 4 >> + TERMINFO for TMU channel 4 is present in address space of TMU channel 2 >> + >> + * In such cases the reg property contains the misplaced register address and >> + range as the second parameter. >> + >> +- interrupts : interrupt number to the cpu. >> +- clocks : Clock number as per common clock framework for the cpu. >> +- clock-names : clock name to be used in the driver >> + >> +Example: >> + >> + /* tmu for CPU0 */ >> + tmu@10060000 { >> + compatible = "samsung,exynos5420-tmu"; >> + reg = <0x10060000 0x100>; >> + interrupts = <0 65 0>; >> + clocks = <&clock 318>; >> + clock-names = "tmu_apbif"; >> + }; >> + >> +Example: In case of Exynos5420 TMU channel 3 >> + >> + /* tmu for CPU3 */ >> + tmu@1006c000 { >> + compatible = "samsung,exynos5420-tmu"; >> + /* 2nd reg is for the misplaced TRIMINFO register */ >> + reg = <0x1006c000 0x100>, <0x100a0000 0x4>; >> + interrupts = <0 185 0>; >> + clocks = <&clock 318>; >> + clock-names = "tmu_apbif"; >> + }; >> + >> diff --git a/drivers/thermal/exynos_thermal.c b/drivers/thermal/exynos_thermal.c >> index d20ce9e..1ad9005 100644 >> --- a/drivers/thermal/exynos_thermal.c >> +++ b/drivers/thermal/exynos_thermal.c >> @@ -38,6 +38,7 @@ >> #include <linux/cpufreq.h> >> #include <linux/cpu_cooling.h> >> #include <linux/of.h> >> +#include <linux/of_address.h> >> >> /* Exynos generic registers */ >> #define EXYNOS_TMU_REG_TRIMINFO 0x0 >> @@ -120,7 +121,7 @@ >> struct exynos_tmu_data { >> struct exynos_tmu_platform_data *pdata; >> struct resource *mem; >> - void __iomem *base; >> + void __iomem *base, *triminfo_base; >> int irq; >> enum soc_type soc; >> struct work_struct irq_work; >> @@ -593,8 +594,14 @@ static int exynos_tmu_initialize(struct platform_device *pdev) >> __raw_writel(EXYNOS_TRIMINFO_RELOAD, >> data->base + EXYNOS_TMU_TRIMINFO_CON); >> } >> + >> /* Save trimming info in order to perform calibration */ >> - trim_info = readl(data->base + EXYNOS_TMU_REG_TRIMINFO); >> + if (data->triminfo_base) >> + /* On exynos5420 TRIMINFO is misplaced for some channels */ >> + trim_info = readl(data->triminfo_base); >> + else >> + trim_info = readl(data->base + EXYNOS_TMU_REG_TRIMINFO); >> + >> data->temp_error1 = trim_info & EXYNOS_TMU_TRIM_TEMP_MASK; >> data->temp_error2 = ((trim_info >> 8) & EXYNOS_TMU_TRIM_TEMP_MASK); >> >> @@ -941,6 +948,15 @@ static int exynos_tmu_probe(struct platform_device *pdev) >> return ret; >> } >> >> + /* For Exynos5420 The misplaced TERMINFO register address will be >> + * passed from device tree node. >> + * >> + * We cannot use devm_request_and_ioremap, as the base address >> + * over laps with the address space of the other TMU channel. >> + * Check Documentation for details >> + */ >> + data->triminfo_base = of_iomap(pdev->dev.of_node, 1); >> + >> data->clk = devm_clk_get(&pdev->dev, "tmu_apbif"); >> if (IS_ERR(data->clk)) { >> dev_err(&pdev->dev, "Failed to get clock\n"); >> @@ -1001,6 +1017,9 @@ static int exynos_tmu_probe(struct platform_device *pdev) >> >> return 0; >> err_clk: >> + if (data->triminfo_base) >> + iounmap(data->triminfo_base); >> + >> platform_set_drvdata(pdev, NULL); >> clk_unprepare(data->clk); >> return ret; >> @@ -1014,6 +1033,9 @@ static int exynos_tmu_remove(struct platform_device *pdev) >> >> exynos_unregister_thermal(); >> >> + if (data->triminfo_base) >> + iounmap(data->triminfo_base); >> + >> clk_unprepare(data->clk); >> >> platform_set_drvdata(pdev, NULL); >> -- >> 1.7.9.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-pm" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- Shine bright, (: Nav :) -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html