clock.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * linux/arch/arm/mach-sa1100/clock.c
  3. */
  4. #include <linux/module.h>
  5. #include <linux/kernel.h>
  6. #include <linux/device.h>
  7. #include <linux/list.h>
  8. #include <linux/errno.h>
  9. #include <linux/err.h>
  10. #include <linux/string.h>
  11. #include <linux/clk.h>
  12. #include <linux/spinlock.h>
  13. #include <linux/mutex.h>
  14. #include <mach/hardware.h>
  15. /*
  16. * Very simple clock implementation - we only have one clock to deal with.
  17. */
  18. struct clk {
  19. unsigned int enabled;
  20. };
  21. static void clk_gpio27_enable(void)
  22. {
  23. /*
  24. * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
  25. * (SA-1110 Developer's Manual, section 9.1.2.1)
  26. */
  27. GAFR |= GPIO_32_768kHz;
  28. GPDR |= GPIO_32_768kHz;
  29. TUCR = TUCR_3_6864MHz;
  30. }
  31. static void clk_gpio27_disable(void)
  32. {
  33. TUCR = 0;
  34. GPDR &= ~GPIO_32_768kHz;
  35. GAFR &= ~GPIO_32_768kHz;
  36. }
  37. static struct clk clk_gpio27;
  38. static DEFINE_SPINLOCK(clocks_lock);
  39. struct clk *clk_get(struct device *dev, const char *id)
  40. {
  41. const char *devname = dev_name(dev);
  42. return strcmp(devname, "sa1111.0") ? ERR_PTR(-ENOENT) : &clk_gpio27;
  43. }
  44. EXPORT_SYMBOL(clk_get);
  45. void clk_put(struct clk *clk)
  46. {
  47. }
  48. EXPORT_SYMBOL(clk_put);
  49. int clk_enable(struct clk *clk)
  50. {
  51. unsigned long flags;
  52. spin_lock_irqsave(&clocks_lock, flags);
  53. if (clk->enabled++ == 0)
  54. clk_gpio27_enable();
  55. spin_unlock_irqrestore(&clocks_lock, flags);
  56. return 0;
  57. }
  58. EXPORT_SYMBOL(clk_enable);
  59. void clk_disable(struct clk *clk)
  60. {
  61. unsigned long flags;
  62. WARN_ON(clk->enabled == 0);
  63. spin_lock_irqsave(&clocks_lock, flags);
  64. if (--clk->enabled == 0)
  65. clk_gpio27_disable();
  66. spin_unlock_irqrestore(&clocks_lock, flags);
  67. }
  68. EXPORT_SYMBOL(clk_disable);
  69. unsigned long clk_get_rate(struct clk *clk)
  70. {
  71. return 3686400;
  72. }
  73. EXPORT_SYMBOL(clk_get_rate);