€•GŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ5/translations/zh_CN/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/zh_TW/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/it_IT/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ja_JP/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ko_KR/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/sp_SP/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒKernel driver exynos_tmu”h]”hŒKernel driver exynos_tmu”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒO/var/lib/git/docbuild/linux/Documentation/driver-api/thermal/exynos_thermal.rst”h KubhŒ paragraph”“”)”}”(hŒSupported chips:”h]”hŒSupported chips:”…””}”(hh¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubhŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hŒNARM Samsung Exynos4, Exynos5 series of SoC Datasheet: Not publicly available ”h]”(h¸)”}”(hŒ*ARM Samsung Exynos4, Exynos5 series of SoC”h]”hŒ*ARM Samsung Exynos4, Exynos5 series of SoC”…””}”(hhÒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KhhÎubh¸)”}”(hŒ!Datasheet: Not publicly available”h]”hŒ!Datasheet: Not publicly available”…””}”(hhàhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhÎubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÌhhÉhžhhŸh¶h Nubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hÇhŸh¶h Khh£hžhubh¸)”}”(hŒ[Authors: Donggeun Kim Authors: Amit Daniel ”h]”(hŒAuthors: Donggeun Kim <”…””}”(hhühžhhŸNh NubhŒ reference”“”)”}”(hŒdg77.kim@samsung.com”h]”hŒdg77.kim@samsung.com”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:dg77.kim@samsung.com”uh1jhhüubhŒ> Authors: Amit Daniel <”…””}”(hhühžhhŸNh Nubj)”}”(hŒamit.daniel@samsung.com”h]”hŒamit.daniel@samsung.com”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:amit.daniel@samsung.com”uh1jhhüubhŒ>”…””}”(hhühžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒTMU controller Description:”h]”hŒTMU controller Description:”…””}”(hj7hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj4hžhhŸh¶h Kubh¸)”}”(hŒNThis driver allows to read temperature inside Samsung Exynos4/5 series of SoC.”h]”hŒNThis driver allows to read temperature inside Samsung Exynos4/5 series of SoC.”…””}”(hjEhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj4hžhubh¸)”}”(hŒÒThe chip only exposes the measured 8-bit temperature code value through a register. Temperature can be taken from the temperature code. There are three equations converting from temperature to temperature code.”h]”hŒÒThe chip only exposes the measured 8-bit temperature code value through a register. Temperature can be taken from the temperature code. There are three equations converting from temperature to temperature code.”…””}”(hjShžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj4hžhubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hXThe three equations are: 1. Two point trimming:: Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1 2. One point trimming:: Tc = T + TI1 - 25 3. No trimming:: Tc = T + 50 Tc: Temperature code, T: Temperature, TI1: Trimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged ”h]”(hŒterm”“”)”}”(hŒThe three equations are:”h]”hŒThe three equations are:”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h K,hjhubhŒ definition”“”)”}”(hhh]”(hŒenumerated_list”“”)”}”(hhh]”(hÍ)”}”(hŒGTwo point trimming:: Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1 ”h]”(h¸)”}”(hŒTwo point trimming::”h]”hŒTwo point trimming:”…””}”(hjŠhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj†ubhŒ literal_block”“”)”}”(hŒ-Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1”h]”hŒ-Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1”…””}”hjšsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j˜hŸh¶h Khj†ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjƒubhÍ)”}”(hŒ+One point trimming:: Tc = T + TI1 - 25 ”h]”(h¸)”}”(hŒOne point trimming::”h]”hŒOne point trimming:”…””}”(hj´hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj°ubj™)”}”(hŒTc = T + TI1 - 25”h]”hŒTc = T + TI1 - 25”…””}”hjÂsbah}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j˜hŸh¶h Khj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjƒubhÍ)”}”(hŒNo trimming:: Tc = T + 50 ”h]”(h¸)”}”(hŒ No trimming::”h]”hŒ No trimming:”…””}”(hjÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K!hjÖubj™)”}”(hŒ Tc = T + 50”h]”hŒ Tc = T + 50”…””}”hjèsbah}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j˜hŸh¶h K#hjÖubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjƒubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jhj~ubjb)”}”(hhh]”(jg)”}”(hŒ%Tc: Temperature code, T: Temperature,”h]”(jm)”}”(hŒTc:”h]”hŒTc:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h K%hj ubj})”}”(hhh]”h¸)”}”(hŒ!Temperature code, T: Temperature,”h]”hŒ!Temperature code, T: Temperature,”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K&hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h K%hjubjg)”}”(hŒˆTI1: Trimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”h]”(jm)”}”(hŒTI1:”h]”hŒTI1:”…””}”(hj=hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h K(hj9ubj})”}”(hhh]”h¸)”}”(hŒƒTrimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”h]”hŒƒTrimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”…””}”(hjNhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K(hjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h K(hjubjg)”}”(hŒ‰TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged ”h]”(jm)”}”(hŒTI2:”h]”hŒTI2:”…””}”(hjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h K,hjhubj})”}”(hhh]”h¸)”}”(hŒƒTrimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged”h]”hŒƒTrimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged”…””}”(hj}hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K+hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h K,hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jahj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j|hjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h K,hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj4hžhhŸNh Nubh¸)”}”(hŒÎTMU(Thermal Management Unit) in Exynos4/5 generates interrupt when temperature exceeds pre-defined levels. The maximum number of configurable threshold is five. The threshold levels are defined as follows::”h]”hŒÍTMU(Thermal Management Unit) in Exynos4/5 generates interrupt when temperature exceeds pre-defined levels. The maximum number of configurable threshold is five. The threshold levels are defined as follows:”…””}”(hj¯hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K.hj4hžhubj™)”}”(hŒëLevel_0: current temperature > trigger_level_0 + threshold Level_1: current temperature > trigger_level_1 + threshold Level_2: current temperature > trigger_level_2 + threshold Level_3: current temperature > trigger_level_3 + threshold”h]”hŒëLevel_0: current temperature > trigger_level_0 + threshold Level_1: current temperature > trigger_level_1 + threshold Level_2: current temperature > trigger_level_2 + threshold Level_3: current temperature > trigger_level_3 + threshold”…””}”hj½sbah}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j˜hŸh¶h K3hj4hžhubh¸)”}”(hŒQThe threshold and each trigger_level are set through the corresponding registers.”h]”hŒQThe threshold and each trigger_level are set through the corresponding registers.”…””}”(hjËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K8hj4hžhubh¸)”}”(hŒØWhen an interrupt occurs, this driver notify kernel thermal framework with the function exynos_report_trigger. Although an interrupt condition for level_0 can be set, it can be used to synchronize the cooling action.”h]”hŒØWhen an interrupt occurs, this driver notify kernel thermal framework with the function exynos_report_trigger. Although an interrupt condition for level_0 can be set, it can be used to synchronize the cooling action.”…””}”(hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K;hj4hžhubeh}”(h]”Œtmu-controller-description”ah ]”h"]”Œtmu controller description:”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒTMU driver description:”h]”hŒTMU driver description:”…””}”(hjòhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjïhžhhŸh¶h KAubh¸)”}”(hŒ,The exynos thermal driver is structured as::”h]”hŒ+The exynos thermal driver is structured as:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KChjïhžhubj™)”}”(hX5 Kernel Core thermal framework (thermal_core.c, step_wise.c, cpufreq_cooling.c) ^ | | TMU configuration data -----> TMU Driver <----> Exynos Core thermal wrapper (exynos_tmu_data.c) (exynos_tmu.c) (exynos_thermal_common.c) (exynos_tmu_data.h) (exynos_tmu.h) (exynos_thermal_common.h)”h]”hX5 Kernel Core thermal framework (thermal_core.c, step_wise.c, cpufreq_cooling.c) ^ | | TMU configuration data -----> TMU Driver <----> Exynos Core thermal wrapper (exynos_tmu_data.c) (exynos_tmu.c) (exynos_thermal_common.c) (exynos_tmu_data.h) (exynos_tmu.h) (exynos_thermal_common.h)”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j¨j©uh1j˜hŸh¶h KEhjïhžhubj‚)”}”(hhh]”(hÍ)”}”(hXTMU configuration data: This consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”jb)”}”(hhh]”jg)”}”(hŒâTMU configuration data: This consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”(jm)”}”(hŒTMU configuration data:”h]”hŒTMU configuration data:”…””}”(hj*hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h KQhj&ubj})”}”(hhh]”h¸)”}”(hŒÊThis consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”hŒÊThis consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KOhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h KQhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjhžhhŸNh NubhÍ)”}”(hŒËTMU driver: This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”jb)”}”(hhh]”jg)”}”(hŒ¤TMU driver: This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”(jm)”}”(hŒ TMU driver:”h]”hŒ TMU driver:”…””}”(hjlhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h KUhjhubj})”}”(hhh]”h¸)”}”(hŒ˜This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”hŒ˜This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”…””}”(hj}hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KThjzubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h KUhjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jahjaubah}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjhžhhŸNh NubhÍ)”}”(hŒåExynos Core thermal wrapper: This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”jb)”}”(hhh]”jg)”}”(hŒ¾Exynos Core thermal wrapper: This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”(jm)”}”(hŒExynos Core thermal wrapper:”h]”hŒExynos Core thermal wrapper:”…””}”(hj®hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jlhŸh¶h KYhjªubj})”}”(hhh]”h¸)”}”(hŒ¡This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”hŒ¡This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”…””}”(hj¿hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KXhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j|hjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1jfhŸh¶h KYhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jahj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÌhjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”jŒ loweralpha”jhjŒ)”uh1jhjïhžhhŸh¶h KNubeh}”(h]”Œtmu-driver-description”ah ]”h"]”Œtmu driver description:”ah$]”h&]”uh1h¡hh£hžhhŸh¶h KAubeh}”(h]”Œkernel-driver-exynos-tmu”ah ]”h"]”Œkernel driver exynos_tmu”ah$]”h&]”uh1h¡hhhžhhŸh¶h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h¶uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¦NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h¶Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(júj÷jìjéjòjïuŒ nametypes”}”(jú‰jì‰jò‰uh}”(j÷h£jéj4jïjïuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.