1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2c0718df4SPaul Walmsley /* 3c0718df4SPaul Walmsley * OMAP3/4 Voltage Processor (VP) structure and macro definitions 4c0718df4SPaul Walmsley * 5c0718df4SPaul Walmsley * Copyright (C) 2007, 2010 Texas Instruments, Inc. 6c0718df4SPaul Walmsley * Rajendra Nayak <rnayak@ti.com> 7c0718df4SPaul Walmsley * Lesly A M <x0080970@ti.com> 8c0718df4SPaul Walmsley * Thara Gopinath <thara@ti.com> 9c0718df4SPaul Walmsley * 10c0718df4SPaul Walmsley * Copyright (C) 2008, 2011 Nokia Corporation 11c0718df4SPaul Walmsley * Kalle Jokiniemi 12c0718df4SPaul Walmsley * Paul Walmsley 13c0718df4SPaul Walmsley */ 14c0718df4SPaul Walmsley #ifndef __ARCH_ARM_MACH_OMAP2_VP_H 15c0718df4SPaul Walmsley #define __ARCH_ARM_MACH_OMAP2_VP_H 16c0718df4SPaul Walmsley 17c0718df4SPaul Walmsley #include <linux/kernel.h> 18c0718df4SPaul Walmsley 1901f48d30SKevin Hilman struct voltagedomain; 2001f48d30SKevin Hilman 21c0718df4SPaul Walmsley /* XXX document */ 22c0718df4SPaul Walmsley #define VP_IDLE_TIMEOUT 200 23c0718df4SPaul Walmsley #define VP_TRANXDONE_TIMEOUT 300 24c0718df4SPaul Walmsley 2558aaa599SKevin Hilman /** 2658aaa599SKevin Hilman * struct omap_vp_ops - per-VP operations 2758aaa599SKevin Hilman * @check_txdone: check for VP transaction done 2858aaa599SKevin Hilman * @clear_txdone: clear VP transaction done status 2958aaa599SKevin Hilman */ 3058aaa599SKevin Hilman struct omap_vp_ops { 3158aaa599SKevin Hilman u32 (*check_txdone)(u8 vp_id); 3258aaa599SKevin Hilman void (*clear_txdone)(u8 vp_id); 3358aaa599SKevin Hilman }; 34c0718df4SPaul Walmsley 35c0718df4SPaul Walmsley /** 36b7ea803eSKevin Hilman * struct omap_vp_common - register data common to all VDDs 370ec3041eSKevin Hilman * @vpconfig_erroroffset_mask: ERROROFFSET bitmask in the PRM_VP*_CONFIG reg 38c0718df4SPaul Walmsley * @vpconfig_errorgain_mask: ERRORGAIN bitmask in the PRM_VP*_CONFIG reg 39c0718df4SPaul Walmsley * @vpconfig_initvoltage_mask: INITVOLTAGE bitmask in the PRM_VP*_CONFIG reg 400ec3041eSKevin Hilman * @vpconfig_timeouten: TIMEOUT bitmask in the PRM_VP*_CONFIG reg 41c0718df4SPaul Walmsley * @vpconfig_initvdd: INITVDD bitmask in the PRM_VP*_CONFIG reg 42c0718df4SPaul Walmsley * @vpconfig_forceupdate: FORCEUPDATE bitmask in the PRM_VP*_CONFIG reg 43c0718df4SPaul Walmsley * @vpconfig_vpenable: VPENABLE bitmask in the PRM_VP*_CONFIG reg 44c0718df4SPaul Walmsley * @vpconfig_erroroffset_shift: ERROROFFSET field shift in PRM_VP*_CONFIG reg 45c0718df4SPaul Walmsley * @vpconfig_errorgain_shift: ERRORGAIN field shift in PRM_VP*_CONFIG reg 46c0718df4SPaul Walmsley * @vpconfig_initvoltage_shift: INITVOLTAGE field shift in PRM_VP*_CONFIG reg 470ec3041eSKevin Hilman * @vstepmin_stepmin_shift: VSTEPMIN field shift in the PRM_VP*_VSTEPMIN reg 480ec3041eSKevin Hilman * @vstepmin_smpswaittimemin_shift: SMPSWAITTIMEMIN field shift in PRM_VP*_VSTEPMIN reg 490ec3041eSKevin Hilman * @vstepmax_stepmax_shift: VSTEPMAX field shift in the PRM_VP*_VSTEPMAX reg 500ec3041eSKevin Hilman * @vstepmax_smpswaittimemax_shift: SMPSWAITTIMEMAX field shift in PRM_VP*_VSTEPMAX reg 510ec3041eSKevin Hilman * @vlimitto_vddmin_shift: VDDMIN field shift in PRM_VP*_VLIMITTO reg 520ec3041eSKevin Hilman * @vlimitto_vddmax_shift: VDDMAX field shift in PRM_VP*_VLIMITTO reg 530ec3041eSKevin Hilman * @vlimitto_timeout_shift: TIMEOUT field shift in PRM_VP*_VLIMITTO reg 54bea30ed6STodd Poynor * @vpvoltage_mask: VPVOLTAGE field mask in PRM_VP*_VOLTAGE reg 55c0718df4SPaul Walmsley */ 56b7ea803eSKevin Hilman struct omap_vp_common { 570ec3041eSKevin Hilman u32 vpconfig_erroroffset_mask; 58c0718df4SPaul Walmsley u32 vpconfig_errorgain_mask; 59c0718df4SPaul Walmsley u32 vpconfig_initvoltage_mask; 600ec3041eSKevin Hilman u8 vpconfig_timeouten; 610ec3041eSKevin Hilman u8 vpconfig_initvdd; 620ec3041eSKevin Hilman u8 vpconfig_forceupdate; 630ec3041eSKevin Hilman u8 vpconfig_vpenable; 64c0718df4SPaul Walmsley u8 vstepmin_stepmin_shift; 65c0718df4SPaul Walmsley u8 vstepmin_smpswaittimemin_shift; 66c0718df4SPaul Walmsley u8 vstepmax_stepmax_shift; 67c0718df4SPaul Walmsley u8 vstepmax_smpswaittimemax_shift; 68c0718df4SPaul Walmsley u8 vlimitto_vddmin_shift; 69c0718df4SPaul Walmsley u8 vlimitto_vddmax_shift; 70c0718df4SPaul Walmsley u8 vlimitto_timeout_shift; 71bea30ed6STodd Poynor u8 vpvoltage_mask; 72c0718df4SPaul Walmsley 7358aaa599SKevin Hilman const struct omap_vp_ops *ops; 74c0718df4SPaul Walmsley }; 75c0718df4SPaul Walmsley 76c0718df4SPaul Walmsley /** 77b7ea803eSKevin Hilman * struct omap_vp_instance - VP register offsets (per-VDD) 78b7ea803eSKevin Hilman * @common: pointer to struct omap_vp_common * for this SoC 79c0718df4SPaul Walmsley * @vpconfig: PRM_VP*_CONFIG reg offset from PRM start 80c0718df4SPaul Walmsley * @vstepmin: PRM_VP*_VSTEPMIN reg offset from PRM start 81c0718df4SPaul Walmsley * @vlimitto: PRM_VP*_VLIMITTO reg offset from PRM start 82c0718df4SPaul Walmsley * @vstatus: PRM_VP*_VSTATUS reg offset from PRM start 83c0718df4SPaul Walmsley * @voltage: PRM_VP*_VOLTAGE reg offset from PRM start 8458aaa599SKevin Hilman * @id: Unique identifier for VP instance. 85b7ea803eSKevin Hilman * @enabled: flag to keep track of whether vp is enabled or not 86c0718df4SPaul Walmsley * 87c0718df4SPaul Walmsley * XXX vp_common is probably not needed since it is per-SoC 88c0718df4SPaul Walmsley */ 89b7ea803eSKevin Hilman struct omap_vp_instance { 90b7ea803eSKevin Hilman const struct omap_vp_common *common; 91c0718df4SPaul Walmsley u8 vpconfig; 92c0718df4SPaul Walmsley u8 vstepmin; 93c0718df4SPaul Walmsley u8 vstepmax; 94c0718df4SPaul Walmsley u8 vlimitto; 95c0718df4SPaul Walmsley u8 vstatus; 96c0718df4SPaul Walmsley u8 voltage; 9758aaa599SKevin Hilman u8 id; 98b7ea803eSKevin Hilman bool enabled; 99c0718df4SPaul Walmsley }; 100c0718df4SPaul Walmsley 101b7ea803eSKevin Hilman extern struct omap_vp_instance omap3_vp_mpu; 102b7ea803eSKevin Hilman extern struct omap_vp_instance omap3_vp_core; 103c0718df4SPaul Walmsley 104b7ea803eSKevin Hilman extern struct omap_vp_instance omap4_vp_mpu; 105b7ea803eSKevin Hilman extern struct omap_vp_instance omap4_vp_iva; 106b7ea803eSKevin Hilman extern struct omap_vp_instance omap4_vp_core; 107c0718df4SPaul Walmsley 1088b5d8c0dSTero Kristo extern struct omap_vp_param omap3_mpu_vp_data; 1098b5d8c0dSTero Kristo extern struct omap_vp_param omap3_core_vp_data; 1108b5d8c0dSTero Kristo 1118b5d8c0dSTero Kristo extern struct omap_vp_param omap4_mpu_vp_data; 1128b5d8c0dSTero Kristo extern struct omap_vp_param omap4_iva_vp_data; 1138b5d8c0dSTero Kristo extern struct omap_vp_param omap4_core_vp_data; 1148b5d8c0dSTero Kristo 11501f48d30SKevin Hilman void omap_vp_init(struct voltagedomain *voltdm); 11601f48d30SKevin Hilman void omap_vp_enable(struct voltagedomain *voltdm); 11701f48d30SKevin Hilman void omap_vp_disable(struct voltagedomain *voltdm); 11801f48d30SKevin Hilman int omap_vp_forceupdate_scale(struct voltagedomain *voltdm, 11901f48d30SKevin Hilman unsigned long target_volt); 12076ea7424SKevin Hilman int omap_vp_update_errorgain(struct voltagedomain *voltdm, 12176ea7424SKevin Hilman unsigned long target_volt); 12201f48d30SKevin Hilman 123c0718df4SPaul Walmsley #endif 124