spi: sprd: adi: Add a reset reason for watchdog mode
[linux/fpc-iii.git] / drivers / soc / tegra / pmc.c
blob9f9c1c677cf4200336e6876c467e669c2abc93ea
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * drivers/soc/tegra/pmc.c
5 * Copyright (c) 2010 Google, Inc
6 * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
8 * Author:
9 * Colin Cross <ccross@google.com>
12 #define pr_fmt(fmt) "tegra-pmc: " fmt
14 #include <linux/arm-smccc.h>
15 #include <linux/clk.h>
16 #include <linux/clk/tegra.h>
17 #include <linux/debugfs.h>
18 #include <linux/delay.h>
19 #include <linux/err.h>
20 #include <linux/export.h>
21 #include <linux/init.h>
22 #include <linux/io.h>
23 #include <linux/iopoll.h>
24 #include <linux/irqdomain.h>
25 #include <linux/irq.h>
26 #include <linux/kernel.h>
27 #include <linux/of_address.h>
28 #include <linux/of_clk.h>
29 #include <linux/of.h>
30 #include <linux/of_irq.h>
31 #include <linux/of_platform.h>
32 #include <linux/pinctrl/pinconf-generic.h>
33 #include <linux/pinctrl/pinconf.h>
34 #include <linux/pinctrl/pinctrl.h>
35 #include <linux/platform_device.h>
36 #include <linux/pm_domain.h>
37 #include <linux/reboot.h>
38 #include <linux/reset.h>
39 #include <linux/seq_file.h>
40 #include <linux/slab.h>
41 #include <linux/spinlock.h>
43 #include <soc/tegra/common.h>
44 #include <soc/tegra/fuse.h>
45 #include <soc/tegra/pmc.h>
47 #include <dt-bindings/interrupt-controller/arm-gic.h>
48 #include <dt-bindings/pinctrl/pinctrl-tegra-io-pad.h>
49 #include <dt-bindings/gpio/tegra186-gpio.h>
50 #include <dt-bindings/gpio/tegra194-gpio.h>
52 #define PMC_CNTRL 0x0
53 #define PMC_CNTRL_INTR_POLARITY BIT(17) /* inverts INTR polarity */
54 #define PMC_CNTRL_CPU_PWRREQ_OE BIT(16) /* CPU pwr req enable */
55 #define PMC_CNTRL_CPU_PWRREQ_POLARITY BIT(15) /* CPU pwr req polarity */
56 #define PMC_CNTRL_SIDE_EFFECT_LP0 BIT(14) /* LP0 when CPU pwr gated */
57 #define PMC_CNTRL_SYSCLK_OE BIT(11) /* system clock enable */
58 #define PMC_CNTRL_SYSCLK_POLARITY BIT(10) /* sys clk polarity */
59 #define PMC_CNTRL_MAIN_RST BIT(4)
61 #define DPD_SAMPLE 0x020
62 #define DPD_SAMPLE_ENABLE BIT(0)
63 #define DPD_SAMPLE_DISABLE (0 << 0)
65 #define PWRGATE_TOGGLE 0x30
66 #define PWRGATE_TOGGLE_START BIT(8)
68 #define REMOVE_CLAMPING 0x34
70 #define PWRGATE_STATUS 0x38
72 #define PMC_IMPL_E_33V_PWR 0x40
74 #define PMC_PWR_DET 0x48
76 #define PMC_SCRATCH0_MODE_RECOVERY BIT(31)
77 #define PMC_SCRATCH0_MODE_BOOTLOADER BIT(30)
78 #define PMC_SCRATCH0_MODE_RCM BIT(1)
79 #define PMC_SCRATCH0_MODE_MASK (PMC_SCRATCH0_MODE_RECOVERY | \
80 PMC_SCRATCH0_MODE_BOOTLOADER | \
81 PMC_SCRATCH0_MODE_RCM)
83 #define PMC_CPUPWRGOOD_TIMER 0xc8
84 #define PMC_CPUPWROFF_TIMER 0xcc
86 #define PMC_PWR_DET_VALUE 0xe4
88 #define PMC_SCRATCH41 0x140
90 #define PMC_SENSOR_CTRL 0x1b0
91 #define PMC_SENSOR_CTRL_SCRATCH_WRITE BIT(2)
92 #define PMC_SENSOR_CTRL_ENABLE_RST BIT(1)
94 #define PMC_RST_STATUS_POR 0
95 #define PMC_RST_STATUS_WATCHDOG 1
96 #define PMC_RST_STATUS_SENSOR 2
97 #define PMC_RST_STATUS_SW_MAIN 3
98 #define PMC_RST_STATUS_LP0 4
99 #define PMC_RST_STATUS_AOTAG 5
101 #define IO_DPD_REQ 0x1b8
102 #define IO_DPD_REQ_CODE_IDLE (0U << 30)
103 #define IO_DPD_REQ_CODE_OFF (1U << 30)
104 #define IO_DPD_REQ_CODE_ON (2U << 30)
105 #define IO_DPD_REQ_CODE_MASK (3U << 30)
107 #define IO_DPD_STATUS 0x1bc
108 #define IO_DPD2_REQ 0x1c0
109 #define IO_DPD2_STATUS 0x1c4
110 #define SEL_DPD_TIM 0x1c8
112 #define PMC_SCRATCH54 0x258
113 #define PMC_SCRATCH54_DATA_SHIFT 8
114 #define PMC_SCRATCH54_ADDR_SHIFT 0
116 #define PMC_SCRATCH55 0x25c
117 #define PMC_SCRATCH55_RESET_TEGRA BIT(31)
118 #define PMC_SCRATCH55_CNTRL_ID_SHIFT 27
119 #define PMC_SCRATCH55_PINMUX_SHIFT 24
120 #define PMC_SCRATCH55_16BITOP BIT(15)
121 #define PMC_SCRATCH55_CHECKSUM_SHIFT 16
122 #define PMC_SCRATCH55_I2CSLV1_SHIFT 0
124 #define GPU_RG_CNTRL 0x2d4
126 /* Tegra186 and later */
127 #define WAKE_AOWAKE_CNTRL(x) (0x000 + ((x) << 2))
128 #define WAKE_AOWAKE_CNTRL_LEVEL (1 << 3)
129 #define WAKE_AOWAKE_MASK_W(x) (0x180 + ((x) << 2))
130 #define WAKE_AOWAKE_MASK_R(x) (0x300 + ((x) << 2))
131 #define WAKE_AOWAKE_STATUS_W(x) (0x30c + ((x) << 2))
132 #define WAKE_AOWAKE_STATUS_R(x) (0x48c + ((x) << 2))
133 #define WAKE_AOWAKE_TIER0_ROUTING(x) (0x4b4 + ((x) << 2))
134 #define WAKE_AOWAKE_TIER1_ROUTING(x) (0x4c0 + ((x) << 2))
135 #define WAKE_AOWAKE_TIER2_ROUTING(x) (0x4cc + ((x) << 2))
137 #define WAKE_AOWAKE_CTRL 0x4f4
138 #define WAKE_AOWAKE_CTRL_INTR_POLARITY BIT(0)
140 /* for secure PMC */
141 #define TEGRA_SMC_PMC 0xc2fffe00
142 #define TEGRA_SMC_PMC_READ 0xaa
143 #define TEGRA_SMC_PMC_WRITE 0xbb
145 struct tegra_powergate {
146 struct generic_pm_domain genpd;
147 struct tegra_pmc *pmc;
148 unsigned int id;
149 struct clk **clks;
150 unsigned int num_clks;
151 struct reset_control *reset;
154 struct tegra_io_pad_soc {
155 enum tegra_io_pad id;
156 unsigned int dpd;
157 unsigned int voltage;
158 const char *name;
161 struct tegra_pmc_regs {
162 unsigned int scratch0;
163 unsigned int dpd_req;
164 unsigned int dpd_status;
165 unsigned int dpd2_req;
166 unsigned int dpd2_status;
167 unsigned int rst_status;
168 unsigned int rst_source_shift;
169 unsigned int rst_source_mask;
170 unsigned int rst_level_shift;
171 unsigned int rst_level_mask;
174 struct tegra_wake_event {
175 const char *name;
176 unsigned int id;
177 unsigned int irq;
178 struct {
179 unsigned int instance;
180 unsigned int pin;
181 } gpio;
184 #define TEGRA_WAKE_IRQ(_name, _id, _irq) \
186 .name = _name, \
187 .id = _id, \
188 .irq = _irq, \
189 .gpio = { \
190 .instance = UINT_MAX, \
191 .pin = UINT_MAX, \
192 }, \
195 #define TEGRA_WAKE_GPIO(_name, _id, _instance, _pin) \
197 .name = _name, \
198 .id = _id, \
199 .irq = 0, \
200 .gpio = { \
201 .instance = _instance, \
202 .pin = _pin, \
203 }, \
206 struct tegra_pmc_soc {
207 unsigned int num_powergates;
208 const char *const *powergates;
209 unsigned int num_cpu_powergates;
210 const u8 *cpu_powergates;
212 bool has_tsense_reset;
213 bool has_gpu_clamps;
214 bool needs_mbist_war;
215 bool has_impl_33v_pwr;
216 bool maybe_tz_only;
218 const struct tegra_io_pad_soc *io_pads;
219 unsigned int num_io_pads;
221 const struct pinctrl_pin_desc *pin_descs;
222 unsigned int num_pin_descs;
224 const struct tegra_pmc_regs *regs;
225 void (*init)(struct tegra_pmc *pmc);
226 void (*setup_irq_polarity)(struct tegra_pmc *pmc,
227 struct device_node *np,
228 bool invert);
230 const char * const *reset_sources;
231 unsigned int num_reset_sources;
232 const char * const *reset_levels;
233 unsigned int num_reset_levels;
236 * These describe events that can wake the system from sleep (i.e.
237 * LP0 or SC7). Wakeup from other sleep states (such as LP1 or LP2)
238 * are dealt with in the LIC.
240 const struct tegra_wake_event *wake_events;
241 unsigned int num_wake_events;
244 static const char * const tegra186_reset_sources[] = {
245 "SYS_RESET",
246 "AOWDT",
247 "MCCPLEXWDT",
248 "BPMPWDT",
249 "SCEWDT",
250 "SPEWDT",
251 "APEWDT",
252 "BCCPLEXWDT",
253 "SENSOR",
254 "AOTAG",
255 "VFSENSOR",
256 "SWREST",
257 "SC7",
258 "HSM",
259 "CORESIGHT"
262 static const char * const tegra186_reset_levels[] = {
263 "L0", "L1", "L2", "WARM"
266 static const char * const tegra30_reset_sources[] = {
267 "POWER_ON_RESET",
268 "WATCHDOG",
269 "SENSOR",
270 "SW_MAIN",
271 "LP0"
274 static const char * const tegra210_reset_sources[] = {
275 "POWER_ON_RESET",
276 "WATCHDOG",
277 "SENSOR",
278 "SW_MAIN",
279 "LP0",
280 "AOTAG"
284 * struct tegra_pmc - NVIDIA Tegra PMC
285 * @dev: pointer to PMC device structure
286 * @base: pointer to I/O remapped register region
287 * @wake: pointer to I/O remapped region for WAKE registers
288 * @aotag: pointer to I/O remapped region for AOTAG registers
289 * @scratch: pointer to I/O remapped region for scratch registers
290 * @clk: pointer to pclk clock
291 * @soc: pointer to SoC data structure
292 * @tz_only: flag specifying if the PMC can only be accessed via TrustZone
293 * @debugfs: pointer to debugfs entry
294 * @rate: currently configured rate of pclk
295 * @suspend_mode: lowest suspend mode available
296 * @cpu_good_time: CPU power good time (in microseconds)
297 * @cpu_off_time: CPU power off time (in microsecends)
298 * @core_osc_time: core power good OSC time (in microseconds)
299 * @core_pmu_time: core power good PMU time (in microseconds)
300 * @core_off_time: core power off time (in microseconds)
301 * @corereq_high: core power request is active-high
302 * @sysclkreq_high: system clock request is active-high
303 * @combined_req: combined power request for CPU & core
304 * @cpu_pwr_good_en: CPU power good signal is enabled
305 * @lp0_vec_phys: physical base address of the LP0 warm boot code
306 * @lp0_vec_size: size of the LP0 warm boot code
307 * @powergates_available: Bitmap of available power gates
308 * @powergates_lock: mutex for power gate register access
309 * @pctl_dev: pin controller exposed by the PMC
310 * @domain: IRQ domain provided by the PMC
311 * @irq: chip implementation for the IRQ domain
313 struct tegra_pmc {
314 struct device *dev;
315 void __iomem *base;
316 void __iomem *wake;
317 void __iomem *aotag;
318 void __iomem *scratch;
319 struct clk *clk;
320 struct dentry *debugfs;
322 const struct tegra_pmc_soc *soc;
323 bool tz_only;
325 unsigned long rate;
327 enum tegra_suspend_mode suspend_mode;
328 u32 cpu_good_time;
329 u32 cpu_off_time;
330 u32 core_osc_time;
331 u32 core_pmu_time;
332 u32 core_off_time;
333 bool corereq_high;
334 bool sysclkreq_high;
335 bool combined_req;
336 bool cpu_pwr_good_en;
337 u32 lp0_vec_phys;
338 u32 lp0_vec_size;
339 DECLARE_BITMAP(powergates_available, TEGRA_POWERGATE_MAX);
341 struct mutex powergates_lock;
343 struct pinctrl_dev *pctl_dev;
345 struct irq_domain *domain;
346 struct irq_chip irq;
349 static struct tegra_pmc *pmc = &(struct tegra_pmc) {
350 .base = NULL,
351 .suspend_mode = TEGRA_SUSPEND_NONE,
354 static inline struct tegra_powergate *
355 to_powergate(struct generic_pm_domain *domain)
357 return container_of(domain, struct tegra_powergate, genpd);
360 static u32 tegra_pmc_readl(struct tegra_pmc *pmc, unsigned long offset)
362 struct arm_smccc_res res;
364 if (pmc->tz_only) {
365 arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_READ, offset, 0, 0,
366 0, 0, 0, &res);
367 if (res.a0) {
368 if (pmc->dev)
369 dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
370 __func__, res.a0);
371 else
372 pr_warn("%s(): SMC failed: %lu\n", __func__,
373 res.a0);
376 return res.a1;
379 return readl(pmc->base + offset);
382 static void tegra_pmc_writel(struct tegra_pmc *pmc, u32 value,
383 unsigned long offset)
385 struct arm_smccc_res res;
387 if (pmc->tz_only) {
388 arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_WRITE, offset,
389 value, 0, 0, 0, 0, &res);
390 if (res.a0) {
391 if (pmc->dev)
392 dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
393 __func__, res.a0);
394 else
395 pr_warn("%s(): SMC failed: %lu\n", __func__,
396 res.a0);
398 } else {
399 writel(value, pmc->base + offset);
403 static u32 tegra_pmc_scratch_readl(struct tegra_pmc *pmc, unsigned long offset)
405 if (pmc->tz_only)
406 return tegra_pmc_readl(pmc, offset);
408 return readl(pmc->scratch + offset);
411 static void tegra_pmc_scratch_writel(struct tegra_pmc *pmc, u32 value,
412 unsigned long offset)
414 if (pmc->tz_only)
415 tegra_pmc_writel(pmc, value, offset);
416 else
417 writel(value, pmc->scratch + offset);
421 * TODO Figure out a way to call this with the struct tegra_pmc * passed in.
422 * This currently doesn't work because readx_poll_timeout() can only operate
423 * on functions that take a single argument.
425 static inline bool tegra_powergate_state(int id)
427 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
428 return (tegra_pmc_readl(pmc, GPU_RG_CNTRL) & 0x1) == 0;
429 else
430 return (tegra_pmc_readl(pmc, PWRGATE_STATUS) & BIT(id)) != 0;
433 static inline bool tegra_powergate_is_valid(struct tegra_pmc *pmc, int id)
435 return (pmc->soc && pmc->soc->powergates[id]);
438 static inline bool tegra_powergate_is_available(struct tegra_pmc *pmc, int id)
440 return test_bit(id, pmc->powergates_available);
443 static int tegra_powergate_lookup(struct tegra_pmc *pmc, const char *name)
445 unsigned int i;
447 if (!pmc || !pmc->soc || !name)
448 return -EINVAL;
450 for (i = 0; i < pmc->soc->num_powergates; i++) {
451 if (!tegra_powergate_is_valid(pmc, i))
452 continue;
454 if (!strcmp(name, pmc->soc->powergates[i]))
455 return i;
458 return -ENODEV;
462 * tegra_powergate_set() - set the state of a partition
463 * @pmc: power management controller
464 * @id: partition ID
465 * @new_state: new state of the partition
467 static int tegra_powergate_set(struct tegra_pmc *pmc, unsigned int id,
468 bool new_state)
470 bool status;
471 int err;
473 if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
474 return -EINVAL;
476 mutex_lock(&pmc->powergates_lock);
478 if (tegra_powergate_state(id) == new_state) {
479 mutex_unlock(&pmc->powergates_lock);
480 return 0;
483 tegra_pmc_writel(pmc, PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
485 err = readx_poll_timeout(tegra_powergate_state, id, status,
486 status == new_state, 10, 100000);
488 mutex_unlock(&pmc->powergates_lock);
490 return err;
493 static int __tegra_powergate_remove_clamping(struct tegra_pmc *pmc,
494 unsigned int id)
496 u32 mask;
498 mutex_lock(&pmc->powergates_lock);
501 * On Tegra124 and later, the clamps for the GPU are controlled by a
502 * separate register (with different semantics).
504 if (id == TEGRA_POWERGATE_3D) {
505 if (pmc->soc->has_gpu_clamps) {
506 tegra_pmc_writel(pmc, 0, GPU_RG_CNTRL);
507 goto out;
512 * Tegra 2 has a bug where PCIE and VDE clamping masks are
513 * swapped relatively to the partition ids
515 if (id == TEGRA_POWERGATE_VDEC)
516 mask = (1 << TEGRA_POWERGATE_PCIE);
517 else if (id == TEGRA_POWERGATE_PCIE)
518 mask = (1 << TEGRA_POWERGATE_VDEC);
519 else
520 mask = (1 << id);
522 tegra_pmc_writel(pmc, mask, REMOVE_CLAMPING);
524 out:
525 mutex_unlock(&pmc->powergates_lock);
527 return 0;
530 static void tegra_powergate_disable_clocks(struct tegra_powergate *pg)
532 unsigned int i;
534 for (i = 0; i < pg->num_clks; i++)
535 clk_disable_unprepare(pg->clks[i]);
538 static int tegra_powergate_enable_clocks(struct tegra_powergate *pg)
540 unsigned int i;
541 int err;
543 for (i = 0; i < pg->num_clks; i++) {
544 err = clk_prepare_enable(pg->clks[i]);
545 if (err)
546 goto out;
549 return 0;
551 out:
552 while (i--)
553 clk_disable_unprepare(pg->clks[i]);
555 return err;
558 int __weak tegra210_clk_handle_mbist_war(unsigned int id)
560 return 0;
563 static int tegra_powergate_power_up(struct tegra_powergate *pg,
564 bool disable_clocks)
566 int err;
568 err = reset_control_assert(pg->reset);
569 if (err)
570 return err;
572 usleep_range(10, 20);
574 err = tegra_powergate_set(pg->pmc, pg->id, true);
575 if (err < 0)
576 return err;
578 usleep_range(10, 20);
580 err = tegra_powergate_enable_clocks(pg);
581 if (err)
582 goto disable_clks;
584 usleep_range(10, 20);
586 err = __tegra_powergate_remove_clamping(pg->pmc, pg->id);
587 if (err)
588 goto disable_clks;
590 usleep_range(10, 20);
592 err = reset_control_deassert(pg->reset);
593 if (err)
594 goto powergate_off;
596 usleep_range(10, 20);
598 if (pg->pmc->soc->needs_mbist_war)
599 err = tegra210_clk_handle_mbist_war(pg->id);
600 if (err)
601 goto disable_clks;
603 if (disable_clocks)
604 tegra_powergate_disable_clocks(pg);
606 return 0;
608 disable_clks:
609 tegra_powergate_disable_clocks(pg);
610 usleep_range(10, 20);
612 powergate_off:
613 tegra_powergate_set(pg->pmc, pg->id, false);
615 return err;
618 static int tegra_powergate_power_down(struct tegra_powergate *pg)
620 int err;
622 err = tegra_powergate_enable_clocks(pg);
623 if (err)
624 return err;
626 usleep_range(10, 20);
628 err = reset_control_assert(pg->reset);
629 if (err)
630 goto disable_clks;
632 usleep_range(10, 20);
634 tegra_powergate_disable_clocks(pg);
636 usleep_range(10, 20);
638 err = tegra_powergate_set(pg->pmc, pg->id, false);
639 if (err)
640 goto assert_resets;
642 return 0;
644 assert_resets:
645 tegra_powergate_enable_clocks(pg);
646 usleep_range(10, 20);
647 reset_control_deassert(pg->reset);
648 usleep_range(10, 20);
650 disable_clks:
651 tegra_powergate_disable_clocks(pg);
653 return err;
656 static int tegra_genpd_power_on(struct generic_pm_domain *domain)
658 struct tegra_powergate *pg = to_powergate(domain);
659 struct device *dev = pg->pmc->dev;
660 int err;
662 err = tegra_powergate_power_up(pg, true);
663 if (err) {
664 dev_err(dev, "failed to turn on PM domain %s: %d\n",
665 pg->genpd.name, err);
666 goto out;
669 reset_control_release(pg->reset);
671 out:
672 return err;
675 static int tegra_genpd_power_off(struct generic_pm_domain *domain)
677 struct tegra_powergate *pg = to_powergate(domain);
678 struct device *dev = pg->pmc->dev;
679 int err;
681 err = reset_control_acquire(pg->reset);
682 if (err < 0) {
683 pr_err("failed to acquire resets: %d\n", err);
684 return err;
687 err = tegra_powergate_power_down(pg);
688 if (err) {
689 dev_err(dev, "failed to turn off PM domain %s: %d\n",
690 pg->genpd.name, err);
691 reset_control_release(pg->reset);
694 return err;
698 * tegra_powergate_power_on() - power on partition
699 * @id: partition ID
701 int tegra_powergate_power_on(unsigned int id)
703 if (!tegra_powergate_is_available(pmc, id))
704 return -EINVAL;
706 return tegra_powergate_set(pmc, id, true);
708 EXPORT_SYMBOL(tegra_powergate_power_on);
711 * tegra_powergate_power_off() - power off partition
712 * @id: partition ID
714 int tegra_powergate_power_off(unsigned int id)
716 if (!tegra_powergate_is_available(pmc, id))
717 return -EINVAL;
719 return tegra_powergate_set(pmc, id, false);
721 EXPORT_SYMBOL(tegra_powergate_power_off);
724 * tegra_powergate_is_powered() - check if partition is powered
725 * @pmc: power management controller
726 * @id: partition ID
728 static int tegra_powergate_is_powered(struct tegra_pmc *pmc, unsigned int id)
730 if (!tegra_powergate_is_valid(pmc, id))
731 return -EINVAL;
733 return tegra_powergate_state(id);
737 * tegra_powergate_remove_clamping() - remove power clamps for partition
738 * @id: partition ID
740 int tegra_powergate_remove_clamping(unsigned int id)
742 if (!tegra_powergate_is_available(pmc, id))
743 return -EINVAL;
745 return __tegra_powergate_remove_clamping(pmc, id);
747 EXPORT_SYMBOL(tegra_powergate_remove_clamping);
750 * tegra_powergate_sequence_power_up() - power up partition
751 * @id: partition ID
752 * @clk: clock for partition
753 * @rst: reset for partition
755 * Must be called with clk disabled, and returns with clk enabled.
757 int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk,
758 struct reset_control *rst)
760 struct tegra_powergate *pg;
761 int err;
763 if (!tegra_powergate_is_available(pmc, id))
764 return -EINVAL;
766 pg = kzalloc(sizeof(*pg), GFP_KERNEL);
767 if (!pg)
768 return -ENOMEM;
770 pg->id = id;
771 pg->clks = &clk;
772 pg->num_clks = 1;
773 pg->reset = rst;
774 pg->pmc = pmc;
776 err = tegra_powergate_power_up(pg, false);
777 if (err)
778 dev_err(pmc->dev, "failed to turn on partition %d: %d\n", id,
779 err);
781 kfree(pg);
783 return err;
785 EXPORT_SYMBOL(tegra_powergate_sequence_power_up);
788 * tegra_get_cpu_powergate_id() - convert from CPU ID to partition ID
789 * @pmc: power management controller
790 * @cpuid: CPU partition ID
792 * Returns the partition ID corresponding to the CPU partition ID or a
793 * negative error code on failure.
795 static int tegra_get_cpu_powergate_id(struct tegra_pmc *pmc,
796 unsigned int cpuid)
798 if (pmc->soc && cpuid < pmc->soc->num_cpu_powergates)
799 return pmc->soc->cpu_powergates[cpuid];
801 return -EINVAL;
805 * tegra_pmc_cpu_is_powered() - check if CPU partition is powered
806 * @cpuid: CPU partition ID
808 bool tegra_pmc_cpu_is_powered(unsigned int cpuid)
810 int id;
812 id = tegra_get_cpu_powergate_id(pmc, cpuid);
813 if (id < 0)
814 return false;
816 return tegra_powergate_is_powered(pmc, id);
820 * tegra_pmc_cpu_power_on() - power on CPU partition
821 * @cpuid: CPU partition ID
823 int tegra_pmc_cpu_power_on(unsigned int cpuid)
825 int id;
827 id = tegra_get_cpu_powergate_id(pmc, cpuid);
828 if (id < 0)
829 return id;
831 return tegra_powergate_set(pmc, id, true);
835 * tegra_pmc_cpu_remove_clamping() - remove power clamps for CPU partition
836 * @cpuid: CPU partition ID
838 int tegra_pmc_cpu_remove_clamping(unsigned int cpuid)
840 int id;
842 id = tegra_get_cpu_powergate_id(pmc, cpuid);
843 if (id < 0)
844 return id;
846 return tegra_powergate_remove_clamping(id);
849 static int tegra_pmc_restart_notify(struct notifier_block *this,
850 unsigned long action, void *data)
852 const char *cmd = data;
853 u32 value;
855 value = tegra_pmc_scratch_readl(pmc, pmc->soc->regs->scratch0);
856 value &= ~PMC_SCRATCH0_MODE_MASK;
858 if (cmd) {
859 if (strcmp(cmd, "recovery") == 0)
860 value |= PMC_SCRATCH0_MODE_RECOVERY;
862 if (strcmp(cmd, "bootloader") == 0)
863 value |= PMC_SCRATCH0_MODE_BOOTLOADER;
865 if (strcmp(cmd, "forced-recovery") == 0)
866 value |= PMC_SCRATCH0_MODE_RCM;
869 tegra_pmc_scratch_writel(pmc, value, pmc->soc->regs->scratch0);
871 /* reset everything but PMC_SCRATCH0 and PMC_RST_STATUS */
872 value = tegra_pmc_readl(pmc, PMC_CNTRL);
873 value |= PMC_CNTRL_MAIN_RST;
874 tegra_pmc_writel(pmc, value, PMC_CNTRL);
876 return NOTIFY_DONE;
879 static struct notifier_block tegra_pmc_restart_handler = {
880 .notifier_call = tegra_pmc_restart_notify,
881 .priority = 128,
884 static int powergate_show(struct seq_file *s, void *data)
886 unsigned int i;
887 int status;
889 seq_printf(s, " powergate powered\n");
890 seq_printf(s, "------------------\n");
892 for (i = 0; i < pmc->soc->num_powergates; i++) {
893 status = tegra_powergate_is_powered(pmc, i);
894 if (status < 0)
895 continue;
897 seq_printf(s, " %9s %7s\n", pmc->soc->powergates[i],
898 status ? "yes" : "no");
901 return 0;
904 DEFINE_SHOW_ATTRIBUTE(powergate);
906 static int tegra_powergate_debugfs_init(void)
908 pmc->debugfs = debugfs_create_file("powergate", S_IRUGO, NULL, NULL,
909 &powergate_fops);
910 if (!pmc->debugfs)
911 return -ENOMEM;
913 return 0;
916 static int tegra_powergate_of_get_clks(struct tegra_powergate *pg,
917 struct device_node *np)
919 struct clk *clk;
920 unsigned int i, count;
921 int err;
923 count = of_clk_get_parent_count(np);
924 if (count == 0)
925 return -ENODEV;
927 pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL);
928 if (!pg->clks)
929 return -ENOMEM;
931 for (i = 0; i < count; i++) {
932 pg->clks[i] = of_clk_get(np, i);
933 if (IS_ERR(pg->clks[i])) {
934 err = PTR_ERR(pg->clks[i]);
935 goto err;
939 pg->num_clks = count;
941 return 0;
943 err:
944 while (i--)
945 clk_put(pg->clks[i]);
947 kfree(pg->clks);
949 return err;
952 static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
953 struct device_node *np, bool off)
955 struct device *dev = pg->pmc->dev;
956 int err;
958 pg->reset = of_reset_control_array_get_exclusive_released(np);
959 if (IS_ERR(pg->reset)) {
960 err = PTR_ERR(pg->reset);
961 dev_err(dev, "failed to get device resets: %d\n", err);
962 return err;
965 err = reset_control_acquire(pg->reset);
966 if (err < 0) {
967 pr_err("failed to acquire resets: %d\n", err);
968 goto out;
971 if (off) {
972 err = reset_control_assert(pg->reset);
973 } else {
974 err = reset_control_deassert(pg->reset);
975 if (err < 0)
976 goto out;
978 reset_control_release(pg->reset);
981 out:
982 if (err) {
983 reset_control_release(pg->reset);
984 reset_control_put(pg->reset);
987 return err;
990 static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
992 struct device *dev = pmc->dev;
993 struct tegra_powergate *pg;
994 int id, err = 0;
995 bool off;
997 pg = kzalloc(sizeof(*pg), GFP_KERNEL);
998 if (!pg)
999 return -ENOMEM;
1001 id = tegra_powergate_lookup(pmc, np->name);
1002 if (id < 0) {
1003 dev_err(dev, "powergate lookup failed for %pOFn: %d\n", np, id);
1004 err = -ENODEV;
1005 goto free_mem;
1009 * Clear the bit for this powergate so it cannot be managed
1010 * directly via the legacy APIs for controlling powergates.
1012 clear_bit(id, pmc->powergates_available);
1014 pg->id = id;
1015 pg->genpd.name = np->name;
1016 pg->genpd.power_off = tegra_genpd_power_off;
1017 pg->genpd.power_on = tegra_genpd_power_on;
1018 pg->pmc = pmc;
1020 off = !tegra_powergate_is_powered(pmc, pg->id);
1022 err = tegra_powergate_of_get_clks(pg, np);
1023 if (err < 0) {
1024 dev_err(dev, "failed to get clocks for %pOFn: %d\n", np, err);
1025 goto set_available;
1028 err = tegra_powergate_of_get_resets(pg, np, off);
1029 if (err < 0) {
1030 dev_err(dev, "failed to get resets for %pOFn: %d\n", np, err);
1031 goto remove_clks;
1034 if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
1035 if (off)
1036 WARN_ON(tegra_powergate_power_up(pg, true));
1038 goto remove_resets;
1041 err = pm_genpd_init(&pg->genpd, NULL, off);
1042 if (err < 0) {
1043 dev_err(dev, "failed to initialise PM domain %pOFn: %d\n", np,
1044 err);
1045 goto remove_resets;
1048 err = of_genpd_add_provider_simple(np, &pg->genpd);
1049 if (err < 0) {
1050 dev_err(dev, "failed to add PM domain provider for %pOFn: %d\n",
1051 np, err);
1052 goto remove_genpd;
1055 dev_dbg(dev, "added PM domain %s\n", pg->genpd.name);
1057 return 0;
1059 remove_genpd:
1060 pm_genpd_remove(&pg->genpd);
1062 remove_resets:
1063 reset_control_put(pg->reset);
1065 remove_clks:
1066 while (pg->num_clks--)
1067 clk_put(pg->clks[pg->num_clks]);
1069 kfree(pg->clks);
1071 set_available:
1072 set_bit(id, pmc->powergates_available);
1074 free_mem:
1075 kfree(pg);
1077 return err;
1080 static int tegra_powergate_init(struct tegra_pmc *pmc,
1081 struct device_node *parent)
1083 struct device_node *np, *child;
1084 int err = 0;
1086 np = of_get_child_by_name(parent, "powergates");
1087 if (!np)
1088 return 0;
1090 for_each_child_of_node(np, child) {
1091 err = tegra_powergate_add(pmc, child);
1092 if (err < 0) {
1093 of_node_put(child);
1094 break;
1098 of_node_put(np);
1100 return err;
1103 static void tegra_powergate_remove(struct generic_pm_domain *genpd)
1105 struct tegra_powergate *pg = to_powergate(genpd);
1107 reset_control_put(pg->reset);
1109 while (pg->num_clks--)
1110 clk_put(pg->clks[pg->num_clks]);
1112 kfree(pg->clks);
1114 set_bit(pg->id, pmc->powergates_available);
1116 kfree(pg);
1119 static void tegra_powergate_remove_all(struct device_node *parent)
1121 struct generic_pm_domain *genpd;
1122 struct device_node *np, *child;
1124 np = of_get_child_by_name(parent, "powergates");
1125 if (!np)
1126 return;
1128 for_each_child_of_node(np, child) {
1129 of_genpd_del_provider(child);
1131 genpd = of_genpd_remove_last(child);
1132 if (IS_ERR(genpd))
1133 continue;
1135 tegra_powergate_remove(genpd);
1138 of_node_put(np);
1141 static const struct tegra_io_pad_soc *
1142 tegra_io_pad_find(struct tegra_pmc *pmc, enum tegra_io_pad id)
1144 unsigned int i;
1146 for (i = 0; i < pmc->soc->num_io_pads; i++)
1147 if (pmc->soc->io_pads[i].id == id)
1148 return &pmc->soc->io_pads[i];
1150 return NULL;
1153 static int tegra_io_pad_get_dpd_register_bit(struct tegra_pmc *pmc,
1154 enum tegra_io_pad id,
1155 unsigned long *request,
1156 unsigned long *status,
1157 u32 *mask)
1159 const struct tegra_io_pad_soc *pad;
1161 pad = tegra_io_pad_find(pmc, id);
1162 if (!pad) {
1163 dev_err(pmc->dev, "invalid I/O pad ID %u\n", id);
1164 return -ENOENT;
1167 if (pad->dpd == UINT_MAX)
1168 return -ENOTSUPP;
1170 *mask = BIT(pad->dpd % 32);
1172 if (pad->dpd < 32) {
1173 *status = pmc->soc->regs->dpd_status;
1174 *request = pmc->soc->regs->dpd_req;
1175 } else {
1176 *status = pmc->soc->regs->dpd2_status;
1177 *request = pmc->soc->regs->dpd2_req;
1180 return 0;
1183 static int tegra_io_pad_prepare(struct tegra_pmc *pmc, enum tegra_io_pad id,
1184 unsigned long *request, unsigned long *status,
1185 u32 *mask)
1187 unsigned long rate, value;
1188 int err;
1190 err = tegra_io_pad_get_dpd_register_bit(pmc, id, request, status, mask);
1191 if (err)
1192 return err;
1194 if (pmc->clk) {
1195 rate = clk_get_rate(pmc->clk);
1196 if (!rate) {
1197 dev_err(pmc->dev, "failed to get clock rate\n");
1198 return -ENODEV;
1201 tegra_pmc_writel(pmc, DPD_SAMPLE_ENABLE, DPD_SAMPLE);
1203 /* must be at least 200 ns, in APB (PCLK) clock cycles */
1204 value = DIV_ROUND_UP(1000000000, rate);
1205 value = DIV_ROUND_UP(200, value);
1206 tegra_pmc_writel(pmc, value, SEL_DPD_TIM);
1209 return 0;
1212 static int tegra_io_pad_poll(struct tegra_pmc *pmc, unsigned long offset,
1213 u32 mask, u32 val, unsigned long timeout)
1215 u32 value;
1217 timeout = jiffies + msecs_to_jiffies(timeout);
1219 while (time_after(timeout, jiffies)) {
1220 value = tegra_pmc_readl(pmc, offset);
1221 if ((value & mask) == val)
1222 return 0;
1224 usleep_range(250, 1000);
1227 return -ETIMEDOUT;
1230 static void tegra_io_pad_unprepare(struct tegra_pmc *pmc)
1232 if (pmc->clk)
1233 tegra_pmc_writel(pmc, DPD_SAMPLE_DISABLE, DPD_SAMPLE);
1237 * tegra_io_pad_power_enable() - enable power to I/O pad
1238 * @id: Tegra I/O pad ID for which to enable power
1240 * Returns: 0 on success or a negative error code on failure.
1242 int tegra_io_pad_power_enable(enum tegra_io_pad id)
1244 unsigned long request, status;
1245 u32 mask;
1246 int err;
1248 mutex_lock(&pmc->powergates_lock);
1250 err = tegra_io_pad_prepare(pmc, id, &request, &status, &mask);
1251 if (err < 0) {
1252 dev_err(pmc->dev, "failed to prepare I/O pad: %d\n", err);
1253 goto unlock;
1256 tegra_pmc_writel(pmc, IO_DPD_REQ_CODE_OFF | mask, request);
1258 err = tegra_io_pad_poll(pmc, status, mask, 0, 250);
1259 if (err < 0) {
1260 dev_err(pmc->dev, "failed to enable I/O pad: %d\n", err);
1261 goto unlock;
1264 tegra_io_pad_unprepare(pmc);
1266 unlock:
1267 mutex_unlock(&pmc->powergates_lock);
1268 return err;
1270 EXPORT_SYMBOL(tegra_io_pad_power_enable);
1273 * tegra_io_pad_power_disable() - disable power to I/O pad
1274 * @id: Tegra I/O pad ID for which to disable power
1276 * Returns: 0 on success or a negative error code on failure.
1278 int tegra_io_pad_power_disable(enum tegra_io_pad id)
1280 unsigned long request, status;
1281 u32 mask;
1282 int err;
1284 mutex_lock(&pmc->powergates_lock);
1286 err = tegra_io_pad_prepare(pmc, id, &request, &status, &mask);
1287 if (err < 0) {
1288 dev_err(pmc->dev, "failed to prepare I/O pad: %d\n", err);
1289 goto unlock;
1292 tegra_pmc_writel(pmc, IO_DPD_REQ_CODE_ON | mask, request);
1294 err = tegra_io_pad_poll(pmc, status, mask, mask, 250);
1295 if (err < 0) {
1296 dev_err(pmc->dev, "failed to disable I/O pad: %d\n", err);
1297 goto unlock;
1300 tegra_io_pad_unprepare(pmc);
1302 unlock:
1303 mutex_unlock(&pmc->powergates_lock);
1304 return err;
1306 EXPORT_SYMBOL(tegra_io_pad_power_disable);
1308 static int tegra_io_pad_is_powered(struct tegra_pmc *pmc, enum tegra_io_pad id)
1310 unsigned long request, status;
1311 u32 mask, value;
1312 int err;
1314 err = tegra_io_pad_get_dpd_register_bit(pmc, id, &request, &status,
1315 &mask);
1316 if (err)
1317 return err;
1319 value = tegra_pmc_readl(pmc, status);
1321 return !(value & mask);
1324 static int tegra_io_pad_set_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id,
1325 int voltage)
1327 const struct tegra_io_pad_soc *pad;
1328 u32 value;
1330 pad = tegra_io_pad_find(pmc, id);
1331 if (!pad)
1332 return -ENOENT;
1334 if (pad->voltage == UINT_MAX)
1335 return -ENOTSUPP;
1337 mutex_lock(&pmc->powergates_lock);
1339 if (pmc->soc->has_impl_33v_pwr) {
1340 value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1342 if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1343 value &= ~BIT(pad->voltage);
1344 else
1345 value |= BIT(pad->voltage);
1347 tegra_pmc_writel(pmc, value, PMC_IMPL_E_33V_PWR);
1348 } else {
1349 /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */
1350 value = tegra_pmc_readl(pmc, PMC_PWR_DET);
1351 value |= BIT(pad->voltage);
1352 tegra_pmc_writel(pmc, value, PMC_PWR_DET);
1354 /* update I/O voltage */
1355 value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1357 if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1358 value &= ~BIT(pad->voltage);
1359 else
1360 value |= BIT(pad->voltage);
1362 tegra_pmc_writel(pmc, value, PMC_PWR_DET_VALUE);
1365 mutex_unlock(&pmc->powergates_lock);
1367 usleep_range(100, 250);
1369 return 0;
1372 static int tegra_io_pad_get_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id)
1374 const struct tegra_io_pad_soc *pad;
1375 u32 value;
1377 pad = tegra_io_pad_find(pmc, id);
1378 if (!pad)
1379 return -ENOENT;
1381 if (pad->voltage == UINT_MAX)
1382 return -ENOTSUPP;
1384 if (pmc->soc->has_impl_33v_pwr)
1385 value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1386 else
1387 value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1389 if ((value & BIT(pad->voltage)) == 0)
1390 return TEGRA_IO_PAD_VOLTAGE_1V8;
1392 return TEGRA_IO_PAD_VOLTAGE_3V3;
1396 * tegra_io_rail_power_on() - enable power to I/O rail
1397 * @id: Tegra I/O pad ID for which to enable power
1399 * See also: tegra_io_pad_power_enable()
1401 int tegra_io_rail_power_on(unsigned int id)
1403 return tegra_io_pad_power_enable(id);
1405 EXPORT_SYMBOL(tegra_io_rail_power_on);
1408 * tegra_io_rail_power_off() - disable power to I/O rail
1409 * @id: Tegra I/O pad ID for which to disable power
1411 * See also: tegra_io_pad_power_disable()
1413 int tegra_io_rail_power_off(unsigned int id)
1415 return tegra_io_pad_power_disable(id);
1417 EXPORT_SYMBOL(tegra_io_rail_power_off);
1419 #ifdef CONFIG_PM_SLEEP
1420 enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
1422 return pmc->suspend_mode;
1425 void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
1427 if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
1428 return;
1430 pmc->suspend_mode = mode;
1433 void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode)
1435 unsigned long long rate = 0;
1436 u32 value;
1438 switch (mode) {
1439 case TEGRA_SUSPEND_LP1:
1440 rate = 32768;
1441 break;
1443 case TEGRA_SUSPEND_LP2:
1444 rate = clk_get_rate(pmc->clk);
1445 break;
1447 default:
1448 break;
1451 if (WARN_ON_ONCE(rate == 0))
1452 rate = 100000000;
1454 if (rate != pmc->rate) {
1455 u64 ticks;
1457 ticks = pmc->cpu_good_time * rate + USEC_PER_SEC - 1;
1458 do_div(ticks, USEC_PER_SEC);
1459 tegra_pmc_writel(pmc, ticks, PMC_CPUPWRGOOD_TIMER);
1461 ticks = pmc->cpu_off_time * rate + USEC_PER_SEC - 1;
1462 do_div(ticks, USEC_PER_SEC);
1463 tegra_pmc_writel(pmc, ticks, PMC_CPUPWROFF_TIMER);
1465 wmb();
1467 pmc->rate = rate;
1470 value = tegra_pmc_readl(pmc, PMC_CNTRL);
1471 value &= ~PMC_CNTRL_SIDE_EFFECT_LP0;
1472 value |= PMC_CNTRL_CPU_PWRREQ_OE;
1473 tegra_pmc_writel(pmc, value, PMC_CNTRL);
1475 #endif
1477 static int tegra_pmc_parse_dt(struct tegra_pmc *pmc, struct device_node *np)
1479 u32 value, values[2];
1481 if (of_property_read_u32(np, "nvidia,suspend-mode", &value)) {
1482 } else {
1483 switch (value) {
1484 case 0:
1485 pmc->suspend_mode = TEGRA_SUSPEND_LP0;
1486 break;
1488 case 1:
1489 pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1490 break;
1492 case 2:
1493 pmc->suspend_mode = TEGRA_SUSPEND_LP2;
1494 break;
1496 default:
1497 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1498 break;
1502 pmc->suspend_mode = tegra_pm_validate_suspend_mode(pmc->suspend_mode);
1504 if (of_property_read_u32(np, "nvidia,cpu-pwr-good-time", &value))
1505 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1507 pmc->cpu_good_time = value;
1509 if (of_property_read_u32(np, "nvidia,cpu-pwr-off-time", &value))
1510 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1512 pmc->cpu_off_time = value;
1514 if (of_property_read_u32_array(np, "nvidia,core-pwr-good-time",
1515 values, ARRAY_SIZE(values)))
1516 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1518 pmc->core_osc_time = values[0];
1519 pmc->core_pmu_time = values[1];
1521 if (of_property_read_u32(np, "nvidia,core-pwr-off-time", &value))
1522 pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1524 pmc->core_off_time = value;
1526 pmc->corereq_high = of_property_read_bool(np,
1527 "nvidia,core-power-req-active-high");
1529 pmc->sysclkreq_high = of_property_read_bool(np,
1530 "nvidia,sys-clock-req-active-high");
1532 pmc->combined_req = of_property_read_bool(np,
1533 "nvidia,combined-power-req");
1535 pmc->cpu_pwr_good_en = of_property_read_bool(np,
1536 "nvidia,cpu-pwr-good-en");
1538 if (of_property_read_u32_array(np, "nvidia,lp0-vec", values,
1539 ARRAY_SIZE(values)))
1540 if (pmc->suspend_mode == TEGRA_SUSPEND_LP0)
1541 pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1543 pmc->lp0_vec_phys = values[0];
1544 pmc->lp0_vec_size = values[1];
1546 return 0;
1549 static void tegra_pmc_init(struct tegra_pmc *pmc)
1551 if (pmc->soc->init)
1552 pmc->soc->init(pmc);
1555 static void tegra_pmc_init_tsense_reset(struct tegra_pmc *pmc)
1557 static const char disabled[] = "emergency thermal reset disabled";
1558 u32 pmu_addr, ctrl_id, reg_addr, reg_data, pinmux;
1559 struct device *dev = pmc->dev;
1560 struct device_node *np;
1561 u32 value, checksum;
1563 if (!pmc->soc->has_tsense_reset)
1564 return;
1566 np = of_get_child_by_name(pmc->dev->of_node, "i2c-thermtrip");
1567 if (!np) {
1568 dev_warn(dev, "i2c-thermtrip node not found, %s.\n", disabled);
1569 return;
1572 if (of_property_read_u32(np, "nvidia,i2c-controller-id", &ctrl_id)) {
1573 dev_err(dev, "I2C controller ID missing, %s.\n", disabled);
1574 goto out;
1577 if (of_property_read_u32(np, "nvidia,bus-addr", &pmu_addr)) {
1578 dev_err(dev, "nvidia,bus-addr missing, %s.\n", disabled);
1579 goto out;
1582 if (of_property_read_u32(np, "nvidia,reg-addr", &reg_addr)) {
1583 dev_err(dev, "nvidia,reg-addr missing, %s.\n", disabled);
1584 goto out;
1587 if (of_property_read_u32(np, "nvidia,reg-data", &reg_data)) {
1588 dev_err(dev, "nvidia,reg-data missing, %s.\n", disabled);
1589 goto out;
1592 if (of_property_read_u32(np, "nvidia,pinmux-id", &pinmux))
1593 pinmux = 0;
1595 value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
1596 value |= PMC_SENSOR_CTRL_SCRATCH_WRITE;
1597 tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
1599 value = (reg_data << PMC_SCRATCH54_DATA_SHIFT) |
1600 (reg_addr << PMC_SCRATCH54_ADDR_SHIFT);
1601 tegra_pmc_writel(pmc, value, PMC_SCRATCH54);
1603 value = PMC_SCRATCH55_RESET_TEGRA;
1604 value |= ctrl_id << PMC_SCRATCH55_CNTRL_ID_SHIFT;
1605 value |= pinmux << PMC_SCRATCH55_PINMUX_SHIFT;
1606 value |= pmu_addr << PMC_SCRATCH55_I2CSLV1_SHIFT;
1609 * Calculate checksum of SCRATCH54, SCRATCH55 fields. Bits 23:16 will
1610 * contain the checksum and are currently zero, so they are not added.
1612 checksum = reg_addr + reg_data + (value & 0xff) + ((value >> 8) & 0xff)
1613 + ((value >> 24) & 0xff);
1614 checksum &= 0xff;
1615 checksum = 0x100 - checksum;
1617 value |= checksum << PMC_SCRATCH55_CHECKSUM_SHIFT;
1619 tegra_pmc_writel(pmc, value, PMC_SCRATCH55);
1621 value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
1622 value |= PMC_SENSOR_CTRL_ENABLE_RST;
1623 tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
1625 dev_info(pmc->dev, "emergency thermal reset enabled\n");
1627 out:
1628 of_node_put(np);
1631 static int tegra_io_pad_pinctrl_get_groups_count(struct pinctrl_dev *pctl_dev)
1633 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
1635 return pmc->soc->num_io_pads;
1638 static const char *tegra_io_pad_pinctrl_get_group_name(struct pinctrl_dev *pctl,
1639 unsigned int group)
1641 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl);
1643 return pmc->soc->io_pads[group].name;
1646 static int tegra_io_pad_pinctrl_get_group_pins(struct pinctrl_dev *pctl_dev,
1647 unsigned int group,
1648 const unsigned int **pins,
1649 unsigned int *num_pins)
1651 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
1653 *pins = &pmc->soc->io_pads[group].id;
1654 *num_pins = 1;
1656 return 0;
1659 static const struct pinctrl_ops tegra_io_pad_pinctrl_ops = {
1660 .get_groups_count = tegra_io_pad_pinctrl_get_groups_count,
1661 .get_group_name = tegra_io_pad_pinctrl_get_group_name,
1662 .get_group_pins = tegra_io_pad_pinctrl_get_group_pins,
1663 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
1664 .dt_free_map = pinconf_generic_dt_free_map,
1667 static int tegra_io_pad_pinconf_get(struct pinctrl_dev *pctl_dev,
1668 unsigned int pin, unsigned long *config)
1670 enum pin_config_param param = pinconf_to_config_param(*config);
1671 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
1672 const struct tegra_io_pad_soc *pad;
1673 int ret;
1674 u32 arg;
1676 pad = tegra_io_pad_find(pmc, pin);
1677 if (!pad)
1678 return -EINVAL;
1680 switch (param) {
1681 case PIN_CONFIG_POWER_SOURCE:
1682 ret = tegra_io_pad_get_voltage(pmc, pad->id);
1683 if (ret < 0)
1684 return ret;
1686 arg = ret;
1687 break;
1689 case PIN_CONFIG_LOW_POWER_MODE:
1690 ret = tegra_io_pad_is_powered(pmc, pad->id);
1691 if (ret < 0)
1692 return ret;
1694 arg = !ret;
1695 break;
1697 default:
1698 return -EINVAL;
1701 *config = pinconf_to_config_packed(param, arg);
1703 return 0;
1706 static int tegra_io_pad_pinconf_set(struct pinctrl_dev *pctl_dev,
1707 unsigned int pin, unsigned long *configs,
1708 unsigned int num_configs)
1710 struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
1711 const struct tegra_io_pad_soc *pad;
1712 enum pin_config_param param;
1713 unsigned int i;
1714 int err;
1715 u32 arg;
1717 pad = tegra_io_pad_find(pmc, pin);
1718 if (!pad)
1719 return -EINVAL;
1721 for (i = 0; i < num_configs; ++i) {
1722 param = pinconf_to_config_param(configs[i]);
1723 arg = pinconf_to_config_argument(configs[i]);
1725 switch (param) {
1726 case PIN_CONFIG_LOW_POWER_MODE:
1727 if (arg)
1728 err = tegra_io_pad_power_disable(pad->id);
1729 else
1730 err = tegra_io_pad_power_enable(pad->id);
1731 if (err)
1732 return err;
1733 break;
1734 case PIN_CONFIG_POWER_SOURCE:
1735 if (arg != TEGRA_IO_PAD_VOLTAGE_1V8 &&
1736 arg != TEGRA_IO_PAD_VOLTAGE_3V3)
1737 return -EINVAL;
1738 err = tegra_io_pad_set_voltage(pmc, pad->id, arg);
1739 if (err)
1740 return err;
1741 break;
1742 default:
1743 return -EINVAL;
1747 return 0;
1750 static const struct pinconf_ops tegra_io_pad_pinconf_ops = {
1751 .pin_config_get = tegra_io_pad_pinconf_get,
1752 .pin_config_set = tegra_io_pad_pinconf_set,
1753 .is_generic = true,
1756 static struct pinctrl_desc tegra_pmc_pctl_desc = {
1757 .pctlops = &tegra_io_pad_pinctrl_ops,
1758 .confops = &tegra_io_pad_pinconf_ops,
1761 static int tegra_pmc_pinctrl_init(struct tegra_pmc *pmc)
1763 int err;
1765 if (!pmc->soc->num_pin_descs)
1766 return 0;
1768 tegra_pmc_pctl_desc.name = dev_name(pmc->dev);
1769 tegra_pmc_pctl_desc.pins = pmc->soc->pin_descs;
1770 tegra_pmc_pctl_desc.npins = pmc->soc->num_pin_descs;
1772 pmc->pctl_dev = devm_pinctrl_register(pmc->dev, &tegra_pmc_pctl_desc,
1773 pmc);
1774 if (IS_ERR(pmc->pctl_dev)) {
1775 err = PTR_ERR(pmc->pctl_dev);
1776 dev_err(pmc->dev, "failed to register pin controller: %d\n",
1777 err);
1778 return err;
1781 return 0;
1784 static ssize_t reset_reason_show(struct device *dev,
1785 struct device_attribute *attr, char *buf)
1787 u32 value;
1789 value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
1790 value &= pmc->soc->regs->rst_source_mask;
1791 value >>= pmc->soc->regs->rst_source_shift;
1793 if (WARN_ON(value >= pmc->soc->num_reset_sources))
1794 return sprintf(buf, "%s\n", "UNKNOWN");
1796 return sprintf(buf, "%s\n", pmc->soc->reset_sources[value]);
1799 static DEVICE_ATTR_RO(reset_reason);
1801 static ssize_t reset_level_show(struct device *dev,
1802 struct device_attribute *attr, char *buf)
1804 u32 value;
1806 value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
1807 value &= pmc->soc->regs->rst_level_mask;
1808 value >>= pmc->soc->regs->rst_level_shift;
1810 if (WARN_ON(value >= pmc->soc->num_reset_levels))
1811 return sprintf(buf, "%s\n", "UNKNOWN");
1813 return sprintf(buf, "%s\n", pmc->soc->reset_levels[value]);
1816 static DEVICE_ATTR_RO(reset_level);
1818 static void tegra_pmc_reset_sysfs_init(struct tegra_pmc *pmc)
1820 struct device *dev = pmc->dev;
1821 int err = 0;
1823 if (pmc->soc->reset_sources) {
1824 err = device_create_file(dev, &dev_attr_reset_reason);
1825 if (err < 0)
1826 dev_warn(dev,
1827 "failed to create attr \"reset_reason\": %d\n",
1828 err);
1831 if (pmc->soc->reset_levels) {
1832 err = device_create_file(dev, &dev_attr_reset_level);
1833 if (err < 0)
1834 dev_warn(dev,
1835 "failed to create attr \"reset_level\": %d\n",
1836 err);
1840 static int tegra_pmc_irq_translate(struct irq_domain *domain,
1841 struct irq_fwspec *fwspec,
1842 unsigned long *hwirq,
1843 unsigned int *type)
1845 if (WARN_ON(fwspec->param_count < 2))
1846 return -EINVAL;
1848 *hwirq = fwspec->param[0];
1849 *type = fwspec->param[1];
1851 return 0;
1854 static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq,
1855 unsigned int num_irqs, void *data)
1857 struct tegra_pmc *pmc = domain->host_data;
1858 const struct tegra_pmc_soc *soc = pmc->soc;
1859 struct irq_fwspec *fwspec = data;
1860 unsigned int i;
1861 int err = 0;
1863 if (WARN_ON(num_irqs > 1))
1864 return -EINVAL;
1866 for (i = 0; i < soc->num_wake_events; i++) {
1867 const struct tegra_wake_event *event = &soc->wake_events[i];
1869 if (fwspec->param_count == 2) {
1870 struct irq_fwspec spec;
1872 if (event->id != fwspec->param[0])
1873 continue;
1875 err = irq_domain_set_hwirq_and_chip(domain, virq,
1876 event->id,
1877 &pmc->irq, pmc);
1878 if (err < 0)
1879 break;
1881 spec.fwnode = &pmc->dev->of_node->fwnode;
1882 spec.param_count = 3;
1883 spec.param[0] = GIC_SPI;
1884 spec.param[1] = event->irq;
1885 spec.param[2] = fwspec->param[1];
1887 err = irq_domain_alloc_irqs_parent(domain, virq,
1888 num_irqs, &spec);
1890 break;
1893 if (fwspec->param_count == 3) {
1894 if (event->gpio.instance != fwspec->param[0] ||
1895 event->gpio.pin != fwspec->param[1])
1896 continue;
1898 err = irq_domain_set_hwirq_and_chip(domain, virq,
1899 event->id,
1900 &pmc->irq, pmc);
1902 break;
1907 * For interrupts that don't have associated wake events, assign a
1908 * dummy hardware IRQ number. This is used in the ->irq_set_type()
1909 * and ->irq_set_wake() callbacks to return early for these IRQs.
1911 if (i == soc->num_wake_events)
1912 err = irq_domain_set_hwirq_and_chip(domain, virq, ULONG_MAX,
1913 &pmc->irq, pmc);
1915 return err;
1918 static const struct irq_domain_ops tegra_pmc_irq_domain_ops = {
1919 .translate = tegra_pmc_irq_translate,
1920 .alloc = tegra_pmc_irq_alloc,
1923 static int tegra_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
1925 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
1926 unsigned int offset, bit;
1927 u32 value;
1929 /* nothing to do if there's no associated wake event */
1930 if (WARN_ON(data->hwirq == ULONG_MAX))
1931 return 0;
1933 offset = data->hwirq / 32;
1934 bit = data->hwirq % 32;
1936 /* clear wake status */
1937 writel(0x1, pmc->wake + WAKE_AOWAKE_STATUS_W(data->hwirq));
1939 /* route wake to tier 2 */
1940 value = readl(pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
1942 if (!on)
1943 value &= ~(1 << bit);
1944 else
1945 value |= 1 << bit;
1947 writel(value, pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
1949 /* enable wakeup event */
1950 writel(!!on, pmc->wake + WAKE_AOWAKE_MASK_W(data->hwirq));
1952 return 0;
1955 static int tegra_pmc_irq_set_type(struct irq_data *data, unsigned int type)
1957 struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
1958 u32 value;
1960 /* nothing to do if there's no associated wake event */
1961 if (data->hwirq == ULONG_MAX)
1962 return 0;
1964 value = readl(pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
1966 switch (type) {
1967 case IRQ_TYPE_EDGE_RISING:
1968 case IRQ_TYPE_LEVEL_HIGH:
1969 value |= WAKE_AOWAKE_CNTRL_LEVEL;
1970 break;
1972 case IRQ_TYPE_EDGE_FALLING:
1973 case IRQ_TYPE_LEVEL_LOW:
1974 value &= ~WAKE_AOWAKE_CNTRL_LEVEL;
1975 break;
1977 case IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING:
1978 value ^= WAKE_AOWAKE_CNTRL_LEVEL;
1979 break;
1981 default:
1982 return -EINVAL;
1985 writel(value, pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
1987 return 0;
1990 static int tegra_pmc_irq_init(struct tegra_pmc *pmc)
1992 struct irq_domain *parent = NULL;
1993 struct device_node *np;
1995 np = of_irq_find_parent(pmc->dev->of_node);
1996 if (np) {
1997 parent = irq_find_host(np);
1998 of_node_put(np);
2001 if (!parent)
2002 return 0;
2004 pmc->irq.name = dev_name(pmc->dev);
2005 pmc->irq.irq_mask = irq_chip_mask_parent;
2006 pmc->irq.irq_unmask = irq_chip_unmask_parent;
2007 pmc->irq.irq_eoi = irq_chip_eoi_parent;
2008 pmc->irq.irq_set_affinity = irq_chip_set_affinity_parent;
2009 pmc->irq.irq_set_type = tegra_pmc_irq_set_type;
2010 pmc->irq.irq_set_wake = tegra_pmc_irq_set_wake;
2012 pmc->domain = irq_domain_add_hierarchy(parent, 0, 96, pmc->dev->of_node,
2013 &tegra_pmc_irq_domain_ops, pmc);
2014 if (!pmc->domain) {
2015 dev_err(pmc->dev, "failed to allocate domain\n");
2016 return -ENOMEM;
2019 return 0;
2022 static int tegra_pmc_probe(struct platform_device *pdev)
2024 void __iomem *base;
2025 struct resource *res;
2026 int err;
2029 * Early initialisation should have configured an initial
2030 * register mapping and setup the soc data pointer. If these
2031 * are not valid then something went badly wrong!
2033 if (WARN_ON(!pmc->base || !pmc->soc))
2034 return -ENODEV;
2036 err = tegra_pmc_parse_dt(pmc, pdev->dev.of_node);
2037 if (err < 0)
2038 return err;
2040 /* take over the memory region from the early initialization */
2041 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2042 base = devm_ioremap_resource(&pdev->dev, res);
2043 if (IS_ERR(base))
2044 return PTR_ERR(base);
2046 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wake");
2047 if (res) {
2048 pmc->wake = devm_ioremap_resource(&pdev->dev, res);
2049 if (IS_ERR(pmc->wake))
2050 return PTR_ERR(pmc->wake);
2051 } else {
2052 pmc->wake = base;
2055 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aotag");
2056 if (res) {
2057 pmc->aotag = devm_ioremap_resource(&pdev->dev, res);
2058 if (IS_ERR(pmc->aotag))
2059 return PTR_ERR(pmc->aotag);
2060 } else {
2061 pmc->aotag = base;
2064 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "scratch");
2065 if (res) {
2066 pmc->scratch = devm_ioremap_resource(&pdev->dev, res);
2067 if (IS_ERR(pmc->scratch))
2068 return PTR_ERR(pmc->scratch);
2069 } else {
2070 pmc->scratch = base;
2073 pmc->clk = devm_clk_get(&pdev->dev, "pclk");
2074 if (IS_ERR(pmc->clk)) {
2075 err = PTR_ERR(pmc->clk);
2077 if (err != -ENOENT) {
2078 dev_err(&pdev->dev, "failed to get pclk: %d\n", err);
2079 return err;
2082 pmc->clk = NULL;
2085 pmc->dev = &pdev->dev;
2087 tegra_pmc_init(pmc);
2089 tegra_pmc_init_tsense_reset(pmc);
2091 tegra_pmc_reset_sysfs_init(pmc);
2093 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
2094 err = tegra_powergate_debugfs_init();
2095 if (err < 0)
2096 goto cleanup_sysfs;
2099 err = register_restart_handler(&tegra_pmc_restart_handler);
2100 if (err) {
2101 dev_err(&pdev->dev, "unable to register restart handler, %d\n",
2102 err);
2103 goto cleanup_debugfs;
2106 err = tegra_pmc_pinctrl_init(pmc);
2107 if (err)
2108 goto cleanup_restart_handler;
2110 err = tegra_powergate_init(pmc, pdev->dev.of_node);
2111 if (err < 0)
2112 goto cleanup_powergates;
2114 err = tegra_pmc_irq_init(pmc);
2115 if (err < 0)
2116 goto cleanup_powergates;
2118 mutex_lock(&pmc->powergates_lock);
2119 iounmap(pmc->base);
2120 pmc->base = base;
2121 mutex_unlock(&pmc->powergates_lock);
2123 platform_set_drvdata(pdev, pmc);
2125 return 0;
2127 cleanup_powergates:
2128 tegra_powergate_remove_all(pdev->dev.of_node);
2129 cleanup_restart_handler:
2130 unregister_restart_handler(&tegra_pmc_restart_handler);
2131 cleanup_debugfs:
2132 debugfs_remove(pmc->debugfs);
2133 cleanup_sysfs:
2134 device_remove_file(&pdev->dev, &dev_attr_reset_reason);
2135 device_remove_file(&pdev->dev, &dev_attr_reset_level);
2136 return err;
2139 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
2140 static int tegra_pmc_suspend(struct device *dev)
2142 struct tegra_pmc *pmc = dev_get_drvdata(dev);
2144 tegra_pmc_writel(pmc, virt_to_phys(tegra_resume), PMC_SCRATCH41);
2146 return 0;
2149 static int tegra_pmc_resume(struct device *dev)
2151 struct tegra_pmc *pmc = dev_get_drvdata(dev);
2153 tegra_pmc_writel(pmc, 0x0, PMC_SCRATCH41);
2155 return 0;
2158 static SIMPLE_DEV_PM_OPS(tegra_pmc_pm_ops, tegra_pmc_suspend, tegra_pmc_resume);
2160 #endif
2162 static const char * const tegra20_powergates[] = {
2163 [TEGRA_POWERGATE_CPU] = "cpu",
2164 [TEGRA_POWERGATE_3D] = "3d",
2165 [TEGRA_POWERGATE_VENC] = "venc",
2166 [TEGRA_POWERGATE_VDEC] = "vdec",
2167 [TEGRA_POWERGATE_PCIE] = "pcie",
2168 [TEGRA_POWERGATE_L2] = "l2",
2169 [TEGRA_POWERGATE_MPE] = "mpe",
2172 static const struct tegra_pmc_regs tegra20_pmc_regs = {
2173 .scratch0 = 0x50,
2174 .dpd_req = 0x1b8,
2175 .dpd_status = 0x1bc,
2176 .dpd2_req = 0x1c0,
2177 .dpd2_status = 0x1c4,
2178 .rst_status = 0x1b4,
2179 .rst_source_shift = 0x0,
2180 .rst_source_mask = 0x7,
2181 .rst_level_shift = 0x0,
2182 .rst_level_mask = 0x0,
2185 static void tegra20_pmc_init(struct tegra_pmc *pmc)
2187 u32 value;
2189 /* Always enable CPU power request */
2190 value = tegra_pmc_readl(pmc, PMC_CNTRL);
2191 value |= PMC_CNTRL_CPU_PWRREQ_OE;
2192 tegra_pmc_writel(pmc, value, PMC_CNTRL);
2194 value = tegra_pmc_readl(pmc, PMC_CNTRL);
2196 if (pmc->sysclkreq_high)
2197 value &= ~PMC_CNTRL_SYSCLK_POLARITY;
2198 else
2199 value |= PMC_CNTRL_SYSCLK_POLARITY;
2201 /* configure the output polarity while the request is tristated */
2202 tegra_pmc_writel(pmc, value, PMC_CNTRL);
2204 /* now enable the request */
2205 value = tegra_pmc_readl(pmc, PMC_CNTRL);
2206 value |= PMC_CNTRL_SYSCLK_OE;
2207 tegra_pmc_writel(pmc, value, PMC_CNTRL);
2210 static void tegra20_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
2211 struct device_node *np,
2212 bool invert)
2214 u32 value;
2216 value = tegra_pmc_readl(pmc, PMC_CNTRL);
2218 if (invert)
2219 value |= PMC_CNTRL_INTR_POLARITY;
2220 else
2221 value &= ~PMC_CNTRL_INTR_POLARITY;
2223 tegra_pmc_writel(pmc, value, PMC_CNTRL);
2226 static const struct tegra_pmc_soc tegra20_pmc_soc = {
2227 .num_powergates = ARRAY_SIZE(tegra20_powergates),
2228 .powergates = tegra20_powergates,
2229 .num_cpu_powergates = 0,
2230 .cpu_powergates = NULL,
2231 .has_tsense_reset = false,
2232 .has_gpu_clamps = false,
2233 .needs_mbist_war = false,
2234 .has_impl_33v_pwr = false,
2235 .maybe_tz_only = false,
2236 .num_io_pads = 0,
2237 .io_pads = NULL,
2238 .num_pin_descs = 0,
2239 .pin_descs = NULL,
2240 .regs = &tegra20_pmc_regs,
2241 .init = tegra20_pmc_init,
2242 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
2243 .reset_sources = NULL,
2244 .num_reset_sources = 0,
2245 .reset_levels = NULL,
2246 .num_reset_levels = 0,
2249 static const char * const tegra30_powergates[] = {
2250 [TEGRA_POWERGATE_CPU] = "cpu0",
2251 [TEGRA_POWERGATE_3D] = "3d0",
2252 [TEGRA_POWERGATE_VENC] = "venc",
2253 [TEGRA_POWERGATE_VDEC] = "vdec",
2254 [TEGRA_POWERGATE_PCIE] = "pcie",
2255 [TEGRA_POWERGATE_L2] = "l2",
2256 [TEGRA_POWERGATE_MPE] = "mpe",
2257 [TEGRA_POWERGATE_HEG] = "heg",
2258 [TEGRA_POWERGATE_SATA] = "sata",
2259 [TEGRA_POWERGATE_CPU1] = "cpu1",
2260 [TEGRA_POWERGATE_CPU2] = "cpu2",
2261 [TEGRA_POWERGATE_CPU3] = "cpu3",
2262 [TEGRA_POWERGATE_CELP] = "celp",
2263 [TEGRA_POWERGATE_3D1] = "3d1",
2266 static const u8 tegra30_cpu_powergates[] = {
2267 TEGRA_POWERGATE_CPU,
2268 TEGRA_POWERGATE_CPU1,
2269 TEGRA_POWERGATE_CPU2,
2270 TEGRA_POWERGATE_CPU3,
2273 static const struct tegra_pmc_soc tegra30_pmc_soc = {
2274 .num_powergates = ARRAY_SIZE(tegra30_powergates),
2275 .powergates = tegra30_powergates,
2276 .num_cpu_powergates = ARRAY_SIZE(tegra30_cpu_powergates),
2277 .cpu_powergates = tegra30_cpu_powergates,
2278 .has_tsense_reset = true,
2279 .has_gpu_clamps = false,
2280 .needs_mbist_war = false,
2281 .has_impl_33v_pwr = false,
2282 .maybe_tz_only = false,
2283 .num_io_pads = 0,
2284 .io_pads = NULL,
2285 .num_pin_descs = 0,
2286 .pin_descs = NULL,
2287 .regs = &tegra20_pmc_regs,
2288 .init = tegra20_pmc_init,
2289 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
2290 .reset_sources = tegra30_reset_sources,
2291 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
2292 .reset_levels = NULL,
2293 .num_reset_levels = 0,
2296 static const char * const tegra114_powergates[] = {
2297 [TEGRA_POWERGATE_CPU] = "crail",
2298 [TEGRA_POWERGATE_3D] = "3d",
2299 [TEGRA_POWERGATE_VENC] = "venc",
2300 [TEGRA_POWERGATE_VDEC] = "vdec",
2301 [TEGRA_POWERGATE_MPE] = "mpe",
2302 [TEGRA_POWERGATE_HEG] = "heg",
2303 [TEGRA_POWERGATE_CPU1] = "cpu1",
2304 [TEGRA_POWERGATE_CPU2] = "cpu2",
2305 [TEGRA_POWERGATE_CPU3] = "cpu3",
2306 [TEGRA_POWERGATE_CELP] = "celp",
2307 [TEGRA_POWERGATE_CPU0] = "cpu0",
2308 [TEGRA_POWERGATE_C0NC] = "c0nc",
2309 [TEGRA_POWERGATE_C1NC] = "c1nc",
2310 [TEGRA_POWERGATE_DIS] = "dis",
2311 [TEGRA_POWERGATE_DISB] = "disb",
2312 [TEGRA_POWERGATE_XUSBA] = "xusba",
2313 [TEGRA_POWERGATE_XUSBB] = "xusbb",
2314 [TEGRA_POWERGATE_XUSBC] = "xusbc",
2317 static const u8 tegra114_cpu_powergates[] = {
2318 TEGRA_POWERGATE_CPU0,
2319 TEGRA_POWERGATE_CPU1,
2320 TEGRA_POWERGATE_CPU2,
2321 TEGRA_POWERGATE_CPU3,
2324 static const struct tegra_pmc_soc tegra114_pmc_soc = {
2325 .num_powergates = ARRAY_SIZE(tegra114_powergates),
2326 .powergates = tegra114_powergates,
2327 .num_cpu_powergates = ARRAY_SIZE(tegra114_cpu_powergates),
2328 .cpu_powergates = tegra114_cpu_powergates,
2329 .has_tsense_reset = true,
2330 .has_gpu_clamps = false,
2331 .needs_mbist_war = false,
2332 .has_impl_33v_pwr = false,
2333 .maybe_tz_only = false,
2334 .num_io_pads = 0,
2335 .io_pads = NULL,
2336 .num_pin_descs = 0,
2337 .pin_descs = NULL,
2338 .regs = &tegra20_pmc_regs,
2339 .init = tegra20_pmc_init,
2340 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
2341 .reset_sources = tegra30_reset_sources,
2342 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
2343 .reset_levels = NULL,
2344 .num_reset_levels = 0,
2347 static const char * const tegra124_powergates[] = {
2348 [TEGRA_POWERGATE_CPU] = "crail",
2349 [TEGRA_POWERGATE_3D] = "3d",
2350 [TEGRA_POWERGATE_VENC] = "venc",
2351 [TEGRA_POWERGATE_PCIE] = "pcie",
2352 [TEGRA_POWERGATE_VDEC] = "vdec",
2353 [TEGRA_POWERGATE_MPE] = "mpe",
2354 [TEGRA_POWERGATE_HEG] = "heg",
2355 [TEGRA_POWERGATE_SATA] = "sata",
2356 [TEGRA_POWERGATE_CPU1] = "cpu1",
2357 [TEGRA_POWERGATE_CPU2] = "cpu2",
2358 [TEGRA_POWERGATE_CPU3] = "cpu3",
2359 [TEGRA_POWERGATE_CELP] = "celp",
2360 [TEGRA_POWERGATE_CPU0] = "cpu0",
2361 [TEGRA_POWERGATE_C0NC] = "c0nc",
2362 [TEGRA_POWERGATE_C1NC] = "c1nc",
2363 [TEGRA_POWERGATE_SOR] = "sor",
2364 [TEGRA_POWERGATE_DIS] = "dis",
2365 [TEGRA_POWERGATE_DISB] = "disb",
2366 [TEGRA_POWERGATE_XUSBA] = "xusba",
2367 [TEGRA_POWERGATE_XUSBB] = "xusbb",
2368 [TEGRA_POWERGATE_XUSBC] = "xusbc",
2369 [TEGRA_POWERGATE_VIC] = "vic",
2370 [TEGRA_POWERGATE_IRAM] = "iram",
2373 static const u8 tegra124_cpu_powergates[] = {
2374 TEGRA_POWERGATE_CPU0,
2375 TEGRA_POWERGATE_CPU1,
2376 TEGRA_POWERGATE_CPU2,
2377 TEGRA_POWERGATE_CPU3,
2380 #define TEGRA_IO_PAD(_id, _dpd, _voltage, _name) \
2381 ((struct tegra_io_pad_soc) { \
2382 .id = (_id), \
2383 .dpd = (_dpd), \
2384 .voltage = (_voltage), \
2385 .name = (_name), \
2388 #define TEGRA_IO_PIN_DESC(_id, _dpd, _voltage, _name) \
2389 ((struct pinctrl_pin_desc) { \
2390 .number = (_id), \
2391 .name = (_name) \
2394 #define TEGRA124_IO_PAD_TABLE(_pad) \
2395 /* .id .dpd .voltage .name */ \
2396 _pad(TEGRA_IO_PAD_AUDIO, 17, UINT_MAX, "audio"), \
2397 _pad(TEGRA_IO_PAD_BB, 15, UINT_MAX, "bb"), \
2398 _pad(TEGRA_IO_PAD_CAM, 36, UINT_MAX, "cam"), \
2399 _pad(TEGRA_IO_PAD_COMP, 22, UINT_MAX, "comp"), \
2400 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
2401 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csb"), \
2402 _pad(TEGRA_IO_PAD_CSIE, 44, UINT_MAX, "cse"), \
2403 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
2404 _pad(TEGRA_IO_PAD_DSIB, 39, UINT_MAX, "dsib"), \
2405 _pad(TEGRA_IO_PAD_DSIC, 40, UINT_MAX, "dsic"), \
2406 _pad(TEGRA_IO_PAD_DSID, 41, UINT_MAX, "dsid"), \
2407 _pad(TEGRA_IO_PAD_HDMI, 28, UINT_MAX, "hdmi"), \
2408 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
2409 _pad(TEGRA_IO_PAD_HV, 38, UINT_MAX, "hv"), \
2410 _pad(TEGRA_IO_PAD_LVDS, 57, UINT_MAX, "lvds"), \
2411 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
2412 _pad(TEGRA_IO_PAD_NAND, 13, UINT_MAX, "nand"), \
2413 _pad(TEGRA_IO_PAD_PEX_BIAS, 4, UINT_MAX, "pex-bias"), \
2414 _pad(TEGRA_IO_PAD_PEX_CLK1, 5, UINT_MAX, "pex-clk1"), \
2415 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
2416 _pad(TEGRA_IO_PAD_PEX_CNTRL, 32, UINT_MAX, "pex-cntrl"), \
2417 _pad(TEGRA_IO_PAD_SDMMC1, 33, UINT_MAX, "sdmmc1"), \
2418 _pad(TEGRA_IO_PAD_SDMMC3, 34, UINT_MAX, "sdmmc3"), \
2419 _pad(TEGRA_IO_PAD_SDMMC4, 35, UINT_MAX, "sdmmc4"), \
2420 _pad(TEGRA_IO_PAD_SYS_DDC, 58, UINT_MAX, "sys_ddc"), \
2421 _pad(TEGRA_IO_PAD_UART, 14, UINT_MAX, "uart"), \
2422 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
2423 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
2424 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
2425 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb_bias")
2427 static const struct tegra_io_pad_soc tegra124_io_pads[] = {
2428 TEGRA124_IO_PAD_TABLE(TEGRA_IO_PAD)
2431 static const struct pinctrl_pin_desc tegra124_pin_descs[] = {
2432 TEGRA124_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
2435 static const struct tegra_pmc_soc tegra124_pmc_soc = {
2436 .num_powergates = ARRAY_SIZE(tegra124_powergates),
2437 .powergates = tegra124_powergates,
2438 .num_cpu_powergates = ARRAY_SIZE(tegra124_cpu_powergates),
2439 .cpu_powergates = tegra124_cpu_powergates,
2440 .has_tsense_reset = true,
2441 .has_gpu_clamps = true,
2442 .needs_mbist_war = false,
2443 .has_impl_33v_pwr = false,
2444 .maybe_tz_only = false,
2445 .num_io_pads = ARRAY_SIZE(tegra124_io_pads),
2446 .io_pads = tegra124_io_pads,
2447 .num_pin_descs = ARRAY_SIZE(tegra124_pin_descs),
2448 .pin_descs = tegra124_pin_descs,
2449 .regs = &tegra20_pmc_regs,
2450 .init = tegra20_pmc_init,
2451 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
2452 .reset_sources = tegra30_reset_sources,
2453 .num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
2454 .reset_levels = NULL,
2455 .num_reset_levels = 0,
2458 static const char * const tegra210_powergates[] = {
2459 [TEGRA_POWERGATE_CPU] = "crail",
2460 [TEGRA_POWERGATE_3D] = "3d",
2461 [TEGRA_POWERGATE_VENC] = "venc",
2462 [TEGRA_POWERGATE_PCIE] = "pcie",
2463 [TEGRA_POWERGATE_MPE] = "mpe",
2464 [TEGRA_POWERGATE_SATA] = "sata",
2465 [TEGRA_POWERGATE_CPU1] = "cpu1",
2466 [TEGRA_POWERGATE_CPU2] = "cpu2",
2467 [TEGRA_POWERGATE_CPU3] = "cpu3",
2468 [TEGRA_POWERGATE_CPU0] = "cpu0",
2469 [TEGRA_POWERGATE_C0NC] = "c0nc",
2470 [TEGRA_POWERGATE_SOR] = "sor",
2471 [TEGRA_POWERGATE_DIS] = "dis",
2472 [TEGRA_POWERGATE_DISB] = "disb",
2473 [TEGRA_POWERGATE_XUSBA] = "xusba",
2474 [TEGRA_POWERGATE_XUSBB] = "xusbb",
2475 [TEGRA_POWERGATE_XUSBC] = "xusbc",
2476 [TEGRA_POWERGATE_VIC] = "vic",
2477 [TEGRA_POWERGATE_IRAM] = "iram",
2478 [TEGRA_POWERGATE_NVDEC] = "nvdec",
2479 [TEGRA_POWERGATE_NVJPG] = "nvjpg",
2480 [TEGRA_POWERGATE_AUD] = "aud",
2481 [TEGRA_POWERGATE_DFD] = "dfd",
2482 [TEGRA_POWERGATE_VE2] = "ve2",
2485 static const u8 tegra210_cpu_powergates[] = {
2486 TEGRA_POWERGATE_CPU0,
2487 TEGRA_POWERGATE_CPU1,
2488 TEGRA_POWERGATE_CPU2,
2489 TEGRA_POWERGATE_CPU3,
2492 #define TEGRA210_IO_PAD_TABLE(_pad) \
2493 /* .id .dpd .voltage .name */ \
2494 _pad(TEGRA_IO_PAD_AUDIO, 17, 5, "audio"), \
2495 _pad(TEGRA_IO_PAD_AUDIO_HV, 61, 18, "audio-hv"), \
2496 _pad(TEGRA_IO_PAD_CAM, 36, 10, "cam"), \
2497 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
2498 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csib"), \
2499 _pad(TEGRA_IO_PAD_CSIC, 42, UINT_MAX, "csic"), \
2500 _pad(TEGRA_IO_PAD_CSID, 43, UINT_MAX, "csid"), \
2501 _pad(TEGRA_IO_PAD_CSIE, 44, UINT_MAX, "csie"), \
2502 _pad(TEGRA_IO_PAD_CSIF, 45, UINT_MAX, "csif"), \
2503 _pad(TEGRA_IO_PAD_DBG, 25, 19, "dbg"), \
2504 _pad(TEGRA_IO_PAD_DEBUG_NONAO, 26, UINT_MAX, "debug-nonao"), \
2505 _pad(TEGRA_IO_PAD_DMIC, 50, 20, "dmic"), \
2506 _pad(TEGRA_IO_PAD_DP, 51, UINT_MAX, "dp"), \
2507 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
2508 _pad(TEGRA_IO_PAD_DSIB, 39, UINT_MAX, "dsib"), \
2509 _pad(TEGRA_IO_PAD_DSIC, 40, UINT_MAX, "dsic"), \
2510 _pad(TEGRA_IO_PAD_DSID, 41, UINT_MAX, "dsid"), \
2511 _pad(TEGRA_IO_PAD_EMMC, 35, UINT_MAX, "emmc"), \
2512 _pad(TEGRA_IO_PAD_EMMC2, 37, UINT_MAX, "emmc2"), \
2513 _pad(TEGRA_IO_PAD_GPIO, 27, 21, "gpio"), \
2514 _pad(TEGRA_IO_PAD_HDMI, 28, UINT_MAX, "hdmi"), \
2515 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
2516 _pad(TEGRA_IO_PAD_LVDS, 57, UINT_MAX, "lvds"), \
2517 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
2518 _pad(TEGRA_IO_PAD_PEX_BIAS, 4, UINT_MAX, "pex-bias"), \
2519 _pad(TEGRA_IO_PAD_PEX_CLK1, 5, UINT_MAX, "pex-clk1"), \
2520 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
2521 _pad(TEGRA_IO_PAD_PEX_CNTRL, UINT_MAX, 11, "pex-cntrl"), \
2522 _pad(TEGRA_IO_PAD_SDMMC1, 33, 12, "sdmmc1"), \
2523 _pad(TEGRA_IO_PAD_SDMMC3, 34, 13, "sdmmc3"), \
2524 _pad(TEGRA_IO_PAD_SPI, 46, 22, "spi"), \
2525 _pad(TEGRA_IO_PAD_SPI_HV, 47, 23, "spi-hv"), \
2526 _pad(TEGRA_IO_PAD_UART, 14, 2, "uart"), \
2527 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
2528 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
2529 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
2530 _pad(TEGRA_IO_PAD_USB3, 18, UINT_MAX, "usb3"), \
2531 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb-bias")
2533 static const struct tegra_io_pad_soc tegra210_io_pads[] = {
2534 TEGRA210_IO_PAD_TABLE(TEGRA_IO_PAD)
2537 static const struct pinctrl_pin_desc tegra210_pin_descs[] = {
2538 TEGRA210_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
2541 static const struct tegra_pmc_soc tegra210_pmc_soc = {
2542 .num_powergates = ARRAY_SIZE(tegra210_powergates),
2543 .powergates = tegra210_powergates,
2544 .num_cpu_powergates = ARRAY_SIZE(tegra210_cpu_powergates),
2545 .cpu_powergates = tegra210_cpu_powergates,
2546 .has_tsense_reset = true,
2547 .has_gpu_clamps = true,
2548 .needs_mbist_war = true,
2549 .has_impl_33v_pwr = false,
2550 .maybe_tz_only = true,
2551 .num_io_pads = ARRAY_SIZE(tegra210_io_pads),
2552 .io_pads = tegra210_io_pads,
2553 .num_pin_descs = ARRAY_SIZE(tegra210_pin_descs),
2554 .pin_descs = tegra210_pin_descs,
2555 .regs = &tegra20_pmc_regs,
2556 .init = tegra20_pmc_init,
2557 .setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
2558 .reset_sources = tegra210_reset_sources,
2559 .num_reset_sources = ARRAY_SIZE(tegra210_reset_sources),
2560 .reset_levels = NULL,
2561 .num_reset_levels = 0,
2564 #define TEGRA186_IO_PAD_TABLE(_pad) \
2565 /* .id .dpd .voltage .name */ \
2566 _pad(TEGRA_IO_PAD_CSIA, 0, UINT_MAX, "csia"), \
2567 _pad(TEGRA_IO_PAD_CSIB, 1, UINT_MAX, "csib"), \
2568 _pad(TEGRA_IO_PAD_DSI, 2, UINT_MAX, "dsi"), \
2569 _pad(TEGRA_IO_PAD_MIPI_BIAS, 3, UINT_MAX, "mipi-bias"), \
2570 _pad(TEGRA_IO_PAD_PEX_CLK_BIAS, 4, UINT_MAX, "pex-clk-bias"), \
2571 _pad(TEGRA_IO_PAD_PEX_CLK3, 5, UINT_MAX, "pex-clk3"), \
2572 _pad(TEGRA_IO_PAD_PEX_CLK2, 6, UINT_MAX, "pex-clk2"), \
2573 _pad(TEGRA_IO_PAD_PEX_CLK1, 7, UINT_MAX, "pex-clk1"), \
2574 _pad(TEGRA_IO_PAD_USB0, 9, UINT_MAX, "usb0"), \
2575 _pad(TEGRA_IO_PAD_USB1, 10, UINT_MAX, "usb1"), \
2576 _pad(TEGRA_IO_PAD_USB2, 11, UINT_MAX, "usb2"), \
2577 _pad(TEGRA_IO_PAD_USB_BIAS, 12, UINT_MAX, "usb-bias"), \
2578 _pad(TEGRA_IO_PAD_UART, 14, UINT_MAX, "uart"), \
2579 _pad(TEGRA_IO_PAD_AUDIO, 17, UINT_MAX, "audio"), \
2580 _pad(TEGRA_IO_PAD_HSIC, 19, UINT_MAX, "hsic"), \
2581 _pad(TEGRA_IO_PAD_DBG, 25, UINT_MAX, "dbg"), \
2582 _pad(TEGRA_IO_PAD_HDMI_DP0, 28, UINT_MAX, "hdmi-dp0"), \
2583 _pad(TEGRA_IO_PAD_HDMI_DP1, 29, UINT_MAX, "hdmi-dp1"), \
2584 _pad(TEGRA_IO_PAD_PEX_CNTRL, 32, UINT_MAX, "pex-cntrl"), \
2585 _pad(TEGRA_IO_PAD_SDMMC2_HV, 34, 5, "sdmmc2-hv"), \
2586 _pad(TEGRA_IO_PAD_SDMMC4, 36, UINT_MAX, "sdmmc4"), \
2587 _pad(TEGRA_IO_PAD_CAM, 38, UINT_MAX, "cam"), \
2588 _pad(TEGRA_IO_PAD_DSIB, 40, UINT_MAX, "dsib"), \
2589 _pad(TEGRA_IO_PAD_DSIC, 41, UINT_MAX, "dsic"), \
2590 _pad(TEGRA_IO_PAD_DSID, 42, UINT_MAX, "dsid"), \
2591 _pad(TEGRA_IO_PAD_CSIC, 43, UINT_MAX, "csic"), \
2592 _pad(TEGRA_IO_PAD_CSID, 44, UINT_MAX, "csid"), \
2593 _pad(TEGRA_IO_PAD_CSIE, 45, UINT_MAX, "csie"), \
2594 _pad(TEGRA_IO_PAD_CSIF, 46, UINT_MAX, "csif"), \
2595 _pad(TEGRA_IO_PAD_SPI, 47, UINT_MAX, "spi"), \
2596 _pad(TEGRA_IO_PAD_UFS, 49, UINT_MAX, "ufs"), \
2597 _pad(TEGRA_IO_PAD_DMIC_HV, 52, 2, "dmic-hv"), \
2598 _pad(TEGRA_IO_PAD_EDP, 53, UINT_MAX, "edp"), \
2599 _pad(TEGRA_IO_PAD_SDMMC1_HV, 55, 4, "sdmmc1-hv"), \
2600 _pad(TEGRA_IO_PAD_SDMMC3_HV, 56, 6, "sdmmc3-hv"), \
2601 _pad(TEGRA_IO_PAD_CONN, 60, UINT_MAX, "conn"), \
2602 _pad(TEGRA_IO_PAD_AUDIO_HV, 61, 1, "audio-hv"), \
2603 _pad(TEGRA_IO_PAD_AO_HV, UINT_MAX, 0, "ao-hv")
2605 static const struct tegra_io_pad_soc tegra186_io_pads[] = {
2606 TEGRA186_IO_PAD_TABLE(TEGRA_IO_PAD)
2609 static const struct pinctrl_pin_desc tegra186_pin_descs[] = {
2610 TEGRA186_IO_PAD_TABLE(TEGRA_IO_PIN_DESC)
2613 static const struct tegra_pmc_regs tegra186_pmc_regs = {
2614 .scratch0 = 0x2000,
2615 .dpd_req = 0x74,
2616 .dpd_status = 0x78,
2617 .dpd2_req = 0x7c,
2618 .dpd2_status = 0x80,
2619 .rst_status = 0x70,
2620 .rst_source_shift = 0x2,
2621 .rst_source_mask = 0x3C,
2622 .rst_level_shift = 0x0,
2623 .rst_level_mask = 0x3,
2626 static void tegra186_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
2627 struct device_node *np,
2628 bool invert)
2630 struct resource regs;
2631 void __iomem *wake;
2632 u32 value;
2633 int index;
2635 index = of_property_match_string(np, "reg-names", "wake");
2636 if (index < 0) {
2637 dev_err(pmc->dev, "failed to find PMC wake registers\n");
2638 return;
2641 of_address_to_resource(np, index, &regs);
2643 wake = ioremap_nocache(regs.start, resource_size(&regs));
2644 if (!wake) {
2645 dev_err(pmc->dev, "failed to map PMC wake registers\n");
2646 return;
2649 value = readl(wake + WAKE_AOWAKE_CTRL);
2651 if (invert)
2652 value |= WAKE_AOWAKE_CTRL_INTR_POLARITY;
2653 else
2654 value &= ~WAKE_AOWAKE_CTRL_INTR_POLARITY;
2656 writel(value, wake + WAKE_AOWAKE_CTRL);
2658 iounmap(wake);
2661 static const struct tegra_wake_event tegra186_wake_events[] = {
2662 TEGRA_WAKE_GPIO("power", 29, 1, TEGRA186_AON_GPIO(FF, 0)),
2663 TEGRA_WAKE_IRQ("rtc", 73, 10),
2666 static const struct tegra_pmc_soc tegra186_pmc_soc = {
2667 .num_powergates = 0,
2668 .powergates = NULL,
2669 .num_cpu_powergates = 0,
2670 .cpu_powergates = NULL,
2671 .has_tsense_reset = false,
2672 .has_gpu_clamps = false,
2673 .needs_mbist_war = false,
2674 .has_impl_33v_pwr = true,
2675 .maybe_tz_only = false,
2676 .num_io_pads = ARRAY_SIZE(tegra186_io_pads),
2677 .io_pads = tegra186_io_pads,
2678 .num_pin_descs = ARRAY_SIZE(tegra186_pin_descs),
2679 .pin_descs = tegra186_pin_descs,
2680 .regs = &tegra186_pmc_regs,
2681 .init = NULL,
2682 .setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
2683 .reset_sources = tegra186_reset_sources,
2684 .num_reset_sources = ARRAY_SIZE(tegra186_reset_sources),
2685 .reset_levels = tegra186_reset_levels,
2686 .num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
2687 .num_wake_events = ARRAY_SIZE(tegra186_wake_events),
2688 .wake_events = tegra186_wake_events,
2691 static const struct tegra_io_pad_soc tegra194_io_pads[] = {
2692 { .id = TEGRA_IO_PAD_CSIA, .dpd = 0, .voltage = UINT_MAX },
2693 { .id = TEGRA_IO_PAD_CSIB, .dpd = 1, .voltage = UINT_MAX },
2694 { .id = TEGRA_IO_PAD_MIPI_BIAS, .dpd = 3, .voltage = UINT_MAX },
2695 { .id = TEGRA_IO_PAD_PEX_CLK_BIAS, .dpd = 4, .voltage = UINT_MAX },
2696 { .id = TEGRA_IO_PAD_PEX_CLK3, .dpd = 5, .voltage = UINT_MAX },
2697 { .id = TEGRA_IO_PAD_PEX_CLK2, .dpd = 6, .voltage = UINT_MAX },
2698 { .id = TEGRA_IO_PAD_PEX_CLK1, .dpd = 7, .voltage = UINT_MAX },
2699 { .id = TEGRA_IO_PAD_EQOS, .dpd = 8, .voltage = UINT_MAX },
2700 { .id = TEGRA_IO_PAD_PEX_CLK2_BIAS, .dpd = 9, .voltage = UINT_MAX },
2701 { .id = TEGRA_IO_PAD_PEX_CLK2, .dpd = 10, .voltage = UINT_MAX },
2702 { .id = TEGRA_IO_PAD_DAP3, .dpd = 11, .voltage = UINT_MAX },
2703 { .id = TEGRA_IO_PAD_DAP5, .dpd = 12, .voltage = UINT_MAX },
2704 { .id = TEGRA_IO_PAD_UART, .dpd = 14, .voltage = UINT_MAX },
2705 { .id = TEGRA_IO_PAD_PWR_CTL, .dpd = 15, .voltage = UINT_MAX },
2706 { .id = TEGRA_IO_PAD_SOC_GPIO53, .dpd = 16, .voltage = UINT_MAX },
2707 { .id = TEGRA_IO_PAD_AUDIO, .dpd = 17, .voltage = UINT_MAX },
2708 { .id = TEGRA_IO_PAD_GP_PWM2, .dpd = 18, .voltage = UINT_MAX },
2709 { .id = TEGRA_IO_PAD_GP_PWM3, .dpd = 19, .voltage = UINT_MAX },
2710 { .id = TEGRA_IO_PAD_SOC_GPIO12, .dpd = 20, .voltage = UINT_MAX },
2711 { .id = TEGRA_IO_PAD_SOC_GPIO13, .dpd = 21, .voltage = UINT_MAX },
2712 { .id = TEGRA_IO_PAD_SOC_GPIO10, .dpd = 22, .voltage = UINT_MAX },
2713 { .id = TEGRA_IO_PAD_UART4, .dpd = 23, .voltage = UINT_MAX },
2714 { .id = TEGRA_IO_PAD_UART5, .dpd = 24, .voltage = UINT_MAX },
2715 { .id = TEGRA_IO_PAD_DBG, .dpd = 25, .voltage = UINT_MAX },
2716 { .id = TEGRA_IO_PAD_HDMI_DP3, .dpd = 26, .voltage = UINT_MAX },
2717 { .id = TEGRA_IO_PAD_HDMI_DP2, .dpd = 27, .voltage = UINT_MAX },
2718 { .id = TEGRA_IO_PAD_HDMI_DP0, .dpd = 28, .voltage = UINT_MAX },
2719 { .id = TEGRA_IO_PAD_HDMI_DP1, .dpd = 29, .voltage = UINT_MAX },
2720 { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = 32, .voltage = UINT_MAX },
2721 { .id = TEGRA_IO_PAD_PEX_CTL2, .dpd = 33, .voltage = UINT_MAX },
2722 { .id = TEGRA_IO_PAD_PEX_L0_RST_N, .dpd = 34, .voltage = UINT_MAX },
2723 { .id = TEGRA_IO_PAD_PEX_L1_RST_N, .dpd = 35, .voltage = UINT_MAX },
2724 { .id = TEGRA_IO_PAD_SDMMC4, .dpd = 36, .voltage = UINT_MAX },
2725 { .id = TEGRA_IO_PAD_PEX_L5_RST_N, .dpd = 37, .voltage = UINT_MAX },
2726 { .id = TEGRA_IO_PAD_CSIC, .dpd = 43, .voltage = UINT_MAX },
2727 { .id = TEGRA_IO_PAD_CSID, .dpd = 44, .voltage = UINT_MAX },
2728 { .id = TEGRA_IO_PAD_CSIE, .dpd = 45, .voltage = UINT_MAX },
2729 { .id = TEGRA_IO_PAD_CSIF, .dpd = 46, .voltage = UINT_MAX },
2730 { .id = TEGRA_IO_PAD_SPI, .dpd = 47, .voltage = UINT_MAX },
2731 { .id = TEGRA_IO_PAD_UFS, .dpd = 49, .voltage = UINT_MAX },
2732 { .id = TEGRA_IO_PAD_CSIG, .dpd = 50, .voltage = UINT_MAX },
2733 { .id = TEGRA_IO_PAD_CSIH, .dpd = 51, .voltage = UINT_MAX },
2734 { .id = TEGRA_IO_PAD_EDP, .dpd = 53, .voltage = UINT_MAX },
2735 { .id = TEGRA_IO_PAD_SDMMC1_HV, .dpd = 55, .voltage = UINT_MAX },
2736 { .id = TEGRA_IO_PAD_SDMMC3_HV, .dpd = 56, .voltage = UINT_MAX },
2737 { .id = TEGRA_IO_PAD_CONN, .dpd = 60, .voltage = UINT_MAX },
2738 { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = UINT_MAX },
2741 static const struct tegra_wake_event tegra194_wake_events[] = {
2742 TEGRA_WAKE_GPIO("power", 29, 1, TEGRA194_AON_GPIO(EE, 4)),
2743 TEGRA_WAKE_IRQ("rtc", 73, 10),
2746 static const struct tegra_pmc_soc tegra194_pmc_soc = {
2747 .num_powergates = 0,
2748 .powergates = NULL,
2749 .num_cpu_powergates = 0,
2750 .cpu_powergates = NULL,
2751 .has_tsense_reset = false,
2752 .has_gpu_clamps = false,
2753 .needs_mbist_war = false,
2754 .has_impl_33v_pwr = false,
2755 .maybe_tz_only = false,
2756 .num_io_pads = ARRAY_SIZE(tegra194_io_pads),
2757 .io_pads = tegra194_io_pads,
2758 .regs = &tegra186_pmc_regs,
2759 .init = NULL,
2760 .setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
2761 .num_wake_events = ARRAY_SIZE(tegra194_wake_events),
2762 .wake_events = tegra194_wake_events,
2765 static const struct of_device_id tegra_pmc_match[] = {
2766 { .compatible = "nvidia,tegra194-pmc", .data = &tegra194_pmc_soc },
2767 { .compatible = "nvidia,tegra186-pmc", .data = &tegra186_pmc_soc },
2768 { .compatible = "nvidia,tegra210-pmc", .data = &tegra210_pmc_soc },
2769 { .compatible = "nvidia,tegra132-pmc", .data = &tegra124_pmc_soc },
2770 { .compatible = "nvidia,tegra124-pmc", .data = &tegra124_pmc_soc },
2771 { .compatible = "nvidia,tegra114-pmc", .data = &tegra114_pmc_soc },
2772 { .compatible = "nvidia,tegra30-pmc", .data = &tegra30_pmc_soc },
2773 { .compatible = "nvidia,tegra20-pmc", .data = &tegra20_pmc_soc },
2777 static struct platform_driver tegra_pmc_driver = {
2778 .driver = {
2779 .name = "tegra-pmc",
2780 .suppress_bind_attrs = true,
2781 .of_match_table = tegra_pmc_match,
2782 #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
2783 .pm = &tegra_pmc_pm_ops,
2784 #endif
2786 .probe = tegra_pmc_probe,
2788 builtin_platform_driver(tegra_pmc_driver);
2790 static bool __init tegra_pmc_detect_tz_only(struct tegra_pmc *pmc)
2792 u32 value, saved;
2794 saved = readl(pmc->base + pmc->soc->regs->scratch0);
2795 value = saved ^ 0xffffffff;
2797 if (value == 0xffffffff)
2798 value = 0xdeadbeef;
2800 /* write pattern and read it back */
2801 writel(value, pmc->base + pmc->soc->regs->scratch0);
2802 value = readl(pmc->base + pmc->soc->regs->scratch0);
2804 /* if we read all-zeroes, access is restricted to TZ only */
2805 if (value == 0) {
2806 pr_info("access to PMC is restricted to TZ\n");
2807 return true;
2810 /* restore original value */
2811 writel(saved, pmc->base + pmc->soc->regs->scratch0);
2813 return false;
2817 * Early initialization to allow access to registers in the very early boot
2818 * process.
2820 static int __init tegra_pmc_early_init(void)
2822 const struct of_device_id *match;
2823 struct device_node *np;
2824 struct resource regs;
2825 unsigned int i;
2826 bool invert;
2828 mutex_init(&pmc->powergates_lock);
2830 np = of_find_matching_node_and_match(NULL, tegra_pmc_match, &match);
2831 if (!np) {
2833 * Fall back to legacy initialization for 32-bit ARM only. All
2834 * 64-bit ARM device tree files for Tegra are required to have
2835 * a PMC node.
2837 * This is for backwards-compatibility with old device trees
2838 * that didn't contain a PMC node. Note that in this case the
2839 * SoC data can't be matched and therefore powergating is
2840 * disabled.
2842 if (IS_ENABLED(CONFIG_ARM) && soc_is_tegra()) {
2843 pr_warn("DT node not found, powergating disabled\n");
2845 regs.start = 0x7000e400;
2846 regs.end = 0x7000e7ff;
2847 regs.flags = IORESOURCE_MEM;
2849 pr_warn("Using memory region %pR\n", &regs);
2850 } else {
2852 * At this point we're not running on Tegra, so play
2853 * nice with multi-platform kernels.
2855 return 0;
2857 } else {
2859 * Extract information from the device tree if we've found a
2860 * matching node.
2862 if (of_address_to_resource(np, 0, &regs) < 0) {
2863 pr_err("failed to get PMC registers\n");
2864 of_node_put(np);
2865 return -ENXIO;
2869 pmc->base = ioremap_nocache(regs.start, resource_size(&regs));
2870 if (!pmc->base) {
2871 pr_err("failed to map PMC registers\n");
2872 of_node_put(np);
2873 return -ENXIO;
2876 if (np) {
2877 pmc->soc = match->data;
2879 if (pmc->soc->maybe_tz_only)
2880 pmc->tz_only = tegra_pmc_detect_tz_only(pmc);
2882 /* Create a bitmap of the available and valid partitions */
2883 for (i = 0; i < pmc->soc->num_powergates; i++)
2884 if (pmc->soc->powergates[i])
2885 set_bit(i, pmc->powergates_available);
2888 * Invert the interrupt polarity if a PMC device tree node
2889 * exists and contains the nvidia,invert-interrupt property.
2891 invert = of_property_read_bool(np, "nvidia,invert-interrupt");
2893 pmc->soc->setup_irq_polarity(pmc, np, invert);
2895 of_node_put(np);
2898 return 0;
2900 early_initcall(tegra_pmc_early_init);