voltagedomains44xx_data.c (3380B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * OMAP3/OMAP4 Voltage Management Routines 4 * 5 * Author: Thara Gopinath <thara@ti.com> 6 * 7 * Copyright (C) 2007 Texas Instruments, Inc. 8 * Rajendra Nayak <rnayak@ti.com> 9 * Lesly A M <x0080970@ti.com> 10 * 11 * Copyright (C) 2008 Nokia Corporation 12 * Kalle Jokiniemi 13 * 14 * Copyright (C) 2010 Texas Instruments, Inc. 15 * Thara Gopinath <thara@ti.com> 16 */ 17#include <linux/kernel.h> 18#include <linux/err.h> 19#include <linux/init.h> 20 21#include "common.h" 22#include "soc.h" 23#include "prm-regbits-44xx.h" 24#include "prm44xx.h" 25#include "prcm44xx.h" 26#include "prminst44xx.h" 27#include "voltage.h" 28#include "omap_opp_data.h" 29#include "vc.h" 30#include "vp.h" 31 32static const struct omap_vfsm_instance omap4_vdd_mpu_vfsm = { 33 .voltsetup_reg = OMAP4_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET, 34 .voltsetup_off_reg = OMAP4_PRM_VOLTSETUP_MPU_OFF_OFFSET, 35}; 36 37static const struct omap_vfsm_instance omap4_vdd_iva_vfsm = { 38 .voltsetup_reg = OMAP4_PRM_VOLTSETUP_IVA_RET_SLEEP_OFFSET, 39 .voltsetup_off_reg = OMAP4_PRM_VOLTSETUP_IVA_OFF_OFFSET, 40}; 41 42static const struct omap_vfsm_instance omap4_vdd_core_vfsm = { 43 .voltsetup_reg = OMAP4_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET, 44 .voltsetup_off_reg = OMAP4_PRM_VOLTSETUP_CORE_OFF_OFFSET, 45}; 46 47static struct voltagedomain omap4_voltdm_mpu = { 48 .name = "mpu", 49 .scalable = true, 50 .read = omap4_prm_vcvp_read, 51 .write = omap4_prm_vcvp_write, 52 .rmw = omap4_prm_vcvp_rmw, 53 .vc = &omap4_vc_mpu, 54 .vfsm = &omap4_vdd_mpu_vfsm, 55 .vp = &omap4_vp_mpu, 56}; 57 58static struct voltagedomain omap4_voltdm_iva = { 59 .name = "iva", 60 .scalable = true, 61 .read = omap4_prm_vcvp_read, 62 .write = omap4_prm_vcvp_write, 63 .rmw = omap4_prm_vcvp_rmw, 64 .vc = &omap4_vc_iva, 65 .vfsm = &omap4_vdd_iva_vfsm, 66 .vp = &omap4_vp_iva, 67}; 68 69static struct voltagedomain omap4_voltdm_core = { 70 .name = "core", 71 .scalable = true, 72 .read = omap4_prm_vcvp_read, 73 .write = omap4_prm_vcvp_write, 74 .rmw = omap4_prm_vcvp_rmw, 75 .vc = &omap4_vc_core, 76 .vfsm = &omap4_vdd_core_vfsm, 77 .vp = &omap4_vp_core, 78}; 79 80static struct voltagedomain omap4_voltdm_wkup = { 81 .name = "wakeup", 82}; 83 84static struct voltagedomain *voltagedomains_omap4[] __initdata = { 85 &omap4_voltdm_mpu, 86 &omap4_voltdm_iva, 87 &omap4_voltdm_core, 88 &omap4_voltdm_wkup, 89 NULL, 90}; 91 92static const char *const sys_clk_name __initconst = "sys_clkin_ck"; 93 94void __init omap44xx_voltagedomains_init(void) 95{ 96 struct voltagedomain *voltdm; 97 int i; 98 99 /* 100 * XXX Will depend on the process, validation, and binning 101 * for the currently-running IC 102 */ 103#ifdef CONFIG_PM_OPP 104 if (cpu_is_omap443x()) { 105 omap4_voltdm_mpu.volt_data = omap443x_vdd_mpu_volt_data; 106 omap4_voltdm_iva.volt_data = omap443x_vdd_iva_volt_data; 107 omap4_voltdm_core.volt_data = omap443x_vdd_core_volt_data; 108 } else if (cpu_is_omap446x()) { 109 omap4_voltdm_mpu.volt_data = omap446x_vdd_mpu_volt_data; 110 omap4_voltdm_iva.volt_data = omap446x_vdd_iva_volt_data; 111 omap4_voltdm_core.volt_data = omap446x_vdd_core_volt_data; 112 } 113#endif 114 115 omap4_voltdm_mpu.vp_param = &omap4_mpu_vp_data; 116 omap4_voltdm_iva.vp_param = &omap4_iva_vp_data; 117 omap4_voltdm_core.vp_param = &omap4_core_vp_data; 118 119 omap4_voltdm_mpu.vc_param = &omap4_mpu_vc_data; 120 omap4_voltdm_iva.vc_param = &omap4_iva_vc_data; 121 omap4_voltdm_core.vc_param = &omap4_core_vc_data; 122 123 for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) 124 voltdm->sys_clk.name = sys_clk_name; 125 126 voltdm_init(voltagedomains_omap4); 127};