Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * ti-sysc.c - Texas Instruments sysc interconnect target driver
0004  */
0005 
0006 #include <linux/io.h>
0007 #include <linux/clk.h>
0008 #include <linux/clkdev.h>
0009 #include <linux/cpu_pm.h>
0010 #include <linux/delay.h>
0011 #include <linux/list.h>
0012 #include <linux/module.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/pm_domain.h>
0015 #include <linux/pm_runtime.h>
0016 #include <linux/reset.h>
0017 #include <linux/of_address.h>
0018 #include <linux/of_platform.h>
0019 #include <linux/slab.h>
0020 #include <linux/sys_soc.h>
0021 #include <linux/timekeeping.h>
0022 #include <linux/iopoll.h>
0023 
0024 #include <linux/platform_data/ti-sysc.h>
0025 
0026 #include <dt-bindings/bus/ti-sysc.h>
0027 
0028 #define DIS_ISP     BIT(2)
0029 #define DIS_IVA     BIT(1)
0030 #define DIS_SGX     BIT(0)
0031 
0032 #define SOC_FLAG(match, flag)   { .machine = match, .data = (void *)(flag), }
0033 
0034 #define MAX_MODULE_SOFTRESET_WAIT       10000
0035 
0036 enum sysc_soc {
0037     SOC_UNKNOWN,
0038     SOC_2420,
0039     SOC_2430,
0040     SOC_3430,
0041     SOC_3630,
0042     SOC_4430,
0043     SOC_4460,
0044     SOC_4470,
0045     SOC_5430,
0046     SOC_AM3,
0047     SOC_AM4,
0048     SOC_DRA7,
0049 };
0050 
0051 struct sysc_address {
0052     unsigned long base;
0053     struct list_head node;
0054 };
0055 
0056 struct sysc_module {
0057     struct sysc *ddata;
0058     struct list_head node;
0059 };
0060 
0061 struct sysc_soc_info {
0062     unsigned long general_purpose:1;
0063     enum sysc_soc soc;
0064     struct mutex list_lock; /* disabled and restored modules list lock */
0065     struct list_head disabled_modules;
0066     struct list_head restored_modules;
0067     struct notifier_block nb;
0068 };
0069 
0070 enum sysc_clocks {
0071     SYSC_FCK,
0072     SYSC_ICK,
0073     SYSC_OPTFCK0,
0074     SYSC_OPTFCK1,
0075     SYSC_OPTFCK2,
0076     SYSC_OPTFCK3,
0077     SYSC_OPTFCK4,
0078     SYSC_OPTFCK5,
0079     SYSC_OPTFCK6,
0080     SYSC_OPTFCK7,
0081     SYSC_MAX_CLOCKS,
0082 };
0083 
0084 static struct sysc_soc_info *sysc_soc;
0085 static const char * const reg_names[] = { "rev", "sysc", "syss", };
0086 static const char * const clock_names[SYSC_MAX_CLOCKS] = {
0087     "fck", "ick", "opt0", "opt1", "opt2", "opt3", "opt4",
0088     "opt5", "opt6", "opt7",
0089 };
0090 
0091 #define SYSC_IDLEMODE_MASK      3
0092 #define SYSC_CLOCKACTIVITY_MASK     3
0093 
0094 /**
0095  * struct sysc - TI sysc interconnect target module registers and capabilities
0096  * @dev: struct device pointer
0097  * @module_pa: physical address of the interconnect target module
0098  * @module_size: size of the interconnect target module
0099  * @module_va: virtual address of the interconnect target module
0100  * @offsets: register offsets from module base
0101  * @mdata: ti-sysc to hwmod translation data for a module
0102  * @clocks: clocks used by the interconnect target module
0103  * @clock_roles: clock role names for the found clocks
0104  * @nr_clocks: number of clocks used by the interconnect target module
0105  * @rsts: resets used by the interconnect target module
0106  * @legacy_mode: configured for legacy mode if set
0107  * @cap: interconnect target module capabilities
0108  * @cfg: interconnect target module configuration
0109  * @cookie: data used by legacy platform callbacks
0110  * @name: name if available
0111  * @revision: interconnect target module revision
0112  * @reserved: target module is reserved and already in use
0113  * @enabled: sysc runtime enabled status
0114  * @needs_resume: runtime resume needed on resume from suspend
0115  * @child_needs_resume: runtime resume needed for child on resume from suspend
0116  * @disable_on_idle: status flag used for disabling modules with resets
0117  * @idle_work: work structure used to perform delayed idle on a module
0118  * @pre_reset_quirk: module specific pre-reset quirk
0119  * @post_reset_quirk: module specific post-reset quirk
0120  * @reset_done_quirk: module specific reset done quirk
0121  * @module_enable_quirk: module specific enable quirk
0122  * @module_disable_quirk: module specific disable quirk
0123  * @module_unlock_quirk: module specific sysconfig unlock quirk
0124  * @module_lock_quirk: module specific sysconfig lock quirk
0125  */
0126 struct sysc {
0127     struct device *dev;
0128     u64 module_pa;
0129     u32 module_size;
0130     void __iomem *module_va;
0131     int offsets[SYSC_MAX_REGS];
0132     struct ti_sysc_module_data *mdata;
0133     struct clk **clocks;
0134     const char **clock_roles;
0135     int nr_clocks;
0136     struct reset_control *rsts;
0137     const char *legacy_mode;
0138     const struct sysc_capabilities *cap;
0139     struct sysc_config cfg;
0140     struct ti_sysc_cookie cookie;
0141     const char *name;
0142     u32 revision;
0143     u32 sysconfig;
0144     unsigned int reserved:1;
0145     unsigned int enabled:1;
0146     unsigned int needs_resume:1;
0147     unsigned int child_needs_resume:1;
0148     struct delayed_work idle_work;
0149     void (*pre_reset_quirk)(struct sysc *sysc);
0150     void (*post_reset_quirk)(struct sysc *sysc);
0151     void (*reset_done_quirk)(struct sysc *sysc);
0152     void (*module_enable_quirk)(struct sysc *sysc);
0153     void (*module_disable_quirk)(struct sysc *sysc);
0154     void (*module_unlock_quirk)(struct sysc *sysc);
0155     void (*module_lock_quirk)(struct sysc *sysc);
0156 };
0157 
0158 static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
0159                   bool is_child);
0160 static int sysc_reset(struct sysc *ddata);
0161 
0162 static void sysc_write(struct sysc *ddata, int offset, u32 value)
0163 {
0164     if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {
0165         writew_relaxed(value & 0xffff, ddata->module_va + offset);
0166 
0167         /* Only i2c revision has LO and HI register with stride of 4 */
0168         if (ddata->offsets[SYSC_REVISION] >= 0 &&
0169             offset == ddata->offsets[SYSC_REVISION]) {
0170             u16 hi = value >> 16;
0171 
0172             writew_relaxed(hi, ddata->module_va + offset + 4);
0173         }
0174 
0175         return;
0176     }
0177 
0178     writel_relaxed(value, ddata->module_va + offset);
0179 }
0180 
0181 static u32 sysc_read(struct sysc *ddata, int offset)
0182 {
0183     if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {
0184         u32 val;
0185 
0186         val = readw_relaxed(ddata->module_va + offset);
0187 
0188         /* Only i2c revision has LO and HI register with stride of 4 */
0189         if (ddata->offsets[SYSC_REVISION] >= 0 &&
0190             offset == ddata->offsets[SYSC_REVISION]) {
0191             u16 tmp = readw_relaxed(ddata->module_va + offset + 4);
0192 
0193             val |= tmp << 16;
0194         }
0195 
0196         return val;
0197     }
0198 
0199     return readl_relaxed(ddata->module_va + offset);
0200 }
0201 
0202 static bool sysc_opt_clks_needed(struct sysc *ddata)
0203 {
0204     return !!(ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_NEEDED);
0205 }
0206 
0207 static u32 sysc_read_revision(struct sysc *ddata)
0208 {
0209     int offset = ddata->offsets[SYSC_REVISION];
0210 
0211     if (offset < 0)
0212         return 0;
0213 
0214     return sysc_read(ddata, offset);
0215 }
0216 
0217 static u32 sysc_read_sysconfig(struct sysc *ddata)
0218 {
0219     int offset = ddata->offsets[SYSC_SYSCONFIG];
0220 
0221     if (offset < 0)
0222         return 0;
0223 
0224     return sysc_read(ddata, offset);
0225 }
0226 
0227 static u32 sysc_read_sysstatus(struct sysc *ddata)
0228 {
0229     int offset = ddata->offsets[SYSC_SYSSTATUS];
0230 
0231     if (offset < 0)
0232         return 0;
0233 
0234     return sysc_read(ddata, offset);
0235 }
0236 
0237 static int sysc_poll_reset_sysstatus(struct sysc *ddata)
0238 {
0239     int error, retries;
0240     u32 syss_done, rstval;
0241 
0242     if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED)
0243         syss_done = 0;
0244     else
0245         syss_done = ddata->cfg.syss_mask;
0246 
0247     if (likely(!timekeeping_suspended)) {
0248         error = readx_poll_timeout_atomic(sysc_read_sysstatus, ddata,
0249                 rstval, (rstval & ddata->cfg.syss_mask) ==
0250                 syss_done, 100, MAX_MODULE_SOFTRESET_WAIT);
0251     } else {
0252         retries = MAX_MODULE_SOFTRESET_WAIT;
0253         while (retries--) {
0254             rstval = sysc_read_sysstatus(ddata);
0255             if ((rstval & ddata->cfg.syss_mask) == syss_done)
0256                 return 0;
0257             udelay(2); /* Account for udelay flakeyness */
0258         }
0259         error = -ETIMEDOUT;
0260     }
0261 
0262     return error;
0263 }
0264 
0265 static int sysc_poll_reset_sysconfig(struct sysc *ddata)
0266 {
0267     int error, retries;
0268     u32 sysc_mask, rstval;
0269 
0270     sysc_mask = BIT(ddata->cap->regbits->srst_shift);
0271 
0272     if (likely(!timekeeping_suspended)) {
0273         error = readx_poll_timeout_atomic(sysc_read_sysconfig, ddata,
0274                 rstval, !(rstval & sysc_mask),
0275                 100, MAX_MODULE_SOFTRESET_WAIT);
0276     } else {
0277         retries = MAX_MODULE_SOFTRESET_WAIT;
0278         while (retries--) {
0279             rstval = sysc_read_sysconfig(ddata);
0280             if (!(rstval & sysc_mask))
0281                 return 0;
0282             udelay(2); /* Account for udelay flakeyness */
0283         }
0284         error = -ETIMEDOUT;
0285     }
0286 
0287     return error;
0288 }
0289 
0290 /* Poll on reset status */
0291 static int sysc_wait_softreset(struct sysc *ddata)
0292 {
0293     int syss_offset, error = 0;
0294 
0295     if (ddata->cap->regbits->srst_shift < 0)
0296         return 0;
0297 
0298     syss_offset = ddata->offsets[SYSC_SYSSTATUS];
0299 
0300     if (syss_offset >= 0)
0301         error = sysc_poll_reset_sysstatus(ddata);
0302     else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS)
0303         error = sysc_poll_reset_sysconfig(ddata);
0304 
0305     return error;
0306 }
0307 
0308 static int sysc_add_named_clock_from_child(struct sysc *ddata,
0309                        const char *name,
0310                        const char *optfck_name)
0311 {
0312     struct device_node *np = ddata->dev->of_node;
0313     struct device_node *child;
0314     struct clk_lookup *cl;
0315     struct clk *clock;
0316     const char *n;
0317 
0318     if (name)
0319         n = name;
0320     else
0321         n = optfck_name;
0322 
0323     /* Does the clock alias already exist? */
0324     clock = of_clk_get_by_name(np, n);
0325     if (!IS_ERR(clock)) {
0326         clk_put(clock);
0327 
0328         return 0;
0329     }
0330 
0331     child = of_get_next_available_child(np, NULL);
0332     if (!child)
0333         return -ENODEV;
0334 
0335     clock = devm_get_clk_from_child(ddata->dev, child, name);
0336     if (IS_ERR(clock))
0337         return PTR_ERR(clock);
0338 
0339     /*
0340      * Use clkdev_add() instead of clkdev_alloc() to avoid the MAX_DEV_ID
0341      * limit for clk_get(). If cl ever needs to be freed, it should be done
0342      * with clkdev_drop().
0343      */
0344     cl = kzalloc(sizeof(*cl), GFP_KERNEL);
0345     if (!cl)
0346         return -ENOMEM;
0347 
0348     cl->con_id = n;
0349     cl->dev_id = dev_name(ddata->dev);
0350     cl->clk = clock;
0351     clkdev_add(cl);
0352 
0353     clk_put(clock);
0354 
0355     return 0;
0356 }
0357 
0358 static int sysc_init_ext_opt_clock(struct sysc *ddata, const char *name)
0359 {
0360     const char *optfck_name;
0361     int error, index;
0362 
0363     if (ddata->nr_clocks < SYSC_OPTFCK0)
0364         index = SYSC_OPTFCK0;
0365     else
0366         index = ddata->nr_clocks;
0367 
0368     if (name)
0369         optfck_name = name;
0370     else
0371         optfck_name = clock_names[index];
0372 
0373     error = sysc_add_named_clock_from_child(ddata, name, optfck_name);
0374     if (error)
0375         return error;
0376 
0377     ddata->clock_roles[index] = optfck_name;
0378     ddata->nr_clocks++;
0379 
0380     return 0;
0381 }
0382 
0383 static int sysc_get_one_clock(struct sysc *ddata, const char *name)
0384 {
0385     int error, i, index = -ENODEV;
0386 
0387     if (!strncmp(clock_names[SYSC_FCK], name, 3))
0388         index = SYSC_FCK;
0389     else if (!strncmp(clock_names[SYSC_ICK], name, 3))
0390         index = SYSC_ICK;
0391 
0392     if (index < 0) {
0393         for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {
0394             if (!ddata->clocks[i]) {
0395                 index = i;
0396                 break;
0397             }
0398         }
0399     }
0400 
0401     if (index < 0) {
0402         dev_err(ddata->dev, "clock %s not added\n", name);
0403         return index;
0404     }
0405 
0406     ddata->clocks[index] = devm_clk_get(ddata->dev, name);
0407     if (IS_ERR(ddata->clocks[index])) {
0408         dev_err(ddata->dev, "clock get error for %s: %li\n",
0409             name, PTR_ERR(ddata->clocks[index]));
0410 
0411         return PTR_ERR(ddata->clocks[index]);
0412     }
0413 
0414     error = clk_prepare(ddata->clocks[index]);
0415     if (error) {
0416         dev_err(ddata->dev, "clock prepare error for %s: %i\n",
0417             name, error);
0418 
0419         return error;
0420     }
0421 
0422     return 0;
0423 }
0424 
0425 static int sysc_get_clocks(struct sysc *ddata)
0426 {
0427     struct device_node *np = ddata->dev->of_node;
0428     struct property *prop;
0429     const char *name;
0430     int nr_fck = 0, nr_ick = 0, i, error = 0;
0431 
0432     ddata->clock_roles = devm_kcalloc(ddata->dev,
0433                       SYSC_MAX_CLOCKS,
0434                       sizeof(*ddata->clock_roles),
0435                       GFP_KERNEL);
0436     if (!ddata->clock_roles)
0437         return -ENOMEM;
0438 
0439     of_property_for_each_string(np, "clock-names", prop, name) {
0440         if (!strncmp(clock_names[SYSC_FCK], name, 3))
0441             nr_fck++;
0442         if (!strncmp(clock_names[SYSC_ICK], name, 3))
0443             nr_ick++;
0444         ddata->clock_roles[ddata->nr_clocks] = name;
0445         ddata->nr_clocks++;
0446     }
0447 
0448     if (ddata->nr_clocks < 1)
0449         return 0;
0450 
0451     if ((ddata->cfg.quirks & SYSC_QUIRK_EXT_OPT_CLOCK)) {
0452         error = sysc_init_ext_opt_clock(ddata, NULL);
0453         if (error)
0454             return error;
0455     }
0456 
0457     if (ddata->nr_clocks > SYSC_MAX_CLOCKS) {
0458         dev_err(ddata->dev, "too many clocks for %pOF\n", np);
0459 
0460         return -EINVAL;
0461     }
0462 
0463     if (nr_fck > 1 || nr_ick > 1) {
0464         dev_err(ddata->dev, "max one fck and ick for %pOF\n", np);
0465 
0466         return -EINVAL;
0467     }
0468 
0469     /* Always add a slot for main clocks fck and ick even if unused */
0470     if (!nr_fck)
0471         ddata->nr_clocks++;
0472     if (!nr_ick)
0473         ddata->nr_clocks++;
0474 
0475     ddata->clocks = devm_kcalloc(ddata->dev,
0476                      ddata->nr_clocks, sizeof(*ddata->clocks),
0477                      GFP_KERNEL);
0478     if (!ddata->clocks)
0479         return -ENOMEM;
0480 
0481     for (i = 0; i < SYSC_MAX_CLOCKS; i++) {
0482         const char *name = ddata->clock_roles[i];
0483 
0484         if (!name)
0485             continue;
0486 
0487         error = sysc_get_one_clock(ddata, name);
0488         if (error)
0489             return error;
0490     }
0491 
0492     return 0;
0493 }
0494 
0495 static int sysc_enable_main_clocks(struct sysc *ddata)
0496 {
0497     struct clk *clock;
0498     int i, error;
0499 
0500     if (!ddata->clocks)
0501         return 0;
0502 
0503     for (i = 0; i < SYSC_OPTFCK0; i++) {
0504         clock = ddata->clocks[i];
0505 
0506         /* Main clocks may not have ick */
0507         if (IS_ERR_OR_NULL(clock))
0508             continue;
0509 
0510         error = clk_enable(clock);
0511         if (error)
0512             goto err_disable;
0513     }
0514 
0515     return 0;
0516 
0517 err_disable:
0518     for (i--; i >= 0; i--) {
0519         clock = ddata->clocks[i];
0520 
0521         /* Main clocks may not have ick */
0522         if (IS_ERR_OR_NULL(clock))
0523             continue;
0524 
0525         clk_disable(clock);
0526     }
0527 
0528     return error;
0529 }
0530 
0531 static void sysc_disable_main_clocks(struct sysc *ddata)
0532 {
0533     struct clk *clock;
0534     int i;
0535 
0536     if (!ddata->clocks)
0537         return;
0538 
0539     for (i = 0; i < SYSC_OPTFCK0; i++) {
0540         clock = ddata->clocks[i];
0541         if (IS_ERR_OR_NULL(clock))
0542             continue;
0543 
0544         clk_disable(clock);
0545     }
0546 }
0547 
0548 static int sysc_enable_opt_clocks(struct sysc *ddata)
0549 {
0550     struct clk *clock;
0551     int i, error;
0552 
0553     if (!ddata->clocks || ddata->nr_clocks < SYSC_OPTFCK0 + 1)
0554         return 0;
0555 
0556     for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {
0557         clock = ddata->clocks[i];
0558 
0559         /* Assume no holes for opt clocks */
0560         if (IS_ERR_OR_NULL(clock))
0561             return 0;
0562 
0563         error = clk_enable(clock);
0564         if (error)
0565             goto err_disable;
0566     }
0567 
0568     return 0;
0569 
0570 err_disable:
0571     for (i--; i >= 0; i--) {
0572         clock = ddata->clocks[i];
0573         if (IS_ERR_OR_NULL(clock))
0574             continue;
0575 
0576         clk_disable(clock);
0577     }
0578 
0579     return error;
0580 }
0581 
0582 static void sysc_disable_opt_clocks(struct sysc *ddata)
0583 {
0584     struct clk *clock;
0585     int i;
0586 
0587     if (!ddata->clocks || ddata->nr_clocks < SYSC_OPTFCK0 + 1)
0588         return;
0589 
0590     for (i = SYSC_OPTFCK0; i < SYSC_MAX_CLOCKS; i++) {
0591         clock = ddata->clocks[i];
0592 
0593         /* Assume no holes for opt clocks */
0594         if (IS_ERR_OR_NULL(clock))
0595             return;
0596 
0597         clk_disable(clock);
0598     }
0599 }
0600 
0601 static void sysc_clkdm_deny_idle(struct sysc *ddata)
0602 {
0603     struct ti_sysc_platform_data *pdata;
0604 
0605     if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))
0606         return;
0607 
0608     pdata = dev_get_platdata(ddata->dev);
0609     if (pdata && pdata->clkdm_deny_idle)
0610         pdata->clkdm_deny_idle(ddata->dev, &ddata->cookie);
0611 }
0612 
0613 static void sysc_clkdm_allow_idle(struct sysc *ddata)
0614 {
0615     struct ti_sysc_platform_data *pdata;
0616 
0617     if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))
0618         return;
0619 
0620     pdata = dev_get_platdata(ddata->dev);
0621     if (pdata && pdata->clkdm_allow_idle)
0622         pdata->clkdm_allow_idle(ddata->dev, &ddata->cookie);
0623 }
0624 
0625 /**
0626  * sysc_init_resets - init rstctrl reset line if configured
0627  * @ddata: device driver data
0628  *
0629  * See sysc_rstctrl_reset_deassert().
0630  */
0631 static int sysc_init_resets(struct sysc *ddata)
0632 {
0633     ddata->rsts =
0634         devm_reset_control_get_optional_shared(ddata->dev, "rstctrl");
0635 
0636     return PTR_ERR_OR_ZERO(ddata->rsts);
0637 }
0638 
0639 /**
0640  * sysc_parse_and_check_child_range - parses module IO region from ranges
0641  * @ddata: device driver data
0642  *
0643  * In general we only need rev, syss, and sysc registers and not the whole
0644  * module range. But we do want the offsets for these registers from the
0645  * module base. This allows us to check them against the legacy hwmod
0646  * platform data. Let's also check the ranges are configured properly.
0647  */
0648 static int sysc_parse_and_check_child_range(struct sysc *ddata)
0649 {
0650     struct device_node *np = ddata->dev->of_node;
0651     const __be32 *ranges;
0652     u32 nr_addr, nr_size;
0653     int len, error;
0654 
0655     ranges = of_get_property(np, "ranges", &len);
0656     if (!ranges) {
0657         dev_err(ddata->dev, "missing ranges for %pOF\n", np);
0658 
0659         return -ENOENT;
0660     }
0661 
0662     len /= sizeof(*ranges);
0663 
0664     if (len < 3) {
0665         dev_err(ddata->dev, "incomplete ranges for %pOF\n", np);
0666 
0667         return -EINVAL;
0668     }
0669 
0670     error = of_property_read_u32(np, "#address-cells", &nr_addr);
0671     if (error)
0672         return -ENOENT;
0673 
0674     error = of_property_read_u32(np, "#size-cells", &nr_size);
0675     if (error)
0676         return -ENOENT;
0677 
0678     if (nr_addr != 1 || nr_size != 1) {
0679         dev_err(ddata->dev, "invalid ranges for %pOF\n", np);
0680 
0681         return -EINVAL;
0682     }
0683 
0684     ranges++;
0685     ddata->module_pa = of_translate_address(np, ranges++);
0686     ddata->module_size = be32_to_cpup(ranges);
0687 
0688     return 0;
0689 }
0690 
0691 /* Interconnect instances to probe before l4_per instances */
0692 static struct resource early_bus_ranges[] = {
0693     /* am3/4 l4_wkup */
0694     { .start = 0x44c00000, .end = 0x44c00000 + 0x300000, },
0695     /* omap4/5 and dra7 l4_cfg */
0696     { .start = 0x4a000000, .end = 0x4a000000 + 0x300000, },
0697     /* omap4 l4_wkup */
0698     { .start = 0x4a300000, .end = 0x4a300000 + 0x30000,  },
0699     /* omap5 and dra7 l4_wkup without dra7 dcan segment */
0700     { .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000,  },
0701 };
0702 
0703 static atomic_t sysc_defer = ATOMIC_INIT(10);
0704 
0705 /**
0706  * sysc_defer_non_critical - defer non_critical interconnect probing
0707  * @ddata: device driver data
0708  *
0709  * We want to probe l4_cfg and l4_wkup interconnect instances before any
0710  * l4_per instances as l4_per instances depend on resources on l4_cfg and
0711  * l4_wkup interconnects.
0712  */
0713 static int sysc_defer_non_critical(struct sysc *ddata)
0714 {
0715     struct resource *res;
0716     int i;
0717 
0718     if (!atomic_read(&sysc_defer))
0719         return 0;
0720 
0721     for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) {
0722         res = &early_bus_ranges[i];
0723         if (ddata->module_pa >= res->start &&
0724             ddata->module_pa <= res->end) {
0725             atomic_set(&sysc_defer, 0);
0726 
0727             return 0;
0728         }
0729     }
0730 
0731     atomic_dec_if_positive(&sysc_defer);
0732 
0733     return -EPROBE_DEFER;
0734 }
0735 
0736 static struct device_node *stdout_path;
0737 
0738 static void sysc_init_stdout_path(struct sysc *ddata)
0739 {
0740     struct device_node *np = NULL;
0741     const char *uart;
0742 
0743     if (IS_ERR(stdout_path))
0744         return;
0745 
0746     if (stdout_path)
0747         return;
0748 
0749     np = of_find_node_by_path("/chosen");
0750     if (!np)
0751         goto err;
0752 
0753     uart = of_get_property(np, "stdout-path", NULL);
0754     if (!uart)
0755         goto err;
0756 
0757     np = of_find_node_by_path(uart);
0758     if (!np)
0759         goto err;
0760 
0761     stdout_path = np;
0762 
0763     return;
0764 
0765 err:
0766     stdout_path = ERR_PTR(-ENODEV);
0767 }
0768 
0769 static void sysc_check_quirk_stdout(struct sysc *ddata,
0770                     struct device_node *np)
0771 {
0772     sysc_init_stdout_path(ddata);
0773     if (np != stdout_path)
0774         return;
0775 
0776     ddata->cfg.quirks |= SYSC_QUIRK_NO_IDLE_ON_INIT |
0777                 SYSC_QUIRK_NO_RESET_ON_INIT;
0778 }
0779 
0780 /**
0781  * sysc_check_one_child - check child configuration
0782  * @ddata: device driver data
0783  * @np: child device node
0784  *
0785  * Let's avoid messy situations where we have new interconnect target
0786  * node but children have "ti,hwmods". These belong to the interconnect
0787  * target node and are managed by this driver.
0788  */
0789 static void sysc_check_one_child(struct sysc *ddata,
0790                  struct device_node *np)
0791 {
0792     const char *name;
0793 
0794     name = of_get_property(np, "ti,hwmods", NULL);
0795     if (name && !of_device_is_compatible(np, "ti,sysc"))
0796         dev_warn(ddata->dev, "really a child ti,hwmods property?");
0797 
0798     sysc_check_quirk_stdout(ddata, np);
0799     sysc_parse_dts_quirks(ddata, np, true);
0800 }
0801 
0802 static void sysc_check_children(struct sysc *ddata)
0803 {
0804     struct device_node *child;
0805 
0806     for_each_child_of_node(ddata->dev->of_node, child)
0807         sysc_check_one_child(ddata, child);
0808 }
0809 
0810 /*
0811  * So far only I2C uses 16-bit read access with clockactivity with revision
0812  * in two registers with stride of 4. We can detect this based on the rev
0813  * register size to configure things far enough to be able to properly read
0814  * the revision register.
0815  */
0816 static void sysc_check_quirk_16bit(struct sysc *ddata, struct resource *res)
0817 {
0818     if (resource_size(res) == 8)
0819         ddata->cfg.quirks |= SYSC_QUIRK_16BIT | SYSC_QUIRK_USE_CLOCKACT;
0820 }
0821 
0822 /**
0823  * sysc_parse_one - parses the interconnect target module registers
0824  * @ddata: device driver data
0825  * @reg: register to parse
0826  */
0827 static int sysc_parse_one(struct sysc *ddata, enum sysc_registers reg)
0828 {
0829     struct resource *res;
0830     const char *name;
0831 
0832     switch (reg) {
0833     case SYSC_REVISION:
0834     case SYSC_SYSCONFIG:
0835     case SYSC_SYSSTATUS:
0836         name = reg_names[reg];
0837         break;
0838     default:
0839         return -EINVAL;
0840     }
0841 
0842     res = platform_get_resource_byname(to_platform_device(ddata->dev),
0843                        IORESOURCE_MEM, name);
0844     if (!res) {
0845         ddata->offsets[reg] = -ENODEV;
0846 
0847         return 0;
0848     }
0849 
0850     ddata->offsets[reg] = res->start - ddata->module_pa;
0851     if (reg == SYSC_REVISION)
0852         sysc_check_quirk_16bit(ddata, res);
0853 
0854     return 0;
0855 }
0856 
0857 static int sysc_parse_registers(struct sysc *ddata)
0858 {
0859     int i, error;
0860 
0861     for (i = 0; i < SYSC_MAX_REGS; i++) {
0862         error = sysc_parse_one(ddata, i);
0863         if (error)
0864             return error;
0865     }
0866 
0867     return 0;
0868 }
0869 
0870 /**
0871  * sysc_check_registers - check for misconfigured register overlaps
0872  * @ddata: device driver data
0873  */
0874 static int sysc_check_registers(struct sysc *ddata)
0875 {
0876     int i, j, nr_regs = 0, nr_matches = 0;
0877 
0878     for (i = 0; i < SYSC_MAX_REGS; i++) {
0879         if (ddata->offsets[i] < 0)
0880             continue;
0881 
0882         if (ddata->offsets[i] > (ddata->module_size - 4)) {
0883             dev_err(ddata->dev, "register outside module range");
0884 
0885                 return -EINVAL;
0886         }
0887 
0888         for (j = 0; j < SYSC_MAX_REGS; j++) {
0889             if (ddata->offsets[j] < 0)
0890                 continue;
0891 
0892             if (ddata->offsets[i] == ddata->offsets[j])
0893                 nr_matches++;
0894         }
0895         nr_regs++;
0896     }
0897 
0898     if (nr_matches > nr_regs) {
0899         dev_err(ddata->dev, "overlapping registers: (%i/%i)",
0900             nr_regs, nr_matches);
0901 
0902         return -EINVAL;
0903     }
0904 
0905     return 0;
0906 }
0907 
0908 /**
0909  * sysc_ioremap - ioremap register space for the interconnect target module
0910  * @ddata: device driver data
0911  *
0912  * Note that the interconnect target module registers can be anywhere
0913  * within the interconnect target module range. For example, SGX has
0914  * them at offset 0x1fc00 in the 32MB module address space. And cpsw
0915  * has them at offset 0x1200 in the CPSW_WR child. Usually the
0916  * the interconnect target module registers are at the beginning of
0917  * the module range though.
0918  */
0919 static int sysc_ioremap(struct sysc *ddata)
0920 {
0921     int size;
0922 
0923     if (ddata->offsets[SYSC_REVISION] < 0 &&
0924         ddata->offsets[SYSC_SYSCONFIG] < 0 &&
0925         ddata->offsets[SYSC_SYSSTATUS] < 0) {
0926         size = ddata->module_size;
0927     } else {
0928         size = max3(ddata->offsets[SYSC_REVISION],
0929                 ddata->offsets[SYSC_SYSCONFIG],
0930                 ddata->offsets[SYSC_SYSSTATUS]);
0931 
0932         if (size < SZ_1K)
0933             size = SZ_1K;
0934 
0935         if ((size + sizeof(u32)) > ddata->module_size)
0936             size = ddata->module_size;
0937     }
0938 
0939     ddata->module_va = devm_ioremap(ddata->dev,
0940                     ddata->module_pa,
0941                     size + sizeof(u32));
0942     if (!ddata->module_va)
0943         return -EIO;
0944 
0945     return 0;
0946 }
0947 
0948 /**
0949  * sysc_map_and_check_registers - ioremap and check device registers
0950  * @ddata: device driver data
0951  */
0952 static int sysc_map_and_check_registers(struct sysc *ddata)
0953 {
0954     struct device_node *np = ddata->dev->of_node;
0955     int error;
0956 
0957     error = sysc_parse_and_check_child_range(ddata);
0958     if (error)
0959         return error;
0960 
0961     error = sysc_defer_non_critical(ddata);
0962     if (error)
0963         return error;
0964 
0965     sysc_check_children(ddata);
0966 
0967     if (!of_get_property(np, "reg", NULL))
0968         return 0;
0969 
0970     error = sysc_parse_registers(ddata);
0971     if (error)
0972         return error;
0973 
0974     error = sysc_ioremap(ddata);
0975     if (error)
0976         return error;
0977 
0978     error = sysc_check_registers(ddata);
0979     if (error)
0980         return error;
0981 
0982     return 0;
0983 }
0984 
0985 /**
0986  * sysc_show_rev - read and show interconnect target module revision
0987  * @bufp: buffer to print the information to
0988  * @ddata: device driver data
0989  */
0990 static int sysc_show_rev(char *bufp, struct sysc *ddata)
0991 {
0992     int len;
0993 
0994     if (ddata->offsets[SYSC_REVISION] < 0)
0995         return sprintf(bufp, ":NA");
0996 
0997     len = sprintf(bufp, ":%08x", ddata->revision);
0998 
0999     return len;
1000 }
1001 
1002 static int sysc_show_reg(struct sysc *ddata,
1003              char *bufp, enum sysc_registers reg)
1004 {
1005     if (ddata->offsets[reg] < 0)
1006         return sprintf(bufp, ":NA");
1007 
1008     return sprintf(bufp, ":%x", ddata->offsets[reg]);
1009 }
1010 
1011 static int sysc_show_name(char *bufp, struct sysc *ddata)
1012 {
1013     if (!ddata->name)
1014         return 0;
1015 
1016     return sprintf(bufp, ":%s", ddata->name);
1017 }
1018 
1019 /**
1020  * sysc_show_registers - show information about interconnect target module
1021  * @ddata: device driver data
1022  */
1023 static void sysc_show_registers(struct sysc *ddata)
1024 {
1025     char buf[128];
1026     char *bufp = buf;
1027     int i;
1028 
1029     for (i = 0; i < SYSC_MAX_REGS; i++)
1030         bufp += sysc_show_reg(ddata, bufp, i);
1031 
1032     bufp += sysc_show_rev(bufp, ddata);
1033     bufp += sysc_show_name(bufp, ddata);
1034 
1035     dev_dbg(ddata->dev, "%llx:%x%s\n",
1036         ddata->module_pa, ddata->module_size,
1037         buf);
1038 }
1039 
1040 /**
1041  * sysc_write_sysconfig - handle sysconfig quirks for register write
1042  * @ddata: device driver data
1043  * @value: register value
1044  */
1045 static void sysc_write_sysconfig(struct sysc *ddata, u32 value)
1046 {
1047     if (ddata->module_unlock_quirk)
1048         ddata->module_unlock_quirk(ddata);
1049 
1050     sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], value);
1051 
1052     if (ddata->module_lock_quirk)
1053         ddata->module_lock_quirk(ddata);
1054 }
1055 
1056 #define SYSC_IDLE_MASK  (SYSC_NR_IDLEMODES - 1)
1057 #define SYSC_CLOCACT_ICK    2
1058 
1059 /* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */
1060 static int sysc_enable_module(struct device *dev)
1061 {
1062     struct sysc *ddata;
1063     const struct sysc_regbits *regbits;
1064     u32 reg, idlemodes, best_mode;
1065     int error;
1066 
1067     ddata = dev_get_drvdata(dev);
1068 
1069     /*
1070      * Some modules like DSS reset automatically on idle. Enable optional
1071      * reset clocks and wait for OCP softreset to complete.
1072      */
1073     if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET) {
1074         error = sysc_enable_opt_clocks(ddata);
1075         if (error) {
1076             dev_err(ddata->dev,
1077                 "Optional clocks failed for enable: %i\n",
1078                 error);
1079             return error;
1080         }
1081     }
1082     /*
1083      * Some modules like i2c and hdq1w have unusable reset status unless
1084      * the module reset quirk is enabled. Skip status check on enable.
1085      */
1086     if (!(ddata->cfg.quirks & SYSC_MODULE_QUIRK_ENA_RESETDONE)) {
1087         error = sysc_wait_softreset(ddata);
1088         if (error)
1089             dev_warn(ddata->dev, "OCP softreset timed out\n");
1090     }
1091     if (ddata->cfg.quirks & SYSC_QUIRK_OPT_CLKS_IN_RESET)
1092         sysc_disable_opt_clocks(ddata);
1093 
1094     /*
1095      * Some subsystem private interconnects, like DSS top level module,
1096      * need only the automatic OCP softreset handling with no sysconfig
1097      * register bits to configure.
1098      */
1099     if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
1100         return 0;
1101 
1102     regbits = ddata->cap->regbits;
1103     reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
1104 
1105     /*
1106      * Set CLOCKACTIVITY, we only use it for ick. And we only configure it
1107      * based on the SYSC_QUIRK_USE_CLOCKACT flag, not based on the hardware
1108      * capabilities. See the old HWMOD_SET_DEFAULT_CLOCKACT flag.
1109      */
1110     if (regbits->clkact_shift >= 0 &&
1111         (ddata->cfg.quirks & SYSC_QUIRK_USE_CLOCKACT))
1112         reg |= SYSC_CLOCACT_ICK << regbits->clkact_shift;
1113 
1114     /* Set SIDLE mode */
1115     idlemodes = ddata->cfg.sidlemodes;
1116     if (!idlemodes || regbits->sidle_shift < 0)
1117         goto set_midle;
1118 
1119     if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE |
1120                  SYSC_QUIRK_SWSUP_SIDLE_ACT)) {
1121         best_mode = SYSC_IDLE_NO;
1122     } else {
1123         best_mode = fls(ddata->cfg.sidlemodes) - 1;
1124         if (best_mode > SYSC_IDLE_MASK) {
1125             dev_err(dev, "%s: invalid sidlemode\n", __func__);
1126             return -EINVAL;
1127         }
1128 
1129         /* Set WAKEUP */
1130         if (regbits->enwkup_shift >= 0 &&
1131             ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
1132             reg |= BIT(regbits->enwkup_shift);
1133     }
1134 
1135     reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
1136     reg |= best_mode << regbits->sidle_shift;
1137     sysc_write_sysconfig(ddata, reg);
1138 
1139 set_midle:
1140     /* Set MIDLE mode */
1141     idlemodes = ddata->cfg.midlemodes;
1142     if (!idlemodes || regbits->midle_shift < 0)
1143         goto set_autoidle;
1144 
1145     best_mode = fls(ddata->cfg.midlemodes) - 1;
1146     if (best_mode > SYSC_IDLE_MASK) {
1147         dev_err(dev, "%s: invalid midlemode\n", __func__);
1148         error = -EINVAL;
1149         goto save_context;
1150     }
1151 
1152     if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_MSTANDBY)
1153         best_mode = SYSC_IDLE_NO;
1154 
1155     reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift);
1156     reg |= best_mode << regbits->midle_shift;
1157     sysc_write_sysconfig(ddata, reg);
1158 
1159 set_autoidle:
1160     /* Autoidle bit must enabled separately if available */
1161     if (regbits->autoidle_shift >= 0 &&
1162         ddata->cfg.sysc_val & BIT(regbits->autoidle_shift)) {
1163         reg |= 1 << regbits->autoidle_shift;
1164         sysc_write_sysconfig(ddata, reg);
1165     }
1166 
1167     error = 0;
1168 
1169 save_context:
1170     /* Save context and flush posted write */
1171     ddata->sysconfig = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
1172 
1173     if (ddata->module_enable_quirk)
1174         ddata->module_enable_quirk(ddata);
1175 
1176     return error;
1177 }
1178 
1179 static int sysc_best_idle_mode(u32 idlemodes, u32 *best_mode)
1180 {
1181     if (idlemodes & BIT(SYSC_IDLE_SMART_WKUP))
1182         *best_mode = SYSC_IDLE_SMART_WKUP;
1183     else if (idlemodes & BIT(SYSC_IDLE_SMART))
1184         *best_mode = SYSC_IDLE_SMART;
1185     else if (idlemodes & BIT(SYSC_IDLE_FORCE))
1186         *best_mode = SYSC_IDLE_FORCE;
1187     else
1188         return -EINVAL;
1189 
1190     return 0;
1191 }
1192 
1193 /* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */
1194 static int sysc_disable_module(struct device *dev)
1195 {
1196     struct sysc *ddata;
1197     const struct sysc_regbits *regbits;
1198     u32 reg, idlemodes, best_mode;
1199     int ret;
1200 
1201     ddata = dev_get_drvdata(dev);
1202     if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
1203         return 0;
1204 
1205     if (ddata->module_disable_quirk)
1206         ddata->module_disable_quirk(ddata);
1207 
1208     regbits = ddata->cap->regbits;
1209     reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
1210 
1211     /* Set MIDLE mode */
1212     idlemodes = ddata->cfg.midlemodes;
1213     if (!idlemodes || regbits->midle_shift < 0)
1214         goto set_sidle;
1215 
1216     ret = sysc_best_idle_mode(idlemodes, &best_mode);
1217     if (ret) {
1218         dev_err(dev, "%s: invalid midlemode\n", __func__);
1219         return ret;
1220     }
1221 
1222     if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_MSTANDBY) ||
1223         ddata->cfg.quirks & (SYSC_QUIRK_FORCE_MSTANDBY))
1224         best_mode = SYSC_IDLE_FORCE;
1225 
1226     reg &= ~(SYSC_IDLE_MASK << regbits->midle_shift);
1227     reg |= best_mode << regbits->midle_shift;
1228     sysc_write_sysconfig(ddata, reg);
1229 
1230 set_sidle:
1231     /* Set SIDLE mode */
1232     idlemodes = ddata->cfg.sidlemodes;
1233     if (!idlemodes || regbits->sidle_shift < 0) {
1234         ret = 0;
1235         goto save_context;
1236     }
1237 
1238     if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE) {
1239         best_mode = SYSC_IDLE_FORCE;
1240     } else {
1241         ret = sysc_best_idle_mode(idlemodes, &best_mode);
1242         if (ret) {
1243             dev_err(dev, "%s: invalid sidlemode\n", __func__);
1244             ret = -EINVAL;
1245             goto save_context;
1246         }
1247     }
1248 
1249     reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
1250     reg |= best_mode << regbits->sidle_shift;
1251     if (regbits->autoidle_shift >= 0 &&
1252         ddata->cfg.sysc_val & BIT(regbits->autoidle_shift))
1253         reg |= 1 << regbits->autoidle_shift;
1254     sysc_write_sysconfig(ddata, reg);
1255 
1256     ret = 0;
1257 
1258 save_context:
1259     /* Save context and flush posted write */
1260     ddata->sysconfig = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
1261 
1262     return ret;
1263 }
1264 
1265 static int __maybe_unused sysc_runtime_suspend_legacy(struct device *dev,
1266                               struct sysc *ddata)
1267 {
1268     struct ti_sysc_platform_data *pdata;
1269     int error;
1270 
1271     pdata = dev_get_platdata(ddata->dev);
1272     if (!pdata)
1273         return 0;
1274 
1275     if (!pdata->idle_module)
1276         return -ENODEV;
1277 
1278     error = pdata->idle_module(dev, &ddata->cookie);
1279     if (error)
1280         dev_err(dev, "%s: could not idle: %i\n",
1281             __func__, error);
1282 
1283     reset_control_assert(ddata->rsts);
1284 
1285     return 0;
1286 }
1287 
1288 static int __maybe_unused sysc_runtime_resume_legacy(struct device *dev,
1289                              struct sysc *ddata)
1290 {
1291     struct ti_sysc_platform_data *pdata;
1292     int error;
1293 
1294     pdata = dev_get_platdata(ddata->dev);
1295     if (!pdata)
1296         return 0;
1297 
1298     if (!pdata->enable_module)
1299         return -ENODEV;
1300 
1301     error = pdata->enable_module(dev, &ddata->cookie);
1302     if (error)
1303         dev_err(dev, "%s: could not enable: %i\n",
1304             __func__, error);
1305 
1306     reset_control_deassert(ddata->rsts);
1307 
1308     return 0;
1309 }
1310 
1311 static int __maybe_unused sysc_runtime_suspend(struct device *dev)
1312 {
1313     struct sysc *ddata;
1314     int error = 0;
1315 
1316     ddata = dev_get_drvdata(dev);
1317 
1318     if (!ddata->enabled)
1319         return 0;
1320 
1321     sysc_clkdm_deny_idle(ddata);
1322 
1323     if (ddata->legacy_mode) {
1324         error = sysc_runtime_suspend_legacy(dev, ddata);
1325         if (error)
1326             goto err_allow_idle;
1327     } else {
1328         error = sysc_disable_module(dev);
1329         if (error)
1330             goto err_allow_idle;
1331     }
1332 
1333     sysc_disable_main_clocks(ddata);
1334 
1335     if (sysc_opt_clks_needed(ddata))
1336         sysc_disable_opt_clocks(ddata);
1337 
1338     ddata->enabled = false;
1339 
1340 err_allow_idle:
1341     sysc_clkdm_allow_idle(ddata);
1342 
1343     reset_control_assert(ddata->rsts);
1344 
1345     return error;
1346 }
1347 
1348 static int __maybe_unused sysc_runtime_resume(struct device *dev)
1349 {
1350     struct sysc *ddata;
1351     int error = 0;
1352 
1353     ddata = dev_get_drvdata(dev);
1354 
1355     if (ddata->enabled)
1356         return 0;
1357 
1358 
1359     sysc_clkdm_deny_idle(ddata);
1360 
1361     if (sysc_opt_clks_needed(ddata)) {
1362         error = sysc_enable_opt_clocks(ddata);
1363         if (error)
1364             goto err_allow_idle;
1365     }
1366 
1367     error = sysc_enable_main_clocks(ddata);
1368     if (error)
1369         goto err_opt_clocks;
1370 
1371     reset_control_deassert(ddata->rsts);
1372 
1373     if (ddata->legacy_mode) {
1374         error = sysc_runtime_resume_legacy(dev, ddata);
1375         if (error)
1376             goto err_main_clocks;
1377     } else {
1378         error = sysc_enable_module(dev);
1379         if (error)
1380             goto err_main_clocks;
1381     }
1382 
1383     ddata->enabled = true;
1384 
1385     sysc_clkdm_allow_idle(ddata);
1386 
1387     return 0;
1388 
1389 err_main_clocks:
1390     sysc_disable_main_clocks(ddata);
1391 err_opt_clocks:
1392     if (sysc_opt_clks_needed(ddata))
1393         sysc_disable_opt_clocks(ddata);
1394 err_allow_idle:
1395     sysc_clkdm_allow_idle(ddata);
1396 
1397     return error;
1398 }
1399 
1400 /*
1401  * Checks if device context was lost. Assumes the sysconfig register value
1402  * after lost context is different from the configured value. Only works for
1403  * enabled devices.
1404  *
1405  * Eventually we may want to also add support to using the context lost
1406  * registers that some SoCs have.
1407  */
1408 static int sysc_check_context(struct sysc *ddata)
1409 {
1410     u32 reg;
1411 
1412     if (!ddata->enabled)
1413         return -ENODATA;
1414 
1415     reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
1416     if (reg == ddata->sysconfig)
1417         return 0;
1418 
1419     return -EACCES;
1420 }
1421 
1422 static int sysc_reinit_module(struct sysc *ddata, bool leave_enabled)
1423 {
1424     struct device *dev = ddata->dev;
1425     int error;
1426 
1427     if (ddata->enabled) {
1428         /* Nothing to do if enabled and context not lost */
1429         error = sysc_check_context(ddata);
1430         if (!error)
1431             return 0;
1432 
1433         /* Disable target module if it is enabled */
1434         error = sysc_runtime_suspend(dev);
1435         if (error)
1436             dev_warn(dev, "reinit suspend failed: %i\n", error);
1437     }
1438 
1439     /* Enable target module */
1440     error = sysc_runtime_resume(dev);
1441     if (error)
1442         dev_warn(dev, "reinit resume failed: %i\n", error);
1443 
1444     /* Some modules like am335x gpmc need reset and restore of sysconfig */
1445     if (ddata->cfg.quirks & SYSC_QUIRK_RESET_ON_CTX_LOST) {
1446         error = sysc_reset(ddata);
1447         if (error)
1448             dev_warn(dev, "reinit reset failed: %i\n", error);
1449 
1450         sysc_write_sysconfig(ddata, ddata->sysconfig);
1451     }
1452 
1453     if (leave_enabled)
1454         return error;
1455 
1456     /* Disable target module if no leave_enabled was set */
1457     error = sysc_runtime_suspend(dev);
1458     if (error)
1459         dev_warn(dev, "reinit suspend failed: %i\n", error);
1460 
1461     return error;
1462 }
1463 
1464 static int __maybe_unused sysc_noirq_suspend(struct device *dev)
1465 {
1466     struct sysc *ddata;
1467 
1468     ddata = dev_get_drvdata(dev);
1469 
1470     if (ddata->cfg.quirks &
1471         (SYSC_QUIRK_LEGACY_IDLE | 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 
1482 static 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 &
1490         (SYSC_QUIRK_LEGACY_IDLE | SYSC_QUIRK_NO_IDLE))
1491         return 0;
1492 
1493     if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_RESUME) {
1494         error = sysc_reinit_module(ddata, ddata->needs_resume);
1495         if (error)
1496             dev_warn(dev, "noirq_resume failed: %i\n", error);
1497     } else if (ddata->needs_resume) {
1498         error = sysc_runtime_resume(dev);
1499         if (error)
1500             dev_warn(dev, "noirq_resume failed: %i\n", error);
1501     }
1502 
1503     ddata->needs_resume = 0;
1504 
1505     return error;
1506 }
1507 
1508 static const struct dev_pm_ops sysc_pm_ops = {
1509     SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)
1510     SET_RUNTIME_PM_OPS(sysc_runtime_suspend,
1511                sysc_runtime_resume,
1512                NULL)
1513 };
1514 
1515 /* Module revision register based quirks */
1516 struct sysc_revision_quirk {
1517     const char *name;
1518     u32 base;
1519     int rev_offset;
1520     int sysc_offset;
1521     int syss_offset;
1522     u32 revision;
1523     u32 revision_mask;
1524     u32 quirks;
1525 };
1526 
1527 #define SYSC_QUIRK(optname, optbase, optrev, optsysc, optsyss,      \
1528            optrev_val, optrevmask, optquirkmask)        \
1529     {                               \
1530         .name = (optname),                  \
1531         .base = (optbase),                  \
1532         .rev_offset = (optrev),                 \
1533         .sysc_offset = (optsysc),               \
1534         .syss_offset = (optsyss),               \
1535         .revision = (optrev_val),               \
1536         .revision_mask = (optrevmask),              \
1537         .quirks = (optquirkmask),               \
1538     }
1539 
1540 static const struct sysc_revision_quirk sysc_revision_quirks[] = {
1541     /* These drivers need to be fixed to not use pm_runtime_irq_safe() */
1542     SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff,
1543            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1544     SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,
1545            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1546     /* Uarts on omap4 and later */
1547     SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,
1548            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1549     SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x47422e03, 0xffffffff,
1550            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
1551 
1552     /* Quirks that need to be set based on the module address */
1553     SYSC_QUIRK("mcpdm", 0x40132000, 0, 0x10, -ENODEV, 0x50000800, 0xffffffff,
1554            SYSC_QUIRK_EXT_OPT_CLOCK | SYSC_QUIRK_NO_RESET_ON_INIT |
1555            SYSC_QUIRK_SWSUP_SIDLE),
1556 
1557     /* Quirks that need to be set based on detected module */
1558     SYSC_QUIRK("aess", 0, 0, 0x10, -ENODEV, 0x40000000, 0xffffffff,
1559            SYSC_MODULE_QUIRK_AESS),
1560     /* Errata i893 handling for dra7 dcan1 and 2 */
1561     SYSC_QUIRK("dcan", 0x4ae3c000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,
1562            SYSC_QUIRK_CLKDM_NOAUTO),
1563     SYSC_QUIRK("dcan", 0x48480000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,
1564            SYSC_QUIRK_CLKDM_NOAUTO),
1565     SYSC_QUIRK("dss", 0x4832a000, 0, 0x10, 0x14, 0x00000020, 0xffffffff,
1566            SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),
1567     SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000040, 0xffffffff,
1568            SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),
1569     SYSC_QUIRK("dss", 0x58000000, 0, -ENODEV, 0x14, 0x00000061, 0xffffffff,
1570            SYSC_QUIRK_OPT_CLKS_IN_RESET | SYSC_MODULE_QUIRK_DSS_RESET),
1571     SYSC_QUIRK("dwc3", 0x48880000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff,
1572            SYSC_QUIRK_CLKDM_NOAUTO),
1573     SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff,
1574            SYSC_QUIRK_CLKDM_NOAUTO),
1575     SYSC_QUIRK("gpio", 0, 0, 0x10, 0x114, 0x50600801, 0xffff00ff,
1576            SYSC_QUIRK_OPT_CLKS_IN_RESET),
1577     SYSC_QUIRK("gpmc", 0, 0, 0x10, 0x14, 0x00000060, 0xffffffff,
1578            SYSC_QUIRK_REINIT_ON_CTX_LOST | SYSC_QUIRK_RESET_ON_CTX_LOST |
1579            SYSC_QUIRK_GPMC_DEBUG),
1580     SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50030200, 0xffffffff,
1581            SYSC_QUIRK_OPT_CLKS_NEEDED),
1582     SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,
1583            SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1584     SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,
1585            SYSC_MODULE_QUIRK_HDQ1W | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1586     SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000036, 0x000000ff,
1587            SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1588     SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x0000003c, 0x000000ff,
1589            SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1590     SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000040, 0x000000ff,
1591            SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1592     SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0,
1593            SYSC_MODULE_QUIRK_I2C | SYSC_MODULE_QUIRK_ENA_RESETDONE),
1594     SYSC_QUIRK("gpu", 0x50000000, 0x14, -ENODEV, -ENODEV, 0x00010201, 0xffffffff, 0),
1595     SYSC_QUIRK("gpu", 0x50000000, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff,
1596            SYSC_MODULE_QUIRK_SGX),
1597     SYSC_QUIRK("lcdc", 0, 0, 0x54, -ENODEV, 0x4f201000, 0xffffffff,
1598            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1599     SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44306302, 0xffffffff,
1600            SYSC_QUIRK_SWSUP_SIDLE),
1601     SYSC_QUIRK("rtc", 0, 0x74, 0x78, -ENODEV, 0x4eb01908, 0xffff00f0,
1602            SYSC_MODULE_QUIRK_RTC_UNLOCK),
1603     SYSC_QUIRK("tptc", 0, 0, 0x10, -ENODEV, 0x40006c00, 0xffffefff,
1604            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1605     SYSC_QUIRK("tptc", 0, 0, -ENODEV, -ENODEV, 0x40007c00, 0xffffffff,
1606            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1607     SYSC_QUIRK("sata", 0, 0xfc, 0x1100, -ENODEV, 0x5e412000, 0xffffffff,
1608            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1609     SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, 0x14, 0x50700100, 0xffffffff,
1610            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1611     SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -ENODEV, 0x50700101, 0xffffffff,
1612            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
1613     SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050,
1614            0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |
1615            SYSC_MODULE_QUIRK_OTG),
1616     SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff,
1617            SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |
1618            SYSC_QUIRK_REINIT_ON_CTX_LOST),
1619     SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
1620            SYSC_MODULE_QUIRK_WDT),
1621     /* PRUSS on am3, am4 and am5 */
1622     SYSC_QUIRK("pruss", 0, 0x26000, 0x26004, -ENODEV, 0x47000000, 0xff000000,
1623            SYSC_MODULE_QUIRK_PRUSS),
1624     /* Watchdog on am3 and am4 */
1625     SYSC_QUIRK("wdt", 0x44e35000, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
1626            SYSC_MODULE_QUIRK_WDT | SYSC_QUIRK_SWSUP_SIDLE),
1627 
1628 #ifdef DEBUG
1629     SYSC_QUIRK("adc", 0, 0, 0x10, -ENODEV, 0x47300001, 0xffffffff, 0),
1630     SYSC_QUIRK("atl", 0, 0, -ENODEV, -ENODEV, 0x0a070100, 0xffffffff, 0),
1631     SYSC_QUIRK("cm", 0, 0, -ENODEV, -ENODEV, 0x40000301, 0xffffffff, 0),
1632     SYSC_QUIRK("control", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0),
1633     SYSC_QUIRK("cpgmac", 0, 0x1200, 0x1208, 0x1204, 0x4edb1902,
1634            0xffff00f0, 0),
1635     SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff, 0),
1636     SYSC_QUIRK("dcan", 0, 0x20, -ENODEV, -ENODEV, 0x4edb1902, 0xffffffff, 0),
1637     SYSC_QUIRK("dispc", 0x4832a400, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),
1638     SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),
1639     SYSC_QUIRK("dispc", 0x58001000, 0, 0x10, 0x14, 0x00000051, 0xffffffff, 0),
1640     SYSC_QUIRK("dmic", 0, 0, 0x10, -ENODEV, 0x50010000, 0xffffffff, 0),
1641     SYSC_QUIRK("dsi", 0x58004000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),
1642     SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000030, 0xffffffff, 0),
1643     SYSC_QUIRK("dsi", 0x58005000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),
1644     SYSC_QUIRK("dsi", 0x58009000, 0, 0x10, 0x14, 0x00000040, 0xffffffff, 0),
1645     SYSC_QUIRK("dwc3", 0, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff, 0),
1646     SYSC_QUIRK("d2d", 0x4a0b6000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
1647     SYSC_QUIRK("d2d", 0x4a0cd000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
1648     SYSC_QUIRK("elm", 0x48080000, 0, 0x10, 0x14, 0x00000020, 0xffffffff, 0),
1649     SYSC_QUIRK("emif", 0, 0, -ENODEV, -ENODEV, 0x40441403, 0xffff0fff, 0),
1650     SYSC_QUIRK("emif", 0, 0, -ENODEV, -ENODEV, 0x50440500, 0xffffffff, 0),
1651     SYSC_QUIRK("epwmss", 0, 0, 0x4, -ENODEV, 0x47400001, 0xffffffff, 0),
1652     SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -ENODEV, 0, 0, 0),
1653     SYSC_QUIRK("gpu", 0, 0xfe00, 0xfe10, -ENODEV, 0x40000000 , 0xffffffff, 0),
1654     SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50031d00, 0xffffffff, 0),
1655     SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0),
1656     SYSC_QUIRK("iss", 0, 0, 0x10, -ENODEV, 0x40000101, 0xffffffff, 0),
1657     SYSC_QUIRK("keypad", 0x4a31c000, 0, 0x10, 0x14, 0x00000020, 0xffffffff, 0),
1658     SYSC_QUIRK("mcasp", 0, 0, 0x4, -ENODEV, 0x44307b02, 0xffffffff, 0),
1659     SYSC_QUIRK("mcbsp", 0, -ENODEV, 0x8c, -ENODEV, 0, 0, 0),
1660     SYSC_QUIRK("mcspi", 0, 0, 0x10, -ENODEV, 0x40300a0b, 0xffff00ff, 0),
1661     SYSC_QUIRK("mcspi", 0, 0, 0x110, 0x114, 0x40300a0b, 0xffffffff, 0),
1662     SYSC_QUIRK("mailbox", 0, 0, 0x10, -ENODEV, 0x00000400, 0xffffffff, 0),
1663     SYSC_QUIRK("m3", 0, 0, -ENODEV, -ENODEV, 0x5f580105, 0x0fff0f00, 0),
1664     SYSC_QUIRK("ocp2scp", 0, 0, 0x10, 0x14, 0x50060005, 0xfffffff0, 0),
1665     SYSC_QUIRK("ocp2scp", 0, 0, -ENODEV, -ENODEV, 0x50060007, 0xffffffff, 0),
1666     SYSC_QUIRK("padconf", 0, 0, 0x10, -ENODEV, 0x4fff0800, 0xffffffff, 0),
1667     SYSC_QUIRK("padconf", 0, 0, -ENODEV, -ENODEV, 0x40001100, 0xffffffff, 0),
1668     SYSC_QUIRK("pcie", 0x51000000, -ENODEV, -ENODEV, -ENODEV, 0, 0, 0),
1669     SYSC_QUIRK("pcie", 0x51800000, -ENODEV, -ENODEV, -ENODEV, 0, 0, 0),
1670     SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000100, 0xffffffff, 0),
1671     SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x00004102, 0xffffffff, 0),
1672     SYSC_QUIRK("prcm", 0, 0, -ENODEV, -ENODEV, 0x40000400, 0xffffffff, 0),
1673     SYSC_QUIRK("rfbi", 0x4832a800, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
1674     SYSC_QUIRK("rfbi", 0x58002000, 0, 0x10, 0x14, 0x00000010, 0xffffffff, 0),
1675     SYSC_QUIRK("scm", 0, 0, 0x10, -ENODEV, 0x40000900, 0xffffffff, 0),
1676     SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4e8b0100, 0xffffffff, 0),
1677     SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x4f000100, 0xffffffff, 0),
1678     SYSC_QUIRK("scm", 0, 0, -ENODEV, -ENODEV, 0x40000900, 0xffffffff, 0),
1679     SYSC_QUIRK("scrm", 0, 0, -ENODEV, -ENODEV, 0x00000010, 0xffffffff, 0),
1680     SYSC_QUIRK("sdio", 0, 0, 0x10, -ENODEV, 0x40202301, 0xffff0ff0, 0),
1681     SYSC_QUIRK("sdio", 0, 0x2fc, 0x110, 0x114, 0x31010000, 0xffffffff, 0),
1682     SYSC_QUIRK("sdma", 0, 0, 0x2c, 0x28, 0x00010900, 0xffffffff, 0),
1683     SYSC_QUIRK("sham", 0, 0x100, 0x110, 0x114, 0x40000c03, 0xffffffff, 0),
1684     SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40000902, 0xffffffff, 0),
1685     SYSC_QUIRK("slimbus", 0, 0, 0x10, -ENODEV, 0x40002903, 0xffffffff, 0),
1686     SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x24, -ENODEV, 0x00000000, 0xffffffff, 0),
1687     SYSC_QUIRK("smartreflex", 0, -ENODEV, 0x38, -ENODEV, 0x00000000, 0xffffffff, 0),
1688     SYSC_QUIRK("spinlock", 0, 0, 0x10, -ENODEV, 0x50020000, 0xffffffff, 0),
1689     SYSC_QUIRK("rng", 0, 0x1fe0, 0x1fe4, -ENODEV, 0x00000020, 0xffffffff, 0),
1690     SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000013, 0xffffffff, 0),
1691     SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000015, 0xffffffff, 0),
1692     /* Some timers on omap4 and later */
1693     SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x50002100, 0xffffffff, 0),
1694     SYSC_QUIRK("timer", 0, 0, 0x10, -ENODEV, 0x4fff1301, 0xffff00ff, 0),
1695     SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000040, 0xffffffff, 0),
1696     SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000011, 0xffffffff, 0),
1697     SYSC_QUIRK("timer32k", 0, 0, 0x4, -ENODEV, 0x00000060, 0xffffffff, 0),
1698     SYSC_QUIRK("tpcc", 0, 0, -ENODEV, -ENODEV, 0x40014c00, 0xffffffff, 0),
1699     SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000004, 0xffffffff, 0),
1700     SYSC_QUIRK("usbhstll", 0, 0, 0x10, 0x14, 0x00000008, 0xffffffff, 0),
1701     SYSC_QUIRK("venc", 0x58003000, 0, -ENODEV, -ENODEV, 0x00000002, 0xffffffff, 0),
1702     SYSC_QUIRK("vfpe", 0, 0, 0x104, -ENODEV, 0x4d001200, 0xffffffff, 0),
1703 #endif
1704 };
1705 
1706 /*
1707  * Early quirks based on module base and register offsets only that are
1708  * needed before the module revision can be read
1709  */
1710 static void sysc_init_early_quirks(struct sysc *ddata)
1711 {
1712     const struct sysc_revision_quirk *q;
1713     int i;
1714 
1715     for (i = 0; i < ARRAY_SIZE(sysc_revision_quirks); i++) {
1716         q = &sysc_revision_quirks[i];
1717 
1718         if (!q->base)
1719             continue;
1720 
1721         if (q->base != ddata->module_pa)
1722             continue;
1723 
1724         if (q->rev_offset != ddata->offsets[SYSC_REVISION])
1725             continue;
1726 
1727         if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG])
1728             continue;
1729 
1730         if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS])
1731             continue;
1732 
1733         ddata->name = q->name;
1734         ddata->cfg.quirks |= q->quirks;
1735     }
1736 }
1737 
1738 /* Quirks that also consider the revision register value */
1739 static void sysc_init_revision_quirks(struct sysc *ddata)
1740 {
1741     const struct sysc_revision_quirk *q;
1742     int i;
1743 
1744     for (i = 0; i < ARRAY_SIZE(sysc_revision_quirks); i++) {
1745         q = &sysc_revision_quirks[i];
1746 
1747         if (q->base && q->base != ddata->module_pa)
1748             continue;
1749 
1750         if (q->rev_offset != ddata->offsets[SYSC_REVISION])
1751             continue;
1752 
1753         if (q->sysc_offset != ddata->offsets[SYSC_SYSCONFIG])
1754             continue;
1755 
1756         if (q->syss_offset != ddata->offsets[SYSC_SYSSTATUS])
1757             continue;
1758 
1759         if (q->revision == ddata->revision ||
1760             (q->revision & q->revision_mask) ==
1761             (ddata->revision & q->revision_mask)) {
1762             ddata->name = q->name;
1763             ddata->cfg.quirks |= q->quirks;
1764         }
1765     }
1766 }
1767 
1768 /*
1769  * DSS needs dispc outputs disabled to reset modules. Returns mask of
1770  * enabled DSS interrupts. Eventually we may be able to do this on
1771  * dispc init rather than top-level DSS init.
1772  */
1773 static u32 sysc_quirk_dispc(struct sysc *ddata, int dispc_offset,
1774                 bool disable)
1775 {
1776     bool lcd_en, digit_en, lcd2_en = false, lcd3_en = false;
1777     const int lcd_en_mask = BIT(0), digit_en_mask = BIT(1);
1778     int manager_count;
1779     bool framedonetv_irq = true;
1780     u32 val, irq_mask = 0;
1781 
1782     switch (sysc_soc->soc) {
1783     case SOC_2420 ... SOC_3630:
1784         manager_count = 2;
1785         framedonetv_irq = false;
1786         break;
1787     case SOC_4430 ... SOC_4470:
1788         manager_count = 3;
1789         break;
1790     case SOC_5430:
1791     case SOC_DRA7:
1792         manager_count = 4;
1793         break;
1794     case SOC_AM4:
1795         manager_count = 1;
1796         framedonetv_irq = false;
1797         break;
1798     case SOC_UNKNOWN:
1799     default:
1800         return 0;
1801     }
1802 
1803     /* Remap the whole module range to be able to reset dispc outputs */
1804     devm_iounmap(ddata->dev, ddata->module_va);
1805     ddata->module_va = devm_ioremap(ddata->dev,
1806                     ddata->module_pa,
1807                     ddata->module_size);
1808     if (!ddata->module_va)
1809         return -EIO;
1810 
1811     /* DISP_CONTROL */
1812     val = sysc_read(ddata, dispc_offset + 0x40);
1813     lcd_en = val & lcd_en_mask;
1814     digit_en = val & digit_en_mask;
1815     if (lcd_en)
1816         irq_mask |= BIT(0);         /* FRAMEDONE */
1817     if (digit_en) {
1818         if (framedonetv_irq)
1819             irq_mask |= BIT(24);        /* FRAMEDONETV */
1820         else
1821             irq_mask |= BIT(2) | BIT(3);    /* EVSYNC bits */
1822     }
1823     if (disable & (lcd_en | digit_en))
1824         sysc_write(ddata, dispc_offset + 0x40,
1825                val & ~(lcd_en_mask | digit_en_mask));
1826 
1827     if (manager_count <= 2)
1828         return irq_mask;
1829 
1830     /* DISPC_CONTROL2 */
1831     val = sysc_read(ddata, dispc_offset + 0x238);
1832     lcd2_en = val & lcd_en_mask;
1833     if (lcd2_en)
1834         irq_mask |= BIT(22);            /* FRAMEDONE2 */
1835     if (disable && lcd2_en)
1836         sysc_write(ddata, dispc_offset + 0x238,
1837                val & ~lcd_en_mask);
1838 
1839     if (manager_count <= 3)
1840         return irq_mask;
1841 
1842     /* DISPC_CONTROL3 */
1843     val = sysc_read(ddata, dispc_offset + 0x848);
1844     lcd3_en = val & lcd_en_mask;
1845     if (lcd3_en)
1846         irq_mask |= BIT(30);            /* FRAMEDONE3 */
1847     if (disable && lcd3_en)
1848         sysc_write(ddata, dispc_offset + 0x848,
1849                val & ~lcd_en_mask);
1850 
1851     return irq_mask;
1852 }
1853 
1854 /* DSS needs child outputs disabled and SDI registers cleared for reset */
1855 static void sysc_pre_reset_quirk_dss(struct sysc *ddata)
1856 {
1857     const int dispc_offset = 0x1000;
1858     int error;
1859     u32 irq_mask, val;
1860 
1861     /* Get enabled outputs */
1862     irq_mask = sysc_quirk_dispc(ddata, dispc_offset, false);
1863     if (!irq_mask)
1864         return;
1865 
1866     /* Clear IRQSTATUS */
1867     sysc_write(ddata, dispc_offset + 0x18, irq_mask);
1868 
1869     /* Disable outputs */
1870     val = sysc_quirk_dispc(ddata, dispc_offset, true);
1871 
1872     /* Poll IRQSTATUS */
1873     error = readl_poll_timeout(ddata->module_va + dispc_offset + 0x18,
1874                    val, val != irq_mask, 100, 50);
1875     if (error)
1876         dev_warn(ddata->dev, "%s: timed out %08x !+ %08x\n",
1877              __func__, val, irq_mask);
1878 
1879     if (sysc_soc->soc == SOC_3430) {
1880         /* Clear DSS_SDI_CONTROL */
1881         sysc_write(ddata, 0x44, 0);
1882 
1883         /* Clear DSS_PLL_CONTROL */
1884         sysc_write(ddata, 0x48, 0);
1885     }
1886 
1887     /* Clear DSS_CONTROL to switch DSS clock sources to PRCM if not */
1888     sysc_write(ddata, 0x40, 0);
1889 }
1890 
1891 /* 1-wire needs module's internal clocks enabled for reset */
1892 static void sysc_pre_reset_quirk_hdq1w(struct sysc *ddata)
1893 {
1894     int offset = 0x0c;  /* HDQ_CTRL_STATUS */
1895     u16 val;
1896 
1897     val = sysc_read(ddata, offset);
1898     val |= BIT(5);
1899     sysc_write(ddata, offset, val);
1900 }
1901 
1902 /* AESS (Audio Engine SubSystem) needs autogating set after enable */
1903 static void sysc_module_enable_quirk_aess(struct sysc *ddata)
1904 {
1905     int offset = 0x7c;  /* AESS_AUTO_GATING_ENABLE */
1906 
1907     sysc_write(ddata, offset, 1);
1908 }
1909 
1910 /* I2C needs to be disabled for reset */
1911 static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable)
1912 {
1913     int offset;
1914     u16 val;
1915 
1916     /* I2C_CON, omap2/3 is different from omap4 and later */
1917     if ((ddata->revision & 0xffffff00) == 0x001f0000)
1918         offset = 0x24;
1919     else
1920         offset = 0xa4;
1921 
1922     /* I2C_EN */
1923     val = sysc_read(ddata, offset);
1924     if (enable)
1925         val |= BIT(15);
1926     else
1927         val &= ~BIT(15);
1928     sysc_write(ddata, offset, val);
1929 }
1930 
1931 static void sysc_pre_reset_quirk_i2c(struct sysc *ddata)
1932 {
1933     sysc_clk_quirk_i2c(ddata, false);
1934 }
1935 
1936 static void sysc_post_reset_quirk_i2c(struct sysc *ddata)
1937 {
1938     sysc_clk_quirk_i2c(ddata, true);
1939 }
1940 
1941 /* RTC on am3 and 4 needs to be unlocked and locked for sysconfig */
1942 static void sysc_quirk_rtc(struct sysc *ddata, bool lock)
1943 {
1944     u32 val, kick0_val = 0, kick1_val = 0;
1945     unsigned long flags;
1946     int error;
1947 
1948     if (!lock) {
1949         kick0_val = 0x83e70b13;
1950         kick1_val = 0x95a4f1e0;
1951     }
1952 
1953     local_irq_save(flags);
1954     /* RTC_STATUS BUSY bit may stay active for 1/32768 seconds (~30 usec) */
1955     error = readl_poll_timeout_atomic(ddata->module_va + 0x44, val,
1956                       !(val & BIT(0)), 100, 50);
1957     if (error)
1958         dev_warn(ddata->dev, "rtc busy timeout\n");
1959     /* Now we have ~15 microseconds to read/write various registers */
1960     sysc_write(ddata, 0x6c, kick0_val);
1961     sysc_write(ddata, 0x70, kick1_val);
1962     local_irq_restore(flags);
1963 }
1964 
1965 static void sysc_module_unlock_quirk_rtc(struct sysc *ddata)
1966 {
1967     sysc_quirk_rtc(ddata, false);
1968 }
1969 
1970 static void sysc_module_lock_quirk_rtc(struct sysc *ddata)
1971 {
1972     sysc_quirk_rtc(ddata, true);
1973 }
1974 
1975 /* OTG omap2430 glue layer up to omap4 needs OTG_FORCESTDBY configured */
1976 static void sysc_module_enable_quirk_otg(struct sysc *ddata)
1977 {
1978     int offset = 0x414; /* OTG_FORCESTDBY */
1979 
1980     sysc_write(ddata, offset, 0);
1981 }
1982 
1983 static void sysc_module_disable_quirk_otg(struct sysc *ddata)
1984 {
1985     int offset = 0x414; /* OTG_FORCESTDBY */
1986     u32 val = BIT(0);   /* ENABLEFORCE */
1987 
1988     sysc_write(ddata, offset, val);
1989 }
1990 
1991 /* 36xx SGX needs a quirk for to bypass OCP IPG interrupt logic */
1992 static void sysc_module_enable_quirk_sgx(struct sysc *ddata)
1993 {
1994     int offset = 0xff08;    /* OCP_DEBUG_CONFIG */
1995     u32 val = BIT(31);  /* THALIA_INT_BYPASS */
1996 
1997     sysc_write(ddata, offset, val);
1998 }
1999 
2000 /* Watchdog timer needs a disable sequence after reset */
2001 static void sysc_reset_done_quirk_wdt(struct sysc *ddata)
2002 {
2003     int wps, spr, error;
2004     u32 val;
2005 
2006     wps = 0x34;
2007     spr = 0x48;
2008 
2009     sysc_write(ddata, spr, 0xaaaa);
2010     error = readl_poll_timeout(ddata->module_va + wps, val,
2011                    !(val & 0x10), 100,
2012                    MAX_MODULE_SOFTRESET_WAIT);
2013     if (error)
2014         dev_warn(ddata->dev, "wdt disable step1 failed\n");
2015 
2016     sysc_write(ddata, spr, 0x5555);
2017     error = readl_poll_timeout(ddata->module_va + wps, val,
2018                    !(val & 0x10), 100,
2019                    MAX_MODULE_SOFTRESET_WAIT);
2020     if (error)
2021         dev_warn(ddata->dev, "wdt disable step2 failed\n");
2022 }
2023 
2024 /* PRUSS needs to set MSTANDBY_INIT inorder to idle properly */
2025 static void sysc_module_disable_quirk_pruss(struct sysc *ddata)
2026 {
2027     u32 reg;
2028 
2029     reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
2030     reg |= SYSC_PRUSS_STANDBY_INIT;
2031     sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
2032 }
2033 
2034 static void sysc_init_module_quirks(struct sysc *ddata)
2035 {
2036     if (ddata->legacy_mode || !ddata->name)
2037         return;
2038 
2039     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_HDQ1W) {
2040         ddata->pre_reset_quirk = sysc_pre_reset_quirk_hdq1w;
2041 
2042         return;
2043     }
2044 
2045 #ifdef CONFIG_OMAP_GPMC_DEBUG
2046     if (ddata->cfg.quirks & SYSC_QUIRK_GPMC_DEBUG) {
2047         ddata->cfg.quirks |= SYSC_QUIRK_NO_RESET_ON_INIT;
2048 
2049         return;
2050     }
2051 #endif
2052 
2053     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_I2C) {
2054         ddata->pre_reset_quirk = sysc_pre_reset_quirk_i2c;
2055         ddata->post_reset_quirk = sysc_post_reset_quirk_i2c;
2056 
2057         return;
2058     }
2059 
2060     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_AESS)
2061         ddata->module_enable_quirk = sysc_module_enable_quirk_aess;
2062 
2063     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_DSS_RESET)
2064         ddata->pre_reset_quirk = sysc_pre_reset_quirk_dss;
2065 
2066     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_RTC_UNLOCK) {
2067         ddata->module_unlock_quirk = sysc_module_unlock_quirk_rtc;
2068         ddata->module_lock_quirk = sysc_module_lock_quirk_rtc;
2069 
2070         return;
2071     }
2072 
2073     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_OTG) {
2074         ddata->module_enable_quirk = sysc_module_enable_quirk_otg;
2075         ddata->module_disable_quirk = sysc_module_disable_quirk_otg;
2076     }
2077 
2078     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_SGX)
2079         ddata->module_enable_quirk = sysc_module_enable_quirk_sgx;
2080 
2081     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT) {
2082         ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;
2083         ddata->module_disable_quirk = sysc_reset_done_quirk_wdt;
2084     }
2085 
2086     if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_PRUSS)
2087         ddata->module_disable_quirk = sysc_module_disable_quirk_pruss;
2088 }
2089 
2090 static int sysc_clockdomain_init(struct sysc *ddata)
2091 {
2092     struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
2093     struct clk *fck = NULL, *ick = NULL;
2094     int error;
2095 
2096     if (!pdata || !pdata->init_clockdomain)
2097         return 0;
2098 
2099     switch (ddata->nr_clocks) {
2100     case 2:
2101         ick = ddata->clocks[SYSC_ICK];
2102         fallthrough;
2103     case 1:
2104         fck = ddata->clocks[SYSC_FCK];
2105         break;
2106     case 0:
2107         return 0;
2108     }
2109 
2110     error = pdata->init_clockdomain(ddata->dev, fck, ick, &ddata->cookie);
2111     if (!error || error == -ENODEV)
2112         return 0;
2113 
2114     return error;
2115 }
2116 
2117 /*
2118  * Note that pdata->init_module() typically does a reset first. After
2119  * pdata->init_module() is done, PM runtime can be used for the interconnect
2120  * target module.
2121  */
2122 static int sysc_legacy_init(struct sysc *ddata)
2123 {
2124     struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
2125     int error;
2126 
2127     if (!pdata || !pdata->init_module)
2128         return 0;
2129 
2130     error = pdata->init_module(ddata->dev, ddata->mdata, &ddata->cookie);
2131     if (error == -EEXIST)
2132         error = 0;
2133 
2134     return error;
2135 }
2136 
2137 /*
2138  * Note that the caller must ensure the interconnect target module is enabled
2139  * before calling reset. Otherwise reset will not complete.
2140  */
2141 static int sysc_reset(struct sysc *ddata)
2142 {
2143     int sysc_offset, sysc_val, error;
2144     u32 sysc_mask;
2145 
2146     sysc_offset = ddata->offsets[SYSC_SYSCONFIG];
2147 
2148     if (ddata->legacy_mode ||
2149         ddata->cap->regbits->srst_shift < 0 ||
2150         ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
2151         return 0;
2152 
2153     sysc_mask = BIT(ddata->cap->regbits->srst_shift);
2154 
2155     if (ddata->pre_reset_quirk)
2156         ddata->pre_reset_quirk(ddata);
2157 
2158     if (sysc_offset >= 0) {
2159         sysc_val = sysc_read_sysconfig(ddata);
2160         sysc_val |= sysc_mask;
2161         sysc_write(ddata, sysc_offset, sysc_val);
2162     }
2163 
2164     if (ddata->cfg.srst_udelay)
2165         usleep_range(ddata->cfg.srst_udelay,
2166                  ddata->cfg.srst_udelay * 2);
2167 
2168     if (ddata->post_reset_quirk)
2169         ddata->post_reset_quirk(ddata);
2170 
2171     error = sysc_wait_softreset(ddata);
2172     if (error)
2173         dev_warn(ddata->dev, "OCP softreset timed out\n");
2174 
2175     if (ddata->reset_done_quirk)
2176         ddata->reset_done_quirk(ddata);
2177 
2178     return error;
2179 }
2180 
2181 /*
2182  * At this point the module is configured enough to read the revision but
2183  * module may not be completely configured yet to use PM runtime. Enable
2184  * all clocks directly during init to configure the quirks needed for PM
2185  * runtime based on the revision register.
2186  */
2187 static int sysc_init_module(struct sysc *ddata)
2188 {
2189     bool rstctrl_deasserted = false;
2190     int error = 0;
2191 
2192     error = sysc_clockdomain_init(ddata);
2193     if (error)
2194         return error;
2195 
2196     sysc_clkdm_deny_idle(ddata);
2197 
2198     /*
2199      * Always enable clocks. The bootloader may or may not have enabled
2200      * the related clocks.
2201      */
2202     error = sysc_enable_opt_clocks(ddata);
2203     if (error)
2204         return error;
2205 
2206     error = sysc_enable_main_clocks(ddata);
2207     if (error)
2208         goto err_opt_clocks;
2209 
2210     if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) {
2211         error = reset_control_deassert(ddata->rsts);
2212         if (error)
2213             goto err_main_clocks;
2214         rstctrl_deasserted = true;
2215     }
2216 
2217     ddata->revision = sysc_read_revision(ddata);
2218     sysc_init_revision_quirks(ddata);
2219     sysc_init_module_quirks(ddata);
2220 
2221     if (ddata->legacy_mode) {
2222         error = sysc_legacy_init(ddata);
2223         if (error)
2224             goto err_main_clocks;
2225     }
2226 
2227     if (!ddata->legacy_mode) {
2228         error = sysc_enable_module(ddata->dev);
2229         if (error)
2230             goto err_main_clocks;
2231     }
2232 
2233     error = sysc_reset(ddata);
2234     if (error)
2235         dev_err(ddata->dev, "Reset failed with %d\n", error);
2236 
2237     if (error && !ddata->legacy_mode)
2238         sysc_disable_module(ddata->dev);
2239 
2240 err_main_clocks:
2241     if (error)
2242         sysc_disable_main_clocks(ddata);
2243 err_opt_clocks:
2244     /* No re-enable of clockdomain autoidle to prevent module autoidle */
2245     if (error) {
2246         sysc_disable_opt_clocks(ddata);
2247         sysc_clkdm_allow_idle(ddata);
2248     }
2249 
2250     if (error && rstctrl_deasserted &&
2251         !(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
2252         reset_control_assert(ddata->rsts);
2253 
2254     return error;
2255 }
2256 
2257 static int sysc_init_sysc_mask(struct sysc *ddata)
2258 {
2259     struct device_node *np = ddata->dev->of_node;
2260     int error;
2261     u32 val;
2262 
2263     error = of_property_read_u32(np, "ti,sysc-mask", &val);
2264     if (error)
2265         return 0;
2266 
2267     ddata->cfg.sysc_val = val & ddata->cap->sysc_mask;
2268 
2269     return 0;
2270 }
2271 
2272 static int sysc_init_idlemode(struct sysc *ddata, u8 *idlemodes,
2273                   const char *name)
2274 {
2275     struct device_node *np = ddata->dev->of_node;
2276     struct property *prop;
2277     const __be32 *p;
2278     u32 val;
2279 
2280     of_property_for_each_u32(np, name, prop, p, val) {
2281         if (val >= SYSC_NR_IDLEMODES) {
2282             dev_err(ddata->dev, "invalid idlemode: %i\n", val);
2283             return -EINVAL;
2284         }
2285         *idlemodes |=  (1 << val);
2286     }
2287 
2288     return 0;
2289 }
2290 
2291 static int sysc_init_idlemodes(struct sysc *ddata)
2292 {
2293     int error;
2294 
2295     error = sysc_init_idlemode(ddata, &ddata->cfg.midlemodes,
2296                    "ti,sysc-midle");
2297     if (error)
2298         return error;
2299 
2300     error = sysc_init_idlemode(ddata, &ddata->cfg.sidlemodes,
2301                    "ti,sysc-sidle");
2302     if (error)
2303         return error;
2304 
2305     return 0;
2306 }
2307 
2308 /*
2309  * Only some devices on omap4 and later have SYSCONFIG reset done
2310  * bit. We can detect this if there is no SYSSTATUS at all, or the
2311  * SYSTATUS bit 0 is not used. Note that some SYSSTATUS registers
2312  * have multiple bits for the child devices like OHCI and EHCI.
2313  * Depends on SYSC being parsed first.
2314  */
2315 static int sysc_init_syss_mask(struct sysc *ddata)
2316 {
2317     struct device_node *np = ddata->dev->of_node;
2318     int error;
2319     u32 val;
2320 
2321     error = of_property_read_u32(np, "ti,syss-mask", &val);
2322     if (error) {
2323         if ((ddata->cap->type == TI_SYSC_OMAP4 ||
2324              ddata->cap->type == TI_SYSC_OMAP4_TIMER) &&
2325             (ddata->cfg.sysc_val & SYSC_OMAP4_SOFTRESET))
2326             ddata->cfg.quirks |= SYSC_QUIRK_RESET_STATUS;
2327 
2328         return 0;
2329     }
2330 
2331     if (!(val & 1) && (ddata->cfg.sysc_val & SYSC_OMAP4_SOFTRESET))
2332         ddata->cfg.quirks |= SYSC_QUIRK_RESET_STATUS;
2333 
2334     ddata->cfg.syss_mask = val;
2335 
2336     return 0;
2337 }
2338 
2339 /*
2340  * Many child device drivers need to have fck and opt clocks available
2341  * to get the clock rate for device internal configuration etc.
2342  */
2343 static int sysc_child_add_named_clock(struct sysc *ddata,
2344                       struct device *child,
2345                       const char *name)
2346 {
2347     struct clk *clk;
2348     struct clk_lookup *l;
2349     int error = 0;
2350 
2351     if (!name)
2352         return 0;
2353 
2354     clk = clk_get(child, name);
2355     if (!IS_ERR(clk)) {
2356         error = -EEXIST;
2357         goto put_clk;
2358     }
2359 
2360     clk = clk_get(ddata->dev, name);
2361     if (IS_ERR(clk))
2362         return -ENODEV;
2363 
2364     l = clkdev_create(clk, name, dev_name(child));
2365     if (!l)
2366         error = -ENOMEM;
2367 put_clk:
2368     clk_put(clk);
2369 
2370     return error;
2371 }
2372 
2373 static int sysc_child_add_clocks(struct sysc *ddata,
2374                  struct device *child)
2375 {
2376     int i, error;
2377 
2378     for (i = 0; i < ddata->nr_clocks; i++) {
2379         error = sysc_child_add_named_clock(ddata,
2380                            child,
2381                            ddata->clock_roles[i]);
2382         if (error && error != -EEXIST) {
2383             dev_err(ddata->dev, "could not add child clock %s: %i\n",
2384                 ddata->clock_roles[i], error);
2385 
2386             return error;
2387         }
2388     }
2389 
2390     return 0;
2391 }
2392 
2393 static struct device_type sysc_device_type = {
2394 };
2395 
2396 static struct sysc *sysc_child_to_parent(struct device *dev)
2397 {
2398     struct device *parent = dev->parent;
2399 
2400     if (!parent || parent->type != &sysc_device_type)
2401         return NULL;
2402 
2403     return dev_get_drvdata(parent);
2404 }
2405 
2406 static int __maybe_unused sysc_child_runtime_suspend(struct device *dev)
2407 {
2408     struct sysc *ddata;
2409     int error;
2410 
2411     ddata = sysc_child_to_parent(dev);
2412 
2413     error = pm_generic_runtime_suspend(dev);
2414     if (error)
2415         return error;
2416 
2417     if (!ddata->enabled)
2418         return 0;
2419 
2420     return sysc_runtime_suspend(ddata->dev);
2421 }
2422 
2423 static int __maybe_unused sysc_child_runtime_resume(struct device *dev)
2424 {
2425     struct sysc *ddata;
2426     int error;
2427 
2428     ddata = sysc_child_to_parent(dev);
2429 
2430     if (!ddata->enabled) {
2431         error = sysc_runtime_resume(ddata->dev);
2432         if (error < 0)
2433             dev_err(ddata->dev,
2434                 "%s error: %i\n", __func__, error);
2435     }
2436 
2437     return pm_generic_runtime_resume(dev);
2438 }
2439 
2440 #ifdef CONFIG_PM_SLEEP
2441 static int sysc_child_suspend_noirq(struct device *dev)
2442 {
2443     struct sysc *ddata;
2444     int error;
2445 
2446     ddata = sysc_child_to_parent(dev);
2447 
2448     dev_dbg(ddata->dev, "%s %s\n", __func__,
2449         ddata->name ? ddata->name : "");
2450 
2451     error = pm_generic_suspend_noirq(dev);
2452     if (error) {
2453         dev_err(dev, "%s error at %i: %i\n",
2454             __func__, __LINE__, error);
2455 
2456         return error;
2457     }
2458 
2459     if (!pm_runtime_status_suspended(dev)) {
2460         error = pm_generic_runtime_suspend(dev);
2461         if (error) {
2462             dev_dbg(dev, "%s busy at %i: %i\n",
2463                 __func__, __LINE__, error);
2464 
2465             return 0;
2466         }
2467 
2468         error = sysc_runtime_suspend(ddata->dev);
2469         if (error) {
2470             dev_err(dev, "%s error at %i: %i\n",
2471                 __func__, __LINE__, error);
2472 
2473             return error;
2474         }
2475 
2476         ddata->child_needs_resume = true;
2477     }
2478 
2479     return 0;
2480 }
2481 
2482 static int sysc_child_resume_noirq(struct device *dev)
2483 {
2484     struct sysc *ddata;
2485     int error;
2486 
2487     ddata = sysc_child_to_parent(dev);
2488 
2489     dev_dbg(ddata->dev, "%s %s\n", __func__,
2490         ddata->name ? ddata->name : "");
2491 
2492     if (ddata->child_needs_resume) {
2493         ddata->child_needs_resume = false;
2494 
2495         error = sysc_runtime_resume(ddata->dev);
2496         if (error)
2497             dev_err(ddata->dev,
2498                 "%s runtime resume error: %i\n",
2499                 __func__, error);
2500 
2501         error = pm_generic_runtime_resume(dev);
2502         if (error)
2503             dev_err(ddata->dev,
2504                 "%s generic runtime resume: %i\n",
2505                 __func__, error);
2506     }
2507 
2508     return pm_generic_resume_noirq(dev);
2509 }
2510 #endif
2511 
2512 static struct dev_pm_domain sysc_child_pm_domain = {
2513     .ops = {
2514         SET_RUNTIME_PM_OPS(sysc_child_runtime_suspend,
2515                    sysc_child_runtime_resume,
2516                    NULL)
2517         USE_PLATFORM_PM_SLEEP_OPS
2518         SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_child_suspend_noirq,
2519                           sysc_child_resume_noirq)
2520     }
2521 };
2522 
2523 /* Caller needs to take list_lock if ever used outside of cpu_pm */
2524 static void sysc_reinit_modules(struct sysc_soc_info *soc)
2525 {
2526     struct sysc_module *module;
2527     struct list_head *pos;
2528     struct sysc *ddata;
2529 
2530     list_for_each(pos, &sysc_soc->restored_modules) {
2531         module = list_entry(pos, struct sysc_module, node);
2532         ddata = module->ddata;
2533         sysc_reinit_module(ddata, ddata->enabled);
2534     }
2535 }
2536 
2537 /**
2538  * sysc_context_notifier - optionally reset and restore module after idle
2539  * @nb: notifier block
2540  * @cmd: unused
2541  * @v: unused
2542  *
2543  * Some interconnect target modules need to be restored, or reset and restored
2544  * on CPU_PM CPU_PM_CLUSTER_EXIT notifier. This is needed at least for am335x
2545  * OTG and GPMC target modules even if the modules are unused.
2546  */
2547 static int sysc_context_notifier(struct notifier_block *nb, unsigned long cmd,
2548                  void *v)
2549 {
2550     struct sysc_soc_info *soc;
2551 
2552     soc = container_of(nb, struct sysc_soc_info, nb);
2553 
2554     switch (cmd) {
2555     case CPU_CLUSTER_PM_ENTER:
2556         break;
2557     case CPU_CLUSTER_PM_ENTER_FAILED:   /* No need to restore context */
2558         break;
2559     case CPU_CLUSTER_PM_EXIT:
2560         sysc_reinit_modules(soc);
2561         break;
2562     }
2563 
2564     return NOTIFY_OK;
2565 }
2566 
2567 /**
2568  * sysc_add_restored - optionally add reset and restore quirk hanlling
2569  * @ddata: device data
2570  */
2571 static void sysc_add_restored(struct sysc *ddata)
2572 {
2573     struct sysc_module *restored_module;
2574 
2575     restored_module = kzalloc(sizeof(*restored_module), GFP_KERNEL);
2576     if (!restored_module)
2577         return;
2578 
2579     restored_module->ddata = ddata;
2580 
2581     mutex_lock(&sysc_soc->list_lock);
2582 
2583     list_add(&restored_module->node, &sysc_soc->restored_modules);
2584 
2585     if (sysc_soc->nb.notifier_call)
2586         goto out_unlock;
2587 
2588     sysc_soc->nb.notifier_call = sysc_context_notifier;
2589     cpu_pm_register_notifier(&sysc_soc->nb);
2590 
2591 out_unlock:
2592     mutex_unlock(&sysc_soc->list_lock);
2593 }
2594 
2595 /**
2596  * sysc_legacy_idle_quirk - handle children in omap_device compatible way
2597  * @ddata: device driver data
2598  * @child: child device driver
2599  *
2600  * Allow idle for child devices as done with _od_runtime_suspend().
2601  * Otherwise many child devices will not idle because of the permanent
2602  * parent usecount set in pm_runtime_irq_safe().
2603  *
2604  * Note that the long term solution is to just modify the child device
2605  * drivers to not set pm_runtime_irq_safe() and then this can be just
2606  * dropped.
2607  */
2608 static void sysc_legacy_idle_quirk(struct sysc *ddata, struct device *child)
2609 {
2610     if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
2611         dev_pm_domain_set(child, &sysc_child_pm_domain);
2612 }
2613 
2614 static int sysc_notifier_call(struct notifier_block *nb,
2615                   unsigned long event, void *device)
2616 {
2617     struct device *dev = device;
2618     struct sysc *ddata;
2619     int error;
2620 
2621     ddata = sysc_child_to_parent(dev);
2622     if (!ddata)
2623         return NOTIFY_DONE;
2624 
2625     switch (event) {
2626     case BUS_NOTIFY_ADD_DEVICE:
2627         error = sysc_child_add_clocks(ddata, dev);
2628         if (error)
2629             return error;
2630         sysc_legacy_idle_quirk(ddata, dev);
2631         break;
2632     default:
2633         break;
2634     }
2635 
2636     return NOTIFY_DONE;
2637 }
2638 
2639 static struct notifier_block sysc_nb = {
2640     .notifier_call = sysc_notifier_call,
2641 };
2642 
2643 /* Device tree configured quirks */
2644 struct sysc_dts_quirk {
2645     const char *name;
2646     u32 mask;
2647 };
2648 
2649 static const struct sysc_dts_quirk sysc_dts_quirks[] = {
2650     { .name = "ti,no-idle-on-init",
2651       .mask = SYSC_QUIRK_NO_IDLE_ON_INIT, },
2652     { .name = "ti,no-reset-on-init",
2653       .mask = SYSC_QUIRK_NO_RESET_ON_INIT, },
2654     { .name = "ti,no-idle",
2655       .mask = SYSC_QUIRK_NO_IDLE, },
2656 };
2657 
2658 static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
2659                   bool is_child)
2660 {
2661     const struct property *prop;
2662     int i, len;
2663 
2664     for (i = 0; i < ARRAY_SIZE(sysc_dts_quirks); i++) {
2665         const char *name = sysc_dts_quirks[i].name;
2666 
2667         prop = of_get_property(np, name, &len);
2668         if (!prop)
2669             continue;
2670 
2671         ddata->cfg.quirks |= sysc_dts_quirks[i].mask;
2672         if (is_child) {
2673             dev_warn(ddata->dev,
2674                  "dts flag should be at module level for %s\n",
2675                  name);
2676         }
2677     }
2678 }
2679 
2680 static int sysc_init_dts_quirks(struct sysc *ddata)
2681 {
2682     struct device_node *np = ddata->dev->of_node;
2683     int error;
2684     u32 val;
2685 
2686     ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL);
2687 
2688     sysc_parse_dts_quirks(ddata, np, false);
2689     error = of_property_read_u32(np, "ti,sysc-delay-us", &val);
2690     if (!error) {
2691         if (val > 255) {
2692             dev_warn(ddata->dev, "bad ti,sysc-delay-us: %i\n",
2693                  val);
2694         }
2695 
2696         ddata->cfg.srst_udelay = (u8)val;
2697     }
2698 
2699     return 0;
2700 }
2701 
2702 static void sysc_unprepare(struct sysc *ddata)
2703 {
2704     int i;
2705 
2706     if (!ddata->clocks)
2707         return;
2708 
2709     for (i = 0; i < SYSC_MAX_CLOCKS; i++) {
2710         if (!IS_ERR_OR_NULL(ddata->clocks[i]))
2711             clk_unprepare(ddata->clocks[i]);
2712     }
2713 }
2714 
2715 /*
2716  * Common sysc register bits found on omap2, also known as type1
2717  */
2718 static const struct sysc_regbits sysc_regbits_omap2 = {
2719     .dmadisable_shift = -ENODEV,
2720     .midle_shift = 12,
2721     .sidle_shift = 3,
2722     .clkact_shift = 8,
2723     .emufree_shift = 5,
2724     .enwkup_shift = 2,
2725     .srst_shift = 1,
2726     .autoidle_shift = 0,
2727 };
2728 
2729 static const struct sysc_capabilities sysc_omap2 = {
2730     .type = TI_SYSC_OMAP2,
2731     .sysc_mask = SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_EMUFREE |
2732              SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_SOFTRESET |
2733              SYSC_OMAP2_AUTOIDLE,
2734     .regbits = &sysc_regbits_omap2,
2735 };
2736 
2737 /* All omap2 and 3 timers, and timers 1, 2 & 10 on omap 4 and 5 */
2738 static const struct sysc_capabilities sysc_omap2_timer = {
2739     .type = TI_SYSC_OMAP2_TIMER,
2740     .sysc_mask = SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_EMUFREE |
2741              SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_SOFTRESET |
2742              SYSC_OMAP2_AUTOIDLE,
2743     .regbits = &sysc_regbits_omap2,
2744     .mod_quirks = SYSC_QUIRK_USE_CLOCKACT,
2745 };
2746 
2747 /*
2748  * SHAM2 (SHA1/MD5) sysc found on omap3, a variant of sysc_regbits_omap2
2749  * with different sidle position
2750  */
2751 static const struct sysc_regbits sysc_regbits_omap3_sham = {
2752     .dmadisable_shift = -ENODEV,
2753     .midle_shift = -ENODEV,
2754     .sidle_shift = 4,
2755     .clkact_shift = -ENODEV,
2756     .enwkup_shift = -ENODEV,
2757     .srst_shift = 1,
2758     .autoidle_shift = 0,
2759     .emufree_shift = -ENODEV,
2760 };
2761 
2762 static const struct sysc_capabilities sysc_omap3_sham = {
2763     .type = TI_SYSC_OMAP3_SHAM,
2764     .sysc_mask = SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE,
2765     .regbits = &sysc_regbits_omap3_sham,
2766 };
2767 
2768 /*
2769  * AES register bits found on omap3 and later, a variant of
2770  * sysc_regbits_omap2 with different sidle position
2771  */
2772 static const struct sysc_regbits sysc_regbits_omap3_aes = {
2773     .dmadisable_shift = -ENODEV,
2774     .midle_shift = -ENODEV,
2775     .sidle_shift = 6,
2776     .clkact_shift = -ENODEV,
2777     .enwkup_shift = -ENODEV,
2778     .srst_shift = 1,
2779     .autoidle_shift = 0,
2780     .emufree_shift = -ENODEV,
2781 };
2782 
2783 static const struct sysc_capabilities sysc_omap3_aes = {
2784     .type = TI_SYSC_OMAP3_AES,
2785     .sysc_mask = SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE,
2786     .regbits = &sysc_regbits_omap3_aes,
2787 };
2788 
2789 /*
2790  * Common sysc register bits found on omap4, also known as type2
2791  */
2792 static const struct sysc_regbits sysc_regbits_omap4 = {
2793     .dmadisable_shift = 16,
2794     .midle_shift = 4,
2795     .sidle_shift = 2,
2796     .clkact_shift = -ENODEV,
2797     .enwkup_shift = -ENODEV,
2798     .emufree_shift = 1,
2799     .srst_shift = 0,
2800     .autoidle_shift = -ENODEV,
2801 };
2802 
2803 static const struct sysc_capabilities sysc_omap4 = {
2804     .type = TI_SYSC_OMAP4,
2805     .sysc_mask = SYSC_OMAP4_DMADISABLE | SYSC_OMAP4_FREEEMU |
2806              SYSC_OMAP4_SOFTRESET,
2807     .regbits = &sysc_regbits_omap4,
2808 };
2809 
2810 static const struct sysc_capabilities sysc_omap4_timer = {
2811     .type = TI_SYSC_OMAP4_TIMER,
2812     .sysc_mask = SYSC_OMAP4_DMADISABLE | SYSC_OMAP4_FREEEMU |
2813              SYSC_OMAP4_SOFTRESET,
2814     .regbits = &sysc_regbits_omap4,
2815 };
2816 
2817 /*
2818  * Common sysc register bits found on omap4, also known as type3
2819  */
2820 static const struct sysc_regbits sysc_regbits_omap4_simple = {
2821     .dmadisable_shift = -ENODEV,
2822     .midle_shift = 2,
2823     .sidle_shift = 0,
2824     .clkact_shift = -ENODEV,
2825     .enwkup_shift = -ENODEV,
2826     .srst_shift = -ENODEV,
2827     .emufree_shift = -ENODEV,
2828     .autoidle_shift = -ENODEV,
2829 };
2830 
2831 static const struct sysc_capabilities sysc_omap4_simple = {
2832     .type = TI_SYSC_OMAP4_SIMPLE,
2833     .regbits = &sysc_regbits_omap4_simple,
2834 };
2835 
2836 /*
2837  * SmartReflex sysc found on omap34xx
2838  */
2839 static const struct sysc_regbits sysc_regbits_omap34xx_sr = {
2840     .dmadisable_shift = -ENODEV,
2841     .midle_shift = -ENODEV,
2842     .sidle_shift = -ENODEV,
2843     .clkact_shift = 20,
2844     .enwkup_shift = -ENODEV,
2845     .srst_shift = -ENODEV,
2846     .emufree_shift = -ENODEV,
2847     .autoidle_shift = -ENODEV,
2848 };
2849 
2850 static const struct sysc_capabilities sysc_34xx_sr = {
2851     .type = TI_SYSC_OMAP34XX_SR,
2852     .sysc_mask = SYSC_OMAP2_CLOCKACTIVITY,
2853     .regbits = &sysc_regbits_omap34xx_sr,
2854     .mod_quirks = SYSC_QUIRK_USE_CLOCKACT | SYSC_QUIRK_UNCACHED |
2855               SYSC_QUIRK_LEGACY_IDLE,
2856 };
2857 
2858 /*
2859  * SmartReflex sysc found on omap36xx and later
2860  */
2861 static const struct sysc_regbits sysc_regbits_omap36xx_sr = {
2862     .dmadisable_shift = -ENODEV,
2863     .midle_shift = -ENODEV,
2864     .sidle_shift = 24,
2865     .clkact_shift = -ENODEV,
2866     .enwkup_shift = 26,
2867     .srst_shift = -ENODEV,
2868     .emufree_shift = -ENODEV,
2869     .autoidle_shift = -ENODEV,
2870 };
2871 
2872 static const struct sysc_capabilities sysc_36xx_sr = {
2873     .type = TI_SYSC_OMAP36XX_SR,
2874     .sysc_mask = SYSC_OMAP3_SR_ENAWAKEUP,
2875     .regbits = &sysc_regbits_omap36xx_sr,
2876     .mod_quirks = SYSC_QUIRK_UNCACHED | SYSC_QUIRK_LEGACY_IDLE,
2877 };
2878 
2879 static const struct sysc_capabilities sysc_omap4_sr = {
2880     .type = TI_SYSC_OMAP4_SR,
2881     .regbits = &sysc_regbits_omap36xx_sr,
2882     .mod_quirks = SYSC_QUIRK_LEGACY_IDLE,
2883 };
2884 
2885 /*
2886  * McASP register bits found on omap4 and later
2887  */
2888 static const struct sysc_regbits sysc_regbits_omap4_mcasp = {
2889     .dmadisable_shift = -ENODEV,
2890     .midle_shift = -ENODEV,
2891     .sidle_shift = 0,
2892     .clkact_shift = -ENODEV,
2893     .enwkup_shift = -ENODEV,
2894     .srst_shift = -ENODEV,
2895     .emufree_shift = -ENODEV,
2896     .autoidle_shift = -ENODEV,
2897 };
2898 
2899 static const struct sysc_capabilities sysc_omap4_mcasp = {
2900     .type = TI_SYSC_OMAP4_MCASP,
2901     .regbits = &sysc_regbits_omap4_mcasp,
2902     .mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED,
2903 };
2904 
2905 /*
2906  * McASP found on dra7 and later
2907  */
2908 static const struct sysc_capabilities sysc_dra7_mcasp = {
2909     .type = TI_SYSC_OMAP4_SIMPLE,
2910     .regbits = &sysc_regbits_omap4_simple,
2911     .mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED,
2912 };
2913 
2914 /*
2915  * FS USB host found on omap4 and later
2916  */
2917 static const struct sysc_regbits sysc_regbits_omap4_usb_host_fs = {
2918     .dmadisable_shift = -ENODEV,
2919     .midle_shift = -ENODEV,
2920     .sidle_shift = 24,
2921     .clkact_shift = -ENODEV,
2922     .enwkup_shift = 26,
2923     .srst_shift = -ENODEV,
2924     .emufree_shift = -ENODEV,
2925     .autoidle_shift = -ENODEV,
2926 };
2927 
2928 static const struct sysc_capabilities sysc_omap4_usb_host_fs = {
2929     .type = TI_SYSC_OMAP4_USB_HOST_FS,
2930     .sysc_mask = SYSC_OMAP2_ENAWAKEUP,
2931     .regbits = &sysc_regbits_omap4_usb_host_fs,
2932 };
2933 
2934 static const struct sysc_regbits sysc_regbits_dra7_mcan = {
2935     .dmadisable_shift = -ENODEV,
2936     .midle_shift = -ENODEV,
2937     .sidle_shift = -ENODEV,
2938     .clkact_shift = -ENODEV,
2939     .enwkup_shift = 4,
2940     .srst_shift = 0,
2941     .emufree_shift = -ENODEV,
2942     .autoidle_shift = -ENODEV,
2943 };
2944 
2945 static const struct sysc_capabilities sysc_dra7_mcan = {
2946     .type = TI_SYSC_DRA7_MCAN,
2947     .sysc_mask = SYSC_DRA7_MCAN_ENAWAKEUP | SYSC_OMAP4_SOFTRESET,
2948     .regbits = &sysc_regbits_dra7_mcan,
2949     .mod_quirks = SYSS_QUIRK_RESETDONE_INVERTED,
2950 };
2951 
2952 /*
2953  * PRUSS found on some AM33xx, AM437x and AM57xx SoCs
2954  */
2955 static const struct sysc_capabilities sysc_pruss = {
2956     .type = TI_SYSC_PRUSS,
2957     .sysc_mask = SYSC_PRUSS_STANDBY_INIT | SYSC_PRUSS_SUB_MWAIT,
2958     .regbits = &sysc_regbits_omap4_simple,
2959     .mod_quirks = SYSC_MODULE_QUIRK_PRUSS,
2960 };
2961 
2962 static int sysc_init_pdata(struct sysc *ddata)
2963 {
2964     struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
2965     struct ti_sysc_module_data *mdata;
2966 
2967     if (!pdata)
2968         return 0;
2969 
2970     mdata = devm_kzalloc(ddata->dev, sizeof(*mdata), GFP_KERNEL);
2971     if (!mdata)
2972         return -ENOMEM;
2973 
2974     if (ddata->legacy_mode) {
2975         mdata->name = ddata->legacy_mode;
2976         mdata->module_pa = ddata->module_pa;
2977         mdata->module_size = ddata->module_size;
2978         mdata->offsets = ddata->offsets;
2979         mdata->nr_offsets = SYSC_MAX_REGS;
2980         mdata->cap = ddata->cap;
2981         mdata->cfg = &ddata->cfg;
2982     }
2983 
2984     ddata->mdata = mdata;
2985 
2986     return 0;
2987 }
2988 
2989 static int sysc_init_match(struct sysc *ddata)
2990 {
2991     const struct sysc_capabilities *cap;
2992 
2993     cap = of_device_get_match_data(ddata->dev);
2994     if (!cap)
2995         return -EINVAL;
2996 
2997     ddata->cap = cap;
2998     if (ddata->cap)
2999         ddata->cfg.quirks |= ddata->cap->mod_quirks;
3000 
3001     return 0;
3002 }
3003 
3004 static void ti_sysc_idle(struct work_struct *work)
3005 {
3006     struct sysc *ddata;
3007 
3008     ddata = container_of(work, struct sysc, idle_work.work);
3009 
3010     /*
3011      * One time decrement of clock usage counts if left on from init.
3012      * Note that we disable opt clocks unconditionally in this case
3013      * as they are enabled unconditionally during init without
3014      * considering sysc_opt_clks_needed() at that point.
3015      */
3016     if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE |
3017                  SYSC_QUIRK_NO_IDLE_ON_INIT)) {
3018         sysc_disable_main_clocks(ddata);
3019         sysc_disable_opt_clocks(ddata);
3020         sysc_clkdm_allow_idle(ddata);
3021     }
3022 
3023     /* Keep permanent PM runtime usage count for SYSC_QUIRK_NO_IDLE */
3024     if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)
3025         return;
3026 
3027     /*
3028      * Decrement PM runtime usage count for SYSC_QUIRK_NO_IDLE_ON_INIT
3029      * and SYSC_QUIRK_NO_RESET_ON_INIT
3030      */
3031     if (pm_runtime_active(ddata->dev))
3032         pm_runtime_put_sync(ddata->dev);
3033 }
3034 
3035 /*
3036  * SoC model and features detection. Only needed for SoCs that need
3037  * special handling for quirks, no need to list others.
3038  */
3039 static const struct soc_device_attribute sysc_soc_match[] = {
3040     SOC_FLAG("OMAP242*", SOC_2420),
3041     SOC_FLAG("OMAP243*", SOC_2430),
3042     SOC_FLAG("OMAP3[45]*", SOC_3430),
3043     SOC_FLAG("OMAP3[67]*", SOC_3630),
3044     SOC_FLAG("OMAP443*", SOC_4430),
3045     SOC_FLAG("OMAP446*", SOC_4460),
3046     SOC_FLAG("OMAP447*", SOC_4470),
3047     SOC_FLAG("OMAP54*", SOC_5430),
3048     SOC_FLAG("AM433", SOC_AM3),
3049     SOC_FLAG("AM43*", SOC_AM4),
3050     SOC_FLAG("DRA7*", SOC_DRA7),
3051 
3052     { /* sentinel */ }
3053 };
3054 
3055 /*
3056  * List of SoCs variants with disabled features. By default we assume all
3057  * devices in the device tree are available so no need to list those SoCs.
3058  */
3059 static const struct soc_device_attribute sysc_soc_feat_match[] = {
3060     /* OMAP3430/3530 and AM3517 variants with some accelerators disabled */
3061     SOC_FLAG("AM3505", DIS_SGX),
3062     SOC_FLAG("OMAP3525", DIS_SGX),
3063     SOC_FLAG("OMAP3515", DIS_IVA | DIS_SGX),
3064     SOC_FLAG("OMAP3503", DIS_ISP | DIS_IVA | DIS_SGX),
3065 
3066     /* OMAP3630/DM3730 variants with some accelerators disabled */
3067     SOC_FLAG("AM3703", DIS_IVA | DIS_SGX),
3068     SOC_FLAG("DM3725", DIS_SGX),
3069     SOC_FLAG("OMAP3611", DIS_ISP | DIS_IVA | DIS_SGX),
3070     SOC_FLAG("OMAP3615/AM3715", DIS_IVA),
3071     SOC_FLAG("OMAP3621", DIS_ISP),
3072 
3073     { /* sentinel */ }
3074 };
3075 
3076 static int sysc_add_disabled(unsigned long base)
3077 {
3078     struct sysc_address *disabled_module;
3079 
3080     disabled_module = kzalloc(sizeof(*disabled_module), GFP_KERNEL);
3081     if (!disabled_module)
3082         return -ENOMEM;
3083 
3084     disabled_module->base = base;
3085 
3086     mutex_lock(&sysc_soc->list_lock);
3087     list_add(&disabled_module->node, &sysc_soc->disabled_modules);
3088     mutex_unlock(&sysc_soc->list_lock);
3089 
3090     return 0;
3091 }
3092 
3093 /*
3094  * One time init to detect the booted SoC, disable unavailable features
3095  * and initialize list for optional cpu_pm notifier.
3096  *
3097  * Note that we initialize static data shared across all ti-sysc instances
3098  * so ddata is only used for SoC type. This can be called from module_init
3099  * once we no longer need to rely on platform data.
3100  */
3101 static int sysc_init_static_data(struct sysc *ddata)
3102 {
3103     const struct soc_device_attribute *match;
3104     struct ti_sysc_platform_data *pdata;
3105     unsigned long features = 0;
3106     struct device_node *np;
3107 
3108     if (sysc_soc)
3109         return 0;
3110 
3111     sysc_soc = kzalloc(sizeof(*sysc_soc), GFP_KERNEL);
3112     if (!sysc_soc)
3113         return -ENOMEM;
3114 
3115     mutex_init(&sysc_soc->list_lock);
3116     INIT_LIST_HEAD(&sysc_soc->disabled_modules);
3117     INIT_LIST_HEAD(&sysc_soc->restored_modules);
3118     sysc_soc->general_purpose = true;
3119 
3120     pdata = dev_get_platdata(ddata->dev);
3121     if (pdata && pdata->soc_type_gp)
3122         sysc_soc->general_purpose = pdata->soc_type_gp();
3123 
3124     match = soc_device_match(sysc_soc_match);
3125     if (match && match->data)
3126         sysc_soc->soc = (int)match->data;
3127 
3128     /*
3129      * Check and warn about possible old incomplete dtb. We now want to see
3130      * simple-pm-bus instead of simple-bus in the dtb for genpd using SoCs.
3131      */
3132     switch (sysc_soc->soc) {
3133     case SOC_AM3:
3134     case SOC_AM4:
3135     case SOC_4430 ... SOC_4470:
3136     case SOC_5430:
3137     case SOC_DRA7:
3138         np = of_find_node_by_path("/ocp");
3139         WARN_ONCE(np && of_device_is_compatible(np, "simple-bus"),
3140               "ti-sysc: Incomplete old dtb, please update\n");
3141         break;
3142     default:
3143         break;
3144     }
3145 
3146     /* Ignore devices that are not available on HS and EMU SoCs */
3147     if (!sysc_soc->general_purpose) {
3148         switch (sysc_soc->soc) {
3149         case SOC_3430 ... SOC_3630:
3150             sysc_add_disabled(0x48304000);  /* timer12 */
3151             break;
3152         case SOC_AM3:
3153             sysc_add_disabled(0x48310000);  /* rng */
3154             break;
3155         default:
3156             break;
3157         }
3158     }
3159 
3160     match = soc_device_match(sysc_soc_feat_match);
3161     if (!match)
3162         return 0;
3163 
3164     if (match->data)
3165         features = (unsigned long)match->data;
3166 
3167     /*
3168      * Add disabled devices to the list based on the module base.
3169      * Note that this must be done before we attempt to access the
3170      * device and have module revision checks working.
3171      */
3172     if (features & DIS_ISP)
3173         sysc_add_disabled(0x480bd400);
3174     if (features & DIS_IVA)
3175         sysc_add_disabled(0x5d000000);
3176     if (features & DIS_SGX)
3177         sysc_add_disabled(0x50000000);
3178 
3179     return 0;
3180 }
3181 
3182 static void sysc_cleanup_static_data(void)
3183 {
3184     struct sysc_module *restored_module;
3185     struct sysc_address *disabled_module;
3186     struct list_head *pos, *tmp;
3187 
3188     if (!sysc_soc)
3189         return;
3190 
3191     if (sysc_soc->nb.notifier_call)
3192         cpu_pm_unregister_notifier(&sysc_soc->nb);
3193 
3194     mutex_lock(&sysc_soc->list_lock);
3195     list_for_each_safe(pos, tmp, &sysc_soc->restored_modules) {
3196         restored_module = list_entry(pos, struct sysc_module, node);
3197         list_del(pos);
3198         kfree(restored_module);
3199     }
3200     list_for_each_safe(pos, tmp, &sysc_soc->disabled_modules) {
3201         disabled_module = list_entry(pos, struct sysc_address, node);
3202         list_del(pos);
3203         kfree(disabled_module);
3204     }
3205     mutex_unlock(&sysc_soc->list_lock);
3206 }
3207 
3208 static int sysc_check_disabled_devices(struct sysc *ddata)
3209 {
3210     struct sysc_address *disabled_module;
3211     struct list_head *pos;
3212     int error = 0;
3213 
3214     mutex_lock(&sysc_soc->list_lock);
3215     list_for_each(pos, &sysc_soc->disabled_modules) {
3216         disabled_module = list_entry(pos, struct sysc_address, node);
3217         if (ddata->module_pa == disabled_module->base) {
3218             dev_dbg(ddata->dev, "module disabled for this SoC\n");
3219             error = -ENODEV;
3220             break;
3221         }
3222     }
3223     mutex_unlock(&sysc_soc->list_lock);
3224 
3225     return error;
3226 }
3227 
3228 /*
3229  * Ignore timers tagged with no-reset and no-idle. These are likely in use,
3230  * for example by drivers/clocksource/timer-ti-dm-systimer.c. If more checks
3231  * are needed, we could also look at the timer register configuration.
3232  */
3233 static int sysc_check_active_timer(struct sysc *ddata)
3234 {
3235     int error;
3236 
3237     if (ddata->cap->type != TI_SYSC_OMAP2_TIMER &&
3238         ddata->cap->type != TI_SYSC_OMAP4_TIMER)
3239         return 0;
3240 
3241     /*
3242      * Quirk for omap3 beagleboard revision A to B4 to use gpt12.
3243      * Revision C and later are fixed with commit 23885389dbbb ("ARM:
3244      * dts: Fix timer regression for beagleboard revision c"). This all
3245      * can be dropped if we stop supporting old beagleboard revisions
3246      * A to B4 at some point.
3247      */
3248     if (sysc_soc->soc == SOC_3430)
3249         error = -ENXIO;
3250     else
3251         error = -EBUSY;
3252 
3253     if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) &&
3254         (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE))
3255         return error;
3256 
3257     return 0;
3258 }
3259 
3260 static const struct of_device_id sysc_match_table[] = {
3261     { .compatible = "simple-bus", },
3262     { /* sentinel */ },
3263 };
3264 
3265 static int sysc_probe(struct platform_device *pdev)
3266 {
3267     struct ti_sysc_platform_data *pdata = dev_get_platdata(&pdev->dev);
3268     struct sysc *ddata;
3269     int error;
3270 
3271     ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
3272     if (!ddata)
3273         return -ENOMEM;
3274 
3275     ddata->offsets[SYSC_REVISION] = -ENODEV;
3276     ddata->offsets[SYSC_SYSCONFIG] = -ENODEV;
3277     ddata->offsets[SYSC_SYSSTATUS] = -ENODEV;
3278     ddata->dev = &pdev->dev;
3279     platform_set_drvdata(pdev, ddata);
3280 
3281     error = sysc_init_static_data(ddata);
3282     if (error)
3283         return error;
3284 
3285     error = sysc_init_match(ddata);
3286     if (error)
3287         return error;
3288 
3289     error = sysc_init_dts_quirks(ddata);
3290     if (error)
3291         return error;
3292 
3293     error = sysc_map_and_check_registers(ddata);
3294     if (error)
3295         return error;
3296 
3297     error = sysc_init_sysc_mask(ddata);
3298     if (error)
3299         return error;
3300 
3301     error = sysc_init_idlemodes(ddata);
3302     if (error)
3303         return error;
3304 
3305     error = sysc_init_syss_mask(ddata);
3306     if (error)
3307         return error;
3308 
3309     error = sysc_init_pdata(ddata);
3310     if (error)
3311         return error;
3312 
3313     sysc_init_early_quirks(ddata);
3314 
3315     error = sysc_check_disabled_devices(ddata);
3316     if (error)
3317         return error;
3318 
3319     error = sysc_check_active_timer(ddata);
3320     if (error == -ENXIO)
3321         ddata->reserved = true;
3322     else if (error)
3323         return error;
3324 
3325     error = sysc_get_clocks(ddata);
3326     if (error)
3327         return error;
3328 
3329     error = sysc_init_resets(ddata);
3330     if (error)
3331         goto unprepare;
3332 
3333     error = sysc_init_module(ddata);
3334     if (error)
3335         goto unprepare;
3336 
3337     pm_runtime_enable(ddata->dev);
3338     error = pm_runtime_resume_and_get(ddata->dev);
3339     if (error < 0) {
3340         pm_runtime_disable(ddata->dev);
3341         goto unprepare;
3342     }
3343 
3344     /* Balance use counts as PM runtime should have enabled these all */
3345     if (!(ddata->cfg.quirks &
3346           (SYSC_QUIRK_NO_IDLE | SYSC_QUIRK_NO_IDLE_ON_INIT))) {
3347         sysc_disable_main_clocks(ddata);
3348         sysc_disable_opt_clocks(ddata);
3349         sysc_clkdm_allow_idle(ddata);
3350     }
3351 
3352     if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
3353         reset_control_assert(ddata->rsts);
3354 
3355     sysc_show_registers(ddata);
3356 
3357     ddata->dev->type = &sysc_device_type;
3358 
3359     if (!ddata->reserved) {
3360         error = of_platform_populate(ddata->dev->of_node,
3361                          sysc_match_table,
3362                          pdata ? pdata->auxdata : NULL,
3363                          ddata->dev);
3364         if (error)
3365             goto err;
3366     }
3367 
3368     INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle);
3369 
3370     /* At least earlycon won't survive without deferred idle */
3371     if (ddata->cfg.quirks & (SYSC_QUIRK_NO_IDLE |
3372                  SYSC_QUIRK_NO_IDLE_ON_INIT |
3373                  SYSC_QUIRK_NO_RESET_ON_INIT)) {
3374         schedule_delayed_work(&ddata->idle_work, 3000);
3375     } else {
3376         pm_runtime_put(&pdev->dev);
3377     }
3378 
3379     if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_CTX_LOST)
3380         sysc_add_restored(ddata);
3381 
3382     return 0;
3383 
3384 err:
3385     pm_runtime_put_sync(&pdev->dev);
3386     pm_runtime_disable(&pdev->dev);
3387 unprepare:
3388     sysc_unprepare(ddata);
3389 
3390     return error;
3391 }
3392 
3393 static int sysc_remove(struct platform_device *pdev)
3394 {
3395     struct sysc *ddata = platform_get_drvdata(pdev);
3396     int error;
3397 
3398     /* Device can still be enabled, see deferred idle quirk in probe */
3399     if (cancel_delayed_work_sync(&ddata->idle_work))
3400         ti_sysc_idle(&ddata->idle_work.work);
3401 
3402     error = pm_runtime_resume_and_get(ddata->dev);
3403     if (error < 0) {
3404         pm_runtime_disable(ddata->dev);
3405         goto unprepare;
3406     }
3407 
3408     of_platform_depopulate(&pdev->dev);
3409 
3410     pm_runtime_put_sync(&pdev->dev);
3411     pm_runtime_disable(&pdev->dev);
3412 
3413     if (!reset_control_status(ddata->rsts))
3414         reset_control_assert(ddata->rsts);
3415 
3416 unprepare:
3417     sysc_unprepare(ddata);
3418 
3419     return 0;
3420 }
3421 
3422 static const struct of_device_id sysc_match[] = {
3423     { .compatible = "ti,sysc-omap2", .data = &sysc_omap2, },
3424     { .compatible = "ti,sysc-omap2-timer", .data = &sysc_omap2_timer, },
3425     { .compatible = "ti,sysc-omap4", .data = &sysc_omap4, },
3426     { .compatible = "ti,sysc-omap4-timer", .data = &sysc_omap4_timer, },
3427     { .compatible = "ti,sysc-omap4-simple", .data = &sysc_omap4_simple, },
3428     { .compatible = "ti,sysc-omap3430-sr", .data = &sysc_34xx_sr, },
3429     { .compatible = "ti,sysc-omap3630-sr", .data = &sysc_36xx_sr, },
3430     { .compatible = "ti,sysc-omap4-sr", .data = &sysc_omap4_sr, },
3431     { .compatible = "ti,sysc-omap3-sham", .data = &sysc_omap3_sham, },
3432     { .compatible = "ti,sysc-omap-aes", .data = &sysc_omap3_aes, },
3433     { .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, },
3434     { .compatible = "ti,sysc-dra7-mcasp", .data = &sysc_dra7_mcasp, },
3435     { .compatible = "ti,sysc-usb-host-fs",
3436       .data = &sysc_omap4_usb_host_fs, },
3437     { .compatible = "ti,sysc-dra7-mcan", .data = &sysc_dra7_mcan, },
3438     { .compatible = "ti,sysc-pruss", .data = &sysc_pruss, },
3439     {  },
3440 };
3441 MODULE_DEVICE_TABLE(of, sysc_match);
3442 
3443 static struct platform_driver sysc_driver = {
3444     .probe      = sysc_probe,
3445     .remove     = sysc_remove,
3446     .driver         = {
3447         .name   = "ti-sysc",
3448         .of_match_table = sysc_match,
3449         .pm = &sysc_pm_ops,
3450     },
3451 };
3452 
3453 static int __init sysc_init(void)
3454 {
3455     bus_register_notifier(&platform_bus_type, &sysc_nb);
3456 
3457     return platform_driver_register(&sysc_driver);
3458 }
3459 module_init(sysc_init);
3460 
3461 static void __exit sysc_exit(void)
3462 {
3463     bus_unregister_notifier(&platform_bus_type, &sysc_nb);
3464     platform_driver_unregister(&sysc_driver);
3465     sysc_cleanup_static_data();
3466 }
3467 module_exit(sysc_exit);
3468 
3469 MODULE_DESCRIPTION("TI sysc interconnect target driver");
3470 MODULE_LICENSE("GPL v2");