Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | /* * OMAP Voltage Management Routines * * Author: Thara Gopinath <thara@ti.com> * * Copyright (C) 2009 Texas Instruments, Inc. * Thara Gopinath <thara@ti.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __ARCH_ARM_MACH_OMAP2_VOLTAGE_H #define __ARCH_ARM_MACH_OMAP2_VOLTAGE_H #include <linux/err.h> #include <linux/platform_data/voltage-omap.h> #include "vc.h" #include "vp.h" struct powerdomain; /* XXX document */ #define VOLTSCALE_VPFORCEUPDATE 1 #define VOLTSCALE_VCBYPASS 2 /* * OMAP3 GENERIC setup times. Revisit to see if these needs to be * passed from board or PMIC file */ #define OMAP3_CLKSETUP 0xff #define OMAP3_VOLTOFFSET 0xff #define OMAP3_VOLTSETUP2 0xff /** * struct omap_vfsm_instance - per-voltage manager FSM register/bitfield * data * @voltsetup_mask: SETUP_TIME* bitmask in the PRM_VOLTSETUP* register * @voltsetup_reg: register offset of PRM_VOLTSETUP from PRM base * @voltsetup_off_reg: register offset of PRM_VOLTSETUP_OFF from PRM base * * XXX What about VOLTOFFSET/VOLTCTRL? */ struct omap_vfsm_instance { u32 voltsetup_mask; u8 voltsetup_reg; u8 voltsetup_off_reg; }; /** * struct voltagedomain - omap voltage domain global structure. * @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 * @vp: pointer to VP associated with this voltagedomain * @read: read a VC/VP register * @write: write a VC/VP register * @read: read-modify-write a VC/VP register * @sys_clk: system clock name/frequency, used for various timing calculations * @scale: function used to scale the voltage of the voltagedomain * @nominal_volt: current nominal voltage for this voltage domain * @volt_data: voltage table having the distinct voltages supported * by the domain and other associated per voltage data. */ struct voltagedomain { char *name; bool scalable; struct list_head node; struct list_head pwrdm_list; struct omap_vc_channel *vc; const struct omap_vfsm_instance *vfsm; struct omap_vp_instance *vp; struct omap_voltdm_pmic *pmic; struct omap_vp_param *vp_param; struct omap_vc_param *vc_param; /* 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); union { const char *name; u32 rate; } sys_clk; int (*scale) (struct voltagedomain *voltdm, unsigned long target_volt); u32 nominal_volt; struct omap_volt_data *volt_data; }; /* Min and max voltages from OMAP perspective */ #define OMAP3430_VP1_VLIMITTO_VDDMIN 850000 #define OMAP3430_VP1_VLIMITTO_VDDMAX 1425000 #define OMAP3430_VP2_VLIMITTO_VDDMIN 900000 #define OMAP3430_VP2_VLIMITTO_VDDMAX 1150000 #define OMAP3630_VP1_VLIMITTO_VDDMIN 900000 #define OMAP3630_VP1_VLIMITTO_VDDMAX 1350000 #define OMAP3630_VP2_VLIMITTO_VDDMIN 900000 #define OMAP3630_VP2_VLIMITTO_VDDMAX 1200000 #define OMAP4_VP_MPU_VLIMITTO_VDDMIN 830000 #define OMAP4_VP_MPU_VLIMITTO_VDDMAX 1410000 #define OMAP4_VP_IVA_VLIMITTO_VDDMIN 830000 #define OMAP4_VP_IVA_VLIMITTO_VDDMAX 1260000 #define OMAP4_VP_CORE_VLIMITTO_VDDMIN 830000 #define OMAP4_VP_CORE_VLIMITTO_VDDMAX 1200000 /** * struct omap_voltdm_pmic - PMIC specific data required by voltage driver. * @slew_rate: PMIC slew rate (in uv/us) * @step_size: PMIC voltage step size (in uv) * @i2c_slave_addr: I2C slave address of PMIC * @volt_reg_addr: voltage configuration register address * @cmd_reg_addr: command (on, on-LP, ret, off) configuration register address * @i2c_high_speed: whether VC uses I2C high-speed mode to PMIC * @i2c_mcode: master code value for I2C high-speed preamble transmission * @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. */ struct omap_voltdm_pmic { int slew_rate; int step_size; u16 i2c_slave_addr; u16 volt_reg_addr; u16 cmd_reg_addr; u8 vp_erroroffset; u8 vp_vstepmin; u8 vp_vstepmax; u32 vddmin; u32 vddmax; u8 vp_timeout_us; bool i2c_high_speed; u32 i2c_pad_load; u8 i2c_mcode; unsigned long (*vsel_to_uv) (const u8 vsel); u8 (*uv_to_vsel) (unsigned long uV); }; struct omap_vp_param { u32 vddmax; u32 vddmin; }; struct omap_vc_param { u32 on; u32 onlp; u32 ret; u32 off; }; void omap_voltage_get_volttable(struct voltagedomain *voltdm, struct omap_volt_data **volt_data); struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm, unsigned long volt); int omap_voltage_register_pmic(struct voltagedomain *voltdm, struct omap_voltdm_pmic *pmic); void omap_change_voltscale_method(struct voltagedomain *voltdm, int voltscale_method); int omap_voltage_late_init(void); extern void omap2xxx_voltagedomains_init(void); extern void omap3xxx_voltagedomains_init(void); extern void omap44xx_voltagedomains_init(void); extern void omap54xx_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)); int voltdm_scale(struct voltagedomain *voltdm, unsigned long target_volt); void voltdm_reset(struct voltagedomain *voltdm); unsigned long voltdm_get_voltage(struct voltagedomain *voltdm); #endif |