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 11 #include <linux/cpufreq.h> 12 #include <mach/hardware.h> 13 #include <mach/clocks.h> 14 #include <linux/err.h> 15 16 struct module; 17 18 struct clk { 19 struct list_head node; 20 unsigned long rate; 21 struct module *owner; 22 const char *name; 23 }; 24 25 /* ----- */ 26 27 #define MAINDIV1(c) (((c) >> 7) & 0x0f) 28 #define MAINDIV2(c) (((c) >> 11) & 0x1f) 29 #define PS(c) (((c) >> 18) & 0x03) 30 #define PREDIV(c) (((c) >> 2) & 0x1f) 31 #define HCLKDIV(c) (((c) >> 0) & 0x02) 32 #define PCLKDIV(c) (((c) >> 16) & 0x03) 33 cpufreq_get(unsigned int cpu)34unsigned int cpufreq_get (unsigned int cpu) /* in kHz */ 35 { 36 return fclkfreq_get ()/1000; 37 } 38 EXPORT_SYMBOL(cpufreq_get); 39 fclkfreq_get(void)40unsigned int fclkfreq_get (void) 41 { 42 unsigned int clkset = CSC_CLKSET; 43 unsigned int gclk 44 = XTAL_IN 45 / (1 << PS(clkset)) 46 * (MAINDIV1(clkset) + 2) 47 / (PREDIV(clkset) + 2) 48 * (MAINDIV2(clkset) + 2) 49 ; 50 return gclk; 51 } 52 hclkfreq_get(void)53unsigned int hclkfreq_get (void) 54 { 55 unsigned int clkset = CSC_CLKSET; 56 unsigned int hclk = fclkfreq_get () / (HCLKDIV(clkset) + 1); 57 58 return hclk; 59 } 60 pclkfreq_get(void)61unsigned int pclkfreq_get (void) 62 { 63 unsigned int clkset = CSC_CLKSET; 64 int pclkdiv = PCLKDIV(clkset); 65 unsigned int pclk; 66 if (pclkdiv == 0x3) 67 pclkdiv = 0x2; 68 pclk = hclkfreq_get () / (1 << pclkdiv); 69 70 return pclk; 71 } 72 73 /* ----- */ 74 clk_get(struct device * dev,const char * id)75struct clk *clk_get (struct device *dev, const char *id) 76 { 77 return dev && strcmp(dev_name(dev), "cldc-lh7a40x") == 0 78 ? NULL : ERR_PTR(-ENOENT); 79 } 80 EXPORT_SYMBOL(clk_get); 81 clk_put(struct clk * clk)82void clk_put (struct clk *clk) 83 { 84 } 85 EXPORT_SYMBOL(clk_put); 86 clk_enable(struct clk * clk)87int clk_enable (struct clk *clk) 88 { 89 return 0; 90 } 91 EXPORT_SYMBOL(clk_enable); 92 clk_disable(struct clk * clk)93void clk_disable (struct clk *clk) 94 { 95 } 96 EXPORT_SYMBOL(clk_disable); 97 clk_get_rate(struct clk * clk)98unsigned long clk_get_rate (struct clk *clk) 99 { 100 return 0; 101 } 102 EXPORT_SYMBOL(clk_get_rate); 103 clk_round_rate(struct clk * clk,unsigned long rate)104long clk_round_rate (struct clk *clk, unsigned long rate) 105 { 106 return rate; 107 } 108 EXPORT_SYMBOL(clk_round_rate); 109 clk_set_rate(struct clk * clk,unsigned long rate)110int clk_set_rate (struct clk *clk, unsigned long rate) 111 { 112 return -EIO; 113 } 114 EXPORT_SYMBOL(clk_set_rate); 115