cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vc.c (24879B)


      1/*
      2 * OMAP Voltage Controller (VC) interface
      3 *
      4 * Copyright (C) 2011 Texas Instruments, Inc.
      5 *
      6 * This file is licensed under the terms of the GNU General Public
      7 * License version 2. This program is licensed "as is" without any
      8 * warranty of any kind, whether express or implied.
      9 */
     10#include <linux/kernel.h>
     11#include <linux/delay.h>
     12#include <linux/init.h>
     13#include <linux/bug.h>
     14#include <linux/io.h>
     15
     16#include <asm/div64.h>
     17
     18#include "iomap.h"
     19#include "soc.h"
     20#include "voltage.h"
     21#include "vc.h"
     22#include "prm-regbits-34xx.h"
     23#include "prm-regbits-44xx.h"
     24#include "prm44xx.h"
     25#include "pm.h"
     26#include "scrm44xx.h"
     27#include "control.h"
     28
     29#define OMAP4430_VDD_IVA_I2C_DISABLE		BIT(14)
     30#define OMAP4430_VDD_MPU_I2C_DISABLE		BIT(13)
     31#define OMAP4430_VDD_CORE_I2C_DISABLE		BIT(12)
     32#define OMAP4430_VDD_IVA_PRESENCE		BIT(9)
     33#define OMAP4430_VDD_MPU_PRESENCE		BIT(8)
     34#define OMAP4430_AUTO_CTRL_VDD_IVA(x)		((x) << 4)
     35#define OMAP4430_AUTO_CTRL_VDD_MPU(x)		((x) << 2)
     36#define OMAP4430_AUTO_CTRL_VDD_CORE(x)		((x) << 0)
     37#define OMAP4430_AUTO_CTRL_VDD_RET		2
     38
     39#define OMAP4430_VDD_I2C_DISABLE_MASK	\
     40	(OMAP4430_VDD_IVA_I2C_DISABLE | \
     41	 OMAP4430_VDD_MPU_I2C_DISABLE | \
     42	 OMAP4430_VDD_CORE_I2C_DISABLE)
     43
     44#define OMAP4_VDD_DEFAULT_VAL	\
     45	(OMAP4430_VDD_I2C_DISABLE_MASK | \
     46	 OMAP4430_VDD_IVA_PRESENCE | OMAP4430_VDD_MPU_PRESENCE | \
     47	 OMAP4430_AUTO_CTRL_VDD_IVA(OMAP4430_AUTO_CTRL_VDD_RET) | \
     48	 OMAP4430_AUTO_CTRL_VDD_MPU(OMAP4430_AUTO_CTRL_VDD_RET) | \
     49	 OMAP4430_AUTO_CTRL_VDD_CORE(OMAP4430_AUTO_CTRL_VDD_RET))
     50
     51#define OMAP4_VDD_RET_VAL	\
     52	(OMAP4_VDD_DEFAULT_VAL & ~OMAP4430_VDD_I2C_DISABLE_MASK)
     53
     54/**
     55 * struct omap_vc_channel_cfg - describe the cfg_channel bitfield
     56 * @sa: bit for slave address
     57 * @rav: bit for voltage configuration register
     58 * @rac: bit for command configuration register
     59 * @racen: enable bit for RAC
     60 * @cmd: bit for command value set selection
     61 *
     62 * Channel configuration bits, common for OMAP3+
     63 * OMAP3 register: PRM_VC_CH_CONF
     64 * OMAP4 register: PRM_VC_CFG_CHANNEL
     65 * OMAP5 register: PRM_VC_SMPS_<voltdm>_CONFIG
     66 */
     67struct omap_vc_channel_cfg {
     68	u8 sa;
     69	u8 rav;
     70	u8 rac;
     71	u8 racen;
     72	u8 cmd;
     73};
     74
     75static struct omap_vc_channel_cfg vc_default_channel_cfg = {
     76	.sa    = BIT(0),
     77	.rav   = BIT(1),
     78	.rac   = BIT(2),
     79	.racen = BIT(3),
     80	.cmd   = BIT(4),
     81};
     82
     83/*
     84 * On OMAP3+, all VC channels have the above default bitfield
     85 * configuration, except the OMAP4 MPU channel.  This appears
     86 * to be a freak accident as every other VC channel has the
     87 * default configuration, thus creating a mutant channel config.
     88 */
     89static struct omap_vc_channel_cfg vc_mutant_channel_cfg = {
     90	.sa    = BIT(0),
     91	.rav   = BIT(2),
     92	.rac   = BIT(3),
     93	.racen = BIT(4),
     94	.cmd   = BIT(1),
     95};
     96
     97static struct omap_vc_channel_cfg *vc_cfg_bits;
     98
     99/* Default I2C trace length on pcb, 6.3cm. Used for capacitance calculations. */
    100static u32 sr_i2c_pcb_length = 63;
    101#define CFG_CHANNEL_MASK 0x1f
    102
    103/**
    104 * omap_vc_config_channel - configure VC channel to PMIC mappings
    105 * @voltdm: pointer to voltagdomain defining the desired VC channel
    106 *
    107 * Configures the VC channel to PMIC mappings for the following
    108 * PMIC settings
    109 * - i2c slave address (SA)
    110 * - voltage configuration address (RAV)
    111 * - command configuration address (RAC) and enable bit (RACEN)
    112 * - command values for ON, ONLP, RET and OFF (CMD)
    113 *
    114 * This function currently only allows flexible configuration of the
    115 * non-default channel.  Starting with OMAP4, there are more than 2
    116 * channels, with one defined as the default (on OMAP4, it's MPU.)
    117 * Only the non-default channel can be configured.
    118 */
    119static int omap_vc_config_channel(struct voltagedomain *voltdm)
    120{
    121	struct omap_vc_channel *vc = voltdm->vc;
    122
    123	/*
    124	 * For default channel, the only configurable bit is RACEN.
    125	 * All others must stay at zero (see function comment above.)
    126	 */
    127	if (vc->flags & OMAP_VC_CHANNEL_DEFAULT)
    128		vc->cfg_channel &= vc_cfg_bits->racen;
    129
    130	voltdm->rmw(CFG_CHANNEL_MASK << vc->cfg_channel_sa_shift,
    131		    vc->cfg_channel << vc->cfg_channel_sa_shift,
    132		    vc->cfg_channel_reg);
    133
    134	return 0;
    135}
    136
    137/* Voltage scale and accessory APIs */
    138int omap_vc_pre_scale(struct voltagedomain *voltdm,
    139		      unsigned long target_volt,
    140		      u8 *target_vsel, u8 *current_vsel)
    141{
    142	struct omap_vc_channel *vc = voltdm->vc;
    143	u32 vc_cmdval;
    144
    145	/* Check if sufficient pmic info is available for this vdd */
    146	if (!voltdm->pmic) {
    147		pr_err("%s: Insufficient pmic info to scale the vdd_%s\n",
    148			__func__, voltdm->name);
    149		return -EINVAL;
    150	}
    151
    152	if (!voltdm->pmic->uv_to_vsel) {
    153		pr_err("%s: PMIC function to convert voltage in uV to vsel not registered. Hence unable to scale voltage for vdd_%s\n",
    154		       __func__, voltdm->name);
    155		return -ENODATA;
    156	}
    157
    158	if (!voltdm->read || !voltdm->write) {
    159		pr_err("%s: No read/write API for accessing vdd_%s regs\n",
    160			__func__, voltdm->name);
    161		return -EINVAL;
    162	}
    163
    164	*target_vsel = voltdm->pmic->uv_to_vsel(target_volt);
    165	*current_vsel = voltdm->pmic->uv_to_vsel(voltdm->nominal_volt);
    166
    167	/* Setting the ON voltage to the new target voltage */
    168	vc_cmdval = voltdm->read(vc->cmdval_reg);
    169	vc_cmdval &= ~vc->common->cmd_on_mask;
    170	vc_cmdval |= (*target_vsel << vc->common->cmd_on_shift);
    171	voltdm->write(vc_cmdval, vc->cmdval_reg);
    172
    173	voltdm->vc_param->on = target_volt;
    174
    175	omap_vp_update_errorgain(voltdm, target_volt);
    176
    177	return 0;
    178}
    179
    180void omap_vc_post_scale(struct voltagedomain *voltdm,
    181			unsigned long target_volt,
    182			u8 target_vsel, u8 current_vsel)
    183{
    184	u32 smps_steps = 0, smps_delay = 0;
    185
    186	smps_steps = abs(target_vsel - current_vsel);
    187	/* SMPS slew rate / step size. 2us added as buffer. */
    188	smps_delay = ((smps_steps * voltdm->pmic->step_size) /
    189			voltdm->pmic->slew_rate) + 2;
    190	udelay(smps_delay);
    191}
    192
    193/* vc_bypass_scale - VC bypass method of voltage scaling */
    194int omap_vc_bypass_scale(struct voltagedomain *voltdm,
    195			 unsigned long target_volt)
    196{
    197	struct omap_vc_channel *vc = voltdm->vc;
    198	u32 loop_cnt = 0, retries_cnt = 0;
    199	u32 vc_valid, vc_bypass_val_reg, vc_bypass_value;
    200	u8 target_vsel, current_vsel;
    201	int ret;
    202
    203	ret = omap_vc_pre_scale(voltdm, target_volt, &target_vsel, &current_vsel);
    204	if (ret)
    205		return ret;
    206
    207	vc_valid = vc->common->valid;
    208	vc_bypass_val_reg = vc->common->bypass_val_reg;
    209	vc_bypass_value = (target_vsel << vc->common->data_shift) |
    210		(vc->volt_reg_addr << vc->common->regaddr_shift) |
    211		(vc->i2c_slave_addr << vc->common->slaveaddr_shift);
    212
    213	voltdm->write(vc_bypass_value, vc_bypass_val_reg);
    214	voltdm->write(vc_bypass_value | vc_valid, vc_bypass_val_reg);
    215
    216	vc_bypass_value = voltdm->read(vc_bypass_val_reg);
    217	/*
    218	 * Loop till the bypass command is acknowledged from the SMPS.
    219	 * NOTE: This is legacy code. The loop count and retry count needs
    220	 * to be revisited.
    221	 */
    222	while (!(vc_bypass_value & vc_valid)) {
    223		loop_cnt++;
    224
    225		if (retries_cnt > 10) {
    226			pr_warn("%s: Retry count exceeded\n", __func__);
    227			return -ETIMEDOUT;
    228		}
    229
    230		if (loop_cnt > 50) {
    231			retries_cnt++;
    232			loop_cnt = 0;
    233			udelay(10);
    234		}
    235		vc_bypass_value = voltdm->read(vc_bypass_val_reg);
    236	}
    237
    238	omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
    239	return 0;
    240}
    241
    242/* Convert microsecond value to number of 32kHz clock cycles */
    243static inline u32 omap_usec_to_32k(u32 usec)
    244{
    245	return DIV_ROUND_UP_ULL(32768ULL * (u64)usec, 1000000ULL);
    246}
    247
    248struct omap3_vc_timings {
    249	u32 voltsetup1;
    250	u32 voltsetup2;
    251};
    252
    253struct omap3_vc {
    254	struct voltagedomain *vd;
    255	u32 voltctrl;
    256	u32 voltsetup1;
    257	u32 voltsetup2;
    258	struct omap3_vc_timings timings[2];
    259};
    260static struct omap3_vc vc;
    261
    262void omap3_vc_set_pmic_signaling(int core_next_state)
    263{
    264	struct voltagedomain *vd = vc.vd;
    265	struct omap3_vc_timings *c = vc.timings;
    266	u32 voltctrl, voltsetup1, voltsetup2;
    267
    268	voltctrl = vc.voltctrl;
    269	voltsetup1 = vc.voltsetup1;
    270	voltsetup2 = vc.voltsetup2;
    271
    272	switch (core_next_state) {
    273	case PWRDM_POWER_OFF:
    274		voltctrl &= ~(OMAP3430_PRM_VOLTCTRL_AUTO_RET |
    275			      OMAP3430_PRM_VOLTCTRL_AUTO_SLEEP);
    276		voltctrl |= OMAP3430_PRM_VOLTCTRL_AUTO_OFF;
    277		if (voltctrl & OMAP3430_PRM_VOLTCTRL_SEL_OFF)
    278			voltsetup2 = c->voltsetup2;
    279		else
    280			voltsetup1 = c->voltsetup1;
    281		break;
    282	case PWRDM_POWER_RET:
    283	default:
    284		c++;
    285		voltctrl &= ~(OMAP3430_PRM_VOLTCTRL_AUTO_OFF |
    286			      OMAP3430_PRM_VOLTCTRL_AUTO_SLEEP);
    287		voltctrl |= OMAP3430_PRM_VOLTCTRL_AUTO_RET;
    288		voltsetup1 = c->voltsetup1;
    289		break;
    290	}
    291
    292	if (voltctrl != vc.voltctrl) {
    293		vd->write(voltctrl, OMAP3_PRM_VOLTCTRL_OFFSET);
    294		vc.voltctrl = voltctrl;
    295	}
    296	if (voltsetup1 != vc.voltsetup1) {
    297		vd->write(c->voltsetup1,
    298			  OMAP3_PRM_VOLTSETUP1_OFFSET);
    299		vc.voltsetup1 = voltsetup1;
    300	}
    301	if (voltsetup2 != vc.voltsetup2) {
    302		vd->write(c->voltsetup2,
    303			  OMAP3_PRM_VOLTSETUP2_OFFSET);
    304		vc.voltsetup2 = voltsetup2;
    305	}
    306}
    307
    308void omap4_vc_set_pmic_signaling(int core_next_state)
    309{
    310	struct voltagedomain *vd = vc.vd;
    311	u32 val;
    312
    313	if (!vd)
    314		return;
    315
    316	switch (core_next_state) {
    317	case PWRDM_POWER_RET:
    318		val = OMAP4_VDD_RET_VAL;
    319		break;
    320	default:
    321		val = OMAP4_VDD_DEFAULT_VAL;
    322		break;
    323	}
    324
    325	vd->write(val, OMAP4_PRM_VOLTCTRL_OFFSET);
    326}
    327
    328/*
    329 * Configure signal polarity for sys_clkreq and sys_off_mode pins
    330 * as the default values are wrong and can cause the system to hang
    331 * if any twl4030 scripts are loaded.
    332 */
    333static void __init omap3_vc_init_pmic_signaling(struct voltagedomain *voltdm)
    334{
    335	u32 val;
    336
    337	if (vc.vd)
    338		return;
    339
    340	vc.vd = voltdm;
    341
    342	val = voltdm->read(OMAP3_PRM_POLCTRL_OFFSET);
    343	if (!(val & OMAP3430_PRM_POLCTRL_CLKREQ_POL) ||
    344	    (val & OMAP3430_PRM_POLCTRL_OFFMODE_POL)) {
    345		val |= OMAP3430_PRM_POLCTRL_CLKREQ_POL;
    346		val &= ~OMAP3430_PRM_POLCTRL_OFFMODE_POL;
    347		pr_debug("PM: fixing sys_clkreq and sys_off_mode polarity to 0x%x\n",
    348			 val);
    349		voltdm->write(val, OMAP3_PRM_POLCTRL_OFFSET);
    350	}
    351
    352	/*
    353	 * By default let's use I2C4 signaling for retention idle
    354	 * and sys_off_mode pin signaling for off idle. This way we
    355	 * have sys_clk_req pin go down for retention and both
    356	 * sys_clk_req and sys_off_mode pins will go down for off
    357	 * idle. And we can also scale voltages to zero for off-idle.
    358	 * Note that no actual voltage scaling during off-idle will
    359	 * happen unless the board specific twl4030 PMIC scripts are
    360	 * loaded. See also omap_vc_i2c_init for comments regarding
    361	 * erratum i531.
    362	 */
    363	val = voltdm->read(OMAP3_PRM_VOLTCTRL_OFFSET);
    364	if (!(val & OMAP3430_PRM_VOLTCTRL_SEL_OFF)) {
    365		val |= OMAP3430_PRM_VOLTCTRL_SEL_OFF;
    366		pr_debug("PM: setting voltctrl sys_off_mode signaling to 0x%x\n",
    367			 val);
    368		voltdm->write(val, OMAP3_PRM_VOLTCTRL_OFFSET);
    369	}
    370	vc.voltctrl = val;
    371
    372	omap3_vc_set_pmic_signaling(PWRDM_POWER_ON);
    373}
    374
    375static void omap3_init_voltsetup1(struct voltagedomain *voltdm,
    376				  struct omap3_vc_timings *c, u32 idle)
    377{
    378	unsigned long val;
    379
    380	val = (voltdm->vc_param->on - idle) / voltdm->pmic->slew_rate;
    381	val *= voltdm->sys_clk.rate / 8 / 1000000 + 1;
    382	val <<= __ffs(voltdm->vfsm->voltsetup_mask);
    383	c->voltsetup1 &= ~voltdm->vfsm->voltsetup_mask;
    384	c->voltsetup1 |= val;
    385}
    386
    387/**
    388 * omap3_set_i2c_timings - sets i2c sleep timings for a channel
    389 * @voltdm: channel to configure
    390 * @off_mode: select whether retention or off mode values used
    391 *
    392 * Calculates and sets up voltage controller to use I2C based
    393 * voltage scaling for sleep modes. This can be used for either off mode
    394 * or retention. Off mode has additionally an option to use sys_off_mode
    395 * pad, which uses a global signal to program the whole power IC to
    396 * off-mode.
    397 *
    398 * Note that pmic is not controlling the voltage scaling during
    399 * retention signaled over I2C4, so we can keep voltsetup2 as 0.
    400 * And the oscillator is not shut off over I2C4, so no need to
    401 * set clksetup.
    402 */
    403static void omap3_set_i2c_timings(struct voltagedomain *voltdm)
    404{
    405	struct omap3_vc_timings *c = vc.timings;
    406
    407	/* Configure PRWDM_POWER_OFF over I2C4 */
    408	omap3_init_voltsetup1(voltdm, c, voltdm->vc_param->off);
    409	c++;
    410	/* Configure PRWDM_POWER_RET over I2C4 */
    411	omap3_init_voltsetup1(voltdm, c, voltdm->vc_param->ret);
    412}
    413
    414/**
    415 * omap3_set_off_timings - sets off-mode timings for a channel
    416 * @voltdm: channel to configure
    417 *
    418 * Calculates and sets up off-mode timings for a channel. Off-mode
    419 * can use either I2C based voltage scaling, or alternatively
    420 * sys_off_mode pad can be used to send a global command to power IC.n,
    421 * sys_off_mode has the additional benefit that voltages can be
    422 * scaled to zero volt level with TWL4030 / TWL5030, I2C can only
    423 * scale to 600mV.
    424 *
    425 * Note that omap is not controlling the voltage scaling during
    426 * off idle signaled by sys_off_mode, so we can keep voltsetup1
    427 * as 0.
    428 */
    429static void omap3_set_off_timings(struct voltagedomain *voltdm)
    430{
    431	struct omap3_vc_timings *c = vc.timings;
    432	u32 tstart, tshut, clksetup, voltoffset;
    433
    434	if (c->voltsetup2)
    435		return;
    436
    437	omap_pm_get_oscillator(&tstart, &tshut);
    438	if (tstart == ULONG_MAX) {
    439		pr_debug("PM: oscillator start-up time not initialized, using 10ms\n");
    440		clksetup = omap_usec_to_32k(10000);
    441	} else {
    442		clksetup = omap_usec_to_32k(tstart);
    443	}
    444
    445	/*
    446	 * For twl4030 errata 27, we need to allow minimum ~488.32 us wait to
    447	 * switch from HFCLKIN to internal oscillator. That means timings
    448	 * have voltoffset fixed to 0xa in rounded up 32 KiHz cycles. And
    449	 * that means we can calculate the value based on the oscillator
    450	 * start-up time since voltoffset2 = clksetup - voltoffset.
    451	 */
    452	voltoffset = omap_usec_to_32k(488);
    453	c->voltsetup2 = clksetup - voltoffset;
    454	voltdm->write(clksetup, OMAP3_PRM_CLKSETUP_OFFSET);
    455	voltdm->write(voltoffset, OMAP3_PRM_VOLTOFFSET_OFFSET);
    456}
    457
    458static void __init omap3_vc_init_channel(struct voltagedomain *voltdm)
    459{
    460	omap3_vc_init_pmic_signaling(voltdm);
    461	omap3_set_off_timings(voltdm);
    462	omap3_set_i2c_timings(voltdm);
    463}
    464
    465/**
    466 * omap4_calc_volt_ramp - calculates voltage ramping delays on omap4
    467 * @voltdm: channel to calculate values for
    468 * @voltage_diff: voltage difference in microvolts
    469 *
    470 * Calculates voltage ramp prescaler + counter values for a voltage
    471 * difference on omap4. Returns a field value suitable for writing to
    472 * VOLTSETUP register for a channel in following format:
    473 * bits[8:9] prescaler ... bits[0:5] counter. See OMAP4 TRM for reference.
    474 */
    475static u32 omap4_calc_volt_ramp(struct voltagedomain *voltdm, u32 voltage_diff)
    476{
    477	u32 prescaler;
    478	u32 cycles;
    479	u32 time;
    480
    481	time = voltage_diff / voltdm->pmic->slew_rate;
    482
    483	cycles = voltdm->sys_clk.rate / 1000 * time / 1000;
    484
    485	cycles /= 64;
    486	prescaler = 0;
    487
    488	/* shift to next prescaler until no overflow */
    489
    490	/* scale for div 256 = 64 * 4 */
    491	if (cycles > 63) {
    492		cycles /= 4;
    493		prescaler++;
    494	}
    495
    496	/* scale for div 512 = 256 * 2 */
    497	if (cycles > 63) {
    498		cycles /= 2;
    499		prescaler++;
    500	}
    501
    502	/* scale for div 2048 = 512 * 4 */
    503	if (cycles > 63) {
    504		cycles /= 4;
    505		prescaler++;
    506	}
    507
    508	/* check for overflow => invalid ramp time */
    509	if (cycles > 63) {
    510		pr_warn("%s: invalid setuptime for vdd_%s\n", __func__,
    511			voltdm->name);
    512		return 0;
    513	}
    514
    515	cycles++;
    516
    517	return (prescaler << OMAP4430_RAMP_UP_PRESCAL_SHIFT) |
    518		(cycles << OMAP4430_RAMP_UP_COUNT_SHIFT);
    519}
    520
    521/**
    522 * omap4_usec_to_val_scrm - convert microsecond value to SCRM module bitfield
    523 * @usec: microseconds
    524 * @shift: number of bits to shift left
    525 * @mask: bitfield mask
    526 *
    527 * Converts microsecond value to OMAP4 SCRM bitfield. Bitfield is
    528 * shifted to requested position, and checked agains the mask value.
    529 * If larger, forced to the max value of the field (i.e. the mask itself.)
    530 * Returns the SCRM bitfield value.
    531 */
    532static u32 omap4_usec_to_val_scrm(u32 usec, int shift, u32 mask)
    533{
    534	u32 val;
    535
    536	val = omap_usec_to_32k(usec) << shift;
    537
    538	/* Check for overflow, if yes, force to max value */
    539	if (val > mask)
    540		val = mask;
    541
    542	return val;
    543}
    544
    545/**
    546 * omap4_set_timings - set voltage ramp timings for a channel
    547 * @voltdm: channel to configure
    548 * @off_mode: whether off-mode values are used
    549 *
    550 * Calculates and sets the voltage ramp up / down values for a channel.
    551 */
    552static void omap4_set_timings(struct voltagedomain *voltdm, bool off_mode)
    553{
    554	u32 val;
    555	u32 ramp;
    556	int offset;
    557	u32 tstart, tshut;
    558
    559	if (off_mode) {
    560		ramp = omap4_calc_volt_ramp(voltdm,
    561			voltdm->vc_param->on - voltdm->vc_param->off);
    562		offset = voltdm->vfsm->voltsetup_off_reg;
    563	} else {
    564		ramp = omap4_calc_volt_ramp(voltdm,
    565			voltdm->vc_param->on - voltdm->vc_param->ret);
    566		offset = voltdm->vfsm->voltsetup_reg;
    567	}
    568
    569	if (!ramp)
    570		return;
    571
    572	val = voltdm->read(offset);
    573
    574	val |= ramp << OMAP4430_RAMP_DOWN_COUNT_SHIFT;
    575
    576	val |= ramp << OMAP4430_RAMP_UP_COUNT_SHIFT;
    577
    578	voltdm->write(val, offset);
    579
    580	omap_pm_get_oscillator(&tstart, &tshut);
    581
    582	val = omap4_usec_to_val_scrm(tstart, OMAP4_SETUPTIME_SHIFT,
    583		OMAP4_SETUPTIME_MASK);
    584	val |= omap4_usec_to_val_scrm(tshut, OMAP4_DOWNTIME_SHIFT,
    585		OMAP4_DOWNTIME_MASK);
    586
    587	writel_relaxed(val, OMAP4_SCRM_CLKSETUPTIME);
    588}
    589
    590static void __init omap4_vc_init_pmic_signaling(struct voltagedomain *voltdm)
    591{
    592	if (vc.vd)
    593		return;
    594
    595	vc.vd = voltdm;
    596	voltdm->write(OMAP4_VDD_DEFAULT_VAL, OMAP4_PRM_VOLTCTRL_OFFSET);
    597}
    598
    599/* OMAP4 specific voltage init functions */
    600static void __init omap4_vc_init_channel(struct voltagedomain *voltdm)
    601{
    602	omap4_vc_init_pmic_signaling(voltdm);
    603	omap4_set_timings(voltdm, true);
    604	omap4_set_timings(voltdm, false);
    605}
    606
    607struct i2c_init_data {
    608	u8 loadbits;
    609	u8 load;
    610	u8 hsscll_38_4;
    611	u8 hsscll_26;
    612	u8 hsscll_19_2;
    613	u8 hsscll_16_8;
    614	u8 hsscll_12;
    615};
    616
    617static const struct i2c_init_data omap4_i2c_timing_data[] __initconst = {
    618	{
    619		.load = 50,
    620		.loadbits = 0x3,
    621		.hsscll_38_4 = 13,
    622		.hsscll_26 = 11,
    623		.hsscll_19_2 = 9,
    624		.hsscll_16_8 = 9,
    625		.hsscll_12 = 8,
    626	},
    627	{
    628		.load = 25,
    629		.loadbits = 0x2,
    630		.hsscll_38_4 = 13,
    631		.hsscll_26 = 11,
    632		.hsscll_19_2 = 9,
    633		.hsscll_16_8 = 9,
    634		.hsscll_12 = 8,
    635	},
    636	{
    637		.load = 12,
    638		.loadbits = 0x1,
    639		.hsscll_38_4 = 11,
    640		.hsscll_26 = 10,
    641		.hsscll_19_2 = 9,
    642		.hsscll_16_8 = 9,
    643		.hsscll_12 = 8,
    644	},
    645	{
    646		.load = 0,
    647		.loadbits = 0x0,
    648		.hsscll_38_4 = 12,
    649		.hsscll_26 = 10,
    650		.hsscll_19_2 = 9,
    651		.hsscll_16_8 = 8,
    652		.hsscll_12 = 8,
    653	},
    654};
    655
    656/**
    657 * omap4_vc_i2c_timing_init - sets up board I2C timing parameters
    658 * @voltdm: voltagedomain pointer to get data from
    659 *
    660 * Use PMIC + board supplied settings for calculating the total I2C
    661 * channel capacitance and set the timing parameters based on this.
    662 * Pre-calculated values are provided in data tables, as it is not
    663 * too straightforward to calculate these runtime.
    664 */
    665static void __init omap4_vc_i2c_timing_init(struct voltagedomain *voltdm)
    666{
    667	u32 capacitance;
    668	u32 val;
    669	u16 hsscll;
    670	const struct i2c_init_data *i2c_data;
    671
    672	if (!voltdm->pmic->i2c_high_speed) {
    673		pr_info("%s: using bootloader low-speed timings\n", __func__);
    674		return;
    675	}
    676
    677	/* PCB trace capacitance, 0.125pF / mm => mm / 8 */
    678	capacitance = DIV_ROUND_UP(sr_i2c_pcb_length, 8);
    679
    680	/* OMAP pad capacitance */
    681	capacitance += 4;
    682
    683	/* PMIC pad capacitance */
    684	capacitance += voltdm->pmic->i2c_pad_load;
    685
    686	/* Search for capacitance match in the table */
    687	i2c_data = omap4_i2c_timing_data;
    688
    689	while (i2c_data->load > capacitance)
    690		i2c_data++;
    691
    692	/* Select proper values based on sysclk frequency */
    693	switch (voltdm->sys_clk.rate) {
    694	case 38400000:
    695		hsscll = i2c_data->hsscll_38_4;
    696		break;
    697	case 26000000:
    698		hsscll = i2c_data->hsscll_26;
    699		break;
    700	case 19200000:
    701		hsscll = i2c_data->hsscll_19_2;
    702		break;
    703	case 16800000:
    704		hsscll = i2c_data->hsscll_16_8;
    705		break;
    706	case 12000000:
    707		hsscll = i2c_data->hsscll_12;
    708		break;
    709	default:
    710		pr_warn("%s: unsupported sysclk rate: %d!\n", __func__,
    711			voltdm->sys_clk.rate);
    712		return;
    713	}
    714
    715	/* Loadbits define pull setup for the I2C channels */
    716	val = i2c_data->loadbits << 25 | i2c_data->loadbits << 29;
    717
    718	/* Write to SYSCTRL_PADCONF_WKUP_CTRL_I2C_2 to setup I2C pull */
    719	writel_relaxed(val, OMAP2_L4_IO_ADDRESS(OMAP4_CTRL_MODULE_PAD_WKUP +
    720				OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2));
    721
    722	/* HSSCLH can always be zero */
    723	val = hsscll << OMAP4430_HSSCLL_SHIFT;
    724	val |= (0x28 << OMAP4430_SCLL_SHIFT | 0x2c << OMAP4430_SCLH_SHIFT);
    725
    726	/* Write setup times to I2C config register */
    727	voltdm->write(val, OMAP4_PRM_VC_CFG_I2C_CLK_OFFSET);
    728}
    729
    730
    731
    732/**
    733 * omap_vc_i2c_init - initialize I2C interface to PMIC
    734 * @voltdm: voltage domain containing VC data
    735 *
    736 * Use PMIC supplied settings for I2C high-speed mode and
    737 * master code (if set) and program the VC I2C configuration
    738 * register.
    739 *
    740 * The VC I2C configuration is common to all VC channels,
    741 * so this function only configures I2C for the first VC
    742 * channel registers.  All other VC channels will use the
    743 * same configuration.
    744 */
    745static void __init omap_vc_i2c_init(struct voltagedomain *voltdm)
    746{
    747	struct omap_vc_channel *vc = voltdm->vc;
    748	static bool initialized;
    749	static bool i2c_high_speed;
    750	u8 mcode;
    751
    752	if (initialized) {
    753		if (voltdm->pmic->i2c_high_speed != i2c_high_speed)
    754			pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).\n",
    755				__func__, voltdm->name, i2c_high_speed);
    756		return;
    757	}
    758
    759	/*
    760	 * Note that for omap3 OMAP3430_SREN_MASK clears SREN to work around
    761	 * erratum i531 "Extra Power Consumed When Repeated Start Operation
    762	 * Mode Is Enabled on I2C Interface Dedicated for Smart Reflex (I2C4)".
    763	 * Otherwise I2C4 eventually leads into about 23mW extra power being
    764	 * consumed even during off idle using VMODE.
    765	 */
    766	i2c_high_speed = voltdm->pmic->i2c_high_speed;
    767	if (i2c_high_speed)
    768		voltdm->rmw(vc->common->i2c_cfg_clear_mask,
    769			    vc->common->i2c_cfg_hsen_mask,
    770			    vc->common->i2c_cfg_reg);
    771
    772	mcode = voltdm->pmic->i2c_mcode;
    773	if (mcode)
    774		voltdm->rmw(vc->common->i2c_mcode_mask,
    775			    mcode << __ffs(vc->common->i2c_mcode_mask),
    776			    vc->common->i2c_cfg_reg);
    777
    778	if (cpu_is_omap44xx())
    779		omap4_vc_i2c_timing_init(voltdm);
    780
    781	initialized = true;
    782}
    783
    784/**
    785 * omap_vc_calc_vsel - calculate vsel value for a channel
    786 * @voltdm: channel to calculate value for
    787 * @uvolt: microvolt value to convert to vsel
    788 *
    789 * Converts a microvolt value to vsel value for the used PMIC.
    790 * This checks whether the microvolt value is out of bounds, and
    791 * adjusts the value accordingly. If unsupported value detected,
    792 * warning is thrown.
    793 */
    794static u8 omap_vc_calc_vsel(struct voltagedomain *voltdm, u32 uvolt)
    795{
    796	if (voltdm->pmic->vddmin > uvolt)
    797		uvolt = voltdm->pmic->vddmin;
    798	if (voltdm->pmic->vddmax < uvolt) {
    799		WARN(1, "%s: voltage not supported by pmic: %u vs max %u\n",
    800			__func__, uvolt, voltdm->pmic->vddmax);
    801		/* Lets try maximum value anyway */
    802		uvolt = voltdm->pmic->vddmax;
    803	}
    804
    805	return voltdm->pmic->uv_to_vsel(uvolt);
    806}
    807
    808#ifdef CONFIG_PM
    809/**
    810 * omap_pm_setup_sr_i2c_pcb_length - set length of SR I2C traces on PCB
    811 * @mm: length of the PCB trace in millimetres
    812 *
    813 * Sets the PCB trace length for the I2C channel. By default uses 63mm.
    814 * This is needed for properly calculating the capacitance value for
    815 * the PCB trace, and for setting the SR I2C channel timing parameters.
    816 */
    817void __init omap_pm_setup_sr_i2c_pcb_length(u32 mm)
    818{
    819	sr_i2c_pcb_length = mm;
    820}
    821#endif
    822
    823void __init omap_vc_init_channel(struct voltagedomain *voltdm)
    824{
    825	struct omap_vc_channel *vc = voltdm->vc;
    826	u8 on_vsel, onlp_vsel, ret_vsel, off_vsel;
    827	u32 val;
    828
    829	if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) {
    830		pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name);
    831		return;
    832	}
    833
    834	if (!voltdm->read || !voltdm->write) {
    835		pr_err("%s: No read/write API for accessing vdd_%s regs\n",
    836			__func__, voltdm->name);
    837		return;
    838	}
    839
    840	vc->cfg_channel = 0;
    841	if (vc->flags & OMAP_VC_CHANNEL_CFG_MUTANT)
    842		vc_cfg_bits = &vc_mutant_channel_cfg;
    843	else
    844		vc_cfg_bits = &vc_default_channel_cfg;
    845
    846	/* get PMIC/board specific settings */
    847	vc->i2c_slave_addr = voltdm->pmic->i2c_slave_addr;
    848	vc->volt_reg_addr = voltdm->pmic->volt_reg_addr;
    849	vc->cmd_reg_addr = voltdm->pmic->cmd_reg_addr;
    850
    851	/* Configure the i2c slave address for this VC */
    852	voltdm->rmw(vc->smps_sa_mask,
    853		    vc->i2c_slave_addr << __ffs(vc->smps_sa_mask),
    854		    vc->smps_sa_reg);
    855	vc->cfg_channel |= vc_cfg_bits->sa;
    856
    857	/*
    858	 * Configure the PMIC register addresses.
    859	 */
    860	voltdm->rmw(vc->smps_volra_mask,
    861		    vc->volt_reg_addr << __ffs(vc->smps_volra_mask),
    862		    vc->smps_volra_reg);
    863	vc->cfg_channel |= vc_cfg_bits->rav;
    864
    865	if (vc->cmd_reg_addr) {
    866		voltdm->rmw(vc->smps_cmdra_mask,
    867			    vc->cmd_reg_addr << __ffs(vc->smps_cmdra_mask),
    868			    vc->smps_cmdra_reg);
    869		vc->cfg_channel |= vc_cfg_bits->rac;
    870	}
    871
    872	if (vc->cmd_reg_addr == vc->volt_reg_addr)
    873		vc->cfg_channel |= vc_cfg_bits->racen;
    874
    875	/* Set up the on, inactive, retention and off voltage */
    876	on_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->on);
    877	onlp_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->onlp);
    878	ret_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->ret);
    879	off_vsel = omap_vc_calc_vsel(voltdm, voltdm->vc_param->off);
    880
    881	val = ((on_vsel << vc->common->cmd_on_shift) |
    882	       (onlp_vsel << vc->common->cmd_onlp_shift) |
    883	       (ret_vsel << vc->common->cmd_ret_shift) |
    884	       (off_vsel << vc->common->cmd_off_shift));
    885	voltdm->write(val, vc->cmdval_reg);
    886	vc->cfg_channel |= vc_cfg_bits->cmd;
    887
    888	/* Channel configuration */
    889	omap_vc_config_channel(voltdm);
    890
    891	omap_vc_i2c_init(voltdm);
    892
    893	if (cpu_is_omap34xx())
    894		omap3_vc_init_channel(voltdm);
    895	else if (cpu_is_omap44xx())
    896		omap4_vc_init_channel(voltdm);
    897}
    898