brintos

brintos / linux-shallow public Read only

0
0
Text · 84.7 KiB · 270a94a Raw
3374 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * ti-sysc.c - Texas Instruments sysc interconnect target driver4 *5 * TI SoCs have an interconnect target wrapper IP for many devices. The wrapper6 * IP manages clock gating, resets, and PM capabilities for the connected devices.7 *8 * Copyright (C) 2017-2024 Texas Instruments Incorporated - https://www.ti.com/9 *10 * Many features are based on the earlier omap_hwmod arch code with thanks to all11 * the people who developed and debugged the code over the years:12 *13 * Copyright (C) 2009-2011 Nokia Corporation14 * Copyright (C) 2011-2021 Texas Instruments Incorporated - https://www.ti.com/15 */16 17#include <linux/io.h>18#include <linux/clk.h>19#include <linux/clkdev.h>20#include <linux/cpu_pm.h>21#include <linux/delay.h>22#include <linux/list.h>23#include <linux/module.h>24#include <linux/platform_device.h>25#include <linux/pm_domain.h>26#include <linux/pm_runtime.h>27#include <linux/reset.h>28#include <linux/of_address.h>29#include <linux/of_platform.h>30#include <linux/slab.h>31#include <linux/sys_soc.h>32#include <linux/timekeeping.h>33#include <linux/iopoll.h>34 35#include <linux/platform_data/ti-sysc.h>36 37#include <dt-bindings/bus/ti-sysc.h>38 39#define DIS_ISP		BIT(2)40#define DIS_IVA		BIT(1)41#define DIS_SGX		BIT(0)42 43#define SOC_FLAG(match, flag)	{ .machine = match, .data = (void *)(flag), }44 45#define MAX_MODULE_SOFTRESET_WAIT		1000046 47enum sysc_soc {48	SOC_UNKNOWN,49	SOC_2420,50	SOC_2430,51	SOC_3430,52	SOC_AM35,53	SOC_3630,54	SOC_4430,55	SOC_4460,56	SOC_4470,57	SOC_5430,58	SOC_AM3,59	SOC_AM4,60	SOC_DRA7,61};62 63struct sysc_address {64	unsigned long base;65	struct list_head node;66};67 68struct sysc_module {69	struct sysc *ddata;70	struct list_head node;71};72 73struct sysc_soc_info {74	unsigned long general_purpose:1;75	enum sysc_soc soc;76	struct mutex list_lock;	/* disabled and restored modules list lock */77	struct list_head disabled_modules;78	struct list_head restored_modules;79	struct notifier_block nb;80};81 82enum sysc_clocks {83	SYSC_FCK,84	SYSC_ICK,85	SYSC_OPTFCK0,86	SYSC_OPTFCK1,87	SYSC_OPTFCK2,88	SYSC_OPTFCK3,89	SYSC_OPTFCK4,90	SYSC_OPTFCK5,91	SYSC_OPTFCK6,92	SYSC_OPTFCK7,93	SYSC_MAX_CLOCKS,94};95 96static struct sysc_soc_info *sysc_soc;97static const char * const reg_names[] = { "rev", "sysc", "syss", };98static const char * const clock_names[SYSC_MAX_CLOCKS] = {99	"fck", "ick", "opt0", "opt1", "opt2", "opt3", "opt4",100	"opt5", "opt6", "opt7",101};102 103#define SYSC_IDLEMODE_MASK		3104#define SYSC_CLOCKACTIVITY_MASK		3105 106/**107 * struct sysc - TI sysc interconnect target module registers and capabilities108 * @dev: struct device pointer109 * @module_pa: physical address of the interconnect target module110 * @module_size: size of the interconnect target module111 * @module_va: virtual address of the interconnect target module112 * @offsets: register offsets from module base113 * @mdata: ti-sysc to hwmod translation data for a module114 * @clocks: clocks used by the interconnect target module115 * @clock_roles: clock role names for the found clocks116 * @nr_clocks: number of clocks used by the interconnect target module117 * @rsts: resets used by the interconnect target module118 * @legacy_mode: configured for legacy mode if set119 * @cap: interconnect target module capabilities120 * @cfg: interconnect target module configuration121 * @cookie: data used by legacy platform callbacks122 * @name: name if available123 * @revision: interconnect target module revision124 * @sysconfig: saved sysconfig register value125 * @reserved: target module is reserved and already in use126 * @enabled: sysc runtime enabled status127 * @needs_resume: runtime resume needed on resume from suspend128 * @child_needs_resume: runtime resume needed for child on resume from suspend129 * @idle_work: work structure used to perform delayed idle on a module130 * @pre_reset_quirk: module specific pre-reset quirk131 * @post_reset_quirk: module specific post-reset quirk132 * @reset_done_quirk: module specific reset done quirk133 * @module_enable_quirk: module specific enable quirk134 * @module_disable_quirk: module specific disable quirk135 * @module_unlock_quirk: module specific sysconfig unlock quirk136 * @module_lock_quirk: module specific sysconfig lock quirk137 */138struct sysc {139	struct device *dev;140	u64 module_pa;141	u32 module_size;142	void __iomem *module_va;143	int offsets[SYSC_MAX_REGS];144	struct ti_sysc_module_data *mdata;145	struct clk **clocks;146	const char **clock_roles;147	int nr_clocks;148	struct reset_control *rsts;149	const char *legacy_mode;150	const struct sysc_capabilities *cap;151	struct sysc_config cfg;152	struct ti_sysc_cookie cookie;153	const char *name;154	u32 revision;155	u32 sysconfig;156	unsigned int reserved:1;157	unsigned int enabled:1;158	unsigned int needs_resume:1;159	unsigned int child_needs_resume:1;160	struct delayed_work idle_work;161	void (*pre_reset_quirk)(struct sysc *sysc);162	void (*post_reset_quirk)(struct sysc *sysc);163	void (*reset_done_quirk)(struct sysc *sysc);164	void (*module_enable_quirk)(struct sysc *sysc);165	void (*module_disable_quirk)(struct sysc *sysc);166	void (*module_unlock_quirk)(struct sysc *sysc);167	void (*module_lock_quirk)(struct sysc *sysc);168};169 170static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,171				  bool is_child);172static int sysc_reset(struct sysc *ddata);173 174static void sysc_write(struct sysc *ddata, int offset, u32 value)175{176	if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {177		writew_relaxed(value & 0xffff, ddata->module_va + offset);178 179		/* Only i2c revision has LO and HI register with stride of 4 */180		if (ddata->offsets[SYSC_REVISION] >= 0 &&181		    offset == ddata->offsets[SYSC_REVISION]) {182			u16 hi = value >> 16;183 184			writew_relaxed(hi, ddata->module_va + offset + 4);185		}186 187		return;188	}189 190	writel_relaxed(value, ddata->module_va + offset);191}192 193static u32 sysc_read(struct sysc *ddata, int offset)194{195	if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {196		u32 val;197 198		val = readw_relaxed(ddata->module_va + offset);199 200		/* Only i2c revision has LO and HI register with stride of 4 */201		if (ddata->offsets[SYSC_REVISION] >= 0 &&202		    offset == ddata->offsets[SYSC_REVISION]) {203			u16 tmp = readw_relaxed(ddata->module_va + offset + 4);204 205			val |= tmp << 16;206		}207 208		return val;209	}210 211	return readl_relaxed(ddata->module_va + offset);212}213 214static bool sysc_opt_clks_needed(struct sysc *ddata)215{216	return !!(ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_NEEDED);217}218 219static u32 sysc_read_revision(struct sysc *ddata)220{221	int offset = ddata->offsets[SYSC_REVISION];222 223	if (offset < 0)224		return 0;225 226	return sysc_read(ddata, offset);227}228 229static u32 sysc_read_sysconfig(struct sysc *ddata)230{231	int offset = ddata->offsets[SYSC_SYSCONFIG];232 233	if (offset < 0)234		return 0;235 236	return sysc_read(ddata, offset);237}238 239static u32 sysc_read_sysstatus(struct sysc *ddata)240{241	int offset = ddata->offsets[SYSC_SYSSTATUS];242 243	if (offset < 0)244		return 0;245 246	return sysc_read(ddata, offset);247}248 249static int sysc_poll_reset_sysstatus(struct sysc *ddata)250{251	int error, retries;252	u32 syss_done, rstval;253 254	if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED)255		syss_done = 0;256	else257		syss_done = ddata->cfg.syss_mask;258 259	if (likely(!timekeeping_suspended)) {260		error = readx_poll_timeout_atomic(sysc_read_sysstatus, ddata,261				rstval, (rstval & ddata->cfg.syss_mask) ==262				syss_done, 100, MAX_MODULE_SOFTRESET_WAIT);263	} else {264		retries = MAX_MODULE_SOFTRESET_WAIT;265		while (retries--) {266			rstval = sysc_read_sysstatus(ddata);267			if ((rstval & ddata->cfg.syss_mask) == syss_done)268				return 0;269			udelay(2); /* Account for udelay flakeyness */270		}271		error = -ETIMEDOUT;272	}273 274	return error;275}276 277static int sysc_poll_reset_sysconfig(struct sysc *ddata)278{279	int error, retries;280	u32 sysc_mask, rstval;281 282	sysc_mask = BIT(ddata->cap->regbits->srst_shift);283 284	if (likely(!timekeeping_suspended)) {285		error = readx_poll_timeout_atomic(sysc_read_sysconfig, ddata,286				rstval, !(rstval & sysc_mask),287				100, MAX_MODULE_SOFTRESET_WAIT);288	} else {289		retries = MAX_MODULE_SOFTRESET_WAIT;290		while (retries--) {291			rstval = sysc_read_sysconfig(ddata);292			if (!(rstval & sysc_mask))293				return 0;294			udelay(2); /* Account for udelay flakeyness */295		}296		error = -ETIMEDOUT;297	}298 299	return error;300}301 302/* Poll on reset status */303static int sysc_wait_softreset(struct sysc *ddata)304{305	int syss_offset, error = 0;306 307	if (ddata->cap->regbits->srst_shift < 0)308		return 0;309 310	syss_offset = ddata->offsets[SYSC_SYSSTATUS];311 312	if (syss_offset >= 0)313		error = sysc_poll_reset_sysstatus(ddata);314	else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS)315		error = sysc_poll_reset_sysconfig(ddata);316 317	return error;318}319 320static int sysc_add_named_clock_from_child(struct sysc *ddata,321					   const char *name,322					   const char *optfck_name)323{324	struct device_node *np = ddata->dev->of_node;325	struct device_node *child;326	struct clk_lookup *cl;327	struct clk *clock;328	const char *n;329 330	if (name)331		n = name;332	else333		n = optfck_name;334 335	/* Does the clock alias already exist? */336	clock = of_clk_get_by_name(np, n);337	if (!IS_ERR(clock)) {338		clk_put(clock);339 340		return 0;341	}342 343	child = of_get_next_available_child(np, NULL);344	if (!child)345		return -ENODEV;346 347	clock = devm_get_clk_from_child(ddata->dev, child, name);348	if (IS_ERR(clock))349		return PTR_ERR(clock);350 351	/*352	 * Use clkdev_add() instead of clkdev_alloc() to avoid the MAX_DEV_ID353	 * limit for clk_get(). If cl ever needs to be freed, it should be done354	 * with clkdev_drop().355	 */356	cl = kzalloc(sizeof(*cl), GFP_KERNEL);357	if (!cl)358		return -ENOMEM;359 360	cl->con_id = n;361	cl->dev_id = dev_name(ddata->dev);362	cl->clk = clock;363	clkdev_add(cl);364 365	clk_put(clock);366 367	return 0;368}369 370static int sysc_init_ext_opt_clock(struct sysc *ddata, const char *name)371{372	const char *optfck_name;373	int error, index;374 375	if (ddata->nr_clocks < SYSC_OPTFCK0)376		index = SYSC_OPTFCK0;377	else378		index = ddata->nr_clocks;379 380	if (name)381		optfck_name = name;382	else383		optfck_name = clock_names[index];384 385	error = sysc_add_named_clock_from_child(ddata, name, optfck_name);386	if (error)387		return error;388 389	ddata->clock_roles[index] = optfck_name;390	ddata->nr_clocks++;391 392	return 0;393}394 395static int sysc_get_one_clock(struct sysc *ddata, const char *name)396{397	int error, i, index = -ENODEV;398 399	if (!strncmp(clock_names[SYSC_FCK], name, 3))400		index = SYSC_FCK;401	else if (!strncmp(clock_names[SYSC_ICK], name, 3))402		index = SYSC_ICK;403 404	if (index < 0) {405		for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {406			if (!ddata->clocks[i]) {407				index = i;408				break;409			}410		}411	}412 413	if (index < 0) {414		dev_err(ddata->dev, "clock %s not added\n", name);415		return index;416	}417 418	ddata->clocks[index] = devm_clk_get(ddata->dev, name);419	if (IS_ERR(ddata->clocks[index])) {420		dev_err(ddata->dev, "clock get error for %s: %li\n",421			name, PTR_ERR(ddata->clocks[index]));422 423		return PTR_ERR(ddata->clocks[index]);424	}425 426	error = clk_prepare(ddata->clocks[index]);427	if (error) {428		dev_err(ddata->dev, "clock prepare error for %s: %i\n",429			name, error);430 431		return error;432	}433 434	return 0;435}436 437static int sysc_get_clocks(struct sysc *ddata)438{439	struct device_node *np = ddata->dev->of_node;440	struct property *prop;441	const char *name;442	int nr_fck = 0, nr_ick = 0, i, error = 0;443 444	ddata->clock_roles = devm_kcalloc(ddata->dev,445					  SYSC_MAX_CLOCKS,446					  sizeof(*ddata->clock_roles),447					  GFP_KERNEL);448	if (!ddata->clock_roles)449		return -ENOMEM;450 451	of_property_for_each_string(np, "clock-names", prop, name) {452		if (!strncmp(clock_names[SYSC_FCK], name, 3))453			nr_fck++;454		if (!strncmp(clock_names[SYSC_ICK], name, 3))455			nr_ick++;456		ddata->clock_roles[ddata->nr_clocks] = name;457		ddata->nr_clocks++;458	}459 460	if (ddata->nr_clocks < 1)461		return 0;462 463	if ((ddata->cfg.quirks & SYSC_QUIRK_EXT_OPT_CLOCK)) {464		error = sysc_init_ext_opt_clock(ddata, NULL);465		if (error)466			return error;467	}468 469	if (ddata->nr_clocks > SYSC_MAX_CLOCKS) {470		dev_err(ddata->dev, "too many clocks for %pOF\n", np);471 472		return -EINVAL;473	}474 475	if (nr_fck > 1 || nr_ick > 1) {476		dev_err(ddata->dev, "max one fck and ick for %pOF\n", np);477 478		return -EINVAL;479	}480 481	/* Always add a slot for main clocks fck and ick even if unused */482	if (!nr_fck)483		ddata->nr_clocks++;484	if (!nr_ick)485		ddata->nr_clocks++;486 487	ddata->clocks = devm_kcalloc(ddata->dev,488				     ddata->nr_clocks, sizeof(*ddata->clocks),489				     GFP_KERNEL);490	if (!ddata->clocks)491		return -ENOMEM;492 493	for (i = 0; i < SYSC_MAX_CLOCKS; i++) {494		const char *name = ddata->clock_roles[i];495 496		if (!name)497			continue;498 499		error = sysc_get_one_clock(ddata, name);500		if (error)501			return error;502	}503 504	return 0;505}506 507static int sysc_enable_main_clocks(struct sysc *ddata)508{509	struct clk *clock;510	int i, error;511 512	if (!ddata->clocks)513		return 0;514 515	for (i = 0; i < SYSC_OPTFCK0; i++) {516		clock = ddata->clocks[i];517 518		/* Main clocks may not have ick */519		if (IS_ERR_OR_NULL(clock))520			continue;521 522		error = clk_enable(clock);523		if (error)524			goto err_disable;525	}526 527	return 0;528 529err_disable:530	for (i--; i >= 0; i--) {531		clock = ddata->clocks[i];532 533		/* Main clocks may not have ick */534		if (IS_ERR_OR_NULL(clock))535			continue;536 537		clk_disable(clock);538	}539 540	return error;541}542 543static void sysc_disable_main_clocks(struct sysc *ddata)544{545	struct clk *clock;546	int i;547 548	if (!ddata->clocks)549		return;550 551	for (i = 0; i < SYSC_OPTFCK0; i++) {552		clock = ddata->clocks[i];553		if (IS_ERR_OR_NULL(clock))554			continue;555 556		clk_disable(clock);557	}558}559 560static int sysc_enable_opt_clocks(struct sysc *ddata)561{562	struct clk *clock;563	int i, error;564 565	if (!ddata->clocks || ddata->nr_clocks < SYSC_OPTFCK0 + 1)566		return 0;567 568	for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {569		clock = ddata->clocks[i];570 571		/* Assume no holes for opt clocks */572		if (IS_ERR_OR_NULL(clock))573			return 0;574 575		error = clk_enable(clock);576		if (error)577			goto err_disable;578	}579 580	return 0;581 582err_disable:583	for (i--; i >= 0; i--) {584		clock = ddata->clocks[i];585		if (IS_ERR_OR_NULL(clock))586			continue;587 588		clk_disable(clock);589	}590 591	return error;592}593 594static void sysc_disable_opt_clocks(struct sysc *ddata)595{596	struct clk *clock;597	int i;598 599	if (!ddata->clocks || ddata->nr_clocks < SYSC_OPTFCK0 + 1)600		return;601 602	for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {603		clock = ddata->clocks[i];604 605		/* Assume no holes for opt clocks */606		if (IS_ERR_OR_NULL(clock))607			return;608 609		clk_disable(clock);610	}611}612 613static void sysc_clkdm_deny_idle(struct sysc *ddata)614{615	struct ti_sysc_platform_data *pdata;616 617	if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))618		return;619 620	pdata = dev_get_platdata(ddata->dev);621	if (pdata && pdata->clkdm_deny_idle)622		pdata->clkdm_deny_idle(ddata->dev, &ddata->cookie);623}624 625static void sysc_clkdm_allow_idle(struct sysc *ddata)626{627	struct ti_sysc_platform_data *pdata;628 629	if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))630		return;631 632	pdata = dev_get_platdata(ddata->dev);633	if (pdata && pdata->clkdm_allow_idle)634		pdata->clkdm_allow_idle(ddata->dev, &ddata->cookie);635}636 637/**638 * sysc_init_resets - init rstctrl reset line if configured639 * @ddata: device driver data640 *641 * See sysc_rstctrl_reset_deassert().642 */643static int sysc_init_resets(struct sysc *ddata)644{645	ddata->rsts =646		devm_reset_control_get_optional_shared(ddata->dev, "rstctrl");647 648	return PTR_ERR_OR_ZERO(ddata->rsts);649}650 651/**652 * sysc_parse_and_check_child_range - parses module IO region from ranges653 * @ddata: device driver data654 *655 * In general we only need rev, syss, and sysc registers and not the whole656 * module range. But we do want the offsets for these registers from the657 * module base. This allows us to check them against the legacy hwmod658 * platform data. Let's also check the ranges are configured properly.659 */660static int sysc_parse_and_check_child_range(struct sysc *ddata)661{662	struct device_node *np = ddata->dev->of_node;663	struct of_range_parser parser;664	struct of_range range;665	int error;666 667	error = of_range_parser_init(&parser, np);668	if (error)669		return error;670 671	for_each_of_range(&parser, &range) {672		ddata->module_pa = range.cpu_addr;673		ddata->module_size = range.size;674		break;675	}676 677	return 0;678}679 680/* Interconnect instances to probe before l4_per instances */681static struct resource early_bus_ranges[] = {682	/* am3/4 l4_wkup */683	{ .start = 0x44c00000, .end = 0x44c00000 + 0x300000, },684	/* omap4/5 and dra7 l4_cfg */685	{ .start = 0x4a000000, .end = 0x4a000000 + 0x300000, },686	/* omap4 l4_wkup */687	{ .start = 0x4a300000, .end = 0x4a300000 + 0x30000,  },688	/* omap5 and dra7 l4_wkup without dra7 dcan segment */689	{ .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000,  },690};691 692static atomic_t sysc_defer = ATOMIC_INIT(10);693 694/**695 * sysc_defer_non_critical - defer non_critical interconnect probing696 * @ddata: device driver data697 *698 * We want to probe l4_cfg and l4_wkup interconnect instances before any699 * l4_per instances as l4_per instances depend on resources on l4_cfg and700 * l4_wkup interconnects.701 */702static int sysc_defer_non_critical(struct sysc *ddata)703{704	struct resource *res;705	int i;706 707	if (!atomic_read(&sysc_defer))708		return 0;709 710	for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) {711		res = &early_bus_ranges[i];712		if (ddata->module_pa >= res->start &&713		    ddata->module_pa <= res->end) {714			atomic_set(&sysc_defer, 0);715 716			return 0;717		}718	}719 720	atomic_dec_if_positive(&sysc_defer);721 722	return -EPROBE_DEFER;723}724 725static struct device_node *stdout_path;726 727static void sysc_init_stdout_path(struct sysc *ddata)728{729	struct device_node *np = NULL;730	const char *uart;731 732	if (IS_ERR(stdout_path))733		return;734 735	if (stdout_path)736		return;737 738	np = of_find_node_by_path("/chosen");739	if (!np)740		goto err;741 742	uart = of_get_property(np, "stdout-path", NULL);743	if (!uart)744		goto err;745 746	np = of_find_node_by_path(uart);747	if (!np)748		goto err;749 750	stdout_path = np;751 752	return;753 754err:755	stdout_path = ERR_PTR(-ENODEV);756}757 758static void sysc_check_quirk_stdout(struct sysc *ddata,759				    struct device_node *np)760{761	sysc_init_stdout_path(ddata);762	if (np != stdout_path)763		return;764 765	ddata->cfg.quirks |= SYSC_QUIRK_NO_IDLE_ON_INIT |766				SYSC_QUIRK_NO_RESET_ON_INIT;767}768 769/**770 * sysc_check_one_child - check child configuration771 * @ddata: device driver data772 * @np: child device node773 *774 * Let's avoid messy situations where we have new interconnect target775 * node but children have "ti,hwmods". These belong to the interconnect776 * target node and are managed by this driver.777 */778static void sysc_check_one_child(struct sysc *ddata,779				 struct device_node *np)780{781	const char *name;782 783	name = of_get_property(np, "ti,hwmods", NULL);784	if (name && !of_device_is_compatible(np, "ti,sysc"))785		dev_warn(ddata->dev, "really a child ti,hwmods property?");786 787	sysc_check_quirk_stdout(ddata, np);788	sysc_parse_dts_quirks(ddata, np, true);789}790 791static void sysc_check_children(struct sysc *ddata)792{793	struct device_node *child;794 795	for_each_child_of_node(ddata->dev->of_node, child)796		sysc_check_one_child(ddata, child);797}798 799/*800 * So far only I2C uses 16-bit read access with clockactivity with revision801 * in two registers with stride of 4. We can detect this based on the rev802 * register size to configure things far enough to be able to properly read803 * the revision register.804 */805static void sysc_check_quirk_16bit(struct sysc *ddata, struct resource *res)806{807	if (resource_size(res) == 8)808		ddata->cfg.quirks |= SYSC_QUIRK_16BIT | SYSC_QUIRK_USE_CLOCKACT;809}810 811/**812 * sysc_parse_one - parses the interconnect target module registers813 * @ddata: device driver data814 * @reg: register to parse815 */816static int sysc_parse_one(struct sysc *ddata, enum sysc_registers reg)817{818	struct resource *res;819	const char *name;820 821	switch (reg) {822	case SYSC_REVISION:823	case SYSC_SYSCONFIG:824	case SYSC_SYSSTATUS:825		name = reg_names[reg];826		break;827	default:828		return -EINVAL;829	}830 831	res = platform_get_resource_byname(to_platform_device(ddata->dev),832					   IORESOURCE_MEM, name);833	if (!res) {834		ddata->offsets[reg] = -ENODEV;835 836		return 0;837	}838 839	ddata->offsets[reg] = res->start - ddata->module_pa;840	if (reg == SYSC_REVISION)841		sysc_check_quirk_16bit(ddata, res);842 843	return 0;844}845 846static int sysc_parse_registers(struct sysc *ddata)847{848	int i, error;849 850	for (i = 0; i < SYSC_MAX_REGS; i++) {851		error = sysc_parse_one(ddata, i);852		if (error)853			return error;854	}855 856	return 0;857}858 859/**860 * sysc_check_registers - check for misconfigured register overlaps861 * @ddata: device driver data862 */863static int sysc_check_registers(struct sysc *ddata)864{865	int i, j, nr_regs = 0, nr_matches = 0;866 867	for (i = 0; i < SYSC_MAX_REGS; i++) {868		if (ddata->offsets[i] < 0)869			continue;870 871		if (ddata->offsets[i] > (ddata->module_size - 4)) {872			dev_err(ddata->dev, "register outside module range");873 874				return -EINVAL;875		}876 877		for (j = 0; j < SYSC_MAX_REGS; j++) {878			if (ddata->offsets[j] < 0)879				continue;880 881			if (ddata->offsets[i] == ddata->offsets[j])882				nr_matches++;883		}884		nr_regs++;885	}886 887	if (nr_matches > nr_regs) {888		dev_err(ddata->dev, "overlapping registers: (%i/%i)",889			nr_regs, nr_matches);890 891		return -EINVAL;892	}893 894	return 0;895}896 897/**898 * sysc_ioremap - ioremap register space for the interconnect target module899 * @ddata: device driver data900 *901 * Note that the interconnect target module registers can be anywhere902 * within the interconnect target module range. For example, SGX has903 * them at offset 0x1fc00 in the 32MB module address space. And cpsw904 * has them at offset 0x1200 in the CPSW_WR child. Usually the905 * interconnect target module registers are at the beginning of906 * the module range though.907 */908static int sysc_ioremap(struct sysc *ddata)909{910	int size;911 912	if (ddata->offsets[SYSC_REVISION] < 0 &&913	    ddata->offsets[SYSC_SYSCONFIG] < 0 &&914	    ddata->offsets[SYSC_SYSSTATUS] < 0) {915		size = ddata->module_size;916	} else {917		size = max3(ddata->offsets[SYSC_REVISION],918			    ddata->offsets[SYSC_SYSCONFIG],919			    ddata->offsets[SYSC_SYSSTATUS]);920 921		if (size < SZ_1K)922			size = SZ_1K;923 924		if ((size + sizeof(u32)) > ddata->module_size)925			size = ddata->module_size;926	}927 928	ddata->module_va = devm_ioremap(ddata->dev,929					ddata->module_pa,930					size + sizeof(u32));931	if (!ddata->module_va)932		return -EIO;933 934	return 0;935}936 937/**938 * sysc_map_and_check_registers - ioremap and check device registers939 * @ddata: device driver data940 */941static int sysc_map_and_check_registers(struct sysc *ddata)942{943	struct device_node *np = ddata->dev->of_node;944	int error;945 946	error = sysc_parse_and_check_child_range(ddata);947	if (error)948		return error;949 950	error = sysc_defer_non_critical(ddata);951	if (error)952		return error;953 954	sysc_check_children(ddata);955 956	if (!of_property_present(np, "reg"))957		return 0;958 959	error = sysc_parse_registers(ddata);960	if (error)961		return error;962 963	error = sysc_ioremap(ddata);964	if (error)965		return error;966 967	error = sysc_check_registers(ddata);968	if (error)969		return error;970 971	return 0;972}973 974/**975 * sysc_show_rev - read and show interconnect target module revision976 * @bufp: buffer to print the information to977 * @ddata: device driver data978 */979static int sysc_show_rev(char *bufp, struct sysc *ddata)980{981	int len;982 983	if (ddata->offsets[SYSC_REVISION] < 0)984		return sprintf(bufp, ":NA");985 986	len = sprintf(bufp, ":%08x", ddata->revision);987 988	return len;989}990 991static int sysc_show_reg(struct sysc *ddata,992			 char *bufp, enum sysc_registers reg)993{994	if (ddata->offsets[reg] < 0)995		return sprintf(bufp, ":NA");996 997	return sprintf(bufp, ":%x", ddata->offsets[reg]);998}999 1000static int sysc_show_name(char *bufp, struct sysc *ddata)1001{1002	if (!ddata->name)1003		return 0;1004 1005	return sprintf(bufp, ":%s", ddata->name);1006}1007 1008/**1009 * sysc_show_registers - show information about interconnect target module1010 * @ddata: device driver data1011 */1012static void sysc_show_registers(struct sysc *ddata)1013{1014	char buf[128];1015	char *bufp = buf;1016	int i;1017 1018	for (i = 0; i < SYSC_MAX_REGS; i++)1019		bufp += sysc_show_reg(ddata, bufp, i);1020 1021	bufp += sysc_show_rev(bufp, ddata);1022	bufp += sysc_show_name(bufp, ddata);1023 1024	dev_dbg(ddata->dev, "%llx:%x%s\n",1025		ddata->module_pa, ddata->module_size,1026		buf);1027}1028 1029/**1030 * sysc_write_sysconfig - handle sysconfig quirks for register write1031 * @ddata: device driver data1032 * @value: register value1033 */1034static void sysc_write_sysconfig(struct sysc *ddata, u32 value)1035{1036	if (ddata->module_unlock_quirk)1037		ddata->module_unlock_quirk(ddata);1038 1039	sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], value);1040 1041	if (ddata->module_lock_quirk)1042		ddata->module_lock_quirk(ddata);1043}1044 1045#define SYSC_IDLE_MASK	(SYSC_NR_IDLEMODES - 1)1046#define SYSC_CLOCACT_ICK	21047 1048/* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */1049static int sysc_enable_module(struct device *dev)1050{1051	struct sysc *ddata;1052	const struct sysc_regbits *regbits;1053	u32 reg, idlemodes, best_mode;1054	int error;1055 1056	ddata = dev_get_drvdata(dev);1057 1058	/*1059	 * Some modules like DSS reset automatically on idle. Enable optional1060	 * reset clocks and wait for OCP softreset to complete.1061	 */1062	if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET) {1063		error = sysc_enable_opt_clocks(ddata);1064		if (error) {1065			dev_err(ddata->dev,1066				"Optional clocks failed for enable: %i\n",1067				error);1068			return error;1069		}1070	}1071	/*1072	 * Some modules like i2c and hdq1w have unusable reset status unless1073	 * the module reset quirk is enabled. Skip status check on enable.1074	 */1075	if (!(ddata->cfg.quirks & SYSC_MODULE_QUIRK_ENA_RESETDONE)) {1076		error = sysc_wait_softreset(ddata);1077		if (error)1078			dev_warn(ddata->dev, "OCP softreset timed out\n");1079	}1080	if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET)1081		sysc_disable_opt_clocks(ddata);1082 1083	/*1084	 * Some subsystem private interconnects, like DSS top level module,1085	 * need only the automatic OCP softreset handling with no sysconfig1086	 * register bits to configure.1087	 */1088	if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)1089		return 0;1090 1091	regbits = ddata->cap->regbits;1092	reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);1093 1094	/*1095	 * Set CLOCKACTIVITY, we only use it for ick. And we only configure it1096	 * based on the SYSC_QUIRK_USE_CLOCKACT flag, not based on the hardware1097	 * capabilities. See the old HWMOD_SET_DEFAULT_CLOCKACT flag.1098	 */1099	if (regbits->clkact_shift >= 0 &&1100	    (ddata->cfg.quirks & SYSC_QUIRK_USE_CLOCKACT))1101		reg |= SYSC_CLOCACT_ICK << regbits->clkact_shift;1102 1103	/* Set SIDLE mode */1104	idlemodes = ddata->cfg.sidlemodes;1105	if (!idlemodes || regbits->sidle_shift < 0)1106		goto set_midle;1107 1108	if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE |1109				 SYSC_QUIRK_SWSUP_SIDLE_ACT)) {1110		best_mode = SYSC_IDLE_NO;1111 1112		/* Clear WAKEUP */1113		if (regbits->enwkup_shift >= 0 &&1114		    ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))1115			reg &= ~BIT(regbits->enwkup_shift);1116	} else {1117		best_mode = fls(ddata->cfg.sidlemodes) - 1;1118		if (best_mode > SYSC_IDLE_MASK) {1119			dev_err(dev, "%s: invalid sidlemode\n", __func__);1120			return -EINVAL;1121		}1122 1123		/* Set WAKEUP */1124		if (regbits->enwkup_shift >= 0 &&1125		    ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))1126			reg |= BIT(regbits->enwkup_shift);1127	}1128 1129	reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);1130	reg |= best_mode << regbits->sidle_shift;1131	sysc_write_sysconfig(ddata, reg);1132 1133set_midle:1134	/* Set MIDLE mode */1135	idlemodes = ddata->cfg.midlemodes;1136	if (!idlemodes || regbits->midle_shift < 0)1137		goto set_autoidle;1138 1139	best_mode = fls(ddata->cfg.midlemodes) - 1;1140	if (best_mode > SYSC_IDLE_MASK) {1141		dev_err(dev, "%s: invalid midlemode\n", __func__);1142		error = -EINVAL;1143		goto save_context;1144	}1145 1146	if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_MSTANDBY)1147		best_mode = SYSC_IDLE_NO;1148 1149	reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift);1150	reg |= best_mode << regbits->midle_shift;1151	sysc_write_sysconfig(ddata, reg);1152 1153set_autoidle:1154	/* Autoidle bit must enabled separately if available */1155	if (regbits->autoidle_shift >= 0 &&1156	    ddata->cfg.sysc_val & BIT(regbits->autoidle_shift)) {1157		reg |= 1 << regbits->autoidle_shift;1158		sysc_write_sysconfig(ddata, reg);1159	}1160 1161	error = 0;1162 1163save_context:1164	/* Save context and flush posted write */1165	ddata->sysconfig = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);1166 1167	if (ddata->module_enable_quirk)1168		ddata->module_enable_quirk(ddata);1169 1170	return error;1171}1172 1173static int sysc_best_idle_mode(u32 idlemodes, u32 *best_mode)1174{1175	if (idlemodes & BIT(SYSC_IDLE_SMART_WKUP))1176		*best_mode = SYSC_IDLE_SMART_WKUP;1177	else if (idlemodes & BIT(SYSC_IDLE_SMART))1178		*best_mode = SYSC_IDLE_SMART;1179	else if (idlemodes & BIT(SYSC_IDLE_FORCE))1180		*best_mode = SYSC_IDLE_FORCE;1181	else1182		return -EINVAL;1183 1184	return 0;1185}1186 1187/* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */1188static int sysc_disable_module(struct device *dev)1189{1190	struct sysc *ddata;1191	const struct sysc_regbits *regbits;1192	u32 reg, idlemodes, best_mode;1193	int ret;1194 1195	ddata = dev_get_drvdata(dev);1196	if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)1197		return 0;1198 1199	if (ddata->module_disable_quirk)1200		ddata->module_disable_quirk(ddata);1201 1202	regbits = ddata->cap->regbits;1203	reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);1204 1205	/* Set MIDLE mode */1206	idlemodes = ddata->cfg.midlemodes;1207	if (!idlemodes || regbits->midle_shift < 0)1208		goto set_sidle;1209 1210	ret = sysc_best_idle_mode(idlemodes, &best_mode);1211	if (ret) {1212		dev_err(dev, "%s: invalid midlemode\n", __func__);1213		return ret;1214	}1215 1216	if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_MSTANDBY) ||1217	    ddata->cfg.quirks & (SYSC_QUIRK_FORCE_MSTANDBY))1218		best_mode = SYSC_IDLE_FORCE;1219 1220	reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift);1221	reg |= best_mode << regbits->midle_shift;1222	sysc_write_sysconfig(ddata, reg);1223 1224set_sidle:1225	/* Set SIDLE mode */1226	idlemodes = ddata->cfg.sidlemodes;1227	if (!idlemodes || regbits->sidle_shift < 0) {1228		ret = 0;1229		goto save_context;1230	}1231 1232	if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE) {1233		best_mode = SYSC_IDLE_FORCE;1234	} else {1235		ret = sysc_best_idle_mode(idlemodes, &best_mode);1236		if (ret) {1237			dev_err(dev, "%s: invalid sidlemode\n", __func__);1238			ret = -EINVAL;1239			goto save_context;1240		}1241	}1242 1243	if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE_ACT) {1244		/* Set WAKEUP */1245		if (regbits->enwkup_shift >= 0 &&1246		    ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))1247			reg |= BIT(regbits->enwkup_shift);1248	}1249 1250	reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);1251	reg |= best_mode << regbits->sidle_shift;1252	if (regbits->autoidle_shift >= 0 &&1253	    ddata->cfg.sysc_val & BIT(regbits->autoidle_shift))1254		reg |= 1 << regbits->autoidle_shift;1255	sysc_write_sysconfig(ddata, reg);1256 1257	ret = 0;1258 1259save_context:1260	/* Save context and flush posted write */1261	ddata->sysconfig = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);1262 1263	return ret;1264}1265 1266static int __maybe_unused sysc_runtime_suspend_legacy(struct device *dev,1267						      struct sysc *ddata)1268{1269	struct ti_sysc_platform_data *pdata;1270	int error;1271 1272	pdata = dev_get_platdata(ddata->dev);1273	if (!pdata)1274		return 0;1275 1276	if (!pdata->idle_module)1277		return -ENODEV;1278 1279	error = pdata->idle_module(dev, &ddata->cookie);1280	if (error)1281		dev_err(dev, "%s: could not idle: %i\n",1282			__func__, error);1283 1284	reset_control_assert(ddata->rsts);1285 1286	return 0;1287}1288 1289static int __maybe_unused sysc_runtime_resume_legacy(struct device *dev,1290						     struct sysc *ddata)1291{1292	struct ti_sysc_platform_data *pdata;1293	int error;1294 1295	pdata = dev_get_platdata(ddata->dev);1296	if (!pdata)1297		return 0;1298 1299	if (!pdata->enable_module)1300		return -ENODEV;1301 1302	error = pdata->enable_module(dev, &ddata->cookie);1303	if (error)1304		dev_err(dev, "%s: could not enable: %i\n",1305			__func__, error);1306 1307	reset_control_deassert(ddata->rsts);1308 1309	return 0;1310}1311 1312static int __maybe_unused sysc_runtime_suspend(struct device *dev)1313{1314	struct sysc *ddata;1315	int error = 0;1316 1317	ddata = dev_get_drvdata(dev);1318 1319	if (!ddata->enabled)1320		return 0;1321 1322	sysc_clkdm_deny_idle(ddata);1323 1324	if (ddata->legacy_mode) {1325		error = sysc_runtime_suspend_legacy(dev, ddata);1326		if (error)1327			goto err_allow_idle;1328	} else {1329		error = sysc_disable_module(dev);1330		if (error)1331			goto err_allow_idle;1332	}1333 1334	sysc_disable_main_clocks(ddata);1335 1336	if (sysc_opt_clks_needed(ddata))1337		sysc_disable_opt_clocks(ddata);1338 1339	ddata->enabled = false;1340 1341err_allow_idle:1342	sysc_clkdm_allow_idle(ddata);1343 1344	reset_control_assert(ddata->rsts);1345 1346	return error;1347}1348 1349static int __maybe_unused sysc_runtime_resume(struct device *dev)1350{1351	struct sysc *ddata;1352	int error = 0;1353 1354	ddata = dev_get_drvdata(dev);1355 1356	if (ddata->enabled)1357		return 0;1358 1359 1360	sysc_clkdm_deny_idle(ddata);1361 1362	if (sysc_opt_clks_needed(ddata)) {1363		error = sysc_enable_opt_clocks(ddata);1364		if (error)1365			goto err_allow_idle;1366	}1367 1368	error = sysc_enable_main_clocks(ddata);1369	if (error)1370		goto err_opt_clocks;1371 1372	reset_control_deassert(ddata->rsts);1373 1374	if (ddata->legacy_mode) {1375		error = sysc_runtime_resume_legacy(dev, ddata);1376		if (error)1377			goto err_main_clocks;1378	} else {1379		error = sysc_enable_module(dev);1380		if (error)1381			goto err_main_clocks;1382	}1383 1384	ddata->enabled = true;1385 1386	sysc_clkdm_allow_idle(ddata);1387 1388	return 0;1389 1390err_main_clocks:1391	sysc_disable_main_clocks(ddata);1392err_opt_clocks:1393	if (sysc_opt_clks_needed(ddata))1394		sysc_disable_opt_clocks(ddata);1395err_allow_idle:1396	sysc_clkdm_allow_idle(ddata);1397 1398	return error;1399}1400 1401/*1402 * Checks if device context was lost. Assumes the sysconfig register value1403 * after lost context is different from the configured value. Only works for1404 * enabled devices.1405 *1406 * Eventually we may want to also add support to using the context lost1407 * registers that some SoCs have.1408 */1409static int sysc_check_context(struct sysc *ddata)1410{1411	u32 reg;1412 1413	if (!ddata->enabled)1414		return -ENODATA;1415 1416	reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);1417	if (reg == ddata->sysconfig)1418		return 0;1419 1420	return -EACCES;1421}1422 1423static int sysc_reinit_module(struct sysc *ddata, bool leave_enabled)1424{1425	struct device *dev = ddata->dev;1426	int error;1427 1428	if (ddata->enabled) {1429		/* Nothing to do if enabled and context not lost */1430		error = sysc_check_context(ddata);1431		if (!error)1432			return 0;1433 1434		/* Disable target module if it is enabled */1435		error = sysc_runtime_suspend(dev);1436		if (error)1437			dev_warn(dev, "reinit suspend failed: %i\n", error);1438	}1439 1440	/* Enable target module */1441	error = sysc_runtime_resume(dev);1442	if (error)1443		dev_warn(dev, "reinit resume failed: %i\n", error);1444 1445	/* Some modules like am335x gpmc need reset and restore of sysconfig */1446	if (ddata->cfg.quirks & SYSC_QUIRK_RESET_ON_CTX_LOST) {1447		error = sysc_reset(ddata);1448		if (error)1449			dev_warn(dev, "reinit reset failed: %i\n", error);1450 1451		sysc_write_sysconfig(ddata, ddata->sysconfig);1452	}1453 1454	if (leave_enabled)1455		return error;1456 1457	/* Disable target module if no leave_enabled was set */1458	error = sysc_runtime_suspend(dev);1459	if (error)1460		dev_warn(dev, "reinit suspend failed: %i\n", error);1461 1462	return error;1463}1464 1465static int __maybe_unused sysc_noirq_suspend(struct device *dev)1466{1467	struct sysc *ddata;1468 1469	ddata = dev_get_drvdata(dev);1470 1471	if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)1472		return 0;1473 1474	if (!ddata->enabled)1475		return 0;1476 1477	ddata->needs_resume = 1;1478 1479	return sysc_runtime_suspend(dev);1480}1481 1482static int __maybe_unused sysc_noirq_resume(struct device *dev)1483{1484	struct sysc *ddata;1485	int error = 0;1486 1487	ddata = dev_get_drvdata(dev);1488 1489	if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)1490		return 0;1491 1492	if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_RESUME) {1493		error = sysc_reinit_module(ddata, ddata->needs_resume);1494		if (error)1495			dev_warn(dev, "noirq_resume failed: %i\n", error);1496	} else if (ddata->needs_resume) {1497		error = sysc_runtime_resume(dev);1498		if (error)1499			dev_warn(dev, "noirq_resume failed: %i\n", error);1500	}1501 1502	ddata->needs_resume = 0;1503 1504	return error;1505}1506 1507static const struct dev_pm_ops sysc_pm_ops = {1508	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)1509	SET_RUNTIME_PM_OPS(sysc_runtime_suspend,1510			   sysc_runtime_resume,1511			   NULL)1512};1513 1514/* Module revision register based quirks */1515struct sysc_revision_quirk {1516	const char *name;1517	u32 base;1518	int rev_offset;1519	int sysc_offset;1520	int syss_offset;1521	u32 revision;1522	u32 revision_mask;1523	u32 quirks;1524};1525 1526#define SYSC_QUIRK(optname, optbase, optrev, optsysc, optsyss,		\1527		   optrev_val, optrevmask, optquirkmask)		\1528	{								\1529		.name = (optname),					\1530		.base = (optbase),					\1531		.rev_offset = (optrev),					\1532		.sysc_offset = (optsysc),				\1533		.syss_offset = (optsyss),				\1534		.revision = (optrev_val),				\1535		.revision_mask = (optrevmask),				\1536		.quirks = (optquirkmask),				\1537	}1538 1539static const struct sysc_revision_quirk sysc_revision_quirks[] = {1540	/* Quirks that need to be set based on the module address */1541	SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff,1542		   SYSC_QUIRK_EXT_OPT_CLOCK | SYSC_QUIRK_NO_RESET_ON_INIT |1543		   SYSC_QUIRK_SWSUP_SIDLE),1544 1545	/* Quirks that need to be set based on detected module */1546	SYSC_QUIRK("aess", 0, 0, 0x10, -ENODEV, 0x40000000, 0xffffffff,1547		   SYSC_MODULE_QUIRK_AESS),1548	/* Errata i893 handling for dra7 dcan1 and 2 */1549	SYSC_QUIRK("dcan", 0x4ae3c000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,1550		   SYSC_QUIRK_CLKDM_NOAUTO),1551	SYSC_QUIRK("dcan", 0x48480000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,1552		   SYSC_QUIRK_CLKDM_NOAUTO),1553	SYSC_QUIRK("dss", 0x4832a000, 0, 0x10, 0x14, 0x00000020, 0xffffffff,1554		   SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),1555	SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000040, 0xffffffff,1556		   SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),1557	SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000061, 0xffffffff,1558		   SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),1559	SYSC_QUIRK("dwc3", 0x48880000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff,1560		   SYSC_QUIRK_CLKDM_NOAUTO),1561	SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff,1562		   SYSC_QUIRK_CLKDM_NOAUTO),1563	SYSC_QUIRK("gpio", 0, 0, 0x10, 0x114, 0x50600801, 0xffff00ff,1564		   SYSC_QUIRK_OPT_CLKS_IN_RESET),1565	SYSC_QUIRK("gpmc", 0, 0, 0x10, 0x14, 0x00000060, 0xffffffff,1566		   SYSC_QUIRK_REINIT_ON_CTX_LOST | SYSC_QUIRK_RESET_ON_CTX_LOST |1567		   SYSC_QUIRK_GPMC_DEBUG),1568	SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50030200, 0xffffffff,1569		   SYSC_QUIRK_OPT_CLKS_NEEDED),1570	SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,1571		   SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),1572	SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,1573		   SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),1574	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000036, 0x000000ff,1575		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),1576	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x0000003c, 0x000000ff,1577		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),1578	SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000040, 0x000000ff,1579		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),1580	SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0,1581		   SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),1582	SYSC_QUIRK("gpu", 0x50000000, 0x14, -ENODEV, -ENODEV, 0x00010201, 0xffffffff, 0),1583	SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff,1584		   SYSC_MODULE_QUIRK_SGX),1585	SYSC_QUIRK("lcdc", 0, 0, 0x54, -ENODEV, 0x4f201000, 0xffffffff,1586		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1587	SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44306302, 0xffffffff,1588		   SYSC_QUIRK_SWSUP_SIDLE),1589	SYSC_QUIRK("rtc", 0, 0x74, 0x78, -ENODEV, 0x4eb01908, 0xffff00f0,1590		   SYSC_MODULE_QUIRK_RTC_UNLOCK),1591	SYSC_QUIRK("tptc", 0, 0, 0x10, -ENODEV, 0x40006c00, 0xffffefff,1592		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1593	SYSC_QUIRK("tptc", 0, 0, -ENODEV, -ENODEV, 0x40007c00, 0xffffffff,1594		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1595	SYSC_QUIRK("sata", 0, 0xfc, 0x1100, -ENODEV, 0x5e412000, 0xffffffff,1596		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1597	SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff,1598		   SYSC_QUIRK_SWSUP_SIDLE_ACT),1599	SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,1600		   SYSC_QUIRK_SWSUP_SIDLE_ACT),1601	/* Uarts on omap4 and later */1602	SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,1603		   SYSC_QUIRK_SWSUP_SIDLE_ACT),1604	SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,1605		   SYSC_QUIRK_SWSUP_SIDLE_ACT),1606	SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47424e03, 0xffffffff,1607		   SYSC_QUIRK_SWSUP_SIDLE_ACT),1608	SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff,1609		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1610	SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -ENODEV, 0x50700101, 0xffffffff,1611		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),1612	SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000033,1613		   0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |1614		   SYSC_MODULE_QUIRK_OTG),1615	SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000040,1616		   0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |1617		   SYSC_MODULE_QUIRK_OTG),1618	SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050,1619		   0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |1620		   SYSC_MODULE_QUIRK_OTG),1621	SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff,1622		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |1623		   SYSC_QUIRK_REINIT_ON_CTX_LOST),1624	SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,1625		   SYSC_MODULE_QUIRK_WDT),1626	/* PRUSS on am3, am4 and am5 */1627	SYSC_QUIRK("pruss", 0, 0x26000, 0x26004, -ENODEV, 0x47000000, 0xff000000,1628		   SYSC_MODULE_QUIRK_PRUSS),1629	/* Watchdog on am3 and am4 */1630	SYSC_QUIRK("wdt", 0x44e35000, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,1631		   SYSC_MODULE_QUIRK_WDT | SYSC_QUIRK_SWSUP_SIDLE),1632 1633#ifdef DEBUG1634	SYSC_QUIRK("adc", 0, 0, 0x10, -ENODEV, 0x47300001, 0xffffffff, 0),1635	SYSC_QUIRK("atl", 0, 0, -ENODEV, -ENODEV, 0x0a070100, 0xffffffff, 0),1636	SYSC_QUIRK("cm", 0, 0, -ENODEV, -ENODEV, 0x40000301, 0xffffffff, 0),1637	SYSC_QUIRK("control", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0),1638	SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902,1639		   0xffff00f0, 0),1640	SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff, 0),1641	SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0x4edb1902, 0xffffffff, 0),1642	SYSC_QUIRK("dispc", 0x4832a400, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),1643	SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),1644	SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000051, 0xffffffff, 0),1645	SYSC_QUIRK("dmic", 0, 0, 0x10, -ENODEV, 0x50010000, 0xffffffff, 0),1646	SYSC_QUIRK("dsi", 0x58004000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),1647	SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),1648	SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),1649	SYSC_QUIRK("dsi", 0x58009000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),1650	SYSC_QUIRK("dwc3", 0, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff, 0),1651	SYSC_QUIRK("d2d", 0x4a0b6000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),1652	SYSC_QUIRK("d2d", 0x4a0cd000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),1653	SYSC_QUIRK("elm", 0x48080000, 0, 0x10, 0x14, 0x00000020, 0xffffffff, 0),1654	SYSC_QUIRK("emif", 0, 0, -ENODEV, -ENODEV, 0x40441403, 0xffff0fff, 0),1655	SYSC_QUIRK("emif", 0, 0, -ENODEV, -ENODEV, 0x50440500, 0xffffffff, 0),1656	SYSC_QUIRK("epwmss", 0, 0, 0x4, -ENODEV, 0x47400001, 0xffffffff, 0),1657	SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -ENODEV, 0, 0, 0),1658	SYSC_QUIRK("gpu", 0, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff, 0),1659	SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50031d00, 0xffffffff, 0),1660	SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0),1661	SYSC_QUIRK("iss", 0, 0, 0x10, -ENODEV, 0x40000101, 0xffffffff, 0),1662	SYSC_QUIRK("keypad", 0x4a31c000, 0, 0x10, 0x14, 0x00000020, 0xffffffff, 0),1663	SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44307b02, 0xffffffff, 0),1664	SYSC_QUIRK("mcbsp", 0, -ENODEV, 0x8c, -ENODEV, 0, 0, 0),1665	SYSC_QUIRK("mcspi", 0, 0, 0x10, -ENODEV, 0x40300a0b, 0xffff00ff, 0),1666	SYSC_QUIRK("mcspi", 0, 0, 0x110, 0x114, 0x40300a0b, 0xffffffff, 0),1667	SYSC_QUIRK("mailbox", 0, 0, 0x10, -ENODEV, 0x00000400, 0xffffffff, 0),1668	SYSC_QUIRK("m3", 0, 0, -ENODEV, -ENODEV, 0x5f580105, 0x0fff0f00, 0),1669	SYSC_QUIRK("ocp2scp", 0, 0, 0x10, 0x14, 0x50060005, 0xfffffff0, 0),1670	SYSC_QUIRK("ocp2scp", 0, 0, -ENODEV, -ENODEV, 0x50060007, 0xffffffff, 0),1671	SYSC_QUIRK("padconf", 0, 0, 0x10, -ENODEV, 0x4fff0800, 0xffffffff, 0),1672	SYSC_QUIRK("padconf", 0, 0, -ENODEV, -ENODEV, 0x40001100, 0xffffffff, 0),1673	SYSC_QUIRK("pcie", 0x51000000, -ENODEV, -ENODEV, -ENODEV, 0, 0, 0),1674	SYSC_QUIRK("pcie", 0x51800000, -ENODEV, -ENODEV, -ENODEV, 0, 0, 0),1675	SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000100, 0xffffffff, 0),1676	SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x00004102, 0xffffffff, 0),1677	SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000400, 0xffffffff, 0),1678	SYSC_QUIRK("rfbi", 0x4832a800, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),1679	SYSC_QUIRK("rfbi", 0x58002000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),1680	SYSC_QUIRK("scm", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0),1681	SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4e8b0100, 0xffffffff, 0),1682	SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4f000100, 0xffffffff, 0),1683	SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x40000900, 0xffffffff, 0),1684	SYSC_QUIRK("scrm", 0, 0, -ENODEV, -ENODEV, 0x00000010, 0xffffffff, 0),1685	SYSC_QUIRK("sdio", 0, 0, 0x10, -ENODEV, 0x40202301, 0xffff0ff0, 0),1686	SYSC_QUIRK("sdio", 0, 0x2fc, 0x110, 0x114, 0x31010000, 0xffffffff, 0),1687	SYSC_QUIRK("sdma", 0, 0, 0x2c, 0x28, 0x00010900, 0xffffffff, 0),1688	SYSC_QUIRK("sham", 0, 0x100, 0x110, 0x114, 0x40000c03, 0xffffffff, 0),1689	SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40000902, 0xffffffff, 0),1690	SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40002903, 0xffffffff, 0),1691	SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x24, -ENODEV, 0x00000000, 0xffffffff, 0),1692	SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x38, -ENODEV, 0x00000000, 0xffffffff, 0),1693	SYSC_QUIRK("spinlock", 0, 0, 0x10, -ENODEV, 0x50020000, 0xffffffff, 0),1694	SYSC_QUIRK("rng", 0, 0x1fe0, 0x1fe4, -ENODEV, 0x00000020, 0xffffffff, 0),1695	SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000013, 0xffffffff, 0),1696	SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000015, 0xffffffff, 0),1697	/* Some timers on omap4 and later */1698	SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x50002100, 0xffffffff, 0),1699	SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x4fff1301, 0xffff00ff, 0),1700	SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000040, 0xffffffff, 0),1701	SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000011, 0xffffffff, 0),1702	SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000060, 0xffffffff, 0),1703	SYSC_QUIRK("tpcc", 0, 0, -ENODEV, -ENODEV, 0x40014c00, 0xffffffff, 0),1704	SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000004, 0xffffffff, 0),1705	SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000008, 0xffffffff, 0),1706	SYSC_QUIRK("venc", 0x58003000, 0, -ENODEV, -ENODEV, 0x00000002, 0xffffffff, 0),1707	SYSC_QUIRK("vfpe", 0, 0, 0x104, -ENODEV, 0x4d001200, 0xffffffff, 0),1708#endif1709};1710 1711/*1712 * Early quirks based on module base and register offsets only that are1713 * needed before the module revision can be read1714 */1715static void sysc_init_early_quirks(struct sysc *ddata)1716{1717	const struct sysc_revision_quirk *q;1718	int i;1719 1720	for (i = 0; i < ARRAY_SIZE(sysc_revision_quirks); i++) {1721		q = &sysc_revision_quirks[i];1722 1723		if (!q->base)1724			continue;1725 1726		if (q->base != ddata->module_pa)1727			continue;1728 1729		if (q->rev_offset != ddata->offsets[SYSC_REVISION])1730			continue;1731 1732		if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG])1733			continue;1734 1735		if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS])1736			continue;1737 1738		ddata->name = q->name;1739		ddata->cfg.quirks |= q->quirks;1740	}1741}1742 1743/* Quirks that also consider the revision register value */1744static void sysc_init_revision_quirks(struct sysc *ddata)1745{1746	const struct sysc_revision_quirk *q;1747	int i;1748 1749	for (i = 0; i < ARRAY_SIZE(sysc_revision_quirks); i++) {1750		q = &sysc_revision_quirks[i];1751 1752		if (q->base && q->base != ddata->module_pa)1753			continue;1754 1755		if (q->rev_offset != ddata->offsets[SYSC_REVISION])1756			continue;1757 1758		if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG])1759			continue;1760 1761		if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS])1762			continue;1763 1764		if (q->revision == ddata->revision ||1765		    (q->revision & q->revision_mask) ==1766		    (ddata->revision & q->revision_mask)) {1767			ddata->name = q->name;1768			ddata->cfg.quirks |= q->quirks;1769		}1770	}1771}1772 1773/*1774 * DSS needs dispc outputs disabled to reset modules. Returns mask of1775 * enabled DSS interrupts. Eventually we may be able to do this on1776 * dispc init rather than top-level DSS init.1777 */1778static u32 sysc_quirk_dispc(struct sysc *ddata, int dispc_offset,1779			    bool disable)1780{1781	bool lcd_en, digit_en, lcd2_en = false, lcd3_en = false;1782	const int lcd_en_mask = BIT(0), digit_en_mask = BIT(1);1783	int manager_count;1784	bool framedonetv_irq = true;1785	u32 val, irq_mask = 0;1786 1787	switch (sysc_soc->soc) {1788	case SOC_2420 ... SOC_3630:1789		manager_count = 2;1790		framedonetv_irq = false;1791		break;1792	case SOC_4430 ... SOC_4470:1793		manager_count = 3;1794		break;1795	case SOC_5430:1796	case SOC_DRA7:1797		manager_count = 4;1798		break;1799	case SOC_AM4:1800		manager_count = 1;1801		framedonetv_irq = false;1802		break;1803	case SOC_UNKNOWN:1804	default:1805		return 0;1806	}1807 1808	/* Remap the whole module range to be able to reset dispc outputs */1809	devm_iounmap(ddata->dev, ddata->module_va);1810	ddata->module_va = devm_ioremap(ddata->dev,1811					ddata->module_pa,1812					ddata->module_size);1813	if (!ddata->module_va)1814		return -EIO;1815 1816	/* DISP_CONTROL, shut down lcd and digit on disable if enabled */1817	val = sysc_read(ddata, dispc_offset + 0x40);1818	lcd_en = val & lcd_en_mask;1819	digit_en = val & digit_en_mask;1820	if (lcd_en)1821		irq_mask |= BIT(0);			/* FRAMEDONE */1822	if (digit_en) {1823		if (framedonetv_irq)1824			irq_mask |= BIT(24);		/* FRAMEDONETV */1825		else1826			irq_mask |= BIT(2) | BIT(3);	/* EVSYNC bits */1827	}1828	if (disable && (lcd_en || digit_en))1829		sysc_write(ddata, dispc_offset + 0x40,1830			   val & ~(lcd_en_mask | digit_en_mask));1831 1832	if (manager_count <= 2)1833		return irq_mask;1834 1835	/* DISPC_CONTROL2 */1836	val = sysc_read(ddata, dispc_offset + 0x238);1837	lcd2_en = val & lcd_en_mask;1838	if (lcd2_en)1839		irq_mask |= BIT(22);			/* FRAMEDONE2 */1840	if (disable && lcd2_en)1841		sysc_write(ddata, dispc_offset + 0x238,1842			   val & ~lcd_en_mask);1843 1844	if (manager_count <= 3)1845		return irq_mask;1846 1847	/* DISPC_CONTROL3 */1848	val = sysc_read(ddata, dispc_offset + 0x848);1849	lcd3_en = val & lcd_en_mask;1850	if (lcd3_en)1851		irq_mask |= BIT(30);			/* FRAMEDONE3 */1852	if (disable && lcd3_en)1853		sysc_write(ddata, dispc_offset + 0x848,1854			   val & ~lcd_en_mask);1855 1856	return irq_mask;1857}1858 1859/* DSS needs child outputs disabled and SDI registers cleared for reset */1860static void sysc_pre_reset_quirk_dss(struct sysc *ddata)1861{1862	const int dispc_offset = 0x1000;1863	int error;1864	u32 irq_mask, val;1865 1866	/* Get enabled outputs */1867	irq_mask = sysc_quirk_dispc(ddata, dispc_offset, false);1868	if (!irq_mask)1869		return;1870 1871	/* Clear IRQSTATUS */1872	sysc_write(ddata, dispc_offset + 0x18, irq_mask);1873 1874	/* Disable outputs */1875	val = sysc_quirk_dispc(ddata, dispc_offset, true);1876 1877	/* Poll IRQSTATUS */1878	error = readl_poll_timeout(ddata->module_va + dispc_offset + 0x18,1879				   val, val != irq_mask, 100, 50);1880	if (error)1881		dev_warn(ddata->dev, "%s: timed out %08x !+ %08x\n",1882			 __func__, val, irq_mask);1883 1884	if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35) {1885		/* Clear DSS_SDI_CONTROL */1886		sysc_write(ddata, 0x44, 0);1887 1888		/* Clear DSS_PLL_CONTROL */1889		sysc_write(ddata, 0x48, 0);1890	}1891 1892	/* Clear DSS_CONTROL to switch DSS clock sources to PRCM if not */1893	sysc_write(ddata, 0x40, 0);1894}1895 1896/* 1-wire needs module's internal clocks enabled for reset */1897static void sysc_pre_reset_quirk_hdq1w(struct sysc *ddata)1898{1899	int offset = 0x0c;	/* HDQ_CTRL_STATUS */1900	u16 val;1901 1902	val = sysc_read(ddata, offset);1903	val |= BIT(5);1904	sysc_write(ddata, offset, val);1905}1906 1907/* AESS (Audio Engine SubSystem) needs autogating set after enable */1908static void sysc_module_enable_quirk_aess(struct sysc *ddata)1909{1910	int offset = 0x7c;	/* AESS_AUTO_GATING_ENABLE */1911 1912	sysc_write(ddata, offset, 1);1913}1914 1915/* I2C needs to be disabled for reset */1916static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable)1917{1918	int offset;1919	u16 val;1920 1921	/* I2C_CON, omap2/3 is different from omap4 and later */1922	if ((ddata->revision & 0xffffff00) == 0x001f0000)1923		offset = 0x24;1924	else1925		offset = 0xa4;1926 1927	/* I2C_EN */1928	val = sysc_read(ddata, offset);1929	if (enable)1930		val |= BIT(15);1931	else1932		val &= ~BIT(15);1933	sysc_write(ddata, offset, val);1934}1935 1936static void sysc_pre_reset_quirk_i2c(struct sysc *ddata)1937{1938	sysc_clk_quirk_i2c(ddata, false);1939}1940 1941static void sysc_post_reset_quirk_i2c(struct sysc *ddata)1942{1943	sysc_clk_quirk_i2c(ddata, true);1944}1945 1946/* RTC on am3 and 4 needs to be unlocked and locked for sysconfig */1947static void sysc_quirk_rtc(struct sysc *ddata, bool lock)1948{1949	u32 val, kick0_val = 0, kick1_val = 0;1950	unsigned long flags;1951	int error;1952 1953	if (!lock) {1954		kick0_val = 0x83e70b13;1955		kick1_val = 0x95a4f1e0;1956	}1957 1958	local_irq_save(flags);1959	/* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */1960	error = readl_poll_timeout_atomic(ddata->module_va + 0x44, val,1961					  !(val & BIT(0)), 100, 50);1962	if (error)1963		dev_warn(ddata->dev, "rtc busy timeout\n");1964	/* Now we have ~15 microseconds to read/write various registers */1965	sysc_write(ddata, 0x6c, kick0_val);1966	sysc_write(ddata, 0x70, kick1_val);1967	local_irq_restore(flags);1968}1969 1970static void sysc_module_unlock_quirk_rtc(struct sysc *ddata)1971{1972	sysc_quirk_rtc(ddata, false);1973}1974 1975static void sysc_module_lock_quirk_rtc(struct sysc *ddata)1976{1977	sysc_quirk_rtc(ddata, true);1978}1979 1980/* OTG omap2430 glue layer up to omap4 needs OTG_FORCESTDBY configured */1981static void sysc_module_enable_quirk_otg(struct sysc *ddata)1982{1983	int offset = 0x414;	/* OTG_FORCESTDBY */1984 1985	sysc_write(ddata, offset, 0);1986}1987 1988static void sysc_module_disable_quirk_otg(struct sysc *ddata)1989{1990	int offset = 0x414;	/* OTG_FORCESTDBY */1991	u32 val = BIT(0);	/* ENABLEFORCE */1992 1993	sysc_write(ddata, offset, val);1994}1995 1996/* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */1997static void sysc_module_enable_quirk_sgx(struct sysc *ddata)1998{1999	int offset = 0xff08;	/* OCP_DEBUG_CONFIG */2000	u32 val = BIT(31);	/* THALIA_INT_BYPASS */2001 2002	sysc_write(ddata, offset, val);2003}2004 2005/* Watchdog timer needs a disable sequence after reset */2006static void sysc_reset_done_quirk_wdt(struct sysc *ddata)2007{2008	int wps, spr, error;2009	u32 val;2010 2011	wps = 0x34;2012	spr = 0x48;2013 2014	sysc_write(ddata, spr, 0xaaaa);2015	error = readl_poll_timeout(ddata->module_va + wps, val,2016				   !(val & 0x10), 100,2017				   MAX_MODULE_SOFTRESET_WAIT);2018	if (error)2019		dev_warn(ddata->dev, "wdt disable step1 failed\n");2020 2021	sysc_write(ddata, spr, 0x5555);2022	error = readl_poll_timeout(ddata->module_va + wps, val,2023				   !(val & 0x10), 100,2024				   MAX_MODULE_SOFTRESET_WAIT);2025	if (error)2026		dev_warn(ddata->dev, "wdt disable step2 failed\n");2027}2028 2029/* PRUSS needs to set MSTANDBY_INIT inorder to idle properly */2030static void sysc_module_disable_quirk_pruss(struct sysc *ddata)2031{2032	u32 reg;2033 2034	reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);2035	reg |= SYSC_PRUSS_STANDBY_INIT;2036	sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);2037}2038 2039static void sysc_init_module_quirks(struct sysc *ddata)2040{2041	if (ddata->legacy_mode || !ddata->name)2042		return;2043 2044	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_HDQ1W) {2045		ddata->pre_reset_quirk = sysc_pre_reset_quirk_hdq1w;2046 2047		return;2048	}2049 2050#ifdef CONFIG_OMAP_GPMC_DEBUG2051	if (ddata->cfg.quirks & SYSC_QUIRK_GPMC_DEBUG) {2052		ddata->cfg.quirks |= SYSC_QUIRK_NO_RESET_ON_INIT;2053 2054		return;2055	}2056#endif2057 2058	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_I2C) {2059		ddata->pre_reset_quirk = sysc_pre_reset_quirk_i2c;2060		ddata->post_reset_quirk = sysc_post_reset_quirk_i2c;2061 2062		return;2063	}2064 2065	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_AESS)2066		ddata->module_enable_quirk = sysc_module_enable_quirk_aess;2067 2068	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_DSS_RESET)2069		ddata->pre_reset_quirk = sysc_pre_reset_quirk_dss;2070 2071	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_RTC_UNLOCK) {2072		ddata->module_unlock_quirk = sysc_module_unlock_quirk_rtc;2073		ddata->module_lock_quirk = sysc_module_lock_quirk_rtc;2074 2075		return;2076	}2077 2078	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_OTG) {2079		ddata->module_enable_quirk = sysc_module_enable_quirk_otg;2080		ddata->module_disable_quirk = sysc_module_disable_quirk_otg;2081	}2082 2083	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX)2084		ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;2085 2086	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT) {2087		ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;2088		ddata->module_disable_quirk = sysc_reset_done_quirk_wdt;2089	}2090 2091	if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_PRUSS)2092		ddata->module_disable_quirk = sysc_module_disable_quirk_pruss;2093}2094 2095static int sysc_clockdomain_init(struct sysc *ddata)2096{2097	struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);2098	struct clk *fck = NULL, *ick = NULL;2099	int error;2100 2101	if (!pdata || !pdata->init_clockdomain)2102		return 0;2103 2104	switch (ddata->nr_clocks) {2105	case 2:2106		ick = ddata->clocks[SYSC_ICK];2107		fallthrough;2108	case 1:2109		fck = ddata->clocks[SYSC_FCK];2110		break;2111	case 0:2112		return 0;2113	}2114 2115	error = pdata->init_clockdomain(ddata->dev, fck, ick, &ddata->cookie);2116	if (!error || error == -ENODEV)2117		return 0;2118 2119	return error;2120}2121 2122/*2123 * Note that pdata->init_module() typically does a reset first. After2124 * pdata->init_module() is done, PM runtime can be used for the interconnect2125 * target module.2126 */2127static int sysc_legacy_init(struct sysc *ddata)2128{2129	struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);2130	int error;2131 2132	if (!pdata || !pdata->init_module)2133		return 0;2134 2135	error = pdata->init_module(ddata->dev, ddata->mdata, &ddata->cookie);2136	if (error == -EEXIST)2137		error = 0;2138 2139	return error;2140}2141 2142/*2143 * Note that the caller must ensure the interconnect target module is enabled2144 * before calling reset. Otherwise reset will not complete.2145 */2146static int sysc_reset(struct sysc *ddata)2147{2148	int sysc_offset, sysc_val, error;2149	u32 sysc_mask;2150 2151	sysc_offset = ddata->offsets[SYSC_SYSCONFIG];2152 2153	if (ddata->legacy_mode ||2154	    ddata->cap->regbits->srst_shift < 0)2155		return 0;2156 2157	sysc_mask = BIT(ddata->cap->regbits->srst_shift);2158 2159	if (ddata->pre_reset_quirk)2160		ddata->pre_reset_quirk(ddata);2161 2162	if (sysc_offset >= 0) {2163		sysc_val = sysc_read_sysconfig(ddata);2164		sysc_val |= sysc_mask;2165		sysc_write(ddata, sysc_offset, sysc_val);2166 2167		/*2168		 * Some devices need a delay before reading registers2169		 * after reset. Presumably a srst_udelay is not needed2170		 * for devices that use a rstctrl register reset.2171		 */2172		if (ddata->cfg.srst_udelay)2173			fsleep(ddata->cfg.srst_udelay);2174 2175		/*2176		 * Flush posted write. For devices needing srst_udelay2177		 * this should trigger an interconnect error if the2178		 * srst_udelay value is needed but not configured.2179		 */2180		sysc_val = sysc_read_sysconfig(ddata);2181	}2182 2183	if (ddata->post_reset_quirk)2184		ddata->post_reset_quirk(ddata);2185 2186	error = sysc_wait_softreset(ddata);2187	if (error)2188		dev_warn(ddata->dev, "OCP softreset timed out\n");2189 2190	if (ddata->reset_done_quirk)2191		ddata->reset_done_quirk(ddata);2192 2193	return error;2194}2195 2196/*2197 * At this point the module is configured enough to read the revision but2198 * module may not be completely configured yet to use PM runtime. Enable2199 * all clocks directly during init to configure the quirks needed for PM2200 * runtime based on the revision register.2201 */2202static int sysc_init_module(struct sysc *ddata)2203{2204	bool rstctrl_deasserted = false;2205	int error = 0;2206 2207	error = sysc_clockdomain_init(ddata);2208	if (error)2209		return error;2210 2211	sysc_clkdm_deny_idle(ddata);2212 2213	/*2214	 * Always enable clocks. The bootloader may or may not have enabled2215	 * the related clocks.2216	 */2217	error = sysc_enable_opt_clocks(ddata);2218	if (error)2219		return error;2220 2221	error = sysc_enable_main_clocks(ddata);2222	if (error)2223		goto err_opt_clocks;2224 2225	if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) {2226		error = reset_control_deassert(ddata->rsts);2227		if (error)2228			goto err_main_clocks;2229		rstctrl_deasserted = true;2230	}2231 2232	ddata->revision = sysc_read_revision(ddata);2233	sysc_init_revision_quirks(ddata);2234	sysc_init_module_quirks(ddata);2235 2236	if (ddata->legacy_mode) {2237		error = sysc_legacy_init(ddata);2238		if (error)2239			goto err_main_clocks;2240	}2241 2242	if (!ddata->legacy_mode) {2243		error = sysc_enable_module(ddata->dev);2244		if (error)2245			goto err_main_clocks;2246	}2247 2248	if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) {2249		error = sysc_reset(ddata);2250		if (error)2251			dev_err(ddata->dev, "Reset failed with %d\n", error);2252 2253		if (error && !ddata->legacy_mode)2254			sysc_disable_module(ddata->dev);2255	}2256 2257err_main_clocks:2258	if (error)2259		sysc_disable_main_clocks(ddata);2260err_opt_clocks:2261	/* No re-enable of clockdomain autoidle to prevent module autoidle */2262	if (error) {2263		sysc_disable_opt_clocks(ddata);2264		sysc_clkdm_allow_idle(ddata);2265	}2266 2267	if (error && rstctrl_deasserted &&2268	    !(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))2269		reset_control_assert(ddata->rsts);2270 2271	return error;2272}2273 2274static int sysc_init_sysc_mask(struct sysc *ddata)2275{2276	struct device_node *np = ddata->dev->of_node;2277	int error;2278	u32 val;2279 2280	error = of_property_read_u32(np, "ti,sysc-mask", &val);2281	if (error)2282		return 0;2283 2284	ddata->cfg.sysc_val = val & ddata->cap->sysc_mask;2285 2286	return 0;2287}2288 2289static int sysc_init_idlemode(struct sysc *ddata, u8 *idlemodes,2290			      const char *name)2291{2292	struct device_node *np = ddata->dev->of_node;2293	u32 val;2294 2295	of_property_for_each_u32(np, name, val) {2296		if (val >= SYSC_NR_IDLEMODES) {2297			dev_err(ddata->dev, "invalid idlemode: %i\n", val);2298			return -EINVAL;2299		}2300		*idlemodes |=  (1 << val);2301	}2302 2303	return 0;2304}2305 2306static int sysc_init_idlemodes(struct sysc *ddata)2307{2308	int error;2309 2310	error = sysc_init_idlemode(ddata, &ddata->cfg.midlemodes,2311				   "ti,sysc-midle");2312	if (error)2313		return error;2314 2315	error = sysc_init_idlemode(ddata, &ddata->cfg.sidlemodes,2316				   "ti,sysc-sidle");2317	if (error)2318		return error;2319 2320	return 0;2321}2322 2323/*2324 * Only some devices on omap4 and later have SYSCONFIG reset done2325 * bit. We can detect this if there is no SYSSTATUS at all, or the2326 * SYSTATUS bit 0 is not used. Note that some SYSSTATUS registers2327 * have multiple bits for the child devices like OHCI and EHCI.2328 * Depends on SYSC being parsed first.2329 */2330static int sysc_init_syss_mask(struct sysc *ddata)2331{2332	struct device_node *np = ddata->dev->of_node;2333	int error;2334	u32 val;2335 2336	error = of_property_read_u32(np, "ti,syss-mask", &val);2337	if (error) {2338		if ((ddata->cap->type == TI_SYSC_OMAP4 ||2339		     ddata->cap->type == TI_SYSC_OMAP4_TIMER) &&2340		    (ddata->cfg.sysc_val & SYSC_OMAP4_SOFTRESET))2341			ddata->cfg.quirks |= SYSC_QUIRK_RESET_STATUS;2342 2343		return 0;2344	}2345 2346	if (!(val & 1) && (ddata->cfg.sysc_val & SYSC_OMAP4_SOFTRESET))2347		ddata->cfg.quirks |= SYSC_QUIRK_RESET_STATUS;2348 2349	ddata->cfg.syss_mask = val;2350 2351	return 0;2352}2353 2354/*2355 * Many child device drivers need to have fck and opt clocks available2356 * to get the clock rate for device internal configuration etc.2357 */2358static int sysc_child_add_named_clock(struct sysc *ddata,2359				      struct device *child,2360				      const char *name)2361{2362	struct clk *clk;2363	struct clk_lookup *l;2364	int error = 0;2365 2366	if (!name)2367		return 0;2368 2369	clk = clk_get(child, name);2370	if (!IS_ERR(clk)) {2371		error = -EEXIST;2372		goto put_clk;2373	}2374 2375	clk = clk_get(ddata->dev, name);2376	if (IS_ERR(clk))2377		return -ENODEV;2378 2379	l = clkdev_create(clk, name, dev_name(child));2380	if (!l)2381		error = -ENOMEM;2382put_clk:2383	clk_put(clk);2384 2385	return error;2386}2387 2388static int sysc_child_add_clocks(struct sysc *ddata,2389				 struct device *child)2390{2391	int i, error;2392 2393	for (i = 0; i < ddata->nr_clocks; i++) {2394		error = sysc_child_add_named_clock(ddata,2395						   child,2396						   ddata->clock_roles[i]);2397		if (error && error != -EEXIST) {2398			dev_err(ddata->dev, "could not add child clock %s: %i\n",2399				ddata->clock_roles[i], error);2400 2401			return error;2402		}2403	}2404 2405	return 0;2406}2407 2408static const struct device_type sysc_device_type = {2409};2410 2411static struct sysc *sysc_child_to_parent(struct device *dev)2412{2413	struct device *parent = dev->parent;2414 2415	if (!parent || parent->type != &sysc_device_type)2416		return NULL;2417 2418	return dev_get_drvdata(parent);2419}2420 2421static int __maybe_unused sysc_child_runtime_suspend(struct device *dev)2422{2423	struct sysc *ddata;2424	int error;2425 2426	ddata = sysc_child_to_parent(dev);2427 2428	error = pm_generic_runtime_suspend(dev);2429	if (error)2430		return error;2431 2432	if (!ddata->enabled)2433		return 0;2434 2435	return sysc_runtime_suspend(ddata->dev);2436}2437 2438static int __maybe_unused sysc_child_runtime_resume(struct device *dev)2439{2440	struct sysc *ddata;2441	int error;2442 2443	ddata = sysc_child_to_parent(dev);2444 2445	if (!ddata->enabled) {2446		error = sysc_runtime_resume(ddata->dev);2447		if (error < 0)2448			dev_err(ddata->dev,2449				"%s error: %i\n", __func__, error);2450	}2451 2452	return pm_generic_runtime_resume(dev);2453}2454 2455/* Caller needs to take list_lock if ever used outside of cpu_pm */2456static void sysc_reinit_modules(struct sysc_soc_info *soc)2457{2458	struct sysc_module *module;2459	struct sysc *ddata;2460 2461	list_for_each_entry(module, &sysc_soc->restored_modules, node) {2462		ddata = module->ddata;2463		sysc_reinit_module(ddata, ddata->enabled);2464	}2465}2466 2467/**2468 * sysc_context_notifier - optionally reset and restore module after idle2469 * @nb: notifier block2470 * @cmd: unused2471 * @v: unused2472 *2473 * Some interconnect target modules need to be restored, or reset and restored2474 * on CPU_PM CPU_PM_CLUSTER_EXIT notifier. This is needed at least for am335x2475 * OTG and GPMC target modules even if the modules are unused.2476 */2477static int sysc_context_notifier(struct notifier_block *nb, unsigned long cmd,2478				 void *v)2479{2480	struct sysc_soc_info *soc;2481 2482	soc = container_of(nb, struct sysc_soc_info, nb);2483 2484	switch (cmd) {2485	case CPU_CLUSTER_PM_ENTER:2486		break;2487	case CPU_CLUSTER_PM_ENTER_FAILED:	/* No need to restore context */2488		break;2489	case CPU_CLUSTER_PM_EXIT:2490		sysc_reinit_modules(soc);2491		break;2492	}2493 2494	return NOTIFY_OK;2495}2496 2497/**2498 * sysc_add_restored - optionally add reset and restore quirk hanlling2499 * @ddata: device data2500 */2501static void sysc_add_restored(struct sysc *ddata)2502{2503	struct sysc_module *restored_module;2504 2505	restored_module = kzalloc(sizeof(*restored_module), GFP_KERNEL);2506	if (!restored_module)2507		return;2508 2509	restored_module->ddata = ddata;2510 2511	mutex_lock(&sysc_soc->list_lock);2512 2513	list_add(&restored_module->node, &sysc_soc->restored_modules);2514 2515	if (sysc_soc->nb.notifier_call)2516		goto out_unlock;2517 2518	sysc_soc->nb.notifier_call = sysc_context_notifier;2519	cpu_pm_register_notifier(&sysc_soc->nb);2520 2521out_unlock:2522	mutex_unlock(&sysc_soc->list_lock);2523}2524 2525static int sysc_notifier_call(struct notifier_block *nb,2526			      unsigned long event, void *device)2527{2528	struct device *dev = device;2529	struct sysc *ddata;2530	int error;2531 2532	ddata = sysc_child_to_parent(dev);2533	if (!ddata)2534		return NOTIFY_DONE;2535 2536	switch (event) {2537	case BUS_NOTIFY_ADD_DEVICE:2538		error = sysc_child_add_clocks(ddata, dev);2539		if (error)2540			return error;2541		break;2542	default:2543		break;2544	}2545 2546	return NOTIFY_DONE;2547}2548 2549static struct notifier_block sysc_nb = {2550	.notifier_call = sysc_notifier_call,2551};2552 2553/* Device tree configured quirks */2554struct sysc_dts_quirk {2555	const char *name;2556	u32 mask;2557};2558 2559static const struct sysc_dts_quirk sysc_dts_quirks[] = {2560	{ .name = "ti,no-idle-on-init",2561	  .mask = SYSC_QUIRK_NO_IDLE_ON_INIT, },2562	{ .name = "ti,no-reset-on-init",2563	  .mask = SYSC_QUIRK_NO_RESET_ON_INIT, },2564	{ .name = "ti,no-idle",2565	  .mask = SYSC_QUIRK_NO_IDLE, },2566};2567 2568static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,2569				  bool is_child)2570{2571	int i;2572 2573	for (i = 0; i < ARRAY_SIZE(sysc_dts_quirks); i++) {2574		const char *name = sysc_dts_quirks[i].name;2575 2576		if (!of_property_present(np, name))2577			continue;2578 2579		ddata->cfg.quirks |= sysc_dts_quirks[i].mask;2580		if (is_child) {2581			dev_warn(ddata->dev,2582				 "dts flag should be at module level for %s\n",2583				 name);2584		}2585	}2586}2587 2588static int sysc_init_dts_quirks(struct sysc *ddata)2589{2590	struct device_node *np = ddata->dev->of_node;2591	int error;2592	u32 val;2593 2594	ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL);2595 2596	sysc_parse_dts_quirks(ddata, np, false);2597	error = of_property_read_u32(np, "ti,sysc-delay-us", &val);2598	if (!error) {2599		if (val > 255) {2600			dev_warn(ddata->dev, "bad ti,sysc-delay-us: %i\n",2601				 val);2602		}2603 2604		ddata->cfg.srst_udelay = (u8)val;2605	}2606 2607	return 0;2608}2609 2610static void sysc_unprepare(struct sysc *ddata)2611{2612	int i;2613 2614	if (!ddata->clocks)2615		return;2616 2617	for (i = 0; i < SYSC_MAX_CLOCKS; i++) {2618		if (!IS_ERR_OR_NULL(ddata->clocks[i]))2619			clk_unprepare(ddata->clocks[i]);2620	}2621}2622 2623/*2624 * Common sysc register bits found on omap2, also known as type12625 */2626static const struct sysc_regbits sysc_regbits_omap2 = {2627	.dmadisable_shift = -ENODEV,2628	.midle_shift = 12,2629	.sidle_shift = 3,2630	.clkact_shift = 8,2631	.emufree_shift = 5,2632	.enwkup_shift = 2,2633	.srst_shift = 1,2634	.autoidle_shift = 0,2635};2636 2637static const struct sysc_capabilities sysc_omap2 = {2638	.type = TI_SYSC_OMAP2,2639	.sysc_mask = SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_EMUFREE |2640		     SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_SOFTRESET |2641		     SYSC_OMAP2_AUTOIDLE,2642	.regbits = &sysc_regbits_omap2,2643};2644 2645/* All omap2 and 3 timers, and timers 1, 2 & 10 on omap 4 and 5 */2646static const struct sysc_capabilities sysc_omap2_timer = {2647	.type = TI_SYSC_OMAP2_TIMER,2648	.sysc_mask = SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_EMUFREE |2649		     SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_SOFTRESET |2650		     SYSC_OMAP2_AUTOIDLE,2651	.regbits = &sysc_regbits_omap2,2652	.mod_quirks = SYSC_QUIRK_USE_CLOCKACT,2653};2654 2655/*2656 * SHAM2 (SHA1/MD5) sysc found on omap3, a variant of sysc_regbits_omap22657 * with different sidle position2658 */2659static const struct sysc_regbits sysc_regbits_omap3_sham = {2660	.dmadisable_shift = -ENODEV,2661	.midle_shift = -ENODEV,2662	.sidle_shift = 4,2663	.clkact_shift = -ENODEV,2664	.enwkup_shift = -ENODEV,2665	.srst_shift = 1,2666	.autoidle_shift = 0,2667	.emufree_shift = -ENODEV,2668};2669 2670static const struct sysc_capabilities sysc_omap3_sham = {2671	.type = TI_SYSC_OMAP3_SHAM,2672	.sysc_mask = SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE,2673	.regbits = &sysc_regbits_omap3_sham,2674};2675 2676/*2677 * AES register bits found on omap3 and later, a variant of2678 * sysc_regbits_omap2 with different sidle position2679 */2680static const struct sysc_regbits sysc_regbits_omap3_aes = {2681	.dmadisable_shift = -ENODEV,2682	.midle_shift = -ENODEV,2683	.sidle_shift = 6,2684	.clkact_shift = -ENODEV,2685	.enwkup_shift = -ENODEV,2686	.srst_shift = 1,2687	.autoidle_shift = 0,2688	.emufree_shift = -ENODEV,2689};2690 2691static const struct sysc_capabilities sysc_omap3_aes = {2692	.type = TI_SYSC_OMAP3_AES,2693	.sysc_mask = SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE,2694	.regbits = &sysc_regbits_omap3_aes,2695};2696 2697/*2698 * Common sysc register bits found on omap4, also known as type22699 */2700static const struct sysc_regbits sysc_regbits_omap4 = {2701	.dmadisable_shift = 16,2702	.midle_shift = 4,2703	.sidle_shift = 2,2704	.clkact_shift = -ENODEV,2705	.enwkup_shift = -ENODEV,2706	.emufree_shift = 1,2707	.srst_shift = 0,2708	.autoidle_shift = -ENODEV,2709};2710 2711static const struct sysc_capabilities sysc_omap4 = {2712	.type = TI_SYSC_OMAP4,2713	.sysc_mask = SYSC_OMAP4_DMADISABLE | SYSC_OMAP4_FREEEMU |2714		     SYSC_OMAP4_SOFTRESET,2715	.regbits = &sysc_regbits_omap4,2716};2717 2718static const struct sysc_capabilities sysc_omap4_timer = {2719	.type = TI_SYSC_OMAP4_TIMER,2720	.sysc_mask = SYSC_OMAP4_DMADISABLE | SYSC_OMAP4_FREEEMU |2721		     SYSC_OMAP4_SOFTRESET,2722	.regbits = &sysc_regbits_omap4,2723};2724 2725/*2726 * Common sysc register bits found on omap4, also known as type32727 */2728static const struct sysc_regbits sysc_regbits_omap4_simple = {2729	.dmadisable_shift = -ENODEV,2730	.midle_shift = 2,2731	.sidle_shift = 0,2732	.clkact_shift = -ENODEV,2733	.enwkup_shift = -ENODEV,2734	.srst_shift = -ENODEV,2735	.emufree_shift = -ENODEV,2736	.autoidle_shift = -ENODEV,2737};2738 2739static const struct sysc_capabilities sysc_omap4_simple = {2740	.type = TI_SYSC_OMAP4_SIMPLE,2741	.regbits = &sysc_regbits_omap4_simple,2742};2743 2744/*2745 * SmartReflex sysc found on omap34xx2746 */2747static const struct sysc_regbits sysc_regbits_omap34xx_sr = {2748	.dmadisable_shift = -ENODEV,2749	.midle_shift = -ENODEV,2750	.sidle_shift = -ENODEV,2751	.clkact_shift = 20,2752	.enwkup_shift = -ENODEV,2753	.srst_shift = -ENODEV,2754	.emufree_shift = -ENODEV,2755	.autoidle_shift = -ENODEV,2756};2757 2758static const struct sysc_capabilities sysc_34xx_sr = {2759	.type = TI_SYSC_OMAP34XX_SR,2760	.sysc_mask = SYSC_OMAP2_CLOCKACTIVITY,2761	.regbits = &sysc_regbits_omap34xx_sr,2762	.mod_quirks = SYSC_QUIRK_USE_CLOCKACT | SYSC_QUIRK_UNCACHED,2763};2764 2765/*2766 * SmartReflex sysc found on omap36xx and later2767 */2768static const struct sysc_regbits sysc_regbits_omap36xx_sr = {2769	.dmadisable_shift = -ENODEV,2770	.midle_shift = -ENODEV,2771	.sidle_shift = 24,2772	.clkact_shift = -ENODEV,2773	.enwkup_shift = 26,2774	.srst_shift = -ENODEV,2775	.emufree_shift = -ENODEV,2776	.autoidle_shift = -ENODEV,2777};2778 2779static const struct sysc_capabilities sysc_36xx_sr = {2780	.type = TI_SYSC_OMAP36XX_SR,2781	.sysc_mask = SYSC_OMAP3_SR_ENAWAKEUP,2782	.regbits = &sysc_regbits_omap36xx_sr,2783	.mod_quirks = SYSC_QUIRK_UNCACHED,2784};2785 2786static const struct sysc_capabilities sysc_omap4_sr = {2787	.type = TI_SYSC_OMAP4_SR,2788	.regbits = &sysc_regbits_omap36xx_sr,2789};2790 2791/*2792 * McASP register bits found on omap4 and later2793 */2794static const struct sysc_regbits sysc_regbits_omap4_mcasp = {2795	.dmadisable_shift = -ENODEV,2796	.midle_shift = -ENODEV,2797	.sidle_shift = 0,2798	.clkact_shift = -ENODEV,2799	.enwkup_shift = -ENODEV,2800	.srst_shift = -ENODEV,2801	.emufree_shift = -ENODEV,2802	.autoidle_shift = -ENODEV,2803};2804 2805static const struct sysc_capabilities sysc_omap4_mcasp = {2806	.type = TI_SYSC_OMAP4_MCASP,2807	.regbits = &sysc_regbits_omap4_mcasp,2808	.mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED,2809};2810 2811/*2812 * McASP found on dra7 and later2813 */2814static const struct sysc_capabilities sysc_dra7_mcasp = {2815	.type = TI_SYSC_OMAP4_SIMPLE,2816	.regbits = &sysc_regbits_omap4_simple,2817	.mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED,2818};2819 2820/*2821 * FS USB host found on omap4 and later2822 */2823static const struct sysc_regbits sysc_regbits_omap4_usb_host_fs = {2824	.dmadisable_shift = -ENODEV,2825	.midle_shift = -ENODEV,2826	.sidle_shift = 24,2827	.clkact_shift = -ENODEV,2828	.enwkup_shift = 26,2829	.srst_shift = -ENODEV,2830	.emufree_shift = -ENODEV,2831	.autoidle_shift = -ENODEV,2832};2833 2834static const struct sysc_capabilities sysc_omap4_usb_host_fs = {2835	.type = TI_SYSC_OMAP4_USB_HOST_FS,2836	.sysc_mask = SYSC_OMAP2_ENAWAKEUP,2837	.regbits = &sysc_regbits_omap4_usb_host_fs,2838};2839 2840static const struct sysc_regbits sysc_regbits_dra7_mcan = {2841	.dmadisable_shift = -ENODEV,2842	.midle_shift = -ENODEV,2843	.sidle_shift = -ENODEV,2844	.clkact_shift = -ENODEV,2845	.enwkup_shift = 4,2846	.srst_shift = 0,2847	.emufree_shift = -ENODEV,2848	.autoidle_shift = -ENODEV,2849};2850 2851static const struct sysc_capabilities sysc_dra7_mcan = {2852	.type = TI_SYSC_DRA7_MCAN,2853	.sysc_mask = SYSC_DRA7_MCAN_ENAWAKEUP | SYSC_OMAP4_SOFTRESET,2854	.regbits = &sysc_regbits_dra7_mcan,2855	.mod_quirks = SYSS_QUIRK_RESETDONE_INVERTED,2856};2857 2858/*2859 * PRUSS found on some AM33xx, AM437x and AM57xx SoCs2860 */2861static const struct sysc_capabilities sysc_pruss = {2862	.type = TI_SYSC_PRUSS,2863	.sysc_mask = SYSC_PRUSS_STANDBY_INIT | SYSC_PRUSS_SUB_MWAIT,2864	.regbits = &sysc_regbits_omap4_simple,2865	.mod_quirks = SYSC_MODULE_QUIRK_PRUSS,2866};2867 2868static int sysc_init_pdata(struct sysc *ddata)2869{2870	struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);2871	struct ti_sysc_module_data *mdata;2872 2873	if (!pdata)2874		return 0;2875 2876	mdata = devm_kzalloc(ddata->dev, sizeof(*mdata), GFP_KERNEL);2877	if (!mdata)2878		return -ENOMEM;2879 2880	if (ddata->legacy_mode) {2881		mdata->name = ddata->legacy_mode;2882		mdata->module_pa = ddata->module_pa;2883		mdata->module_size = ddata->module_size;2884		mdata->offsets = ddata->offsets;2885		mdata->nr_offsets = SYSC_MAX_REGS;2886		mdata->cap = ddata->cap;2887		mdata->cfg = &ddata->cfg;2888	}2889 2890	ddata->mdata = mdata;2891 2892	return 0;2893}2894 2895static int sysc_init_match(struct sysc *ddata)2896{2897	const struct sysc_capabilities *cap;2898 2899	cap = of_device_get_match_data(ddata->dev);2900	if (!cap)2901		return -EINVAL;2902 2903	ddata->cap = cap;2904	if (ddata->cap)2905		ddata->cfg.quirks |= ddata->cap->mod_quirks;2906 2907	return 0;2908}2909 2910static void ti_sysc_idle(struct work_struct *work)2911{2912	struct sysc *ddata;2913 2914	ddata = container_of(work, struct sysc, idle_work.work);2915 2916	/*2917	 * One time decrement of clock usage counts if left on from init.2918	 * Note that we disable opt clocks unconditionally in this case2919	 * as they are enabled unconditionally during init without2920	 * considering sysc_opt_clks_needed() at that point.2921	 */2922	if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE |2923				 SYSC_QUIRK_NO_IDLE_ON_INIT)) {2924		sysc_disable_main_clocks(ddata);2925		sysc_disable_opt_clocks(ddata);2926		sysc_clkdm_allow_idle(ddata);2927	}2928 2929	/* Keep permanent PM runtime usage count for SYSC_QUIRK_NO_IDLE */2930	if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)2931		return;2932 2933	/*2934	 * Decrement PM runtime usage count for SYSC_QUIRK_NO_IDLE_ON_INIT2935	 * and SYSC_QUIRK_NO_RESET_ON_INIT2936	 */2937	if (pm_runtime_active(ddata->dev))2938		pm_runtime_put_sync(ddata->dev);2939}2940 2941/*2942 * SoC model and features detection. Only needed for SoCs that need2943 * special handling for quirks, no need to list others.2944 */2945static const struct soc_device_attribute sysc_soc_match[] = {2946	SOC_FLAG("OMAP242*", SOC_2420),2947	SOC_FLAG("OMAP243*", SOC_2430),2948	SOC_FLAG("AM35*", SOC_AM35),2949	SOC_FLAG("OMAP3[45]*", SOC_3430),2950	SOC_FLAG("OMAP3[67]*", SOC_3630),2951	SOC_FLAG("OMAP443*", SOC_4430),2952	SOC_FLAG("OMAP446*", SOC_4460),2953	SOC_FLAG("OMAP447*", SOC_4470),2954	SOC_FLAG("OMAP54*", SOC_5430),2955	SOC_FLAG("AM433", SOC_AM3),2956	SOC_FLAG("AM43*", SOC_AM4),2957	SOC_FLAG("DRA7*", SOC_DRA7),2958 2959	{ /* sentinel */ }2960};2961 2962/*2963 * List of SoCs variants with disabled features. By default we assume all2964 * devices in the device tree are available so no need to list those SoCs.2965 */2966static const struct soc_device_attribute sysc_soc_feat_match[] = {2967	/* OMAP3430/3530 and AM3517 variants with some accelerators disabled */2968	SOC_FLAG("AM3505", DIS_SGX),2969	SOC_FLAG("OMAP3525", DIS_SGX),2970	SOC_FLAG("OMAP3515", DIS_IVA | DIS_SGX),2971	SOC_FLAG("OMAP3503", DIS_ISP | DIS_IVA | DIS_SGX),2972 2973	/* OMAP3630/DM3730 variants with some accelerators disabled */2974	SOC_FLAG("AM3703", DIS_IVA | DIS_SGX),2975	SOC_FLAG("DM3725", DIS_SGX),2976	SOC_FLAG("OMAP3611", DIS_ISP | DIS_IVA | DIS_SGX),2977	SOC_FLAG("OMAP3615/AM3715", DIS_IVA),2978	SOC_FLAG("OMAP3621", DIS_ISP),2979 2980	{ /* sentinel */ }2981};2982 2983static int sysc_add_disabled(unsigned long base)2984{2985	struct sysc_address *disabled_module;2986 2987	disabled_module = kzalloc(sizeof(*disabled_module), GFP_KERNEL);2988	if (!disabled_module)2989		return -ENOMEM;2990 2991	disabled_module->base = base;2992 2993	mutex_lock(&sysc_soc->list_lock);2994	list_add(&disabled_module->node, &sysc_soc->disabled_modules);2995	mutex_unlock(&sysc_soc->list_lock);2996 2997	return 0;2998}2999 3000/*3001 * One time init to detect the booted SoC, disable unavailable features3002 * and initialize list for optional cpu_pm notifier.3003 *3004 * Note that we initialize static data shared across all ti-sysc instances3005 * so ddata is only used for SoC type. This can be called from module_init3006 * once we no longer need to rely on platform data.3007 */3008static int sysc_init_static_data(struct sysc *ddata)3009{3010	const struct soc_device_attribute *match;3011	struct ti_sysc_platform_data *pdata;3012	unsigned long features = 0;3013	struct device_node *np;3014 3015	if (sysc_soc)3016		return 0;3017 3018	sysc_soc = kzalloc(sizeof(*sysc_soc), GFP_KERNEL);3019	if (!sysc_soc)3020		return -ENOMEM;3021 3022	mutex_init(&sysc_soc->list_lock);3023	INIT_LIST_HEAD(&sysc_soc->disabled_modules);3024	INIT_LIST_HEAD(&sysc_soc->restored_modules);3025	sysc_soc->general_purpose = true;3026 3027	pdata = dev_get_platdata(ddata->dev);3028	if (pdata && pdata->soc_type_gp)3029		sysc_soc->general_purpose = pdata->soc_type_gp();3030 3031	match = soc_device_match(sysc_soc_match);3032	if (match && match->data)3033		sysc_soc->soc = (enum sysc_soc)(uintptr_t)match->data;3034 3035	/*3036	 * Check and warn about possible old incomplete dtb. We now want to see3037	 * simple-pm-bus instead of simple-bus in the dtb for genpd using SoCs.3038	 */3039	switch (sysc_soc->soc) {3040	case SOC_AM3:3041	case SOC_AM4:3042	case SOC_4430 ... SOC_4470:3043	case SOC_5430:3044	case SOC_DRA7:3045		np = of_find_node_by_path("/ocp");3046		WARN_ONCE(np && of_device_is_compatible(np, "simple-bus"),3047			  "ti-sysc: Incomplete old dtb, please update\n");3048		break;3049	default:3050		break;3051	}3052 3053	/* Ignore devices that are not available on HS and EMU SoCs */3054	if (!sysc_soc->general_purpose) {3055		switch (sysc_soc->soc) {3056		case SOC_3430 ... SOC_3630:3057			sysc_add_disabled(0x48304000);	/* timer12 */3058			break;3059		case SOC_AM3:3060			sysc_add_disabled(0x48310000);  /* rng */3061			break;3062		default:3063			break;3064		}3065	}3066 3067	match = soc_device_match(sysc_soc_feat_match);3068	if (!match)3069		return 0;3070 3071	if (match->data)3072		features = (unsigned long)match->data;3073 3074	/*3075	 * Add disabled devices to the list based on the module base.3076	 * Note that this must be done before we attempt to access the3077	 * device and have module revision checks working.3078	 */3079	if (features & DIS_ISP)3080		sysc_add_disabled(0x480bd400);3081	if (features & DIS_IVA)3082		sysc_add_disabled(0x5d000000);3083	if (features & DIS_SGX)3084		sysc_add_disabled(0x50000000);3085 3086	return 0;3087}3088 3089static void sysc_cleanup_static_data(void)3090{3091	struct sysc_module *restored_module;3092	struct sysc_address *disabled_module;3093	struct list_head *pos, *tmp;3094 3095	if (!sysc_soc)3096		return;3097 3098	if (sysc_soc->nb.notifier_call)3099		cpu_pm_unregister_notifier(&sysc_soc->nb);3100 3101	mutex_lock(&sysc_soc->list_lock);3102	list_for_each_safe(pos, tmp, &sysc_soc->restored_modules) {3103		restored_module = list_entry(pos, struct sysc_module, node);3104		list_del(pos);3105		kfree(restored_module);3106	}3107	list_for_each_safe(pos, tmp, &sysc_soc->disabled_modules) {3108		disabled_module = list_entry(pos, struct sysc_address, node);3109		list_del(pos);3110		kfree(disabled_module);3111	}3112	mutex_unlock(&sysc_soc->list_lock);3113}3114 3115static int sysc_check_disabled_devices(struct sysc *ddata)3116{3117	struct sysc_address *disabled_module;3118	int error = 0;3119 3120	mutex_lock(&sysc_soc->list_lock);3121	list_for_each_entry(disabled_module, &sysc_soc->disabled_modules, node) {3122		if (ddata->module_pa == disabled_module->base) {3123			dev_dbg(ddata->dev, "module disabled for this SoC\n");3124			error = -ENODEV;3125			break;3126		}3127	}3128	mutex_unlock(&sysc_soc->list_lock);3129 3130	return error;3131}3132 3133/*3134 * Ignore timers tagged with no-reset and no-idle. These are likely in use,3135 * for example by drivers/clocksource/timer-ti-dm-systimer.c. If more checks3136 * are needed, we could also look at the timer register configuration.3137 */3138static int sysc_check_active_timer(struct sysc *ddata)3139{3140	int error;3141 3142	if (ddata->cap->type != TI_SYSC_OMAP2_TIMER &&3143	    ddata->cap->type != TI_SYSC_OMAP4_TIMER)3144		return 0;3145 3146	/*3147	 * Quirk for omap3 beagleboard revision A to B4 to use gpt12.3148	 * Revision C and later are fixed with commit 23885389dbbb ("ARM:3149	 * dts: Fix timer regression for beagleboard revision c"). This all3150	 * can be dropped if we stop supporting old beagleboard revisions3151	 * A to B4 at some point.3152	 */3153	if (sysc_soc->soc == SOC_3430 || sysc_soc->soc == SOC_AM35)3154		error = -ENXIO;3155	else3156		error = -EBUSY;3157 3158	if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) &&3159	    (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE))3160		return error;3161 3162	return 0;3163}3164 3165static const struct of_device_id sysc_match_table[] = {3166	{ .compatible = "simple-bus", },3167	{ /* sentinel */ },3168};3169 3170static int sysc_probe(struct platform_device *pdev)3171{3172	struct ti_sysc_platform_data *pdata = dev_get_platdata(&pdev->dev);3173	struct sysc *ddata;3174	int error;3175 3176	ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);3177	if (!ddata)3178		return -ENOMEM;3179 3180	ddata->offsets[SYSC_REVISION] = -ENODEV;3181	ddata->offsets[SYSC_SYSCONFIG] = -ENODEV;3182	ddata->offsets[SYSC_SYSSTATUS] = -ENODEV;3183	ddata->dev = &pdev->dev;3184	platform_set_drvdata(pdev, ddata);3185 3186	error = sysc_init_static_data(ddata);3187	if (error)3188		return error;3189 3190	error = sysc_init_match(ddata);3191	if (error)3192		return error;3193 3194	error = sysc_init_dts_quirks(ddata);3195	if (error)3196		return error;3197 3198	error = sysc_map_and_check_registers(ddata);3199	if (error)3200		return error;3201 3202	error = sysc_init_sysc_mask(ddata);3203	if (error)3204		return error;3205 3206	error = sysc_init_idlemodes(ddata);3207	if (error)3208		return error;3209 3210	error = sysc_init_syss_mask(ddata);3211	if (error)3212		return error;3213 3214	error = sysc_init_pdata(ddata);3215	if (error)3216		return error;3217 3218	sysc_init_early_quirks(ddata);3219 3220	error = sysc_check_disabled_devices(ddata);3221	if (error)3222		return error;3223 3224	error = sysc_check_active_timer(ddata);3225	if (error == -ENXIO)3226		ddata->reserved = true;3227	else if (error)3228		return error;3229 3230	error = sysc_get_clocks(ddata);3231	if (error)3232		return error;3233 3234	error = sysc_init_resets(ddata);3235	if (error)3236		goto unprepare;3237 3238	error = sysc_init_module(ddata);3239	if (error)3240		goto unprepare;3241 3242	pm_runtime_enable(ddata->dev);3243	error = pm_runtime_resume_and_get(ddata->dev);3244	if (error < 0) {3245		pm_runtime_disable(ddata->dev);3246		goto unprepare;3247	}3248 3249	/* Balance use counts as PM runtime should have enabled these all */3250	if (!(ddata->cfg.quirks &3251	      (SYSC_QUIRK_NO_IDLE | SYSC_QUIRK_NO_IDLE_ON_INIT))) {3252		sysc_disable_main_clocks(ddata);3253		sysc_disable_opt_clocks(ddata);3254		sysc_clkdm_allow_idle(ddata);3255	}3256 3257	if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))3258		reset_control_assert(ddata->rsts);3259 3260	sysc_show_registers(ddata);3261 3262	ddata->dev->type = &sysc_device_type;3263 3264	if (!ddata->reserved) {3265		error = of_platform_populate(ddata->dev->of_node,3266					     sysc_match_table,3267					     pdata ? pdata->auxdata : NULL,3268					     ddata->dev);3269		if (error)3270			goto err;3271	}3272 3273	INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle);3274 3275	/* At least earlycon won't survive without deferred idle */3276	if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE |3277				 SYSC_QUIRK_NO_IDLE_ON_INIT |3278				 SYSC_QUIRK_NO_RESET_ON_INIT)) {3279		schedule_delayed_work(&ddata->idle_work, 3000);3280	} else {3281		pm_runtime_put(&pdev->dev);3282	}3283 3284	if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_CTX_LOST)3285		sysc_add_restored(ddata);3286 3287	return 0;3288 3289err:3290	pm_runtime_put_sync(&pdev->dev);3291	pm_runtime_disable(&pdev->dev);3292unprepare:3293	sysc_unprepare(ddata);3294 3295	return error;3296}3297 3298static void sysc_remove(struct platform_device *pdev)3299{3300	struct sysc *ddata = platform_get_drvdata(pdev);3301	int error;3302 3303	/* Device can still be enabled, see deferred idle quirk in probe */3304	if (cancel_delayed_work_sync(&ddata->idle_work))3305		ti_sysc_idle(&ddata->idle_work.work);3306 3307	error = pm_runtime_resume_and_get(ddata->dev);3308	if (error < 0) {3309		pm_runtime_disable(ddata->dev);3310		goto unprepare;3311	}3312 3313	of_platform_depopulate(&pdev->dev);3314 3315	pm_runtime_put_sync(&pdev->dev);3316	pm_runtime_disable(&pdev->dev);3317 3318	if (!reset_control_status(ddata->rsts))3319		reset_control_assert(ddata->rsts);3320 3321unprepare:3322	sysc_unprepare(ddata);3323}3324 3325static const struct of_device_id sysc_match[] = {3326	{ .compatible = "ti,sysc-omap2", .data = &sysc_omap2, },3327	{ .compatible = "ti,sysc-omap2-timer", .data = &sysc_omap2_timer, },3328	{ .compatible = "ti,sysc-omap4", .data = &sysc_omap4, },3329	{ .compatible = "ti,sysc-omap4-timer", .data = &sysc_omap4_timer, },3330	{ .compatible = "ti,sysc-omap4-simple", .data = &sysc_omap4_simple, },3331	{ .compatible = "ti,sysc-omap3430-sr", .data = &sysc_34xx_sr, },3332	{ .compatible = "ti,sysc-omap3630-sr", .data = &sysc_36xx_sr, },3333	{ .compatible = "ti,sysc-omap4-sr", .data = &sysc_omap4_sr, },3334	{ .compatible = "ti,sysc-omap3-sham", .data = &sysc_omap3_sham, },3335	{ .compatible = "ti,sysc-omap-aes", .data = &sysc_omap3_aes, },3336	{ .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, },3337	{ .compatible = "ti,sysc-dra7-mcasp", .data = &sysc_dra7_mcasp, },3338	{ .compatible = "ti,sysc-usb-host-fs",3339	  .data = &sysc_omap4_usb_host_fs, },3340	{ .compatible = "ti,sysc-dra7-mcan", .data = &sysc_dra7_mcan, },3341	{ .compatible = "ti,sysc-pruss", .data = &sysc_pruss, },3342	{  },3343};3344MODULE_DEVICE_TABLE(of, sysc_match);3345 3346static struct platform_driver sysc_driver = {3347	.probe		= sysc_probe,3348	.remove_new	= sysc_remove,3349	.driver         = {3350		.name   = "ti-sysc",3351		.of_match_table	= sysc_match,3352		.pm = &sysc_pm_ops,3353	},3354};3355 3356static int __init sysc_init(void)3357{3358	bus_register_notifier(&platform_bus_type, &sysc_nb);3359 3360	return platform_driver_register(&sysc_driver);3361}3362module_init(sysc_init);3363 3364static void __exit sysc_exit(void)3365{3366	bus_unregister_notifier(&platform_bus_type, &sysc_nb);3367	platform_driver_unregister(&sysc_driver);3368	sysc_cleanup_static_data();3369}3370module_exit(sysc_exit);3371 3372MODULE_DESCRIPTION("TI sysc interconnect target driver");3373MODULE_LICENSE("GPL v2");3374