0001
0002
0003
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;
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
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
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
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
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);
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);
0283 }
0284 error = -ETIMEDOUT;
0285 }
0286
0287 return error;
0288 }
0289
0290
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
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
0341
0342
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
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
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
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
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
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
0627
0628
0629
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
0641
0642
0643
0644
0645
0646
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
0692 static struct resource early_bus_ranges[] = {
0693
0694 { .start = 0x44c00000, .end = 0x44c00000 + 0x300000, },
0695
0696 { .start = 0x4a000000, .end = 0x4a000000 + 0x300000, },
0697
0698 { .start = 0x4a300000, .end = 0x4a300000 + 0x30000, },
0699
0700 { .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000, },
0701 };
0702
0703 static atomic_t sysc_defer = ATOMIC_INIT(10);
0704
0705
0706
0707
0708
0709
0710
0711
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
0782
0783
0784
0785
0786
0787
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
0812
0813
0814
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
0824
0825
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
0872
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
0910
0911
0912
0913
0914
0915
0916
0917
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
0950
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
0987
0988
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
1021
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
1042
1043
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
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
1071
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
1084
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
1096
1097
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
1107
1108
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
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
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
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
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
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
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
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
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
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
1402
1403
1404
1405
1406
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
1429 error = sysc_check_context(ddata);
1430 if (!error)
1431 return 0;
1432
1433
1434 error = sysc_runtime_suspend(dev);
1435 if (error)
1436 dev_warn(dev, "reinit suspend failed: %i\n", error);
1437 }
1438
1439
1440 error = sysc_runtime_resume(dev);
1441 if (error)
1442 dev_warn(dev, "reinit resume failed: %i\n", error);
1443
1444
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
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
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
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
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
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
1558 SYSC_QUIRK("aess", 0, 0, 0x10, -ENODEV, 0x40000000, 0xffffffff,
1559 SYSC_MODULE_QUIRK_AESS),
1560
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
1622 SYSC_QUIRK("pruss", 0, 0x26000, 0x26004, -ENODEV, 0x47000000, 0xff000000,
1623 SYSC_MODULE_QUIRK_PRUSS),
1624
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
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
1708
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
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
1770
1771
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
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
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);
1817 if (digit_en) {
1818 if (framedonetv_irq)
1819 irq_mask |= BIT(24);
1820 else
1821 irq_mask |= BIT(2) | BIT(3);
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
1831 val = sysc_read(ddata, dispc_offset + 0x238);
1832 lcd2_en = val & lcd_en_mask;
1833 if (lcd2_en)
1834 irq_mask |= BIT(22);
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
1843 val = sysc_read(ddata, dispc_offset + 0x848);
1844 lcd3_en = val & lcd_en_mask;
1845 if (lcd3_en)
1846 irq_mask |= BIT(30);
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
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
1862 irq_mask = sysc_quirk_dispc(ddata, dispc_offset, false);
1863 if (!irq_mask)
1864 return;
1865
1866
1867 sysc_write(ddata, dispc_offset + 0x18, irq_mask);
1868
1869
1870 val = sysc_quirk_dispc(ddata, dispc_offset, true);
1871
1872
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
1881 sysc_write(ddata, 0x44, 0);
1882
1883
1884 sysc_write(ddata, 0x48, 0);
1885 }
1886
1887
1888 sysc_write(ddata, 0x40, 0);
1889 }
1890
1891
1892 static void sysc_pre_reset_quirk_hdq1w(struct sysc *ddata)
1893 {
1894 int offset = 0x0c;
1895 u16 val;
1896
1897 val = sysc_read(ddata, offset);
1898 val |= BIT(5);
1899 sysc_write(ddata, offset, val);
1900 }
1901
1902
1903 static void sysc_module_enable_quirk_aess(struct sysc *ddata)
1904 {
1905 int offset = 0x7c;
1906
1907 sysc_write(ddata, offset, 1);
1908 }
1909
1910
1911 static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable)
1912 {
1913 int offset;
1914 u16 val;
1915
1916
1917 if ((ddata->revision & 0xffffff00) == 0x001f0000)
1918 offset = 0x24;
1919 else
1920 offset = 0xa4;
1921
1922
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
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
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
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
1976 static void sysc_module_enable_quirk_otg(struct sysc *ddata)
1977 {
1978 int offset = 0x414;
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;
1986 u32 val = BIT(0);
1987
1988 sysc_write(ddata, offset, val);
1989 }
1990
1991
1992 static void sysc_module_enable_quirk_sgx(struct sysc *ddata)
1993 {
1994 int offset = 0xff08;
1995 u32 val = BIT(31);
1996
1997 sysc_write(ddata, offset, val);
1998 }
1999
2000
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
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
2119
2120
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
2139
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
2183
2184
2185
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
2200
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
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
2310
2311
2312
2313
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
2341
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
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
2539
2540
2541
2542
2543
2544
2545
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:
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
2569
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
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
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
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
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
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
2749
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
2770
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
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
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
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
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
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
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
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
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
3012
3013
3014
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
3024 if (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)
3025 return;
3026
3027
3028
3029
3030
3031 if (pm_runtime_active(ddata->dev))
3032 pm_runtime_put_sync(ddata->dev);
3033 }
3034
3035
3036
3037
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 { }
3053 };
3054
3055
3056
3057
3058
3059 static const struct soc_device_attribute sysc_soc_feat_match[] = {
3060
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
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 { }
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
3095
3096
3097
3098
3099
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
3130
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
3147 if (!sysc_soc->general_purpose) {
3148 switch (sysc_soc->soc) {
3149 case SOC_3430 ... SOC_3630:
3150 sysc_add_disabled(0x48304000);
3151 break;
3152 case SOC_AM3:
3153 sysc_add_disabled(0x48310000);
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
3169
3170
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
3230
3231
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
3243
3244
3245
3246
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 { },
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
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
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
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");