clocks.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* arch/arm/mach-lh7a40x/clocks.c
  2. *
  3. * Copyright (C) 2004 Marc Singer
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * version 2 as published by the Free Software Foundation.
  8. *
  9. */
  10. #include <linux/cpufreq.h>
  11. #include <mach/hardware.h>
  12. #include <mach/clocks.h>
  13. #include <linux/err.h>
  14. struct module;
  15. struct clk {
  16. struct list_head node;
  17. unsigned long rate;
  18. struct module *owner;
  19. const char *name;
  20. };
  21. /* ----- */
  22. #define MAINDIV1(c) (((c) >> 7) & 0x0f)
  23. #define MAINDIV2(c) (((c) >> 11) & 0x1f)
  24. #define PS(c) (((c) >> 18) & 0x03)
  25. #define PREDIV(c) (((c) >> 2) & 0x1f)
  26. #define HCLKDIV(c) (((c) >> 0) & 0x02)
  27. #define PCLKDIV(c) (((c) >> 16) & 0x03)
  28. unsigned int cpufreq_get (unsigned int cpu) /* in kHz */
  29. {
  30. return fclkfreq_get ()/1000;
  31. }
  32. EXPORT_SYMBOL(cpufreq_get);
  33. unsigned int fclkfreq_get (void)
  34. {
  35. unsigned int clkset = CSC_CLKSET;
  36. unsigned int gclk
  37. = XTAL_IN
  38. / (1 << PS(clkset))
  39. * (MAINDIV1(clkset) + 2)
  40. / (PREDIV(clkset) + 2)
  41. * (MAINDIV2(clkset) + 2)
  42. ;
  43. return gclk;
  44. }
  45. unsigned int hclkfreq_get (void)
  46. {
  47. unsigned int clkset = CSC_CLKSET;
  48. unsigned int hclk = fclkfreq_get () / (HCLKDIV(clkset) + 1);
  49. return hclk;
  50. }
  51. unsigned int pclkfreq_get (void)
  52. {
  53. unsigned int clkset = CSC_CLKSET;
  54. int pclkdiv = PCLKDIV(clkset);
  55. unsigned int pclk;
  56. if (pclkdiv == 0x3)
  57. pclkdiv = 0x2;
  58. pclk = hclkfreq_get () / (1 << pclkdiv);
  59. return pclk;
  60. }
  61. /* ----- */
  62. struct clk *clk_get (struct device *dev, const char *id)
  63. {
  64. return dev && strcmp(dev_name(dev), "cldc-lh7a40x") == 0
  65. ? NULL : ERR_PTR(-ENOENT);
  66. }
  67. EXPORT_SYMBOL(clk_get);
  68. void clk_put (struct clk *clk)
  69. {
  70. }
  71. EXPORT_SYMBOL(clk_put);
  72. int clk_enable (struct clk *clk)
  73. {
  74. return 0;
  75. }
  76. EXPORT_SYMBOL(clk_enable);
  77. void clk_disable (struct clk *clk)
  78. {
  79. }
  80. EXPORT_SYMBOL(clk_disable);
  81. unsigned long clk_get_rate (struct clk *clk)
  82. {
  83. return 0;
  84. }
  85. EXPORT_SYMBOL(clk_get_rate);
  86. long clk_round_rate (struct clk *clk, unsigned long rate)
  87. {
  88. return rate;
  89. }
  90. EXPORT_SYMBOL(clk_round_rate);
  91. int clk_set_rate (struct clk *clk, unsigned long rate)
  92. {
  93. return -EIO;
  94. }
  95. EXPORT_SYMBOL(clk_set_rate);