rtuTemperatureHumidityDataOperation.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*
  2. * OMAP4 Clock data
  3. *
  4. * Copyright (C) 2009-2012 Texas Instruments, Inc.
  5. * Copyright (C) 2009-2010 Nokia Corporation
  6. *
  7. * Paul Walmsley (paul@pwsan.com)
  8. * Rajendra Nayak (rnayak@ti.com)
  9. * Benoit Cousson (b-cousson@ti.com)
  10. * Mike Turquette (mturquette@ti.com)
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License version 2 as
  14. * published by the Free Software Foundation.
  15. *
  16. * XXX Some of the ES1 clocks have been removed/changed; once support
  17. * is added for discriminating clocks by ES level, these should be added back
  18. * in.
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/list.h>
  22. #include <linux/clk-private.h>
  23. #include <linux/clkdev.h>
  24. #include <linux/io.h>
  25. #include "soc.h"
  26. #include "iomap.h"
  27. #include "clock.h"
  28. #include "clock44xx.h"
  29. #include "cm1_44xx.h"
  30. #include "cm2_44xx.h"
  31. #include "cm-regbits-44xx.h"
  32. #include "prm44xx.h"
  33. #include "prm-regbits-44xx.h"
  34. #include "control.h"
  35. #include "scrm44xx.h"
  36. /* OMAP4 modulemode control */
  37. #define OMAP4430_MODULEMODE_HWCTRL_SHIFT 0
  38. #define OMAP4430_MODULEMODE_SWCTRL_SHIFT 1
  39. /*
  40. * OMAP4 ABE DPLL default frequency. In OMAP4460 TRM version V, section
  41. * "3.6.3.2.3 CM1_ABE Clock Generator" states that the "DPLL_ABE_X2_CLK
  42. * must be set to 196.608 MHz" and hence, the DPLL locked frequency is
  43. * half of this value.
  44. */
  45. #define OMAP4_DPLL_ABE_DEFFREQ 98304000
  46. /* Root clocks */
  47. DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
  48. DEFINE_CLK_FIXED_RATE(pad_clks_src_ck, CLK_IS_ROOT, 12000000, 0x0);
  49. DEFINE_CLK_GATE(pad_clks_ck, "pad_clks_src_ck", &pad_clks_src_ck, 0x0,
  50. OMAP4430_CM_CLKSEL_ABE, OMAP4430_PAD_CLKS_GATE_SHIFT,
  51. 0x0, NULL);
  52. DEFINE_CLK_FIXED_RATE(pad_slimbus_core_clks_ck, CLK_IS_ROOT, 12000000, 0x0);
  53. DEFINE_CLK_FIXED_RATE(secure_32k_clk_src_ck, CLK_IS_ROOT, 32768, 0x0);
  54. DEFINE_CLK_FIXED_RATE(slimbus_src_clk, CLK_IS_ROOT, 12000000, 0x0);
  55. DEFINE_CLK_GATE(slimbus_clk, "slimbus_src_clk", &slimbus_src_clk, 0x0,
  56. OMAP4430_CM_CLKSEL_ABE, OMAP4430_SLIMBUS_CLK_GATE_SHIFT,
  57. 0x0, NULL);
  58. DEFINE_CLK_FIXED_RATE(sys_32k_ck, CLK_IS_ROOT, 32768, 0x0);
  59. DEFINE_CLK_FIXED_RATE(virt_12000000_ck, CLK_IS_ROOT, 12000000, 0x0);
  60. DEFINE_CLK_FIXED_RATE(virt_13000000_ck, CLK_IS_ROOT, 13000000, 0x0);
  61. DEFINE_CLK_FIXED_RATE(virt_16800000_ck, CLK_IS_ROOT, 16800000, 0x0);
  62. DEFINE_CLK_FIXED_RATE(virt_19200000_ck, CLK_IS_ROOT, 19200000, 0x0);
  63. DEFINE_CLK_FIXED_RATE(virt_26000000_ck, CLK_IS_ROOT, 26000000, 0x0);
  64. DEFINE_CLK_FIXED_RATE(virt_27000000_ck, CLK_IS_ROOT, 27000000, 0x0);
  65. DEFINE_CLK_FIXED_RATE(virt_38400000_ck, CLK_IS_ROOT, 38400000, 0x0);
  66. static const char *sys_clkin_ck_parents[] = {
  67. "virt_12000000_ck", "virt_13000000_ck", "virt_16800000_ck",
  68. "virt_19200000_ck", "virt_26000000_ck", "virt_27000000_ck",
  69. "virt_38400000_ck",
  70. };
  71. DEFINE_CLK_MUX(sys_clkin_ck, sys_clkin_ck_parents, NULL, 0x0,
  72. OMAP4430_CM_SYS_CLKSEL, OMAP4430_SYS_CLKSEL_SHIFT,
  73. OMAP4430_SYS_CLKSEL_WIDTH, CLK_MUX_INDEX_ONE, NULL);
  74. DEFINE_CLK_FIXED_RATE(tie_low_clock_ck, CLK_IS_ROOT, 0, 0x0);
  75. DEFINE_CLK_FIXED_RATE(utmi_phy_clkout_ck, CLK_IS_ROOT, 60000000, 0x0);
  76. DEFINE_CLK_FIXED_RATE(xclk60mhsp1_ck, CLK_IS_ROOT, 60000000, 0x0);
  77. DEFINE_CLK_FIXED_RATE(xclk60mhsp2_ck, CLK_IS_ROOT, 60000000, 0x0);
  78. DEFINE_CLK_FIXED_RATE(xclk60motg_ck, CLK_IS_ROOT, 60000000, 0x0);
  79. /* Module clocks and DPLL outputs */
  80. static const char *abe_dpll_bypass_clk_mux_ck_parents[] = {
  81. "sys_clkin_ck", "sys_32k_ck",
  82. };
  83. DEFINE_CLK_MUX(abe_dpll_bypass_clk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents,
  84. NULL, 0x0, OMAP4430_CM_L4_WKUP_CLKSEL, OMAP4430_CLKSEL_SHIFT,
  85. OMAP4430_CLKSEL_WIDTH, 0x0, NULL);
  86. DEFINE_CLK_MUX(abe_dpll_refclk_mux_ck, abe_dpll_bypass_clk_mux_ck_parents, NULL,
  87. 0x0, OMAP4430_CM_ABE_PLL_REF_CLKSEL, OMAP4430_CLKSEL_0_0_SHIFT,
  88. OMAP4430_CLKSEL_0_0_WIDTH, 0x0, NULL);
  89. /* DPLL_ABE */
  90. static struct dpll_data dpll_abe_dd = {
  91. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_ABE,
  92. .clk_bypass = &abe_dpll_bypass_clk_mux_ck,
  93. .clk_ref = &abe_dpll_refclk_mux_ck,
  94. .control_reg = OMAP4430_CM_CLKMODE_DPLL_ABE,
  95. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  96. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_ABE,
  97. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_ABE,
  98. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  99. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  100. .enable_mask = OMAP4430_DPLL_EN_MASK,
  101. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  102. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  103. .m4xen_mask = OMAP4430_DPLL_REGM4XEN_MASK,
  104. .lpmode_mask = OMAP4430_DPLL_LPMODE_EN_MASK,
  105. .max_multiplier = 2047,
  106. .max_divider = 128,
  107. .min_divider = 1,
  108. };
  109. static const char *dpll_abe_ck_parents[] = {
  110. "abe_dpll_refclk_mux_ck",
  111. };
  112. static struct clk dpll_abe_ck;
  113. static const struct clk_ops dpll_abe_ck_ops = {
  114. .enable = &omap3_noncore_dpll_enable,
  115. .disable = &omap3_noncore_dpll_disable,
  116. .recalc_rate = &omap4_dpll_regm4xen_recalc,
  117. .round_rate = &omap4_dpll_regm4xen_round_rate,
  118. .set_rate = &omap3_noncore_dpll_set_rate,
  119. .get_parent = &omap2_init_dpll_parent,
  120. };
  121. static struct clk_hw_omap dpll_abe_ck_hw = {
  122. .hw = {
  123. .clk = &dpll_abe_ck,
  124. },
  125. .dpll_data = &dpll_abe_dd,
  126. .ops = &clkhwops_omap3_dpll,
  127. };
  128. DEFINE_STRUCT_CLK(dpll_abe_ck, dpll_abe_ck_parents, dpll_abe_ck_ops);
  129. static const char *dpll_abe_x2_ck_parents[] = {
  130. "dpll_abe_ck",
  131. };
  132. static struct clk dpll_abe_x2_ck;
  133. static const struct clk_ops dpll_abe_x2_ck_ops = {
  134. .recalc_rate = &omap3_clkoutx2_recalc,
  135. };
  136. static struct clk_hw_omap dpll_abe_x2_ck_hw = {
  137. .hw = {
  138. .clk = &dpll_abe_x2_ck,
  139. },
  140. .flags = CLOCK_CLKOUTX2,
  141. .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE,
  142. .ops = &clkhwops_omap4_dpllmx,
  143. };
  144. DEFINE_STRUCT_CLK(dpll_abe_x2_ck, dpll_abe_x2_ck_parents, dpll_abe_x2_ck_ops);
  145. static const struct clk_ops omap_hsdivider_ops = {
  146. .set_rate = &omap2_clksel_set_rate,
  147. .recalc_rate = &omap2_clksel_recalc,
  148. .round_rate = &omap2_clksel_round_rate,
  149. };
  150. DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m2x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
  151. 0x0, OMAP4430_CM_DIV_M2_DPLL_ABE,
  152. OMAP4430_DPLL_CLKOUT_DIV_MASK);
  153. DEFINE_CLK_FIXED_FACTOR(abe_24m_fclk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck,
  154. 0x0, 1, 8);
  155. DEFINE_CLK_DIVIDER(abe_clk, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, 0x0,
  156. OMAP4430_CM_CLKSEL_ABE, OMAP4430_CLKSEL_OPP_SHIFT,
  157. OMAP4430_CLKSEL_OPP_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
  158. DEFINE_CLK_DIVIDER(aess_fclk, "abe_clk", &abe_clk, 0x0,
  159. OMAP4430_CM1_ABE_AESS_CLKCTRL,
  160. OMAP4430_CLKSEL_AESS_FCLK_SHIFT,
  161. OMAP4430_CLKSEL_AESS_FCLK_WIDTH,
  162. 0x0, NULL);
  163. DEFINE_CLK_OMAP_HSDIVIDER(dpll_abe_m3x2_ck, "dpll_abe_x2_ck", &dpll_abe_x2_ck,
  164. 0x0, OMAP4430_CM_DIV_M3_DPLL_ABE,
  165. OMAP4430_DPLL_CLKOUTHIF_DIV_MASK);
  166. static const char *core_hsd_byp_clk_mux_ck_parents[] = {
  167. "sys_clkin_ck", "dpll_abe_m3x2_ck",
  168. };
  169. DEFINE_CLK_MUX(core_hsd_byp_clk_mux_ck, core_hsd_byp_clk_mux_ck_parents, NULL,
  170. 0x0, OMAP4430_CM_CLKSEL_DPLL_CORE,
  171. OMAP4430_DPLL_BYP_CLKSEL_SHIFT, OMAP4430_DPLL_BYP_CLKSEL_WIDTH,
  172. 0x0, NULL);
  173. /* DPLL_CORE */
  174. static struct dpll_data dpll_core_dd = {
  175. .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_CORE,
  176. .clk_bypass = &core_hsd_byp_clk_mux_ck,
  177. .clk_ref = &sys_clkin_ck,
  178. .control_reg = OMAP4430_CM_CLKMODE_DPLL_CORE,
  179. .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
  180. .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_CORE,
  181. .idlest_reg = OMAP4430_CM_IDLEST_DPLL_CORE,
  182. .mult_mask = OMAP4430_DPLL_MULT_MASK,
  183. .div1_mask = OMAP4430_DPLL_DIV_MASK,
  184. .enable_mask = OMAP4430_DPLL_EN_MASK,
  185. .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
  186. .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
  187. .max_multiplier = 2047,
  188. .max_divider = 128,
  189. .min_divider = 1,
  190. };
  191. static const char *dpll_core_ck_parents[] = {
  192. "sys_clkin_ck", "core_hsd_byp_clk_mux_ck"
  193. };
  194. static struct clk dpll_core_ck;
  195. static const struct clk_ops dpll_core_ck_ops = {
  196. .recalc_rate = &omap3_dpll_recalc,
  197. .get_parent = &omap2_init_dpll_parent,
  198. };
  199. static struct clk_hw_omap dpll_core_ck_hw = {
  200. .hw = {
  201. .clk = &dpll_core_ck,
  202. },
  203. .dpll_data = &dpll_core_dd,
  204. .ops = &clkhwops_omap3_dpll,
  205. };
  206. DEFINE_STRUCT_CLK(dpll_core_ck, dpll_core_ck_parents, dpll_core_ck_ops);
  207. static const char *dpll_core_x2_ck_parents[] = {