1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * OMAP3/4 Voltage Processor (VP) structure and macro definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2007, 2010 Texas Instruments, Inc. 6*4882a593Smuzhiyun * Rajendra Nayak <rnayak@ti.com> 7*4882a593Smuzhiyun * Lesly A M <x0080970@ti.com> 8*4882a593Smuzhiyun * Thara Gopinath <thara@ti.com> 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Copyright (C) 2008, 2011 Nokia Corporation 11*4882a593Smuzhiyun * Kalle Jokiniemi 12*4882a593Smuzhiyun * Paul Walmsley 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #ifndef __ARCH_ARM_MACH_OMAP2_VP_H 15*4882a593Smuzhiyun #define __ARCH_ARM_MACH_OMAP2_VP_H 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/kernel.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct voltagedomain; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* XXX document */ 22*4882a593Smuzhiyun #define VP_IDLE_TIMEOUT 200 23*4882a593Smuzhiyun #define VP_TRANXDONE_TIMEOUT 300 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /** 26*4882a593Smuzhiyun * struct omap_vp_ops - per-VP operations 27*4882a593Smuzhiyun * @check_txdone: check for VP transaction done 28*4882a593Smuzhiyun * @clear_txdone: clear VP transaction done status 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun struct omap_vp_ops { 31*4882a593Smuzhiyun u32 (*check_txdone)(u8 vp_id); 32*4882a593Smuzhiyun void (*clear_txdone)(u8 vp_id); 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /** 36*4882a593Smuzhiyun * struct omap_vp_common - register data common to all VDDs 37*4882a593Smuzhiyun * @vpconfig_erroroffset_mask: ERROROFFSET bitmask in the PRM_VP*_CONFIG reg 38*4882a593Smuzhiyun * @vpconfig_errorgain_mask: ERRORGAIN bitmask in the PRM_VP*_CONFIG reg 39*4882a593Smuzhiyun * @vpconfig_initvoltage_mask: INITVOLTAGE bitmask in the PRM_VP*_CONFIG reg 40*4882a593Smuzhiyun * @vpconfig_timeouten: TIMEOUT bitmask in the PRM_VP*_CONFIG reg 41*4882a593Smuzhiyun * @vpconfig_initvdd: INITVDD bitmask in the PRM_VP*_CONFIG reg 42*4882a593Smuzhiyun * @vpconfig_forceupdate: FORCEUPDATE bitmask in the PRM_VP*_CONFIG reg 43*4882a593Smuzhiyun * @vpconfig_vpenable: VPENABLE bitmask in the PRM_VP*_CONFIG reg 44*4882a593Smuzhiyun * @vpconfig_erroroffset_shift: ERROROFFSET field shift in PRM_VP*_CONFIG reg 45*4882a593Smuzhiyun * @vpconfig_errorgain_shift: ERRORGAIN field shift in PRM_VP*_CONFIG reg 46*4882a593Smuzhiyun * @vpconfig_initvoltage_shift: INITVOLTAGE field shift in PRM_VP*_CONFIG reg 47*4882a593Smuzhiyun * @vstepmin_stepmin_shift: VSTEPMIN field shift in the PRM_VP*_VSTEPMIN reg 48*4882a593Smuzhiyun * @vstepmin_smpswaittimemin_shift: SMPSWAITTIMEMIN field shift in PRM_VP*_VSTEPMIN reg 49*4882a593Smuzhiyun * @vstepmax_stepmax_shift: VSTEPMAX field shift in the PRM_VP*_VSTEPMAX reg 50*4882a593Smuzhiyun * @vstepmax_smpswaittimemax_shift: SMPSWAITTIMEMAX field shift in PRM_VP*_VSTEPMAX reg 51*4882a593Smuzhiyun * @vlimitto_vddmin_shift: VDDMIN field shift in PRM_VP*_VLIMITTO reg 52*4882a593Smuzhiyun * @vlimitto_vddmax_shift: VDDMAX field shift in PRM_VP*_VLIMITTO reg 53*4882a593Smuzhiyun * @vlimitto_timeout_shift: TIMEOUT field shift in PRM_VP*_VLIMITTO reg 54*4882a593Smuzhiyun * @vpvoltage_mask: VPVOLTAGE field mask in PRM_VP*_VOLTAGE reg 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct omap_vp_common { 57*4882a593Smuzhiyun u32 vpconfig_erroroffset_mask; 58*4882a593Smuzhiyun u32 vpconfig_errorgain_mask; 59*4882a593Smuzhiyun u32 vpconfig_initvoltage_mask; 60*4882a593Smuzhiyun u8 vpconfig_timeouten; 61*4882a593Smuzhiyun u8 vpconfig_initvdd; 62*4882a593Smuzhiyun u8 vpconfig_forceupdate; 63*4882a593Smuzhiyun u8 vpconfig_vpenable; 64*4882a593Smuzhiyun u8 vstepmin_stepmin_shift; 65*4882a593Smuzhiyun u8 vstepmin_smpswaittimemin_shift; 66*4882a593Smuzhiyun u8 vstepmax_stepmax_shift; 67*4882a593Smuzhiyun u8 vstepmax_smpswaittimemax_shift; 68*4882a593Smuzhiyun u8 vlimitto_vddmin_shift; 69*4882a593Smuzhiyun u8 vlimitto_vddmax_shift; 70*4882a593Smuzhiyun u8 vlimitto_timeout_shift; 71*4882a593Smuzhiyun u8 vpvoltage_mask; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun const struct omap_vp_ops *ops; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /** 77*4882a593Smuzhiyun * struct omap_vp_instance - VP register offsets (per-VDD) 78*4882a593Smuzhiyun * @common: pointer to struct omap_vp_common * for this SoC 79*4882a593Smuzhiyun * @vpconfig: PRM_VP*_CONFIG reg offset from PRM start 80*4882a593Smuzhiyun * @vstepmin: PRM_VP*_VSTEPMIN reg offset from PRM start 81*4882a593Smuzhiyun * @vlimitto: PRM_VP*_VLIMITTO reg offset from PRM start 82*4882a593Smuzhiyun * @vstatus: PRM_VP*_VSTATUS reg offset from PRM start 83*4882a593Smuzhiyun * @voltage: PRM_VP*_VOLTAGE reg offset from PRM start 84*4882a593Smuzhiyun * @id: Unique identifier for VP instance. 85*4882a593Smuzhiyun * @enabled: flag to keep track of whether vp is enabled or not 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * XXX vp_common is probably not needed since it is per-SoC 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun struct omap_vp_instance { 90*4882a593Smuzhiyun const struct omap_vp_common *common; 91*4882a593Smuzhiyun u8 vpconfig; 92*4882a593Smuzhiyun u8 vstepmin; 93*4882a593Smuzhiyun u8 vstepmax; 94*4882a593Smuzhiyun u8 vlimitto; 95*4882a593Smuzhiyun u8 vstatus; 96*4882a593Smuzhiyun u8 voltage; 97*4882a593Smuzhiyun u8 id; 98*4882a593Smuzhiyun bool enabled; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun extern struct omap_vp_instance omap3_vp_mpu; 102*4882a593Smuzhiyun extern struct omap_vp_instance omap3_vp_core; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun extern struct omap_vp_instance omap4_vp_mpu; 105*4882a593Smuzhiyun extern struct omap_vp_instance omap4_vp_iva; 106*4882a593Smuzhiyun extern struct omap_vp_instance omap4_vp_core; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun extern struct omap_vp_param omap3_mpu_vp_data; 109*4882a593Smuzhiyun extern struct omap_vp_param omap3_core_vp_data; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun extern struct omap_vp_param omap4_mpu_vp_data; 112*4882a593Smuzhiyun extern struct omap_vp_param omap4_iva_vp_data; 113*4882a593Smuzhiyun extern struct omap_vp_param omap4_core_vp_data; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun void omap_vp_init(struct voltagedomain *voltdm); 116*4882a593Smuzhiyun void omap_vp_enable(struct voltagedomain *voltdm); 117*4882a593Smuzhiyun void omap_vp_disable(struct voltagedomain *voltdm); 118*4882a593Smuzhiyun int omap_vp_forceupdate_scale(struct voltagedomain *voltdm, 119*4882a593Smuzhiyun unsigned long target_volt); 120*4882a593Smuzhiyun int omap_vp_update_errorgain(struct voltagedomain *voltdm, 121*4882a593Smuzhiyun unsigned long target_volt); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #endif 124