xref: /kernel/linux/linux-6.6/drivers/soc/tegra/pmc.c (revision 62306a36)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * drivers/soc/tegra/pmc.c
4 *
5 * Copyright (c) 2010 Google, Inc
6 * Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
7 *
8 * Author:
9 *	Colin Cross <ccross@google.com>
10 */
11
12#define pr_fmt(fmt) "tegra-pmc: " fmt
13
14#include <linux/arm-smccc.h>
15#include <linux/clk.h>
16#include <linux/clk-provider.h>
17#include <linux/clkdev.h>
18#include <linux/clk/clk-conf.h>
19#include <linux/clk/tegra.h>
20#include <linux/debugfs.h>
21#include <linux/delay.h>
22#include <linux/device.h>
23#include <linux/err.h>
24#include <linux/export.h>
25#include <linux/init.h>
26#include <linux/interrupt.h>
27#include <linux/io.h>
28#include <linux/iopoll.h>
29#include <linux/irqdomain.h>
30#include <linux/irq.h>
31#include <linux/kernel.h>
32#include <linux/of_address.h>
33#include <linux/of_clk.h>
34#include <linux/of.h>
35#include <linux/of_irq.h>
36#include <linux/of_platform.h>
37#include <linux/pinctrl/pinconf-generic.h>
38#include <linux/pinctrl/pinconf.h>
39#include <linux/pinctrl/pinctrl.h>
40#include <linux/platform_device.h>
41#include <linux/pm_domain.h>
42#include <linux/pm_opp.h>
43#include <linux/power_supply.h>
44#include <linux/reboot.h>
45#include <linux/regmap.h>
46#include <linux/reset.h>
47#include <linux/seq_file.h>
48#include <linux/slab.h>
49#include <linux/spinlock.h>
50#include <linux/syscore_ops.h>
51
52#include <soc/tegra/common.h>
53#include <soc/tegra/fuse.h>
54#include <soc/tegra/pmc.h>
55
56#include <dt-bindings/interrupt-controller/arm-gic.h>
57#include <dt-bindings/pinctrl/pinctrl-tegra-io-pad.h>
58#include <dt-bindings/gpio/tegra186-gpio.h>
59#include <dt-bindings/gpio/tegra194-gpio.h>
60#include <dt-bindings/gpio/tegra234-gpio.h>
61#include <dt-bindings/soc/tegra-pmc.h>
62
63#define PMC_CNTRL			0x0
64#define  PMC_CNTRL_INTR_POLARITY	BIT(17) /* inverts INTR polarity */
65#define  PMC_CNTRL_CPU_PWRREQ_OE	BIT(16) /* CPU pwr req enable */
66#define  PMC_CNTRL_CPU_PWRREQ_POLARITY	BIT(15) /* CPU pwr req polarity */
67#define  PMC_CNTRL_SIDE_EFFECT_LP0	BIT(14) /* LP0 when CPU pwr gated */
68#define  PMC_CNTRL_SYSCLK_OE		BIT(11) /* system clock enable */
69#define  PMC_CNTRL_SYSCLK_POLARITY	BIT(10) /* sys clk polarity */
70#define  PMC_CNTRL_PWRREQ_POLARITY	BIT(8)
71#define  PMC_CNTRL_BLINK_EN		7
72#define  PMC_CNTRL_MAIN_RST		BIT(4)
73
74#define PMC_WAKE_MASK			0x0c
75#define PMC_WAKE_LEVEL			0x10
76#define PMC_WAKE_STATUS			0x14
77#define PMC_SW_WAKE_STATUS		0x18
78#define PMC_DPD_PADS_ORIDE		0x1c
79#define  PMC_DPD_PADS_ORIDE_BLINK	20
80
81#define DPD_SAMPLE			0x020
82#define  DPD_SAMPLE_ENABLE		BIT(0)
83#define  DPD_SAMPLE_DISABLE		(0 << 0)
84
85#define PWRGATE_TOGGLE			0x30
86#define  PWRGATE_TOGGLE_START		BIT(8)
87
88#define REMOVE_CLAMPING			0x34
89
90#define PWRGATE_STATUS			0x38
91
92#define PMC_BLINK_TIMER			0x40
93#define PMC_IMPL_E_33V_PWR		0x40
94
95#define PMC_PWR_DET			0x48
96
97#define PMC_SCRATCH0_MODE_RECOVERY	BIT(31)
98#define PMC_SCRATCH0_MODE_BOOTLOADER	BIT(30)
99#define PMC_SCRATCH0_MODE_RCM		BIT(1)
100#define PMC_SCRATCH0_MODE_MASK		(PMC_SCRATCH0_MODE_RECOVERY | \
101					 PMC_SCRATCH0_MODE_BOOTLOADER | \
102					 PMC_SCRATCH0_MODE_RCM)
103
104#define PMC_CPUPWRGOOD_TIMER		0xc8
105#define PMC_CPUPWROFF_TIMER		0xcc
106#define PMC_COREPWRGOOD_TIMER		0x3c
107#define PMC_COREPWROFF_TIMER		0xe0
108
109#define PMC_PWR_DET_VALUE		0xe4
110
111#define PMC_USB_DEBOUNCE_DEL		0xec
112#define PMC_USB_AO			0xf0
113
114#define PMC_SCRATCH37			0x130
115#define PMC_SCRATCH41			0x140
116
117#define PMC_WAKE2_MASK			0x160
118#define PMC_WAKE2_LEVEL			0x164
119#define PMC_WAKE2_STATUS		0x168
120#define PMC_SW_WAKE2_STATUS		0x16c
121
122#define PMC_CLK_OUT_CNTRL		0x1a8
123#define  PMC_CLK_OUT_MUX_MASK		GENMASK(1, 0)
124#define PMC_SENSOR_CTRL			0x1b0
125#define  PMC_SENSOR_CTRL_SCRATCH_WRITE	BIT(2)
126#define  PMC_SENSOR_CTRL_ENABLE_RST	BIT(1)
127
128#define  PMC_RST_STATUS_POR		0
129#define  PMC_RST_STATUS_WATCHDOG	1
130#define  PMC_RST_STATUS_SENSOR		2
131#define  PMC_RST_STATUS_SW_MAIN		3
132#define  PMC_RST_STATUS_LP0		4
133#define  PMC_RST_STATUS_AOTAG		5
134
135#define IO_DPD_REQ			0x1b8
136#define  IO_DPD_REQ_CODE_IDLE		(0U << 30)
137#define  IO_DPD_REQ_CODE_OFF		(1U << 30)
138#define  IO_DPD_REQ_CODE_ON		(2U << 30)
139#define  IO_DPD_REQ_CODE_MASK		(3U << 30)
140
141#define IO_DPD_STATUS			0x1bc
142#define IO_DPD2_REQ			0x1c0
143#define IO_DPD2_STATUS			0x1c4
144#define SEL_DPD_TIM			0x1c8
145
146#define PMC_UTMIP_UHSIC_TRIGGERS	0x1ec
147#define PMC_UTMIP_UHSIC_SAVED_STATE	0x1f0
148
149#define PMC_UTMIP_TERM_PAD_CFG		0x1f8
150#define PMC_UTMIP_UHSIC_SLEEP_CFG	0x1fc
151#define PMC_UTMIP_UHSIC_FAKE		0x218
152
153#define PMC_SCRATCH54			0x258
154#define  PMC_SCRATCH54_DATA_SHIFT	8
155#define  PMC_SCRATCH54_ADDR_SHIFT	0
156
157#define PMC_SCRATCH55			0x25c
158#define  PMC_SCRATCH55_RESET_TEGRA	BIT(31)
159#define  PMC_SCRATCH55_CNTRL_ID_SHIFT	27
160#define  PMC_SCRATCH55_PINMUX_SHIFT	24
161#define  PMC_SCRATCH55_16BITOP		BIT(15)
162#define  PMC_SCRATCH55_CHECKSUM_SHIFT	16
163#define  PMC_SCRATCH55_I2CSLV1_SHIFT	0
164
165#define  PMC_UTMIP_UHSIC_LINE_WAKEUP	0x26c
166
167#define PMC_UTMIP_BIAS_MASTER_CNTRL	0x270
168#define PMC_UTMIP_MASTER_CONFIG		0x274
169#define PMC_UTMIP_UHSIC2_TRIGGERS	0x27c
170#define PMC_UTMIP_MASTER2_CONFIG	0x29c
171
172#define GPU_RG_CNTRL			0x2d4
173
174#define PMC_UTMIP_PAD_CFG0		0x4c0
175#define PMC_UTMIP_UHSIC_SLEEP_CFG1	0x4d0
176#define PMC_UTMIP_SLEEPWALK_P3		0x4e0
177/* Tegra186 and later */
178#define WAKE_AOWAKE_CNTRL(x) (0x000 + ((x) << 2))
179#define WAKE_AOWAKE_CNTRL_LEVEL (1 << 3)
180#define WAKE_AOWAKE_CNTRL_SR_CAPTURE_EN (1 << 1)
181#define WAKE_AOWAKE_MASK_W(x) (0x180 + ((x) << 2))
182#define WAKE_AOWAKE_MASK_R(x) (0x300 + ((x) << 2))
183#define WAKE_AOWAKE_STATUS_W(x) (0x30c + ((x) << 2))
184#define WAKE_AOWAKE_STATUS_R(x) (0x48c + ((x) << 2))
185#define WAKE_AOWAKE_TIER0_ROUTING(x) (0x4b4 + ((x) << 2))
186#define WAKE_AOWAKE_TIER1_ROUTING(x) (0x4c0 + ((x) << 2))
187#define WAKE_AOWAKE_TIER2_ROUTING(x) (0x4cc + ((x) << 2))
188#define WAKE_AOWAKE_SW_STATUS_W_0	0x49c
189#define WAKE_AOWAKE_SW_STATUS(x)	(0x4a0 + ((x) << 2))
190#define WAKE_LATCH_SW			0x498
191
192#define WAKE_AOWAKE_CTRL 0x4f4
193#define  WAKE_AOWAKE_CTRL_INTR_POLARITY BIT(0)
194
195#define SW_WAKE_ID		83 /* wake83 */
196
197/* for secure PMC */
198#define TEGRA_SMC_PMC		0xc2fffe00
199#define  TEGRA_SMC_PMC_READ	0xaa
200#define  TEGRA_SMC_PMC_WRITE	0xbb
201
202struct pmc_clk {
203	struct clk_hw	hw;
204	unsigned long	offs;
205	u32		mux_shift;
206	u32		force_en_shift;
207};
208
209#define to_pmc_clk(_hw) container_of(_hw, struct pmc_clk, hw)
210
211struct pmc_clk_gate {
212	struct clk_hw	hw;
213	unsigned long	offs;
214	u32		shift;
215};
216
217#define to_pmc_clk_gate(_hw) container_of(_hw, struct pmc_clk_gate, hw)
218
219struct pmc_clk_init_data {
220	char *name;
221	const char *const *parents;
222	int num_parents;
223	int clk_id;
224	u8 mux_shift;
225	u8 force_en_shift;
226};
227
228static const char * const clk_out1_parents[] = { "osc", "osc_div2",
229	"osc_div4", "extern1",
230};
231
232static const char * const clk_out2_parents[] = { "osc", "osc_div2",
233	"osc_div4", "extern2",
234};
235
236static const char * const clk_out3_parents[] = { "osc", "osc_div2",
237	"osc_div4", "extern3",
238};
239
240static const struct pmc_clk_init_data tegra_pmc_clks_data[] = {
241	{
242		.name = "pmc_clk_out_1",
243		.parents = clk_out1_parents,
244		.num_parents = ARRAY_SIZE(clk_out1_parents),
245		.clk_id = TEGRA_PMC_CLK_OUT_1,
246		.mux_shift = 6,
247		.force_en_shift = 2,
248	},
249	{
250		.name = "pmc_clk_out_2",
251		.parents = clk_out2_parents,
252		.num_parents = ARRAY_SIZE(clk_out2_parents),
253		.clk_id = TEGRA_PMC_CLK_OUT_2,
254		.mux_shift = 14,
255		.force_en_shift = 10,
256	},
257	{
258		.name = "pmc_clk_out_3",
259		.parents = clk_out3_parents,
260		.num_parents = ARRAY_SIZE(clk_out3_parents),
261		.clk_id = TEGRA_PMC_CLK_OUT_3,
262		.mux_shift = 22,
263		.force_en_shift = 18,
264	},
265};
266
267struct tegra_powergate {
268	struct generic_pm_domain genpd;
269	struct tegra_pmc *pmc;
270	unsigned int id;
271	struct clk **clks;
272	unsigned int num_clks;
273	unsigned long *clk_rates;
274	struct reset_control *reset;
275};
276
277struct tegra_io_pad_soc {
278	enum tegra_io_pad id;
279	unsigned int dpd;
280	unsigned int request;
281	unsigned int status;
282	unsigned int voltage;
283	const char *name;
284};
285
286struct tegra_pmc_regs {
287	unsigned int scratch0;
288	unsigned int rst_status;
289	unsigned int rst_source_shift;
290	unsigned int rst_source_mask;
291	unsigned int rst_level_shift;
292	unsigned int rst_level_mask;
293};
294
295struct tegra_wake_event {
296	const char *name;
297	unsigned int id;
298	unsigned int irq;
299	struct {
300		unsigned int instance;
301		unsigned int pin;
302	} gpio;
303};
304
305#define TEGRA_WAKE_SIMPLE(_name, _id)			\
306	{						\
307		.name = _name,				\
308		.id = _id,				\
309		.irq = 0,				\
310		.gpio = {				\
311			.instance = UINT_MAX,		\
312			.pin = UINT_MAX,		\
313		},					\
314	}
315
316#define TEGRA_WAKE_IRQ(_name, _id, _irq)		\
317	{						\
318		.name = _name,				\
319		.id = _id,				\
320		.irq = _irq,				\
321		.gpio = {				\
322			.instance = UINT_MAX,		\
323			.pin = UINT_MAX,		\
324		},					\
325	}
326
327#define TEGRA_WAKE_GPIO(_name, _id, _instance, _pin)	\
328	{						\
329		.name = _name,				\
330		.id = _id,				\
331		.irq = 0,				\
332		.gpio = {				\
333			.instance = _instance,		\
334			.pin = _pin,			\
335		},					\
336	}
337
338struct tegra_pmc_soc {
339	unsigned int num_powergates;
340	const char *const *powergates;
341	unsigned int num_cpu_powergates;
342	const u8 *cpu_powergates;
343
344	bool has_tsense_reset;
345	bool has_gpu_clamps;
346	bool needs_mbist_war;
347	bool has_impl_33v_pwr;
348	bool maybe_tz_only;
349
350	const struct tegra_io_pad_soc *io_pads;
351	unsigned int num_io_pads;
352
353	const struct pinctrl_pin_desc *pin_descs;
354	unsigned int num_pin_descs;
355
356	const struct tegra_pmc_regs *regs;
357	void (*init)(struct tegra_pmc *pmc);
358	void (*setup_irq_polarity)(struct tegra_pmc *pmc,
359				   struct device_node *np,
360				   bool invert);
361	void (*set_wake_filters)(struct tegra_pmc *pmc);
362	int (*irq_set_wake)(struct irq_data *data, unsigned int on);
363	int (*irq_set_type)(struct irq_data *data, unsigned int type);
364	int (*powergate_set)(struct tegra_pmc *pmc, unsigned int id,
365			     bool new_state);
366
367	const char * const *reset_sources;
368	unsigned int num_reset_sources;
369	const char * const *reset_levels;
370	unsigned int num_reset_levels;
371
372	/*
373	 * These describe events that can wake the system from sleep (i.e.
374	 * LP0 or SC7). Wakeup from other sleep states (such as LP1 or LP2)
375	 * are dealt with in the LIC.
376	 */
377	const struct tegra_wake_event *wake_events;
378	unsigned int num_wake_events;
379	unsigned int max_wake_events;
380	unsigned int max_wake_vectors;
381
382	const struct pmc_clk_init_data *pmc_clks_data;
383	unsigned int num_pmc_clks;
384	bool has_blink_output;
385	bool has_usb_sleepwalk;
386	bool supports_core_domain;
387};
388
389/**
390 * struct tegra_pmc - NVIDIA Tegra PMC
391 * @dev: pointer to PMC device structure
392 * @base: pointer to I/O remapped register region
393 * @wake: pointer to I/O remapped region for WAKE registers
394 * @aotag: pointer to I/O remapped region for AOTAG registers
395 * @scratch: pointer to I/O remapped region for scratch registers
396 * @clk: pointer to pclk clock
397 * @soc: pointer to SoC data structure
398 * @tz_only: flag specifying if the PMC can only be accessed via TrustZone
399 * @rate: currently configured rate of pclk
400 * @suspend_mode: lowest suspend mode available
401 * @cpu_good_time: CPU power good time (in microseconds)
402 * @cpu_off_time: CPU power off time (in microsecends)
403 * @core_osc_time: core power good OSC time (in microseconds)
404 * @core_pmu_time: core power good PMU time (in microseconds)
405 * @core_off_time: core power off time (in microseconds)
406 * @corereq_high: core power request is active-high
407 * @sysclkreq_high: system clock request is active-high
408 * @combined_req: combined power request for CPU & core
409 * @cpu_pwr_good_en: CPU power good signal is enabled
410 * @lp0_vec_phys: physical base address of the LP0 warm boot code
411 * @lp0_vec_size: size of the LP0 warm boot code
412 * @powergates_available: Bitmap of available power gates
413 * @powergates_lock: mutex for power gate register access
414 * @pctl_dev: pin controller exposed by the PMC
415 * @domain: IRQ domain provided by the PMC
416 * @irq: chip implementation for the IRQ domain
417 * @clk_nb: pclk clock changes handler
418 * @core_domain_state_synced: flag marking the core domain's state as synced
419 * @core_domain_registered: flag marking the core domain as registered
420 * @wake_type_level_map: Bitmap indicating level type for non-dual edge wakes
421 * @wake_type_dual_edge_map: Bitmap indicating if a wake is dual-edge or not
422 * @wake_sw_status_map: Bitmap to hold raw status of wakes without mask
423 * @wake_cntrl_level_map: Bitmap to hold wake levels to be programmed in
424 *     cntrl register associated with each wake during system suspend.
425 */
426struct tegra_pmc {
427	struct device *dev;
428	void __iomem *base;
429	void __iomem *wake;
430	void __iomem *aotag;
431	void __iomem *scratch;
432	struct clk *clk;
433
434	const struct tegra_pmc_soc *soc;
435	bool tz_only;
436
437	unsigned long rate;
438
439	enum tegra_suspend_mode suspend_mode;
440	u32 cpu_good_time;
441	u32 cpu_off_time;
442	u32 core_osc_time;
443	u32 core_pmu_time;
444	u32 core_off_time;
445	bool corereq_high;
446	bool sysclkreq_high;
447	bool combined_req;
448	bool cpu_pwr_good_en;
449	u32 lp0_vec_phys;
450	u32 lp0_vec_size;
451	DECLARE_BITMAP(powergates_available, TEGRA_POWERGATE_MAX);
452
453	struct mutex powergates_lock;
454
455	struct pinctrl_dev *pctl_dev;
456
457	struct irq_domain *domain;
458	struct irq_chip irq;
459
460	struct notifier_block clk_nb;
461
462	bool core_domain_state_synced;
463	bool core_domain_registered;
464
465	unsigned long *wake_type_level_map;
466	unsigned long *wake_type_dual_edge_map;
467	unsigned long *wake_sw_status_map;
468	unsigned long *wake_cntrl_level_map;
469	struct syscore_ops syscore;
470};
471
472static struct tegra_pmc *pmc = &(struct tegra_pmc) {
473	.base = NULL,
474	.suspend_mode = TEGRA_SUSPEND_NOT_READY,
475};
476
477static inline struct tegra_powergate *
478to_powergate(struct generic_pm_domain *domain)
479{
480	return container_of(domain, struct tegra_powergate, genpd);
481}
482
483static u32 tegra_pmc_readl(struct tegra_pmc *pmc, unsigned long offset)
484{
485	struct arm_smccc_res res;
486
487	if (pmc->tz_only) {
488		arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_READ, offset, 0, 0,
489			      0, 0, 0, &res);
490		if (res.a0) {
491			if (pmc->dev)
492				dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
493					 __func__, res.a0);
494			else
495				pr_warn("%s(): SMC failed: %lu\n", __func__,
496					res.a0);
497		}
498
499		return res.a1;
500	}
501
502	return readl(pmc->base + offset);
503}
504
505static void tegra_pmc_writel(struct tegra_pmc *pmc, u32 value,
506			     unsigned long offset)
507{
508	struct arm_smccc_res res;
509
510	if (pmc->tz_only) {
511		arm_smccc_smc(TEGRA_SMC_PMC, TEGRA_SMC_PMC_WRITE, offset,
512			      value, 0, 0, 0, 0, &res);
513		if (res.a0) {
514			if (pmc->dev)
515				dev_warn(pmc->dev, "%s(): SMC failed: %lu\n",
516					 __func__, res.a0);
517			else
518				pr_warn("%s(): SMC failed: %lu\n", __func__,
519					res.a0);
520		}
521	} else {
522		writel(value, pmc->base + offset);
523	}
524}
525
526static u32 tegra_pmc_scratch_readl(struct tegra_pmc *pmc, unsigned long offset)
527{
528	if (pmc->tz_only)
529		return tegra_pmc_readl(pmc, offset);
530
531	return readl(pmc->scratch + offset);
532}
533
534static void tegra_pmc_scratch_writel(struct tegra_pmc *pmc, u32 value,
535				     unsigned long offset)
536{
537	if (pmc->tz_only)
538		tegra_pmc_writel(pmc, value, offset);
539	else
540		writel(value, pmc->scratch + offset);
541}
542
543/*
544 * TODO Figure out a way to call this with the struct tegra_pmc * passed in.
545 * This currently doesn't work because readx_poll_timeout() can only operate
546 * on functions that take a single argument.
547 */
548static inline bool tegra_powergate_state(int id)
549{
550	if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
551		return (tegra_pmc_readl(pmc, GPU_RG_CNTRL) & 0x1) == 0;
552	else
553		return (tegra_pmc_readl(pmc, PWRGATE_STATUS) & BIT(id)) != 0;
554}
555
556static inline bool tegra_powergate_is_valid(struct tegra_pmc *pmc, int id)
557{
558	return (pmc->soc && pmc->soc->powergates[id]);
559}
560
561static inline bool tegra_powergate_is_available(struct tegra_pmc *pmc, int id)
562{
563	return test_bit(id, pmc->powergates_available);
564}
565
566static int tegra_powergate_lookup(struct tegra_pmc *pmc, const char *name)
567{
568	unsigned int i;
569
570	if (!pmc || !pmc->soc || !name)
571		return -EINVAL;
572
573	for (i = 0; i < pmc->soc->num_powergates; i++) {
574		if (!tegra_powergate_is_valid(pmc, i))
575			continue;
576
577		if (!strcmp(name, pmc->soc->powergates[i]))
578			return i;
579	}
580
581	return -ENODEV;
582}
583
584static int tegra20_powergate_set(struct tegra_pmc *pmc, unsigned int id,
585				 bool new_state)
586{
587	unsigned int retries = 100;
588	bool status;
589	int ret;
590
591	/*
592	 * As per TRM documentation, the toggle command will be dropped by PMC
593	 * if there is contention with a HW-initiated toggling (i.e. CPU core
594	 * power-gated), the command should be retried in that case.
595	 */
596	do {
597		tegra_pmc_writel(pmc, PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
598
599		/* wait for PMC to execute the command */
600		ret = readx_poll_timeout(tegra_powergate_state, id, status,
601					 status == new_state, 1, 10);
602	} while (ret == -ETIMEDOUT && retries--);
603
604	return ret;
605}
606
607static inline bool tegra_powergate_toggle_ready(struct tegra_pmc *pmc)
608{
609	return !(tegra_pmc_readl(pmc, PWRGATE_TOGGLE) & PWRGATE_TOGGLE_START);
610}
611
612static int tegra114_powergate_set(struct tegra_pmc *pmc, unsigned int id,
613				  bool new_state)
614{
615	bool status;
616	int err;
617
618	/* wait while PMC power gating is contended */
619	err = readx_poll_timeout(tegra_powergate_toggle_ready, pmc, status,
620				 status == true, 1, 100);
621	if (err)
622		return err;
623
624	tegra_pmc_writel(pmc, PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
625
626	/* wait for PMC to accept the command */
627	err = readx_poll_timeout(tegra_powergate_toggle_ready, pmc, status,
628				 status == true, 1, 100);
629	if (err)
630		return err;
631
632	/* wait for PMC to execute the command */
633	err = readx_poll_timeout(tegra_powergate_state, id, status,
634				 status == new_state, 10, 100000);
635	if (err)
636		return err;
637
638	return 0;
639}
640
641/**
642 * tegra_powergate_set() - set the state of a partition
643 * @pmc: power management controller
644 * @id: partition ID
645 * @new_state: new state of the partition
646 */
647static int tegra_powergate_set(struct tegra_pmc *pmc, unsigned int id,
648			       bool new_state)
649{
650	int err;
651
652	if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
653		return -EINVAL;
654
655	mutex_lock(&pmc->powergates_lock);
656
657	if (tegra_powergate_state(id) == new_state) {
658		mutex_unlock(&pmc->powergates_lock);
659		return 0;
660	}
661
662	err = pmc->soc->powergate_set(pmc, id, new_state);
663
664	mutex_unlock(&pmc->powergates_lock);
665
666	return err;
667}
668
669static int __tegra_powergate_remove_clamping(struct tegra_pmc *pmc,
670					     unsigned int id)
671{
672	u32 mask;
673
674	mutex_lock(&pmc->powergates_lock);
675
676	/*
677	 * On Tegra124 and later, the clamps for the GPU are controlled by a
678	 * separate register (with different semantics).
679	 */
680	if (id == TEGRA_POWERGATE_3D) {
681		if (pmc->soc->has_gpu_clamps) {
682			tegra_pmc_writel(pmc, 0, GPU_RG_CNTRL);
683			goto out;
684		}
685	}
686
687	/*
688	 * Tegra 2 has a bug where PCIE and VDE clamping masks are
689	 * swapped relatively to the partition ids
690	 */
691	if (id == TEGRA_POWERGATE_VDEC)
692		mask = (1 << TEGRA_POWERGATE_PCIE);
693	else if (id == TEGRA_POWERGATE_PCIE)
694		mask = (1 << TEGRA_POWERGATE_VDEC);
695	else
696		mask = (1 << id);
697
698	tegra_pmc_writel(pmc, mask, REMOVE_CLAMPING);
699
700out:
701	mutex_unlock(&pmc->powergates_lock);
702
703	return 0;
704}
705
706static int tegra_powergate_prepare_clocks(struct tegra_powergate *pg)
707{
708	unsigned long safe_rate = 100 * 1000 * 1000;
709	unsigned int i;
710	int err;
711
712	for (i = 0; i < pg->num_clks; i++) {
713		pg->clk_rates[i] = clk_get_rate(pg->clks[i]);
714
715		if (!pg->clk_rates[i]) {
716			err = -EINVAL;
717			goto out;
718		}
719
720		if (pg->clk_rates[i] <= safe_rate)
721			continue;
722
723		/*
724		 * We don't know whether voltage state is okay for the
725		 * current clock rate, hence it's better to temporally
726		 * switch clock to a safe rate which is suitable for
727		 * all voltages, before enabling the clock.
728		 */
729		err = clk_set_rate(pg->clks[i], safe_rate);
730		if (err)
731			goto out;
732	}
733
734	return 0;
735
736out:
737	while (i--)
738		clk_set_rate(pg->clks[i], pg->clk_rates[i]);
739
740	return err;
741}
742
743static int tegra_powergate_unprepare_clocks(struct tegra_powergate *pg)
744{
745	unsigned int i;
746	int err;
747
748	for (i = 0; i < pg->num_clks; i++) {
749		err = clk_set_rate(pg->clks[i], pg->clk_rates[i]);
750		if (err)
751			return err;
752	}
753
754	return 0;
755}
756
757static void tegra_powergate_disable_clocks(struct tegra_powergate *pg)
758{
759	unsigned int i;
760
761	for (i = 0; i < pg->num_clks; i++)
762		clk_disable_unprepare(pg->clks[i]);
763}
764
765static int tegra_powergate_enable_clocks(struct tegra_powergate *pg)
766{
767	unsigned int i;
768	int err;
769
770	for (i = 0; i < pg->num_clks; i++) {
771		err = clk_prepare_enable(pg->clks[i]);
772		if (err)
773			goto out;
774	}
775
776	return 0;
777
778out:
779	while (i--)
780		clk_disable_unprepare(pg->clks[i]);
781
782	return err;
783}
784
785static int tegra_powergate_power_up(struct tegra_powergate *pg,
786				    bool disable_clocks)
787{
788	int err;
789
790	err = reset_control_assert(pg->reset);
791	if (err)
792		return err;
793
794	usleep_range(10, 20);
795
796	err = tegra_powergate_set(pg->pmc, pg->id, true);
797	if (err < 0)
798		return err;
799
800	usleep_range(10, 20);
801
802	err = tegra_powergate_prepare_clocks(pg);
803	if (err)
804		goto powergate_off;
805
806	err = tegra_powergate_enable_clocks(pg);
807	if (err)
808		goto unprepare_clks;
809
810	usleep_range(10, 20);
811
812	err = __tegra_powergate_remove_clamping(pg->pmc, pg->id);
813	if (err)
814		goto disable_clks;
815
816	usleep_range(10, 20);
817
818	err = reset_control_deassert(pg->reset);
819	if (err)
820		goto disable_clks;
821
822	usleep_range(10, 20);
823
824	if (pg->pmc->soc->needs_mbist_war)
825		err = tegra210_clk_handle_mbist_war(pg->id);
826	if (err)
827		goto disable_clks;
828
829	if (disable_clocks)
830		tegra_powergate_disable_clocks(pg);
831
832	err = tegra_powergate_unprepare_clocks(pg);
833	if (err)
834		return err;
835
836	return 0;
837
838disable_clks:
839	tegra_powergate_disable_clocks(pg);
840	usleep_range(10, 20);
841
842unprepare_clks:
843	tegra_powergate_unprepare_clocks(pg);
844
845powergate_off:
846	tegra_powergate_set(pg->pmc, pg->id, false);
847
848	return err;
849}
850
851static int tegra_powergate_power_down(struct tegra_powergate *pg)
852{
853	int err;
854
855	err = tegra_powergate_prepare_clocks(pg);
856	if (err)
857		return err;
858
859	err = tegra_powergate_enable_clocks(pg);
860	if (err)
861		goto unprepare_clks;
862
863	usleep_range(10, 20);
864
865	err = reset_control_assert(pg->reset);
866	if (err)
867		goto disable_clks;
868
869	usleep_range(10, 20);
870
871	tegra_powergate_disable_clocks(pg);
872
873	usleep_range(10, 20);
874
875	err = tegra_powergate_set(pg->pmc, pg->id, false);
876	if (err)
877		goto assert_resets;
878
879	err = tegra_powergate_unprepare_clocks(pg);
880	if (err)
881		return err;
882
883	return 0;
884
885assert_resets:
886	tegra_powergate_enable_clocks(pg);
887	usleep_range(10, 20);
888	reset_control_deassert(pg->reset);
889	usleep_range(10, 20);
890
891disable_clks:
892	tegra_powergate_disable_clocks(pg);
893
894unprepare_clks:
895	tegra_powergate_unprepare_clocks(pg);
896
897	return err;
898}
899
900static int tegra_genpd_power_on(struct generic_pm_domain *domain)
901{
902	struct tegra_powergate *pg = to_powergate(domain);
903	struct device *dev = pg->pmc->dev;
904	int err;
905
906	err = tegra_powergate_power_up(pg, true);
907	if (err) {
908		dev_err(dev, "failed to turn on PM domain %s: %d\n",
909			pg->genpd.name, err);
910		goto out;
911	}
912
913	reset_control_release(pg->reset);
914
915out:
916	return err;
917}
918
919static int tegra_genpd_power_off(struct generic_pm_domain *domain)
920{
921	struct tegra_powergate *pg = to_powergate(domain);
922	struct device *dev = pg->pmc->dev;
923	int err;
924
925	err = reset_control_acquire(pg->reset);
926	if (err < 0) {
927		dev_err(dev, "failed to acquire resets for PM domain %s: %d\n",
928			pg->genpd.name, err);
929		return err;
930	}
931
932	err = tegra_powergate_power_down(pg);
933	if (err) {
934		dev_err(dev, "failed to turn off PM domain %s: %d\n",
935			pg->genpd.name, err);
936		reset_control_release(pg->reset);
937	}
938
939	return err;
940}
941
942/**
943 * tegra_powergate_power_on() - power on partition
944 * @id: partition ID
945 */
946int tegra_powergate_power_on(unsigned int id)
947{
948	if (!tegra_powergate_is_available(pmc, id))
949		return -EINVAL;
950
951	return tegra_powergate_set(pmc, id, true);
952}
953EXPORT_SYMBOL(tegra_powergate_power_on);
954
955/**
956 * tegra_powergate_power_off() - power off partition
957 * @id: partition ID
958 */
959int tegra_powergate_power_off(unsigned int id)
960{
961	if (!tegra_powergate_is_available(pmc, id))
962		return -EINVAL;
963
964	return tegra_powergate_set(pmc, id, false);
965}
966EXPORT_SYMBOL(tegra_powergate_power_off);
967
968/**
969 * tegra_powergate_is_powered() - check if partition is powered
970 * @pmc: power management controller
971 * @id: partition ID
972 */
973static int tegra_powergate_is_powered(struct tegra_pmc *pmc, unsigned int id)
974{
975	if (!tegra_powergate_is_valid(pmc, id))
976		return -EINVAL;
977
978	return tegra_powergate_state(id);
979}
980
981/**
982 * tegra_powergate_remove_clamping() - remove power clamps for partition
983 * @id: partition ID
984 */
985int tegra_powergate_remove_clamping(unsigned int id)
986{
987	if (!tegra_powergate_is_available(pmc, id))
988		return -EINVAL;
989
990	return __tegra_powergate_remove_clamping(pmc, id);
991}
992EXPORT_SYMBOL(tegra_powergate_remove_clamping);
993
994/**
995 * tegra_powergate_sequence_power_up() - power up partition
996 * @id: partition ID
997 * @clk: clock for partition
998 * @rst: reset for partition
999 *
1000 * Must be called with clk disabled, and returns with clk enabled.
1001 */
1002int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk,
1003				      struct reset_control *rst)
1004{
1005	struct tegra_powergate *pg;
1006	int err;
1007
1008	if (!tegra_powergate_is_available(pmc, id))
1009		return -EINVAL;
1010
1011	pg = kzalloc(sizeof(*pg), GFP_KERNEL);
1012	if (!pg)
1013		return -ENOMEM;
1014
1015	pg->clk_rates = kzalloc(sizeof(*pg->clk_rates), GFP_KERNEL);
1016	if (!pg->clk_rates) {
1017		kfree(pg->clks);
1018		return -ENOMEM;
1019	}
1020
1021	pg->id = id;
1022	pg->clks = &clk;
1023	pg->num_clks = 1;
1024	pg->reset = rst;
1025	pg->pmc = pmc;
1026
1027	err = tegra_powergate_power_up(pg, false);
1028	if (err)
1029		dev_err(pmc->dev, "failed to turn on partition %d: %d\n", id,
1030			err);
1031
1032	kfree(pg->clk_rates);
1033	kfree(pg);
1034
1035	return err;
1036}
1037EXPORT_SYMBOL(tegra_powergate_sequence_power_up);
1038
1039/**
1040 * tegra_get_cpu_powergate_id() - convert from CPU ID to partition ID
1041 * @pmc: power management controller
1042 * @cpuid: CPU partition ID
1043 *
1044 * Returns the partition ID corresponding to the CPU partition ID or a
1045 * negative error code on failure.
1046 */
1047static int tegra_get_cpu_powergate_id(struct tegra_pmc *pmc,
1048				      unsigned int cpuid)
1049{
1050	if (pmc->soc && cpuid < pmc->soc->num_cpu_powergates)
1051		return pmc->soc->cpu_powergates[cpuid];
1052
1053	return -EINVAL;
1054}
1055
1056/**
1057 * tegra_pmc_cpu_is_powered() - check if CPU partition is powered
1058 * @cpuid: CPU partition ID
1059 */
1060bool tegra_pmc_cpu_is_powered(unsigned int cpuid)
1061{
1062	int id;
1063
1064	id = tegra_get_cpu_powergate_id(pmc, cpuid);
1065	if (id < 0)
1066		return false;
1067
1068	return tegra_powergate_is_powered(pmc, id);
1069}
1070
1071/**
1072 * tegra_pmc_cpu_power_on() - power on CPU partition
1073 * @cpuid: CPU partition ID
1074 */
1075int tegra_pmc_cpu_power_on(unsigned int cpuid)
1076{
1077	int id;
1078
1079	id = tegra_get_cpu_powergate_id(pmc, cpuid);
1080	if (id < 0)
1081		return id;
1082
1083	return tegra_powergate_set(pmc, id, true);
1084}
1085
1086/**
1087 * tegra_pmc_cpu_remove_clamping() - remove power clamps for CPU partition
1088 * @cpuid: CPU partition ID
1089 */
1090int tegra_pmc_cpu_remove_clamping(unsigned int cpuid)
1091{
1092	int id;
1093
1094	id = tegra_get_cpu_powergate_id(pmc, cpuid);
1095	if (id < 0)
1096		return id;
1097
1098	return tegra_powergate_remove_clamping(id);
1099}
1100
1101static void tegra_pmc_program_reboot_reason(const char *cmd)
1102{
1103	u32 value;
1104
1105	value = tegra_pmc_scratch_readl(pmc, pmc->soc->regs->scratch0);
1106	value &= ~PMC_SCRATCH0_MODE_MASK;
1107
1108	if (cmd) {
1109		if (strcmp(cmd, "recovery") == 0)
1110			value |= PMC_SCRATCH0_MODE_RECOVERY;
1111
1112		if (strcmp(cmd, "bootloader") == 0)
1113			value |= PMC_SCRATCH0_MODE_BOOTLOADER;
1114
1115		if (strcmp(cmd, "forced-recovery") == 0)
1116			value |= PMC_SCRATCH0_MODE_RCM;
1117	}
1118
1119	tegra_pmc_scratch_writel(pmc, value, pmc->soc->regs->scratch0);
1120}
1121
1122static int tegra_pmc_reboot_notify(struct notifier_block *this,
1123				   unsigned long action, void *data)
1124{
1125	if (action == SYS_RESTART)
1126		tegra_pmc_program_reboot_reason(data);
1127
1128	return NOTIFY_DONE;
1129}
1130
1131static struct notifier_block tegra_pmc_reboot_notifier = {
1132	.notifier_call = tegra_pmc_reboot_notify,
1133};
1134
1135static void tegra_pmc_restart(void)
1136{
1137	u32 value;
1138
1139	/* reset everything but PMC_SCRATCH0 and PMC_RST_STATUS */
1140	value = tegra_pmc_readl(pmc, PMC_CNTRL);
1141	value |= PMC_CNTRL_MAIN_RST;
1142	tegra_pmc_writel(pmc, value, PMC_CNTRL);
1143}
1144
1145static int tegra_pmc_restart_handler(struct sys_off_data *data)
1146{
1147	tegra_pmc_restart();
1148
1149	return NOTIFY_DONE;
1150}
1151
1152static int tegra_pmc_power_off_handler(struct sys_off_data *data)
1153{
1154	/*
1155	 * Reboot Nexus 7 into special bootloader mode if USB cable is
1156	 * connected in order to display battery status and power off.
1157	 */
1158	if (of_machine_is_compatible("asus,grouper") &&
1159	    power_supply_is_system_supplied()) {
1160		const u32 go_to_charger_mode = 0xa5a55a5a;
1161
1162		tegra_pmc_writel(pmc, go_to_charger_mode, PMC_SCRATCH37);
1163		tegra_pmc_restart();
1164	}
1165
1166	return NOTIFY_DONE;
1167}
1168
1169static int powergate_show(struct seq_file *s, void *data)
1170{
1171	unsigned int i;
1172	int status;
1173
1174	seq_printf(s, " powergate powered\n");
1175	seq_printf(s, "------------------\n");
1176
1177	for (i = 0; i < pmc->soc->num_powergates; i++) {
1178		status = tegra_powergate_is_powered(pmc, i);
1179		if (status < 0)
1180			continue;
1181
1182		seq_printf(s, " %9s %7s\n", pmc->soc->powergates[i],
1183			   status ? "yes" : "no");
1184	}
1185
1186	return 0;
1187}
1188
1189DEFINE_SHOW_ATTRIBUTE(powergate);
1190
1191static int tegra_powergate_of_get_clks(struct tegra_powergate *pg,
1192				       struct device_node *np)
1193{
1194	struct clk *clk;
1195	unsigned int i, count;
1196	int err;
1197
1198	count = of_clk_get_parent_count(np);
1199	if (count == 0)
1200		return -ENODEV;
1201
1202	pg->clks = kcalloc(count, sizeof(clk), GFP_KERNEL);
1203	if (!pg->clks)
1204		return -ENOMEM;
1205
1206	pg->clk_rates = kcalloc(count, sizeof(*pg->clk_rates), GFP_KERNEL);
1207	if (!pg->clk_rates) {
1208		kfree(pg->clks);
1209		return -ENOMEM;
1210	}
1211
1212	for (i = 0; i < count; i++) {
1213		pg->clks[i] = of_clk_get(np, i);
1214		if (IS_ERR(pg->clks[i])) {
1215			err = PTR_ERR(pg->clks[i]);
1216			goto err;
1217		}
1218	}
1219
1220	pg->num_clks = count;
1221
1222	return 0;
1223
1224err:
1225	while (i--)
1226		clk_put(pg->clks[i]);
1227
1228	kfree(pg->clk_rates);
1229	kfree(pg->clks);
1230
1231	return err;
1232}
1233
1234static int tegra_powergate_of_get_resets(struct tegra_powergate *pg,
1235					 struct device_node *np, bool off)
1236{
1237	struct device *dev = pg->pmc->dev;
1238	int err;
1239
1240	pg->reset = of_reset_control_array_get_exclusive_released(np);
1241	if (IS_ERR(pg->reset)) {
1242		err = PTR_ERR(pg->reset);
1243		dev_err(dev, "failed to get device resets: %d\n", err);
1244		return err;
1245	}
1246
1247	err = reset_control_acquire(pg->reset);
1248	if (err < 0) {
1249		pr_err("failed to acquire resets: %d\n", err);
1250		goto out;
1251	}
1252
1253	if (off) {
1254		err = reset_control_assert(pg->reset);
1255	} else {
1256		err = reset_control_deassert(pg->reset);
1257		if (err < 0)
1258			goto out;
1259
1260		reset_control_release(pg->reset);
1261	}
1262
1263out:
1264	if (err) {
1265		reset_control_release(pg->reset);
1266		reset_control_put(pg->reset);
1267	}
1268
1269	return err;
1270}
1271
1272static int tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np)
1273{
1274	struct device *dev = pmc->dev;
1275	struct tegra_powergate *pg;
1276	int id, err = 0;
1277	bool off;
1278
1279	pg = kzalloc(sizeof(*pg), GFP_KERNEL);
1280	if (!pg)
1281		return -ENOMEM;
1282
1283	id = tegra_powergate_lookup(pmc, np->name);
1284	if (id < 0) {
1285		dev_err(dev, "powergate lookup failed for %pOFn: %d\n", np, id);
1286		err = -ENODEV;
1287		goto free_mem;
1288	}
1289
1290	/*
1291	 * Clear the bit for this powergate so it cannot be managed
1292	 * directly via the legacy APIs for controlling powergates.
1293	 */
1294	clear_bit(id, pmc->powergates_available);
1295
1296	pg->id = id;
1297	pg->genpd.name = np->name;
1298	pg->genpd.power_off = tegra_genpd_power_off;
1299	pg->genpd.power_on = tegra_genpd_power_on;
1300	pg->pmc = pmc;
1301
1302	off = !tegra_powergate_is_powered(pmc, pg->id);
1303
1304	err = tegra_powergate_of_get_clks(pg, np);
1305	if (err < 0) {
1306		dev_err(dev, "failed to get clocks for %pOFn: %d\n", np, err);
1307		goto set_available;
1308	}
1309
1310	err = tegra_powergate_of_get_resets(pg, np, off);
1311	if (err < 0) {
1312		dev_err(dev, "failed to get resets for %pOFn: %d\n", np, err);
1313		goto remove_clks;
1314	}
1315
1316	if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS)) {
1317		if (off)
1318			WARN_ON(tegra_powergate_power_up(pg, true));
1319
1320		goto remove_resets;
1321	}
1322
1323	err = pm_genpd_init(&pg->genpd, NULL, off);
1324	if (err < 0) {
1325		dev_err(dev, "failed to initialise PM domain %pOFn: %d\n", np,
1326		       err);
1327		goto remove_resets;
1328	}
1329
1330	err = of_genpd_add_provider_simple(np, &pg->genpd);
1331	if (err < 0) {
1332		dev_err(dev, "failed to add PM domain provider for %pOFn: %d\n",
1333			np, err);
1334		goto remove_genpd;
1335	}
1336
1337	dev_dbg(dev, "added PM domain %s\n", pg->genpd.name);
1338
1339	return 0;
1340
1341remove_genpd:
1342	pm_genpd_remove(&pg->genpd);
1343
1344remove_resets:
1345	reset_control_put(pg->reset);
1346
1347remove_clks:
1348	while (pg->num_clks--)
1349		clk_put(pg->clks[pg->num_clks]);
1350
1351	kfree(pg->clks);
1352
1353set_available:
1354	set_bit(id, pmc->powergates_available);
1355
1356free_mem:
1357	kfree(pg);
1358
1359	return err;
1360}
1361
1362bool tegra_pmc_core_domain_state_synced(void)
1363{
1364	return pmc->core_domain_state_synced;
1365}
1366
1367static int
1368tegra_pmc_core_pd_set_performance_state(struct generic_pm_domain *genpd,
1369					unsigned int level)
1370{
1371	struct dev_pm_opp *opp;
1372	int err;
1373
1374	opp = dev_pm_opp_find_level_ceil(&genpd->dev, &level);
1375	if (IS_ERR(opp)) {
1376		dev_err(&genpd->dev, "failed to find OPP for level %u: %pe\n",
1377			level, opp);
1378		return PTR_ERR(opp);
1379	}
1380
1381	mutex_lock(&pmc->powergates_lock);
1382	err = dev_pm_opp_set_opp(pmc->dev, opp);
1383	mutex_unlock(&pmc->powergates_lock);
1384
1385	dev_pm_opp_put(opp);
1386
1387	if (err) {
1388		dev_err(&genpd->dev, "failed to set voltage to %duV: %d\n",
1389			level, err);
1390		return err;
1391	}
1392
1393	return 0;
1394}
1395
1396static unsigned int
1397tegra_pmc_core_pd_opp_to_performance_state(struct generic_pm_domain *genpd,
1398					   struct dev_pm_opp *opp)
1399{
1400	return dev_pm_opp_get_level(opp);
1401}
1402
1403static int tegra_pmc_core_pd_add(struct tegra_pmc *pmc, struct device_node *np)
1404{
1405	struct generic_pm_domain *genpd;
1406	const char *rname[] = { "core", NULL};
1407	int err;
1408
1409	genpd = devm_kzalloc(pmc->dev, sizeof(*genpd), GFP_KERNEL);
1410	if (!genpd)
1411		return -ENOMEM;
1412
1413	genpd->name = "core";
1414	genpd->set_performance_state = tegra_pmc_core_pd_set_performance_state;
1415	genpd->opp_to_performance_state = tegra_pmc_core_pd_opp_to_performance_state;
1416
1417	err = devm_pm_opp_set_regulators(pmc->dev, rname);
1418	if (err)
1419		return dev_err_probe(pmc->dev, err,
1420				     "failed to set core OPP regulator\n");
1421
1422	err = pm_genpd_init(genpd, NULL, false);
1423	if (err) {
1424		dev_err(pmc->dev, "failed to init core genpd: %d\n", err);
1425		return err;
1426	}
1427
1428	err = of_genpd_add_provider_simple(np, genpd);
1429	if (err) {
1430		dev_err(pmc->dev, "failed to add core genpd: %d\n", err);
1431		goto remove_genpd;
1432	}
1433
1434	pmc->core_domain_registered = true;
1435
1436	return 0;
1437
1438remove_genpd:
1439	pm_genpd_remove(genpd);
1440
1441	return err;
1442}
1443
1444static int tegra_powergate_init(struct tegra_pmc *pmc,
1445				struct device_node *parent)
1446{
1447	struct of_phandle_args child_args, parent_args;
1448	struct device_node *np, *child;
1449	int err = 0;
1450
1451	/*
1452	 * Core power domain is the parent of powergate domains, hence it
1453	 * should be registered first.
1454	 */
1455	np = of_get_child_by_name(parent, "core-domain");
1456	if (np) {
1457		err = tegra_pmc_core_pd_add(pmc, np);
1458		of_node_put(np);
1459		if (err)
1460			return err;
1461	}
1462
1463	np = of_get_child_by_name(parent, "powergates");
1464	if (!np)
1465		return 0;
1466
1467	for_each_child_of_node(np, child) {
1468		err = tegra_powergate_add(pmc, child);
1469		if (err < 0) {
1470			of_node_put(child);
1471			break;
1472		}
1473
1474		if (of_parse_phandle_with_args(child, "power-domains",
1475					       "#power-domain-cells",
1476					       0, &parent_args))
1477			continue;
1478
1479		child_args.np = child;
1480		child_args.args_count = 0;
1481
1482		err = of_genpd_add_subdomain(&parent_args, &child_args);
1483		of_node_put(parent_args.np);
1484		if (err) {
1485			of_node_put(child);
1486			break;
1487		}
1488	}
1489
1490	of_node_put(np);
1491
1492	return err;
1493}
1494
1495static void tegra_powergate_remove(struct generic_pm_domain *genpd)
1496{
1497	struct tegra_powergate *pg = to_powergate(genpd);
1498
1499	reset_control_put(pg->reset);
1500
1501	while (pg->num_clks--)
1502		clk_put(pg->clks[pg->num_clks]);
1503
1504	kfree(pg->clks);
1505
1506	set_bit(pg->id, pmc->powergates_available);
1507
1508	kfree(pg);
1509}
1510
1511static void tegra_powergate_remove_all(struct device_node *parent)
1512{
1513	struct generic_pm_domain *genpd;
1514	struct device_node *np, *child;
1515
1516	np = of_get_child_by_name(parent, "powergates");
1517	if (!np)
1518		return;
1519
1520	for_each_child_of_node(np, child) {
1521		of_genpd_del_provider(child);
1522
1523		genpd = of_genpd_remove_last(child);
1524		if (IS_ERR(genpd))
1525			continue;
1526
1527		tegra_powergate_remove(genpd);
1528	}
1529
1530	of_node_put(np);
1531
1532	np = of_get_child_by_name(parent, "core-domain");
1533	if (np) {
1534		of_genpd_del_provider(np);
1535		of_genpd_remove_last(np);
1536	}
1537}
1538
1539static const struct tegra_io_pad_soc *
1540tegra_io_pad_find(struct tegra_pmc *pmc, enum tegra_io_pad id)
1541{
1542	unsigned int i;
1543
1544	for (i = 0; i < pmc->soc->num_io_pads; i++)
1545		if (pmc->soc->io_pads[i].id == id)
1546			return &pmc->soc->io_pads[i];
1547
1548	return NULL;
1549}
1550
1551static int tegra_io_pad_prepare(struct tegra_pmc *pmc,
1552				const struct tegra_io_pad_soc *pad,
1553				unsigned long *request,
1554				unsigned long *status,
1555				u32 *mask)
1556{
1557	unsigned long rate, value;
1558
1559	if (pad->dpd == UINT_MAX)
1560		return -EINVAL;
1561
1562	*request = pad->request;
1563	*status = pad->status;
1564	*mask = BIT(pad->dpd);
1565
1566	if (pmc->clk) {
1567		rate = pmc->rate;
1568		if (!rate) {
1569			dev_err(pmc->dev, "failed to get clock rate\n");
1570			return -ENODEV;
1571		}
1572
1573		tegra_pmc_writel(pmc, DPD_SAMPLE_ENABLE, DPD_SAMPLE);
1574
1575		/* must be at least 200 ns, in APB (PCLK) clock cycles */
1576		value = DIV_ROUND_UP(1000000000, rate);
1577		value = DIV_ROUND_UP(200, value);
1578		tegra_pmc_writel(pmc, value, SEL_DPD_TIM);
1579	}
1580
1581	return 0;
1582}
1583
1584static int tegra_io_pad_poll(struct tegra_pmc *pmc, unsigned long offset,
1585			     u32 mask, u32 val, unsigned long timeout)
1586{
1587	u32 value;
1588
1589	timeout = jiffies + msecs_to_jiffies(timeout);
1590
1591	while (time_after(timeout, jiffies)) {
1592		value = tegra_pmc_readl(pmc, offset);
1593		if ((value & mask) == val)
1594			return 0;
1595
1596		usleep_range(250, 1000);
1597	}
1598
1599	return -ETIMEDOUT;
1600}
1601
1602static void tegra_io_pad_unprepare(struct tegra_pmc *pmc)
1603{
1604	if (pmc->clk)
1605		tegra_pmc_writel(pmc, DPD_SAMPLE_DISABLE, DPD_SAMPLE);
1606}
1607
1608/**
1609 * tegra_io_pad_power_enable() - enable power to I/O pad
1610 * @id: Tegra I/O pad ID for which to enable power
1611 *
1612 * Returns: 0 on success or a negative error code on failure.
1613 */
1614int tegra_io_pad_power_enable(enum tegra_io_pad id)
1615{
1616	const struct tegra_io_pad_soc *pad;
1617	unsigned long request, status;
1618	u32 mask;
1619	int err;
1620
1621	pad = tegra_io_pad_find(pmc, id);
1622	if (!pad) {
1623		dev_err(pmc->dev, "invalid I/O pad ID %u\n", id);
1624		return -ENOENT;
1625	}
1626
1627	mutex_lock(&pmc->powergates_lock);
1628
1629	err = tegra_io_pad_prepare(pmc, pad, &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
1645unlock:
1646	mutex_unlock(&pmc->powergates_lock);
1647	return err;
1648}
1649EXPORT_SYMBOL(tegra_io_pad_power_enable);
1650
1651/**
1652 * tegra_io_pad_power_disable() - disable power to I/O pad
1653 * @id: Tegra I/O pad ID for which to disable power
1654 *
1655 * Returns: 0 on success or a negative error code on failure.
1656 */
1657int tegra_io_pad_power_disable(enum tegra_io_pad id)
1658{
1659	const struct tegra_io_pad_soc *pad;
1660	unsigned long request, status;
1661	u32 mask;
1662	int err;
1663
1664	pad = tegra_io_pad_find(pmc, id);
1665	if (!pad) {
1666		dev_err(pmc->dev, "invalid I/O pad ID %u\n", id);
1667		return -ENOENT;
1668	}
1669
1670	mutex_lock(&pmc->powergates_lock);
1671
1672	err = tegra_io_pad_prepare(pmc, pad, &request, &status, &mask);
1673	if (err < 0) {
1674		dev_err(pmc->dev, "failed to prepare I/O pad: %d\n", err);
1675		goto unlock;
1676	}
1677
1678	tegra_pmc_writel(pmc, IO_DPD_REQ_CODE_ON | mask, request);
1679
1680	err = tegra_io_pad_poll(pmc, status, mask, mask, 250);
1681	if (err < 0) {
1682		dev_err(pmc->dev, "failed to disable I/O pad: %d\n", err);
1683		goto unlock;
1684	}
1685
1686	tegra_io_pad_unprepare(pmc);
1687
1688unlock:
1689	mutex_unlock(&pmc->powergates_lock);
1690	return err;
1691}
1692EXPORT_SYMBOL(tegra_io_pad_power_disable);
1693
1694static int tegra_io_pad_is_powered(struct tegra_pmc *pmc, enum tegra_io_pad id)
1695{
1696	const struct tegra_io_pad_soc *pad;
1697	unsigned long status;
1698	u32 mask, value;
1699
1700	pad = tegra_io_pad_find(pmc, id);
1701	if (!pad) {
1702		dev_err(pmc->dev, "invalid I/O pad ID %u\n", id);
1703		return -ENOENT;
1704	}
1705
1706	if (pad->dpd == UINT_MAX)
1707		return -EINVAL;
1708
1709	status = pad->status;
1710	mask = BIT(pad->dpd);
1711
1712	value = tegra_pmc_readl(pmc, status);
1713
1714	return !(value & mask);
1715}
1716
1717static int tegra_io_pad_set_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id,
1718				    int voltage)
1719{
1720	const struct tegra_io_pad_soc *pad;
1721	u32 value;
1722
1723	pad = tegra_io_pad_find(pmc, id);
1724	if (!pad)
1725		return -ENOENT;
1726
1727	if (pad->voltage == UINT_MAX)
1728		return -ENOTSUPP;
1729
1730	mutex_lock(&pmc->powergates_lock);
1731
1732	if (pmc->soc->has_impl_33v_pwr) {
1733		value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1734
1735		if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1736			value &= ~BIT(pad->voltage);
1737		else
1738			value |= BIT(pad->voltage);
1739
1740		tegra_pmc_writel(pmc, value, PMC_IMPL_E_33V_PWR);
1741	} else {
1742		/* write-enable PMC_PWR_DET_VALUE[pad->voltage] */
1743		value = tegra_pmc_readl(pmc, PMC_PWR_DET);
1744		value |= BIT(pad->voltage);
1745		tegra_pmc_writel(pmc, value, PMC_PWR_DET);
1746
1747		/* update I/O voltage */
1748		value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1749
1750		if (voltage == TEGRA_IO_PAD_VOLTAGE_1V8)
1751			value &= ~BIT(pad->voltage);
1752		else
1753			value |= BIT(pad->voltage);
1754
1755		tegra_pmc_writel(pmc, value, PMC_PWR_DET_VALUE);
1756	}
1757
1758	mutex_unlock(&pmc->powergates_lock);
1759
1760	usleep_range(100, 250);
1761
1762	return 0;
1763}
1764
1765static int tegra_io_pad_get_voltage(struct tegra_pmc *pmc, enum tegra_io_pad id)
1766{
1767	const struct tegra_io_pad_soc *pad;
1768	u32 value;
1769
1770	pad = tegra_io_pad_find(pmc, id);
1771	if (!pad)
1772		return -ENOENT;
1773
1774	if (pad->voltage == UINT_MAX)
1775		return -ENOTSUPP;
1776
1777	if (pmc->soc->has_impl_33v_pwr)
1778		value = tegra_pmc_readl(pmc, PMC_IMPL_E_33V_PWR);
1779	else
1780		value = tegra_pmc_readl(pmc, PMC_PWR_DET_VALUE);
1781
1782	if ((value & BIT(pad->voltage)) == 0)
1783		return TEGRA_IO_PAD_VOLTAGE_1V8;
1784
1785	return TEGRA_IO_PAD_VOLTAGE_3V3;
1786}
1787
1788/**
1789 * tegra_io_rail_power_on() - enable power to I/O rail
1790 * @id: Tegra I/O pad ID for which to enable power
1791 *
1792 * See also: tegra_io_pad_power_enable()
1793 */
1794int tegra_io_rail_power_on(unsigned int id)
1795{
1796	return tegra_io_pad_power_enable(id);
1797}
1798EXPORT_SYMBOL(tegra_io_rail_power_on);
1799
1800/**
1801 * tegra_io_rail_power_off() - disable power to I/O rail
1802 * @id: Tegra I/O pad ID for which to disable power
1803 *
1804 * See also: tegra_io_pad_power_disable()
1805 */
1806int tegra_io_rail_power_off(unsigned int id)
1807{
1808	return tegra_io_pad_power_disable(id);
1809}
1810EXPORT_SYMBOL(tegra_io_rail_power_off);
1811
1812#ifdef CONFIG_PM_SLEEP
1813enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
1814{
1815	return pmc->suspend_mode;
1816}
1817
1818void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
1819{
1820	if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
1821		return;
1822
1823	pmc->suspend_mode = mode;
1824}
1825
1826void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode)
1827{
1828	unsigned long long rate = 0;
1829	u64 ticks;
1830	u32 value;
1831
1832	switch (mode) {
1833	case TEGRA_SUSPEND_LP1:
1834		rate = 32768;
1835		break;
1836
1837	case TEGRA_SUSPEND_LP2:
1838		rate = pmc->rate;
1839		break;
1840
1841	default:
1842		break;
1843	}
1844
1845	if (WARN_ON_ONCE(rate == 0))
1846		rate = 100000000;
1847
1848	ticks = pmc->cpu_good_time * rate + USEC_PER_SEC - 1;
1849	do_div(ticks, USEC_PER_SEC);
1850	tegra_pmc_writel(pmc, ticks, PMC_CPUPWRGOOD_TIMER);
1851
1852	ticks = pmc->cpu_off_time * rate + USEC_PER_SEC - 1;
1853	do_div(ticks, USEC_PER_SEC);
1854	tegra_pmc_writel(pmc, ticks, PMC_CPUPWROFF_TIMER);
1855
1856	value = tegra_pmc_readl(pmc, PMC_CNTRL);
1857	value &= ~PMC_CNTRL_SIDE_EFFECT_LP0;
1858	value |= PMC_CNTRL_CPU_PWRREQ_OE;
1859	tegra_pmc_writel(pmc, value, PMC_CNTRL);
1860}
1861#endif
1862
1863static int tegra_pmc_parse_dt(struct tegra_pmc *pmc, struct device_node *np)
1864{
1865	u32 value, values[2];
1866
1867	if (of_property_read_u32(np, "nvidia,suspend-mode", &value)) {
1868		pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1869	} else {
1870		switch (value) {
1871		case 0:
1872			pmc->suspend_mode = TEGRA_SUSPEND_LP0;
1873			break;
1874
1875		case 1:
1876			pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1877			break;
1878
1879		case 2:
1880			pmc->suspend_mode = TEGRA_SUSPEND_LP2;
1881			break;
1882
1883		default:
1884			pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1885			break;
1886		}
1887	}
1888
1889	pmc->suspend_mode = tegra_pm_validate_suspend_mode(pmc->suspend_mode);
1890
1891	if (of_property_read_u32(np, "nvidia,cpu-pwr-good-time", &value))
1892		pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1893
1894	pmc->cpu_good_time = value;
1895
1896	if (of_property_read_u32(np, "nvidia,cpu-pwr-off-time", &value))
1897		pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1898
1899	pmc->cpu_off_time = value;
1900
1901	if (of_property_read_u32_array(np, "nvidia,core-pwr-good-time",
1902				       values, ARRAY_SIZE(values)))
1903		pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1904
1905	pmc->core_osc_time = values[0];
1906	pmc->core_pmu_time = values[1];
1907
1908	if (of_property_read_u32(np, "nvidia,core-pwr-off-time", &value))
1909		pmc->suspend_mode = TEGRA_SUSPEND_NONE;
1910
1911	pmc->core_off_time = value;
1912
1913	pmc->corereq_high = of_property_read_bool(np,
1914				"nvidia,core-power-req-active-high");
1915
1916	pmc->sysclkreq_high = of_property_read_bool(np,
1917				"nvidia,sys-clock-req-active-high");
1918
1919	pmc->combined_req = of_property_read_bool(np,
1920				"nvidia,combined-power-req");
1921
1922	pmc->cpu_pwr_good_en = of_property_read_bool(np,
1923				"nvidia,cpu-pwr-good-en");
1924
1925	if (of_property_read_u32_array(np, "nvidia,lp0-vec", values,
1926				       ARRAY_SIZE(values)))
1927		if (pmc->suspend_mode == TEGRA_SUSPEND_LP0)
1928			pmc->suspend_mode = TEGRA_SUSPEND_LP1;
1929
1930	pmc->lp0_vec_phys = values[0];
1931	pmc->lp0_vec_size = values[1];
1932
1933	return 0;
1934}
1935
1936static int tegra_pmc_init(struct tegra_pmc *pmc)
1937{
1938	if (pmc->soc->max_wake_events > 0) {
1939		pmc->wake_type_level_map = bitmap_zalloc(pmc->soc->max_wake_events, GFP_KERNEL);
1940		if (!pmc->wake_type_level_map)
1941			return -ENOMEM;
1942
1943		pmc->wake_type_dual_edge_map = bitmap_zalloc(pmc->soc->max_wake_events, GFP_KERNEL);
1944		if (!pmc->wake_type_dual_edge_map)
1945			return -ENOMEM;
1946
1947		pmc->wake_sw_status_map = bitmap_zalloc(pmc->soc->max_wake_events, GFP_KERNEL);
1948		if (!pmc->wake_sw_status_map)
1949			return -ENOMEM;
1950
1951		pmc->wake_cntrl_level_map = bitmap_zalloc(pmc->soc->max_wake_events, GFP_KERNEL);
1952		if (!pmc->wake_cntrl_level_map)
1953			return -ENOMEM;
1954	}
1955
1956	if (pmc->soc->init)
1957		pmc->soc->init(pmc);
1958
1959	return 0;
1960}
1961
1962static void tegra_pmc_init_tsense_reset(struct tegra_pmc *pmc)
1963{
1964	static const char disabled[] = "emergency thermal reset disabled";
1965	u32 pmu_addr, ctrl_id, reg_addr, reg_data, pinmux;
1966	struct device *dev = pmc->dev;
1967	struct device_node *np;
1968	u32 value, checksum;
1969
1970	if (!pmc->soc->has_tsense_reset)
1971		return;
1972
1973	np = of_get_child_by_name(pmc->dev->of_node, "i2c-thermtrip");
1974	if (!np) {
1975		dev_warn(dev, "i2c-thermtrip node not found, %s.\n", disabled);
1976		return;
1977	}
1978
1979	if (of_property_read_u32(np, "nvidia,i2c-controller-id", &ctrl_id)) {
1980		dev_err(dev, "I2C controller ID missing, %s.\n", disabled);
1981		goto out;
1982	}
1983
1984	if (of_property_read_u32(np, "nvidia,bus-addr", &pmu_addr)) {
1985		dev_err(dev, "nvidia,bus-addr missing, %s.\n", disabled);
1986		goto out;
1987	}
1988
1989	if (of_property_read_u32(np, "nvidia,reg-addr", &reg_addr)) {
1990		dev_err(dev, "nvidia,reg-addr missing, %s.\n", disabled);
1991		goto out;
1992	}
1993
1994	if (of_property_read_u32(np, "nvidia,reg-data", &reg_data)) {
1995		dev_err(dev, "nvidia,reg-data missing, %s.\n", disabled);
1996		goto out;
1997	}
1998
1999	if (of_property_read_u32(np, "nvidia,pinmux-id", &pinmux))
2000		pinmux = 0;
2001
2002	value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
2003	value |= PMC_SENSOR_CTRL_SCRATCH_WRITE;
2004	tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
2005
2006	value = (reg_data << PMC_SCRATCH54_DATA_SHIFT) |
2007		(reg_addr << PMC_SCRATCH54_ADDR_SHIFT);
2008	tegra_pmc_writel(pmc, value, PMC_SCRATCH54);
2009
2010	value = PMC_SCRATCH55_RESET_TEGRA;
2011	value |= ctrl_id << PMC_SCRATCH55_CNTRL_ID_SHIFT;
2012	value |= pinmux << PMC_SCRATCH55_PINMUX_SHIFT;
2013	value |= pmu_addr << PMC_SCRATCH55_I2CSLV1_SHIFT;
2014
2015	/*
2016	 * Calculate checksum of SCRATCH54, SCRATCH55 fields. Bits 23:16 will
2017	 * contain the checksum and are currently zero, so they are not added.
2018	 */
2019	checksum = reg_addr + reg_data + (value & 0xff) + ((value >> 8) & 0xff)
2020		+ ((value >> 24) & 0xff);
2021	checksum &= 0xff;
2022	checksum = 0x100 - checksum;
2023
2024	value |= checksum << PMC_SCRATCH55_CHECKSUM_SHIFT;
2025
2026	tegra_pmc_writel(pmc, value, PMC_SCRATCH55);
2027
2028	value = tegra_pmc_readl(pmc, PMC_SENSOR_CTRL);
2029	value |= PMC_SENSOR_CTRL_ENABLE_RST;
2030	tegra_pmc_writel(pmc, value, PMC_SENSOR_CTRL);
2031
2032	dev_info(pmc->dev, "emergency thermal reset enabled\n");
2033
2034out:
2035	of_node_put(np);
2036}
2037
2038static int tegra_io_pad_pinctrl_get_groups_count(struct pinctrl_dev *pctl_dev)
2039{
2040	struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2041
2042	return pmc->soc->num_io_pads;
2043}
2044
2045static const char *tegra_io_pad_pinctrl_get_group_name(struct pinctrl_dev *pctl,
2046						       unsigned int group)
2047{
2048	struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl);
2049
2050	return pmc->soc->io_pads[group].name;
2051}
2052
2053static int tegra_io_pad_pinctrl_get_group_pins(struct pinctrl_dev *pctl_dev,
2054					       unsigned int group,
2055					       const unsigned int **pins,
2056					       unsigned int *num_pins)
2057{
2058	struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2059
2060	*pins = &pmc->soc->io_pads[group].id;
2061	*num_pins = 1;
2062
2063	return 0;
2064}
2065
2066static const struct pinctrl_ops tegra_io_pad_pinctrl_ops = {
2067	.get_groups_count = tegra_io_pad_pinctrl_get_groups_count,
2068	.get_group_name = tegra_io_pad_pinctrl_get_group_name,
2069	.get_group_pins = tegra_io_pad_pinctrl_get_group_pins,
2070	.dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
2071	.dt_free_map = pinconf_generic_dt_free_map,
2072};
2073
2074static int tegra_io_pad_pinconf_get(struct pinctrl_dev *pctl_dev,
2075				    unsigned int pin, unsigned long *config)
2076{
2077	enum pin_config_param param = pinconf_to_config_param(*config);
2078	struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2079	const struct tegra_io_pad_soc *pad;
2080	int ret;
2081	u32 arg;
2082
2083	pad = tegra_io_pad_find(pmc, pin);
2084	if (!pad)
2085		return -EINVAL;
2086
2087	switch (param) {
2088	case PIN_CONFIG_POWER_SOURCE:
2089		ret = tegra_io_pad_get_voltage(pmc, pad->id);
2090		if (ret < 0)
2091			return ret;
2092
2093		arg = ret;
2094		break;
2095
2096	case PIN_CONFIG_MODE_LOW_POWER:
2097		ret = tegra_io_pad_is_powered(pmc, pad->id);
2098		if (ret < 0)
2099			return ret;
2100
2101		arg = !ret;
2102		break;
2103
2104	default:
2105		return -EINVAL;
2106	}
2107
2108	*config = pinconf_to_config_packed(param, arg);
2109
2110	return 0;
2111}
2112
2113static int tegra_io_pad_pinconf_set(struct pinctrl_dev *pctl_dev,
2114				    unsigned int pin, unsigned long *configs,
2115				    unsigned int num_configs)
2116{
2117	struct tegra_pmc *pmc = pinctrl_dev_get_drvdata(pctl_dev);
2118	const struct tegra_io_pad_soc *pad;
2119	enum pin_config_param param;
2120	unsigned int i;
2121	int err;
2122	u32 arg;
2123
2124	pad = tegra_io_pad_find(pmc, pin);
2125	if (!pad)
2126		return -EINVAL;
2127
2128	for (i = 0; i < num_configs; ++i) {
2129		param = pinconf_to_config_param(configs[i]);
2130		arg = pinconf_to_config_argument(configs[i]);
2131
2132		switch (param) {
2133		case PIN_CONFIG_MODE_LOW_POWER:
2134			if (arg)
2135				err = tegra_io_pad_power_disable(pad->id);
2136			else
2137				err = tegra_io_pad_power_enable(pad->id);
2138			if (err)
2139				return err;
2140			break;
2141		case PIN_CONFIG_POWER_SOURCE:
2142			if (arg != TEGRA_IO_PAD_VOLTAGE_1V8 &&
2143			    arg != TEGRA_IO_PAD_VOLTAGE_3V3)
2144				return -EINVAL;
2145			err = tegra_io_pad_set_voltage(pmc, pad->id, arg);
2146			if (err)
2147				return err;
2148			break;
2149		default:
2150			return -EINVAL;
2151		}
2152	}
2153
2154	return 0;
2155}
2156
2157static const struct pinconf_ops tegra_io_pad_pinconf_ops = {
2158	.pin_config_get = tegra_io_pad_pinconf_get,
2159	.pin_config_set = tegra_io_pad_pinconf_set,
2160	.is_generic = true,
2161};
2162
2163static struct pinctrl_desc tegra_pmc_pctl_desc = {
2164	.pctlops = &tegra_io_pad_pinctrl_ops,
2165	.confops = &tegra_io_pad_pinconf_ops,
2166};
2167
2168static int tegra_pmc_pinctrl_init(struct tegra_pmc *pmc)
2169{
2170	int err;
2171
2172	if (!pmc->soc->num_pin_descs)
2173		return 0;
2174
2175	tegra_pmc_pctl_desc.name = dev_name(pmc->dev);
2176	tegra_pmc_pctl_desc.pins = pmc->soc->pin_descs;
2177	tegra_pmc_pctl_desc.npins = pmc->soc->num_pin_descs;
2178
2179	pmc->pctl_dev = devm_pinctrl_register(pmc->dev, &tegra_pmc_pctl_desc,
2180					      pmc);
2181	if (IS_ERR(pmc->pctl_dev)) {
2182		err = PTR_ERR(pmc->pctl_dev);
2183		dev_err(pmc->dev, "failed to register pin controller: %d\n",
2184			err);
2185		return err;
2186	}
2187
2188	return 0;
2189}
2190
2191static ssize_t reset_reason_show(struct device *dev,
2192				 struct device_attribute *attr, char *buf)
2193{
2194	u32 value;
2195
2196	value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
2197	value &= pmc->soc->regs->rst_source_mask;
2198	value >>= pmc->soc->regs->rst_source_shift;
2199
2200	if (WARN_ON(value >= pmc->soc->num_reset_sources))
2201		return sprintf(buf, "%s\n", "UNKNOWN");
2202
2203	return sprintf(buf, "%s\n", pmc->soc->reset_sources[value]);
2204}
2205
2206static DEVICE_ATTR_RO(reset_reason);
2207
2208static ssize_t reset_level_show(struct device *dev,
2209				struct device_attribute *attr, char *buf)
2210{
2211	u32 value;
2212
2213	value = tegra_pmc_readl(pmc, pmc->soc->regs->rst_status);
2214	value &= pmc->soc->regs->rst_level_mask;
2215	value >>= pmc->soc->regs->rst_level_shift;
2216
2217	if (WARN_ON(value >= pmc->soc->num_reset_levels))
2218		return sprintf(buf, "%s\n", "UNKNOWN");
2219
2220	return sprintf(buf, "%s\n", pmc->soc->reset_levels[value]);
2221}
2222
2223static DEVICE_ATTR_RO(reset_level);
2224
2225static void tegra_pmc_reset_sysfs_init(struct tegra_pmc *pmc)
2226{
2227	struct device *dev = pmc->dev;
2228	int err = 0;
2229
2230	if (pmc->soc->reset_sources) {
2231		err = device_create_file(dev, &dev_attr_reset_reason);
2232		if (err < 0)
2233			dev_warn(dev,
2234				 "failed to create attr \"reset_reason\": %d\n",
2235				 err);
2236	}
2237
2238	if (pmc->soc->reset_levels) {
2239		err = device_create_file(dev, &dev_attr_reset_level);
2240		if (err < 0)
2241			dev_warn(dev,
2242				 "failed to create attr \"reset_level\": %d\n",
2243				 err);
2244	}
2245}
2246
2247static int tegra_pmc_irq_translate(struct irq_domain *domain,
2248				   struct irq_fwspec *fwspec,
2249				   unsigned long *hwirq,
2250				   unsigned int *type)
2251{
2252	if (WARN_ON(fwspec->param_count < 2))
2253		return -EINVAL;
2254
2255	*hwirq = fwspec->param[0];
2256	*type = fwspec->param[1];
2257
2258	return 0;
2259}
2260
2261static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq,
2262			       unsigned int num_irqs, void *data)
2263{
2264	struct tegra_pmc *pmc = domain->host_data;
2265	const struct tegra_pmc_soc *soc = pmc->soc;
2266	struct irq_fwspec *fwspec = data;
2267	unsigned int i;
2268	int err = 0;
2269
2270	if (WARN_ON(num_irqs > 1))
2271		return -EINVAL;
2272
2273	for (i = 0; i < soc->num_wake_events; i++) {
2274		const struct tegra_wake_event *event = &soc->wake_events[i];
2275
2276		/* IRQ and simple wake events */
2277		if (fwspec->param_count == 2) {
2278			struct irq_fwspec spec;
2279
2280			if (event->id != fwspec->param[0])
2281				continue;
2282
2283			err = irq_domain_set_hwirq_and_chip(domain, virq,
2284							    event->id,
2285							    &pmc->irq, pmc);
2286			if (err < 0)
2287				break;
2288
2289			/* simple hierarchies stop at the PMC level */
2290			if (event->irq == 0) {
2291				err = irq_domain_disconnect_hierarchy(domain->parent, virq);
2292				break;
2293			}
2294
2295			spec.fwnode = &pmc->dev->of_node->fwnode;
2296			spec.param_count = 3;
2297			spec.param[0] = GIC_SPI;
2298			spec.param[1] = event->irq;
2299			spec.param[2] = fwspec->param[1];
2300
2301			err = irq_domain_alloc_irqs_parent(domain, virq,
2302							   num_irqs, &spec);
2303
2304			break;
2305		}
2306
2307		/* GPIO wake events */
2308		if (fwspec->param_count == 3) {
2309			if (event->gpio.instance != fwspec->param[0] ||
2310			    event->gpio.pin != fwspec->param[1])
2311				continue;
2312
2313			err = irq_domain_set_hwirq_and_chip(domain, virq,
2314							    event->id,
2315							    &pmc->irq, pmc);
2316
2317			/* GPIO hierarchies stop at the PMC level */
2318			if (!err && domain->parent)
2319				err = irq_domain_disconnect_hierarchy(domain->parent,
2320								      virq);
2321			break;
2322		}
2323	}
2324
2325	/* If there is no wake-up event, there is no PMC mapping */
2326	if (i == soc->num_wake_events)
2327		err = irq_domain_disconnect_hierarchy(domain, virq);
2328
2329	return err;
2330}
2331
2332static const struct irq_domain_ops tegra_pmc_irq_domain_ops = {
2333	.translate = tegra_pmc_irq_translate,
2334	.alloc = tegra_pmc_irq_alloc,
2335};
2336
2337static int tegra210_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
2338{
2339	struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2340	unsigned int offset, bit;
2341	u32 value;
2342
2343	offset = data->hwirq / 32;
2344	bit = data->hwirq % 32;
2345
2346	/* clear wake status */
2347	tegra_pmc_writel(pmc, 0, PMC_SW_WAKE_STATUS);
2348	tegra_pmc_writel(pmc, 0, PMC_SW_WAKE2_STATUS);
2349
2350	tegra_pmc_writel(pmc, 0, PMC_WAKE_STATUS);
2351	tegra_pmc_writel(pmc, 0, PMC_WAKE2_STATUS);
2352
2353	/* enable PMC wake */
2354	if (data->hwirq >= 32)
2355		offset = PMC_WAKE2_MASK;
2356	else
2357		offset = PMC_WAKE_MASK;
2358
2359	value = tegra_pmc_readl(pmc, offset);
2360
2361	if (on)
2362		value |= BIT(bit);
2363	else
2364		value &= ~BIT(bit);
2365
2366	tegra_pmc_writel(pmc, value, offset);
2367
2368	return 0;
2369}
2370
2371static int tegra210_pmc_irq_set_type(struct irq_data *data, unsigned int type)
2372{
2373	struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2374	unsigned int offset, bit;
2375	u32 value;
2376
2377	offset = data->hwirq / 32;
2378	bit = data->hwirq % 32;
2379
2380	if (data->hwirq >= 32)
2381		offset = PMC_WAKE2_LEVEL;
2382	else
2383		offset = PMC_WAKE_LEVEL;
2384
2385	value = tegra_pmc_readl(pmc, offset);
2386
2387	switch (type) {
2388	case IRQ_TYPE_EDGE_RISING:
2389	case IRQ_TYPE_LEVEL_HIGH:
2390		value |= BIT(bit);
2391		break;
2392
2393	case IRQ_TYPE_EDGE_FALLING:
2394	case IRQ_TYPE_LEVEL_LOW:
2395		value &= ~BIT(bit);
2396		break;
2397
2398	case IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING:
2399		value ^= BIT(bit);
2400		break;
2401
2402	default:
2403		return -EINVAL;
2404	}
2405
2406	tegra_pmc_writel(pmc, value, offset);
2407
2408	return 0;
2409}
2410
2411static void tegra186_pmc_set_wake_filters(struct tegra_pmc *pmc)
2412{
2413	u32 value;
2414
2415	/* SW Wake (wake83) needs SR_CAPTURE filter to be enabled */
2416	value = readl(pmc->wake + WAKE_AOWAKE_CNTRL(SW_WAKE_ID));
2417	value |= WAKE_AOWAKE_CNTRL_SR_CAPTURE_EN;
2418	writel(value, pmc->wake + WAKE_AOWAKE_CNTRL(SW_WAKE_ID));
2419	dev_dbg(pmc->dev, "WAKE_AOWAKE_CNTRL_83 = 0x%x\n", value);
2420}
2421
2422static int tegra186_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
2423{
2424	struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2425	unsigned int offset, bit;
2426	u32 value;
2427
2428	offset = data->hwirq / 32;
2429	bit = data->hwirq % 32;
2430
2431	/* clear wake status */
2432	writel(0x1, pmc->wake + WAKE_AOWAKE_STATUS_W(data->hwirq));
2433
2434	/* route wake to tier 2 */
2435	value = readl(pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
2436
2437	if (!on)
2438		value &= ~(1 << bit);
2439	else
2440		value |= 1 << bit;
2441
2442	writel(value, pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(offset));
2443
2444	/* enable wakeup event */
2445	writel(!!on, pmc->wake + WAKE_AOWAKE_MASK_W(data->hwirq));
2446
2447	return 0;
2448}
2449
2450static int tegra186_pmc_irq_set_type(struct irq_data *data, unsigned int type)
2451{
2452	struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
2453	u32 value;
2454
2455	value = readl(pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
2456
2457	switch (type) {
2458	case IRQ_TYPE_EDGE_RISING:
2459	case IRQ_TYPE_LEVEL_HIGH:
2460		value |= WAKE_AOWAKE_CNTRL_LEVEL;
2461		set_bit(data->hwirq, pmc->wake_type_level_map);
2462		clear_bit(data->hwirq, pmc->wake_type_dual_edge_map);
2463		break;
2464
2465	case IRQ_TYPE_EDGE_FALLING:
2466	case IRQ_TYPE_LEVEL_LOW:
2467		value &= ~WAKE_AOWAKE_CNTRL_LEVEL;
2468		clear_bit(data->hwirq, pmc->wake_type_level_map);
2469		clear_bit(data->hwirq, pmc->wake_type_dual_edge_map);
2470		break;
2471
2472	case IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING:
2473		value ^= WAKE_AOWAKE_CNTRL_LEVEL;
2474		clear_bit(data->hwirq, pmc->wake_type_level_map);
2475		set_bit(data->hwirq, pmc->wake_type_dual_edge_map);
2476		break;
2477
2478	default:
2479		return -EINVAL;
2480	}
2481
2482	writel(value, pmc->wake + WAKE_AOWAKE_CNTRL(data->hwirq));
2483
2484	return 0;
2485}
2486
2487static void tegra_irq_mask_parent(struct irq_data *data)
2488{
2489	if (data->parent_data)
2490		irq_chip_mask_parent(data);
2491}
2492
2493static void tegra_irq_unmask_parent(struct irq_data *data)
2494{
2495	if (data->parent_data)
2496		irq_chip_unmask_parent(data);
2497}
2498
2499static void tegra_irq_eoi_parent(struct irq_data *data)
2500{
2501	if (data->parent_data)
2502		irq_chip_eoi_parent(data);
2503}
2504
2505static int tegra_irq_set_affinity_parent(struct irq_data *data,
2506					 const struct cpumask *dest,
2507					 bool force)
2508{
2509	if (data->parent_data)
2510		return irq_chip_set_affinity_parent(data, dest, force);
2511
2512	return -EINVAL;
2513}
2514
2515static int tegra_pmc_irq_init(struct tegra_pmc *pmc)
2516{
2517	struct irq_domain *parent = NULL;
2518	struct device_node *np;
2519
2520	np = of_irq_find_parent(pmc->dev->of_node);
2521	if (np) {
2522		parent = irq_find_host(np);
2523		of_node_put(np);
2524	}
2525
2526	if (!parent)
2527		return 0;
2528
2529	pmc->irq.name = dev_name(pmc->dev);
2530	pmc->irq.irq_mask = tegra_irq_mask_parent;
2531	pmc->irq.irq_unmask = tegra_irq_unmask_parent;
2532	pmc->irq.irq_eoi = tegra_irq_eoi_parent;
2533	pmc->irq.irq_set_affinity = tegra_irq_set_affinity_parent;
2534	pmc->irq.irq_set_type = pmc->soc->irq_set_type;
2535	pmc->irq.irq_set_wake = pmc->soc->irq_set_wake;
2536
2537	pmc->domain = irq_domain_add_hierarchy(parent, 0, 96, pmc->dev->of_node,
2538					       &tegra_pmc_irq_domain_ops, pmc);
2539	if (!pmc->domain) {
2540		dev_err(pmc->dev, "failed to allocate domain\n");
2541		return -ENOMEM;
2542	}
2543
2544	return 0;
2545}
2546
2547static int tegra_pmc_clk_notify_cb(struct notifier_block *nb,
2548				   unsigned long action, void *ptr)
2549{
2550	struct tegra_pmc *pmc = container_of(nb, struct tegra_pmc, clk_nb);
2551	struct clk_notifier_data *data = ptr;
2552
2553	switch (action) {
2554	case PRE_RATE_CHANGE:
2555		mutex_lock(&pmc->powergates_lock);
2556		break;
2557
2558	case POST_RATE_CHANGE:
2559		pmc->rate = data->new_rate;
2560		fallthrough;
2561
2562	case ABORT_RATE_CHANGE:
2563		mutex_unlock(&pmc->powergates_lock);
2564		break;
2565
2566	default:
2567		WARN_ON_ONCE(1);
2568		return notifier_from_errno(-EINVAL);
2569	}
2570
2571	return NOTIFY_OK;
2572}
2573
2574static void pmc_clk_fence_udelay(u32 offset)
2575{
2576	tegra_pmc_readl(pmc, offset);
2577	/* pmc clk propagation delay 2 us */
2578	udelay(2);
2579}
2580
2581static u8 pmc_clk_mux_get_parent(struct clk_hw *hw)
2582{
2583	struct pmc_clk *clk = to_pmc_clk(hw);
2584	u32 val;
2585
2586	val = tegra_pmc_readl(pmc, clk->offs) >> clk->mux_shift;
2587	val &= PMC_CLK_OUT_MUX_MASK;
2588
2589	return val;
2590}
2591
2592static int pmc_clk_mux_set_parent(struct clk_hw *hw, u8 index)
2593{
2594	struct pmc_clk *clk = to_pmc_clk(hw);
2595	u32 val;
2596
2597	val = tegra_pmc_readl(pmc, clk->offs);
2598	val &= ~(PMC_CLK_OUT_MUX_MASK << clk->mux_shift);
2599	val |= index << clk->mux_shift;
2600	tegra_pmc_writel(pmc, val, clk->offs);
2601	pmc_clk_fence_udelay(clk->offs);
2602
2603	return 0;
2604}
2605
2606static int pmc_clk_is_enabled(struct clk_hw *hw)
2607{
2608	struct pmc_clk *clk = to_pmc_clk(hw);
2609	u32 val;
2610
2611	val = tegra_pmc_readl(pmc, clk->offs) & BIT(clk->force_en_shift);
2612
2613	return val ? 1 : 0;
2614}
2615
2616static void pmc_clk_set_state(unsigned long offs, u32 shift, int state)
2617{
2618	u32 val;
2619
2620	val = tegra_pmc_readl(pmc, offs);
2621	val = state ? (val | BIT(shift)) : (val & ~BIT(shift));
2622	tegra_pmc_writel(pmc, val, offs);
2623	pmc_clk_fence_udelay(offs);
2624}
2625
2626static int pmc_clk_enable(struct clk_hw *hw)
2627{
2628	struct pmc_clk *clk = to_pmc_clk(hw);
2629
2630	pmc_clk_set_state(clk->offs, clk->force_en_shift, 1);
2631
2632	return 0;
2633}
2634
2635static void pmc_clk_disable(struct clk_hw *hw)
2636{
2637	struct pmc_clk *clk = to_pmc_clk(hw);
2638
2639	pmc_clk_set_state(clk->offs, clk->force_en_shift, 0);
2640}
2641
2642static const struct clk_ops pmc_clk_ops = {
2643	.get_parent = pmc_clk_mux_get_parent,
2644	.set_parent = pmc_clk_mux_set_parent,
2645	.determine_rate = __clk_mux_determine_rate,
2646	.is_enabled = pmc_clk_is_enabled,
2647	.enable = pmc_clk_enable,
2648	.disable = pmc_clk_disable,
2649};
2650
2651static struct clk *
2652tegra_pmc_clk_out_register(struct tegra_pmc *pmc,
2653			   const struct pmc_clk_init_data *data,
2654			   unsigned long offset)
2655{
2656	struct clk_init_data init;
2657	struct pmc_clk *pmc_clk;
2658
2659	pmc_clk = devm_kzalloc(pmc->dev, sizeof(*pmc_clk), GFP_KERNEL);
2660	if (!pmc_clk)
2661		return ERR_PTR(-ENOMEM);
2662
2663	init.name = data->name;
2664	init.ops = &pmc_clk_ops;
2665	init.parent_names = data->parents;
2666	init.num_parents = data->num_parents;
2667	init.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
2668		     CLK_SET_PARENT_GATE;
2669
2670	pmc_clk->hw.init = &init;
2671	pmc_clk->offs = offset;
2672	pmc_clk->mux_shift = data->mux_shift;
2673	pmc_clk->force_en_shift = data->force_en_shift;
2674
2675	return clk_register(NULL, &pmc_clk->hw);
2676}
2677
2678static int pmc_clk_gate_is_enabled(struct clk_hw *hw)
2679{
2680	struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2681
2682	return tegra_pmc_readl(pmc, gate->offs) & BIT(gate->shift) ? 1 : 0;
2683}
2684
2685static int pmc_clk_gate_enable(struct clk_hw *hw)
2686{
2687	struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2688
2689	pmc_clk_set_state(gate->offs, gate->shift, 1);
2690
2691	return 0;
2692}
2693
2694static void pmc_clk_gate_disable(struct clk_hw *hw)
2695{
2696	struct pmc_clk_gate *gate = to_pmc_clk_gate(hw);
2697
2698	pmc_clk_set_state(gate->offs, gate->shift, 0);
2699}
2700
2701static const struct clk_ops pmc_clk_gate_ops = {
2702	.is_enabled = pmc_clk_gate_is_enabled,
2703	.enable = pmc_clk_gate_enable,
2704	.disable = pmc_clk_gate_disable,
2705};
2706
2707static struct clk *
2708tegra_pmc_clk_gate_register(struct tegra_pmc *pmc, const char *name,
2709			    const char *parent_name, unsigned long offset,
2710			    u32 shift)
2711{
2712	struct clk_init_data init;
2713	struct pmc_clk_gate *gate;
2714
2715	gate = devm_kzalloc(pmc->dev, sizeof(*gate), GFP_KERNEL);
2716	if (!gate)
2717		return ERR_PTR(-ENOMEM);
2718
2719	init.name = name;
2720	init.ops = &pmc_clk_gate_ops;
2721	init.parent_names = &parent_name;
2722	init.num_parents = 1;
2723	init.flags = 0;
2724
2725	gate->hw.init = &init;
2726	gate->offs = offset;
2727	gate->shift = shift;
2728
2729	return clk_register(NULL, &gate->hw);
2730}
2731
2732static void tegra_pmc_clock_register(struct tegra_pmc *pmc,
2733				     struct device_node *np)
2734{
2735	struct clk *clk;
2736	struct clk_onecell_data *clk_data;
2737	unsigned int num_clks;
2738	int i, err;
2739
2740	num_clks = pmc->soc->num_pmc_clks;
2741	if (pmc->soc->has_blink_output)
2742		num_clks += 1;
2743
2744	if (!num_clks)
2745		return;
2746
2747	clk_data = devm_kmalloc(pmc->dev, sizeof(*clk_data), GFP_KERNEL);
2748	if (!clk_data)
2749		return;
2750
2751	clk_data->clks = devm_kcalloc(pmc->dev, TEGRA_PMC_CLK_MAX,
2752				      sizeof(*clk_data->clks), GFP_KERNEL);
2753	if (!clk_data->clks)
2754		return;
2755
2756	clk_data->clk_num = TEGRA_PMC_CLK_MAX;
2757
2758	for (i = 0; i < TEGRA_PMC_CLK_MAX; i++)
2759		clk_data->clks[i] = ERR_PTR(-ENOENT);
2760
2761	for (i = 0; i < pmc->soc->num_pmc_clks; i++) {
2762		const struct pmc_clk_init_data *data;
2763
2764		data = pmc->soc->pmc_clks_data + i;
2765
2766		clk = tegra_pmc_clk_out_register(pmc, data, PMC_CLK_OUT_CNTRL);
2767		if (IS_ERR(clk)) {
2768			dev_warn(pmc->dev, "unable to register clock %s: %d\n",
2769				 data->name, PTR_ERR_OR_ZERO(clk));
2770			return;
2771		}
2772
2773		err = clk_register_clkdev(clk, data->name, NULL);
2774		if (err) {
2775			dev_warn(pmc->dev,
2776				 "unable to register %s clock lookup: %d\n",
2777				 data->name, err);
2778			return;
2779		}
2780
2781		clk_data->clks[data->clk_id] = clk;
2782	}
2783
2784	if (pmc->soc->has_blink_output) {
2785		tegra_pmc_writel(pmc, 0x0, PMC_BLINK_TIMER);
2786		clk = tegra_pmc_clk_gate_register(pmc,
2787						  "pmc_blink_override",
2788						  "clk_32k",
2789						  PMC_DPD_PADS_ORIDE,
2790						  PMC_DPD_PADS_ORIDE_BLINK);
2791		if (IS_ERR(clk)) {
2792			dev_warn(pmc->dev,
2793				 "unable to register pmc_blink_override: %d\n",
2794				 PTR_ERR_OR_ZERO(clk));
2795			return;
2796		}
2797
2798		clk = tegra_pmc_clk_gate_register(pmc, "pmc_blink",
2799						  "pmc_blink_override",
2800						  PMC_CNTRL,
2801						  PMC_CNTRL_BLINK_EN);
2802		if (IS_ERR(clk)) {
2803			dev_warn(pmc->dev,
2804				 "unable to register pmc_blink: %d\n",
2805				 PTR_ERR_OR_ZERO(clk));
2806			return;
2807		}
2808
2809		err = clk_register_clkdev(clk, "pmc_blink", NULL);
2810		if (err) {
2811			dev_warn(pmc->dev,
2812				 "unable to register pmc_blink lookup: %d\n",
2813				 err);
2814			return;
2815		}
2816
2817		clk_data->clks[TEGRA_PMC_CLK_BLINK] = clk;
2818	}
2819
2820	err = of_clk_add_provider(np, of_clk_src_onecell_get, clk_data);
2821	if (err)
2822		dev_warn(pmc->dev, "failed to add pmc clock provider: %d\n",
2823			 err);
2824}
2825
2826static const struct regmap_range pmc_usb_sleepwalk_ranges[] = {
2827	regmap_reg_range(PMC_USB_DEBOUNCE_DEL, PMC_USB_AO),
2828	regmap_reg_range(PMC_UTMIP_UHSIC_TRIGGERS, PMC_UTMIP_UHSIC_SAVED_STATE),
2829	regmap_reg_range(PMC_UTMIP_TERM_PAD_CFG, PMC_UTMIP_UHSIC_FAKE),
2830	regmap_reg_range(PMC_UTMIP_UHSIC_LINE_WAKEUP, PMC_UTMIP_UHSIC_LINE_WAKEUP),
2831	regmap_reg_range(PMC_UTMIP_BIAS_MASTER_CNTRL, PMC_UTMIP_MASTER_CONFIG),
2832	regmap_reg_range(PMC_UTMIP_UHSIC2_TRIGGERS, PMC_UTMIP_MASTER2_CONFIG),
2833	regmap_reg_range(PMC_UTMIP_PAD_CFG0, PMC_UTMIP_UHSIC_SLEEP_CFG1),
2834	regmap_reg_range(PMC_UTMIP_SLEEPWALK_P3, PMC_UTMIP_SLEEPWALK_P3),
2835};
2836
2837static const struct regmap_access_table pmc_usb_sleepwalk_table = {
2838	.yes_ranges = pmc_usb_sleepwalk_ranges,
2839	.n_yes_ranges = ARRAY_SIZE(pmc_usb_sleepwalk_ranges),
2840};
2841
2842static int tegra_pmc_regmap_readl(void *context, unsigned int offset, unsigned int *value)
2843{
2844	struct tegra_pmc *pmc = context;
2845
2846	*value = tegra_pmc_readl(pmc, offset);
2847	return 0;
2848}
2849
2850static int tegra_pmc_regmap_writel(void *context, unsigned int offset, unsigned int value)
2851{
2852	struct tegra_pmc *pmc = context;
2853
2854	tegra_pmc_writel(pmc, value, offset);
2855	return 0;
2856}
2857
2858static const struct regmap_config usb_sleepwalk_regmap_config = {
2859	.name = "usb_sleepwalk",
2860	.reg_bits = 32,
2861	.val_bits = 32,
2862	.reg_stride = 4,
2863	.fast_io = true,
2864	.rd_table = &pmc_usb_sleepwalk_table,
2865	.wr_table = &pmc_usb_sleepwalk_table,
2866	.reg_read = tegra_pmc_regmap_readl,
2867	.reg_write = tegra_pmc_regmap_writel,
2868};
2869
2870static int tegra_pmc_regmap_init(struct tegra_pmc *pmc)
2871{
2872	struct regmap *regmap;
2873	int err;
2874
2875	if (pmc->soc->has_usb_sleepwalk) {
2876		regmap = devm_regmap_init(pmc->dev, NULL, pmc, &usb_sleepwalk_regmap_config);
2877		if (IS_ERR(regmap)) {
2878			err = PTR_ERR(regmap);
2879			dev_err(pmc->dev, "failed to allocate register map (%d)\n", err);
2880			return err;
2881		}
2882	}
2883
2884	return 0;
2885}
2886
2887static void tegra_pmc_reset_suspend_mode(void *data)
2888{
2889	pmc->suspend_mode = TEGRA_SUSPEND_NOT_READY;
2890}
2891
2892static int tegra_pmc_probe(struct platform_device *pdev)
2893{
2894	void __iomem *base;
2895	struct resource *res;
2896	int err;
2897
2898	/*
2899	 * Early initialisation should have configured an initial
2900	 * register mapping and setup the soc data pointer. If these
2901	 * are not valid then something went badly wrong!
2902	 */
2903	if (WARN_ON(!pmc->base || !pmc->soc))
2904		return -ENODEV;
2905
2906	err = tegra_pmc_parse_dt(pmc, pdev->dev.of_node);
2907	if (err < 0)
2908		return err;
2909
2910	err = devm_add_action_or_reset(&pdev->dev, tegra_pmc_reset_suspend_mode,
2911				       NULL);
2912	if (err)
2913		return err;
2914
2915	/* take over the memory region from the early initialization */
2916	base = devm_platform_ioremap_resource(pdev, 0);
2917	if (IS_ERR(base))
2918		return PTR_ERR(base);
2919
2920	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wake");
2921	if (res) {
2922		pmc->wake = devm_ioremap_resource(&pdev->dev, res);
2923		if (IS_ERR(pmc->wake))
2924			return PTR_ERR(pmc->wake);
2925	} else {
2926		pmc->wake = base;
2927	}
2928
2929	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aotag");
2930	if (res) {
2931		pmc->aotag = devm_ioremap_resource(&pdev->dev, res);
2932		if (IS_ERR(pmc->aotag))
2933			return PTR_ERR(pmc->aotag);
2934	} else {
2935		pmc->aotag = base;
2936	}
2937
2938	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "scratch");
2939	if (res) {
2940		pmc->scratch = devm_ioremap_resource(&pdev->dev, res);
2941		if (IS_ERR(pmc->scratch))
2942			return PTR_ERR(pmc->scratch);
2943	} else {
2944		pmc->scratch = base;
2945	}
2946
2947	pmc->clk = devm_clk_get_optional(&pdev->dev, "pclk");
2948	if (IS_ERR(pmc->clk))
2949		return dev_err_probe(&pdev->dev, PTR_ERR(pmc->clk),
2950				     "failed to get pclk\n");
2951
2952	/*
2953	 * PMC should be last resort for restarting since it soft-resets
2954	 * CPU without resetting everything else.
2955	 */
2956	err = devm_register_reboot_notifier(&pdev->dev,
2957					    &tegra_pmc_reboot_notifier);
2958	if (err) {
2959		dev_err(&pdev->dev, "unable to register reboot notifier, %d\n",
2960			err);
2961		return err;
2962	}
2963
2964	err = devm_register_sys_off_handler(&pdev->dev,
2965					    SYS_OFF_MODE_RESTART,
2966					    SYS_OFF_PRIO_LOW,
2967					    tegra_pmc_restart_handler, NULL);
2968	if (err) {
2969		dev_err(&pdev->dev, "failed to register sys-off handler: %d\n",
2970			err);
2971		return err;
2972	}
2973
2974	/*
2975	 * PMC should be primary power-off method if it soft-resets CPU,
2976	 * asking bootloader to shutdown hardware.
2977	 */
2978	err = devm_register_sys_off_handler(&pdev->dev,
2979					    SYS_OFF_MODE_POWER_OFF,
2980					    SYS_OFF_PRIO_FIRMWARE,
2981					    tegra_pmc_power_off_handler, NULL);
2982	if (err) {
2983		dev_err(&pdev->dev, "failed to register sys-off handler: %d\n",
2984			err);
2985		return err;
2986	}
2987
2988	/*
2989	 * PCLK clock rate can't be retrieved using CLK API because it
2990	 * causes lockup if CPU enters LP2 idle state from some other
2991	 * CLK notifier, hence we're caching the rate's value locally.
2992	 */
2993	if (pmc->clk) {
2994		pmc->clk_nb.notifier_call = tegra_pmc_clk_notify_cb;
2995		err = devm_clk_notifier_register(&pdev->dev, pmc->clk,
2996						 &pmc->clk_nb);
2997		if (err) {
2998			dev_err(&pdev->dev,
2999				"failed to register clk notifier\n");
3000			return err;
3001		}
3002
3003		pmc->rate = clk_get_rate(pmc->clk);
3004	}
3005
3006	pmc->dev = &pdev->dev;
3007
3008	err = tegra_pmc_init(pmc);
3009	if (err < 0) {
3010		dev_err(&pdev->dev, "failed to initialize PMC: %d\n", err);
3011		return err;
3012	}
3013
3014	tegra_pmc_init_tsense_reset(pmc);
3015
3016	tegra_pmc_reset_sysfs_init(pmc);
3017
3018	err = tegra_pmc_pinctrl_init(pmc);
3019	if (err)
3020		goto cleanup_sysfs;
3021
3022	err = tegra_pmc_regmap_init(pmc);
3023	if (err < 0)
3024		goto cleanup_sysfs;
3025
3026	err = tegra_powergate_init(pmc, pdev->dev.of_node);
3027	if (err < 0)
3028		goto cleanup_powergates;
3029
3030	err = tegra_pmc_irq_init(pmc);
3031	if (err < 0)
3032		goto cleanup_powergates;
3033
3034	mutex_lock(&pmc->powergates_lock);
3035	iounmap(pmc->base);
3036	pmc->base = base;
3037	mutex_unlock(&pmc->powergates_lock);
3038
3039	tegra_pmc_clock_register(pmc, pdev->dev.of_node);
3040	platform_set_drvdata(pdev, pmc);
3041	tegra_pm_init_suspend();
3042
3043	/* Some wakes require specific filter configuration */
3044	if (pmc->soc->set_wake_filters)
3045		pmc->soc->set_wake_filters(pmc);
3046
3047	debugfs_create_file("powergate", 0444, NULL, NULL, &powergate_fops);
3048
3049	return 0;
3050
3051cleanup_powergates:
3052	tegra_powergate_remove_all(pdev->dev.of_node);
3053cleanup_sysfs:
3054	device_remove_file(&pdev->dev, &dev_attr_reset_reason);
3055	device_remove_file(&pdev->dev, &dev_attr_reset_level);
3056
3057	return err;
3058}
3059
3060/*
3061 * Ensures that sufficient time is passed for a register write to
3062 * serialize into the 32KHz domain.
3063 */
3064static void wke_32kwritel(struct tegra_pmc *pmc, u32 value, unsigned int offset)
3065{
3066	writel(value, pmc->wake + offset);
3067	udelay(130);
3068}
3069
3070static void wke_write_wake_level(struct tegra_pmc *pmc, int wake, int level)
3071{
3072	unsigned int offset = WAKE_AOWAKE_CNTRL(wake);
3073	u32 value;
3074
3075	value = readl(pmc->wake + offset);
3076	if (level)
3077		value |= WAKE_AOWAKE_CNTRL_LEVEL;
3078	else
3079		value &= ~WAKE_AOWAKE_CNTRL_LEVEL;
3080
3081	writel(value, pmc->wake + offset);
3082}
3083
3084static void wke_write_wake_levels(struct tegra_pmc *pmc)
3085{
3086	unsigned int i;
3087
3088	for (i = 0; i < pmc->soc->max_wake_events; i++)
3089		wke_write_wake_level(pmc, i, test_bit(i, pmc->wake_cntrl_level_map));
3090}
3091
3092static void wke_clear_sw_wake_status(struct tegra_pmc *pmc)
3093{
3094	wke_32kwritel(pmc, 1, WAKE_AOWAKE_SW_STATUS_W_0);
3095}
3096
3097static void wke_read_sw_wake_status(struct tegra_pmc *pmc)
3098{
3099	unsigned long status;
3100	unsigned int wake, i;
3101
3102	for (i = 0; i < pmc->soc->max_wake_events; i++)
3103		wke_write_wake_level(pmc, i, 0);
3104
3105	wke_clear_sw_wake_status(pmc);
3106
3107	wke_32kwritel(pmc, 1, WAKE_LATCH_SW);
3108
3109	/*
3110	 * WAKE_AOWAKE_SW_STATUS is edge triggered, so in order to
3111	 * obtain the current status of the input wake signals, change
3112	 * the polarity of the wake level from 0->1 while latching to force
3113	 * a positive edge if the sampled signal is '1'.
3114	 */
3115	for (i = 0; i < pmc->soc->max_wake_events; i++)
3116		wke_write_wake_level(pmc, i, 1);
3117
3118	/*
3119	 * Wait for the update to be synced into the 32kHz domain,
3120	 * and let enough time lapse, so that the wake signals have time to
3121	 * be sampled.
3122	 */
3123	udelay(300);
3124
3125	wke_32kwritel(pmc, 0, WAKE_LATCH_SW);
3126
3127	bitmap_zero(pmc->wake_sw_status_map, pmc->soc->max_wake_events);
3128
3129	for (i = 0; i < pmc->soc->max_wake_vectors; i++) {
3130		status = readl(pmc->wake + WAKE_AOWAKE_SW_STATUS(i));
3131
3132		for_each_set_bit(wake, &status, 32)
3133			set_bit(wake + (i * 32), pmc->wake_sw_status_map);
3134	}
3135}
3136
3137static void wke_clear_wake_status(struct tegra_pmc *pmc)
3138{
3139	unsigned long status;
3140	unsigned int i, wake;
3141	u32 mask;
3142
3143	for (i = 0; i < pmc->soc->max_wake_vectors; i++) {
3144		mask = readl(pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(i));
3145		status = readl(pmc->wake + WAKE_AOWAKE_STATUS_R(i)) & mask;
3146
3147		for_each_set_bit(wake, &status, 32)
3148			wke_32kwritel(pmc, 0x1, WAKE_AOWAKE_STATUS_W((i * 32) + wake));
3149	}
3150}
3151
3152/* translate sc7 wake sources back into IRQs to catch edge triggered wakeups */
3153static void tegra186_pmc_process_wake_events(struct tegra_pmc *pmc, unsigned int index,
3154					     unsigned long status)
3155{
3156	unsigned int wake;
3157
3158	dev_dbg(pmc->dev, "Wake[%d:%d]  status=%#lx\n", (index * 32) + 31, index * 32, status);
3159
3160	for_each_set_bit(wake, &status, 32) {
3161		irq_hw_number_t hwirq = wake + 32 * index;
3162		struct irq_desc *desc;
3163		unsigned int irq;
3164
3165		irq = irq_find_mapping(pmc->domain, hwirq);
3166
3167		desc = irq_to_desc(irq);
3168		if (!desc || !desc->action || !desc->action->name) {
3169			dev_dbg(pmc->dev, "Resume caused by WAKE%ld, IRQ %d\n", hwirq, irq);
3170			continue;
3171		}
3172
3173		dev_dbg(pmc->dev, "Resume caused by WAKE%ld, %s\n", hwirq, desc->action->name);
3174		generic_handle_irq(irq);
3175	}
3176}
3177
3178static void tegra186_pmc_wake_syscore_resume(void)
3179{
3180	u32 status, mask;
3181	unsigned int i;
3182
3183	for (i = 0; i < pmc->soc->max_wake_vectors; i++) {
3184		mask = readl(pmc->wake + WAKE_AOWAKE_TIER2_ROUTING(i));
3185		status = readl(pmc->wake + WAKE_AOWAKE_STATUS_R(i)) & mask;
3186
3187		tegra186_pmc_process_wake_events(pmc, i, status);
3188	}
3189}
3190
3191static int tegra186_pmc_wake_syscore_suspend(void)
3192{
3193	wke_read_sw_wake_status(pmc);
3194
3195	/* flip the wakeup trigger for dual-edge triggered pads
3196	 * which are currently asserting as wakeups
3197	 */
3198	bitmap_andnot(pmc->wake_cntrl_level_map, pmc->wake_type_dual_edge_map,
3199		      pmc->wake_sw_status_map, pmc->soc->max_wake_events);
3200	bitmap_or(pmc->wake_cntrl_level_map, pmc->wake_cntrl_level_map,
3201		  pmc->wake_type_level_map, pmc->soc->max_wake_events);
3202
3203	/* Clear PMC Wake Status registers while going to suspend */
3204	wke_clear_wake_status(pmc);
3205	wke_write_wake_levels(pmc);
3206
3207	return 0;
3208}
3209
3210#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
3211static int tegra_pmc_suspend(struct device *dev)
3212{
3213	struct tegra_pmc *pmc = dev_get_drvdata(dev);
3214
3215	tegra_pmc_writel(pmc, virt_to_phys(tegra_resume), PMC_SCRATCH41);
3216
3217	return 0;
3218}
3219
3220static int tegra_pmc_resume(struct device *dev)
3221{
3222	struct tegra_pmc *pmc = dev_get_drvdata(dev);
3223
3224	tegra_pmc_writel(pmc, 0x0, PMC_SCRATCH41);
3225
3226	return 0;
3227}
3228
3229static SIMPLE_DEV_PM_OPS(tegra_pmc_pm_ops, tegra_pmc_suspend, tegra_pmc_resume);
3230
3231#endif
3232
3233static const char * const tegra20_powergates[] = {
3234	[TEGRA_POWERGATE_CPU] = "cpu",
3235	[TEGRA_POWERGATE_3D] = "td",
3236	[TEGRA_POWERGATE_VENC] = "venc",
3237	[TEGRA_POWERGATE_VDEC] = "vdec",
3238	[TEGRA_POWERGATE_PCIE] = "pcie",
3239	[TEGRA_POWERGATE_L2] = "l2",
3240	[TEGRA_POWERGATE_MPE] = "mpe",
3241};
3242
3243static const struct tegra_pmc_regs tegra20_pmc_regs = {
3244	.scratch0 = 0x50,
3245	.rst_status = 0x1b4,
3246	.rst_source_shift = 0x0,
3247	.rst_source_mask = 0x7,
3248	.rst_level_shift = 0x0,
3249	.rst_level_mask = 0x0,
3250};
3251
3252static void tegra20_pmc_init(struct tegra_pmc *pmc)
3253{
3254	u32 value, osc, pmu, off;
3255
3256	/* Always enable CPU power request */
3257	value = tegra_pmc_readl(pmc, PMC_CNTRL);
3258	value |= PMC_CNTRL_CPU_PWRREQ_OE;
3259	tegra_pmc_writel(pmc, value, PMC_CNTRL);
3260
3261	value = tegra_pmc_readl(pmc, PMC_CNTRL);
3262
3263	if (pmc->sysclkreq_high)
3264		value &= ~PMC_CNTRL_SYSCLK_POLARITY;
3265	else
3266		value |= PMC_CNTRL_SYSCLK_POLARITY;
3267
3268	if (pmc->corereq_high)
3269		value &= ~PMC_CNTRL_PWRREQ_POLARITY;
3270	else
3271		value |= PMC_CNTRL_PWRREQ_POLARITY;
3272
3273	/* configure the output polarity while the request is tristated */
3274	tegra_pmc_writel(pmc, value, PMC_CNTRL);
3275
3276	/* now enable the request */
3277	value = tegra_pmc_readl(pmc, PMC_CNTRL);
3278	value |= PMC_CNTRL_SYSCLK_OE;
3279	tegra_pmc_writel(pmc, value, PMC_CNTRL);
3280
3281	/* program core timings which are applicable only for suspend state */
3282	if (pmc->suspend_mode != TEGRA_SUSPEND_NONE) {
3283		osc = DIV_ROUND_UP(pmc->core_osc_time * 8192, 1000000);
3284		pmu = DIV_ROUND_UP(pmc->core_pmu_time * 32768, 1000000);
3285		off = DIV_ROUND_UP(pmc->core_off_time * 32768, 1000000);
3286		tegra_pmc_writel(pmc, ((osc << 8) & 0xff00) | (pmu & 0xff),
3287				 PMC_COREPWRGOOD_TIMER);
3288		tegra_pmc_writel(pmc, off, PMC_COREPWROFF_TIMER);
3289	}
3290}
3291
3292static void tegra20_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
3293					   struct device_node *np,
3294					   bool invert)
3295{
3296	u32 value;
3297
3298	value = tegra_pmc_readl(pmc, PMC_CNTRL);
3299
3300	if (invert)
3301		value |= PMC_CNTRL_INTR_POLARITY;
3302	else
3303		value &= ~PMC_CNTRL_INTR_POLARITY;
3304
3305	tegra_pmc_writel(pmc, value, PMC_CNTRL);
3306}
3307
3308static const struct tegra_pmc_soc tegra20_pmc_soc = {
3309	.supports_core_domain = true,
3310	.num_powergates = ARRAY_SIZE(tegra20_powergates),
3311	.powergates = tegra20_powergates,
3312	.num_cpu_powergates = 0,
3313	.cpu_powergates = NULL,
3314	.has_tsense_reset = false,
3315	.has_gpu_clamps = false,
3316	.needs_mbist_war = false,
3317	.has_impl_33v_pwr = false,
3318	.maybe_tz_only = false,
3319	.num_io_pads = 0,
3320	.io_pads = NULL,
3321	.num_pin_descs = 0,
3322	.pin_descs = NULL,
3323	.regs = &tegra20_pmc_regs,
3324	.init = tegra20_pmc_init,
3325	.setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3326	.powergate_set = tegra20_powergate_set,
3327	.reset_sources = NULL,
3328	.num_reset_sources = 0,
3329	.reset_levels = NULL,
3330	.num_reset_levels = 0,
3331	.pmc_clks_data = NULL,
3332	.num_pmc_clks = 0,
3333	.has_blink_output = true,
3334	.has_usb_sleepwalk = true,
3335};
3336
3337static const char * const tegra30_powergates[] = {
3338	[TEGRA_POWERGATE_CPU] = "cpu0",
3339	[TEGRA_POWERGATE_3D] = "td",
3340	[TEGRA_POWERGATE_VENC] = "venc",
3341	[TEGRA_POWERGATE_VDEC] = "vdec",
3342	[TEGRA_POWERGATE_PCIE] = "pcie",
3343	[TEGRA_POWERGATE_L2] = "l2",
3344	[TEGRA_POWERGATE_MPE] = "mpe",
3345	[TEGRA_POWERGATE_HEG] = "heg",
3346	[TEGRA_POWERGATE_SATA] = "sata",
3347	[TEGRA_POWERGATE_CPU1] = "cpu1",
3348	[TEGRA_POWERGATE_CPU2] = "cpu2",
3349	[TEGRA_POWERGATE_CPU3] = "cpu3",
3350	[TEGRA_POWERGATE_CELP] = "celp",
3351	[TEGRA_POWERGATE_3D1] = "td2",
3352};
3353
3354static const u8 tegra30_cpu_powergates[] = {
3355	TEGRA_POWERGATE_CPU,
3356	TEGRA_POWERGATE_CPU1,
3357	TEGRA_POWERGATE_CPU2,
3358	TEGRA_POWERGATE_CPU3,
3359};
3360
3361static const char * const tegra30_reset_sources[] = {
3362	"POWER_ON_RESET",
3363	"WATCHDOG",
3364	"SENSOR",
3365	"SW_MAIN",
3366	"LP0"
3367};
3368
3369static const struct tegra_pmc_soc tegra30_pmc_soc = {
3370	.supports_core_domain = true,
3371	.num_powergates = ARRAY_SIZE(tegra30_powergates),
3372	.powergates = tegra30_powergates,
3373	.num_cpu_powergates = ARRAY_SIZE(tegra30_cpu_powergates),
3374	.cpu_powergates = tegra30_cpu_powergates,
3375	.has_tsense_reset = true,
3376	.has_gpu_clamps = false,
3377	.needs_mbist_war = false,
3378	.has_impl_33v_pwr = false,
3379	.maybe_tz_only = false,
3380	.num_io_pads = 0,
3381	.io_pads = NULL,
3382	.num_pin_descs = 0,
3383	.pin_descs = NULL,
3384	.regs = &tegra20_pmc_regs,
3385	.init = tegra20_pmc_init,
3386	.setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3387	.powergate_set = tegra20_powergate_set,
3388	.reset_sources = tegra30_reset_sources,
3389	.num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3390	.reset_levels = NULL,
3391	.num_reset_levels = 0,
3392	.pmc_clks_data = tegra_pmc_clks_data,
3393	.num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3394	.has_blink_output = true,
3395	.has_usb_sleepwalk = true,
3396};
3397
3398static const char * const tegra114_powergates[] = {
3399	[TEGRA_POWERGATE_CPU] = "crail",
3400	[TEGRA_POWERGATE_3D] = "td",
3401	[TEGRA_POWERGATE_VENC] = "venc",
3402	[TEGRA_POWERGATE_VDEC] = "vdec",
3403	[TEGRA_POWERGATE_MPE] = "mpe",
3404	[TEGRA_POWERGATE_HEG] = "heg",
3405	[TEGRA_POWERGATE_CPU1] = "cpu1",
3406	[TEGRA_POWERGATE_CPU2] = "cpu2",
3407	[TEGRA_POWERGATE_CPU3] = "cpu3",
3408	[TEGRA_POWERGATE_CELP] = "celp",
3409	[TEGRA_POWERGATE_CPU0] = "cpu0",
3410	[TEGRA_POWERGATE_C0NC] = "c0nc",
3411	[TEGRA_POWERGATE_C1NC] = "c1nc",
3412	[TEGRA_POWERGATE_DIS] = "dis",
3413	[TEGRA_POWERGATE_DISB] = "disb",
3414	[TEGRA_POWERGATE_XUSBA] = "xusba",
3415	[TEGRA_POWERGATE_XUSBB] = "xusbb",
3416	[TEGRA_POWERGATE_XUSBC] = "xusbc",
3417};
3418
3419static const u8 tegra114_cpu_powergates[] = {
3420	TEGRA_POWERGATE_CPU0,
3421	TEGRA_POWERGATE_CPU1,
3422	TEGRA_POWERGATE_CPU2,
3423	TEGRA_POWERGATE_CPU3,
3424};
3425
3426static const struct tegra_pmc_soc tegra114_pmc_soc = {
3427	.supports_core_domain = false,
3428	.num_powergates = ARRAY_SIZE(tegra114_powergates),
3429	.powergates = tegra114_powergates,
3430	.num_cpu_powergates = ARRAY_SIZE(tegra114_cpu_powergates),
3431	.cpu_powergates = tegra114_cpu_powergates,
3432	.has_tsense_reset = true,
3433	.has_gpu_clamps = false,
3434	.needs_mbist_war = false,
3435	.has_impl_33v_pwr = false,
3436	.maybe_tz_only = false,
3437	.num_io_pads = 0,
3438	.io_pads = NULL,
3439	.num_pin_descs = 0,
3440	.pin_descs = NULL,
3441	.regs = &tegra20_pmc_regs,
3442	.init = tegra20_pmc_init,
3443	.setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3444	.powergate_set = tegra114_powergate_set,
3445	.reset_sources = tegra30_reset_sources,
3446	.num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3447	.reset_levels = NULL,
3448	.num_reset_levels = 0,
3449	.pmc_clks_data = tegra_pmc_clks_data,
3450	.num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3451	.has_blink_output = true,
3452	.has_usb_sleepwalk = true,
3453};
3454
3455static const char * const tegra124_powergates[] = {
3456	[TEGRA_POWERGATE_CPU] = "crail",
3457	[TEGRA_POWERGATE_3D] = "3d",
3458	[TEGRA_POWERGATE_VENC] = "venc",
3459	[TEGRA_POWERGATE_PCIE] = "pcie",
3460	[TEGRA_POWERGATE_VDEC] = "vdec",
3461	[TEGRA_POWERGATE_MPE] = "mpe",
3462	[TEGRA_POWERGATE_HEG] = "heg",
3463	[TEGRA_POWERGATE_SATA] = "sata",
3464	[TEGRA_POWERGATE_CPU1] = "cpu1",
3465	[TEGRA_POWERGATE_CPU2] = "cpu2",
3466	[TEGRA_POWERGATE_CPU3] = "cpu3",
3467	[TEGRA_POWERGATE_CELP] = "celp",
3468	[TEGRA_POWERGATE_CPU0] = "cpu0",
3469	[TEGRA_POWERGATE_C0NC] = "c0nc",
3470	[TEGRA_POWERGATE_C1NC] = "c1nc",
3471	[TEGRA_POWERGATE_SOR] = "sor",
3472	[TEGRA_POWERGATE_DIS] = "dis",
3473	[TEGRA_POWERGATE_DISB] = "disb",
3474	[TEGRA_POWERGATE_XUSBA] = "xusba",
3475	[TEGRA_POWERGATE_XUSBB] = "xusbb",
3476	[TEGRA_POWERGATE_XUSBC] = "xusbc",
3477	[TEGRA_POWERGATE_VIC] = "vic",
3478	[TEGRA_POWERGATE_IRAM] = "iram",
3479};
3480
3481static const u8 tegra124_cpu_powergates[] = {
3482	TEGRA_POWERGATE_CPU0,
3483	TEGRA_POWERGATE_CPU1,
3484	TEGRA_POWERGATE_CPU2,
3485	TEGRA_POWERGATE_CPU3,
3486};
3487
3488#define TEGRA_IO_PAD(_id, _dpd, _request, _status, _voltage, _name)	\
3489	((struct tegra_io_pad_soc) {					\
3490		.id		= (_id),				\
3491		.dpd		= (_dpd),				\
3492		.request	= (_request),				\
3493		.status		= (_status),				\
3494		.voltage	= (_voltage),				\
3495		.name		= (_name),				\
3496	})
3497
3498#define TEGRA_IO_PIN_DESC(_id, _name)	\
3499	((struct pinctrl_pin_desc) {	\
3500		.number	= (_id),	\
3501		.name	= (_name),	\
3502	})
3503
3504static const struct tegra_io_pad_soc tegra124_io_pads[] = {
3505	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO, 17, 0x1b8, 0x1bc, UINT_MAX, "audio"),
3506	TEGRA_IO_PAD(TEGRA_IO_PAD_BB, 15, 0x1b8, 0x1bc, UINT_MAX, "bb"),
3507	TEGRA_IO_PAD(TEGRA_IO_PAD_CAM, 4, 0x1c0, 0x1c4, UINT_MAX, "cam"),
3508	TEGRA_IO_PAD(TEGRA_IO_PAD_COMP, 22, 0x1b8, 0x1bc, UINT_MAX, "comp"),
3509	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x1b8, 0x1bc, UINT_MAX, "csia"),
3510	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x1b8, 0x1bc, UINT_MAX, "csib"),
3511	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 12, 0x1c0, 0x1c4, UINT_MAX, "csie"),
3512	TEGRA_IO_PAD(TEGRA_IO_PAD_DSI, 2, 0x1b8, 0x1bc, UINT_MAX, "dsi"),
3513	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIB, 7, 0x1c0, 0x1c4, UINT_MAX, "dsib"),
3514	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIC, 8, 0x1c0, 0x1c4, UINT_MAX, "dsic"),
3515	TEGRA_IO_PAD(TEGRA_IO_PAD_DSID, 9, 0x1c0, 0x1c4, UINT_MAX, "dsid"),
3516	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI, 28, 0x1b8, 0x1bc, UINT_MAX, "hdmi"),
3517	TEGRA_IO_PAD(TEGRA_IO_PAD_HSIC, 19, 0x1b8, 0x1bc, UINT_MAX, "hsic"),
3518	TEGRA_IO_PAD(TEGRA_IO_PAD_HV, 6, 0x1c0, 0x1c4, UINT_MAX, "hv"),
3519	TEGRA_IO_PAD(TEGRA_IO_PAD_LVDS, 25, 0x1c0, 0x1c4, UINT_MAX, "lvds"),
3520	TEGRA_IO_PAD(TEGRA_IO_PAD_MIPI_BIAS, 3, 0x1b8, 0x1bc, UINT_MAX, "mipi-bias"),
3521	TEGRA_IO_PAD(TEGRA_IO_PAD_NAND, 13, 0x1b8, 0x1bc, UINT_MAX, "nand"),
3522	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_BIAS, 4, 0x1b8, 0x1bc, UINT_MAX, "pex-bias"),
3523	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK1, 5, 0x1b8, 0x1bc, UINT_MAX, "pex-clk1"),
3524	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK2, 6, 0x1b8, 0x1bc, UINT_MAX, "pex-clk2"),
3525	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CNTRL, 0, 0x1c0, 0x1c4, UINT_MAX, "pex-cntrl"),
3526	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1, 1, 0x1c0, 0x1c4, UINT_MAX, "sdmmc1"),
3527	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3, 2, 0x1c0, 0x1c4, UINT_MAX, "sdmmc3"),
3528	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC4, 3, 0x1c0, 0x1c4, UINT_MAX, "sdmmc4"),
3529	TEGRA_IO_PAD(TEGRA_IO_PAD_SYS_DDC, 26, 0x1c0, 0x1c4, UINT_MAX, "sys_ddc"),
3530	TEGRA_IO_PAD(TEGRA_IO_PAD_UART, 14, 0x1b8, 0x1bc, UINT_MAX, "uart"),
3531	TEGRA_IO_PAD(TEGRA_IO_PAD_USB0, 9, 0x1b8, 0x1bc, UINT_MAX, "usb0"),
3532	TEGRA_IO_PAD(TEGRA_IO_PAD_USB1, 10, 0x1b8, 0x1bc, UINT_MAX, "usb1"),
3533	TEGRA_IO_PAD(TEGRA_IO_PAD_USB2, 11, 0x1b8, 0x1bc, UINT_MAX, "usb2"),
3534	TEGRA_IO_PAD(TEGRA_IO_PAD_USB_BIAS, 12, 0x1b8, 0x1bc, UINT_MAX, "usb_bias"),
3535};
3536
3537static const struct pinctrl_pin_desc tegra124_pin_descs[] = {
3538	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO, "audio"),
3539	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_BB, "bb"),
3540	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CAM, "cam"),
3541	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_COMP, "comp"),
3542	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"),
3543	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"),
3544	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"),
3545	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSI, "dsi"),
3546	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIB, "dsib"),
3547	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIC, "dsic"),
3548	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSID, "dsid"),
3549	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI, "hdmi"),
3550	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HSIC, "hsic"),
3551	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HV, "hv"),
3552	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_LVDS, "lvds"),
3553	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_MIPI_BIAS, "mipi-bias"),
3554	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_NAND, "nand"),
3555	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_BIAS, "pex-bias"),
3556	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK1, "pex-clk1"),
3557	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK2, "pex-clk2"),
3558	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CNTRL, "pex-cntrl"),
3559	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1, "sdmmc1"),
3560	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3, "sdmmc3"),
3561	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC4, "sdmmc4"),
3562	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SYS_DDC, "sys_ddc"),
3563	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART, "uart"),
3564	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB0, "usb0"),
3565	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB1, "usb1"),
3566	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB2, "usb2"),
3567	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB_BIAS, "usb_bias"),
3568};
3569
3570static const struct tegra_pmc_soc tegra124_pmc_soc = {
3571	.supports_core_domain = false,
3572	.num_powergates = ARRAY_SIZE(tegra124_powergates),
3573	.powergates = tegra124_powergates,
3574	.num_cpu_powergates = ARRAY_SIZE(tegra124_cpu_powergates),
3575	.cpu_powergates = tegra124_cpu_powergates,
3576	.has_tsense_reset = true,
3577	.has_gpu_clamps = true,
3578	.needs_mbist_war = false,
3579	.has_impl_33v_pwr = false,
3580	.maybe_tz_only = false,
3581	.num_io_pads = ARRAY_SIZE(tegra124_io_pads),
3582	.io_pads = tegra124_io_pads,
3583	.num_pin_descs = ARRAY_SIZE(tegra124_pin_descs),
3584	.pin_descs = tegra124_pin_descs,
3585	.regs = &tegra20_pmc_regs,
3586	.init = tegra20_pmc_init,
3587	.setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3588	.powergate_set = tegra114_powergate_set,
3589	.reset_sources = tegra30_reset_sources,
3590	.num_reset_sources = ARRAY_SIZE(tegra30_reset_sources),
3591	.reset_levels = NULL,
3592	.num_reset_levels = 0,
3593	.pmc_clks_data = tegra_pmc_clks_data,
3594	.num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3595	.has_blink_output = true,
3596	.has_usb_sleepwalk = true,
3597};
3598
3599static const char * const tegra210_powergates[] = {
3600	[TEGRA_POWERGATE_CPU] = "crail",
3601	[TEGRA_POWERGATE_3D] = "3d",
3602	[TEGRA_POWERGATE_VENC] = "venc",
3603	[TEGRA_POWERGATE_PCIE] = "pcie",
3604	[TEGRA_POWERGATE_MPE] = "mpe",
3605	[TEGRA_POWERGATE_SATA] = "sata",
3606	[TEGRA_POWERGATE_CPU1] = "cpu1",
3607	[TEGRA_POWERGATE_CPU2] = "cpu2",
3608	[TEGRA_POWERGATE_CPU3] = "cpu3",
3609	[TEGRA_POWERGATE_CPU0] = "cpu0",
3610	[TEGRA_POWERGATE_C0NC] = "c0nc",
3611	[TEGRA_POWERGATE_SOR] = "sor",
3612	[TEGRA_POWERGATE_DIS] = "dis",
3613	[TEGRA_POWERGATE_DISB] = "disb",
3614	[TEGRA_POWERGATE_XUSBA] = "xusba",
3615	[TEGRA_POWERGATE_XUSBB] = "xusbb",
3616	[TEGRA_POWERGATE_XUSBC] = "xusbc",
3617	[TEGRA_POWERGATE_VIC] = "vic",
3618	[TEGRA_POWERGATE_IRAM] = "iram",
3619	[TEGRA_POWERGATE_NVDEC] = "nvdec",
3620	[TEGRA_POWERGATE_NVJPG] = "nvjpg",
3621	[TEGRA_POWERGATE_AUD] = "aud",
3622	[TEGRA_POWERGATE_DFD] = "dfd",
3623	[TEGRA_POWERGATE_VE2] = "ve2",
3624};
3625
3626static const u8 tegra210_cpu_powergates[] = {
3627	TEGRA_POWERGATE_CPU0,
3628	TEGRA_POWERGATE_CPU1,
3629	TEGRA_POWERGATE_CPU2,
3630	TEGRA_POWERGATE_CPU3,
3631};
3632
3633static const struct tegra_io_pad_soc tegra210_io_pads[] = {
3634	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO, 17, 0x1b8, 0x1bc, 5, "audio"),
3635	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO_HV, 29, 0x1c0, 0x1c4, 18, "audio-hv"),
3636	TEGRA_IO_PAD(TEGRA_IO_PAD_CAM, 4, 0x1c0, 0x1c4, 10, "cam"),
3637	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x1b8, 0x1bc, UINT_MAX, "csia"),
3638	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x1b8, 0x1bc, UINT_MAX, "csib"),
3639	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIC, 10, 0x1c0, 0x1c4, UINT_MAX, "csic"),
3640	TEGRA_IO_PAD(TEGRA_IO_PAD_CSID, 11, 0x1c0, 0x1c4, UINT_MAX, "csid"),
3641	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 12, 0x1c0, 0x1c4, UINT_MAX, "csie"),
3642	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIF, 13, 0x1c0, 0x1c4, UINT_MAX, "csif"),
3643	TEGRA_IO_PAD(TEGRA_IO_PAD_DBG, 25, 0x1b8, 0x1bc, 19, "dbg"),
3644	TEGRA_IO_PAD(TEGRA_IO_PAD_DEBUG_NONAO, 26, 0x1b8, 0x1bc, UINT_MAX, "debug-nonao"),
3645	TEGRA_IO_PAD(TEGRA_IO_PAD_DMIC, 18, 0x1c0, 0x1c4, 20, "dmic"),
3646	TEGRA_IO_PAD(TEGRA_IO_PAD_DP, 19, 0x1c0, 0x1c4, UINT_MAX, "dp"),
3647	TEGRA_IO_PAD(TEGRA_IO_PAD_DSI, 2, 0x1b8, 0x1bc, UINT_MAX, "dsi"),
3648	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIB, 7, 0x1c0, 0x1c4, UINT_MAX, "dsib"),
3649	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIC, 8, 0x1c0, 0x1c4, UINT_MAX, "dsic"),
3650	TEGRA_IO_PAD(TEGRA_IO_PAD_DSID, 9, 0x1c0, 0x1c4, UINT_MAX, "dsid"),
3651	TEGRA_IO_PAD(TEGRA_IO_PAD_EMMC, 3, 0x1c0, 0x1c4, UINT_MAX, "emmc"),
3652	TEGRA_IO_PAD(TEGRA_IO_PAD_EMMC2, 5, 0x1c0, 0x1c4, UINT_MAX, "emmc2"),
3653	TEGRA_IO_PAD(TEGRA_IO_PAD_GPIO, 27, 0x1b8, 0x1bc, 21, "gpio"),
3654	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI, 28, 0x1b8, 0x1bc, UINT_MAX, "hdmi"),
3655	TEGRA_IO_PAD(TEGRA_IO_PAD_HSIC, 19, 0x1b8, 0x1bc, UINT_MAX, "hsic"),
3656	TEGRA_IO_PAD(TEGRA_IO_PAD_LVDS, 25, 0x1c0, 0x1c4, UINT_MAX, "lvds"),
3657	TEGRA_IO_PAD(TEGRA_IO_PAD_MIPI_BIAS, 3, 0x1b8, 0x1bc, UINT_MAX, "mipi-bias"),
3658	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_BIAS, 4, 0x1b8, 0x1bc, UINT_MAX, "pex-bias"),
3659	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK1, 5, 0x1b8, 0x1bc, UINT_MAX, "pex-clk1"),
3660	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK2, 6, 0x1b8, 0x1bc, UINT_MAX, "pex-clk2"),
3661	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CNTRL, UINT_MAX, UINT_MAX, UINT_MAX, 11, "pex-cntrl"),
3662	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1, 1, 0x1c0, 0x1c4, 12, "sdmmc1"),
3663	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3, 2, 0x1c0, 0x1c4, 13, "sdmmc3"),
3664	TEGRA_IO_PAD(TEGRA_IO_PAD_SPI, 14, 0x1c0, 0x1c4, 22, "spi"),
3665	TEGRA_IO_PAD(TEGRA_IO_PAD_SPI_HV, 15, 0x1c0, 0x1c4, 23, "spi-hv"),
3666	TEGRA_IO_PAD(TEGRA_IO_PAD_UART, 14, 0x1b8, 0x1bc, 2, "uart"),
3667	TEGRA_IO_PAD(TEGRA_IO_PAD_USB0, 9, 0x1b8, 0x1bc, UINT_MAX, "usb0"),
3668	TEGRA_IO_PAD(TEGRA_IO_PAD_USB1, 10, 0x1b8, 0x1bc, UINT_MAX, "usb1"),
3669	TEGRA_IO_PAD(TEGRA_IO_PAD_USB2, 11, 0x1b8, 0x1bc, UINT_MAX, "usb2"),
3670	TEGRA_IO_PAD(TEGRA_IO_PAD_USB3, 18, 0x1b8, 0x1bc, UINT_MAX, "usb3"),
3671	TEGRA_IO_PAD(TEGRA_IO_PAD_USB_BIAS, 12, 0x1b8, 0x1bc, UINT_MAX, "usb-bias"),
3672};
3673
3674static const struct pinctrl_pin_desc tegra210_pin_descs[] = {
3675	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO, "audio"),
3676	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO_HV, "audio-hv"),
3677	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CAM, "cam"),
3678	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"),
3679	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"),
3680	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIC, "csic"),
3681	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSID, "csid"),
3682	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"),
3683	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIF, "csif"),
3684	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DBG, "dbg"),
3685	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DEBUG_NONAO, "debug-nonao"),
3686	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DMIC, "dmic"),
3687	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DP, "dp"),
3688	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSI, "dsi"),
3689	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIB, "dsib"),
3690	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIC, "dsic"),
3691	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSID, "dsid"),
3692	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EMMC, "emmc"),
3693	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EMMC2, "emmc2"),
3694	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_GPIO, "gpio"),
3695	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI, "hdmi"),
3696	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HSIC, "hsic"),
3697	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_LVDS, "lvds"),
3698	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_MIPI_BIAS, "mipi-bias"),
3699	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_BIAS, "pex-bias"),
3700	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK1, "pex-clk1"),
3701	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK2, "pex-clk2"),
3702	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CNTRL, "pex-cntrl"),
3703	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1, "sdmmc1"),
3704	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3, "sdmmc3"),
3705	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI, "spi"),
3706	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI_HV, "spi-hv"),
3707	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART, "uart"),
3708	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB0, "usb0"),
3709	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB1, "usb1"),
3710	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB2, "usb2"),
3711	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB3, "usb3"),
3712	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB_BIAS, "usb-bias"),
3713};
3714
3715static const char * const tegra210_reset_sources[] = {
3716	"POWER_ON_RESET",
3717	"WATCHDOG",
3718	"SENSOR",
3719	"SW_MAIN",
3720	"LP0",
3721	"AOTAG"
3722};
3723
3724static const struct tegra_wake_event tegra210_wake_events[] = {
3725	TEGRA_WAKE_IRQ("rtc", 16, 2),
3726	TEGRA_WAKE_IRQ("pmu", 51, 86),
3727};
3728
3729static const struct tegra_pmc_soc tegra210_pmc_soc = {
3730	.supports_core_domain = false,
3731	.num_powergates = ARRAY_SIZE(tegra210_powergates),
3732	.powergates = tegra210_powergates,
3733	.num_cpu_powergates = ARRAY_SIZE(tegra210_cpu_powergates),
3734	.cpu_powergates = tegra210_cpu_powergates,
3735	.has_tsense_reset = true,
3736	.has_gpu_clamps = true,
3737	.needs_mbist_war = true,
3738	.has_impl_33v_pwr = false,
3739	.maybe_tz_only = true,
3740	.num_io_pads = ARRAY_SIZE(tegra210_io_pads),
3741	.io_pads = tegra210_io_pads,
3742	.num_pin_descs = ARRAY_SIZE(tegra210_pin_descs),
3743	.pin_descs = tegra210_pin_descs,
3744	.regs = &tegra20_pmc_regs,
3745	.init = tegra20_pmc_init,
3746	.setup_irq_polarity = tegra20_pmc_setup_irq_polarity,
3747	.powergate_set = tegra114_powergate_set,
3748	.irq_set_wake = tegra210_pmc_irq_set_wake,
3749	.irq_set_type = tegra210_pmc_irq_set_type,
3750	.reset_sources = tegra210_reset_sources,
3751	.num_reset_sources = ARRAY_SIZE(tegra210_reset_sources),
3752	.reset_levels = NULL,
3753	.num_reset_levels = 0,
3754	.num_wake_events = ARRAY_SIZE(tegra210_wake_events),
3755	.wake_events = tegra210_wake_events,
3756	.pmc_clks_data = tegra_pmc_clks_data,
3757	.num_pmc_clks = ARRAY_SIZE(tegra_pmc_clks_data),
3758	.has_blink_output = true,
3759	.has_usb_sleepwalk = true,
3760};
3761
3762static const struct tegra_io_pad_soc tegra186_io_pads[] = {
3763	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x74, 0x78, UINT_MAX, "csia"),
3764	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x74, 0x78, UINT_MAX, "csib"),
3765	TEGRA_IO_PAD(TEGRA_IO_PAD_DSI, 2, 0x74, 0x78, UINT_MAX, "dsi"),
3766	TEGRA_IO_PAD(TEGRA_IO_PAD_MIPI_BIAS, 3, 0x74, 0x78, UINT_MAX, "mipi-bias"),
3767	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK_BIAS, 4, 0x74, 0x78, UINT_MAX, "pex-clk-bias"),
3768	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK3, 5, 0x74, 0x78, UINT_MAX, "pex-clk3"),
3769	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK2, 6, 0x74, 0x78, UINT_MAX, "pex-clk2"),
3770	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK1, 7, 0x74, 0x78, UINT_MAX, "pex-clk1"),
3771	TEGRA_IO_PAD(TEGRA_IO_PAD_USB0, 9, 0x74, 0x78, UINT_MAX, "usb0"),
3772	TEGRA_IO_PAD(TEGRA_IO_PAD_USB1, 10, 0x74, 0x78, UINT_MAX, "usb1"),
3773	TEGRA_IO_PAD(TEGRA_IO_PAD_USB2, 11, 0x74, 0x78, UINT_MAX, "usb2"),
3774	TEGRA_IO_PAD(TEGRA_IO_PAD_USB_BIAS, 12, 0x74, 0x78, UINT_MAX, "usb-bias"),
3775	TEGRA_IO_PAD(TEGRA_IO_PAD_UART, 14, 0x74, 0x78, UINT_MAX, "uart"),
3776	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO, 17, 0x74, 0x78, UINT_MAX, "audio"),
3777	TEGRA_IO_PAD(TEGRA_IO_PAD_HSIC, 19, 0x74, 0x78, UINT_MAX, "hsic"),
3778	TEGRA_IO_PAD(TEGRA_IO_PAD_DBG, 25, 0x74, 0x78, UINT_MAX, "dbg"),
3779	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP0, 28, 0x74, 0x78, UINT_MAX, "hdmi-dp0"),
3780	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP1, 29, 0x74, 0x78, UINT_MAX, "hdmi-dp1"),
3781	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CNTRL, 0, 0x7c, 0x80, UINT_MAX, "pex-cntrl"),
3782	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC2_HV, 2, 0x7c, 0x80, 5, "sdmmc2-hv"),
3783	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC4, 4, 0x7c, 0x80, UINT_MAX, "sdmmc4"),
3784	TEGRA_IO_PAD(TEGRA_IO_PAD_CAM, 6, 0x7c, 0x80, UINT_MAX, "cam"),
3785	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIB, 8, 0x7c, 0x80, UINT_MAX, "dsib"),
3786	TEGRA_IO_PAD(TEGRA_IO_PAD_DSIC, 9, 0x7c, 0x80, UINT_MAX, "dsic"),
3787	TEGRA_IO_PAD(TEGRA_IO_PAD_DSID, 10, 0x7c, 0x80, UINT_MAX, "dsid"),
3788	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIC, 11, 0x7c, 0x80, UINT_MAX, "csic"),
3789	TEGRA_IO_PAD(TEGRA_IO_PAD_CSID, 12, 0x7c, 0x80, UINT_MAX, "csid"),
3790	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 13, 0x7c, 0x80, UINT_MAX, "csie"),
3791	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIF, 14, 0x7c, 0x80, UINT_MAX, "csif"),
3792	TEGRA_IO_PAD(TEGRA_IO_PAD_SPI, 15, 0x7c, 0x80, UINT_MAX, "spi"),
3793	TEGRA_IO_PAD(TEGRA_IO_PAD_UFS, 17, 0x7c, 0x80, UINT_MAX, "ufs"),
3794	TEGRA_IO_PAD(TEGRA_IO_PAD_DMIC_HV, 20, 0x7c, 0x80, 2, "dmic-hv"),
3795	TEGRA_IO_PAD(TEGRA_IO_PAD_EDP, 21, 0x7c, 0x80, UINT_MAX, "edp"),
3796	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1_HV, 23, 0x7c, 0x80, 4, "sdmmc1-hv"),
3797	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3_HV, 24, 0x7c, 0x80, 6, "sdmmc3-hv"),
3798	TEGRA_IO_PAD(TEGRA_IO_PAD_CONN, 28, 0x7c, 0x80, UINT_MAX, "conn"),
3799	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO_HV, 29, 0x7c, 0x80, 1, "audio-hv"),
3800	TEGRA_IO_PAD(TEGRA_IO_PAD_AO_HV, UINT_MAX, UINT_MAX, UINT_MAX, 0, "ao-hv"),
3801};
3802
3803static const struct pinctrl_pin_desc tegra186_pin_descs[] = {
3804	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"),
3805	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"),
3806	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSI, "dsi"),
3807	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_MIPI_BIAS, "mipi-bias"),
3808	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK_BIAS, "pex-clk-bias"),
3809	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK3, "pex-clk3"),
3810	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK2, "pex-clk2"),
3811	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK1, "pex-clk1"),
3812	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB0, "usb0"),
3813	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB1, "usb1"),
3814	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB2, "usb2"),
3815	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_USB_BIAS, "usb-bias"),
3816	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART, "uart"),
3817	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO, "audio"),
3818	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HSIC, "hsic"),
3819	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DBG, "dbg"),
3820	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP0, "hdmi-dp0"),
3821	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP1, "hdmi-dp1"),
3822	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CNTRL, "pex-cntrl"),
3823	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC2_HV, "sdmmc2-hv"),
3824	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC4, "sdmmc4"),
3825	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CAM, "cam"),
3826	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIB, "dsib"),
3827	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSIC, "dsic"),
3828	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DSID, "dsid"),
3829	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIC, "csic"),
3830	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSID, "csid"),
3831	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"),
3832	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIF, "csif"),
3833	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI, "spi"),
3834	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UFS, "ufs"),
3835	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DMIC_HV, "dmic-hv"),
3836	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EDP, "edp"),
3837	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1_HV, "sdmmc1-hv"),
3838	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3_HV, "sdmmc3-hv"),
3839	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CONN, "conn"),
3840	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO_HV, "audio-hv"),
3841	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AO_HV, "ao-hv"),
3842};
3843
3844static const struct tegra_pmc_regs tegra186_pmc_regs = {
3845	.scratch0 = 0x2000,
3846	.rst_status = 0x70,
3847	.rst_source_shift = 0x2,
3848	.rst_source_mask = 0x3c,
3849	.rst_level_shift = 0x0,
3850	.rst_level_mask = 0x3,
3851};
3852
3853static void tegra186_pmc_init(struct tegra_pmc *pmc)
3854{
3855	pmc->syscore.suspend = tegra186_pmc_wake_syscore_suspend;
3856	pmc->syscore.resume = tegra186_pmc_wake_syscore_resume;
3857
3858	register_syscore_ops(&pmc->syscore);
3859}
3860
3861static void tegra186_pmc_setup_irq_polarity(struct tegra_pmc *pmc,
3862					    struct device_node *np,
3863					    bool invert)
3864{
3865	struct resource regs;
3866	void __iomem *wake;
3867	u32 value;
3868	int index;
3869
3870	index = of_property_match_string(np, "reg-names", "wake");
3871	if (index < 0) {
3872		dev_err(pmc->dev, "failed to find PMC wake registers\n");
3873		return;
3874	}
3875
3876	of_address_to_resource(np, index, &regs);
3877
3878	wake = ioremap(regs.start, resource_size(&regs));
3879	if (!wake) {
3880		dev_err(pmc->dev, "failed to map PMC wake registers\n");
3881		return;
3882	}
3883
3884	value = readl(wake + WAKE_AOWAKE_CTRL);
3885
3886	if (invert)
3887		value |= WAKE_AOWAKE_CTRL_INTR_POLARITY;
3888	else
3889		value &= ~WAKE_AOWAKE_CTRL_INTR_POLARITY;
3890
3891	writel(value, wake + WAKE_AOWAKE_CTRL);
3892
3893	iounmap(wake);
3894}
3895
3896static const char * const tegra186_reset_sources[] = {
3897	"SYS_RESET",
3898	"AOWDT",
3899	"MCCPLEXWDT",
3900	"BPMPWDT",
3901	"SCEWDT",
3902	"SPEWDT",
3903	"APEWDT",
3904	"BCCPLEXWDT",
3905	"SENSOR",
3906	"AOTAG",
3907	"VFSENSOR",
3908	"SWREST",
3909	"SC7",
3910	"HSM",
3911	"CORESIGHT"
3912};
3913
3914static const char * const tegra186_reset_levels[] = {
3915	"L0", "L1", "L2", "WARM"
3916};
3917
3918static const struct tegra_wake_event tegra186_wake_events[] = {
3919	TEGRA_WAKE_IRQ("pmu", 24, 209),
3920	TEGRA_WAKE_GPIO("power", 29, 1, TEGRA186_AON_GPIO(FF, 0)),
3921	TEGRA_WAKE_IRQ("rtc", 73, 10),
3922};
3923
3924static const struct tegra_pmc_soc tegra186_pmc_soc = {
3925	.supports_core_domain = false,
3926	.num_powergates = 0,
3927	.powergates = NULL,
3928	.num_cpu_powergates = 0,
3929	.cpu_powergates = NULL,
3930	.has_tsense_reset = false,
3931	.has_gpu_clamps = false,
3932	.needs_mbist_war = false,
3933	.has_impl_33v_pwr = true,
3934	.maybe_tz_only = false,
3935	.num_io_pads = ARRAY_SIZE(tegra186_io_pads),
3936	.io_pads = tegra186_io_pads,
3937	.num_pin_descs = ARRAY_SIZE(tegra186_pin_descs),
3938	.pin_descs = tegra186_pin_descs,
3939	.regs = &tegra186_pmc_regs,
3940	.init = tegra186_pmc_init,
3941	.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
3942	.set_wake_filters = tegra186_pmc_set_wake_filters,
3943	.irq_set_wake = tegra186_pmc_irq_set_wake,
3944	.irq_set_type = tegra186_pmc_irq_set_type,
3945	.reset_sources = tegra186_reset_sources,
3946	.num_reset_sources = ARRAY_SIZE(tegra186_reset_sources),
3947	.reset_levels = tegra186_reset_levels,
3948	.num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
3949	.num_wake_events = ARRAY_SIZE(tegra186_wake_events),
3950	.wake_events = tegra186_wake_events,
3951	.max_wake_events = 96,
3952	.max_wake_vectors = 3,
3953	.pmc_clks_data = NULL,
3954	.num_pmc_clks = 0,
3955	.has_blink_output = false,
3956	.has_usb_sleepwalk = false,
3957};
3958
3959static const struct tegra_io_pad_soc tegra194_io_pads[] = {
3960	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0x74, 0x78, UINT_MAX, "csia"),
3961	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0x74, 0x78, UINT_MAX, "csib"),
3962	TEGRA_IO_PAD(TEGRA_IO_PAD_MIPI_BIAS, 3, 0x74, 0x78, UINT_MAX, "mipi-bias"),
3963	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK_BIAS, 4, 0x74, 0x78, UINT_MAX, "pex-clk-bias"),
3964	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK3, 5, 0x74, 0x78, UINT_MAX, "pex-clk3"),
3965	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK2, 6, 0x74, 0x78, UINT_MAX, "pex-clk2"),
3966	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK1, 7, 0x74, 0x78, UINT_MAX, "pex-clk1"),
3967	TEGRA_IO_PAD(TEGRA_IO_PAD_EQOS, 8, 0x74, 0x78, UINT_MAX, "eqos"),
3968	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK_2_BIAS, 9, 0x74, 0x78, UINT_MAX, "pex-clk-2-bias"),
3969	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CLK_2, 10, 0x74, 0x78, UINT_MAX, "pex-clk-2"),
3970	TEGRA_IO_PAD(TEGRA_IO_PAD_DAP3, 11, 0x74, 0x78, UINT_MAX, "dap3"),
3971	TEGRA_IO_PAD(TEGRA_IO_PAD_DAP5, 12, 0x74, 0x78, UINT_MAX, "dap5"),
3972	TEGRA_IO_PAD(TEGRA_IO_PAD_UART, 14, 0x74, 0x78, UINT_MAX, "uart"),
3973	TEGRA_IO_PAD(TEGRA_IO_PAD_PWR_CTL, 15, 0x74, 0x78, UINT_MAX, "pwr-ctl"),
3974	TEGRA_IO_PAD(TEGRA_IO_PAD_SOC_GPIO53, 16, 0x74, 0x78, UINT_MAX, "soc-gpio53"),
3975	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO, 17, 0x74, 0x78, UINT_MAX, "audio"),
3976	TEGRA_IO_PAD(TEGRA_IO_PAD_GP_PWM2, 18, 0x74, 0x78, UINT_MAX, "gp-pwm2"),
3977	TEGRA_IO_PAD(TEGRA_IO_PAD_GP_PWM3, 19, 0x74, 0x78, UINT_MAX, "gp-pwm3"),
3978	TEGRA_IO_PAD(TEGRA_IO_PAD_SOC_GPIO12, 20, 0x74, 0x78, UINT_MAX, "soc-gpio12"),
3979	TEGRA_IO_PAD(TEGRA_IO_PAD_SOC_GPIO13, 21, 0x74, 0x78, UINT_MAX, "soc-gpio13"),
3980	TEGRA_IO_PAD(TEGRA_IO_PAD_SOC_GPIO10, 22, 0x74, 0x78, UINT_MAX, "soc-gpio10"),
3981	TEGRA_IO_PAD(TEGRA_IO_PAD_UART4, 23, 0x74, 0x78, UINT_MAX, "uart4"),
3982	TEGRA_IO_PAD(TEGRA_IO_PAD_UART5, 24, 0x74, 0x78, UINT_MAX, "uart5"),
3983	TEGRA_IO_PAD(TEGRA_IO_PAD_DBG, 25, 0x74, 0x78, UINT_MAX, "dbg"),
3984	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP3, 26, 0x74, 0x78, UINT_MAX, "hdmi-dp3"),
3985	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP2, 27, 0x74, 0x78, UINT_MAX, "hdmi-dp2"),
3986	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP0, 28, 0x74, 0x78, UINT_MAX, "hdmi-dp0"),
3987	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP1, 29, 0x74, 0x78, UINT_MAX, "hdmi-dp1"),
3988	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CNTRL, 0, 0x7c, 0x80, UINT_MAX, "pex-cntrl"),
3989	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_CTL2, 1, 0x7c, 0x80, UINT_MAX, "pex-ctl2"),
3990	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_L0_RST, 2, 0x7c, 0x80, UINT_MAX, "pex-l0-rst"),
3991	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_L1_RST, 3, 0x7c, 0x80, UINT_MAX, "pex-l1-rst"),
3992	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC4, 4, 0x7c, 0x80, UINT_MAX, "sdmmc4"),
3993	TEGRA_IO_PAD(TEGRA_IO_PAD_PEX_L5_RST, 5, 0x7c, 0x80, UINT_MAX, "pex-l5-rst"),
3994	TEGRA_IO_PAD(TEGRA_IO_PAD_CAM, 6, 0x7c, 0x80, UINT_MAX, "cam"),
3995	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIC, 11, 0x7c, 0x80, UINT_MAX, "csic"),
3996	TEGRA_IO_PAD(TEGRA_IO_PAD_CSID, 12, 0x7c, 0x80, UINT_MAX, "csid"),
3997	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 13, 0x7c, 0x80, UINT_MAX, "csie"),
3998	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIF, 14, 0x7c, 0x80, UINT_MAX, "csif"),
3999	TEGRA_IO_PAD(TEGRA_IO_PAD_SPI, 15, 0x7c, 0x80, UINT_MAX, "spi"),
4000	TEGRA_IO_PAD(TEGRA_IO_PAD_UFS, 17, 0x7c, 0x80, UINT_MAX, "ufs"),
4001	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIG, 18, 0x7c, 0x80, UINT_MAX, "csig"),
4002	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIH, 19, 0x7c, 0x80, UINT_MAX, "csih"),
4003	TEGRA_IO_PAD(TEGRA_IO_PAD_EDP, 21, 0x7c, 0x80, UINT_MAX, "edp"),
4004	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1_HV, 23, 0x7c, 0x80, 4, "sdmmc1-hv"),
4005	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3_HV, 24, 0x7c, 0x80, 6, "sdmmc3-hv"),
4006	TEGRA_IO_PAD(TEGRA_IO_PAD_CONN, 28, 0x7c, 0x80, UINT_MAX, "conn"),
4007	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO_HV, 29, 0x7c, 0x80, 1, "audio-hv"),
4008	TEGRA_IO_PAD(TEGRA_IO_PAD_AO_HV, UINT_MAX, UINT_MAX, UINT_MAX, 0, "ao-hv"),
4009};
4010
4011static const struct pinctrl_pin_desc tegra194_pin_descs[] = {
4012	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"),
4013	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"),
4014	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_MIPI_BIAS, "mipi-bias"),
4015	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK_BIAS, "pex-clk-bias"),
4016	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK3, "pex-clk3"),
4017	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK2, "pex-clk2"),
4018	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK1, "pex-clk1"),
4019	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EQOS, "eqos"),
4020	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK_2_BIAS, "pex-clk-2-bias"),
4021	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CLK_2, "pex-clk-2"),
4022	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DAP3, "dap3"),
4023	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DAP5, "dap5"),
4024	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART, "uart"),
4025	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PWR_CTL, "pwr-ctl"),
4026	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SOC_GPIO53, "soc-gpio53"),
4027	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO, "audio"),
4028	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_GP_PWM2, "gp-pwm2"),
4029	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_GP_PWM3, "gp-pwm3"),
4030	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SOC_GPIO12, "soc-gpio12"),
4031	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SOC_GPIO13, "soc-gpio13"),
4032	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SOC_GPIO10, "soc-gpio10"),
4033	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART4, "uart4"),
4034	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UART5, "uart5"),
4035	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_DBG, "dbg"),
4036	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP3, "hdmi-dp3"),
4037	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP2, "hdmi-dp2"),
4038	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP0, "hdmi-dp0"),
4039	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP1, "hdmi-dp1"),
4040	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CNTRL, "pex-cntrl"),
4041	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_CTL2, "pex-ctl2"),
4042	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_L0_RST, "pex-l0-rst"),
4043	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_L1_RST, "pex-l1-rst"),
4044	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC4, "sdmmc4"),
4045	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_PEX_L5_RST, "pex-l5-rst"),
4046	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CAM, "cam"),
4047	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIC, "csic"),
4048	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSID, "csid"),
4049	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"),
4050	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIF, "csif"),
4051	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SPI, "spi"),
4052	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UFS, "ufs"),
4053	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIG, "csig"),
4054	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIH, "csih"),
4055	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EDP, "edp"),
4056	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1_HV, "sdmmc1-hv"),
4057	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3_HV, "sdmmc3-hv"),
4058	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CONN, "conn"),
4059	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO_HV, "audio-hv"),
4060	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AO_HV, "ao-hv"),
4061};
4062
4063static const struct tegra_pmc_regs tegra194_pmc_regs = {
4064	.scratch0 = 0x2000,
4065	.rst_status = 0x70,
4066	.rst_source_shift = 0x2,
4067	.rst_source_mask = 0x7c,
4068	.rst_level_shift = 0x0,
4069	.rst_level_mask = 0x3,
4070};
4071
4072static const char * const tegra194_reset_sources[] = {
4073	"SYS_RESET_N",
4074	"AOWDT",
4075	"BCCPLEXWDT",
4076	"BPMPWDT",
4077	"SCEWDT",
4078	"SPEWDT",
4079	"APEWDT",
4080	"LCCPLEXWDT",
4081	"SENSOR",
4082	"AOTAG",
4083	"VFSENSOR",
4084	"MAINSWRST",
4085	"SC7",
4086	"HSM",
4087	"CSITE",
4088	"RCEWDT",
4089	"PVA0WDT",
4090	"PVA1WDT",
4091	"L1A_ASYNC",
4092	"BPMPBOOT",
4093	"FUSECRC",
4094};
4095
4096static const struct tegra_wake_event tegra194_wake_events[] = {
4097	TEGRA_WAKE_IRQ("pmu", 24, 209),
4098	TEGRA_WAKE_GPIO("power", 29, 1, TEGRA194_AON_GPIO(EE, 4)),
4099	TEGRA_WAKE_IRQ("rtc", 73, 10),
4100	TEGRA_WAKE_SIMPLE("usb3-port-0", 76),
4101	TEGRA_WAKE_SIMPLE("usb3-port-1", 77),
4102	TEGRA_WAKE_SIMPLE("usb3-port-2-3", 78),
4103	TEGRA_WAKE_SIMPLE("usb2-port-0", 79),
4104	TEGRA_WAKE_SIMPLE("usb2-port-1", 80),
4105	TEGRA_WAKE_SIMPLE("usb2-port-2", 81),
4106	TEGRA_WAKE_SIMPLE("usb2-port-3", 82),
4107};
4108
4109static const struct tegra_pmc_soc tegra194_pmc_soc = {
4110	.supports_core_domain = false,
4111	.num_powergates = 0,
4112	.powergates = NULL,
4113	.num_cpu_powergates = 0,
4114	.cpu_powergates = NULL,
4115	.has_tsense_reset = false,
4116	.has_gpu_clamps = false,
4117	.needs_mbist_war = false,
4118	.has_impl_33v_pwr = true,
4119	.maybe_tz_only = false,
4120	.num_io_pads = ARRAY_SIZE(tegra194_io_pads),
4121	.io_pads = tegra194_io_pads,
4122	.num_pin_descs = ARRAY_SIZE(tegra194_pin_descs),
4123	.pin_descs = tegra194_pin_descs,
4124	.regs = &tegra194_pmc_regs,
4125	.init = tegra186_pmc_init,
4126	.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
4127	.set_wake_filters = tegra186_pmc_set_wake_filters,
4128	.irq_set_wake = tegra186_pmc_irq_set_wake,
4129	.irq_set_type = tegra186_pmc_irq_set_type,
4130	.reset_sources = tegra194_reset_sources,
4131	.num_reset_sources = ARRAY_SIZE(tegra194_reset_sources),
4132	.reset_levels = tegra186_reset_levels,
4133	.num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
4134	.num_wake_events = ARRAY_SIZE(tegra194_wake_events),
4135	.wake_events = tegra194_wake_events,
4136	.max_wake_events = 96,
4137	.max_wake_vectors = 3,
4138	.pmc_clks_data = NULL,
4139	.num_pmc_clks = 0,
4140	.has_blink_output = false,
4141	.has_usb_sleepwalk = false,
4142};
4143
4144static const struct tegra_io_pad_soc tegra234_io_pads[] = {
4145	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIA, 0, 0xe0c0, 0xe0c4, UINT_MAX, "csia"),
4146	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIB, 1, 0xe0c0, 0xe0c4, UINT_MAX, "csib"),
4147	TEGRA_IO_PAD(TEGRA_IO_PAD_HDMI_DP0, 0, 0xe0d0, 0xe0d4, UINT_MAX, "hdmi-dp0"),
4148	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIC, 2, 0xe0c0, 0xe0c4, UINT_MAX, "csic"),
4149	TEGRA_IO_PAD(TEGRA_IO_PAD_CSID, 3, 0xe0c0, 0xe0c4, UINT_MAX, "csid"),
4150	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIE, 4, 0xe0c0, 0xe0c4, UINT_MAX, "csie"),
4151	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIF, 5, 0xe0c0, 0xe0c4, UINT_MAX, "csif"),
4152	TEGRA_IO_PAD(TEGRA_IO_PAD_UFS, 0, 0xe064, 0xe068, UINT_MAX, "ufs"),
4153	TEGRA_IO_PAD(TEGRA_IO_PAD_EDP, 1, 0xe05c, 0xe060, UINT_MAX, "edp"),
4154	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC1_HV, 0, 0xe054, 0xe058, 4, "sdmmc1-hv"),
4155	TEGRA_IO_PAD(TEGRA_IO_PAD_SDMMC3_HV, UINT_MAX, UINT_MAX, UINT_MAX, 6, "sdmmc3-hv"),
4156	TEGRA_IO_PAD(TEGRA_IO_PAD_AUDIO_HV, UINT_MAX, UINT_MAX, UINT_MAX, 1, "audio-hv"),
4157	TEGRA_IO_PAD(TEGRA_IO_PAD_AO_HV, UINT_MAX, UINT_MAX, UINT_MAX, 0, "ao-hv"),
4158	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIG, 6, 0xe0c0, 0xe0c4, UINT_MAX, "csig"),
4159	TEGRA_IO_PAD(TEGRA_IO_PAD_CSIH, 7, 0xe0c0, 0xe0c4, UINT_MAX, "csih"),
4160};
4161
4162static const struct pinctrl_pin_desc tegra234_pin_descs[] = {
4163	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIA, "csia"),
4164	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIB, "csib"),
4165	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_HDMI_DP0, "hdmi-dp0"),
4166	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIC, "csic"),
4167	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSID, "csid"),
4168	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIE, "csie"),
4169	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIF, "csif"),
4170	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_UFS, "ufs"),
4171	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_EDP, "edp"),
4172	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC1_HV, "sdmmc1-hv"),
4173	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_SDMMC3_HV, "sdmmc3-hv"),
4174	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AUDIO_HV, "audio-hv"),
4175	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_AO_HV, "ao-hv"),
4176	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIG, "csig"),
4177	TEGRA_IO_PIN_DESC(TEGRA_IO_PAD_CSIH, "csih"),
4178};
4179
4180static const struct tegra_pmc_regs tegra234_pmc_regs = {
4181	.scratch0 = 0x2000,
4182	.rst_status = 0x70,
4183	.rst_source_shift = 0x2,
4184	.rst_source_mask = 0xfc,
4185	.rst_level_shift = 0x0,
4186	.rst_level_mask = 0x3,
4187};
4188
4189static const char * const tegra234_reset_sources[] = {
4190	"SYS_RESET_N",	/* 0x0 */
4191	"AOWDT",
4192	"BCCPLEXWDT",
4193	"BPMPWDT",
4194	"SCEWDT",
4195	"SPEWDT",
4196	"APEWDT",
4197	"LCCPLEXWDT",
4198	"SENSOR",	/* 0x8 */
4199	NULL,
4200	NULL,
4201	"MAINSWRST",
4202	"SC7",
4203	"HSM",
4204	NULL,
4205	"RCEWDT",
4206	NULL,		/* 0x10 */
4207	NULL,
4208	NULL,
4209	"BPMPBOOT",
4210	"FUSECRC",
4211	"DCEWDT",
4212	"PSCWDT",
4213	"PSC",
4214	"CSITE_SW",	/* 0x18 */
4215	"POD",
4216	"SCPM",
4217	"VREFRO_POWERBAD",
4218	"VMON",
4219	"FMON",
4220	"FSI_R5WDT",
4221	"FSI_THERM",
4222	"FSI_R52C0WDT",	/* 0x20 */
4223	"FSI_R52C1WDT",
4224	"FSI_R52C2WDT",
4225	"FSI_R52C3WDT",
4226	"FSI_FMON",
4227	"FSI_VMON",	/* 0x25 */
4228};
4229
4230static const struct tegra_wake_event tegra234_wake_events[] = {
4231	TEGRA_WAKE_IRQ("pmu", 24, 209),
4232	TEGRA_WAKE_GPIO("power", 29, 1, TEGRA234_AON_GPIO(EE, 4)),
4233	TEGRA_WAKE_GPIO("mgbe", 56, 0, TEGRA234_MAIN_GPIO(Y, 3)),
4234	TEGRA_WAKE_IRQ("rtc", 73, 10),
4235	TEGRA_WAKE_IRQ("sw-wake", SW_WAKE_ID, 179),
4236};
4237
4238static const struct tegra_pmc_soc tegra234_pmc_soc = {
4239	.supports_core_domain = false,
4240	.num_powergates = 0,
4241	.powergates = NULL,
4242	.num_cpu_powergates = 0,
4243	.cpu_powergates = NULL,
4244	.has_tsense_reset = false,
4245	.has_gpu_clamps = false,
4246	.needs_mbist_war = false,
4247	.has_impl_33v_pwr = true,
4248	.maybe_tz_only = false,
4249	.num_io_pads = ARRAY_SIZE(tegra234_io_pads),
4250	.io_pads = tegra234_io_pads,
4251	.num_pin_descs = ARRAY_SIZE(tegra234_pin_descs),
4252	.pin_descs = tegra234_pin_descs,
4253	.regs = &tegra234_pmc_regs,
4254	.init = tegra186_pmc_init,
4255	.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
4256	.set_wake_filters = tegra186_pmc_set_wake_filters,
4257	.irq_set_wake = tegra186_pmc_irq_set_wake,
4258	.irq_set_type = tegra186_pmc_irq_set_type,
4259	.reset_sources = tegra234_reset_sources,
4260	.num_reset_sources = ARRAY_SIZE(tegra234_reset_sources),
4261	.reset_levels = tegra186_reset_levels,
4262	.num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
4263	.num_wake_events = ARRAY_SIZE(tegra234_wake_events),
4264	.wake_events = tegra234_wake_events,
4265	.max_wake_events = 96,
4266	.max_wake_vectors = 3,
4267	.pmc_clks_data = NULL,
4268	.num_pmc_clks = 0,
4269	.has_blink_output = false,
4270};
4271
4272static const struct of_device_id tegra_pmc_match[] = {
4273	{ .compatible = "nvidia,tegra234-pmc", .data = &tegra234_pmc_soc },
4274	{ .compatible = "nvidia,tegra194-pmc", .data = &tegra194_pmc_soc },
4275	{ .compatible = "nvidia,tegra186-pmc", .data = &tegra186_pmc_soc },
4276	{ .compatible = "nvidia,tegra210-pmc", .data = &tegra210_pmc_soc },
4277	{ .compatible = "nvidia,tegra132-pmc", .data = &tegra124_pmc_soc },
4278	{ .compatible = "nvidia,tegra124-pmc", .data = &tegra124_pmc_soc },
4279	{ .compatible = "nvidia,tegra114-pmc", .data = &tegra114_pmc_soc },
4280	{ .compatible = "nvidia,tegra30-pmc", .data = &tegra30_pmc_soc },
4281	{ .compatible = "nvidia,tegra20-pmc", .data = &tegra20_pmc_soc },
4282	{ }
4283};
4284
4285static void tegra_pmc_sync_state(struct device *dev)
4286{
4287	int err;
4288
4289	/*
4290	 * Newer device-trees have power domains, but we need to prepare all
4291	 * device drivers with runtime PM and OPP support first, otherwise
4292	 * state syncing is unsafe.
4293	 */
4294	if (!pmc->soc->supports_core_domain)
4295		return;
4296
4297	/*
4298	 * Older device-trees don't have core PD, and thus, there are
4299	 * no dependencies that will block the state syncing. We shouldn't
4300	 * mark the domain as synced in this case.
4301	 */
4302	if (!pmc->core_domain_registered)
4303		return;
4304
4305	pmc->core_domain_state_synced = true;
4306
4307	/* this is a no-op if core regulator isn't used */
4308	mutex_lock(&pmc->powergates_lock);
4309	err = dev_pm_opp_sync_regulators(dev);
4310	mutex_unlock(&pmc->powergates_lock);
4311
4312	if (err)
4313		dev_err(dev, "failed to sync regulators: %d\n", err);
4314}
4315
4316static struct platform_driver tegra_pmc_driver = {
4317	.driver = {
4318		.name = "tegra-pmc",
4319		.suppress_bind_attrs = true,
4320		.of_match_table = tegra_pmc_match,
4321#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_ARM)
4322		.pm = &tegra_pmc_pm_ops,
4323#endif
4324		.sync_state = tegra_pmc_sync_state,
4325	},
4326	.probe = tegra_pmc_probe,
4327};
4328builtin_platform_driver(tegra_pmc_driver);
4329
4330static bool __init tegra_pmc_detect_tz_only(struct tegra_pmc *pmc)
4331{
4332	u32 value, saved;
4333
4334	saved = readl(pmc->base + pmc->soc->regs->scratch0);
4335	value = saved ^ 0xffffffff;
4336
4337	if (value == 0xffffffff)
4338		value = 0xdeadbeef;
4339
4340	/* write pattern and read it back */
4341	writel(value, pmc->base + pmc->soc->regs->scratch0);
4342	value = readl(pmc->base + pmc->soc->regs->scratch0);
4343
4344	/* if we read all-zeroes, access is restricted to TZ only */
4345	if (value == 0) {
4346		pr_info("access to PMC is restricted to TZ\n");
4347		return true;
4348	}
4349
4350	/* restore original value */
4351	writel(saved, pmc->base + pmc->soc->regs->scratch0);
4352
4353	return false;
4354}
4355
4356/*
4357 * Early initialization to allow access to registers in the very early boot
4358 * process.
4359 */
4360static int __init tegra_pmc_early_init(void)
4361{
4362	const struct of_device_id *match;
4363	struct device_node *np;
4364	struct resource regs;
4365	unsigned int i;
4366	bool invert;
4367
4368	mutex_init(&pmc->powergates_lock);
4369
4370	np = of_find_matching_node_and_match(NULL, tegra_pmc_match, &match);
4371	if (!np) {
4372		/*
4373		 * Fall back to legacy initialization for 32-bit ARM only. All
4374		 * 64-bit ARM device tree files for Tegra are required to have
4375		 * a PMC node.
4376		 *
4377		 * This is for backwards-compatibility with old device trees
4378		 * that didn't contain a PMC node. Note that in this case the
4379		 * SoC data can't be matched and therefore powergating is
4380		 * disabled.
4381		 */
4382		if (IS_ENABLED(CONFIG_ARM) && soc_is_tegra()) {
4383			pr_warn("DT node not found, powergating disabled\n");
4384
4385			regs.start = 0x7000e400;
4386			regs.end = 0x7000e7ff;
4387			regs.flags = IORESOURCE_MEM;
4388
4389			pr_warn("Using memory region %pR\n", &regs);
4390		} else {
4391			/*
4392			 * At this point we're not running on Tegra, so play
4393			 * nice with multi-platform kernels.
4394			 */
4395			return 0;
4396		}
4397	} else {
4398		/*
4399		 * Extract information from the device tree if we've found a
4400		 * matching node.
4401		 */
4402		if (of_address_to_resource(np, 0, &regs) < 0) {
4403			pr_err("failed to get PMC registers\n");
4404			of_node_put(np);
4405			return -ENXIO;
4406		}
4407	}
4408
4409	pmc->base = ioremap(regs.start, resource_size(&regs));
4410	if (!pmc->base) {
4411		pr_err("failed to map PMC registers\n");
4412		of_node_put(np);
4413		return -ENXIO;
4414	}
4415
4416	if (of_device_is_available(np)) {
4417		pmc->soc = match->data;
4418
4419		if (pmc->soc->maybe_tz_only)
4420			pmc->tz_only = tegra_pmc_detect_tz_only(pmc);
4421
4422		/* Create a bitmap of the available and valid partitions */
4423		for (i = 0; i < pmc->soc->num_powergates; i++)
4424			if (pmc->soc->powergates[i])
4425				set_bit(i, pmc->powergates_available);
4426
4427		/*
4428		 * Invert the interrupt polarity if a PMC device tree node
4429		 * exists and contains the nvidia,invert-interrupt property.
4430		 */
4431		invert = of_property_read_bool(np, "nvidia,invert-interrupt");
4432
4433		pmc->soc->setup_irq_polarity(pmc, np, invert);
4434
4435		of_node_put(np);
4436	}
4437
4438	return 0;
4439}
4440early_initcall(tegra_pmc_early_init);
4441