162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * OMAP4 Voltage Controller (VC) data
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2007, 2010 Texas Instruments, Inc.
662306a36Sopenharmony_ci * Rajendra Nayak <rnayak@ti.com>
762306a36Sopenharmony_ci * Lesly A M <x0080970@ti.com>
862306a36Sopenharmony_ci * Thara Gopinath <thara@ti.com>
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Copyright (C) 2008, 2011 Nokia Corporation
1162306a36Sopenharmony_ci * Kalle Jokiniemi
1262306a36Sopenharmony_ci * Paul Walmsley
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#include <linux/io.h>
1562306a36Sopenharmony_ci#include <linux/err.h>
1662306a36Sopenharmony_ci#include <linux/init.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "common.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "prm44xx.h"
2162306a36Sopenharmony_ci#include "prm-regbits-44xx.h"
2262306a36Sopenharmony_ci#include "voltage.h"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include "vc.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * VC data common to 44xx chips
2862306a36Sopenharmony_ci * XXX This stuff presumably belongs in the vc3xxx.c or vc.c file.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_cistatic const struct omap_vc_common omap4_vc_common = {
3162306a36Sopenharmony_ci	.bypass_val_reg = OMAP4_PRM_VC_VAL_BYPASS_OFFSET,
3262306a36Sopenharmony_ci	.data_shift = OMAP4430_DATA_SHIFT,
3362306a36Sopenharmony_ci	.slaveaddr_shift = OMAP4430_SLAVEADDR_SHIFT,
3462306a36Sopenharmony_ci	.regaddr_shift = OMAP4430_REGADDR_SHIFT,
3562306a36Sopenharmony_ci	.valid = OMAP4430_VALID_MASK,
3662306a36Sopenharmony_ci	.cmd_on_shift = OMAP4430_ON_SHIFT,
3762306a36Sopenharmony_ci	.cmd_on_mask = OMAP4430_ON_MASK,
3862306a36Sopenharmony_ci	.cmd_onlp_shift = OMAP4430_ONLP_SHIFT,
3962306a36Sopenharmony_ci	.cmd_ret_shift = OMAP4430_RET_SHIFT,
4062306a36Sopenharmony_ci	.cmd_off_shift = OMAP4430_OFF_SHIFT,
4162306a36Sopenharmony_ci	.i2c_cfg_reg = OMAP4_PRM_VC_CFG_I2C_MODE_OFFSET,
4262306a36Sopenharmony_ci	.i2c_cfg_clear_mask = OMAP4430_SRMODEEN_MASK | OMAP4430_HSMODEEN_MASK,
4362306a36Sopenharmony_ci	.i2c_cfg_hsen_mask = OMAP4430_HSMODEEN_MASK,
4462306a36Sopenharmony_ci	.i2c_mcode_mask	 = OMAP4430_HSMCODE_MASK,
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* VC instance data for each controllable voltage line */
4862306a36Sopenharmony_cistruct omap_vc_channel omap4_vc_mpu = {
4962306a36Sopenharmony_ci	.flags = OMAP_VC_CHANNEL_DEFAULT | OMAP_VC_CHANNEL_CFG_MUTANT,
5062306a36Sopenharmony_ci	.common = &omap4_vc_common,
5162306a36Sopenharmony_ci	.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
5262306a36Sopenharmony_ci	.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
5362306a36Sopenharmony_ci	.smps_cmdra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET,
5462306a36Sopenharmony_ci	.cfg_channel_reg = OMAP4_PRM_VC_CFG_CHANNEL_OFFSET,
5562306a36Sopenharmony_ci	.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET,
5662306a36Sopenharmony_ci	.smps_sa_mask = OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK,
5762306a36Sopenharmony_ci	.smps_volra_mask = OMAP4430_VOLRA_VDD_MPU_L_MASK,
5862306a36Sopenharmony_ci	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_MPU_L_MASK,
5962306a36Sopenharmony_ci	.cfg_channel_sa_shift = OMAP4430_SA_VDD_MPU_L_SHIFT,
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistruct omap_vc_channel omap4_vc_iva = {
6362306a36Sopenharmony_ci	.common = &omap4_vc_common,
6462306a36Sopenharmony_ci	.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
6562306a36Sopenharmony_ci	.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
6662306a36Sopenharmony_ci	.smps_cmdra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET,
6762306a36Sopenharmony_ci	.cfg_channel_reg = OMAP4_PRM_VC_CFG_CHANNEL_OFFSET,
6862306a36Sopenharmony_ci	.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_IVA_L_OFFSET,
6962306a36Sopenharmony_ci	.smps_sa_mask = OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK,
7062306a36Sopenharmony_ci	.smps_volra_mask = OMAP4430_VOLRA_VDD_IVA_L_MASK,
7162306a36Sopenharmony_ci	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_IVA_L_MASK,
7262306a36Sopenharmony_ci	.cfg_channel_sa_shift = OMAP4430_SA_VDD_IVA_L_SHIFT,
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct omap_vc_channel omap4_vc_core = {
7662306a36Sopenharmony_ci	.common = &omap4_vc_common,
7762306a36Sopenharmony_ci	.smps_sa_reg = OMAP4_PRM_VC_SMPS_SA_OFFSET,
7862306a36Sopenharmony_ci	.smps_volra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_VOL_OFFSET,
7962306a36Sopenharmony_ci	.smps_cmdra_reg = OMAP4_PRM_VC_VAL_SMPS_RA_CMD_OFFSET,
8062306a36Sopenharmony_ci	.cfg_channel_reg = OMAP4_PRM_VC_CFG_CHANNEL_OFFSET,
8162306a36Sopenharmony_ci	.cmdval_reg = OMAP4_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET,
8262306a36Sopenharmony_ci	.smps_sa_mask = OMAP4430_SA_VDD_CORE_L_0_6_MASK,
8362306a36Sopenharmony_ci	.smps_volra_mask = OMAP4430_VOLRA_VDD_CORE_L_MASK,
8462306a36Sopenharmony_ci	.smps_cmdra_mask = OMAP4430_CMDRA_VDD_CORE_L_MASK,
8562306a36Sopenharmony_ci	.cfg_channel_sa_shift = OMAP4430_SA_VDD_CORE_L_SHIFT,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/*
8962306a36Sopenharmony_ci * Voltage levels for different operating modes: on, sleep, retention and off
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_ci#define OMAP4_ON_VOLTAGE_UV			1375000
9262306a36Sopenharmony_ci#define OMAP4_ONLP_VOLTAGE_UV			1375000
9362306a36Sopenharmony_ci#define OMAP4_RET_VOLTAGE_UV			837500
9462306a36Sopenharmony_ci#define OMAP4_OFF_VOLTAGE_UV			0
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistruct omap_vc_param omap4_mpu_vc_data = {
9762306a36Sopenharmony_ci	.on			= OMAP4_ON_VOLTAGE_UV,
9862306a36Sopenharmony_ci	.onlp			= OMAP4_ONLP_VOLTAGE_UV,
9962306a36Sopenharmony_ci	.ret			= OMAP4_RET_VOLTAGE_UV,
10062306a36Sopenharmony_ci	.off			= OMAP4_OFF_VOLTAGE_UV,
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct omap_vc_param omap4_iva_vc_data = {
10462306a36Sopenharmony_ci	.on			= OMAP4_ON_VOLTAGE_UV,
10562306a36Sopenharmony_ci	.onlp			= OMAP4_ONLP_VOLTAGE_UV,
10662306a36Sopenharmony_ci	.ret			= OMAP4_RET_VOLTAGE_UV,
10762306a36Sopenharmony_ci	.off			= OMAP4_OFF_VOLTAGE_UV,
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct omap_vc_param omap4_core_vc_data = {
11162306a36Sopenharmony_ci	.on			= OMAP4_ON_VOLTAGE_UV,
11262306a36Sopenharmony_ci	.onlp			= OMAP4_ONLP_VOLTAGE_UV,
11362306a36Sopenharmony_ci	.ret			= OMAP4_RET_VOLTAGE_UV,
11462306a36Sopenharmony_ci	.off			= OMAP4_OFF_VOLTAGE_UV,
11562306a36Sopenharmony_ci};
116