/*
 * Copyright (c) 2018-2020 Atmosphère-NX
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
#ifndef FUSEE_PMC_H
#define FUSEE_PMC_H

#include <stdint.h>

#define PMC_BASE 0x7000E400
#define MAKE_PMC_REG(n) MAKE_REG32(PMC_BASE + n)

#define PMC_CONTROL_SDMMC1      (1 << 12)
#define PMC_CONTROL_SDMMC3      (1 << 13)
#define PMC_CONTROL_SDMMC4      (1 << 14)

#define APBDEV_PMC_CONTROL MAKE_PMC_REG(0x00)
#define APBDEV_PM_0 MAKE_PMC_REG(0x14)
#define APBDEV_PMC_DPD_ENABLE_0 MAKE_PMC_REG(0x24)
#define APBDEV_PMC_PWRGATE_TOGGLE_0 MAKE_PMC_REG(0x30)
#define APBDEV_PMC_PWRGATE_STATUS_0 MAKE_PMC_REG(0x38)
#define APBDEV_PMC_NO_IOPOWER_0 MAKE_PMC_REG(0x44)
#define APBDEV_PMC_SCRATCH0_0 MAKE_PMC_REG(0x50)
#define APBDEV_PMC_SCRATCH1_0 MAKE_PMC_REG(0x54)
#define APBDEV_PMC_SCRATCH20_0 MAKE_PMC_REG(0xA0)
#define APBDEV_PMC_PWR_DET_VAL_0 MAKE_PMC_REG(0xE4)
#define APBDEV_PMC_DDR_PWR_0 MAKE_PMC_REG(0xE8)
#define APBDEV_PMC_CRYPTO_OP_0 MAKE_PMC_REG(0xF4)
#define APBDEV_PMC_WAKE2_STATUS_0 MAKE_PMC_REG(0x168)
#define APBDEV_PMC_OSC_EDPD_OVER_0 MAKE_PMC_REG(0x1A4)
#define APBDEV_PMC_RST_STATUS_0 MAKE_PMC_REG(0x1B4)
#define APBDEV_PMC_IO_DPD_REQ_0 MAKE_PMC_REG(0x1B8)
#define APBDEV_PMC_IO_DPD2_REQ_0 MAKE_PMC_REG(0x1C0)
#define APBDEV_PMC_VDDP_SEL_0 MAKE_PMC_REG(0x1CC)
#define APBDEV_PMC_SCRATCH49_0 MAKE_PMC_REG(0x244)
#define APBDEV_PMC_TSC_MULT_0 MAKE_PMC_REG(0x2B4)
#define APBDEV_PMC_REG_SHORT_0 MAKE_PMC_REG(0x2CC)
#define APBDEV_PMC_WEAK_BIAS_0 MAKE_PMC_REG(0x2C8)
#define APBDEV_PMC_SECURE_SCRATCH21_0 MAKE_PMC_REG(0x334)
#define APBDEV_PMC_SECURE_SCRATCH32_0 MAKE_PMC_REG(0x360)
#define APBDEV_PMC_SECURE_SCRATCH49_0 MAKE_PMC_REG(0x3A4)
#define APBDEV_PMC_CNTRL2_0 MAKE_PMC_REG(0x440)
#define APBDEV_PMC_IO_DPD4_REQ_0 MAKE_PMC_REG(0x464)
#define APBDEV_PMC_UTMIP_PAD_CFG1_0 MAKE_PMC_REG(0x4C4)
#define APBDEV_PMC_UTMIP_PAD_CFG3_0 MAKE_PMC_REG(0x4CC)
#define APBDEV_PMC_DDR_CNTRL_0 MAKE_PMC_REG(0x4E4)
#define APBDEV_PMC_SCRATCH43_0 MAKE_PMC_REG(0x22C)
#define APBDEV_PMC_SCRATCH188_0 MAKE_PMC_REG(0x810)
#define APBDEV_PMC_SCRATCH190_0 MAKE_PMC_REG(0x818)
#define APBDEV_PMC_SCRATCH200_0 MAKE_PMC_REG(0x840)

#define APBDEV_PMC_SCRATCH45_0 MAKE_PMC_REG(0x234)
#define APBDEV_PMC_SCRATCH46_0 MAKE_PMC_REG(0x238)
#define APBDEV_PMC_SCRATCH33_0 MAKE_PMC_REG(0x120)
#define APBDEV_PMC_SCRATCH40_0 MAKE_PMC_REG(0x13C)

typedef struct {
    uint32_t cntrl;
    uint32_t sec_disable;
    uint32_t pmc_swrst;
    uint32_t wake_mask;
    uint32_t wake_lvl;
    uint32_t wake_status;
    uint32_t sw_wake_status;
    uint32_t dpd_pads_oride;
    uint32_t dpd_sample;
    uint32_t dpd_enable;
    uint32_t pwrgate_timer_off;
    uint32_t clamp_status;
    uint32_t pwrgate_toggle;
    uint32_t remove_clamping;
    uint32_t pwrgate_status;
    uint32_t pwrgood_timer;
    uint32_t blink_timer;
    uint32_t no_iopower;
    uint32_t pwr_det;
    uint32_t pwr_det_latch;
    uint32_t scratch0;
    uint32_t scratch1;
    uint32_t scratch2;
    uint32_t scratch3;
    uint32_t scratch4;
    uint32_t scratch5;
    uint32_t scratch6;
    uint32_t scratch7;
    uint32_t scratch8;
    uint32_t scratch9;
    uint32_t scratch10;
    uint32_t scratch11;
    uint32_t scratch12;
    uint32_t scratch13;
    uint32_t scratch14;
    uint32_t scratch15;
    uint32_t scratch16;
    uint32_t scratch17;
    uint32_t scratch18;
    uint32_t scratch19;
    uint32_t scratch20;
    uint32_t scratch21;
    uint32_t scratch22;
    uint32_t scratch23;
    uint32_t secure_scratch0;
    uint32_t secure_scratch1;
    uint32_t secure_scratch2;
    uint32_t secure_scratch3;
    uint32_t secure_scratch4;
    uint32_t secure_scratch5;
    uint32_t cpupwrgood_timer;
    uint32_t cpupwroff_timer;
    uint32_t pg_mask;
    uint32_t pg_mask_1;
    uint32_t auto_wake_lvl;
    uint32_t auto_wake_lvl_mask;
    uint32_t wake_delay;
    uint32_t pwr_det_val;
    uint32_t ddr_pwr;
    uint32_t usb_debounce_del;
    uint32_t usb_ao;
    uint32_t crypto_op;
    uint32_t pllp_wb0_override;
    uint32_t scratch24;
    uint32_t scratch25;
    uint32_t scratch26;
    uint32_t scratch27;
    uint32_t scratch28;
    uint32_t scratch29;
    uint32_t scratch30;
    uint32_t scratch31;
    uint32_t scratch32;
    uint32_t scratch33;
    uint32_t scratch34;
    uint32_t scratch35;
    uint32_t scratch36;
    uint32_t scratch37;
    uint32_t scratch38;
    uint32_t scratch39;
    uint32_t scratch40;
    uint32_t scratch41;
    uint32_t scratch42;
    uint32_t bo_mirror0;
    uint32_t bo_mirror1;
    uint32_t bo_mirror2;
    uint32_t sys_33v_en;
    uint32_t bo_mirror_access;
    uint32_t gate;
    uint32_t wake2_mask;
    uint32_t wake2_lvl;
    uint32_t wake2_stat;
    uint32_t sw_wake2_stat;
    uint32_t auto_wake2_lvl_mask;
    uint32_t pg_mask2;
    uint32_t pg_mask_ce1;
    uint32_t pg_mask_ce2;
    uint32_t pg_mask_ce3;
    uint32_t pwrgate_timer_ce0;
    uint32_t pwrgate_timer_ce1;
    uint32_t pwrgate_timer_ce2;
    uint32_t pwrgate_timer_ce3;
    uint32_t pwrgate_timer_ce4;
    uint32_t pwrgate_timer_ce5;
    uint32_t pwrgate_timer_ce6;
    uint32_t pcx_edpd_cntrl;
    uint32_t osc_edpd_over;
    uint32_t clk_out_cntrl;
    uint32_t sata_pwrgate;
    uint32_t sensor_ctrl;
    uint32_t reset_status;
    uint32_t io_dpd_req;
    uint32_t io_dpd_stat;
    uint32_t io_dpd2_req;
    uint32_t io_dpd2_stat;
    uint32_t sel_dpd_tim;
    uint32_t vddp_sel;
    uint32_t ddr_cfg;
    uint32_t e_no_vttgen;
    uint32_t _reserved0;
    uint32_t pllm_wb0_ovrride_frq;
    uint32_t test_pwrgate;
    uint32_t pwrgate_timer_mult;
    uint32_t dsi_sel_dpd;
    uint32_t utmip_uhsic_triggers;
    uint32_t utmip_uhsic_saved_st;
    uint32_t utmip_pad_cfg;
    uint32_t utmip_term_pad_cfg;
    uint32_t utmip_uhsic_sleep_cfg;
    uint32_t utmip_uhsic_sleepwalk_cfg;
    uint32_t utmip_sleepwalk_p[3];
    uint32_t uhsic_sleepwalk_p0;
    uint32_t utmip_uhsic_status;
    uint32_t utmip_uhsic_fake;
    uint32_t bo_mirror3[2];
    uint32_t secure_scratch6;
    uint32_t secure_scratch7;
    uint32_t scratch43;
    uint32_t scratch44;
    uint32_t scratch45;
    uint32_t scratch46;
    uint32_t scratch47;
    uint32_t scratch48;
    uint32_t scratch49;
    uint32_t scratch50;
    uint32_t scratch51;
    uint32_t scratch52;
    uint32_t scratch53;
    uint32_t scratch54;
    uint32_t scratch55;
    uint32_t scratch0_eco;
    uint32_t por_dpd_ctrl;
    uint32_t scratch2_eco;
    uint32_t utmip_uhsic_line_wakeup;
    uint32_t utmip_bias_master_cntrl;
    uint32_t utmip_master_config;
    uint32_t td_pwrgate_inter_part_timer;
    uint32_t utmip_uhsic2_triggers;
    uint32_t utmip_uhsic2_saved_state;
    uint32_t utmip_uhsic2_sleep_cfg;
    uint32_t utmip_uhsic2_sleepwalk_cfg;
    uint32_t uhsic2_sleepwalk_p1;
    uint32_t utmip_uhsic2_status;
    uint32_t utmip_uhsic2_fake;
    uint32_t utmip_uhsic2_line_wakeup;
    uint32_t utmip_master2_config;
    uint32_t utmip_uhsic_rpd_cfg;
    uint32_t pg_mask_ce0;
    uint32_t pg_mask3[2];
    uint32_t pllm_wb0_override2;
    uint32_t tsc_mult;
    uint32_t cpu_vsense_override;
    uint32_t glb_amap_cfg;
    uint32_t sticky_bits;
    uint32_t sec_disable2;
    uint32_t weak_bias;
    uint32_t reg_short;
    uint32_t pg_mask_andor;
    uint32_t _reserved1[11];
    uint32_t secure_scratch8;
    uint32_t secure_scratch9;
    uint32_t secure_scratch10;
    uint32_t secure_scratch11;
    uint32_t secure_scratch12;
    uint32_t secure_scratch13;
    uint32_t secure_scratch14;
    uint32_t secure_scratch15;
    uint32_t secure_scratch16;
    uint32_t secure_scratch17;
    uint32_t secure_scratch18;
    uint32_t secure_scratch19;
    uint32_t secure_scratch20;
    uint32_t secure_scratch21;
    uint32_t secure_scratch22;
    uint32_t secure_scratch23;
    uint32_t secure_scratch24;
    uint32_t secure_scratch25;
    uint32_t secure_scratch26;
    uint32_t secure_scratch27;
    uint32_t secure_scratch28;
    uint32_t secure_scratch29;
    uint32_t secure_scratch30;
    uint32_t secure_scratch31;
    uint32_t secure_scratch32;
    uint32_t secure_scratch33;
    uint32_t secure_scratch34;
    uint32_t secure_scratch35;
    uint32_t secure_scratch36;
    uint32_t secure_scratch37;
    uint32_t secure_scratch38;
    uint32_t secure_scratch39;
    uint32_t secure_scratch40;
    uint32_t secure_scratch41;
    uint32_t secure_scratch42;
    uint32_t secure_scratch43;
    uint32_t secure_scratch44;
    uint32_t secure_scratch45;
    uint32_t secure_scratch46;
    uint32_t secure_scratch47;
    uint32_t secure_scratch48;
    uint32_t secure_scratch49;
    uint32_t secure_scratch50;
    uint32_t secure_scratch51;
    uint32_t secure_scratch52;
    uint32_t secure_scratch53;
    uint32_t secure_scratch54;
    uint32_t secure_scratch55;
    uint32_t secure_scratch56;
    uint32_t secure_scratch57;
    uint32_t secure_scratch58;
    uint32_t secure_scratch59;
    uint32_t secure_scratch60;
    uint32_t secure_scratch61;
    uint32_t secure_scratch62;
    uint32_t secure_scratch63;
    uint32_t secure_scratch64;
    uint32_t secure_scratch65;
    uint32_t secure_scratch66;
    uint32_t secure_scratch67;
    uint32_t secure_scratch68;
    uint32_t secure_scratch69;
    uint32_t secure_scratch70;
    uint32_t secure_scratch71;
    uint32_t secure_scratch72;
    uint32_t secure_scratch73;
    uint32_t secure_scratch74;
    uint32_t secure_scratch75;
    uint32_t secure_scratch76;
    uint32_t secure_scratch77;
    uint32_t secure_scratch78;
    uint32_t secure_scratch79;
    uint32_t _reserved2[8];
    uint32_t cntrl2;
    uint32_t _reserved3[2];
    uint32_t event_counter;
    uint32_t fuse_control;
    uint32_t scratch1_eco;
    uint32_t _reserved4;
    uint32_t io_dpd3_req;
    uint32_t io_dpd3_status;
    uint32_t io_dpd4_req;
    uint32_t io_dpd4_status;
    uint32_t _reserved5[30];
    uint32_t ddr_cntrl;
    uint32_t _reserved6[70];
    uint32_t scratch56;
    uint32_t scratch57;
    uint32_t scratch58;
    uint32_t scratch59;
    uint32_t scratch60;
    uint32_t scratch61;
    uint32_t scratch62;
    uint32_t scratch63;
    uint32_t scratch64;
    uint32_t scratch65;
    uint32_t scratch66;
    uint32_t scratch67;
    uint32_t scratch68;
    uint32_t scratch69;
    uint32_t scratch70;
    uint32_t scratch71;
    uint32_t scratch72;
    uint32_t scratch73;
    uint32_t scratch74;
    uint32_t scratch75;
    uint32_t scratch76;
    uint32_t scratch77;
    uint32_t scratch78;
    uint32_t scratch79;
    uint32_t scratch80;
    uint32_t scratch81;
    uint32_t scratch82;
    uint32_t scratch83;
    uint32_t scratch84;
    uint32_t scratch85;
    uint32_t scratch86;
    uint32_t scratch87;
    uint32_t scratch88;
    uint32_t scratch89;
    uint32_t scratch90;
    uint32_t scratch91;
    uint32_t scratch92;
    uint32_t scratch93;
    uint32_t scratch94;
    uint32_t scratch95;
    uint32_t scratch96;
    uint32_t scratch97;
    uint32_t scratch98;
    uint32_t scratch99;
    uint32_t scratch100;
    uint32_t scratch101;
    uint32_t scratch102;
    uint32_t scratch103;
    uint32_t scratch104;
    uint32_t scratch105;
    uint32_t scratch106;
    uint32_t scratch107;
    uint32_t scratch108;
    uint32_t scratch109;
    uint32_t scratch110;
    uint32_t scratch111;
    uint32_t scratch112;
    uint32_t scratch113;
    uint32_t scratch114;
    uint32_t scratch115;
    uint32_t scratch116;
    uint32_t scratch117;
    uint32_t scratch118;
    uint32_t scratch119;
    uint32_t scratch120;
    uint32_t scratch121;
    uint32_t scratch122;
    uint32_t scratch123;
    uint32_t scratch124;
    uint32_t scratch125;
    uint32_t scratch126;
    uint32_t scratch127;
    uint32_t scratch128;
    uint32_t scratch129;
    uint32_t scratch130;
    uint32_t scratch131;
    uint32_t scratch132;
    uint32_t scratch133;
    uint32_t scratch134;
    uint32_t scratch135;
    uint32_t scratch136;
    uint32_t scratch137;
    uint32_t scratch138;
    uint32_t scratch139;
    uint32_t scratch140;
    uint32_t scratch141;
    uint32_t scratch142;
    uint32_t scratch143;
    uint32_t scratch144;
    uint32_t scratch145;
    uint32_t scratch146;
    uint32_t scratch147;
    uint32_t scratch148;
    uint32_t scratch149;
    uint32_t scratch150;
    uint32_t scratch151;
    uint32_t scratch152;
    uint32_t scratch153;
    uint32_t scratch154;
    uint32_t scratch155;
    uint32_t scratch156;
    uint32_t scratch157;
    uint32_t scratch158;
    uint32_t scratch159;
    uint32_t scratch160;
    uint32_t scratch161;
    uint32_t scratch162;
    uint32_t scratch163;
    uint32_t scratch164;
    uint32_t scratch165;
    uint32_t scratch166;
    uint32_t scratch167;
    uint32_t scratch168;
    uint32_t scratch169;
    uint32_t scratch170;
    uint32_t scratch171;
    uint32_t scratch172;
    uint32_t scratch173;
    uint32_t scratch174;
    uint32_t scratch175;
    uint32_t scratch176;
    uint32_t scratch177;
    uint32_t scratch178;
    uint32_t scratch179;
    uint32_t scratch180;
    uint32_t scratch181;
    uint32_t scratch182;
    uint32_t scratch183;
    uint32_t scratch184;
    uint32_t scratch185;
    uint32_t scratch186;
    uint32_t scratch187;
    uint32_t scratch188;
    uint32_t scratch189;
    uint32_t scratch190;
    uint32_t scratch191;
    uint32_t scratch192;
    uint32_t scratch193;
    uint32_t scratch194;
    uint32_t scratch195;
    uint32_t scratch196;
    uint32_t scratch197;
    uint32_t scratch198;
    uint32_t scratch199;
    uint32_t scratch200;
    uint32_t scratch201;
    uint32_t scratch202;
    uint32_t scratch203;
    uint32_t scratch204;
    uint32_t scratch205;
    uint32_t scratch206;
    uint32_t scratch207;
    uint32_t scratch208;
    uint32_t scratch209;
    uint32_t scratch210;
    uint32_t scratch211;
    uint32_t scratch212;
    uint32_t scratch213;
    uint32_t scratch214;
    uint32_t scratch215;
    uint32_t scratch216;
    uint32_t scratch217;
    uint32_t scratch218;
    uint32_t scratch219;
    uint32_t scratch220;
    uint32_t scratch221;
    uint32_t scratch222;
    uint32_t scratch223;
    uint32_t scratch224;
    uint32_t scratch225;
    uint32_t scratch226;
    uint32_t scratch227;
    uint32_t scratch228;
    uint32_t scratch229;
    uint32_t scratch230;
    uint32_t scratch231;
    uint32_t scratch232;
    uint32_t scratch233;
    uint32_t scratch234;
    uint32_t scratch235;
    uint32_t scratch236;
    uint32_t scratch237;
    uint32_t scratch238;
    uint32_t scratch239;
    uint32_t scratch240;
    uint32_t scratch241;
    uint32_t scratch242;
    uint32_t scratch243;
    uint32_t scratch244;
    uint32_t scratch245;
    uint32_t scratch246;
    uint32_t scratch247;
    uint32_t scratch248;
    uint32_t scratch249;
    uint32_t scratch250;
    uint32_t scratch251;
    uint32_t scratch252;
    uint32_t scratch253;
    uint32_t scratch254;
    uint32_t scratch255;
    uint32_t scratch256;
    uint32_t scratch257;
    uint32_t scratch258;
    uint32_t scratch259;
    uint32_t scratch260;
    uint32_t scratch261;
    uint32_t scratch262;
    uint32_t scratch263;
    uint32_t scratch264;
    uint32_t scratch265;
    uint32_t scratch266;
    uint32_t scratch267;
    uint32_t scratch268;
    uint32_t scratch269;
    uint32_t scratch270;
    uint32_t scratch271;
    uint32_t scratch272;
    uint32_t scratch273;
    uint32_t scratch274;
    uint32_t scratch275;
    uint32_t scratch276;
    uint32_t scratch277;
    uint32_t scratch278;
    uint32_t scratch279;
    uint32_t scratch280;
    uint32_t scratch281;
    uint32_t scratch282;
    uint32_t scratch283;
    uint32_t scratch284;
    uint32_t scratch285;
    uint32_t scratch286;
    uint32_t scratch287;
    uint32_t scratch288;
    uint32_t scratch289;
    uint32_t scratch290;
    uint32_t scratch291;
    uint32_t scratch292;
    uint32_t scratch293;
    uint32_t scratch294;
    uint32_t scratch295;
    uint32_t scratch296;
    uint32_t scratch297;
    uint32_t scratch298;
    uint32_t scratch299;
    uint32_t _reserved7[50];
    uint32_t secure_scratch80;
    uint32_t secure_scratch81;
    uint32_t secure_scratch82;
    uint32_t secure_scratch83;
    uint32_t secure_scratch84;
    uint32_t secure_scratch85;
    uint32_t secure_scratch86;
    uint32_t secure_scratch87;
    uint32_t secure_scratch88;
    uint32_t secure_scratch89;
    uint32_t secure_scratch90;
    uint32_t secure_scratch91;
    uint32_t secure_scratch92;
    uint32_t secure_scratch93;
    uint32_t secure_scratch94;
    uint32_t secure_scratch95;
    uint32_t secure_scratch96;
    uint32_t secure_scratch97;
    uint32_t secure_scratch98;
    uint32_t secure_scratch99;
    uint32_t secure_scratch100;
    uint32_t secure_scratch101;
    uint32_t secure_scratch102;
    uint32_t secure_scratch103;
    uint32_t secure_scratch104;
    uint32_t secure_scratch105;
    uint32_t secure_scratch106;
    uint32_t secure_scratch107;
    uint32_t secure_scratch108;
    uint32_t secure_scratch109;
    uint32_t secure_scratch110;
    uint32_t secure_scratch111;
    uint32_t secure_scratch112;
    uint32_t secure_scratch113;
    uint32_t secure_scratch114;
    uint32_t secure_scratch115;
    uint32_t secure_scratch116;
    uint32_t secure_scratch117;
    uint32_t secure_scratch118;
    uint32_t secure_scratch119;
} tegra_pmc_t;

static inline volatile tegra_pmc_t *pmc_get_regs(void)
{
    return (volatile tegra_pmc_t *)PMC_BASE;
}

#endif
