Merge git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
[pandora-kernel.git] / arch / arm / mach-tegra / clock.h
index 083a4cf..688316a 100644 (file)
@@ -20,8 +20,9 @@
 #ifndef __MACH_TEGRA_CLOCK_H
 #define __MACH_TEGRA_CLOCK_H
 
-#include <linux/list.h>
 #include <linux/clkdev.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
 
 #define DIV_BUS                        (1 << 0)
 #define DIV_U71                        (1 << 1)
 #define ENABLE_ON_INIT         (1 << 28)
 
 struct clk;
-struct regulator;
-
-struct dvfs_table {
-       unsigned long rate;
-       int millivolts;
-};
-
-struct dvfs_process_id_table {
-       int process_id;
-       struct dvfs_table *table;
-};
-
-
-struct dvfs {
-       struct regulator *reg;
-       struct dvfs_table *table;
-       int max_millivolts;
-
-       int process_id_table_length;
-       const char *reg_id;
-       bool cpu;
-       struct dvfs_process_id_table process_id_table[];
-};
 
 struct clk_mux_sel {
        struct clk      *input;
        u32             value;
 };
 
-struct clk_pll_table {
+struct clk_pll_freq_table {
        unsigned long   input_rate;
        unsigned long   output_rate;
        u16             n;
@@ -86,6 +64,7 @@ struct clk_ops {
        int             (*set_parent)(struct clk *, struct clk *);
        int             (*set_rate)(struct clk *, unsigned long);
        long            (*round_rate)(struct clk *, unsigned long);
+       void            (*reset)(struct clk *, bool);
 };
 
 enum clk_state {
@@ -96,55 +75,64 @@ enum clk_state {
 
 struct clk {
        /* node for master clocks list */
-       struct list_head                node;
-       struct list_head                children;       /* list of children */
-       struct list_head                sibling;        /* node for children */
-#ifdef CONFIG_DEBUG_FS
-       struct dentry                   *dent;
-       struct dentry                   *parent_dent;
-#endif
-       struct clk_ops                  *ops;
-       struct clk                      *parent;
-       struct clk_lookup               lookup;
-       unsigned long                   rate;
-       unsigned long                   max_rate;
-       u32                             flags;
-       u32                             refcnt;
-       const char                      *name;
-       u32                             reg;
-       u32                             reg_shift;
-       unsigned int                    clk_num;
-       enum clk_state                  state;
+       struct list_head        node;           /* node for list of all clocks */
+       struct clk_lookup       lookup;
+
 #ifdef CONFIG_DEBUG_FS
-       bool                            set;
+       struct dentry           *dent;
 #endif
+       bool                    set;
+       struct clk_ops          *ops;
+       unsigned long           rate;
+       unsigned long           max_rate;
+       unsigned long           min_rate;
+       u32                     flags;
+       const char              *name;
+
+       u32                     refcnt;
+       enum clk_state          state;
+       struct clk              *parent;
+       u32                     div;
+       u32                     mul;
 
-       /* PLL */
-       unsigned long                   input_min;
-       unsigned long                   input_max;
-       unsigned long                   cf_min;
-       unsigned long                   cf_max;
-       unsigned long                   vco_min;
-       unsigned long                   vco_max;
-       const struct clk_pll_table      *pll_table;
-
-       /* DIV */
-       u32                             div;
-       u32                             mul;
-
-       /* MUX */
        const struct clk_mux_sel        *inputs;
-       u32                             sel;
-       u32                             reg_mask;
-
-       /* Virtual cpu clock */
-       struct clk                      *main;
-       struct clk                      *backup;
+       u32                             reg;
+       u32                             reg_shift;
 
-       struct dvfs                     *dvfs;
+       struct list_head                shared_bus_list;
+
+       union {
+               struct {
+                       unsigned int                    clk_num;
+               } periph;
+               struct {
+                       unsigned long                   input_min;
+                       unsigned long                   input_max;
+                       unsigned long                   cf_min;
+                       unsigned long                   cf_max;
+                       unsigned long                   vco_min;
+                       unsigned long                   vco_max;
+                       const struct clk_pll_freq_table *freq_table;
+                       int                             lock_delay;
+               } pll;
+               struct {
+                       u32                             sel;
+                       u32                             reg_mask;
+               } mux;
+               struct {
+                       struct clk                      *main;
+                       struct clk                      *backup;
+               } cpu;
+               struct {
+                       struct list_head                node;
+                       bool                            enabled;
+                       unsigned long                   rate;
+               } shared_bus_user;
+       } u;
+
+       spinlock_t spinlock;
 };
 
-
 struct clk_duplicate {
        const char *name;
        struct clk_lookup lookup;
@@ -163,11 +151,10 @@ void tegra2_periph_reset_assert(struct clk *c);
 void clk_init(struct clk *clk);
 struct clk *tegra_get_clock_by_name(const char *name);
 unsigned long clk_measure_input_freq(void);
-void clk_disable_locked(struct clk *c);
-int clk_enable_locked(struct clk *c);
-int clk_set_parent_locked(struct clk *c, struct clk *parent);
-int clk_set_rate_locked(struct clk *c, unsigned long rate);
 int clk_reparent(struct clk *c, struct clk *parent);
 void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
+unsigned long clk_get_rate_locked(struct clk *c);
+int clk_set_rate_locked(struct clk *c, unsigned long rate);
+void tegra2_sdmmc_tap_delay(struct clk *c, int delay);
 
 #endif