OMAP3+: voltage: convert to PRM register access functions
[pandora-kernel.git] / arch / arm / mach-omap2 / voltage.h
index e9f5408..6a19cf3 100644 (file)
@@ -19,6 +19,8 @@
 #include "vc.h"
 #include "vp.h"
 
+struct powerdomain;
+
 /* XXX document */
 #define VOLTSCALE_VPFORCEUPDATE                1
 #define VOLTSCALE_VCBYPASS             2
@@ -31,6 +33,8 @@
 #define OMAP3_VOLTOFFSET       0xff
 #define OMAP3_VOLTSETUP2       0xff
 
+struct omap_vdd_info;
+
 /**
  * struct omap_vfsm_instance_data - per-voltage manager FSM register/bitfield
  * data
@@ -50,11 +54,29 @@ struct omap_vfsm_instance_data {
 
 /**
  * struct voltagedomain - omap voltage domain global structure.
- * @name:      Name of the voltage domain which can be used as a unique
- *             identifier.
+ * @name: Name of the voltage domain which can be used as a unique identifier.
+ * @scalable: Whether or not this voltage domain is scalable
+ * @node: list_head linking all voltage domains
+ * @pwrdm_list: list_head linking all powerdomains in this voltagedomain
+ * @vc: pointer to VC channel associated with this voltagedomain
+ * @read: read a VC/VP register
+ * @write: write a VC/VP register
+ * @read: read-modify-write a VC/VP register
+ * @vdd: to be removed
  */
 struct voltagedomain {
        char *name;
+       bool scalable;
+       struct list_head node;
+       struct list_head pwrdm_list;
+       struct omap_vc_channel *vc;
+
+       /* VC/VP register access functions: SoC specific */
+       u32 (*read) (u8 offset);
+       void (*write) (u32 val, u8 offset);
+       u32 (*rmw)(u32 mask, u32 bits, u8 offset);
+
+       struct omap_vdd_info *vdd;
 };
 
 /**
@@ -82,6 +104,8 @@ struct omap_volt_data {
  * @step_size: PMIC voltage step size (in uv)
  * @vsel_to_uv:        PMIC API to convert vsel value to actual voltage in uV.
  * @uv_to_vsel:        PMIC API to convert voltage in uV to vsel value.
+ * @volt_reg_addr: voltage configuration register address
+ * @cmd_reg_addr: command (on, on-LP, ret, off) configuration register address
  */
 struct omap_volt_pmic_info {
        int slew_rate;
@@ -98,7 +122,8 @@ struct omap_volt_pmic_info {
        u8 vp_vddmax;
        u8 vp_timeout_us;
        u8 i2c_slave_addr;
-       u8 pmic_reg;
+       u8 volt_reg_addr;
+       u8 cmd_reg_addr;
        unsigned long (*vsel_to_uv) (const u8 vsel);
        u8 (*uv_to_vsel) (unsigned long uV);
 };
@@ -113,10 +138,7 @@ struct omap_volt_pmic_info {
  * @vp_data            : the register values, shifts, masks for various
  *                       vp registers
  * @vp_rt_data          : VP data derived at runtime, not predefined
- * @vc_data            : structure containing various various vc registers,
- *                       shifts, masks etc.
  * @vfsm                : voltage manager FSM data
- * @voltdm             : pointer to the voltage domain structure
  * @debug_dir          : debug directory for this voltage domain.
  * @curr_volt          : current voltage for this vdd.
  * @vp_enabled         : flag to keep track of whether vp is enabled or not
@@ -127,21 +149,15 @@ struct omap_vdd_info {
        struct omap_volt_pmic_info *pmic_info;
        struct omap_vp_instance_data *vp_data;
        struct omap_vp_runtime_data vp_rt_data;
-       struct omap_vc_instance_data *vc_data;
        const struct omap_vfsm_instance_data *vfsm;
-       struct voltagedomain voltdm;
        struct dentry *debug_dir;
        u32 curr_volt;
        bool vp_enabled;
-       u32 (*read_reg) (u16 mod, u8 offset);
-       void (*write_reg) (u32 val, u16 mod, u8 offset);
-       int (*volt_scale) (struct omap_vdd_info *vdd,
+
+       int (*volt_scale) (struct voltagedomain *voltdm,
                unsigned long target_volt);
 };
 
-unsigned long omap_vp_get_curr_volt(struct voltagedomain *voltdm);
-void omap_vp_enable(struct voltagedomain *voltdm);
-void omap_vp_disable(struct voltagedomain *voltdm);
 int omap_voltage_scale_vdd(struct voltagedomain *voltdm,
                unsigned long target_volt);
 void omap_voltage_reset(struct voltagedomain *voltdm);
@@ -151,17 +167,11 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
                unsigned long volt);
 unsigned long omap_voltage_get_nom_volt(struct voltagedomain *voltdm);
 struct dentry *omap_voltage_get_dbgdir(struct voltagedomain *voltdm);
-int __init omap_voltage_early_init(s16 prm_mod, s16 prm_irqst_mod,
-                                  struct omap_vdd_info *omap_vdd_array[],
-                                  u8 omap_vdd_count);
 #ifdef CONFIG_PM
 int omap_voltage_register_pmic(struct voltagedomain *voltdm,
                struct omap_volt_pmic_info *pmic_info);
 void omap_change_voltscale_method(struct voltagedomain *voltdm,
                int voltscale_method);
-/* API to get the voltagedomain pointer */
-struct voltagedomain *omap_voltage_domain_lookup(char *name);
-
 int omap_voltage_late_init(void);
 #else
 static inline int omap_voltage_register_pmic(struct voltagedomain *voltdm,
@@ -175,10 +185,18 @@ static inline int omap_voltage_late_init(void)
 {
        return -EINVAL;
 }
-static inline struct voltagedomain *omap_voltage_domain_lookup(char *name)
-{
-       return ERR_PTR(-EINVAL);
-}
 #endif
 
+extern void omap2xxx_voltagedomains_init(void);
+extern void omap3xxx_voltagedomains_init(void);
+extern void omap44xx_voltagedomains_init(void);
+
+struct voltagedomain *voltdm_lookup(const char *name);
+void voltdm_init(struct voltagedomain **voltdm_list);
+int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm);
+int voltdm_for_each(int (*fn)(struct voltagedomain *voltdm, void *user),
+                   void *user);
+int voltdm_for_each_pwrdm(struct voltagedomain *voltdm,
+                         int (*fn)(struct voltagedomain *voltdm,
+                                   struct powerdomain *pwrdm));
 #endif