0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #define pr_fmt(fmt) "tegra-pmc: " fmt
0013
0014 #include <linux/arm-smccc.h>
0015 #include <linux/clk.h>
0016 #include <linux/clk-provider.h>
0017 #include <linux/clkdev.h>
0018 #include <linux/clk/clk-conf.h>
0019 #include <linux/clk/tegra.h>
0020 #include <linux/debugfs.h>
0021 #include <linux/delay.h>
0022 #include <linux/device.h>
0023 #include <linux/err.h>
0024 #include <linux/export.h>
0025 #include <linux/init.h>
0026 #include <linux/io.h>
0027 #include <linux/iopoll.h>
0028 #include <linux/irqdomain.h>
0029 #include <linux/irq.h>
0030 #include <linux/kernel.h>
0031 #include <linux/of_address.h>
0032 #include <linux/of_clk.h>
0033 #include <linux/of.h>
0034 #include <linux/of_irq.h>
0035 #include <linux/of_platform.h>
0036 #include <linux/pinctrl/pinconf-generic.h>
0037 #include <linux/pinctrl/pinconf.h>
0038 #include <linux/pinctrl/pinctrl.h>
0039 #include <linux/platform_device.h>
0040 #include <linux/pm_domain.h>
0041 #include <linux/pm_opp.h>
0042 #include <linux/power_supply.h>
0043 #include <linux/reboot.h>
0044 #include <linux/regmap.h>
0045 #include <linux/reset.h>
0046 #include <linux/seq_file.h>
0047 #include <linux/slab.h>
0048 #include <linux/spinlock.h>
0049
0050 #include <soc/tegra/common.h>
0051 #include <soc/tegra/fuse.h>
0052 #include <soc/tegra/pmc.h>
0053
0054 #include <dt-bindings/interrupt-controller/arm-gic.h>
0055 #include <dt-bindings/pinctrl/pinctrl-tegra-io-pad.h>
0056 #include <dt-bindings/gpio/tegra186-gpio.h>
0057 #include <dt-bindings/gpio/tegra194-gpio.h>
0058 #include <dt-bindings/gpio/tegra234-gpio.h>
0059 #include <dt-bindings/soc/tegra-pmc.h>
0060
0061 #define PMC_CNTRL 0x0
0062 #define PMC_CNTRL_INTR_POLARITY BIT(17)
0063 #define PMC_CNTRL_CPU_PWRREQ_OE BIT(16)
0064 #define PMC_CNTRL_CPU_PWRREQ_POLARITY BIT(15)
0065 #define PMC_CNTRL_SIDE_EFFECT_LP0 BIT(14)
0066 #define PMC_CNTRL_SYSCLK_OE BIT(11)
0067 #define PMC_CNTRL_SYSCLK_POLARITY BIT(10)
0068 #define PMC_CNTRL_PWRREQ_POLARITY BIT(8)
0069 #define PMC_CNTRL_BLINK_EN 7
0070 #define PMC_CNTRL_MAIN_RST BIT(4)
0071
0072 #define PMC_WAKE_MASK 0x0c
0073 #define PMC_WAKE_LEVEL 0x10
0074 #define PMC_WAKE_STATUS 0x14
0075 #define PMC_SW_WAKE_STATUS 0x18
0076 #define PMC_DPD_PADS_ORIDE 0x1c
0077 #define PMC_DPD_PADS_ORIDE_BLINK 20
0078
0079 #define DPD_SAMPLE 0x020
0080 #define DPD_SAMPLE_ENABLE BIT(0)
0081 #define DPD_SAMPLE_DISABLE (0 << 0)
0082
0083 #define PWRGATE_TOGGLE 0x30
0084 #define PWRGATE_TOGGLE_START BIT(8)
0085
0086 #define REMOVE_CLAMPING 0x34
0087
0088 #define PWRGATE_STATUS 0x38
0089
0090 #define PMC_BLINK_TIMER 0x40
0091 #define PMC_IMPL_E_33V_PWR 0x40
0092
0093 #define PMC_PWR_DET 0x48
0094
0095 #define PMC_SCRATCH0_MODE_RECOVERY BIT(31)
0096 #define PMC_SCRATCH0_MODE_BOOTLOADER BIT(30)
0097 #define PMC_SCRATCH0_MODE_RCM BIT(1)
0098 #define PMC_SCRATCH0_MODE_MASK (PMC_SCRATCH0_MODE_RECOVERY | \
0099 PMC_SCRATCH0_MODE_BOOTLOADER | \
0100 PMC_SCRATCH0_MODE_RCM)
0101
0102 #define PMC_CPUPWRGOOD_TIMER 0xc8
0103 #define PMC_CPUPWROFF_TIMER 0xcc
0104 #define PMC_COREPWRGOOD_TIMER 0x3c
0105 #define PMC_COREPWROFF_TIMER 0xe0
0106
0107 #define PMC_PWR_DET_VALUE 0xe4
0108
0109 #define PMC_USB_DEBOUNCE_DEL 0xec
0110 #define PMC_USB_AO 0xf0
0111
0112 #define PMC_SCRATCH37 0x130
0113 #define PMC_SCRATCH41 0x140
0114
0115 #define PMC_WAKE2_MASK 0x160
0116 #define PMC_WAKE2_LEVEL 0x164
0117 #define PMC_WAKE2_STATUS 0x168
0118 #define PMC_SW_WAKE2_STATUS 0x16c
0119
0120 #define PMC_CLK_OUT_CNTRL 0x1a8
0121 #define PMC_CLK_OUT_MUX_MASK GENMASK(1, 0)
0122 #define PMC_SENSOR_CTRL 0x1b0
0123 #define PMC_SENSOR_CTRL_SCRATCH_WRITE BIT(2)
0124 #define PMC_SENSOR_CTRL_ENABLE_RST BIT(1)
0125
0126 #define PMC_RST_STATUS_POR 0
0127 #define PMC_RST_STATUS_WATCHDOG 1
0128 #define PMC_RST_STATUS_SENSOR 2
0129 #define PMC_RST_STATUS_SW_MAIN 3
0130 #define PMC_RST_STATUS_LP0 4
0131 #define PMC_RST_STATUS_AOTAG 5
0132
0133 #define IO_DPD_REQ 0x1b8
0134 #define IO_DPD_REQ_CODE_IDLE (0U << 30)
0135 #define IO_DPD_REQ_CODE_OFF (1U << 30)
0136 #define IO_DPD_REQ_CODE_ON (2U << 30)
0137 #define IO_DPD_REQ_CODE_MASK (3U << 30)
0138
0139 #define IO_DPD_STATUS 0x1bc
0140 #define IO_DPD2_REQ 0x1c0
0141 #define IO_DPD2_STATUS 0x1c4
0142 #define SEL_DPD_TIM 0x1c8
0143
0144 #define PMC_UTMIP_UHSIC_TRIGGERS 0x1ec
0145 #define PMC_UTMIP_UHSIC_SAVED_STATE 0x1f0
0146
0147 #define PMC_UTMIP_TERM_PAD_CFG 0x1f8
0148 #define PMC_UTMIP_UHSIC_SLEEP_CFG 0x1fc
0149 #define PMC_UTMIP_UHSIC_FAKE 0x218
0150
0151 #define PMC_SCRATCH54 0x258
0152 #define PMC_SCRATCH54_DATA_SHIFT 8
0153 #define PMC_SCRATCH54_ADDR_SHIFT 0
0154
0155 #define PMC_SCRATCH55 0x25c
0156 #define PMC_SCRATCH55_RESET_TEGRA BIT(31)
0157 #define PMC_SCRATCH55_CNTRL_ID_SHIFT 27
0158 #define PMC_SCRATCH55_PINMUX_SHIFT 24
0159 #define PMC_SCRATCH55_16BITOP BIT(15)
0160 #define PMC_SCRATCH55_CHECKSUM_SHIFT 16
0161 #define PMC_SCRATCH55_I2CSLV1_SHIFT 0
0162
0163 #define PMC_UTMIP_UHSIC_LINE_WAKEUP 0x26c
0164
0165 #define PMC_UTMIP_BIAS_MASTER_CNTRL 0x270
0166 #define PMC_UTMIP_MASTER_CONFIG 0x274
0167 #define PMC_UTMIP_UHSIC2_TRIGGERS 0x27c
0168 #define PMC_UTMIP_MASTER2_CONFIG 0x29c
0169
0170 #define GPU_RG_CNTRL 0x2d4
0171
0172 #define PMC_UTMIP_PAD_CFG0 0x4c0
0173 #define PMC_UTMIP_UHSIC_SLEEP_CFG1 0x4d0
0174 #define PMC_UTMIP_SLEEPWALK_P3 0x4e0
0175
0176 #define WAKE_AOWAKE_CNTRL(x) (0x000 + ((x) << 2))
0177 #define WAKE_AOWAKE_CNTRL_LEVEL (1 << 3)
0178 #define WAKE_AOWAKE_MASK_W(x) (0x180 + ((x) << 2))
0179 #define WAKE_AOWAKE_MASK_R(x) (0x300 + ((x) << 2))
0180 #define WAKE_AOWAKE_STATUS_W(x) (0x30c + ((x) << 2))
0181 #define WAKE_AOWAKE_STATUS_R(x) (0x48c + ((x) << 2))
0182 #define WAKE_AOWAKE_TIER0_ROUTING(x) (0x4b4 + ((x) << 2))
0183 #define WAKE_AOWAKE_TIER1_ROUTING(x) (0x4c0 + ((x) << 2))
0184 #define WAKE_AOWAKE_TIER2_ROUTING(x) (0x4cc + ((x) << 2))
0185
0186 #define WAKE_AOWAKE_CTRL 0x4f4
0187 #define WAKE_AOWAKE_CTRL_INTR_POLARITY BIT(0)
0188
0189
0190 #define TEGRA_SMC_PMC 0xc2fffe00
0191 #define TEGRA_SMC_PMC_READ 0xaa
0192 #define TEGRA_SMC_PMC_WRITE 0xbb
0193
0194 struct pmc_clk {
0195 struct clk_hw hw;
0196 unsigned long offs;
0197 u32 mux_shift;
0198 u32 force_en_shift;
0199 };
0200
0201 #define to_pmc_clk(_hw) container_of(_hw, struct pmc_clk, hw)
0202
0203 struct pmc_clk_gate {
0204 struct clk_hw hw;
0205 unsigned long offs;
0206 u32 shift;
0207 };
0208
0209 #define to_pmc_clk_gate(_hw) container_of(_hw, struct pmc_clk_gate, hw)
0210
0211 struct pmc_clk_init_data {
0212 char *name;
0213 const char *const *parents;
0214 int num_parents;
0215 int clk_id;
0216 u8 mux_shift;
0217 u8 force_en_shift;
0218 };
0219
0220 static const char * const clk_out1_parents[] = { "osc", "osc_div2",
0221 "osc_div4", "extern1",
0222 };
0223
0224 static const char * const clk_out2_parents[] = { "osc", "osc_div2",
0225 "osc_div4", "extern2",
0226 };
0227
0228 static const char * const clk_out3_parents[] = { "osc", "osc_div2",
0229 "osc_div4", "extern3",
0230 };
0231
0232 static const struct pmc_clk_init_data tegra_pmc_clks_data[] = {
0233 {
0234 .name = "pmc_clk_out_1",
0235 .parents = clk_out1_parents,
0236 .num_parents = ARRAY_SIZE(clk_out1_parents),
0237 .clk_id = TEGRA_PMC_CLK_OUT_1,
0238 .mux_shift = 6,
0239 .force_en_shift = 2,
0240 },
0241 {
0242 .name = "pmc_clk_out_2",
0243 .parents = clk_out2_parents,
0244 .num_parents = ARRAY_SIZE(clk_out2_parents),
0245 .clk_id = TEGRA_PMC_CLK_OUT_2,
0246 .mux_shift = 14,
0247 .force_en_shift = 10,
0248 },
0249 {
0250 .name = "pmc_clk_out_3",
0251 .parents = clk_out3_parents,
0252 .num_parents = ARRAY_SIZE(clk_out3_parents),
0253 .clk_id = TEGRA_PMC_CLK_OUT_3,
0254 .mux_shift = 22,
0255 .force_en_shift = 18,
0256 },
0257 };
0258
0259 struct tegra_powergate {
0260 struct generic_pm_domain genpd;
0261 struct tegra_pmc *pmc;
0262 unsigned int id;
0263 struct clk **clks;
0264 unsigned int num_clks;
0265 unsigned long *clk_rates;
0266 struct reset_control *reset;
0267 };
0268
0269 struct tegra_io_pad_soc {
0270 enum tegra_io_pad id;
0271 unsigned int dpd;
0272 unsigned int voltage;
0273 const char *name;
0274 };
0275
0276 struct tegra_pmc_regs {
0277 unsigned int scratch0;
0278 unsigned int dpd_req;
0279 unsigned int dpd_status;
0280 unsigned int dpd2_req;
0281 unsigned int dpd2_status;
0282 unsigned int rst_status;
0283 unsigned int rst_source_shift;
0284 unsigned int rst_source_mask;
0285 unsigned int rst_level_shift;
0286 unsigned int rst_level_mask;
0287 };
0288
0289 struct tegra_wake_event {
0290 const char *name;
0291 unsigned int id;
0292 unsigned int irq;
0293 struct {
0294 unsigned int instance;
0295 unsigned int pin;
0296 } gpio;
0297 };
0298
0299 #define TEGRA_WAKE_IRQ(_name, _id, _irq) \
0300 { \
0301 .name = _name, \
0302 .id = _id, \
0303 .irq = _irq, \
0304 .gpio = { \
0305 .instance = UINT_MAX, \
0306 .pin = UINT_MAX, \
0307 }, \
0308 }
0309
0310 #define TEGRA_WAKE_GPIO(_name, _id, _instance, _pin) \
0311 { \
0312 .name = _name, \
0313 .id = _id, \
0314 .irq = 0, \
0315 .gpio = { \
0316 .instance = _instance, \
0317 .pin = _pin, \
0318 }, \
0319 }
0320
0321 struct tegra_pmc_soc {
0322 unsigned int num_powergates;
0323 const char *const *powergates;
0324 unsigned int num_cpu_powergates;
0325 const u8 *cpu_powergates;
0326
0327 bool has_tsense_reset;
0328 bool has_gpu_clamps;
0329 bool needs_mbist_war;
0330 bool has_impl_33v_pwr;
0331 bool maybe_tz_only;
0332
0333 const struct tegra_io_pad_soc *io_pads;
0334 unsigned int num_io_pads;
0335
0336 const struct pinctrl_pin_desc *pin_descs;
0337 unsigned int num_pin_descs;
0338
0339 const struct tegra_pmc_regs *regs;
0340 void (*init)(struct tegra_pmc *pmc);
0341 void (*setup_irq_polarity)(struct tegra_pmc *pmc,
0342 struct device_node *np,
0343 bool invert);
0344 int (*irq_set_wake)(struct irq_data *data, unsigned int on);
0345 int (*irq_set_type)(struct irq_data *data, unsigned int type);
0346 int (*powergate_set)(struct tegra_pmc *pmc, unsigned int id,
0347 bool new_state);
0348
0349 const char * const *reset_sources;
0350 unsigned int num_reset_sources;
0351 const char * const *reset_levels;
0352 unsigned int num_reset_levels;
0353
0354
0355
0356
0357
0358
0359 const struct tegra_wake_event *wake_events;
0360 unsigned int num_wake_events;
0361
0362 const struct pmc_clk_init_data *pmc_clks_data;
0363 unsigned int num_pmc_clks;
0364 bool has_blink_output;
0365 bool has_usb_sleepwalk;
0366 bool supports_core_domain;
0367 };
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402 struct tegra_pmc {
0403 struct device *dev;
0404 void __iomem *base;
0405 void __iomem *wake;
0406 void __iomem *aotag;
0407 void __iomem *scratch;
0408 struct clk *clk;
0409 struct dentry *debugfs;
0410
0411 const struct tegra_pmc_soc *soc;
0412 bool tz_only;
0413
0414 unsigned long rate;
0415
0416 enum tegra_suspend_mode suspend_mode;
0417 u32 cpu_good_time;
0418 u32 cpu_off_time;
0419 u32 core_osc_time;
0420 u32 core_pmu_time;
0421 u32 core_off_time;
0422 bool corereq_high;
0423 bool sysclkreq_high;
0424 bool combined_req;
0425 bool cpu_pwr_good_en;
0426 u32 lp0_vec_phys;
0427 u32 lp0_vec_size;
0428 DECLARE_BITMAP(powergates_available, TEGRA_POWERGATE_MAX);
0429
0430 struct mutex powergates_lock;
0431
0432 struct pinctrl_dev *pctl_dev;
0433
0434 struct irq_domain *domain;
0435 struct irq_chip irq;
0436
0437 struct notifier_block clk_nb;
0438
0439 bool core_domain_state_synced;
0440 bool core_domain_registered;
0441 };
0442
0443 static struct tegra_pmc *pmc = &(struct tegra_pmc) {
0444 .base = NULL,
0445 .suspend_mode = TEGRA_SUSPEND_NOT_READY,
0446 };
0447
0448 static inline struct tegra_powergate *
0449 to_powergate(struct generic_pm_domain *domain)
0450 {
0451 return container_of(domain, struct tegra_powergate, genpd);
0452 }
0453
0454 static u32 tegra_pmc_readl(struct tegra_pmc *pmc, unsigned long offset)
0455 {
0456 struct arm_smccc_res res;
0457
0458 if (pmc->tz_only) {
0459 arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_READ, offset, 0, 0,
0460 0, 0, 0, &res);
0461 if (res.a0) {
0462 if (pmc->dev)
0463 dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
0464 __func__, res.a0);
0465 else
0466 pr_warn("%s(): SMC failed: %lu\n", __func__,
0467 res.a0);
0468 }
0469
0470 return res.a1;
0471 }
0472
0473 return readl(pmc->base + offset);
0474 }
0475
0476 static void tegra_pmc_writel(struct tegra_pmc *pmc, u32 value,
0477 unsigned long offset)
0478 {
0479 struct arm_smccc_res res;
0480
0481 if (pmc->tz_only) {
0482 arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_WRITE, offset,
0483 value, 0, 0, 0, 0, &res);
0484 if (res.a0) {
0485 if (pmc->dev)
0486 dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
0487 __func__, res.a0);
0488 else
0489 pr_warn("%s(): SMC failed: %lu\n", __func__,
0490 res.a0);
0491 }
0492 } else {
0493 writel(value, pmc->base + offset);
0494 }
0495 }
0496
0497 static u32 tegra_pmc_scratch_readl(struct tegra_pmc *pmc, unsigned long offset)
0498 {
0499 if (pmc->tz_only)
0500 return tegra_pmc_readl(pmc, offset);
0501
0502 return readl(pmc->scratch + offset);
0503 }
0504
0505 static void tegra_pmc_scratch_writel(struct tegra_pmc *pmc, u32 value,
0506 unsigned long offset)
0507 {
0508 if (pmc->tz_only)
0509 tegra_pmc_writel(pmc, value, offset);
0510 else
0511 writel(value, pmc->scratch + offset);
0512 }
0513
0514
0515
0516
0517
0518
0519 static inline bool tegra_powergate_state(int id)
0520 {
0521 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
0522 return (tegra_pmc_readl(pmc, GPU_RG_CNTRL) & 0x1) == 0;
0523 else
0524 return (tegra_pmc_readl(pmc, PWRGATE_STATUS) & BIT(id)) != 0;
0525 }
0526
0527 static inline bool tegra_powergate_is_valid(struct tegra_pmc *pmc, int id)
0528 {
0529 return (pmc->soc && pmc->soc->powergates[id]);
0530 }
0531
0532 static inline bool tegra_powergate_is_available(struct tegra_pmc *pmc, int id)
0533 {
0534 return test_bit(id, pmc->powergates_available);
0535 }
0536
0537 static int tegra_powergate_lookup(struct tegra_pmc *pmc, const char *name)
0538 {
0539 unsigned int i;
0540
0541 if (!pmc || !pmc->soc || !name)
0542 return -EINVAL;
0543
0544 for (i = 0; i < pmc->soc->num_powergates; i++) {
0545 if (!tegra_powergate_is_valid(pmc, i))
0546 continue;
0547
0548 if (!strcmp(name, pmc->soc->powergates[i]))
0549 return i;
0550 }
0551
0552 return -ENODEV;
0553 }
0554
0555 static int tegra20_powergate_set(struct tegra_pmc *pmc, unsigned int id,
0556 bool new_state)
0557 {
0558 unsigned int retries = 100;
0559 bool status;
0560 int ret;
0561
0562
0563
0564
0565
0566
0567 do {
0568 tegra_pmc_writel(pmc, PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
0569
0570
0571 ret = readx_poll_timeout(tegra_powergate_state, id, status,
0572 status == new_state, 1, 10);
0573 } while (ret == -ETIMEDOUT && retries--);
0574
0575 return ret;
0576 }
0577
0578 static inline bool tegra_powergate_toggle_ready(struct tegra_pmc *pmc)
0579 {
0580 return !(tegra_pmc_readl(pmc, PWRGATE_TOGGLE) & PWRGATE_TOGGLE_START);
0581 }
0582
0583 static int tegra114_powergate_set(struct tegra_pmc *pmc, unsigned int id,
0584 bool new_state)
0585 {
0586 bool status;
0587 int err;
0588
0589
0590 err = readx_poll_timeout(tegra_powergate_toggle_ready, pmc, status,
0591 status == true, 1, 100);
0592 if (err)
0593 return err;
0594
0595 tegra_pmc_writel(pmc, PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
0596
0597
0598 err = readx_poll_timeout(tegra_powergate_toggle_ready, pmc, status,
0599 status == true, 1, 100);
0600 if (err)
0601 return err;
0602
0603
0604 err = readx_poll_timeout(tegra_powergate_state, id, status,
0605 status == new_state, 10, 100000);
0606 if (err)
0607 return err;
0608
0609 return 0;
0610 }
0611
0612
0613
0614
0615
0616
0617
0618 static int tegra_powergate_set(struct tegra_pmc *pmc, unsigned int id,
0619 bool new_state)
0620 {
0621 int err;
0622
0623 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
0624 return -EINVAL;
0625
0626 mutex_lock(&pmc->powergates_lock);
0627
0628 if (tegra_powergate_state(id) == new_state) {
0629 mutex_unlock(&pmc->powergates_lock);
0630 return 0;
0631 }
0632
0633 err = pmc->soc->powergate_set(pmc, id, new_state);
0634
0635 mutex_unlock(&pmc->powergates_lock);
0636
0637 return err;
0638 }
0639
0640 static int __tegra_powergate_remove_clamping(struct tegra_pmc *pmc,
0641 unsigned int id)
0642 {
0643 u32 mask;
0644
0645 mutex_lock(&pmc->powergates_lock);
0646
0647
0648
0649
0650
0651 if (id == TEGRA_POWERGATE_3D) {
0652 if (pmc->soc->has_gpu_clamps) {
0653 tegra_pmc_writel(pmc, 0, GPU_RG_CNTRL);
0654 goto out;
0655 }
0656 }
0657
0658
0659
0660
0661
0662 if (id == TEGRA_POWERGATE_VDEC)
0663 mask = (1 << TEGRA_POWERGATE_PCIE);
0664 else if (id == TEGRA_POWERGATE_PCIE)
0665 mask = (1 << TEGRA_POWERGATE_VDEC);
0666 else
0667 mask = (1 << id);
0668
0669 tegra_pmc_writel(pmc, mask, REMOVE_CLAMPING);
0670
0671 out:
0672 mutex_unlock(&pmc->powergates_lock);
0673
0674 return 0;
0675 }
0676
0677 static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg)
0678 {
0679 unsigned long safe_rate = 100 * 1000 * 1000;
0680 unsigned int i;
0681 int err;
0682
0683 for (i = 0; i < pg->num_clks; i++) {
0684 pg->clk_rates[i] = clk_get_rate(pg->clks[i]);
0685
0686 if (!pg->clk_rates[i]) {
0687 err = -EINVAL;
0688 goto out;
0689 }
0690
0691 if (pg->clk_rates[i] <= safe_rate)
0692 continue;
0693
0694
0695
0696
0697
0698
0699
0700 err = clk_set_rate(pg->clks[i], safe_rate);
0701 if (err)
0702 goto out;
0703 }
0704
0705 return 0;
0706
0707 out:
0708 while (i--)
0709 clk_set_rate(pg->clks[i], pg->clk_rates[i]);
0710
0711 return err;
0712 }
0713
0714 static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg)
0715 {
0716 unsigned int i;
0717 int err;
0718
0719 for (i = 0; i < pg->num_clks; i++) {
0720 err = clk_set_rate(pg->clks[i], pg->clk_rates[i]);
0721 if (err)
0722 return err;
0723 }
0724
0725 return 0;
0726 }
0727
0728 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg)
0729 {
0730 unsigned int i;
0731
0732 for (i = 0; i < pg->num_clks; i++)
0733 clk_disable_unprepare(pg->clks[i]);
0734 }
0735
0736 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg)
0737 {
0738 unsigned int i;
0739 int err;
0740
0741 for (i = 0; i < pg->num_clks; i++) {
0742 err = clk_prepare_enable(pg->clks[i]);
0743 if (err)
0744 goto out;
0745 }
0746
0747 return 0;
0748
0749 out:
0750 while (i--)
0751 clk_disable_unprepare(pg->clks[i]);
0752
0753 return err;
0754 }
0755
0756 static int tegra_powergate_power_up(struct tegra_powergate *pg,
0757 bool disable_clocks)
0758 {
0759 int err;
0760
0761 err = reset_control_assert(pg->reset);
0762 if (err)
0763 return err;
0764
0765 usleep_range(10, 20);
0766
0767 err = tegra_powergate_set(pg->pmc, pg->id, true);
0768 if (err < 0)
0769 return err;
0770
0771 usleep_range(10, 20);
0772
0773 err = tegra_powergate_prepare_clocks(pg);
0774 if (err)
0775 goto powergate_off;
0776
0777 err = tegra_powergate_enable_clocks(pg);
0778 if (err)
0779 goto unprepare_clks;
0780
0781 usleep_range(10, 20);
0782
0783 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id);
0784 if (err)
0785 goto disable_clks;
0786
0787 usleep_range(10, 20);
0788
0789 err = reset_control_deassert(pg->reset);
0790 if (err)
0791 goto disable_clks;
0792
0793 usleep_range(10, 20);
0794
0795 if (pg->pmc->soc->needs_mbist_war)
0796 err = tegra210_clk_handle_mbist_war(pg->id);
0797 if (err)
0798 goto disable_clks;
0799
0800 if (disable_clocks)
0801 tegra_powergate_disable_clocks(pg);
0802
0803 err = tegra_powergate_unprepare_clocks(pg);
0804 if (err)
0805 return err;
0806
0807 return 0;
0808
0809 disable_clks:
0810 tegra_powergate_disable_clocks(pg);
0811 usleep_range(10, 20);
0812
0813 unprepare_clks:
0814 tegra_powergate_unprepare_clocks(pg);
0815
0816 powergate_off:
0817 tegra_powergate_set(pg->pmc, pg->id, false);
0818
0819 return err;
0820 }
0821
0822 static int tegra_powergate_power_down(struct tegra_powergate *pg)
0823 {
0824 int err;
0825
0826 err = tegra_powergate_prepare_clocks(pg);
0827 if (err)
0828 return err;
0829
0830 err = tegra_powergate_enable_clocks(pg);
0831 if (err)
0832 goto unprepare_clks;
0833
0834 usleep_range(10, 20);
0835
0836 err = reset_control_assert(pg->reset);
0837 if (err)
0838 goto disable_clks;
0839
0840 usleep_range(10, 20);
0841
0842 tegra_powergate_disable_clocks(pg);
0843
0844 usleep_range(10, 20);
0845
0846 err = tegra_powergate_set(pg->pmc, pg->id, false);
0847 if (err)
0848 goto assert_resets;
0849
0850 err = tegra_powergate_unprepare_clocks(pg);
0851 if (err)
0852 return err;
0853
0854 return 0;
0855
0856 assert_resets:
0857 tegra_powergate_enable_clocks(pg);
0858 usleep_range(10, 20);
0859 reset_control_deassert(pg->reset);
0860 usleep_range(10, 20);
0861
0862 disable_clks:
0863 tegra_powergate_disable_clocks(pg);
0864
0865 unprepare_clks:
0866 tegra_powergate_unprepare_clocks(pg);
0867
0868 return err;
0869 }
0870
0871 static int tegra_genpd_power_on(struct generic_pm_domain *domain)
0872 {
0873 struct tegra_powergate *pg = to_powergate(domain);
0874 struct device *dev = pg->pmc->dev;
0875 int err;
0876
0877 err = tegra_powergate_power_up(pg, true);
0878 if (err) {
0879 dev_err(dev, "failed to turn on PM domain %s: %d\n",
0880 pg->genpd.name, err);
0881 goto out;
0882 }
0883
0884 reset_control_release(pg->reset);
0885
0886 out:
0887 return err;
0888 }
0889
0890 static int tegra_genpd_power_off(struct generic_pm_domain *domain)
0891 {
0892 struct tegra_powergate *pg = to_powergate(domain);
0893 struct device *dev = pg->pmc->dev;
0894 int err;
0895
0896 err = reset_control_acquire(pg->reset);
0897 if (err < 0) {
0898 dev_err(dev, "failed to acquire resets for PM domain %s: %d\n",
0899 pg->genpd.name, err);
0900 return err;
0901 }
0902
0903 err = tegra_powergate_power_down(pg);
0904 if (err) {
0905 dev_err(dev, "failed to turn off PM domain %s: %d\n",
0906 pg->genpd.name, err);
0907 reset_control_release(pg->reset);
0908 }
0909
0910 return err;
0911 }
0912
0913
0914
0915
0916
0917 int tegra_powergate_power_on(unsigned int id)
0918 {
0919 if (!tegra_powergate_is_available(pmc, id))
0920 return -EINVAL;
0921
0922 return tegra_powergate_set(pmc, id, true);
0923 }
0924 EXPORT_SYMBOL(tegra_powergate_power_on);
0925
0926
0927
0928
0929
0930 int tegra_powergate_power_off(unsigned int id)
0931 {
0932 if (!tegra_powergate_is_available(pmc, id))
0933 return -EINVAL;
0934
0935 return tegra_powergate_set(pmc, id, false);
0936 }
0937 EXPORT_SYMBOL(tegra_powergate_power_off);
0938
0939
0940
0941
0942
0943
0944 static int tegra_powergate_is_powered(struct tegra_pmc *pmc, unsigned int id)
0945 {
0946 if (!tegra_powergate_is_valid(pmc, id))
0947 return -EINVAL;
0948
0949 return tegra_powergate_state(id);
0950 }
0951
0952
0953
0954
0955
0956 int tegra_powergate_remove_clamping(unsigned int id)
0957 {
0958 if (!tegra_powergate_is_available(pmc, id))
0959 return -EINVAL;
0960
0961 return __tegra_powergate_remove_clamping(pmc, id);
0962 }
0963 EXPORT_SYMBOL(tegra_powergate_remove_clamping);
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973 int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk,
0974 struct reset_control *rst)
0975 {
0976 struct tegra_powergate *pg;
0977 int err;
0978
0979 if (!tegra_powergate_is_available(pmc, id))
0980 return -EINVAL;
0981
0982 pg = kzalloc(sizeof(*pg), GFP_KERNEL);
0983 if (!pg)
0984 return -ENOMEM;
0985
0986 pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL);
0987 if (!pg->clk_rates) {
0988 kfree(pg->clks);
0989 return -ENOMEM;
0990 }
0991
0992 pg->id = id;
0993 pg->clks = &clk;
0994 pg->num_clks = 1;
0995 pg->reset = rst;
0996 pg->pmc = pmc;
0997
0998 err = tegra_powergate_power_up(pg, false);
0999 if (err)
1000 dev_err(pmc->dev, "failed to turn on partition %d: %d\n", id,
1001 err);
1002
1003 kfree(pg->clk_rates);
1004 kfree(pg);
1005
1006 return err;
1007 }
1008 EXPORT_SYMBOL(tegra_powergate_sequence_power_up);
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018 static int tegra_get_cpu_powergate_id(struct tegra_pmc *pmc,
1019 unsigned int cpuid)
1020 {
1021 if (pmc->soc && cpuid < pmc->soc->num_cpu_powergates)
1022 return pmc->soc->cpu_powergates[cpuid];
1023
1024 return -EINVAL;
1025 }
1026
1027
1028
1029
1030
1031 bool tegra_pmc_cpu_is_powered(unsigned int cpuid)
1032 {
1033 int id;
1034
1035 id = tegra_get_cpu_powergate_id(pmc, cpuid);
1036 if (id < 0)
1037 return false;
1038
1039 return tegra_powergate_is_powered(pmc, id);
1040 }
1041
1042
1043
1044
1045
1046 int tegra_pmc_cpu_power_on(unsigned int cpuid)
1047 {
1048 int id;
1049
1050 id = tegra_get_cpu_powergate_id(pmc, cpuid);
1051 if (id < 0)
1052 return id;
1053
1054 return tegra_powergate_set(pmc, id, true);
1055 }
1056
1057
1058
1059
1060
1061 int tegra_pmc_cpu_remove_clamping(unsigned int cpuid)
1062 {
1063 int id;
1064
1065 id = tegra_get_cpu_powergate_id(pmc, cpuid);
1066 if (id < 0)
1067 return id;
1068
1069 return tegra_powergate_remove_clamping(id);
1070 }
1071
1072 static void tegra_pmc_program_reboot_reason(const char *cmd)
1073 {
1074 u32 value;
1075
1076 value = tegra_pmc_scratch_readl(pmc, pmc->soc->regs->scratch0);
1077 value &= ~PMC_SCRATCH0_MODE_MASK;
1078
1079 if (cmd) {
1080 if (strcmp(cmd, "recovery") == 0)
1081 value |= PMC_SCRATCH0_MODE_RECOVERY;
1082
1083 if (strcmp(cmd, "bootloader") == 0)
1084 value |= PMC_SCRATCH0_MODE_BOOTLOADER;
1085
1086 if (strcmp(cmd, "forced-recovery") == 0)
1087 value |= PMC_SCRATCH0_MODE_RCM;
1088 }
1089
1090 tegra_pmc_scratch_writel(pmc, value, pmc->soc->regs->scratch0);
1091 }
1092
1093 static int tegra_pmc_reboot_notify(struct notifier_block *this,
1094 unsigned long action, void *data)
1095 {
1096 if (action == SYS_RESTART)
1097 tegra_pmc_program_reboot_reason(data);
1098
1099 return NOTIFY_DONE;
1100 }
1101
1102 static struct notifier_block tegra_pmc_reboot_notifier = {
1103 .notifier_call = tegra_pmc_reboot_notify,
1104 };
1105
1106 static void tegra_pmc_restart(void)
1107 {
1108 u32 value;
1109
1110
1111 value = tegra_pmc_readl(pmc, PMC_CNTRL);
1112 value |= PMC_CNTRL_MAIN_RST;
1113 tegra_pmc_writel(pmc, value, PMC_CNTRL);
1114 }
1115
1116 static int tegra_pmc_restart_handler(struct sys_off_data *data)
1117 {
1118 tegra_pmc_restart();
1119
1120 return NOTIFY_DONE;
1121 }
1122
1123 static int tegra_pmc_power_off_handler(struct sys_off_data *data)
1124 {
1125
1126
1127
1128
1129 if (of_machine_is_compatible("asus,grouper") &&
1130 power_supply_is_system_supplied()) {
1131 const u32 go_to_charger_mode = 0xa5a55a5a;
1132
1133 tegra_pmc_writel(pmc, go_to_charger_mode, PMC_SCRATCH37);
1134 tegra_pmc_restart();
1135 }
1136
1137 return NOTIFY_DONE;
1138 }
1139
1140 static int powergate_show(struct seq_file *s, void *data)
1141 {
1142 unsigned int i;
1143 int status;
1144
1145 seq_printf(s, " powergate powered\n");
1146 seq_printf(s, "------------------\n");
1147
1148 for (i = 0; i < pmc->soc->num_powergates; i++) {
1149 status = tegra_powergate_is_powered(pmc, i);
1150 if (status < 0)
1151 continue;
1152
1153 seq_printf(s, " %9s %7s\n", pmc->soc->powergates[i],
1154 status ? "yes" : "no");
1155 }
1156
1157 return 0;
1158 }
1159
1160 DEFINE_SHOW_ATTRIBUTE(powergate);
1161
1162 static int tegra_powergate_debugfs_init(void)
1163 {
1164 pmc->debugfs = debugfs_create_file("powergate", S_IRUGO, NULL, NULL,
1165 &powergate_fops);
1166 if (!pmc->debugfs)
1167 return -ENOMEM;
1168
1169 return 0;
1170 }
1171
1172 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg,
1173 struct device_node *np)
1174 {
1175 struct clk *clk;
1176 unsigned int i, count;
1177 int err;
1178
1179 count = of_clk_get_parent_count(np);
1180 if (count == 0)
1181 return -ENODEV;
1182
1183 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL);
1184 if (!pg->clks)
1185 return -ENOMEM;
1186
1187 pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL);
1188 if (!pg->clk_rates) {
1189 kfree(pg->clks);
1190 return -ENOMEM;
1191 }
1192
1193 for (i = 0; i < count; i++) {
1194 pg->clks[i] = of_clk_get(np, i);
1195 if (IS_ERR(pg->clks[i])) {
1196 err = PTR_ERR(pg->clks[i]);
1197 goto err;
1198 }
1199 }
1200
1201 pg->num_clks = count;
1202
1203 return 0;
1204
1205 err:
1206 while (i--)
1207 clk_put(pg->clks[i]);
1208
1209 kfree(pg->clk_rates);
1210 kfree(pg->clks);
1211
1212 return err;
1213 }
1214
1215 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
1216 struct device_node *np, bool off)
1217 {
1218 struct device *dev = pg->pmc->dev;
1219 int err;
1220
1221 pg->reset = of_reset_control_array_get_exclusive_released(np);
1222 if (IS_ERR(pg->reset)) {
1223 err = PTR_ERR(pg->reset);
1224 dev_err(dev, "failed to get device resets: %d\n", err);
1225 return err;
1226 }
1227
1228 err = reset_control_acquire(pg->reset);
1229 if (err < 0) {
1230 pr_err("failed to acquire resets: %d\n", err);
1231 goto out;
1232 }
1233
1234 if (off) {
1235 err = reset_control_assert(pg->reset);
1236 } else {
1237 err = reset_control_deassert(pg->reset);
1238 if (err < 0)
1239 goto out;
1240
1241 reset_control_release(pg->reset);
1242 }
1243
1244 out:
1245 if (err) {
1246 reset_control_release(pg->reset);
1247 reset_control_put(pg->reset);
1248 }
1249
1250 return err;
1251 }
1252
1253 static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
1254 {
1255 struct device *dev = pmc->dev;
1256 struct tegra_powergate *pg;
1257 int id, err = 0;
1258 bool off;
1259
1260 pg = kzalloc(sizeof(*pg), GFP_KERNEL);
1261 if (!pg)
1262 return -ENOMEM;
1263
1264 id = tegra_powergate_lookup(pmc, np->name);
1265 if (id < 0) {
1266 dev_err(dev, "powergate lookup failed for %pOFn: %d\n", np, id);
1267 err = -ENODEV;
1268 goto free_mem;
1269 }
1270
1271
1272
1273
1274
1275 clear_bit(id, pmc->powergates_available);
1276
1277 pg->id = id;
1278 pg->genpd.name = np->name;
1279 pg->genpd.power_off = tegra_genpd_power_off;
1280 pg->genpd.power_on = tegra_genpd_power_on;
1281 pg->pmc = pmc;
1282
1283 off = !tegra_powergate_is_powered(pmc, pg->id);
1284
1285 err = tegra_powergate_of_get_clks(pg, np);
1286 if (err < 0) {
1287 dev_err(dev, "failed to get clocks for %pOFn: %d\n", np, err);
1288 goto set_available;
1289 }
1290
1291 err = tegra_powergate_of_get_resets(pg, np, off);
1292 if (err < 0) {
1293 dev_err(dev, "failed to get resets for %pOFn: %d\n", np, err);
1294 goto remove_clks;
1295 }
1296
1297 if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
1298 if (off)
1299 WARN_ON(tegra_powergate_power_up(pg, true));
1300
1301 goto remove_resets;
1302 }
1303
1304 err = pm_genpd_init(&pg->genpd, NULL, off);
1305 if (err < 0) {
1306 dev_err(dev, "failed to initialise PM domain %pOFn: %d\n", np,
1307 err);
1308 goto remove_resets;
1309 }
1310
1311 err = of_genpd_add_provider_simple(np, &pg->genpd);
1312 if (err < 0) {
1313 dev_err(dev, "failed to add PM domain provider for %pOFn: %d\n",
1314 np, err);
1315 goto remove_genpd;
1316 }
1317
1318 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name);
1319
1320 return 0;
1321
1322 remove_genpd:
1323 pm_genpd_remove(&pg->genpd);
1324
1325 remove_resets:
1326 reset_control_put(pg->reset);
1327
1328 remove_clks:
1329 while (pg->num_clks--)
1330 clk_put(pg->clks[pg->num_clks]);
1331
1332 kfree(pg->clks);
1333
1334 set_available:
1335 set_bit(id, pmc->powergates_available);
1336
1337 free_mem:
1338 kfree(pg);
1339
1340 return err;
1341 }
1342
1343 bool tegra_pmc_core_domain_state_synced(void)
1344 {
1345 return pmc->core_domain_state_synced;
1346 }
1347
1348 static int
1349 tegra_pmc_core_pd_set_performance_state(struct generic_pm_domain *genpd,
1350 unsigned int level)
1351 {
1352 struct dev_pm_opp *opp;
1353 int err;
1354
1355 opp = dev_pm_opp_find_level_ceil(&genpd->dev, &level);
1356 if (IS_ERR(opp)) {
1357 dev_err(&genpd->dev, "failed to find OPP for level %u: %pe\n",
1358 level, opp);
1359 return PTR_ERR(opp);
1360 }
1361
1362 mutex_lock(&pmc->powergates_lock);
1363 err = dev_pm_opp_set_opp(pmc->dev, opp);
1364 mutex_unlock(&pmc->powergates_lock);
1365
1366 dev_pm_opp_put(opp);
1367
1368 if (err) {
1369 dev_err(&genpd->dev, "failed to set voltage to %duV: %d\n",
1370 level, err);
1371 return err;
1372 }
1373
1374 return 0;
1375 }
1376
1377 static unsigned int
1378 tegra_pmc_core_pd_opp_to_performance_state(struct generic_pm_domain *genpd,
1379 struct dev_pm_opp *opp)
1380 {
1381 return dev_pm_opp_get_level(opp);
1382 }
1383
1384 static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)
1385 {
1386 struct generic_pm_domain *genpd;
1387 const char *rname[] = { "core", NULL};
1388 int err;
1389
1390 genpd = devm_kzalloc(pmc->dev, sizeof(*genpd), GFP_KERNEL);
1391 if (!genpd)
1392 return -ENOMEM;
1393
1394 genpd->name = "core";
1395 genpd->set_performance_state = tegra_pmc_core_pd_set_performance_state;
1396 genpd->opp_to_performance_state = tegra_pmc_core_pd_opp_to_performance_state;
1397
1398 err = devm_pm_opp_set_regulators(pmc->dev, rname);
1399 if (err)
1400 return dev_err_probe(pmc->dev, err,
1401 "failed to set core OPP regulator\n");
1402
1403 err = pm_genpd_init(genpd, NULL, false);
1404 if (err) {
1405 dev_err(pmc->dev, "failed to init core genpd: %d\n", err);
1406 return err;
1407 }
1408
1409 err = of_genpd_add_provider_simple(np, genpd);
1410 if (err) {
1411 dev_err(pmc->dev, "failed to add core genpd: %d\n", err);
1412 goto remove_genpd;
1413 }
1414
1415 pmc->core_domain_registered = true;
1416
1417 return 0;
1418
1419 remove_genpd:
1420 pm_genpd_remove(genpd);
1421
1422 return err;
1423 }
1424
1425 static int tegra_powergate_init(struct tegra_pmc *pmc,
1426 struct device_node *parent)
1427 {
1428 struct of_phandle_args child_args, parent_args;
1429 struct device_node *np, *child;
1430 int err = 0;
1431
1432
1433
1434
1435
1436 np = of_get_child_by_name(parent, "core-domain");
1437 if (np) {
1438 err = tegra_pmc_core_pd_add(pmc, np);
1439 of_node_put(np);
1440 if (err)
1441 return err;
1442 }
1443
1444 np = of_get_child_by_name(parent, "powergates");
1445 if (!np)
1446 return 0;
1447
1448 for_each_child_of_node(np, child) {
1449 err = tegra_powergate_add(pmc, child);
1450 if (err < 0) {
1451 of_node_put(child);
1452 break;
1453 }
1454
1455 if (of_parse_phandle_with_args(child, "power-domains",
1456 "#power-domain-cells",
1457 0, &parent_args))
1458 continue;
1459
1460 child_args.np = child;
1461 child_args.args_count = 0;
1462
1463 err = of_genpd_add_subdomain(&parent_args, &child_args);
1464 of_node_put(parent_args.np);
1465 if (err) {
1466 of_node_put(child);
1467 break;
1468 }
1469 }
1470
1471 of_node_put(np);
1472
1473 return err;
1474 }
1475
1476 static void tegra_powergate_remove(struct generic_pm_domain *genpd)
1477 {
1478 struct tegra_powergate *pg = to_powergate(genpd);
1479
1480 reset_control_put(pg->reset);
1481
1482 while (pg->num_clks--)
1483 clk_put(pg->clks[pg->num_clks]);
1484
1485 kfree(pg->clks);
1486
1487 set_bit(pg->id, pmc->powergates_available);
1488
1489 kfree(pg);
1490 }
1491
1492 static void tegra_powergate_remove_all(struct device_node *parent)
1493 {
1494 struct generic_pm_domain *genpd;
1495 struct device_node *np, *child;
1496
1497 np = of_get_child_by_name(parent, "powergates");
1498 if (!np)
1499 return;
1500
1501 for_each_child_of_node(np, child) {
1502 of_genpd_del_provider(child);
1503
1504 genpd = of_genpd_remove_last(child);
1505 if (IS_ERR(genpd))
1506 continue;
1507
1508 tegra_powergate_remove(genpd);
1509 }
1510
1511 of_node_put(np);
1512
1513 np = of_get_child_by_name(parent, "core-domain");
1514 if (np) {
1515 of_genpd_del_provider(np);
1516 of_genpd_remove_last(np);
1517 }
1518 }
1519
1520 static const struct tegra_io_pad_soc *
1521 tegra_io_pad_find(struct tegra_pmc *pmc, enum tegra_io_pad id)
1522 {
1523 unsigned int i;
1524
1525 for (i = 0; i < pmc->soc->num_io_pads; i++)
1526 if (pmc->soc->io_pads[i].id == id)
1527 return &pmc->soc->io_pads[i];
1528
1529 return NULL;
1530 }
1531
1532 static int tegra_io_pad_get_dpd_register_bit(struct tegra_pmc *pmc,
1533 enum tegra_io_pad id,
1534 unsigned long *request,
1535 unsigned long *status,
1536 u32 *mask)
1537 {
1538 const struct tegra_io_pad_soc *pad;
1539
1540 pad = tegra_io_pad_find(pmc, id);
1541 if (!pad) {
1542 dev_err(pmc->dev, "invalid I/O pad ID %u\n", id);
1543 return -ENOENT;
1544 }
1545
1546 if (pad->dpd == UINT_MAX)
1547 return -ENOTSUPP;
1548
1549 *mask = BIT(pad->dpd % 32);
1550
1551 if (pad->dpd < 32) {
1552 *status = pmc->soc->regs->dpd_status;
1553 *request = pmc->soc->regs->dpd_req;
1554 } else {
1555 *status = pmc->soc->regs->dpd2_status;
1556 *request = pmc->soc->regs->dpd2_req;
1557 }
1558
1559 return 0;
1560 }
1561
1562 static int tegra_io_pad_prepare(struct tegra_pmc *pmc, enum tegra_io_pad id,
1563 unsigned long *request, unsigned long *status,
1564 u32 *mask)
1565 {
1566 unsigned long rate, value;
1567 int err;
1568
1569 err = tegra_io_pad_get_dpd_register_bit(pmc, id, request, status, mask);
1570 if (err)
1571 return err;
1572
1573 if (pmc->clk) {
1574 rate = pmc->rate;
1575 if (!rate) {
1576 dev_err(pmc->dev, "failed to get clock rate\n");
1577 return -ENODEV;
1578 }
1579
1580 tegra_pmc_writel(pmc, DPD_SAMPLE_ENABLE, DPD_SAMPLE);
1581
1582
1583 value = DIV_ROUND_UP(1000000000, rate);
1584 value = DIV_ROUND_UP(200, value);
1585 tegra_pmc_writel(pmc, value, SEL_DPD_TIM);
1586 }
1587
1588 return 0;
1589 }
1590
1591 static int tegra_io_pad_poll(struct tegra_pmc *pmc, unsigned long offset,
1592 u32 mask, u32 val, unsigned long timeout)
1593 {
1594 u32 value;
1595
1596 timeout = jiffies + msecs_to_jiffies(timeout);
1597
1598 while (time_after(timeout, jiffies)) {
1599 value = tegra_pmc_readl(pmc, offset);
1600 if ((value & mask) == val)
1601 return 0;
1602
1603 usleep_range(250, 1000);
1604 }
1605
1606 return -ETIMEDOUT;
1607 }
1608
1609 static void tegra_io_pad_unprepare(struct tegra_pmc *pmc)
1610 {
1611 if (pmc->clk)
1612 tegra_pmc_writel(pmc, DPD_SAMPLE_DISABLE, DPD_SAMPLE);
1613 }
1614
1615
1616
1617
1618
1619
1620
1621 int tegra_io_pad_power_enable(enum tegra_io_pad id)
1622 {
1623 unsigned long request, status;
1624 u32 mask;
1625 int err;
1626
1627 mutex_lock(&pmc->powergates_lock);
1628
1629 err = tegra_io_pad_prepare(pmc, id, &request, &status, &mask);
1630 if (err < 0) {
1631 dev_err(pmc->dev, "failed to prepare I/O pad: %d\n", err);
1632 goto unlock;
1633 }
1634
1635 tegra_pmc_writel(pmc, IO_DPD_REQ_CODE_OFF | mask, request);
1636
1637 err = tegra_io_pad_poll(pmc, status, mask, 0, 250);
1638 if (err < 0) {
1639 dev_err(pmc->dev, "failed to enable I/O pad: %d\n", err);
1640 goto unlock;
1641 }
1642
1643 tegra_io_pad_unprepare(pmc);
1644
1645 unlock:
1646 mutex_unlock(&pmc->powergates_lock);
1647 return err;
1648 }
1649 EXPORT_SYMBOL(tegra_io_pad_power_enable);
1650
1651
1652
1653
1654
1655
1656
1657 int tegra_io_pad_power_disable(enum tegra_io_pad id)
1658 {
1659 unsigned long request, status;
1660 u32 mask;
1661 int err;
1662
1663 mutex_lock(&pmc->powergates_lock);
1664
1665 err = tegra_io_pad_prepare(pmc, id, &request, &status, &mask);
1666 if (err < 0) {
1667 dev_err(pmc->dev, "failed to prepare I/O pad: %d\n", err);
1668 goto unlock;
1669 }
1670
1671 tegra_pmc_writel(pmc, IO_DPD_REQ_CODE_ON | mask, request);
1672
1673 err = tegra_io_pad_poll(pmc, status, mask, mask, 250);
1674 if (err < 0) {
1675 dev_err(pmc->dev, "failed to disable I/O pad: %d\n", err);
1676 goto unlock;
1677 }
1678
1679 tegra_io_pad_unprepare(pmc);
1680
1681 unlock:
1682 mutex_unlock(&pmc->powergates_lock);
1683 return err;
1684 }
1685 EXPORT_SYMBOL(tegra_io_pad_power_disable);
1686
1687 static int tegra_io_pad_is_powered(struct tegra_pmc *pmc, enum tegra_io_pad id)
1688 {
1689 unsigned long request, status;
1690 u32 mask, value;
1691 int err;
1692
1693 err = tegra_io_pad_get_dpd_register_bit(pmc, id, &request, &status,
1694 &mask);
1695 if (err)
1696 return err;
1697
1698 value = tegra_pmc_readl(pmc, status);
1699
1700 return !(value & mask);
1701 }
1702
1703 static int tegra_io_pad_set_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id,
1704 int voltage)
1705 {
1706 const struct tegra_io_pad_soc *pad;
1707 u32 value;
1708
1709 pad = tegra_io_pad_find(pmc, id);
1710 if (!pad)
1711 return -ENOENT;
1712
1713 if (pad->voltage == UINT_MAX)
1714 return -ENOTSUPP;
1715
1716 mutex_lock(&pmc->powergates_lock);
1717
1718 if (pmc->soc->has_impl_33v_pwr) {
1719 value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1720
1721 if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1722 value &= ~BIT(pad->voltage);
1723 else
1724 value |= BIT(pad->voltage);
1725
1726 tegra_pmc_writel(pmc, value, PMC_IMPL_E_33V_PWR);
1727 } else {
1728
1729 value = tegra_pmc_readl(pmc, PMC_PWR_DET);
1730 value |= BIT(pad->voltage);
1731 tegra_pmc_writel(pmc, value, PMC_PWR_DET);
1732
1733
1734 value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1735
1736 if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1737 value &= ~BIT(pad->voltage);
1738 else
1739 value |= BIT(pad->voltage);
1740
1741 tegra_pmc_writel(pmc, value, PMC_PWR_DET_VALUE);
1742 }
1743
1744 mutex_unlock(&pmc->powergates_lock);
1745
1746 usleep_range(100, 250);
1747
1748 return 0;
1749 }
1750
1751 static int tegra_io_pad_get_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id)
1752 {
1753 const struct tegra_io_pad_soc *pad;
1754 u32 value;
1755
1756 pad = tegra_io_pad_find(pmc, id);
1757 if (!pad)
1758 return -ENOENT;
1759
1760 if (pad->voltage == UINT_MAX)
1761 return -ENOTSUPP;
1762
1763 if (pmc->soc->has_impl_33v_pwr)
1764 value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1765 else
1766 value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1767
1768 if ((value & BIT(pad->voltage)) == 0)
1769 return TEGRA_IO_PAD_VOLTAGE_1V8;
1770
1771 return TEGRA_IO_PAD_VOLTAGE_3V3;
1772 }
1773
1774
1775
1776
1777
1778
1779
1780 int tegra_io_rail_power_on(unsigned int id)
1781 {
1782 return tegra_io_pad_power_enable(id);
1783 }
1784 EXPORT_SYMBOL(tegra_io_rail_power_on);
1785
1786
1787
1788
1789
1790
1791
1792 int tegra_io_rail_power_off(unsigned int id)
1793 {
1794 return tegra_io_pad_power_disable(id);
1795 }
1796 EXPORT_SYMBOL(tegra_io_rail_power_off);
1797
1798 #ifdef CONFIG_PM_SLEEP
1799 enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
1800 {
1801 return pmc->suspend_mode;
1802 }
1803
1804 void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
1805 {
1806 if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
1807 return;
1808
1809 pmc->suspend_mode = mode;
1810 }
1811
1812 void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode)
1813 {
1814 unsigned long long rate = 0;
1815 u64 ticks;
1816 u32 value;
1817
1818 switch (mode) {
1819 case TEGRA_SUSPEND_LP1:
1820 rate = 32768;
1821 break;
1822
1823 case TEGRA_SUSPEND_LP2:
1824 rate = pmc->rate;
1825 break;
1826
1827 default:
1828 break;
1829 }
1830
1831 if (WARN_ON_ONCE(rate == 0))
1832 rate = 100000000;
1833
1834 ticks = pmc->cpu_good_time * rate + USEC_PER_SEC - 1;
1835 do_div(ticks, USEC_PER_SEC);
1836 tegra_pmc_writel(pmc, ticks, PMC_CPUPWRGOOD_TIMER);
1837
1838 ticks = pmc->cpu_off_time * rate + USEC_PER_SEC - 1;
1839 do_div(ticks, USEC_PER_SEC);
1840 tegra_pmc_writel(pmc, ticks, PMC_CPUPWROFF_TIMER);
1841
1842 value = tegra_pmc_readl(pmc, PMC_CNTRL);
1843 value &= ~PMC_CNTRL_SIDE_EFFECT_LP0;
1844 value |= PMC_CNTRL_CPU_PWRREQ_OE;
1845 tegra_pmc_writel(pmc, value, PMC_CNTRL);
1846 }
1847 #endif
1848
1849 static int tegra_pmc_parse_dt(struct tegra_pmc *pmc, struct device_node *np)
1850 {
1851 u32 value, values[2];
1852
1853 if (of_property_read_u32(np, "nvidia,suspend-mode", &value)) {
1854 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1855 } else {
1856 switch (value) {
1857 case 0:
1858 pmc->suspend_mode = TEGRA_SUSPEND_LP0;
1859 break;
1860
1861 case 1:
1862 pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1863 break;
1864
1865 case 2:
1866 pmc->suspend_mode = TEGRA_SUSPEND_LP2;
1867 break;
1868
1869 default:
1870 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1871 break;
1872 }
1873 }
1874
1875 pmc->suspend_mode = tegra_pm_validate_suspend_mode(pmc->suspend_mode);
1876
1877 if (of_property_read_u32(np, "nvidia,cpu-pwr-good-time", &value))
1878 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1879
1880 pmc->cpu_good_time = value;
1881
1882 if (of_property_read_u32(np, "nvidia,cpu-pwr-off-time", &value))
1883 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1884
1885 pmc->cpu_off_time = value;
1886
1887 if (of_property_read_u32_array(np, "nvidia,core-pwr-good-time",
1888 values, ARRAY_SIZE(values)))
1889 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1890
1891 pmc->core_osc_time = values[0];
1892 pmc->core_pmu_time = values[1];
1893
1894 if (of_property_read_u32(np, "nvidia,core-pwr-off-time", &value))
1895 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1896
1897 pmc->core_off_time = value;
1898
1899 pmc->corereq_high = of_property_read_bool(np,
1900 "nvidia,core-power-req-active-high");
1901
1902 pmc->sysclkreq_high = of_property_read_bool(np,
1903 "nvidia,sys-clock-req-active-high");
1904
1905 pmc->combined_req = of_property_read_bool(np,
1906 "nvidia,combined-power-req");
1907
1908 pmc->cpu_pwr_good_en = of_property_read_bool(np,
1909 "nvidia,cpu-pwr-good-en");
1910
1911 if (of_property_read_u32_array(np, "nvidia,lp0-vec", values,
1912 ARRAY_SIZE(values)))
1913 if (pmc->suspend_mode == TEGRA_SUSPEND_LP0)
1914 pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1915
1916 pmc->lp0_vec_phys = values[0];
1917 pmc->lp0_vec_size = values[1];
1918
1919 return 0;
1920 }
1921
1922 static void tegra_pmc_init(struct tegra_pmc *pmc)
1923 {
1924 if (pmc->soc->init)
1925 pmc->soc->init(pmc);
1926 }
1927
1928 static void tegra_pmc_init_tsense_reset(struct tegra_pmc *pmc)
1929 {
1930 static const char disabled[] = "emergency thermal reset disabled";
1931 u32 pmu_addr, ctrl_id, reg_addr, reg_data, pinmux;
1932 struct device *dev = pmc->dev;
1933 struct device_node *np;
1934 u32 value, checksum;
1935
1936 if (!pmc->soc->has_tsense_reset)
1937 return;
1938
1939 np = of_get_child_by_name(pmc->dev->of_node, "i2c-thermtrip");
1940 if (!np) {
1941 dev_warn(dev, "i2c-thermtrip node not found, %s.\n", disabled);
1942 return;
1943 }
1944
1945 if (of_property_read_u32(np, "nvidia,i2c-controller-id", &ctrl_id)) {
1946 dev_err(dev, "I2C controller ID missing, %s.\n", disabled);
1947 goto out;
1948 }
1949
1950 if (of_property_read_u32(np, "nvidia,bus-addr", &pmu_addr)) {
1951 dev_err(dev, "nvidia,bus-addr missing, %s.\n", disabled);
1952 goto out;
1953 }
1954
1955 if (of_property_read_u32(np, "nvidia,reg-addr", ®_addr)) {
1956 dev_err(dev, "nvidia,reg-addr missing, %s.\n", disabled);
1957 goto out;
1958 }
1959
1960 if (of_property_read_u32(np, "nvidia,reg-data", ®_data)) {
1961 dev_err(dev, "nvidia,reg-data missing, %s.\n", disabled);
1962 goto out;
1963 }
1964
1965 if (of_property_read_u32(np, "nvidia,pinmux-id", &pinmux))
1966 pinmux = 0;
1967
1968 value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
1969 value |= PMC_SENSOR_CTRL_SCRATCH_WRITE;
1970 tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
1971
1972 value = (reg_data << PMC_SCRATCH54_DATA_SHIFT) |
1973 (reg_addr << PMC_SCRATCH54_ADDR_SHIFT);
1974 tegra_pmc_writel(pmc, value, PMC_SCRATCH54);
1975
1976 value = PMC_SCRATCH55_RESET_TEGRA;
1977 value |= ctrl_id << PMC_SCRATCH55_CNTRL_ID_SHIFT;
1978 value |= pinmux << PMC_SCRATCH55_PINMUX_SHIFT;
1979 value |= pmu_addr << PMC_SCRATCH55_I2CSLV1_SHIFT;
1980
1981
1982
1983
1984
1985 checksum = reg_addr + reg_data + (value & 0xff) + ((value >> 8) & 0xff)
1986 + ((value >> 24) & 0xff);
1987 checksum &= 0xff;
1988 checksum = 0x100 - checksum;
1989
1990 value |= checksum << PMC_SCRATCH55_CHECKSUM_SHIFT;
1991
1992 tegra_pmc_writel(pmc, value, PMC_SCRATCH55);
1993
1994 value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
1995 value |= PMC_SENSOR_CTRL_ENABLE_RST;
1996 tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
1997
1998 dev_info(pmc->dev, "emergency thermal reset enabled\n");
1999
2000 out:
2001 of_node_put(np);
2002 }
2003
2004 static int tegra_io_pad_pinctrl_get_groups_count(struct pinctrl_dev *pctl_dev)
2005 {
2006 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2007
2008 return pmc->soc->num_io_pads;
2009 }
2010
2011 static const char *tegra_io_pad_pinctrl_get_group_name(struct pinctrl_dev *pctl,
2012 unsigned int group)
2013 {
2014 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl);
2015
2016 return pmc->soc->io_pads[group].name;
2017 }
2018
2019 static int tegra_io_pad_pinctrl_get_group_pins(struct pinctrl_dev *pctl_dev,
2020 unsigned int group,
2021 const unsigned int **pins,
2022 unsigned int *num_pins)
2023 {
2024 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2025
2026 *pins = &pmc->soc->io_pads[group].id;
2027 *num_pins = 1;
2028
2029 return 0;
2030 }
2031
2032 static const struct pinctrl_ops tegra_io_pad_pinctrl_ops = {
2033 .get_groups_count = tegra_io_pad_pinctrl_get_groups_count,
2034 .get_group_name = tegra_io_pad_pinctrl_get_group_name,
2035 .get_group_pins = tegra_io_pad_pinctrl_get_group_pins,
2036 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
2037 .dt_free_map = pinconf_generic_dt_free_map,
2038 };
2039
2040 static int tegra_io_pad_pinconf_get(struct pinctrl_dev *pctl_dev,
2041 unsigned int pin, unsigned long *config)
2042 {
2043 enum pin_config_param param = pinconf_to_config_param(*config);
2044 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2045 const struct tegra_io_pad_soc *pad;
2046 int ret;
2047 u32 arg;
2048
2049 pad = tegra_io_pad_find(pmc, pin);
2050 if (!pad)
2051 return -EINVAL;
2052
2053 switch (param) {
2054 case PIN_CONFIG_POWER_SOURCE:
2055 ret = tegra_io_pad_get_voltage(pmc, pad->id);
2056 if (ret < 0)
2057 return ret;
2058
2059 arg = ret;
2060 break;
2061
2062 case PIN_CONFIG_MODE_LOW_POWER:
2063 ret = tegra_io_pad_is_powered(pmc, pad->id);
2064 if (ret < 0)
2065 return ret;
2066
2067 arg = !ret;
2068 break;
2069
2070 default:
2071 return -EINVAL;
2072 }
2073
2074 *config = pinconf_to_config_packed(param, arg);
2075
2076 return 0;
2077 }
2078
2079 static int tegra_io_pad_pinconf_set(struct pinctrl_dev *pctl_dev,
2080 unsigned int pin, unsigned long *configs,
2081 unsigned int num_configs)
2082 {
2083 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2084 const struct tegra_io_pad_soc *pad;
2085 enum pin_config_param param;
2086 unsigned int i;
2087 int err;
2088 u32 arg;
2089
2090 pad = tegra_io_pad_find(pmc, pin);
2091 if (!pad)
2092 return -EINVAL;
2093
2094 for (i = 0; i < num_configs; ++i) {
2095 param = pinconf_to_config_param(configs[i]);
2096 arg = pinconf_to_config_argument(configs[i]);
2097
2098 switch (param) {
2099 case PIN_CONFIG_MODE_LOW_POWER:
2100 if (arg)
2101 err = tegra_io_pad_power_disable(pad->id);
2102 else
2103 err = tegra_io_pad_power_enable(pad->id);
2104 if (err)
2105 return err;
2106 break;
2107 case PIN_CONFIG_POWER_SOURCE:
2108 if (arg != TEGRA_IO_PAD_VOLTAGE_1V8 &&
2109 arg != TEGRA_IO_PAD_VOLTAGE_3V3)
2110 return -EINVAL;
2111 err = tegra_io_pad_set_voltage(pmc, pad->id, arg);
2112 if (err)
2113 return err;
2114 break;
2115 default:
2116 return -EINVAL;
2117 }
2118 }
2119
2120 return 0;
2121 }
2122
2123 static const struct pinconf_ops tegra_io_pad_pinconf_ops = {
2124 .pin_config_get = tegra_io_pad_pinconf_get,
2125 .pin_config_set = tegra_io_pad_pinconf_set,
2126 .is_generic = true,
2127 };
2128
2129 static struct pinctrl_desc tegra_pmc_pctl_desc = {
2130 .pctlops = &tegra_io_pad_pinctrl_ops,
2131 .confops = &tegra_io_pad_pinconf_ops,
2132 };
2133
2134 static int tegra_pmc_pinctrl_init(struct tegra_pmc *pmc)
2135 {
2136 int err;
2137
2138 if (!pmc->soc->num_pin_descs)
2139 return 0;
2140
2141 tegra_pmc_pctl_desc.name = dev_name(pmc->dev);
2142 tegra_pmc_pctl_desc.pins = pmc->soc->pin_descs;
2143 tegra_pmc_pctl_desc.npins = pmc->soc->num_pin_descs;
2144
2145 pmc->pctl_dev = devm_pinctrl_register(pmc->dev, &tegra_pmc_pctl_desc,
2146 pmc);
2147 if (IS_ERR(pmc->pctl_dev)) {
2148 err = PTR_ERR(pmc->pctl_dev);
2149 dev_err(pmc->dev, "failed to register pin controller: %d\n",
2150 err);
2151 return err;
2152 }
2153
2154 return 0;
2155 }
2156
2157 static ssize_t reset_reason_show(struct device *dev,
2158 struct device_attribute *attr, char *buf)
2159 {
2160 u32 value;
2161
2162 value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
2163 value &= pmc->soc->regs->rst_source_mask;
2164 value >>= pmc->soc->regs->rst_source_shift;
2165
2166 if (WARN_ON(value >= pmc->soc->num_reset_sources))
2167 return sprintf(buf, "%s\n", "UNKNOWN");
2168
2169 return sprintf(buf, "%s\n", pmc->soc->reset_sources[value]);
2170 }
2171
2172 static DEVICE_ATTR_RO(reset_reason);
2173
2174 static ssize_t reset_level_show(struct device *dev,
2175 struct device_attribute *attr, char *buf)
2176 {
2177 u32 value;
2178
2179 value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
2180 value &= pmc->soc->regs->rst_level_mask;
2181 value >>= pmc->soc->regs->rst_level_shift;
2182
2183 if (WARN_ON(value >= pmc->soc->num_reset_levels))
2184 return sprintf(buf, "%s\n", "UNKNOWN");
2185
2186 return sprintf(buf, "%s\n", pmc->soc->reset_levels[value]);
2187 }
2188
2189 static DEVICE_ATTR_RO(reset_level);
2190
2191 static void tegra_pmc_reset_sysfs_init(struct tegra_pmc *pmc)
2192 {
2193 struct device *dev = pmc->dev;
2194 int err = 0;
2195
2196 if (pmc->soc->reset_sources) {
2197 err = device_create_file(dev, &dev_attr_reset_reason);
2198 if (err < 0)
2199 dev_warn(dev,
2200 "failed to create attr \"reset_reason\": %d\n",
2201 err);
2202 }
2203
2204 if (pmc->soc->reset_levels) {
2205 err = device_create_file(dev, &dev_attr_reset_level);
2206 if (err < 0)
2207 dev_warn(dev,
2208 "failed to create attr \"reset_level\": %d\n",
2209 err);
2210 }
2211 }
2212
2213 static int tegra_pmc_irq_translate(struct irq_domain *domain,
2214 struct irq_fwspec *fwspec,
2215 unsigned long *hwirq,
2216 unsigned int *type)
2217 {
2218 if (WARN_ON(fwspec->param_count < 2))
2219 return -EINVAL;
2220
2221 *hwirq = fwspec->param[0];
2222 *type = fwspec->param[1];
2223
2224 return 0;
2225 }
2226
2227 static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq,
2228 unsigned int num_irqs, void *data)
2229 {
2230 struct tegra_pmc *pmc = domain->host_data;
2231 const struct tegra_pmc_soc *soc = pmc->soc;
2232 struct irq_fwspec *fwspec = data;
2233 unsigned int i;
2234 int err = 0;
2235
2236 if (WARN_ON(num_irqs > 1))
2237 return -EINVAL;
2238
2239 for (i = 0; i < soc->num_wake_events; i++) {
2240 const struct tegra_wake_event *event = &soc->wake_events[i];
2241
2242 if (fwspec->param_count == 2) {
2243 struct irq_fwspec spec;
2244
2245 if (event->id != fwspec->param[0])
2246 continue;
2247
2248 err = irq_domain_set_hwirq_and_chip(domain, virq,
2249 event->id,
2250 &pmc->irq, pmc);
2251 if (err < 0)
2252 break;
2253
2254 spec.fwnode = &pmc->dev->of_node->fwnode;
2255 spec.param_count = 3;
2256 spec.param[0] = GIC_SPI;
2257 spec.param[1] = event->irq;
2258 spec.param[2] = fwspec->param[1];
2259
2260 err = irq_domain_alloc_irqs_parent(domain, virq,
2261 num_irqs, &spec);
2262
2263 break;
2264 }
2265
2266 if (fwspec->param_count == 3) {
2267 if (event->gpio.instance != fwspec->param[0] ||
2268 event->gpio.pin != fwspec->param[1])
2269 continue;
2270
2271 err = irq_domain_set_hwirq_and_chip(domain, virq,
2272 event->id,
2273 &pmc->irq, pmc);
2274
2275
2276 if (!err && domain->parent)
2277 err = irq_domain_disconnect_hierarchy(domain->parent,
2278 virq);
2279 break;
2280 }
2281 }
2282
2283
2284 if (i == soc->num_wake_events)
2285 err = irq_domain_disconnect_hierarchy(domain, virq);
2286
2287 return err;
2288 }
2289
2290 static const struct irq_domain_ops tegra_pmc_irq_domain_ops = {
2291 .translate = tegra_pmc_irq_translate,
2292 .alloc = tegra_pmc_irq_alloc,
2293 };
2294
2295 static int tegra210_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
2296 {
2297 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2298 unsigned int offset, bit;
2299 u32 value;
2300
2301 offset = data->hwirq / 32;
2302 bit = data->hwirq % 32;
2303
2304
2305 tegra_pmc_writel(pmc, 0, PMC_SW_WAKE_STATUS);
2306 tegra_pmc_writel(pmc, 0, PMC_SW_WAKE2_STATUS);
2307
2308 tegra_pmc_writel(pmc, 0, PMC_WAKE_STATUS);
2309 tegra_pmc_writel(pmc, 0, PMC_WAKE2_STATUS);
2310
2311
2312 if (data->hwirq >= 32)
2313 offset = PMC_WAKE2_MASK;
2314 else
2315 offset = PMC_WAKE_MASK;
2316
2317 value = tegra_pmc_readl(pmc, offset);
2318
2319 if (on)
2320 value |= BIT(bit);
2321 else
2322 value &= ~BIT(bit);
2323
2324 tegra_pmc_writel(pmc, value, offset);
2325
2326 return 0;
2327 }
2328
2329 static int tegra210_pmc_irq_set_type(struct irq_data *data, unsigned int type)
2330 {
2331 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2332 unsigned int offset, bit;
2333 u32 value;
2334
2335 offset = data->hwirq / 32;
2336 bit = data->hwirq % 32;
2337
2338 if (data->hwirq >= 32)
2339 offset = PMC_WAKE2_LEVEL;
2340 else
2341 offset = PMC_WAKE_LEVEL;
2342
2343 value = tegra_pmc_readl(pmc, offset);
2344
2345 switch (type) {
2346 case IRQ_TYPE_EDGE_RISING:
2347 case IRQ_TYPE_LEVEL_HIGH:
2348 value |= BIT(bit);
2349 break;
2350
2351 case IRQ_TYPE_EDGE_FALLING:
2352 case IRQ_TYPE_LEVEL_LOW:
2353 value &= ~BIT(bit);
2354 break;
2355
2356 case IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING:
2357 value ^= BIT(bit);
2358 break;
2359
2360 default:
2361 return -EINVAL;
2362 }
2363
2364 tegra_pmc_writel(pmc, value, offset);
2365
2366 return 0;
2367 }
2368
2369 static int tegra186_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
2370 {
2371 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2372 unsigned int offset, bit;
2373 u32 value;
2374
2375 offset = data->hwirq / 32;
2376 bit = data->hwirq % 32;
2377
2378
2379 writel(0x1, pmc->wake + WAKE_AOWAKE_STATUS_W(data->hwirq));
2380
2381
2382 value = readl(pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
2383
2384 if (!on)
2385 value &= ~(1 << bit);
2386 else
2387 value |= 1 << bit;
2388
2389 writel(value, pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
2390
2391
2392 writel(!!on, pmc->wake + WAKE_AOWAKE_MASK_W(data->hwirq));
2393
2394 return 0;
2395 }
2396
2397 static int tegra186_pmc_irq_set_type(struct irq_data *data, unsigned int type)
2398 {
2399 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2400 u32 value;
2401
2402 value = readl(pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
2403
2404 switch (type) {
2405 case IRQ_TYPE_EDGE_RISING:
2406 case IRQ_TYPE_LEVEL_HIGH:
2407 value |= WAKE_AOWAKE_CNTRL_LEVEL;
2408 break;
2409
2410 case IRQ_TYPE_EDGE_FALLING:
2411 case IRQ_TYPE_LEVEL_LOW:
2412 value &= ~WAKE_AOWAKE_CNTRL_LEVEL;
2413 break;
2414
2415 case IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING:
2416 value ^= WAKE_AOWAKE_CNTRL_LEVEL;
2417 break;
2418
2419 default:
2420 return -EINVAL;
2421 }
2422
2423 writel(value, pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
2424
2425 return 0;
2426 }
2427
2428 static void tegra_irq_mask_parent(struct irq_data *data)
2429 {
2430 if (data->parent_data)
2431 irq_chip_mask_parent(data);
2432 }
2433
2434 static void tegra_irq_unmask_parent(struct irq_data *data)
2435 {
2436 if (data->parent_data)
2437 irq_chip_unmask_parent(data);
2438 }
2439
2440 static void tegra_irq_eoi_parent(struct irq_data *data)
2441 {
2442 if (data->parent_data)
2443 irq_chip_eoi_parent(data);
2444 }
2445
2446 static int tegra_irq_set_affinity_parent(struct irq_data *data,
2447 const struct cpumask *dest,
2448 bool force)
2449 {
2450 if (data->parent_data)
2451 return irq_chip_set_affinity_parent(data, dest, force);
2452
2453 return -EINVAL;
2454 }
2455
2456 static int tegra_pmc_irq_init(struct tegra_pmc *pmc)
2457 {
2458 struct irq_domain *parent = NULL;
2459 struct device_node *np;
2460
2461 np = of_irq_find_parent(pmc->dev->of_node);
2462 if (np) {
2463 parent = irq_find_host(np);
2464 of_node_put(np);
2465 }
2466
2467 if (!parent)
2468 return 0;
2469
2470 pmc->irq.name = dev_name(pmc->dev);
2471 pmc->irq.irq_mask = tegra_irq_mask_parent;
2472 pmc->irq.irq_unmask = tegra_irq_unmask_parent;
2473 pmc->irq.irq_eoi = tegra_irq_eoi_parent;
2474 pmc->irq.irq_set_affinity = tegra_irq_set_affinity_parent;
2475 pmc->irq.irq_set_type = pmc->soc->irq_set_type;
2476 pmc->irq.irq_set_wake = pmc->soc->irq_set_wake;
2477
2478 pmc->domain = irq_domain_add_hierarchy(parent, 0, 96, pmc->dev->of_node,
2479 &tegra_pmc_irq_domain_ops, pmc);
2480 if (!pmc->domain) {
2481 dev_err(pmc->dev, "failed to allocate domain\n");
2482 return -ENOMEM;
2483 }
2484
2485 return 0;
2486 }
2487
2488 static int tegra_pmc_clk_notify_cb(struct notifier_block *nb,
2489 unsigned long action, void *ptr)
2490 {
2491 struct tegra_pmc *pmc = container_of(nb, struct tegra_pmc, clk_nb);
2492 struct clk_notifier_data *data = ptr;
2493
2494 switch (action) {
2495 case PRE_RATE_CHANGE:
2496 mutex_lock(&pmc->powergates_lock);
2497 break;
2498
2499 case POST_RATE_CHANGE:
2500 pmc->rate = data->new_rate;
2501 fallthrough;
2502
2503 case ABORT_RATE_CHANGE:
2504 mutex_unlock(&pmc->powergates_lock);
2505 break;
2506
2507 default:
2508 WARN_ON_ONCE(1);
2509 return notifier_from_errno(-EINVAL);
2510 }
2511
2512 return NOTIFY_OK;
2513 }
2514
2515 static void pmc_clk_fence_udelay(u32 offset)
2516 {
2517 tegra_pmc_readl(pmc, offset);
2518
2519 udelay(2);
2520 }
2521
2522 static u8 pmc_clk_mux_get_parent(struct clk_hw *hw)
2523 {
2524 struct pmc_clk *clk = to_pmc_clk(hw);
2525 u32 val;
2526
2527 val = tegra_pmc_readl(pmc, clk->offs) >> clk->mux_shift;
2528 val &= PMC_CLK_OUT_MUX_MASK;
2529
2530 return val;
2531 }
2532
2533 static int pmc_clk_mux_set_parent(struct clk_hw *hw, u8 index)
2534 {
2535 struct pmc_clk *clk = to_pmc_clk(hw);
2536 u32 val;
2537
2538 val = tegra_pmc_readl(pmc, clk->offs);
2539 val &= ~(PMC_CLK_OUT_MUX_MASK << clk->mux_shift);
2540 val |= index << clk->mux_shift;
2541 tegra_pmc_writel(pmc, val, clk->offs);
2542 pmc_clk_fence_udelay(clk->offs);
2543
2544 return 0;
2545 }
2546
2547 static int pmc_clk_is_enabled(struct clk_hw *hw)
2548 {
2549 struct pmc_clk *clk = to_pmc_clk(hw);
2550 u32 val;
2551
2552 val = tegra_pmc_readl(pmc, clk->offs) & BIT(clk->force_en_shift);
2553
2554 return val ? 1 : 0;
2555 }
2556
2557 static void pmc_clk_set_state(unsigned long offs, u32 shift, int state)
2558 {
2559 u32 val;
2560
2561 val = tegra_pmc_readl(pmc, offs);
2562 val = state ? (val | BIT(shift)) : (val & ~BIT(shift));
2563 tegra_pmc_writel(pmc, val, offs);
2564 pmc_clk_fence_udelay(offs);
2565 }
2566
2567 static int pmc_clk_enable(struct clk_hw *hw)
2568 {
2569 struct pmc_clk *clk = to_pmc_clk(hw);
2570
2571 pmc_clk_set_state(clk->offs, clk->force_en_shift, 1);
2572
2573 return 0;
2574 }
2575
2576 static void pmc_clk_disable(struct clk_hw *hw)
2577 {
2578 struct pmc_clk *clk = to_pmc_clk(hw);
2579
2580 pmc_clk_set_state(clk->offs, clk->force_en_shift, 0);
2581 }
2582
2583 static const struct clk_ops pmc_clk_ops = {
2584 .get_parent = pmc_clk_mux_get_parent,
2585 .set_parent = pmc_clk_mux_set_parent,
2586 .determine_rate = __clk_mux_determine_rate,
2587 .is_enabled = pmc_clk_is_enabled,
2588 .enable = pmc_clk_enable,
2589 .disable = pmc_clk_disable,
2590 };
2591
2592 static struct clk *
2593 tegra_pmc_clk_out_register(struct tegra_pmc *pmc,
2594 const struct pmc_clk_init_data *data,
2595 unsigned long offset)
2596 {
2597 struct clk_init_data init;
2598 struct pmc_clk *pmc_clk;
2599
2600 pmc_clk = devm_kzalloc(pmc->dev, sizeof(*pmc_clk), GFP_KERNEL);
2601 if (!pmc_clk)
2602 return ERR_PTR(-ENOMEM);
2603
2604 init.name = data->name;
2605 init.ops = &pmc_clk_ops;
2606 init.parent_names = data->parents;
2607 init.num_parents = data->num_parents;
2608 init.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
2609 CLK_SET_PARENT_GATE;
2610
2611 pmc_clk->hw.init = &init;
2612 pmc_clk->offs = offset;
2613 pmc_clk->mux_shift = data->mux_shift;
2614 pmc_clk->force_en_shift = data->force_en_shift;
2615
2616 return clk_register(NULL, &pmc_clk->hw);
2617 }
2618
2619 static int pmc_clk_gate_is_enabled(struct clk_hw *hw)
2620 {
2621 struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2622
2623 return tegra_pmc_readl(pmc, gate->offs) & BIT(gate->shift) ? 1 : 0;
2624 }
2625
2626 static int pmc_clk_gate_enable(struct clk_hw *hw)
2627 {
2628 struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2629
2630 pmc_clk_set_state(gate->offs, gate->shift, 1);
2631
2632 return 0;
2633 }
2634
2635 static void pmc_clk_gate_disable(struct clk_hw *hw)
2636 {
2637 struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2638
2639 pmc_clk_set_state(gate->offs, gate->shift, 0);
2640 }
2641
2642 static const struct clk_ops pmc_clk_gate_ops = {
2643 .is_enabled = pmc_clk_gate_is_enabled,
2644 .enable = pmc_clk_gate_enable,
2645 .disable = pmc_clk_gate_disable,
2646 };
2647
2648 static struct clk *
2649 tegra_pmc_clk_gate_register(struct tegra_pmc *pmc, const char *name,
2650 const char *parent_name, unsigned long offset,
2651 u32 shift)
2652 {
2653 struct clk_init_data init;
2654 struct pmc_clk_gate *gate;
2655
2656 gate = devm_kzalloc(pmc->dev, sizeof(*gate), GFP_KERNEL);
2657 if (!gate)
2658 return ERR_PTR(-ENOMEM);
2659
2660 init.name = name;
2661 init.ops = &pmc_clk_gate_ops;
2662 init.parent_names = &parent_name;
2663 init.num_parents = 1;
2664 init.flags = 0;
2665
2666 gate->hw.init = &init;
2667 gate->offs = offset;
2668 gate->shift = shift;
2669
2670 return clk_register(NULL, &gate->hw);
2671 }
2672
2673 static void tegra_pmc_clock_register(struct tegra_pmc *pmc,
2674 struct device_node *np)
2675 {
2676 struct clk *clk;
2677 struct clk_onecell_data *clk_data;
2678 unsigned int num_clks;
2679 int i, err;
2680
2681 num_clks = pmc->soc->num_pmc_clks;
2682 if (pmc->soc->has_blink_output)
2683 num_clks += 1;
2684
2685 if (!num_clks)
2686 return;
2687
2688 clk_data = devm_kmalloc(pmc->dev, sizeof(*clk_data), GFP_KERNEL);
2689 if (!clk_data)
2690 return;
2691
2692 clk_data->clks = devm_kcalloc(pmc->dev, TEGRA_PMC_CLK_MAX,
2693 sizeof(*clk_data->clks), GFP_KERNEL);
2694 if (!clk_data->clks)
2695 return;
2696
2697 clk_data->clk_num = TEGRA_PMC_CLK_MAX;
2698
2699 for (i = 0; i < TEGRA_PMC_CLK_MAX; i++)
2700 clk_data->clks[i] = ERR_PTR(-ENOENT);
2701
2702 for (i = 0; i < pmc->soc->num_pmc_clks; i++) {
2703 const struct pmc_clk_init_data *data;
2704
2705 data = pmc->soc->pmc_clks_data + i;
2706
2707 clk = tegra_pmc_clk_out_register(pmc, data, PMC_CLK_OUT_CNTRL);
2708 if (IS_ERR(clk)) {
2709 dev_warn(pmc->dev, "unable to register clock %s: %d\n",
2710 data->name, PTR_ERR_OR_ZERO(clk));
2711 return;
2712 }
2713
2714 err = clk_register_clkdev(clk, data->name, NULL);
2715 if (err) {
2716 dev_warn(pmc->dev,
2717 "unable to register %s clock lookup: %d\n",
2718 data->name, err);
2719 return;
2720 }
2721
2722 clk_data->clks[data->clk_id] = clk;
2723 }
2724
2725 if (pmc->soc->has_blink_output) {
2726 tegra_pmc_writel(pmc, 0x0, PMC_BLINK_TIMER);
2727 clk = tegra_pmc_clk_gate_register(pmc,
2728 "pmc_blink_override",
2729 "clk_32k",
2730 PMC_DPD_PADS_ORIDE,
2731 PMC_DPD_PADS_ORIDE_BLINK);
2732 if (IS_ERR(clk)) {
2733 dev_warn(pmc->dev,
2734 "unable to register pmc_blink_override: %d\n",
2735 PTR_ERR_OR_ZERO(clk));
2736 return;
2737 }
2738
2739 clk = tegra_pmc_clk_gate_register(pmc, "pmc_blink",
2740 "pmc_blink_override",
2741 PMC_CNTRL,
2742 PMC_CNTRL_BLINK_EN);
2743 if (IS_ERR(clk)) {
2744 dev_warn(pmc->dev,
2745 "unable to register pmc_blink: %d\n",
2746 PTR_ERR_OR_ZERO(clk));
2747 return;
2748 }
2749
2750 err = clk_register_clkdev(clk, "pmc_blink", NULL);
2751 if (err) {
2752 dev_warn(pmc->dev,
2753 "unable to register pmc_blink lookup: %d\n",
2754 err);
2755 return;
2756 }
2757
2758 clk_data->clks[TEGRA_PMC_CLK_BLINK] = clk;
2759 }
2760
2761 err = of_clk_add_provider(np, of_clk_src_onecell_get, clk_data);
2762 if (err)
2763 dev_warn(pmc->dev, "failed to add pmc clock provider: %d\n",
2764 err);
2765 }
2766
2767 static const struct regmap_range pmc_usb_sleepwalk_ranges[] = {
2768 regmap_reg_range(PMC_USB_DEBOUNCE_DEL, PMC_USB_AO),
2769 regmap_reg_range(PMC_UTMIP_UHSIC_TRIGGERS, PMC_UTMIP_UHSIC_SAVED_STATE),
2770 regmap_reg_range(PMC_UTMIP_TERM_PAD_CFG, PMC_UTMIP_UHSIC_FAKE),
2771 regmap_reg_range(PMC_UTMIP_UHSIC_LINE_WAKEUP, PMC_UTMIP_UHSIC_LINE_WAKEUP),
2772 regmap_reg_range(PMC_UTMIP_BIAS_MASTER_CNTRL, PMC_UTMIP_MASTER_CONFIG),
2773 regmap_reg_range(PMC_UTMIP_UHSIC2_TRIGGERS, PMC_UTMIP_MASTER2_CONFIG),
2774 regmap_reg_range(PMC_UTMIP_PAD_CFG0, PMC_UTMIP_UHSIC_SLEEP_CFG1),
2775 regmap_reg_range(PMC_UTMIP_SLEEPWALK_P3, PMC_UTMIP_SLEEPWALK_P3),
2776 };
2777
2778 static const struct regmap_access_table pmc_usb_sleepwalk_table = {
2779 .yes_ranges = pmc_usb_sleepwalk_ranges,
2780 .n_yes_ranges = ARRAY_SIZE(pmc_usb_sleepwalk_ranges),
2781 };
2782
2783 static int tegra_pmc_regmap_readl(void *context, unsigned int offset, unsigned int *value)
2784 {
2785 struct tegra_pmc *pmc = context;
2786
2787 *value = tegra_pmc_readl(pmc, offset);
2788 return 0;
2789 }
2790
2791 static int tegra_pmc_regmap_writel(void *context, unsigned int offset, unsigned int value)
2792 {
2793 struct tegra_pmc *pmc = context;
2794
2795 tegra_pmc_writel(pmc, value, offset);
2796 return 0;
2797 }
2798
2799 static const struct regmap_config usb_sleepwalk_regmap_config = {
2800 .name = "usb_sleepwalk",
2801 .reg_bits = 32,
2802 .val_bits = 32,
2803 .reg_stride = 4,
2804 .fast_io = true,
2805 .rd_table = &pmc_usb_sleepwalk_table,
2806 .wr_table = &pmc_usb_sleepwalk_table,
2807 .reg_read = tegra_pmc_regmap_readl,
2808 .reg_write = tegra_pmc_regmap_writel,
2809 };
2810
2811 static int tegra_pmc_regmap_init(struct tegra_pmc *pmc)
2812 {
2813 struct regmap *regmap;
2814 int err;
2815
2816 if (pmc->soc->has_usb_sleepwalk) {
2817 regmap = devm_regmap_init(pmc->dev, NULL, pmc, &usb_sleepwalk_regmap_config);
2818 if (IS_ERR(regmap)) {
2819 err = PTR_ERR(regmap);
2820 dev_err(pmc->dev, "failed to allocate register map (%d)\n", err);
2821 return err;
2822 }
2823 }
2824
2825 return 0;
2826 }
2827
2828 static void tegra_pmc_reset_suspend_mode(void *data)
2829 {
2830 pmc->suspend_mode = TEGRA_SUSPEND_NOT_READY;
2831 }
2832
2833 static int tegra_pmc_probe(struct platform_device *pdev)
2834 {
2835 void __iomem *base;
2836 struct resource *res;
2837 int err;
2838
2839
2840
2841
2842
2843
2844 if (WARN_ON(!pmc->base || !pmc->soc))
2845 return -ENODEV;
2846
2847 err = tegra_pmc_parse_dt(pmc, pdev->dev.of_node);
2848 if (err < 0)
2849 return err;
2850
2851 err = devm_add_action_or_reset(&pdev->dev, tegra_pmc_reset_suspend_mode,
2852 NULL);
2853 if (err)
2854 return err;
2855
2856
2857 base = devm_platform_ioremap_resource(pdev, 0);
2858 if (IS_ERR(base))
2859 return PTR_ERR(base);
2860
2861 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wake");
2862 if (res) {
2863 pmc->wake = devm_ioremap_resource(&pdev->dev, res);
2864 if (IS_ERR(pmc->wake))
2865 return PTR_ERR(pmc->wake);
2866 } else {
2867 pmc->wake = base;
2868 }
2869
2870 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aotag");
2871 if (res) {
2872 pmc->aotag = devm_ioremap_resource(&pdev->dev, res);
2873 if (IS_ERR(pmc->aotag))
2874 return PTR_ERR(pmc->aotag);
2875 } else {
2876 pmc->aotag = base;
2877 }
2878
2879 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "scratch");
2880 if (res) {
2881 pmc->scratch = devm_ioremap_resource(&pdev->dev, res);
2882 if (IS_ERR(pmc->scratch))
2883 return PTR_ERR(pmc->scratch);
2884 } else {
2885 pmc->scratch = base;
2886 }
2887
2888 pmc->clk = devm_clk_get(&pdev->dev, "pclk");
2889 if (IS_ERR(pmc->clk)) {
2890 err = PTR_ERR(pmc->clk);
2891
2892 if (err != -ENOENT) {
2893 dev_err(&pdev->dev, "failed to get pclk: %d\n", err);
2894 return err;
2895 }
2896
2897 pmc->clk = NULL;
2898 }
2899
2900
2901
2902
2903
2904 err = devm_register_reboot_notifier(&pdev->dev,
2905 &tegra_pmc_reboot_notifier);
2906 if (err) {
2907 dev_err(&pdev->dev, "unable to register reboot notifier, %d\n",
2908 err);
2909 return err;
2910 }
2911
2912 err = devm_register_sys_off_handler(&pdev->dev,
2913 SYS_OFF_MODE_RESTART,
2914 SYS_OFF_PRIO_LOW,
2915 tegra_pmc_restart_handler, NULL);
2916 if (err) {
2917 dev_err(&pdev->dev, "failed to register sys-off handler: %d\n",
2918 err);
2919 return err;
2920 }
2921
2922
2923
2924
2925
2926 err = devm_register_sys_off_handler(&pdev->dev,
2927 SYS_OFF_MODE_POWER_OFF,
2928 SYS_OFF_PRIO_FIRMWARE,
2929 tegra_pmc_power_off_handler, NULL);
2930 if (err) {
2931 dev_err(&pdev->dev, "failed to register sys-off handler: %d\n",
2932 err);
2933 return err;
2934 }
2935
2936
2937
2938
2939
2940
2941 if (pmc->clk) {
2942 pmc->clk_nb.notifier_call = tegra_pmc_clk_notify_cb;
2943 err = clk_notifier_register(pmc->clk, &pmc->clk_nb);
2944 if (err) {
2945 dev_err(&pdev->dev,
2946 "failed to register clk notifier\n");
2947 return err;
2948 }
2949
2950 pmc->rate = clk_get_rate(pmc->clk);
2951 }
2952
2953 pmc->dev = &pdev->dev;
2954
2955 tegra_pmc_init(pmc);
2956
2957 tegra_pmc_init_tsense_reset(pmc);
2958
2959 tegra_pmc_reset_sysfs_init(pmc);
2960
2961 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
2962 err = tegra_powergate_debugfs_init();
2963 if (err < 0)
2964 goto cleanup_sysfs;
2965 }
2966
2967 err = tegra_pmc_pinctrl_init(pmc);
2968 if (err)
2969 goto cleanup_debugfs;
2970
2971 err = tegra_pmc_regmap_init(pmc);
2972 if (err < 0)
2973 goto cleanup_debugfs;
2974
2975 err = tegra_powergate_init(pmc, pdev->dev.of_node);
2976 if (err < 0)
2977 goto cleanup_powergates;
2978
2979 err = tegra_pmc_irq_init(pmc);
2980 if (err < 0)
2981 goto cleanup_powergates;
2982
2983 mutex_lock(&pmc->powergates_lock);
2984 iounmap(pmc->base);
2985 pmc->base = base;
2986 mutex_unlock(&pmc->powergates_lock);
2987
2988 tegra_pmc_clock_register(pmc, pdev->dev.of_node);
2989 platform_set_drvdata(pdev, pmc);
2990 tegra_pm_init_suspend();
2991
2992 return 0;
2993
2994 cleanup_powergates:
2995 tegra_powergate_remove_all(pdev->dev.of_node);
2996 cleanup_debugfs:
2997 debugfs_remove(pmc->debugfs);
2998 cleanup_sysfs:
2999 device_remove_file(&pdev->dev, &dev_attr_reset_reason);
3000 device_remove_file(&pdev->dev, &dev_attr_reset_level);
3001 clk_notifier_unregister(pmc->clk, &pmc->clk_nb);
3002
3003 return err;
3004 }
3005
3006 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
3007 static int tegra_pmc_suspend(struct device *dev)
3008 {
3009 struct tegra_pmc *pmc = dev_get_drvdata(dev);
3010
3011 tegra_pmc_writel(pmc, virt_to_phys(tegra_resume), PMC_SCRATCH41);
3012
3013 return 0;
3014 }
3015
3016 static int tegra_pmc_resume(struct device *dev)
3017 {
3018 struct tegra_pmc *pmc = dev_get_drvdata(dev);
3019
3020 tegra_pmc_writel(pmc, 0x0, PMC_SCRATCH41);
3021
3022 return 0;
3023 }
3024
3025 static SIMPLE_DEV_PM_OPS(tegra_pmc_pm_ops, tegra_pmc_suspend, tegra_pmc_resume);
3026
3027 #endif
3028
3029 static const char * const tegra20_powergates[] = {
3030 [TEGRA_POWERGATE_CPU] = "cpu",
3031 [TEGRA_POWERGATE_3D] = "td",
3032 [TEGRA_POWERGATE_VENC] = "venc",
3033 [TEGRA_POWERGATE_VDEC] = "vdec",
3034 [TEGRA_POWERGATE_PCIE] = "pcie",
3035 [TEGRA_POWERGATE_L2] = "l2",
3036 [TEGRA_POWERGATE_MPE] = "mpe",
3037 };
3038
3039 static const struct tegra_pmc_regs tegra20_pmc_regs = {
3040 .scratch0 = 0x50,
3041 .dpd_req = 0x1b8,
3042 .dpd_status = 0x1bc,
3043 .dpd2_req = 0x1c0,
3044 .dpd2_status = 0x1c4,
3045 .rst_status = 0x1b4,
3046 .rst_source_shift = 0x0,
3047 .rst_source_mask = 0x7,
3048 .rst_level_shift = 0x0,
3049 .rst_level_mask = 0x0,
3050 };
3051
3052 static void tegra20_pmc_init(struct tegra_pmc *pmc)
3053 {
3054 u32 value, osc, pmu, off;
3055
3056
3057 value = tegra_pmc_readl(pmc, PMC_CNTRL);
3058 value |= PMC_CNTRL_CPU_PWRREQ_OE;
3059 tegra_pmc_writel(pmc, value, PMC_CNTRL);
3060
3061 value = tegra_pmc_readl(pmc, PMC_CNTRL);
3062
3063 if (pmc->sysclkreq_high)
3064 value &= ~PMC_CNTRL_SYSCLK_POLARITY;
3065 else
3066 value |= PMC_CNTRL_SYSCLK_POLARITY;
3067
3068 if (pmc->corereq_high)
3069 value &= ~PMC_CNTRL_PWRREQ_POLARITY;
3070 else
3071 value |= PMC_CNTRL_PWRREQ_POLARITY;
3072
3073
3074 tegra_pmc_writel(pmc, value, PMC_CNTRL);
3075
3076
3077 value = tegra_pmc_readl(pmc, PMC_CNTRL);
3078 value |= PMC_CNTRL_SYSCLK_OE;
3079 tegra_pmc_writel(pmc, value, PMC_CNTRL);
3080
3081
3082 if (pmc->suspend_mode != TEGRA_SUSPEND_NONE) {
3083 osc = DIV_ROUND_UP(pmc->core_osc_time * 8192, 1000000);
3084 pmu = DIV_ROUND_UP(pmc->core_pmu_time * 32768, 1000000);
3085 off = DIV_ROUND_UP(pmc->core_off_time * 32768, 1000000);
3086 tegra_pmc_writel(pmc, ((osc << 8) & 0xff00) | (pmu & 0xff),
3087 PMC_COREPWRGOOD_TIMER);
3088 tegra_pmc_writel(pmc, off, PMC_COREPWROFF_TIMER);
3089 }
3090 }
3091
3092 static void tegra20_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
3093 struct device_node *np,
3094 bool invert)
3095 {
3096 u32 value;
3097
3098 value = tegra_pmc_readl(pmc, PMC_CNTRL);
3099
3100 if (invert)
3101 value |= PMC_CNTRL_INTR_POLARITY;
3102 else
3103 value &= ~PMC_CNTRL_INTR_POLARITY;
3104
3105 tegra_pmc_writel(pmc, value, PMC_CNTRL);
3106 }
3107
3108 static const struct tegra_pmc_soc tegra20_pmc_soc = {
3109 .supports_core_domain = true,
3110 .num_powergates = ARRAY_SIZE(tegra20_powergates),
3111 .powergates = tegra20_powergates,
3112 .num_cpu_powergates = 0,
3113 .cpu_powergates = NULL,
3114 .has_tsense_reset = false,
3115 .has_gpu_clamps = false,
3116 .needs_mbist_war = false,
3117 .has_impl_33v_pwr = false,
3118 .maybe_tz_only = false,
3119 .num_io_pads = 0,
3120 .io_pads = NULL,
3121 .num_pin_descs = 0,
3122 .pin_descs = NULL,
3123 .regs = &tegra20_pmc_regs,
3124 .init = tegra20_pmc_init,
3125 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3126 .powergate_set = tegra20_powergate_set,
3127 .reset_sources = NULL,
3128 .num_reset_sources = 0,
3129 .reset_levels = NULL,
3130 .num_reset_levels = 0,
3131 .pmc_clks_data = NULL,
3132 .num_pmc_clks = 0,
3133 .has_blink_output = true,
3134 .has_usb_sleepwalk = true,
3135 };
3136
3137 static const char * const tegra30_powergates[] = {
3138 [TEGRA_POWERGATE_CPU] = "cpu0",
3139 [TEGRA_POWERGATE_3D] = "td",
3140 [TEGRA_POWERGATE_VENC] = "venc",
3141 [TEGRA_POWERGATE_VDEC] = "vdec",
3142 [TEGRA_POWERGATE_PCIE] = "pcie",
3143 [TEGRA_POWERGATE_L2] = "l2",
3144 [TEGRA_POWERGATE_MPE] = "mpe",
3145 [TEGRA_POWERGATE_HEG] = "heg",
3146 [TEGRA_POWERGATE_SATA] = "sata",
3147 [TEGRA_POWERGATE_CPU1] = "cpu1",
3148 [TEGRA_POWERGATE_CPU2] = "cpu2",
3149 [TEGRA_POWERGATE_CPU3] = "cpu3",
3150 [TEGRA_POWERGATE_CELP] = "celp",
3151 [TEGRA_POWERGATE_3D1] = "td2",
3152 };
3153
3154 static const u8 tegra30_cpu_powergates[] = {
3155 TEGRA_POWERGATE_CPU,
3156 TEGRA_POWERGATE_CPU1,
3157 TEGRA_POWERGATE_CPU2,
3158 TEGRA_POWERGATE_CPU3,
3159 };
3160
3161 static const char * const tegra30_reset_sources[] = {
3162 "POWER_ON_RESET",
3163 "WATCHDOG",
3164 "SENSOR",
3165 "SW_MAIN",
3166 "LP0"
3167 };
3168
3169 static const struct tegra_pmc_soc tegra30_pmc_soc = {
3170 .supports_core_domain = true,
3171 .num_powergates = ARRAY_SIZE(tegra30_powergates),
3172 .powergates = tegra30_powergates,
3173 .num_cpu_powergates = ARRAY_SIZE(tegra30_cpu_powergates),
3174 .cpu_powergates = tegra30_cpu_powergates,
3175 .has_tsense_reset = true,
3176 .has_gpu_clamps = false,
3177 .needs_mbist_war = false,
3178 .has_impl_33v_pwr = false,
3179 .maybe_tz_only = false,
3180 .num_io_pads = 0,
3181 .io_pads = NULL,
3182 .num_pin_descs = 0,
3183 .pin_descs = NULL,
3184 .regs = &tegra20_pmc_regs,
3185 .init = tegra20_pmc_init,
3186 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3187 .powergate_set = tegra20_powergate_set,
3188 .reset_sources = tegra30_reset_sources,
3189 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3190 .reset_levels = NULL,
3191 .num_reset_levels = 0,
3192 .pmc_clks_data = tegra_pmc_clks_data,
3193 .num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3194 .has_blink_output = true,
3195 .has_usb_sleepwalk = true,
3196 };
3197
3198 static const char * const tegra114_powergates[] = {
3199 [TEGRA_POWERGATE_CPU] = "crail",
3200 [TEGRA_POWERGATE_3D] = "td",
3201 [TEGRA_POWERGATE_VENC] = "venc",
3202 [TEGRA_POWERGATE_VDEC] = "vdec",
3203 [TEGRA_POWERGATE_MPE] = "mpe",
3204 [TEGRA_POWERGATE_HEG] = "heg",
3205 [TEGRA_POWERGATE_CPU1] = "cpu1",
3206 [TEGRA_POWERGATE_CPU2] = "cpu2",
3207 [TEGRA_POWERGATE_CPU3] = "cpu3",
3208 [TEGRA_POWERGATE_CELP] = "celp",
3209 [TEGRA_POWERGATE_CPU0] = "cpu0",
3210 [TEGRA_POWERGATE_C0NC] = "c0nc",
3211 [TEGRA_POWERGATE_C1NC] = "c1nc",
3212 [TEGRA_POWERGATE_DIS] = "dis",
3213 [TEGRA_POWERGATE_DISB] = "disb",
3214 [TEGRA_POWERGATE_XUSBA] = "xusba",
3215 [TEGRA_POWERGATE_XUSBB] = "xusbb",
3216 [TEGRA_POWERGATE_XUSBC] = "xusbc",
3217 };
3218
3219 static const u8 tegra114_cpu_powergates[] = {
3220 TEGRA_POWERGATE_CPU0,
3221 TEGRA_POWERGATE_CPU1,
3222 TEGRA_POWERGATE_CPU2,
3223 TEGRA_POWERGATE_CPU3,
3224 };
3225
3226 static const struct tegra_pmc_soc tegra114_pmc_soc = {
3227 .supports_core_domain = false,
3228 .num_powergates = ARRAY_SIZE(tegra114_powergates),
3229 .powergates = tegra114_powergates,
3230 .num_cpu_powergates = ARRAY_SIZE(tegra114_cpu_powergates),
3231 .cpu_powergates = tegra114_cpu_powergates,
3232 .has_tsense_reset = true,
3233 .has_gpu_clamps = false,
3234 .needs_mbist_war = false,
3235 .has_impl_33v_pwr = false,
3236 .maybe_tz_only = false,
3237 .num_io_pads = 0,
3238 .io_pads = NULL,
3239 .num_pin_descs = 0,
3240 .pin_descs = NULL,
3241 .regs = &tegra20_pmc_regs,
3242 .init = tegra20_pmc_init,
3243 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3244 .powergate_set = tegra114_powergate_set,
3245 .reset_sources = tegra30_reset_sources,
3246 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3247 .reset_levels = NULL,
3248 .num_reset_levels = 0,
3249 .pmc_clks_data = tegra_pmc_clks_data,
3250 .num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3251 .has_blink_output = true,
3252 .has_usb_sleepwalk = true,
3253 };
3254
3255 static const char * const tegra124_powergates[] = {
3256 [TEGRA_POWERGATE_CPU] = "crail",
3257 [TEGRA_POWERGATE_3D] = "3d",
3258 [TEGRA_POWERGATE_VENC] = "venc",
3259 [TEGRA_POWERGATE_PCIE] = "pcie",
3260 [TEGRA_POWERGATE_VDEC] = "vdec",
3261 [TEGRA_POWERGATE_MPE] = "mpe",
3262 [TEGRA_POWERGATE_HEG] = "heg",
3263 [TEGRA_POWERGATE_SATA] = "sata",
3264 [TEGRA_POWERGATE_CPU1] = "cpu1",
3265 [TEGRA_POWERGATE_CPU2] = "cpu2",
3266 [TEGRA_POWERGATE_CPU3] = "cpu3",
3267 [TEGRA_POWERGATE_CELP] = "celp",
3268 [TEGRA_POWERGATE_CPU0] = "cpu0",
3269 [TEGRA_POWERGATE_C0NC] = "c0nc",
3270 [TEGRA_POWERGATE_C1NC] = "c1nc",
3271 [TEGRA_POWERGATE_SOR] = "sor",
3272 [TEGRA_POWERGATE_DIS] = "dis",
3273 [TEGRA_POWERGATE_DISB] = "disb",
3274 [TEGRA_POWERGATE_XUSBA] = "xusba",
3275 [TEGRA_POWERGATE_XUSBB] = "xusbb",
3276 [TEGRA_POWERGATE_XUSBC] = "xusbc",
3277 [TEGRA_POWERGATE_VIC] = "vic",
3278 [TEGRA_POWERGATE_IRAM] = "iram",
3279 };
3280
3281 static const u8 tegra124_cpu_powergates[] = {
3282 TEGRA_POWERGATE_CPU0,
3283 TEGRA_POWERGATE_CPU1,
3284 TEGRA_POWERGATE_CPU2,
3285 TEGRA_POWERGATE_CPU3,
3286 };
3287
3288 #define TEGRA_IO_PAD(_id, _dpd, _voltage, _name) \
3289 ((struct tegra_io_pad_soc) { \
3290 .id = (_id), \
3291 .dpd = (_dpd), \
3292 .voltage = (_voltage), \
3293 .name = (_name), \
3294 })
3295
3296 #define TEGRA_IO_PIN_DESC(_id, _dpd, _voltage, _name) \
3297 ((struct pinctrl_pin_desc) { \
3298 .number = (_id), \
3299 .name = (_name) \
3300 })
3301
3302 #define TEGRA124_IO_PAD_TABLE(_pad) \
3303 \
3304 _pad(TEGRA_IO_PAD_AUDIO, 17, UINT_MAX, "audio"), \
3305 _pad(TEGRA_IO_PAD_BB, 15, UINT_MAX, "bb"), \
3306 _pad(TEGRA_IO_PAD_CAM, 36, UINT_MAX, "cam"), \
3307 _pad(TEGRA_IO_PAD_COMP, 22, UINT_MAX, "comp"), \
3308 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
3309 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csb"), \
3310 _pad(TEGRA_IO_PAD_CSIE, 44, UINT_MAX, "cse"), \
3311 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
3312 _pad(TEGRA_IO_PAD_DSIB, 39, UINT_MAX, "dsib"), \
3313 _pad(TEGRA_IO_PAD_DSIC, 40, UINT_MAX, "dsic"), \
3314 _pad(TEGRA_IO_PAD_DSID, 41, UINT_MAX, "dsid"), \
3315 _pad(TEGRA_IO_PAD_HDMI, 28, UINT_MAX, "hdmi"), \
3316 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
3317 _pad(TEGRA_IO_PAD_HV, 38, UINT_MAX, "hv"), \
3318 _pad(TEGRA_IO_PAD_LVDS, 57, UINT_MAX, "lvds"), \
3319 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
3320 _pad(TEGRA_IO_PAD_NAND, 13, UINT_MAX, "nand"), \
3321 _pad(TEGRA_IO_PAD_PEX_BIAS, 4, UINT_MAX, "pex-bias"), \
3322 _pad(TEGRA_IO_PAD_PEX_CLK1, 5, UINT_MAX, "pex-clk1"), \
3323 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
3324 _pad(TEGRA_IO_PAD_PEX_CNTRL, 32, UINT_MAX, "pex-cntrl"), \
3325 _pad(TEGRA_IO_PAD_SDMMC1, 33, UINT_MAX, "sdmmc1"), \
3326 _pad(TEGRA_IO_PAD_SDMMC3, 34, UINT_MAX, "sdmmc3"), \
3327 _pad(TEGRA_IO_PAD_SDMMC4, 35, UINT_MAX, "sdmmc4"), \
3328 _pad(TEGRA_IO_PAD_SYS_DDC, 58, UINT_MAX, "sys_ddc"), \
3329 _pad(TEGRA_IO_PAD_UART, 14, UINT_MAX, "uart"), \
3330 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
3331 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
3332 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
3333 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb_bias")
3334
3335 static const struct tegra_io_pad_soc tegra124_io_pads[] = {
3336 TEGRA124_IO_PAD_TABLE(TEGRA_IO_PAD)
3337 };
3338
3339 static const struct pinctrl_pin_desc tegra124_pin_descs[] = {
3340 TEGRA124_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
3341 };
3342
3343 static const struct tegra_pmc_soc tegra124_pmc_soc = {
3344 .supports_core_domain = false,
3345 .num_powergates = ARRAY_SIZE(tegra124_powergates),
3346 .powergates = tegra124_powergates,
3347 .num_cpu_powergates = ARRAY_SIZE(tegra124_cpu_powergates),
3348 .cpu_powergates = tegra124_cpu_powergates,
3349 .has_tsense_reset = true,
3350 .has_gpu_clamps = true,
3351 .needs_mbist_war = false,
3352 .has_impl_33v_pwr = false,
3353 .maybe_tz_only = false,
3354 .num_io_pads = ARRAY_SIZE(tegra124_io_pads),
3355 .io_pads = tegra124_io_pads,
3356 .num_pin_descs = ARRAY_SIZE(tegra124_pin_descs),
3357 .pin_descs = tegra124_pin_descs,
3358 .regs = &tegra20_pmc_regs,
3359 .init = tegra20_pmc_init,
3360 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3361 .powergate_set = tegra114_powergate_set,
3362 .reset_sources = tegra30_reset_sources,
3363 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3364 .reset_levels = NULL,
3365 .num_reset_levels = 0,
3366 .pmc_clks_data = tegra_pmc_clks_data,
3367 .num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3368 .has_blink_output = true,
3369 .has_usb_sleepwalk = true,
3370 };
3371
3372 static const char * const tegra210_powergates[] = {
3373 [TEGRA_POWERGATE_CPU] = "crail",
3374 [TEGRA_POWERGATE_3D] = "3d",
3375 [TEGRA_POWERGATE_VENC] = "venc",
3376 [TEGRA_POWERGATE_PCIE] = "pcie",
3377 [TEGRA_POWERGATE_MPE] = "mpe",
3378 [TEGRA_POWERGATE_SATA] = "sata",
3379 [TEGRA_POWERGATE_CPU1] = "cpu1",
3380 [TEGRA_POWERGATE_CPU2] = "cpu2",
3381 [TEGRA_POWERGATE_CPU3] = "cpu3",
3382 [TEGRA_POWERGATE_CPU0] = "cpu0",
3383 [TEGRA_POWERGATE_C0NC] = "c0nc",
3384 [TEGRA_POWERGATE_SOR] = "sor",
3385 [TEGRA_POWERGATE_DIS] = "dis",
3386 [TEGRA_POWERGATE_DISB] = "disb",
3387 [TEGRA_POWERGATE_XUSBA] = "xusba",
3388 [TEGRA_POWERGATE_XUSBB] = "xusbb",
3389 [TEGRA_POWERGATE_XUSBC] = "xusbc",
3390 [TEGRA_POWERGATE_VIC] = "vic",
3391 [TEGRA_POWERGATE_IRAM] = "iram",
3392 [TEGRA_POWERGATE_NVDEC] = "nvdec",
3393 [TEGRA_POWERGATE_NVJPG] = "nvjpg",
3394 [TEGRA_POWERGATE_AUD] = "aud",
3395 [TEGRA_POWERGATE_DFD] = "dfd",
3396 [TEGRA_POWERGATE_VE2] = "ve2",
3397 };
3398
3399 static const u8 tegra210_cpu_powergates[] = {
3400 TEGRA_POWERGATE_CPU0,
3401 TEGRA_POWERGATE_CPU1,
3402 TEGRA_POWERGATE_CPU2,
3403 TEGRA_POWERGATE_CPU3,
3404 };
3405
3406 #define TEGRA210_IO_PAD_TABLE(_pad) \
3407 \
3408 _pad(TEGRA_IO_PAD_AUDIO, 17, 5, "audio"), \
3409 _pad(TEGRA_IO_PAD_AUDIO_HV, 61, 18, "audio-hv"), \
3410 _pad(TEGRA_IO_PAD_CAM, 36, 10, "cam"), \
3411 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
3412 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csib"), \
3413 _pad(TEGRA_IO_PAD_CSIC, 42, UINT_MAX, "csic"), \
3414 _pad(TEGRA_IO_PAD_CSID, 43, UINT_MAX, "csid"), \
3415 _pad(TEGRA_IO_PAD_CSIE, 44, UINT_MAX, "csie"), \
3416 _pad(TEGRA_IO_PAD_CSIF, 45, UINT_MAX, "csif"), \
3417 _pad(TEGRA_IO_PAD_DBG, 25, 19, "dbg"), \
3418 _pad(TEGRA_IO_PAD_DEBUG_NONAO, 26, UINT_MAX, "debug-nonao"), \
3419 _pad(TEGRA_IO_PAD_DMIC, 50, 20, "dmic"), \
3420 _pad(TEGRA_IO_PAD_DP, 51, UINT_MAX, "dp"), \
3421 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
3422 _pad(TEGRA_IO_PAD_DSIB, 39, UINT_MAX, "dsib"), \
3423 _pad(TEGRA_IO_PAD_DSIC, 40, UINT_MAX, "dsic"), \
3424 _pad(TEGRA_IO_PAD_DSID, 41, UINT_MAX, "dsid"), \
3425 _pad(TEGRA_IO_PAD_EMMC, 35, UINT_MAX, "emmc"), \
3426 _pad(TEGRA_IO_PAD_EMMC2, 37, UINT_MAX, "emmc2"), \
3427 _pad(TEGRA_IO_PAD_GPIO, 27, 21, "gpio"), \
3428 _pad(TEGRA_IO_PAD_HDMI, 28, UINT_MAX, "hdmi"), \
3429 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
3430 _pad(TEGRA_IO_PAD_LVDS, 57, UINT_MAX, "lvds"), \
3431 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
3432 _pad(TEGRA_IO_PAD_PEX_BIAS, 4, UINT_MAX, "pex-bias"), \
3433 _pad(TEGRA_IO_PAD_PEX_CLK1, 5, UINT_MAX, "pex-clk1"), \
3434 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
3435 _pad(TEGRA_IO_PAD_PEX_CNTRL, UINT_MAX, 11, "pex-cntrl"), \
3436 _pad(TEGRA_IO_PAD_SDMMC1, 33, 12, "sdmmc1"), \
3437 _pad(TEGRA_IO_PAD_SDMMC3, 34, 13, "sdmmc3"), \
3438 _pad(TEGRA_IO_PAD_SPI, 46, 22, "spi"), \
3439 _pad(TEGRA_IO_PAD_SPI_HV, 47, 23, "spi-hv"), \
3440 _pad(TEGRA_IO_PAD_UART, 14, 2, "uart"), \
3441 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
3442 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
3443 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
3444 _pad(TEGRA_IO_PAD_USB3, 18, UINT_MAX, "usb3"), \
3445 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb-bias")
3446
3447 static const struct tegra_io_pad_soc tegra210_io_pads[] = {
3448 TEGRA210_IO_PAD_TABLE(TEGRA_IO_PAD)
3449 };
3450
3451 static const struct pinctrl_pin_desc tegra210_pin_descs[] = {
3452 TEGRA210_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
3453 };
3454
3455 static const char * const tegra210_reset_sources[] = {
3456 "POWER_ON_RESET",
3457 "WATCHDOG",
3458 "SENSOR",
3459 "SW_MAIN",
3460 "LP0",
3461 "AOTAG"
3462 };
3463
3464 static const struct tegra_wake_event tegra210_wake_events[] = {
3465 TEGRA_WAKE_IRQ("rtc", 16, 2),
3466 TEGRA_WAKE_IRQ("pmu", 51, 86),
3467 };
3468
3469 static const struct tegra_pmc_soc tegra210_pmc_soc = {
3470 .supports_core_domain = false,
3471 .num_powergates = ARRAY_SIZE(tegra210_powergates),
3472 .powergates = tegra210_powergates,
3473 .num_cpu_powergates = ARRAY_SIZE(tegra210_cpu_powergates),
3474 .cpu_powergates = tegra210_cpu_powergates,
3475 .has_tsense_reset = true,
3476 .has_gpu_clamps = true,
3477 .needs_mbist_war = true,
3478 .has_impl_33v_pwr = false,
3479 .maybe_tz_only = true,
3480 .num_io_pads = ARRAY_SIZE(tegra210_io_pads),
3481 .io_pads = tegra210_io_pads,
3482 .num_pin_descs = ARRAY_SIZE(tegra210_pin_descs),
3483 .pin_descs = tegra210_pin_descs,
3484 .regs = &tegra20_pmc_regs,
3485 .init = tegra20_pmc_init,
3486 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3487 .powergate_set = tegra114_powergate_set,
3488 .irq_set_wake = tegra210_pmc_irq_set_wake,
3489 .irq_set_type = tegra210_pmc_irq_set_type,
3490 .reset_sources = tegra210_reset_sources,
3491 .num_reset_sources = ARRAY_SIZE(tegra210_reset_sources),
3492 .reset_levels = NULL,
3493 .num_reset_levels = 0,
3494 .num_wake_events = ARRAY_SIZE(tegra210_wake_events),
3495 .wake_events = tegra210_wake_events,
3496 .pmc_clks_data = tegra_pmc_clks_data,
3497 .num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3498 .has_blink_output = true,
3499 .has_usb_sleepwalk = true,
3500 };
3501
3502 #define TEGRA186_IO_PAD_TABLE(_pad) \
3503 \
3504 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
3505 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csib"), \
3506 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
3507 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
3508 _pad(TEGRA_IO_PAD_PEX_CLK_BIAS, 4, UINT_MAX, "pex-clk-bias"), \
3509 _pad(TEGRA_IO_PAD_PEX_CLK3, 5, UINT_MAX, "pex-clk3"), \
3510 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
3511 _pad(TEGRA_IO_PAD_PEX_CLK1, 7, UINT_MAX, "pex-clk1"), \
3512 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
3513 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
3514 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
3515 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb-bias"), \
3516 _pad(TEGRA_IO_PAD_UART, 14, UINT_MAX, "uart"), \
3517 _pad(TEGRA_IO_PAD_AUDIO, 17, UINT_MAX, "audio"), \
3518 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
3519 _pad(TEGRA_IO_PAD_DBG, 25, UINT_MAX, "dbg"), \
3520 _pad(TEGRA_IO_PAD_HDMI_DP0, 28, UINT_MAX, "hdmi-dp0"), \
3521 _pad(TEGRA_IO_PAD_HDMI_DP1, 29, UINT_MAX, "hdmi-dp1"), \
3522 _pad(TEGRA_IO_PAD_PEX_CNTRL, 32, UINT_MAX, "pex-cntrl"), \
3523 _pad(TEGRA_IO_PAD_SDMMC2_HV, 34, 5, "sdmmc2-hv"), \
3524 _pad(TEGRA_IO_PAD_SDMMC4, 36, UINT_MAX, "sdmmc4"), \
3525 _pad(TEGRA_IO_PAD_CAM, 38, UINT_MAX, "cam"), \
3526 _pad(TEGRA_IO_PAD_DSIB, 40, UINT_MAX, "dsib"), \
3527 _pad(TEGRA_IO_PAD_DSIC, 41, UINT_MAX, "dsic"), \
3528 _pad(TEGRA_IO_PAD_DSID, 42, UINT_MAX, "dsid"), \
3529 _pad(TEGRA_IO_PAD_CSIC, 43, UINT_MAX, "csic"), \
3530 _pad(TEGRA_IO_PAD_CSID, 44, UINT_MAX, "csid"), \
3531 _pad(TEGRA_IO_PAD_CSIE, 45, UINT_MAX, "csie"), \
3532 _pad(TEGRA_IO_PAD_CSIF, 46, UINT_MAX, "csif"), \
3533 _pad(TEGRA_IO_PAD_SPI, 47, UINT_MAX, "spi"), \
3534 _pad(TEGRA_IO_PAD_UFS, 49, UINT_MAX, "ufs"), \
3535 _pad(TEGRA_IO_PAD_DMIC_HV, 52, 2, "dmic-hv"), \
3536 _pad(TEGRA_IO_PAD_EDP, 53, UINT_MAX, "edp"), \
3537 _pad(TEGRA_IO_PAD_SDMMC1_HV, 55, 4, "sdmmc1-hv"), \
3538 _pad(TEGRA_IO_PAD_SDMMC3_HV, 56, 6, "sdmmc3-hv"), \
3539 _pad(TEGRA_IO_PAD_CONN, 60, UINT_MAX, "conn"), \
3540 _pad(TEGRA_IO_PAD_AUDIO_HV, 61, 1, "audio-hv"), \
3541 _pad(TEGRA_IO_PAD_AO_HV, UINT_MAX, 0, "ao-hv")
3542
3543 static const struct tegra_io_pad_soc tegra186_io_pads[] = {
3544 TEGRA186_IO_PAD_TABLE(TEGRA_IO_PAD)
3545 };
3546
3547 static const struct pinctrl_pin_desc tegra186_pin_descs[] = {
3548 TEGRA186_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
3549 };
3550
3551 static const struct tegra_pmc_regs tegra186_pmc_regs = {
3552 .scratch0 = 0x2000,
3553 .dpd_req = 0x74,
3554 .dpd_status = 0x78,
3555 .dpd2_req = 0x7c,
3556 .dpd2_status = 0x80,
3557 .rst_status = 0x70,
3558 .rst_source_shift = 0x2,
3559 .rst_source_mask = 0x3c,
3560 .rst_level_shift = 0x0,
3561 .rst_level_mask = 0x3,
3562 };
3563
3564 static void tegra186_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
3565 struct device_node *np,
3566 bool invert)
3567 {
3568 struct resource regs;
3569 void __iomem *wake;
3570 u32 value;
3571 int index;
3572
3573 index = of_property_match_string(np, "reg-names", "wake");
3574 if (index < 0) {
3575 dev_err(pmc->dev, "failed to find PMC wake registers\n");
3576 return;
3577 }
3578
3579 of_address_to_resource(np, index, ®s);
3580
3581 wake = ioremap(regs.start, resource_size(®s));
3582 if (!wake) {
3583 dev_err(pmc->dev, "failed to map PMC wake registers\n");
3584 return;
3585 }
3586
3587 value = readl(wake + WAKE_AOWAKE_CTRL);
3588
3589 if (invert)
3590 value |= WAKE_AOWAKE_CTRL_INTR_POLARITY;
3591 else
3592 value &= ~WAKE_AOWAKE_CTRL_INTR_POLARITY;
3593
3594 writel(value, wake + WAKE_AOWAKE_CTRL);
3595
3596 iounmap(wake);
3597 }
3598
3599 static const char * const tegra186_reset_sources[] = {
3600 "SYS_RESET",
3601 "AOWDT",
3602 "MCCPLEXWDT",
3603 "BPMPWDT",
3604 "SCEWDT",
3605 "SPEWDT",
3606 "APEWDT",
3607 "BCCPLEXWDT",
3608 "SENSOR",
3609 "AOTAG",
3610 "VFSENSOR",
3611 "SWREST",
3612 "SC7",
3613 "HSM",
3614 "CORESIGHT"
3615 };
3616
3617 static const char * const tegra186_reset_levels[] = {
3618 "L0", "L1", "L2", "WARM"
3619 };
3620
3621 static const struct tegra_wake_event tegra186_wake_events[] = {
3622 TEGRA_WAKE_IRQ("pmu", 24, 209),
3623 TEGRA_WAKE_GPIO("power", 29, 1, TEGRA186_AON_GPIO(FF, 0)),
3624 TEGRA_WAKE_IRQ("rtc", 73, 10),
3625 };
3626
3627 static const struct tegra_pmc_soc tegra186_pmc_soc = {
3628 .supports_core_domain = false,
3629 .num_powergates = 0,
3630 .powergates = NULL,
3631 .num_cpu_powergates = 0,
3632 .cpu_powergates = NULL,
3633 .has_tsense_reset = false,
3634 .has_gpu_clamps = false,
3635 .needs_mbist_war = false,
3636 .has_impl_33v_pwr = true,
3637 .maybe_tz_only = false,
3638 .num_io_pads = ARRAY_SIZE(tegra186_io_pads),
3639 .io_pads = tegra186_io_pads,
3640 .num_pin_descs = ARRAY_SIZE(tegra186_pin_descs),
3641 .pin_descs = tegra186_pin_descs,
3642 .regs = &tegra186_pmc_regs,
3643 .init = NULL,
3644 .setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
3645 .irq_set_wake = tegra186_pmc_irq_set_wake,
3646 .irq_set_type = tegra186_pmc_irq_set_type,
3647 .reset_sources = tegra186_reset_sources,
3648 .num_reset_sources = ARRAY_SIZE(tegra186_reset_sources),
3649 .reset_levels = tegra186_reset_levels,
3650 .num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
3651 .num_wake_events = ARRAY_SIZE(tegra186_wake_events),
3652 .wake_events = tegra186_wake_events,
3653 .pmc_clks_data = NULL,
3654 .num_pmc_clks = 0,
3655 .has_blink_output = false,
3656 .has_usb_sleepwalk = false,
3657 };
3658
3659 #define TEGRA194_IO_PAD_TABLE(_pad) \
3660 \
3661 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
3662 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csib"), \
3663 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
3664 _pad(TEGRA_IO_PAD_PEX_CLK_BIAS, 4, UINT_MAX, "pex-clk-bias"), \
3665 _pad(TEGRA_IO_PAD_PEX_CLK3, 5, UINT_MAX, "pex-clk3"), \
3666 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
3667 _pad(TEGRA_IO_PAD_PEX_CLK1, 7, UINT_MAX, "pex-clk1"), \
3668 _pad(TEGRA_IO_PAD_EQOS, 8, UINT_MAX, "eqos"), \
3669 _pad(TEGRA_IO_PAD_PEX_CLK_2_BIAS, 9, UINT_MAX, "pex-clk-2-bias"), \
3670 _pad(TEGRA_IO_PAD_PEX_CLK_2, 10, UINT_MAX, "pex-clk-2"), \
3671 _pad(TEGRA_IO_PAD_DAP3, 11, UINT_MAX, "dap3"), \
3672 _pad(TEGRA_IO_PAD_DAP5, 12, UINT_MAX, "dap5"), \
3673 _pad(TEGRA_IO_PAD_UART, 14, UINT_MAX, "uart"), \
3674 _pad(TEGRA_IO_PAD_PWR_CTL, 15, UINT_MAX, "pwr-ctl"), \
3675 _pad(TEGRA_IO_PAD_SOC_GPIO53, 16, UINT_MAX, "soc-gpio53"), \
3676 _pad(TEGRA_IO_PAD_AUDIO, 17, UINT_MAX, "audio"), \
3677 _pad(TEGRA_IO_PAD_GP_PWM2, 18, UINT_MAX, "gp-pwm2"), \
3678 _pad(TEGRA_IO_PAD_GP_PWM3, 19, UINT_MAX, "gp-pwm3"), \
3679 _pad(TEGRA_IO_PAD_SOC_GPIO12, 20, UINT_MAX, "soc-gpio12"), \
3680 _pad(TEGRA_IO_PAD_SOC_GPIO13, 21, UINT_MAX, "soc-gpio13"), \
3681 _pad(TEGRA_IO_PAD_SOC_GPIO10, 22, UINT_MAX, "soc-gpio10"), \
3682 _pad(TEGRA_IO_PAD_UART4, 23, UINT_MAX, "uart4"), \
3683 _pad(TEGRA_IO_PAD_UART5, 24, UINT_MAX, "uart5"), \
3684 _pad(TEGRA_IO_PAD_DBG, 25, UINT_MAX, "dbg"), \
3685 _pad(TEGRA_IO_PAD_HDMI_DP3, 26, UINT_MAX, "hdmi-dp3"), \
3686 _pad(TEGRA_IO_PAD_HDMI_DP2, 27, UINT_MAX, "hdmi-dp2"), \
3687 _pad(TEGRA_IO_PAD_HDMI_DP0, 28, UINT_MAX, "hdmi-dp0"), \
3688 _pad(TEGRA_IO_PAD_HDMI_DP1, 29, UINT_MAX, "hdmi-dp1"), \
3689 _pad(TEGRA_IO_PAD_PEX_CNTRL, 32, UINT_MAX, "pex-cntrl"), \
3690 _pad(TEGRA_IO_PAD_PEX_CTL2, 33, UINT_MAX, "pex-ctl2"), \
3691 _pad(TEGRA_IO_PAD_PEX_L0_RST_N, 34, UINT_MAX, "pex-l0-rst"), \
3692 _pad(TEGRA_IO_PAD_PEX_L1_RST_N, 35, UINT_MAX, "pex-l1-rst"), \
3693 _pad(TEGRA_IO_PAD_SDMMC4, 36, UINT_MAX, "sdmmc4"), \
3694 _pad(TEGRA_IO_PAD_PEX_L5_RST_N, 37, UINT_MAX, "pex-l5-rst"), \
3695 _pad(TEGRA_IO_PAD_CAM, 38, UINT_MAX, "cam"), \
3696 _pad(TEGRA_IO_PAD_CSIC, 43, UINT_MAX, "csic"), \
3697 _pad(TEGRA_IO_PAD_CSID, 44, UINT_MAX, "csid"), \
3698 _pad(TEGRA_IO_PAD_CSIE, 45, UINT_MAX, "csie"), \
3699 _pad(TEGRA_IO_PAD_CSIF, 46, UINT_MAX, "csif"), \
3700 _pad(TEGRA_IO_PAD_SPI, 47, UINT_MAX, "spi"), \
3701 _pad(TEGRA_IO_PAD_UFS, 49, UINT_MAX, "ufs"), \
3702 _pad(TEGRA_IO_PAD_CSIG, 50, UINT_MAX, "csig"), \
3703 _pad(TEGRA_IO_PAD_CSIH, 51, UINT_MAX, "csih"), \
3704 _pad(TEGRA_IO_PAD_EDP, 53, UINT_MAX, "edp"), \
3705 _pad(TEGRA_IO_PAD_SDMMC1_HV, 55, 4, "sdmmc1-hv"), \
3706 _pad(TEGRA_IO_PAD_SDMMC3_HV, 56, 6, "sdmmc3-hv"), \
3707 _pad(TEGRA_IO_PAD_CONN, 60, UINT_MAX, "conn"), \
3708 _pad(TEGRA_IO_PAD_AUDIO_HV, 61, 1, "audio-hv"), \
3709 _pad(TEGRA_IO_PAD_AO_HV, UINT_MAX, 0, "ao-hv")
3710
3711 static const struct tegra_io_pad_soc tegra194_io_pads[] = {
3712 TEGRA194_IO_PAD_TABLE(TEGRA_IO_PAD)
3713 };
3714
3715 static const struct pinctrl_pin_desc tegra194_pin_descs[] = {
3716 TEGRA194_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
3717 };
3718
3719 static const struct tegra_pmc_regs tegra194_pmc_regs = {
3720 .scratch0 = 0x2000,
3721 .dpd_req = 0x74,
3722 .dpd_status = 0x78,
3723 .dpd2_req = 0x7c,
3724 .dpd2_status = 0x80,
3725 .rst_status = 0x70,
3726 .rst_source_shift = 0x2,
3727 .rst_source_mask = 0x7c,
3728 .rst_level_shift = 0x0,
3729 .rst_level_mask = 0x3,
3730 };
3731
3732 static const char * const tegra194_reset_sources[] = {
3733 "SYS_RESET_N",
3734 "AOWDT",
3735 "BCCPLEXWDT",
3736 "BPMPWDT",
3737 "SCEWDT",
3738 "SPEWDT",
3739 "APEWDT",
3740 "LCCPLEXWDT",
3741 "SENSOR",
3742 "AOTAG",
3743 "VFSENSOR",
3744 "MAINSWRST",
3745 "SC7",
3746 "HSM",
3747 "CSITE",
3748 "RCEWDT",
3749 "PVA0WDT",
3750 "PVA1WDT",
3751 "L1A_ASYNC",
3752 "BPMPBOOT",
3753 "FUSECRC",
3754 };
3755
3756 static const struct tegra_wake_event tegra194_wake_events[] = {
3757 TEGRA_WAKE_IRQ("pmu", 24, 209),
3758 TEGRA_WAKE_GPIO("power", 29, 1, TEGRA194_AON_GPIO(EE, 4)),
3759 TEGRA_WAKE_IRQ("rtc", 73, 10),
3760 };
3761
3762 static const struct tegra_pmc_soc tegra194_pmc_soc = {
3763 .supports_core_domain = false,
3764 .num_powergates = 0,
3765 .powergates = NULL,
3766 .num_cpu_powergates = 0,
3767 .cpu_powergates = NULL,
3768 .has_tsense_reset = false,
3769 .has_gpu_clamps = false,
3770 .needs_mbist_war = false,
3771 .has_impl_33v_pwr = true,
3772 .maybe_tz_only = false,
3773 .num_io_pads = ARRAY_SIZE(tegra194_io_pads),
3774 .io_pads = tegra194_io_pads,
3775 .num_pin_descs = ARRAY_SIZE(tegra194_pin_descs),
3776 .pin_descs = tegra194_pin_descs,
3777 .regs = &tegra194_pmc_regs,
3778 .init = NULL,
3779 .setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
3780 .irq_set_wake = tegra186_pmc_irq_set_wake,
3781 .irq_set_type = tegra186_pmc_irq_set_type,
3782 .reset_sources = tegra194_reset_sources,
3783 .num_reset_sources = ARRAY_SIZE(tegra194_reset_sources),
3784 .reset_levels = tegra186_reset_levels,
3785 .num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
3786 .num_wake_events = ARRAY_SIZE(tegra194_wake_events),
3787 .wake_events = tegra194_wake_events,
3788 .pmc_clks_data = NULL,
3789 .num_pmc_clks = 0,
3790 .has_blink_output = false,
3791 .has_usb_sleepwalk = false,
3792 };
3793
3794 static const struct tegra_pmc_regs tegra234_pmc_regs = {
3795 .scratch0 = 0x2000,
3796 .dpd_req = 0,
3797 .dpd_status = 0,
3798 .dpd2_req = 0,
3799 .dpd2_status = 0,
3800 .rst_status = 0x70,
3801 .rst_source_shift = 0x2,
3802 .rst_source_mask = 0xfc,
3803 .rst_level_shift = 0x0,
3804 .rst_level_mask = 0x3,
3805 };
3806
3807 static const char * const tegra234_reset_sources[] = {
3808 "SYS_RESET_N",
3809 "AOWDT",
3810 "BCCPLEXWDT",
3811 "BPMPWDT",
3812 "SCEWDT",
3813 "SPEWDT",
3814 "APEWDT",
3815 "LCCPLEXWDT",
3816 "SENSOR",
3817 NULL,
3818 NULL,
3819 "MAINSWRST",
3820 "SC7",
3821 "HSM",
3822 NULL,
3823 "RCEWDT",
3824 NULL,
3825 NULL,
3826 NULL,
3827 "BPMPBOOT",
3828 "FUSECRC",
3829 "DCEWDT",
3830 "PSCWDT",
3831 "PSC",
3832 "CSITE_SW",
3833 "POD",
3834 "SCPM",
3835 "VREFRO_POWERBAD",
3836 "VMON",
3837 "FMON",
3838 "FSI_R5WDT",
3839 "FSI_THERM",
3840 "FSI_R52C0WDT",
3841 "FSI_R52C1WDT",
3842 "FSI_R52C2WDT",
3843 "FSI_R52C3WDT",
3844 "FSI_FMON",
3845 "FSI_VMON",
3846 };
3847
3848 static const struct tegra_wake_event tegra234_wake_events[] = {
3849 TEGRA_WAKE_GPIO("power", 29, 1, TEGRA234_AON_GPIO(EE, 4)),
3850 TEGRA_WAKE_IRQ("rtc", 73, 10),
3851 };
3852
3853 static const struct tegra_pmc_soc tegra234_pmc_soc = {
3854 .supports_core_domain = false,
3855 .num_powergates = 0,
3856 .powergates = NULL,
3857 .num_cpu_powergates = 0,
3858 .cpu_powergates = NULL,
3859 .has_tsense_reset = false,
3860 .has_gpu_clamps = false,
3861 .needs_mbist_war = false,
3862 .has_impl_33v_pwr = true,
3863 .maybe_tz_only = false,
3864 .num_io_pads = 0,
3865 .io_pads = NULL,
3866 .num_pin_descs = 0,
3867 .pin_descs = NULL,
3868 .regs = &tegra234_pmc_regs,
3869 .init = NULL,
3870 .setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
3871 .irq_set_wake = tegra186_pmc_irq_set_wake,
3872 .irq_set_type = tegra186_pmc_irq_set_type,
3873 .reset_sources = tegra234_reset_sources,
3874 .num_reset_sources = ARRAY_SIZE(tegra234_reset_sources),
3875 .reset_levels = tegra186_reset_levels,
3876 .num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
3877 .num_wake_events = ARRAY_SIZE(tegra234_wake_events),
3878 .wake_events = tegra234_wake_events,
3879 .pmc_clks_data = NULL,
3880 .num_pmc_clks = 0,
3881 .has_blink_output = false,
3882 };
3883
3884 static const struct of_device_id tegra_pmc_match[] = {
3885 { .compatible = "nvidia,tegra234-pmc", .data = &tegra234_pmc_soc },
3886 { .compatible = "nvidia,tegra194-pmc", .data = &tegra194_pmc_soc },
3887 { .compatible = "nvidia,tegra186-pmc", .data = &tegra186_pmc_soc },
3888 { .compatible = "nvidia,tegra210-pmc", .data = &tegra210_pmc_soc },
3889 { .compatible = "nvidia,tegra132-pmc", .data = &tegra124_pmc_soc },
3890 { .compatible = "nvidia,tegra124-pmc", .data = &tegra124_pmc_soc },
3891 { .compatible = "nvidia,tegra114-pmc", .data = &tegra114_pmc_soc },
3892 { .compatible = "nvidia,tegra30-pmc", .data = &tegra30_pmc_soc },
3893 { .compatible = "nvidia,tegra20-pmc", .data = &tegra20_pmc_soc },
3894 { }
3895 };
3896
3897 static void tegra_pmc_sync_state(struct device *dev)
3898 {
3899 int err;
3900
3901
3902
3903
3904
3905
3906 if (!pmc->soc->supports_core_domain)
3907 return;
3908
3909
3910
3911
3912
3913
3914 if (!pmc->core_domain_registered)
3915 return;
3916
3917 pmc->core_domain_state_synced = true;
3918
3919
3920 mutex_lock(&pmc->powergates_lock);
3921 err = dev_pm_opp_sync_regulators(dev);
3922 mutex_unlock(&pmc->powergates_lock);
3923
3924 if (err)
3925 dev_err(dev, "failed to sync regulators: %d\n", err);
3926 }
3927
3928 static struct platform_driver tegra_pmc_driver = {
3929 .driver = {
3930 .name = "tegra-pmc",
3931 .suppress_bind_attrs = true,
3932 .of_match_table = tegra_pmc_match,
3933 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
3934 .pm = &tegra_pmc_pm_ops,
3935 #endif
3936 .sync_state = tegra_pmc_sync_state,
3937 },
3938 .probe = tegra_pmc_probe,
3939 };
3940 builtin_platform_driver(tegra_pmc_driver);
3941
3942 static bool __init tegra_pmc_detect_tz_only(struct tegra_pmc *pmc)
3943 {
3944 u32 value, saved;
3945
3946 saved = readl(pmc->base + pmc->soc->regs->scratch0);
3947 value = saved ^ 0xffffffff;
3948
3949 if (value == 0xffffffff)
3950 value = 0xdeadbeef;
3951
3952
3953 writel(value, pmc->base + pmc->soc->regs->scratch0);
3954 value = readl(pmc->base + pmc->soc->regs->scratch0);
3955
3956
3957 if (value == 0) {
3958 pr_info("access to PMC is restricted to TZ\n");
3959 return true;
3960 }
3961
3962
3963 writel(saved, pmc->base + pmc->soc->regs->scratch0);
3964
3965 return false;
3966 }
3967
3968
3969
3970
3971
3972 static int __init tegra_pmc_early_init(void)
3973 {
3974 const struct of_device_id *match;
3975 struct device_node *np;
3976 struct resource regs;
3977 unsigned int i;
3978 bool invert;
3979
3980 mutex_init(&pmc->powergates_lock);
3981
3982 np = of_find_matching_node_and_match(NULL, tegra_pmc_match, &match);
3983 if (!np) {
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994 if (IS_ENABLED(CONFIG_ARM) && soc_is_tegra()) {
3995 pr_warn("DT node not found, powergating disabled\n");
3996
3997 regs.start = 0x7000e400;
3998 regs.end = 0x7000e7ff;
3999 regs.flags = IORESOURCE_MEM;
4000
4001 pr_warn("Using memory region %pR\n", ®s);
4002 } else {
4003
4004
4005
4006
4007 return 0;
4008 }
4009 } else {
4010
4011
4012
4013
4014 if (of_address_to_resource(np, 0, ®s) < 0) {
4015 pr_err("failed to get PMC registers\n");
4016 of_node_put(np);
4017 return -ENXIO;
4018 }
4019 }
4020
4021 pmc->base = ioremap(regs.start, resource_size(®s));
4022 if (!pmc->base) {
4023 pr_err("failed to map PMC registers\n");
4024 of_node_put(np);
4025 return -ENXIO;
4026 }
4027
4028 if (np) {
4029 pmc->soc = match->data;
4030
4031 if (pmc->soc->maybe_tz_only)
4032 pmc->tz_only = tegra_pmc_detect_tz_only(pmc);
4033
4034
4035 for (i = 0; i < pmc->soc->num_powergates; i++)
4036 if (pmc->soc->powergates[i])
4037 set_bit(i, pmc->powergates_available);
4038
4039
4040
4041
4042
4043 invert = of_property_read_bool(np, "nvidia,invert-interrupt");
4044
4045 pmc->soc->setup_irq_polarity(pmc, np, invert);
4046
4047 of_node_put(np);
4048 }
4049
4050 return 0;
4051 }
4052 early_initcall(tegra_pmc_early_init);