0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
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 #undef DEBUG
0126
0127 #include <linux/kernel.h>
0128 #include <linux/errno.h>
0129 #include <linux/io.h>
0130 #include <linux/clk.h>
0131 #include <linux/clk-provider.h>
0132 #include <linux/delay.h>
0133 #include <linux/err.h>
0134 #include <linux/list.h>
0135 #include <linux/mutex.h>
0136 #include <linux/spinlock.h>
0137 #include <linux/slab.h>
0138 #include <linux/cpu.h>
0139 #include <linux/of.h>
0140 #include <linux/of_address.h>
0141 #include <linux/memblock.h>
0142
0143 #include <linux/platform_data/ti-sysc.h>
0144
0145 #include <dt-bindings/bus/ti-sysc.h>
0146
0147 #include <asm/system_misc.h>
0148
0149 #include "clock.h"
0150 #include "omap_hwmod.h"
0151
0152 #include "soc.h"
0153 #include "common.h"
0154 #include "clockdomain.h"
0155 #include "hdq1w.h"
0156 #include "mmc.h"
0157 #include "powerdomain.h"
0158 #include "cm2xxx.h"
0159 #include "cm3xxx.h"
0160 #include "cm33xx.h"
0161 #include "prm.h"
0162 #include "prm3xxx.h"
0163 #include "prm44xx.h"
0164 #include "prm33xx.h"
0165 #include "prminst44xx.h"
0166 #include "pm.h"
0167 #include "wd_timer.h"
0168
0169
0170 #define MPU_INITIATOR_NAME "mpu"
0171
0172
0173
0174
0175
0176 #define LINKS_PER_OCP_IF 2
0177
0178
0179
0180
0181
0182 #define OMAP4_RST_CTRL_ST_OFFSET 4
0183
0184
0185
0186
0187 #define MOD_CLK_MAX_NAME_LEN 32
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 struct clkctrl_provider {
0198 int num_addrs;
0199 u32 *addr;
0200 u32 *size;
0201 struct device_node *node;
0202 struct list_head link;
0203 };
0204
0205 static LIST_HEAD(clkctrl_providers);
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 struct omap_hwmod_reset {
0216 const char *match;
0217 int len;
0218 int (*reset)(struct omap_hwmod *oh);
0219 };
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230 struct omap_hwmod_soc_ops {
0231 void (*enable_module)(struct omap_hwmod *oh);
0232 int (*disable_module)(struct omap_hwmod *oh);
0233 int (*wait_target_ready)(struct omap_hwmod *oh);
0234 int (*assert_hardreset)(struct omap_hwmod *oh,
0235 struct omap_hwmod_rst_info *ohri);
0236 int (*deassert_hardreset)(struct omap_hwmod *oh,
0237 struct omap_hwmod_rst_info *ohri);
0238 int (*is_hardreset_asserted)(struct omap_hwmod *oh,
0239 struct omap_hwmod_rst_info *ohri);
0240 int (*init_clkdm)(struct omap_hwmod *oh);
0241 void (*update_context_lost)(struct omap_hwmod *oh);
0242 int (*get_context_lost)(struct omap_hwmod *oh);
0243 int (*disable_direct_prcm)(struct omap_hwmod *oh);
0244 u32 (*xlate_clkctrl)(struct omap_hwmod *oh);
0245 };
0246
0247
0248 static struct omap_hwmod_soc_ops soc_ops;
0249
0250
0251 static LIST_HEAD(omap_hwmod_list);
0252 static DEFINE_MUTEX(list_lock);
0253
0254
0255 static struct omap_hwmod *mpu_oh;
0256
0257
0258 static bool inited;
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270 static int _update_sysc_cache(struct omap_hwmod *oh)
0271 {
0272 if (!oh->class->sysc) {
0273 WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
0274 return -EINVAL;
0275 }
0276
0277
0278
0279 oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
0280
0281 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
0282 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
0283
0284 return 0;
0285 }
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295 static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
0296 {
0297 if (!oh->class->sysc) {
0298 WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
0299 return;
0300 }
0301
0302
0303
0304
0305 oh->_sysc_cache = v;
0306
0307
0308
0309
0310
0311
0312
0313 if (oh->class->unlock)
0314 oh->class->unlock(oh);
0315
0316 omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs);
0317
0318 if (oh->class->lock)
0319 oh->class->lock(oh);
0320 }
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332 static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode,
0333 u32 *v)
0334 {
0335 u32 mstandby_mask;
0336 u8 mstandby_shift;
0337
0338 if (!oh->class->sysc ||
0339 !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE))
0340 return -EINVAL;
0341
0342 if (!oh->class->sysc->sysc_fields) {
0343 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0344 return -EINVAL;
0345 }
0346
0347 mstandby_shift = oh->class->sysc->sysc_fields->midle_shift;
0348 mstandby_mask = (0x3 << mstandby_shift);
0349
0350 *v &= ~mstandby_mask;
0351 *v |= __ffs(standbymode) << mstandby_shift;
0352
0353 return 0;
0354 }
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366 static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v)
0367 {
0368 u32 sidle_mask;
0369 u8 sidle_shift;
0370
0371 if (!oh->class->sysc ||
0372 !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE))
0373 return -EINVAL;
0374
0375 if (!oh->class->sysc->sysc_fields) {
0376 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0377 return -EINVAL;
0378 }
0379
0380 sidle_shift = oh->class->sysc->sysc_fields->sidle_shift;
0381 sidle_mask = (0x3 << sidle_shift);
0382
0383 *v &= ~sidle_mask;
0384 *v |= __ffs(idlemode) << sidle_shift;
0385
0386 return 0;
0387 }
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400 static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
0401 {
0402 u32 clkact_mask;
0403 u8 clkact_shift;
0404
0405 if (!oh->class->sysc ||
0406 !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
0407 return -EINVAL;
0408
0409 if (!oh->class->sysc->sysc_fields) {
0410 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0411 return -EINVAL;
0412 }
0413
0414 clkact_shift = oh->class->sysc->sysc_fields->clkact_shift;
0415 clkact_mask = (0x3 << clkact_shift);
0416
0417 *v &= ~clkact_mask;
0418 *v |= clockact << clkact_shift;
0419
0420 return 0;
0421 }
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431 static int _set_softreset(struct omap_hwmod *oh, u32 *v)
0432 {
0433 u32 softrst_mask;
0434
0435 if (!oh->class->sysc ||
0436 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
0437 return -EINVAL;
0438
0439 if (!oh->class->sysc->sysc_fields) {
0440 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0441 return -EINVAL;
0442 }
0443
0444 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
0445
0446 *v |= softrst_mask;
0447
0448 return 0;
0449 }
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459 static int _clear_softreset(struct omap_hwmod *oh, u32 *v)
0460 {
0461 u32 softrst_mask;
0462
0463 if (!oh->class->sysc ||
0464 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
0465 return -EINVAL;
0466
0467 if (!oh->class->sysc->sysc_fields) {
0468 WARN(1,
0469 "omap_hwmod: %s: sysc_fields absent for sysconfig class\n",
0470 oh->name);
0471 return -EINVAL;
0472 }
0473
0474 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
0475
0476 *v &= ~softrst_mask;
0477
0478 return 0;
0479 }
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491 static int _wait_softreset_complete(struct omap_hwmod *oh)
0492 {
0493 struct omap_hwmod_class_sysconfig *sysc;
0494 u32 softrst_mask;
0495 int c = 0;
0496
0497 sysc = oh->class->sysc;
0498
0499 if (sysc->sysc_flags & SYSS_HAS_RESET_STATUS && sysc->syss_offs > 0)
0500 omap_test_timeout((omap_hwmod_read(oh, sysc->syss_offs)
0501 & SYSS_RESETDONE_MASK),
0502 MAX_MODULE_SOFTRESET_WAIT, c);
0503 else if (sysc->sysc_flags & SYSC_HAS_RESET_STATUS) {
0504 softrst_mask = (0x1 << sysc->sysc_fields->srst_shift);
0505 omap_test_timeout(!(omap_hwmod_read(oh, sysc->sysc_offs)
0506 & softrst_mask),
0507 MAX_MODULE_SOFTRESET_WAIT, c);
0508 }
0509
0510 return c;
0511 }
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525 static int _set_dmadisable(struct omap_hwmod *oh)
0526 {
0527 u32 v;
0528 u32 dmadisable_mask;
0529
0530 if (!oh->class->sysc ||
0531 !(oh->class->sysc->sysc_flags & SYSC_HAS_DMADISABLE))
0532 return -EINVAL;
0533
0534 if (!oh->class->sysc->sysc_fields) {
0535 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0536 return -EINVAL;
0537 }
0538
0539
0540 if (oh->_state != _HWMOD_STATE_ENABLED) {
0541 pr_warn("omap_hwmod: %s: dma can be disabled only from enabled state\n", oh->name);
0542 return -EINVAL;
0543 }
0544
0545 pr_debug("omap_hwmod: %s: setting DMADISABLE\n", oh->name);
0546
0547 v = oh->_sysc_cache;
0548 dmadisable_mask =
0549 (0x1 << oh->class->sysc->sysc_fields->dmadisable_shift);
0550 v |= dmadisable_mask;
0551 _write_sysconfig(v, oh);
0552
0553 return 0;
0554 }
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569 static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
0570 u32 *v)
0571 {
0572 u32 autoidle_mask;
0573 u8 autoidle_shift;
0574
0575 if (!oh->class->sysc ||
0576 !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE))
0577 return -EINVAL;
0578
0579 if (!oh->class->sysc->sysc_fields) {
0580 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0581 return -EINVAL;
0582 }
0583
0584 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift;
0585 autoidle_mask = (0x1 << autoidle_shift);
0586
0587 *v &= ~autoidle_mask;
0588 *v |= autoidle << autoidle_shift;
0589
0590 return 0;
0591 }
0592
0593
0594
0595
0596
0597
0598
0599
0600 static int _enable_wakeup(struct omap_hwmod *oh, u32 *v)
0601 {
0602 if (!oh->class->sysc ||
0603 !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
0604 (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
0605 (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
0606 return -EINVAL;
0607
0608 if (!oh->class->sysc->sysc_fields) {
0609 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
0610 return -EINVAL;
0611 }
0612
0613 if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
0614 *v |= 0x1 << oh->class->sysc->sysc_fields->enwkup_shift;
0615
0616 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
0617 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
0618 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
0619 _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
0620
0621
0622
0623 return 0;
0624 }
0625
0626 static struct clockdomain *_get_clkdm(struct omap_hwmod *oh)
0627 {
0628 struct clk_hw_omap *clk;
0629
0630 if (!oh)
0631 return NULL;
0632
0633 if (oh->clkdm) {
0634 return oh->clkdm;
0635 } else if (oh->_clk) {
0636 if (!omap2_clk_is_hw_omap(__clk_get_hw(oh->_clk)))
0637 return NULL;
0638 clk = to_clk_hw_omap(__clk_get_hw(oh->_clk));
0639 return clk->clkdm;
0640 }
0641 return NULL;
0642 }
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657 static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
0658 {
0659 struct clockdomain *clkdm, *init_clkdm;
0660
0661 clkdm = _get_clkdm(oh);
0662 init_clkdm = _get_clkdm(init_oh);
0663
0664 if (!clkdm || !init_clkdm)
0665 return -EINVAL;
0666
0667 if (clkdm && clkdm->flags & CLKDM_NO_AUTODEPS)
0668 return 0;
0669
0670 return clkdm_add_sleepdep(clkdm, init_clkdm);
0671 }
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686 static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
0687 {
0688 struct clockdomain *clkdm, *init_clkdm;
0689
0690 clkdm = _get_clkdm(oh);
0691 init_clkdm = _get_clkdm(init_oh);
0692
0693 if (!clkdm || !init_clkdm)
0694 return -EINVAL;
0695
0696 if (clkdm && clkdm->flags & CLKDM_NO_AUTODEPS)
0697 return 0;
0698
0699 return clkdm_del_sleepdep(clkdm, init_clkdm);
0700 }
0701
0702 static const struct of_device_id ti_clkctrl_match_table[] __initconst = {
0703 { .compatible = "ti,clkctrl" },
0704 { }
0705 };
0706
0707 static int __init _setup_clkctrl_provider(struct device_node *np)
0708 {
0709 const __be32 *addrp;
0710 struct clkctrl_provider *provider;
0711 u64 size;
0712 int i;
0713
0714 provider = memblock_alloc(sizeof(*provider), SMP_CACHE_BYTES);
0715 if (!provider)
0716 return -ENOMEM;
0717
0718 provider->node = np;
0719
0720 provider->num_addrs =
0721 of_property_count_elems_of_size(np, "reg", sizeof(u32)) / 2;
0722
0723 provider->addr =
0724 memblock_alloc(sizeof(void *) * provider->num_addrs,
0725 SMP_CACHE_BYTES);
0726 if (!provider->addr)
0727 return -ENOMEM;
0728
0729 provider->size =
0730 memblock_alloc(sizeof(u32) * provider->num_addrs,
0731 SMP_CACHE_BYTES);
0732 if (!provider->size)
0733 return -ENOMEM;
0734
0735 for (i = 0; i < provider->num_addrs; i++) {
0736 addrp = of_get_address(np, i, &size, NULL);
0737 provider->addr[i] = (u32)of_translate_address(np, addrp);
0738 provider->size[i] = size;
0739 pr_debug("%s: %pOF: %x...%x\n", __func__, np, provider->addr[i],
0740 provider->addr[i] + provider->size[i]);
0741 }
0742
0743 list_add(&provider->link, &clkctrl_providers);
0744
0745 return 0;
0746 }
0747
0748 static int __init _init_clkctrl_providers(void)
0749 {
0750 struct device_node *np;
0751 int ret = 0;
0752
0753 for_each_matching_node(np, ti_clkctrl_match_table) {
0754 ret = _setup_clkctrl_provider(np);
0755 if (ret) {
0756 of_node_put(np);
0757 break;
0758 }
0759 }
0760
0761 return ret;
0762 }
0763
0764 static u32 _omap4_xlate_clkctrl(struct omap_hwmod *oh)
0765 {
0766 if (!oh->prcm.omap4.modulemode)
0767 return 0;
0768
0769 return omap_cm_xlate_clkctrl(oh->clkdm->prcm_partition,
0770 oh->clkdm->cm_inst,
0771 oh->prcm.omap4.clkctrl_offs);
0772 }
0773
0774 static struct clk *_lookup_clkctrl_clk(struct omap_hwmod *oh)
0775 {
0776 struct clkctrl_provider *provider;
0777 struct clk *clk;
0778 u32 addr;
0779
0780 if (!soc_ops.xlate_clkctrl)
0781 return NULL;
0782
0783 addr = soc_ops.xlate_clkctrl(oh);
0784 if (!addr)
0785 return NULL;
0786
0787 pr_debug("%s: %s: addr=%x\n", __func__, oh->name, addr);
0788
0789 list_for_each_entry(provider, &clkctrl_providers, link) {
0790 int i;
0791
0792 for (i = 0; i < provider->num_addrs; i++) {
0793 if (provider->addr[i] <= addr &&
0794 provider->addr[i] + provider->size[i] > addr) {
0795 struct of_phandle_args clkspec;
0796
0797 clkspec.np = provider->node;
0798 clkspec.args_count = 2;
0799 clkspec.args[0] = addr - provider->addr[0];
0800 clkspec.args[1] = 0;
0801
0802 clk = of_clk_get_from_provider(&clkspec);
0803
0804 pr_debug("%s: %s got %p (offset=%x, provider=%pOF)\n",
0805 __func__, oh->name, clk,
0806 clkspec.args[0], provider->node);
0807
0808 return clk;
0809 }
0810 }
0811 }
0812
0813 return NULL;
0814 }
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824 static int _init_main_clk(struct omap_hwmod *oh)
0825 {
0826 int ret = 0;
0827 struct clk *clk = NULL;
0828
0829 clk = _lookup_clkctrl_clk(oh);
0830
0831 if (!IS_ERR_OR_NULL(clk)) {
0832 pr_debug("%s: mapped main_clk %s for %s\n", __func__,
0833 __clk_get_name(clk), oh->name);
0834 oh->main_clk = __clk_get_name(clk);
0835 oh->_clk = clk;
0836 soc_ops.disable_direct_prcm(oh);
0837 } else {
0838 if (!oh->main_clk)
0839 return 0;
0840
0841 oh->_clk = clk_get(NULL, oh->main_clk);
0842 }
0843
0844 if (IS_ERR(oh->_clk)) {
0845 pr_warn("omap_hwmod: %s: cannot clk_get main_clk %s\n",
0846 oh->name, oh->main_clk);
0847 return -EINVAL;
0848 }
0849
0850
0851
0852
0853
0854
0855
0856
0857 clk_prepare(oh->_clk);
0858
0859 if (!_get_clkdm(oh))
0860 pr_debug("omap_hwmod: %s: missing clockdomain for %s.\n",
0861 oh->name, oh->main_clk);
0862
0863 return ret;
0864 }
0865
0866
0867
0868
0869
0870
0871
0872
0873 static int _init_interface_clks(struct omap_hwmod *oh)
0874 {
0875 struct omap_hwmod_ocp_if *os;
0876 struct clk *c;
0877 int ret = 0;
0878
0879 list_for_each_entry(os, &oh->slave_ports, node) {
0880 if (!os->clk)
0881 continue;
0882
0883 c = clk_get(NULL, os->clk);
0884 if (IS_ERR(c)) {
0885 pr_warn("omap_hwmod: %s: cannot clk_get interface_clk %s\n",
0886 oh->name, os->clk);
0887 ret = -EINVAL;
0888 continue;
0889 }
0890 os->_clk = c;
0891
0892
0893
0894
0895
0896
0897
0898
0899 clk_prepare(os->_clk);
0900 }
0901
0902 return ret;
0903 }
0904
0905
0906
0907
0908
0909
0910
0911
0912 static int _init_opt_clks(struct omap_hwmod *oh)
0913 {
0914 struct omap_hwmod_opt_clk *oc;
0915 struct clk *c;
0916 int i;
0917 int ret = 0;
0918
0919 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
0920 c = clk_get(NULL, oc->clk);
0921 if (IS_ERR(c)) {
0922 pr_warn("omap_hwmod: %s: cannot clk_get opt_clk %s\n",
0923 oh->name, oc->clk);
0924 ret = -EINVAL;
0925 continue;
0926 }
0927 oc->_clk = c;
0928
0929
0930
0931
0932
0933
0934
0935
0936 clk_prepare(oc->_clk);
0937 }
0938
0939 return ret;
0940 }
0941
0942 static void _enable_optional_clocks(struct omap_hwmod *oh)
0943 {
0944 struct omap_hwmod_opt_clk *oc;
0945 int i;
0946
0947 pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name);
0948
0949 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
0950 if (oc->_clk) {
0951 pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
0952 __clk_get_name(oc->_clk));
0953 clk_enable(oc->_clk);
0954 }
0955 }
0956
0957 static void _disable_optional_clocks(struct omap_hwmod *oh)
0958 {
0959 struct omap_hwmod_opt_clk *oc;
0960 int i;
0961
0962 pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name);
0963
0964 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
0965 if (oc->_clk) {
0966 pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
0967 __clk_get_name(oc->_clk));
0968 clk_disable(oc->_clk);
0969 }
0970 }
0971
0972
0973
0974
0975
0976
0977
0978
0979 static int _enable_clocks(struct omap_hwmod *oh)
0980 {
0981 struct omap_hwmod_ocp_if *os;
0982
0983 pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name);
0984
0985 if (oh->flags & HWMOD_OPT_CLKS_NEEDED)
0986 _enable_optional_clocks(oh);
0987
0988 if (oh->_clk)
0989 clk_enable(oh->_clk);
0990
0991 list_for_each_entry(os, &oh->slave_ports, node) {
0992 if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE)) {
0993 omap2_clk_deny_idle(os->_clk);
0994 clk_enable(os->_clk);
0995 }
0996 }
0997
0998
0999
1000 return 0;
1001 }
1002
1003
1004
1005
1006
1007 static bool _omap4_clkctrl_managed_by_clkfwk(struct omap_hwmod *oh)
1008 {
1009 if (oh->prcm.omap4.flags & HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK)
1010 return true;
1011
1012 return false;
1013 }
1014
1015
1016
1017
1018
1019 static bool _omap4_has_clkctrl_clock(struct omap_hwmod *oh)
1020 {
1021 if (oh->prcm.omap4.clkctrl_offs)
1022 return true;
1023
1024 if (!oh->prcm.omap4.clkctrl_offs &&
1025 oh->prcm.omap4.flags & HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET)
1026 return true;
1027
1028 return false;
1029 }
1030
1031
1032
1033
1034
1035
1036
1037 static int _disable_clocks(struct omap_hwmod *oh)
1038 {
1039 struct omap_hwmod_ocp_if *os;
1040
1041 pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name);
1042
1043 if (oh->_clk)
1044 clk_disable(oh->_clk);
1045
1046 list_for_each_entry(os, &oh->slave_ports, node) {
1047 if (os->_clk && (os->flags & OCPIF_SWSUP_IDLE)) {
1048 clk_disable(os->_clk);
1049 omap2_clk_allow_idle(os->_clk);
1050 }
1051 }
1052
1053 if (oh->flags & HWMOD_OPT_CLKS_NEEDED)
1054 _disable_optional_clocks(oh);
1055
1056
1057
1058 return 0;
1059 }
1060
1061
1062
1063
1064
1065
1066
1067
1068 static void _omap4_enable_module(struct omap_hwmod *oh)
1069 {
1070 if (!oh->clkdm || !oh->prcm.omap4.modulemode ||
1071 _omap4_clkctrl_managed_by_clkfwk(oh))
1072 return;
1073
1074 pr_debug("omap_hwmod: %s: %s: %d\n",
1075 oh->name, __func__, oh->prcm.omap4.modulemode);
1076
1077 omap_cm_module_enable(oh->prcm.omap4.modulemode,
1078 oh->clkdm->prcm_partition,
1079 oh->clkdm->cm_inst, oh->prcm.omap4.clkctrl_offs);
1080 }
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091 static int _omap4_wait_target_disable(struct omap_hwmod *oh)
1092 {
1093 if (!oh)
1094 return -EINVAL;
1095
1096 if (oh->_int_flags & _HWMOD_NO_MPU_PORT || !oh->clkdm)
1097 return 0;
1098
1099 if (oh->flags & HWMOD_NO_IDLEST)
1100 return 0;
1101
1102 if (_omap4_clkctrl_managed_by_clkfwk(oh))
1103 return 0;
1104
1105 if (!_omap4_has_clkctrl_clock(oh))
1106 return 0;
1107
1108 return omap_cm_wait_module_idle(oh->clkdm->prcm_partition,
1109 oh->clkdm->cm_inst,
1110 oh->prcm.omap4.clkctrl_offs, 0);
1111 }
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122 static void __init _save_mpu_port_index(struct omap_hwmod *oh)
1123 {
1124 struct omap_hwmod_ocp_if *os = NULL;
1125
1126 if (!oh)
1127 return;
1128
1129 oh->_int_flags |= _HWMOD_NO_MPU_PORT;
1130
1131 list_for_each_entry(os, &oh->slave_ports, node) {
1132 if (os->user & OCP_USER_MPU) {
1133 oh->_mpu_port = os;
1134 oh->_int_flags &= ~_HWMOD_NO_MPU_PORT;
1135 break;
1136 }
1137 }
1138
1139 return;
1140 }
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155 static struct omap_hwmod_ocp_if *_find_mpu_rt_port(struct omap_hwmod *oh)
1156 {
1157 if (!oh || oh->_int_flags & _HWMOD_NO_MPU_PORT || oh->slaves_cnt == 0)
1158 return NULL;
1159
1160 return oh->_mpu_port;
1161 };
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174 static void _enable_sysc(struct omap_hwmod *oh)
1175 {
1176 u8 idlemode, sf;
1177 u32 v;
1178 bool clkdm_act;
1179 struct clockdomain *clkdm;
1180
1181 if (!oh->class->sysc)
1182 return;
1183
1184
1185
1186
1187
1188
1189
1190 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1191 _enable_optional_clocks(oh);
1192 _wait_softreset_complete(oh);
1193 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1194 _disable_optional_clocks(oh);
1195
1196 v = oh->_sysc_cache;
1197 sf = oh->class->sysc->sysc_flags;
1198
1199 clkdm = _get_clkdm(oh);
1200 if (sf & SYSC_HAS_SIDLEMODE) {
1201 if (oh->flags & HWMOD_SWSUP_SIDLE ||
1202 oh->flags & HWMOD_SWSUP_SIDLE_ACT) {
1203 idlemode = HWMOD_IDLEMODE_NO;
1204 } else {
1205 if (sf & SYSC_HAS_ENAWAKEUP)
1206 _enable_wakeup(oh, &v);
1207 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
1208 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1209 else
1210 idlemode = HWMOD_IDLEMODE_SMART;
1211 }
1212
1213
1214
1215
1216
1217 clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);
1218 if (clkdm_act && !(oh->class->sysc->idlemodes &
1219 (SIDLE_SMART | SIDLE_SMART_WKUP)))
1220 idlemode = HWMOD_IDLEMODE_FORCE;
1221
1222 _set_slave_idlemode(oh, idlemode, &v);
1223 }
1224
1225 if (sf & SYSC_HAS_MIDLEMODE) {
1226 if (oh->flags & HWMOD_FORCE_MSTANDBY) {
1227 idlemode = HWMOD_IDLEMODE_FORCE;
1228 } else if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
1229 idlemode = HWMOD_IDLEMODE_NO;
1230 } else {
1231 if (sf & SYSC_HAS_ENAWAKEUP)
1232 _enable_wakeup(oh, &v);
1233 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1234 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1235 else
1236 idlemode = HWMOD_IDLEMODE_SMART;
1237 }
1238 _set_master_standbymode(oh, idlemode, &v);
1239 }
1240
1241
1242
1243
1244
1245
1246 if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) &&
1247 (sf & SYSC_HAS_CLOCKACTIVITY))
1248 _set_clockactivity(oh, CLOCKACT_TEST_ICLK, &v);
1249
1250 _write_sysconfig(v, oh);
1251
1252
1253
1254
1255
1256 if (sf & SYSC_HAS_AUTOIDLE) {
1257 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
1258 0 : 1;
1259 _set_module_autoidle(oh, idlemode, &v);
1260 _write_sysconfig(v, oh);
1261 }
1262 }
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273 static void _idle_sysc(struct omap_hwmod *oh)
1274 {
1275 u8 idlemode, sf;
1276 u32 v;
1277
1278 if (!oh->class->sysc)
1279 return;
1280
1281 v = oh->_sysc_cache;
1282 sf = oh->class->sysc->sysc_flags;
1283
1284 if (sf & SYSC_HAS_SIDLEMODE) {
1285 if (oh->flags & HWMOD_SWSUP_SIDLE) {
1286 idlemode = HWMOD_IDLEMODE_FORCE;
1287 } else {
1288 if (sf & SYSC_HAS_ENAWAKEUP)
1289 _enable_wakeup(oh, &v);
1290 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
1291 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1292 else
1293 idlemode = HWMOD_IDLEMODE_SMART;
1294 }
1295 _set_slave_idlemode(oh, idlemode, &v);
1296 }
1297
1298 if (sf & SYSC_HAS_MIDLEMODE) {
1299 if ((oh->flags & HWMOD_SWSUP_MSTANDBY) ||
1300 (oh->flags & HWMOD_FORCE_MSTANDBY)) {
1301 idlemode = HWMOD_IDLEMODE_FORCE;
1302 } else {
1303 if (sf & SYSC_HAS_ENAWAKEUP)
1304 _enable_wakeup(oh, &v);
1305 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
1306 idlemode = HWMOD_IDLEMODE_SMART_WKUP;
1307 else
1308 idlemode = HWMOD_IDLEMODE_SMART;
1309 }
1310 _set_master_standbymode(oh, idlemode, &v);
1311 }
1312
1313
1314 if (oh->_sysc_cache != v)
1315 _write_sysconfig(v, oh);
1316 }
1317
1318
1319
1320
1321
1322
1323
1324
1325 static void _shutdown_sysc(struct omap_hwmod *oh)
1326 {
1327 u32 v;
1328 u8 sf;
1329
1330 if (!oh->class->sysc)
1331 return;
1332
1333 v = oh->_sysc_cache;
1334 sf = oh->class->sysc->sysc_flags;
1335
1336 if (sf & SYSC_HAS_SIDLEMODE)
1337 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v);
1338
1339 if (sf & SYSC_HAS_MIDLEMODE)
1340 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v);
1341
1342 if (sf & SYSC_HAS_AUTOIDLE)
1343 _set_module_autoidle(oh, 1, &v);
1344
1345 _write_sysconfig(v, oh);
1346 }
1347
1348
1349
1350
1351
1352
1353
1354 static struct omap_hwmod *_lookup(const char *name)
1355 {
1356 struct omap_hwmod *oh, *temp_oh;
1357
1358 oh = NULL;
1359
1360 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1361 if (!strcmp(name, temp_oh->name)) {
1362 oh = temp_oh;
1363 break;
1364 }
1365 }
1366
1367 return oh;
1368 }
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378 static int _init_clkdm(struct omap_hwmod *oh)
1379 {
1380 if (!oh->clkdm_name) {
1381 pr_debug("omap_hwmod: %s: missing clockdomain\n", oh->name);
1382 return 0;
1383 }
1384
1385 oh->clkdm = clkdm_lookup(oh->clkdm_name);
1386 if (!oh->clkdm) {
1387 pr_warn("omap_hwmod: %s: could not associate to clkdm %s\n",
1388 oh->name, oh->clkdm_name);
1389 return 0;
1390 }
1391
1392 pr_debug("omap_hwmod: %s: associated to clkdm %s\n",
1393 oh->name, oh->clkdm_name);
1394
1395 return 0;
1396 }
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408 static int _init_clocks(struct omap_hwmod *oh, struct device_node *np)
1409 {
1410 int ret = 0;
1411
1412 if (oh->_state != _HWMOD_STATE_REGISTERED)
1413 return 0;
1414
1415 pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name);
1416
1417 if (soc_ops.init_clkdm)
1418 ret |= soc_ops.init_clkdm(oh);
1419
1420 ret |= _init_main_clk(oh);
1421 ret |= _init_interface_clks(oh);
1422 ret |= _init_opt_clks(oh);
1423
1424 if (!ret)
1425 oh->_state = _HWMOD_STATE_CLKS_INITED;
1426 else
1427 pr_warn("omap_hwmod: %s: cannot _init_clocks\n", oh->name);
1428
1429 return ret;
1430 }
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441 static int _lookup_hardreset(struct omap_hwmod *oh, const char *name,
1442 struct omap_hwmod_rst_info *ohri)
1443 {
1444 int i;
1445
1446 for (i = 0; i < oh->rst_lines_cnt; i++) {
1447 const char *rst_line = oh->rst_lines[i].name;
1448 if (!strcmp(rst_line, name)) {
1449 ohri->rst_shift = oh->rst_lines[i].rst_shift;
1450 ohri->st_shift = oh->rst_lines[i].st_shift;
1451 pr_debug("omap_hwmod: %s: %s: %s: rst %d st %d\n",
1452 oh->name, __func__, rst_line, ohri->rst_shift,
1453 ohri->st_shift);
1454
1455 return 0;
1456 }
1457 }
1458
1459 return -ENOENT;
1460 }
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475 static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
1476 {
1477 struct omap_hwmod_rst_info ohri;
1478 int ret = -EINVAL;
1479
1480 if (!oh)
1481 return -EINVAL;
1482
1483 if (!soc_ops.assert_hardreset)
1484 return -ENOSYS;
1485
1486 ret = _lookup_hardreset(oh, name, &ohri);
1487 if (ret < 0)
1488 return ret;
1489
1490 ret = soc_ops.assert_hardreset(oh, &ohri);
1491
1492 return ret;
1493 }
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508 static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
1509 {
1510 struct omap_hwmod_rst_info ohri;
1511 int ret = -EINVAL;
1512
1513 if (!oh)
1514 return -EINVAL;
1515
1516 if (!soc_ops.deassert_hardreset)
1517 return -ENOSYS;
1518
1519 ret = _lookup_hardreset(oh, name, &ohri);
1520 if (ret < 0)
1521 return ret;
1522
1523 if (oh->clkdm) {
1524
1525
1526
1527
1528
1529 clkdm_deny_idle(oh->clkdm);
1530 ret = clkdm_hwmod_enable(oh->clkdm, oh);
1531 if (ret) {
1532 WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n",
1533 oh->name, oh->clkdm->name, ret);
1534 return ret;
1535 }
1536 }
1537
1538 _enable_clocks(oh);
1539 if (soc_ops.enable_module)
1540 soc_ops.enable_module(oh);
1541
1542 ret = soc_ops.deassert_hardreset(oh, &ohri);
1543
1544 if (soc_ops.disable_module)
1545 soc_ops.disable_module(oh);
1546 _disable_clocks(oh);
1547
1548 if (ret == -EBUSY)
1549 pr_warn("omap_hwmod: %s: failed to hardreset\n", oh->name);
1550
1551 if (oh->clkdm) {
1552
1553
1554
1555
1556 clkdm_allow_idle(oh->clkdm);
1557
1558 clkdm_hwmod_disable(oh->clkdm, oh);
1559 }
1560
1561 return ret;
1562 }
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576 static int _read_hardreset(struct omap_hwmod *oh, const char *name)
1577 {
1578 struct omap_hwmod_rst_info ohri;
1579 int ret = -EINVAL;
1580
1581 if (!oh)
1582 return -EINVAL;
1583
1584 if (!soc_ops.is_hardreset_asserted)
1585 return -ENOSYS;
1586
1587 ret = _lookup_hardreset(oh, name, &ohri);
1588 if (ret < 0)
1589 return ret;
1590
1591 return soc_ops.is_hardreset_asserted(oh, &ohri);
1592 }
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604 static bool _are_all_hardreset_lines_asserted(struct omap_hwmod *oh)
1605 {
1606 int i, rst_cnt = 0;
1607
1608 if (oh->rst_lines_cnt == 0)
1609 return false;
1610
1611 for (i = 0; i < oh->rst_lines_cnt; i++)
1612 if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
1613 rst_cnt++;
1614
1615 if (oh->rst_lines_cnt == rst_cnt)
1616 return true;
1617
1618 return false;
1619 }
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632 static bool _are_any_hardreset_lines_asserted(struct omap_hwmod *oh)
1633 {
1634 int rst_cnt = 0;
1635 int i;
1636
1637 for (i = 0; i < oh->rst_lines_cnt && rst_cnt == 0; i++)
1638 if (_read_hardreset(oh, oh->rst_lines[i].name) > 0)
1639 rst_cnt++;
1640
1641 return (rst_cnt) ? true : false;
1642 }
1643
1644
1645
1646
1647
1648
1649
1650
1651 static int _omap4_disable_module(struct omap_hwmod *oh)
1652 {
1653 int v;
1654
1655 if (!oh->clkdm || !oh->prcm.omap4.modulemode ||
1656 _omap4_clkctrl_managed_by_clkfwk(oh))
1657 return -EINVAL;
1658
1659
1660
1661
1662
1663 if (_are_any_hardreset_lines_asserted(oh))
1664 return 0;
1665
1666 pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
1667
1668 omap_cm_module_disable(oh->clkdm->prcm_partition, oh->clkdm->cm_inst,
1669 oh->prcm.omap4.clkctrl_offs);
1670
1671 v = _omap4_wait_target_disable(oh);
1672 if (v)
1673 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
1674 oh->name);
1675
1676 return 0;
1677 }
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695 static int _ocp_softreset(struct omap_hwmod *oh)
1696 {
1697 u32 v;
1698 int c = 0;
1699 int ret = 0;
1700
1701 if (!oh->class->sysc ||
1702 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
1703 return -ENOENT;
1704
1705
1706 if (oh->_state != _HWMOD_STATE_ENABLED) {
1707 pr_warn("omap_hwmod: %s: reset can only be entered from enabled state\n",
1708 oh->name);
1709 return -EINVAL;
1710 }
1711
1712
1713 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1714 _enable_optional_clocks(oh);
1715
1716 pr_debug("omap_hwmod: %s: resetting via OCP SOFTRESET\n", oh->name);
1717
1718 v = oh->_sysc_cache;
1719 ret = _set_softreset(oh, &v);
1720 if (ret)
1721 goto dis_opt_clks;
1722
1723 _write_sysconfig(v, oh);
1724
1725 if (oh->class->sysc->srst_udelay)
1726 udelay(oh->class->sysc->srst_udelay);
1727
1728 c = _wait_softreset_complete(oh);
1729 if (c == MAX_MODULE_SOFTRESET_WAIT) {
1730 pr_warn("omap_hwmod: %s: softreset failed (waited %d usec)\n",
1731 oh->name, MAX_MODULE_SOFTRESET_WAIT);
1732 ret = -ETIMEDOUT;
1733 goto dis_opt_clks;
1734 } else {
1735 pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c);
1736 }
1737
1738 ret = _clear_softreset(oh, &v);
1739 if (ret)
1740 goto dis_opt_clks;
1741
1742 _write_sysconfig(v, oh);
1743
1744
1745
1746
1747
1748
1749 dis_opt_clks:
1750 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
1751 _disable_optional_clocks(oh);
1752
1753 return ret;
1754 }
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789 static int _reset(struct omap_hwmod *oh)
1790 {
1791 int i, r;
1792
1793 pr_debug("omap_hwmod: %s: resetting\n", oh->name);
1794
1795 if (oh->class->reset) {
1796 r = oh->class->reset(oh);
1797 } else {
1798 if (oh->rst_lines_cnt > 0) {
1799 for (i = 0; i < oh->rst_lines_cnt; i++)
1800 _assert_hardreset(oh, oh->rst_lines[i].name);
1801 return 0;
1802 } else {
1803 r = _ocp_softreset(oh);
1804 if (r == -ENOENT)
1805 r = 0;
1806 }
1807 }
1808
1809 _set_dmadisable(oh);
1810
1811
1812
1813
1814
1815
1816 if (oh->class->sysc) {
1817 _update_sysc_cache(oh);
1818 _enable_sysc(oh);
1819 }
1820
1821 return r;
1822 }
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833 static void _omap4_update_context_lost(struct omap_hwmod *oh)
1834 {
1835 if (oh->prcm.omap4.flags & HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT)
1836 return;
1837
1838 if (!prm_was_any_context_lost_old(oh->clkdm->pwrdm.ptr->prcm_partition,
1839 oh->clkdm->pwrdm.ptr->prcm_offs,
1840 oh->prcm.omap4.context_offs))
1841 return;
1842
1843 oh->prcm.omap4.context_lost_counter++;
1844 prm_clear_context_loss_flags_old(oh->clkdm->pwrdm.ptr->prcm_partition,
1845 oh->clkdm->pwrdm.ptr->prcm_offs,
1846 oh->prcm.omap4.context_offs);
1847 }
1848
1849
1850
1851
1852
1853
1854
1855 static int _omap4_get_context_lost(struct omap_hwmod *oh)
1856 {
1857 return oh->prcm.omap4.context_lost_counter;
1858 }
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868 static int _enable(struct omap_hwmod *oh)
1869 {
1870 int r;
1871
1872 pr_debug("omap_hwmod: %s: enabling\n", oh->name);
1873
1874
1875
1876
1877
1878 if (oh->_int_flags & _HWMOD_SKIP_ENABLE) {
1879 oh->_int_flags &= ~_HWMOD_SKIP_ENABLE;
1880 return 0;
1881 }
1882
1883 if (oh->_state != _HWMOD_STATE_INITIALIZED &&
1884 oh->_state != _HWMOD_STATE_IDLE &&
1885 oh->_state != _HWMOD_STATE_DISABLED) {
1886 WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n",
1887 oh->name);
1888 return -EINVAL;
1889 }
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900 if (_are_all_hardreset_lines_asserted(oh))
1901 return 0;
1902
1903 _add_initiator_dep(oh, mpu_oh);
1904
1905 if (oh->clkdm) {
1906
1907
1908
1909
1910
1911 clkdm_deny_idle(oh->clkdm);
1912 r = clkdm_hwmod_enable(oh->clkdm, oh);
1913 if (r) {
1914 WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n",
1915 oh->name, oh->clkdm->name, r);
1916 return r;
1917 }
1918 }
1919
1920 _enable_clocks(oh);
1921 if (soc_ops.enable_module)
1922 soc_ops.enable_module(oh);
1923 if (oh->flags & HWMOD_BLOCK_WFI)
1924 cpu_idle_poll_ctrl(true);
1925
1926 if (soc_ops.update_context_lost)
1927 soc_ops.update_context_lost(oh);
1928
1929 r = (soc_ops.wait_target_ready) ? soc_ops.wait_target_ready(oh) :
1930 -EINVAL;
1931 if (oh->clkdm && !(oh->flags & HWMOD_CLKDM_NOAUTO))
1932 clkdm_allow_idle(oh->clkdm);
1933
1934 if (!r) {
1935 oh->_state = _HWMOD_STATE_ENABLED;
1936
1937
1938 if (oh->class->sysc) {
1939 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
1940 _update_sysc_cache(oh);
1941 _enable_sysc(oh);
1942 }
1943 } else {
1944 if (soc_ops.disable_module)
1945 soc_ops.disable_module(oh);
1946 _disable_clocks(oh);
1947 pr_err("omap_hwmod: %s: _wait_target_ready failed: %d\n",
1948 oh->name, r);
1949
1950 if (oh->clkdm)
1951 clkdm_hwmod_disable(oh->clkdm, oh);
1952 }
1953
1954 return r;
1955 }
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965 static int _idle(struct omap_hwmod *oh)
1966 {
1967 if (oh->flags & HWMOD_NO_IDLE) {
1968 oh->_int_flags |= _HWMOD_SKIP_ENABLE;
1969 return 0;
1970 }
1971
1972 pr_debug("omap_hwmod: %s: idling\n", oh->name);
1973
1974 if (_are_all_hardreset_lines_asserted(oh))
1975 return 0;
1976
1977 if (oh->_state != _HWMOD_STATE_ENABLED) {
1978 WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n",
1979 oh->name);
1980 return -EINVAL;
1981 }
1982
1983 if (oh->class->sysc)
1984 _idle_sysc(oh);
1985 _del_initiator_dep(oh, mpu_oh);
1986
1987
1988
1989
1990
1991
1992 if (oh->clkdm && !(oh->flags & HWMOD_CLKDM_NOAUTO))
1993 clkdm_deny_idle(oh->clkdm);
1994
1995 if (oh->flags & HWMOD_BLOCK_WFI)
1996 cpu_idle_poll_ctrl(false);
1997 if (soc_ops.disable_module)
1998 soc_ops.disable_module(oh);
1999
2000
2001
2002
2003
2004
2005
2006 _disable_clocks(oh);
2007 if (oh->clkdm) {
2008 clkdm_allow_idle(oh->clkdm);
2009 clkdm_hwmod_disable(oh->clkdm, oh);
2010 }
2011
2012 oh->_state = _HWMOD_STATE_IDLE;
2013
2014 return 0;
2015 }
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026 static int _shutdown(struct omap_hwmod *oh)
2027 {
2028 int ret, i;
2029 u8 prev_state;
2030
2031 if (_are_all_hardreset_lines_asserted(oh))
2032 return 0;
2033
2034 if (oh->_state != _HWMOD_STATE_IDLE &&
2035 oh->_state != _HWMOD_STATE_ENABLED) {
2036 WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n",
2037 oh->name);
2038 return -EINVAL;
2039 }
2040
2041 pr_debug("omap_hwmod: %s: disabling\n", oh->name);
2042
2043 if (oh->class->pre_shutdown) {
2044 prev_state = oh->_state;
2045 if (oh->_state == _HWMOD_STATE_IDLE)
2046 _enable(oh);
2047 ret = oh->class->pre_shutdown(oh);
2048 if (ret) {
2049 if (prev_state == _HWMOD_STATE_IDLE)
2050 _idle(oh);
2051 return ret;
2052 }
2053 }
2054
2055 if (oh->class->sysc) {
2056 if (oh->_state == _HWMOD_STATE_IDLE)
2057 _enable(oh);
2058 _shutdown_sysc(oh);
2059 }
2060
2061
2062 if (oh->_state == _HWMOD_STATE_ENABLED) {
2063 _del_initiator_dep(oh, mpu_oh);
2064
2065 if (oh->flags & HWMOD_BLOCK_WFI)
2066 cpu_idle_poll_ctrl(false);
2067 if (soc_ops.disable_module)
2068 soc_ops.disable_module(oh);
2069 _disable_clocks(oh);
2070 if (oh->clkdm)
2071 clkdm_hwmod_disable(oh->clkdm, oh);
2072 }
2073
2074
2075 for (i = 0; i < oh->rst_lines_cnt; i++)
2076 _assert_hardreset(oh, oh->rst_lines[i].name);
2077
2078 oh->_state = _HWMOD_STATE_DISABLED;
2079
2080 return 0;
2081 }
2082
2083 static int of_dev_find_hwmod(struct device_node *np,
2084 struct omap_hwmod *oh)
2085 {
2086 int count, i, res;
2087 const char *p;
2088
2089 count = of_property_count_strings(np, "ti,hwmods");
2090 if (count < 1)
2091 return -ENODEV;
2092
2093 for (i = 0; i < count; i++) {
2094 res = of_property_read_string_index(np, "ti,hwmods",
2095 i, &p);
2096 if (res)
2097 continue;
2098 if (!strcmp(p, oh->name)) {
2099 pr_debug("omap_hwmod: dt %pOFn[%i] uses hwmod %s\n",
2100 np, i, oh->name);
2101 return i;
2102 }
2103 }
2104
2105 return -ENODEV;
2106 }
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119 static int of_dev_hwmod_lookup(struct device_node *np,
2120 struct omap_hwmod *oh,
2121 int *index,
2122 struct device_node **found)
2123 {
2124 struct device_node *np0 = NULL;
2125 int res;
2126
2127 res = of_dev_find_hwmod(np, oh);
2128 if (res >= 0) {
2129 *found = np;
2130 *index = res;
2131 return 0;
2132 }
2133
2134 for_each_child_of_node(np, np0) {
2135 struct device_node *fc;
2136 int i;
2137
2138 res = of_dev_hwmod_lookup(np0, oh, &i, &fc);
2139 if (res == 0) {
2140 *found = fc;
2141 *index = i;
2142 of_node_put(np0);
2143 return 0;
2144 }
2145 }
2146
2147 *found = NULL;
2148 *index = 0;
2149
2150 return -ENODEV;
2151 }
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167 static void omap_hwmod_fix_mpu_rt_idx(struct omap_hwmod *oh,
2168 struct device_node *np,
2169 struct resource *res)
2170 {
2171 struct device_node *child = NULL;
2172 int error;
2173
2174 child = of_get_next_child(np, child);
2175 if (!child)
2176 return;
2177
2178 error = of_address_to_resource(child, oh->mpu_rt_idx, res);
2179 if (error)
2180 pr_err("%s: error mapping mpu_rt_idx: %i\n",
2181 __func__, error);
2182 }
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195 int omap_hwmod_parse_module_range(struct omap_hwmod *oh,
2196 struct device_node *np,
2197 struct resource *res)
2198 {
2199 struct property *prop;
2200 const __be32 *ranges;
2201 const char *name;
2202 u32 nr_addr, nr_size;
2203 u64 base, size;
2204 int len, error;
2205
2206 if (!res)
2207 return -EINVAL;
2208
2209 ranges = of_get_property(np, "ranges", &len);
2210 if (!ranges)
2211 return -ENOENT;
2212
2213 len /= sizeof(*ranges);
2214
2215 if (len < 3)
2216 return -EINVAL;
2217
2218 of_property_for_each_string(np, "compatible", prop, name)
2219 if (!strncmp("ti,sysc-", name, 8))
2220 break;
2221
2222 if (!name)
2223 return -ENOENT;
2224
2225 error = of_property_read_u32(np, "#address-cells", &nr_addr);
2226 if (error)
2227 return -ENOENT;
2228
2229 error = of_property_read_u32(np, "#size-cells", &nr_size);
2230 if (error)
2231 return -ENOENT;
2232
2233 if (nr_addr != 1 || nr_size != 1) {
2234 pr_err("%s: invalid range for %s->%pOFn\n", __func__,
2235 oh->name, np);
2236 return -EINVAL;
2237 }
2238
2239 ranges++;
2240 base = of_translate_address(np, ranges++);
2241 size = be32_to_cpup(ranges);
2242
2243 pr_debug("omap_hwmod: %s %pOFn at 0x%llx size 0x%llx\n",
2244 oh->name, np, base, size);
2245
2246 if (oh && oh->mpu_rt_idx) {
2247 omap_hwmod_fix_mpu_rt_idx(oh, np, res);
2248
2249 return 0;
2250 }
2251
2252 res->start = base;
2253 res->end = base + size - 1;
2254 res->flags = IORESOURCE_MEM;
2255
2256 return 0;
2257 }
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276 static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data,
2277 int index, struct device_node *np)
2278 {
2279 void __iomem *va_start = NULL;
2280 struct resource res;
2281 int error;
2282
2283 if (!oh)
2284 return -EINVAL;
2285
2286 _save_mpu_port_index(oh);
2287
2288
2289 if (!oh->class->sysc)
2290 return 0;
2291
2292
2293 if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
2294 return -ENXIO;
2295
2296 if (!np) {
2297 pr_err("omap_hwmod: %s: no dt node\n", oh->name);
2298 return -ENXIO;
2299 }
2300
2301
2302 error = omap_hwmod_parse_module_range(oh, np, &res);
2303 if (!error)
2304 va_start = ioremap(res.start, resource_size(&res));
2305
2306
2307 if (!va_start)
2308 va_start = of_iomap(np, index + oh->mpu_rt_idx);
2309 if (!va_start) {
2310 pr_err("omap_hwmod: %s: Missing dt reg%i for %pOF\n",
2311 oh->name, index, np);
2312 return -ENXIO;
2313 }
2314
2315 pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
2316 oh->name, va_start);
2317
2318 oh->_mpu_rt_va = va_start;
2319 return 0;
2320 }
2321
2322 static void __init parse_module_flags(struct omap_hwmod *oh,
2323 struct device_node *np)
2324 {
2325 if (of_find_property(np, "ti,no-reset-on-init", NULL))
2326 oh->flags |= HWMOD_INIT_NO_RESET;
2327 if (of_find_property(np, "ti,no-idle-on-init", NULL))
2328 oh->flags |= HWMOD_INIT_NO_IDLE;
2329 if (of_find_property(np, "ti,no-idle", NULL))
2330 oh->flags |= HWMOD_NO_IDLE;
2331 }
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346 static int __init _init(struct omap_hwmod *oh, void *data)
2347 {
2348 int r, index;
2349 struct device_node *np = NULL;
2350 struct device_node *bus;
2351
2352 if (oh->_state != _HWMOD_STATE_REGISTERED)
2353 return 0;
2354
2355 bus = of_find_node_by_name(NULL, "ocp");
2356 if (!bus)
2357 return -ENODEV;
2358
2359 r = of_dev_hwmod_lookup(bus, oh, &index, &np);
2360 if (r)
2361 pr_debug("omap_hwmod: %s missing dt data\n", oh->name);
2362 else if (np && index)
2363 pr_warn("omap_hwmod: %s using broken dt data from %pOFn\n",
2364 oh->name, np);
2365
2366 r = _init_mpu_rt_base(oh, NULL, index, np);
2367 if (r < 0) {
2368 WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n",
2369 oh->name);
2370 return 0;
2371 }
2372
2373 r = _init_clocks(oh, np);
2374 if (r < 0) {
2375 WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh->name);
2376 return -EINVAL;
2377 }
2378
2379 if (np) {
2380 struct device_node *child;
2381
2382 parse_module_flags(oh, np);
2383 child = of_get_next_child(np, NULL);
2384 if (child)
2385 parse_module_flags(oh, child);
2386 }
2387
2388 oh->_state = _HWMOD_STATE_INITIALIZED;
2389
2390 return 0;
2391 }
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401 static void _setup_iclk_autoidle(struct omap_hwmod *oh)
2402 {
2403 struct omap_hwmod_ocp_if *os;
2404
2405 if (oh->_state != _HWMOD_STATE_INITIALIZED)
2406 return;
2407
2408 list_for_each_entry(os, &oh->slave_ports, node) {
2409 if (!os->_clk)
2410 continue;
2411
2412 if (os->flags & OCPIF_SWSUP_IDLE) {
2413
2414
2415
2416
2417
2418 } else {
2419
2420 clk_enable(os->_clk);
2421 }
2422 }
2423
2424 return;
2425 }
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436 static int _setup_reset(struct omap_hwmod *oh)
2437 {
2438 int r = 0;
2439
2440 if (oh->_state != _HWMOD_STATE_INITIALIZED)
2441 return -EINVAL;
2442
2443 if (oh->flags & HWMOD_EXT_OPT_MAIN_CLK)
2444 return -EPERM;
2445
2446 if (oh->rst_lines_cnt == 0) {
2447 r = _enable(oh);
2448 if (r) {
2449 pr_warn("omap_hwmod: %s: cannot be enabled for reset (%d)\n",
2450 oh->name, oh->_state);
2451 return -EINVAL;
2452 }
2453 }
2454
2455 if (!(oh->flags & HWMOD_INIT_NO_RESET))
2456 r = _reset(oh);
2457
2458 return r;
2459 }
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497 static void _setup_postsetup(struct omap_hwmod *oh)
2498 {
2499 u8 postsetup_state;
2500
2501 if (oh->rst_lines_cnt > 0)
2502 return;
2503
2504 postsetup_state = oh->_postsetup_state;
2505 if (postsetup_state == _HWMOD_STATE_UNKNOWN)
2506 postsetup_state = _HWMOD_STATE_ENABLED;
2507
2508
2509
2510
2511
2512 if ((oh->flags & (HWMOD_INIT_NO_IDLE | HWMOD_NO_IDLE)) &&
2513 (postsetup_state == _HWMOD_STATE_IDLE)) {
2514 oh->_int_flags |= _HWMOD_SKIP_ENABLE;
2515 postsetup_state = _HWMOD_STATE_ENABLED;
2516 }
2517
2518 if (postsetup_state == _HWMOD_STATE_IDLE)
2519 _idle(oh);
2520 else if (postsetup_state == _HWMOD_STATE_DISABLED)
2521 _shutdown(oh);
2522 else if (postsetup_state != _HWMOD_STATE_ENABLED)
2523 WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
2524 oh->name, postsetup_state);
2525
2526 return;
2527 }
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545 static int _setup(struct omap_hwmod *oh, void *data)
2546 {
2547 if (oh->_state != _HWMOD_STATE_INITIALIZED)
2548 return 0;
2549
2550 if (oh->parent_hwmod) {
2551 int r;
2552
2553 r = _enable(oh->parent_hwmod);
2554 WARN(r, "hwmod: %s: setup: failed to enable parent hwmod %s\n",
2555 oh->name, oh->parent_hwmod->name);
2556 }
2557
2558 _setup_iclk_autoidle(oh);
2559
2560 if (!_setup_reset(oh))
2561 _setup_postsetup(oh);
2562
2563 if (oh->parent_hwmod) {
2564 u8 postsetup_state;
2565
2566 postsetup_state = oh->parent_hwmod->_postsetup_state;
2567
2568 if (postsetup_state == _HWMOD_STATE_IDLE)
2569 _idle(oh->parent_hwmod);
2570 else if (postsetup_state == _HWMOD_STATE_DISABLED)
2571 _shutdown(oh->parent_hwmod);
2572 else if (postsetup_state != _HWMOD_STATE_ENABLED)
2573 WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n",
2574 oh->parent_hwmod->name, postsetup_state);
2575 }
2576
2577 return 0;
2578 }
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597 static int _register(struct omap_hwmod *oh)
2598 {
2599 if (!oh || !oh->name || !oh->class || !oh->class->name ||
2600 (oh->_state != _HWMOD_STATE_UNKNOWN))
2601 return -EINVAL;
2602
2603 pr_debug("omap_hwmod: %s: registering\n", oh->name);
2604
2605 if (_lookup(oh->name))
2606 return -EEXIST;
2607
2608 list_add_tail(&oh->node, &omap_hwmod_list);
2609
2610 INIT_LIST_HEAD(&oh->slave_ports);
2611 spin_lock_init(&oh->_lock);
2612 lockdep_set_class(&oh->_lock, &oh->hwmod_key);
2613
2614 oh->_state = _HWMOD_STATE_REGISTERED;
2615
2616
2617
2618
2619
2620 if (!strcmp(oh->name, MPU_INITIATOR_NAME))
2621 mpu_oh = oh;
2622
2623 return 0;
2624 }
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636 static int _add_link(struct omap_hwmod_ocp_if *oi)
2637 {
2638 pr_debug("omap_hwmod: %s -> %s: adding link\n", oi->master->name,
2639 oi->slave->name);
2640
2641 list_add(&oi->node, &oi->slave->slave_ports);
2642 oi->slave->slaves_cnt++;
2643
2644 return 0;
2645 }
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660 static int __init _register_link(struct omap_hwmod_ocp_if *oi)
2661 {
2662 if (!oi || !oi->master || !oi->slave || !oi->user)
2663 return -EINVAL;
2664
2665 if (oi->_int_flags & _OCPIF_INT_FLAGS_REGISTERED)
2666 return -EEXIST;
2667
2668 pr_debug("omap_hwmod: registering link from %s to %s\n",
2669 oi->master->name, oi->slave->name);
2670
2671
2672
2673
2674
2675 if (oi->master->_state != _HWMOD_STATE_REGISTERED)
2676 _register(oi->master);
2677
2678 if (oi->slave->_state != _HWMOD_STATE_REGISTERED)
2679 _register(oi->slave);
2680
2681 _add_link(oi);
2682
2683 oi->_int_flags |= _OCPIF_INT_FLAGS_REGISTERED;
2684
2685 return 0;
2686 }
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699 static int _omap2xxx_3xxx_wait_target_ready(struct omap_hwmod *oh)
2700 {
2701 if (!oh)
2702 return -EINVAL;
2703
2704 if (oh->flags & HWMOD_NO_IDLEST)
2705 return 0;
2706
2707 if (!_find_mpu_rt_port(oh))
2708 return 0;
2709
2710
2711
2712 return omap_cm_wait_module_ready(0, oh->prcm.omap2.module_offs,
2713 oh->prcm.omap2.idlest_reg_id,
2714 oh->prcm.omap2.idlest_idle_bit);
2715 }
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726 static int _omap4_wait_target_ready(struct omap_hwmod *oh)
2727 {
2728 if (!oh)
2729 return -EINVAL;
2730
2731 if (oh->flags & HWMOD_NO_IDLEST || !oh->clkdm)
2732 return 0;
2733
2734 if (!_find_mpu_rt_port(oh))
2735 return 0;
2736
2737 if (_omap4_clkctrl_managed_by_clkfwk(oh))
2738 return 0;
2739
2740 if (!_omap4_has_clkctrl_clock(oh))
2741 return 0;
2742
2743
2744
2745 return omap_cm_wait_module_ready(oh->clkdm->prcm_partition,
2746 oh->clkdm->cm_inst,
2747 oh->prcm.omap4.clkctrl_offs, 0);
2748 }
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761 static int _omap2_assert_hardreset(struct omap_hwmod *oh,
2762 struct omap_hwmod_rst_info *ohri)
2763 {
2764 return omap_prm_assert_hardreset(ohri->rst_shift, 0,
2765 oh->prcm.omap2.module_offs, 0);
2766 }
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779 static int _omap2_deassert_hardreset(struct omap_hwmod *oh,
2780 struct omap_hwmod_rst_info *ohri)
2781 {
2782 return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift, 0,
2783 oh->prcm.omap2.module_offs, 0, 0);
2784 }
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798 static int _omap2_is_hardreset_asserted(struct omap_hwmod *oh,
2799 struct omap_hwmod_rst_info *ohri)
2800 {
2801 return omap_prm_is_hardreset_asserted(ohri->st_shift, 0,
2802 oh->prcm.omap2.module_offs, 0);
2803 }
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817 static int _omap4_assert_hardreset(struct omap_hwmod *oh,
2818 struct omap_hwmod_rst_info *ohri)
2819 {
2820 if (!oh->clkdm)
2821 return -EINVAL;
2822
2823 return omap_prm_assert_hardreset(ohri->rst_shift,
2824 oh->clkdm->pwrdm.ptr->prcm_partition,
2825 oh->clkdm->pwrdm.ptr->prcm_offs,
2826 oh->prcm.omap4.rstctrl_offs);
2827 }
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841 static int _omap4_deassert_hardreset(struct omap_hwmod *oh,
2842 struct omap_hwmod_rst_info *ohri)
2843 {
2844 if (!oh->clkdm)
2845 return -EINVAL;
2846
2847 if (ohri->st_shift)
2848 pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
2849 oh->name, ohri->name);
2850 return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->rst_shift,
2851 oh->clkdm->pwrdm.ptr->prcm_partition,
2852 oh->clkdm->pwrdm.ptr->prcm_offs,
2853 oh->prcm.omap4.rstctrl_offs,
2854 oh->prcm.omap4.rstctrl_offs +
2855 OMAP4_RST_CTRL_ST_OFFSET);
2856 }
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870 static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh,
2871 struct omap_hwmod_rst_info *ohri)
2872 {
2873 if (!oh->clkdm)
2874 return -EINVAL;
2875
2876 return omap_prm_is_hardreset_asserted(ohri->rst_shift,
2877 oh->clkdm->pwrdm.ptr->
2878 prcm_partition,
2879 oh->clkdm->pwrdm.ptr->prcm_offs,
2880 oh->prcm.omap4.rstctrl_offs);
2881 }
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891 static int _omap4_disable_direct_prcm(struct omap_hwmod *oh)
2892 {
2893 if (!oh)
2894 return -EINVAL;
2895
2896 oh->prcm.omap4.flags |= HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK;
2897
2898 return 0;
2899 }
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913 static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,
2914 struct omap_hwmod_rst_info *ohri)
2915 {
2916 return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift,
2917 oh->clkdm->pwrdm.ptr->prcm_partition,
2918 oh->clkdm->pwrdm.ptr->prcm_offs,
2919 oh->prcm.omap4.rstctrl_offs,
2920 oh->prcm.omap4.rstst_offs);
2921 }
2922
2923
2924
2925 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
2926 {
2927 if (oh->flags & HWMOD_16BIT_REG)
2928 return readw_relaxed(oh->_mpu_rt_va + reg_offs);
2929 else
2930 return readl_relaxed(oh->_mpu_rt_va + reg_offs);
2931 }
2932
2933 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
2934 {
2935 if (oh->flags & HWMOD_16BIT_REG)
2936 writew_relaxed(v, oh->_mpu_rt_va + reg_offs);
2937 else
2938 writel_relaxed(v, oh->_mpu_rt_va + reg_offs);
2939 }
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950 int omap_hwmod_softreset(struct omap_hwmod *oh)
2951 {
2952 u32 v;
2953 int ret;
2954
2955 if (!oh || !(oh->_sysc_cache))
2956 return -EINVAL;
2957
2958 v = oh->_sysc_cache;
2959 ret = _set_softreset(oh, &v);
2960 if (ret)
2961 goto error;
2962 _write_sysconfig(v, oh);
2963
2964 ret = _clear_softreset(oh, &v);
2965 if (ret)
2966 goto error;
2967 _write_sysconfig(v, oh);
2968
2969 error:
2970 return ret;
2971 }
2972
2973
2974
2975
2976
2977
2978
2979
2980 struct omap_hwmod *omap_hwmod_lookup(const char *name)
2981 {
2982 struct omap_hwmod *oh;
2983
2984 if (!name)
2985 return NULL;
2986
2987 oh = _lookup(name);
2988
2989 return oh;
2990 }
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
3005 void *data)
3006 {
3007 struct omap_hwmod *temp_oh;
3008 int ret = 0;
3009
3010 if (!fn)
3011 return -EINVAL;
3012
3013 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
3014 ret = (*fn)(temp_oh, data);
3015 if (ret)
3016 break;
3017 }
3018
3019 return ret;
3020 }
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033 int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois)
3034 {
3035 int r, i;
3036
3037 if (!inited)
3038 return -EINVAL;
3039
3040 if (!ois)
3041 return 0;
3042
3043 if (ois[0] == NULL)
3044 return 0;
3045
3046 i = 0;
3047 do {
3048 r = _register_link(ois[i]);
3049 WARN(r && r != -EEXIST,
3050 "omap_hwmod: _register_link(%s -> %s) returned %d\n",
3051 ois[i]->master->name, ois[i]->slave->name, r);
3052 } while (ois[++i]);
3053
3054 return 0;
3055 }
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067 static void __init _ensure_mpu_hwmod_is_setup(struct omap_hwmod *oh)
3068 {
3069 if (!mpu_oh || mpu_oh->_state == _HWMOD_STATE_UNKNOWN)
3070 pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n",
3071 __func__, MPU_INITIATOR_NAME);
3072 else if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh)
3073 omap_hwmod_setup_one(MPU_INITIATOR_NAME);
3074 }
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087 int __init omap_hwmod_setup_one(const char *oh_name)
3088 {
3089 struct omap_hwmod *oh;
3090
3091 pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__);
3092
3093 oh = _lookup(oh_name);
3094 if (!oh) {
3095 WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name);
3096 return -EINVAL;
3097 }
3098
3099 _ensure_mpu_hwmod_is_setup(oh);
3100
3101 _init(oh, NULL);
3102 _setup(oh, NULL);
3103
3104 return 0;
3105 }
3106
3107 static void omap_hwmod_check_one(struct device *dev,
3108 const char *name, s8 v1, u8 v2)
3109 {
3110 if (v1 < 0)
3111 return;
3112
3113 if (v1 != v2)
3114 dev_warn(dev, "%s %d != %d\n", name, v1, v2);
3115 }
3116
3117
3118
3119
3120
3121
3122
3123 static int omap_hwmod_check_sysc(struct device *dev,
3124 const struct ti_sysc_module_data *data,
3125 struct sysc_regbits *sysc_fields)
3126 {
3127 const struct sysc_regbits *regbits = data->cap->regbits;
3128
3129 omap_hwmod_check_one(dev, "dmadisable_shift",
3130 regbits->dmadisable_shift,
3131 sysc_fields->dmadisable_shift);
3132 omap_hwmod_check_one(dev, "midle_shift",
3133 regbits->midle_shift,
3134 sysc_fields->midle_shift);
3135 omap_hwmod_check_one(dev, "sidle_shift",
3136 regbits->sidle_shift,
3137 sysc_fields->sidle_shift);
3138 omap_hwmod_check_one(dev, "clkact_shift",
3139 regbits->clkact_shift,
3140 sysc_fields->clkact_shift);
3141 omap_hwmod_check_one(dev, "enwkup_shift",
3142 regbits->enwkup_shift,
3143 sysc_fields->enwkup_shift);
3144 omap_hwmod_check_one(dev, "srst_shift",
3145 regbits->srst_shift,
3146 sysc_fields->srst_shift);
3147 omap_hwmod_check_one(dev, "autoidle_shift",
3148 regbits->autoidle_shift,
3149 sysc_fields->autoidle_shift);
3150
3151 return 0;
3152 }
3153
3154
3155
3156
3157
3158
3159
3160
3161 static int omap_hwmod_init_regbits(struct device *dev, struct omap_hwmod *oh,
3162 const struct ti_sysc_module_data *data,
3163 struct sysc_regbits **sysc_fields)
3164 {
3165 switch (data->cap->type) {
3166 case TI_SYSC_OMAP2:
3167 case TI_SYSC_OMAP2_TIMER:
3168 *sysc_fields = &omap_hwmod_sysc_type1;
3169 break;
3170 case TI_SYSC_OMAP3_SHAM:
3171 *sysc_fields = &omap3_sham_sysc_fields;
3172 break;
3173 case TI_SYSC_OMAP3_AES:
3174 *sysc_fields = &omap3xxx_aes_sysc_fields;
3175 break;
3176 case TI_SYSC_OMAP4:
3177 case TI_SYSC_OMAP4_TIMER:
3178 *sysc_fields = &omap_hwmod_sysc_type2;
3179 break;
3180 case TI_SYSC_OMAP4_SIMPLE:
3181 *sysc_fields = &omap_hwmod_sysc_type3;
3182 break;
3183 case TI_SYSC_OMAP34XX_SR:
3184 *sysc_fields = &omap34xx_sr_sysc_fields;
3185 break;
3186 case TI_SYSC_OMAP36XX_SR:
3187 *sysc_fields = &omap36xx_sr_sysc_fields;
3188 break;
3189 case TI_SYSC_OMAP4_SR:
3190 *sysc_fields = &omap36xx_sr_sysc_fields;
3191 break;
3192 case TI_SYSC_OMAP4_MCASP:
3193 *sysc_fields = &omap_hwmod_sysc_type_mcasp;
3194 break;
3195 case TI_SYSC_OMAP4_USB_HOST_FS:
3196 *sysc_fields = &omap_hwmod_sysc_type_usb_host_fs;
3197 break;
3198 default:
3199 *sysc_fields = NULL;
3200 if (!oh->class->sysc->sysc_fields)
3201 return 0;
3202
3203 dev_err(dev, "sysc_fields not found\n");
3204
3205 return -EINVAL;
3206 }
3207
3208 return omap_hwmod_check_sysc(dev, data, *sysc_fields);
3209 }
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219 static int omap_hwmod_init_reg_offs(struct device *dev,
3220 const struct ti_sysc_module_data *data,
3221 s32 *rev_offs, s32 *sysc_offs,
3222 s32 *syss_offs)
3223 {
3224 *rev_offs = -ENODEV;
3225 *sysc_offs = 0;
3226 *syss_offs = 0;
3227
3228 if (data->offsets[SYSC_REVISION] >= 0)
3229 *rev_offs = data->offsets[SYSC_REVISION];
3230
3231 if (data->offsets[SYSC_SYSCONFIG] >= 0)
3232 *sysc_offs = data->offsets[SYSC_SYSCONFIG];
3233
3234 if (data->offsets[SYSC_SYSSTATUS] >= 0)
3235 *syss_offs = data->offsets[SYSC_SYSSTATUS];
3236
3237 return 0;
3238 }
3239
3240
3241
3242
3243
3244
3245
3246 static int omap_hwmod_init_sysc_flags(struct device *dev,
3247 const struct ti_sysc_module_data *data,
3248 u32 *sysc_flags)
3249 {
3250 *sysc_flags = 0;
3251
3252 switch (data->cap->type) {
3253 case TI_SYSC_OMAP2:
3254 case TI_SYSC_OMAP2_TIMER:
3255
3256 if (data->cfg->sysc_val & SYSC_OMAP2_CLOCKACTIVITY)
3257 *sysc_flags |= SYSC_HAS_CLOCKACTIVITY;
3258 if (data->cfg->sysc_val & SYSC_OMAP2_EMUFREE)
3259 *sysc_flags |= SYSC_HAS_EMUFREE;
3260 if (data->cfg->sysc_val & SYSC_OMAP2_ENAWAKEUP)
3261 *sysc_flags |= SYSC_HAS_ENAWAKEUP;
3262 if (data->cfg->sysc_val & SYSC_OMAP2_SOFTRESET)
3263 *sysc_flags |= SYSC_HAS_SOFTRESET;
3264 if (data->cfg->sysc_val & SYSC_OMAP2_AUTOIDLE)
3265 *sysc_flags |= SYSC_HAS_AUTOIDLE;
3266 break;
3267 case TI_SYSC_OMAP4:
3268 case TI_SYSC_OMAP4_TIMER:
3269
3270 if (data->cfg->sysc_val & SYSC_OMAP4_DMADISABLE)
3271 *sysc_flags |= SYSC_HAS_DMADISABLE;
3272 if (data->cfg->sysc_val & SYSC_OMAP4_FREEEMU)
3273 *sysc_flags |= SYSC_HAS_EMUFREE;
3274 if (data->cfg->sysc_val & SYSC_OMAP4_SOFTRESET)
3275 *sysc_flags |= SYSC_HAS_SOFTRESET;
3276 break;
3277 case TI_SYSC_OMAP34XX_SR:
3278 case TI_SYSC_OMAP36XX_SR:
3279
3280 if (data->cfg->sysc_val & SYSC_OMAP3_SR_ENAWAKEUP)
3281 *sysc_flags |= SYSC_HAS_ENAWAKEUP;
3282 break;
3283 default:
3284 if (data->cap->regbits->emufree_shift >= 0)
3285 *sysc_flags |= SYSC_HAS_EMUFREE;
3286 if (data->cap->regbits->enwkup_shift >= 0)
3287 *sysc_flags |= SYSC_HAS_ENAWAKEUP;
3288 if (data->cap->regbits->srst_shift >= 0)
3289 *sysc_flags |= SYSC_HAS_SOFTRESET;
3290 if (data->cap->regbits->autoidle_shift >= 0)
3291 *sysc_flags |= SYSC_HAS_AUTOIDLE;
3292 break;
3293 }
3294
3295 if (data->cap->regbits->midle_shift >= 0 &&
3296 data->cfg->midlemodes)
3297 *sysc_flags |= SYSC_HAS_MIDLEMODE;
3298
3299 if (data->cap->regbits->sidle_shift >= 0 &&
3300 data->cfg->sidlemodes)
3301 *sysc_flags |= SYSC_HAS_SIDLEMODE;
3302
3303 if (data->cfg->quirks & SYSC_QUIRK_UNCACHED)
3304 *sysc_flags |= SYSC_NO_CACHE;
3305 if (data->cfg->quirks & SYSC_QUIRK_RESET_STATUS)
3306 *sysc_flags |= SYSC_HAS_RESET_STATUS;
3307
3308 if (data->cfg->syss_mask & 1)
3309 *sysc_flags |= SYSS_HAS_RESET_STATUS;
3310
3311 return 0;
3312 }
3313
3314
3315
3316
3317
3318
3319
3320 static int omap_hwmod_init_idlemodes(struct device *dev,
3321 const struct ti_sysc_module_data *data,
3322 u32 *idlemodes)
3323 {
3324 *idlemodes = 0;
3325
3326 if (data->cfg->midlemodes & BIT(SYSC_IDLE_FORCE))
3327 *idlemodes |= MSTANDBY_FORCE;
3328 if (data->cfg->midlemodes & BIT(SYSC_IDLE_NO))
3329 *idlemodes |= MSTANDBY_NO;
3330 if (data->cfg->midlemodes & BIT(SYSC_IDLE_SMART))
3331 *idlemodes |= MSTANDBY_SMART;
3332 if (data->cfg->midlemodes & BIT(SYSC_IDLE_SMART_WKUP))
3333 *idlemodes |= MSTANDBY_SMART_WKUP;
3334
3335 if (data->cfg->sidlemodes & BIT(SYSC_IDLE_FORCE))
3336 *idlemodes |= SIDLE_FORCE;
3337 if (data->cfg->sidlemodes & BIT(SYSC_IDLE_NO))
3338 *idlemodes |= SIDLE_NO;
3339 if (data->cfg->sidlemodes & BIT(SYSC_IDLE_SMART))
3340 *idlemodes |= SIDLE_SMART;
3341 if (data->cfg->sidlemodes & BIT(SYSC_IDLE_SMART_WKUP))
3342 *idlemodes |= SIDLE_SMART_WKUP;
3343
3344 return 0;
3345 }
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359 static int omap_hwmod_check_module(struct device *dev,
3360 struct omap_hwmod *oh,
3361 const struct ti_sysc_module_data *data,
3362 struct sysc_regbits *sysc_fields,
3363 s32 rev_offs, s32 sysc_offs,
3364 s32 syss_offs, u32 sysc_flags,
3365 u32 idlemodes)
3366 {
3367 if (!oh->class->sysc)
3368 return -ENODEV;
3369
3370 if (oh->class->sysc->sysc_fields &&
3371 sysc_fields != oh->class->sysc->sysc_fields)
3372 dev_warn(dev, "sysc_fields mismatch\n");
3373
3374 if (rev_offs != oh->class->sysc->rev_offs)
3375 dev_warn(dev, "rev_offs %08x != %08x\n", rev_offs,
3376 oh->class->sysc->rev_offs);
3377 if (sysc_offs != oh->class->sysc->sysc_offs)
3378 dev_warn(dev, "sysc_offs %08x != %08x\n", sysc_offs,
3379 oh->class->sysc->sysc_offs);
3380 if (syss_offs != oh->class->sysc->syss_offs)
3381 dev_warn(dev, "syss_offs %08x != %08x\n", syss_offs,
3382 oh->class->sysc->syss_offs);
3383
3384 if (sysc_flags != oh->class->sysc->sysc_flags)
3385 dev_warn(dev, "sysc_flags %08x != %08x\n", sysc_flags,
3386 oh->class->sysc->sysc_flags);
3387
3388 if (idlemodes != oh->class->sysc->idlemodes)
3389 dev_warn(dev, "idlemodes %08x != %08x\n", idlemodes,
3390 oh->class->sysc->idlemodes);
3391
3392 if (data->cfg->srst_udelay != oh->class->sysc->srst_udelay)
3393 dev_warn(dev, "srst_udelay %i != %i\n",
3394 data->cfg->srst_udelay,
3395 oh->class->sysc->srst_udelay);
3396
3397 return 0;
3398 }
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414 static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
3415 const struct ti_sysc_module_data *data,
3416 struct sysc_regbits *sysc_fields,
3417 struct clockdomain *clkdm,
3418 s32 rev_offs, s32 sysc_offs,
3419 s32 syss_offs, u32 sysc_flags,
3420 u32 idlemodes)
3421 {
3422 struct omap_hwmod_class_sysconfig *sysc;
3423 struct omap_hwmod_class *class = NULL;
3424 struct omap_hwmod_ocp_if *oi = NULL;
3425 void __iomem *regs = NULL;
3426 unsigned long flags;
3427
3428 sysc = kzalloc(sizeof(*sysc), GFP_KERNEL);
3429 if (!sysc)
3430 return -ENOMEM;
3431
3432 sysc->sysc_fields = sysc_fields;
3433 sysc->rev_offs = rev_offs;
3434 sysc->sysc_offs = sysc_offs;
3435 sysc->syss_offs = syss_offs;
3436 sysc->sysc_flags = sysc_flags;
3437 sysc->idlemodes = idlemodes;
3438 sysc->srst_udelay = data->cfg->srst_udelay;
3439
3440 if (!oh->_mpu_rt_va) {
3441 regs = ioremap(data->module_pa,
3442 data->module_size);
3443 if (!regs)
3444 goto out_free_sysc;
3445 }
3446
3447
3448
3449
3450
3451 if (oh->class->name && strcmp(oh->class->name, data->name)) {
3452 class = kmemdup(oh->class, sizeof(*oh->class), GFP_KERNEL);
3453 if (!class)
3454 goto out_unmap;
3455 }
3456
3457 if (list_empty(&oh->slave_ports)) {
3458 oi = kcalloc(1, sizeof(*oi), GFP_KERNEL);
3459 if (!oi)
3460 goto out_free_class;
3461
3462
3463
3464
3465
3466
3467 oi->slave = oh;
3468 oi->user = OCP_USER_MPU | OCP_USER_SDMA;
3469 }
3470
3471 spin_lock_irqsave(&oh->_lock, flags);
3472 if (regs)
3473 oh->_mpu_rt_va = regs;
3474 if (class)
3475 oh->class = class;
3476 oh->class->sysc = sysc;
3477 if (oi)
3478 _add_link(oi);
3479 if (clkdm)
3480 oh->clkdm = clkdm;
3481 oh->_state = _HWMOD_STATE_INITIALIZED;
3482 oh->_postsetup_state = _HWMOD_STATE_DEFAULT;
3483 _setup(oh, NULL);
3484 spin_unlock_irqrestore(&oh->_lock, flags);
3485
3486 return 0;
3487
3488 out_free_class:
3489 kfree(class);
3490 out_unmap:
3491 iounmap(regs);
3492 out_free_sysc:
3493 kfree(sysc);
3494 return -ENOMEM;
3495 }
3496
3497 static const struct omap_hwmod_reset omap24xx_reset_quirks[] = {
3498 { .match = "msdi", .len = 4, .reset = omap_msdi_reset, },
3499 };
3500
3501 static const struct omap_hwmod_reset omap_reset_quirks[] = {
3502 { .match = "dss_core", .len = 8, .reset = omap_dss_reset, },
3503 { .match = "hdq1w", .len = 5, .reset = omap_hdq1w_reset, },
3504 { .match = "i2c", .len = 3, .reset = omap_i2c_reset, },
3505 { .match = "wd_timer", .len = 8, .reset = omap2_wd_timer_reset, },
3506 };
3507
3508 static void
3509 omap_hwmod_init_reset_quirk(struct device *dev, struct omap_hwmod *oh,
3510 const struct ti_sysc_module_data *data,
3511 const struct omap_hwmod_reset *quirks,
3512 int quirks_sz)
3513 {
3514 const struct omap_hwmod_reset *quirk;
3515 int i;
3516
3517 for (i = 0; i < quirks_sz; i++) {
3518 quirk = &quirks[i];
3519 if (!strncmp(data->name, quirk->match, quirk->len)) {
3520 oh->class->reset = quirk->reset;
3521
3522 return;
3523 }
3524 }
3525 }
3526
3527 static void
3528 omap_hwmod_init_reset_quirks(struct device *dev, struct omap_hwmod *oh,
3529 const struct ti_sysc_module_data *data)
3530 {
3531 if (soc_is_omap24xx())
3532 omap_hwmod_init_reset_quirk(dev, oh, data,
3533 omap24xx_reset_quirks,
3534 ARRAY_SIZE(omap24xx_reset_quirks));
3535
3536 omap_hwmod_init_reset_quirk(dev, oh, data, omap_reset_quirks,
3537 ARRAY_SIZE(omap_reset_quirks));
3538 }
3539
3540
3541
3542
3543
3544
3545
3546 int omap_hwmod_init_module(struct device *dev,
3547 const struct ti_sysc_module_data *data,
3548 struct ti_sysc_cookie *cookie)
3549 {
3550 struct omap_hwmod *oh;
3551 struct sysc_regbits *sysc_fields;
3552 s32 rev_offs, sysc_offs, syss_offs;
3553 u32 sysc_flags, idlemodes;
3554 int error;
3555
3556 if (!dev || !data || !data->name || !cookie)
3557 return -EINVAL;
3558
3559 oh = _lookup(data->name);
3560 if (!oh) {
3561 oh = kzalloc(sizeof(*oh), GFP_KERNEL);
3562 if (!oh)
3563 return -ENOMEM;
3564
3565 oh->name = data->name;
3566 oh->_state = _HWMOD_STATE_UNKNOWN;
3567 lockdep_register_key(&oh->hwmod_key);
3568
3569
3570 oh->prcm.omap4.flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT;
3571
3572 oh->class = kzalloc(sizeof(*oh->class), GFP_KERNEL);
3573 if (!oh->class) {
3574 kfree(oh);
3575 return -ENOMEM;
3576 }
3577
3578 omap_hwmod_init_reset_quirks(dev, oh, data);
3579
3580 oh->class->name = data->name;
3581 mutex_lock(&list_lock);
3582 error = _register(oh);
3583 mutex_unlock(&list_lock);
3584 }
3585
3586 cookie->data = oh;
3587
3588 error = omap_hwmod_init_regbits(dev, oh, data, &sysc_fields);
3589 if (error)
3590 return error;
3591
3592 error = omap_hwmod_init_reg_offs(dev, data, &rev_offs,
3593 &sysc_offs, &syss_offs);
3594 if (error)
3595 return error;
3596
3597 error = omap_hwmod_init_sysc_flags(dev, data, &sysc_flags);
3598 if (error)
3599 return error;
3600
3601 error = omap_hwmod_init_idlemodes(dev, data, &idlemodes);
3602 if (error)
3603 return error;
3604
3605 if (data->cfg->quirks & SYSC_QUIRK_NO_IDLE)
3606 oh->flags |= HWMOD_NO_IDLE;
3607 if (data->cfg->quirks & SYSC_QUIRK_NO_IDLE_ON_INIT)
3608 oh->flags |= HWMOD_INIT_NO_IDLE;
3609 if (data->cfg->quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
3610 oh->flags |= HWMOD_INIT_NO_RESET;
3611 if (data->cfg->quirks & SYSC_QUIRK_USE_CLOCKACT)
3612 oh->flags |= HWMOD_SET_DEFAULT_CLOCKACT;
3613 if (data->cfg->quirks & SYSC_QUIRK_SWSUP_SIDLE)
3614 oh->flags |= HWMOD_SWSUP_SIDLE;
3615 if (data->cfg->quirks & SYSC_QUIRK_SWSUP_SIDLE_ACT)
3616 oh->flags |= HWMOD_SWSUP_SIDLE_ACT;
3617 if (data->cfg->quirks & SYSC_QUIRK_SWSUP_MSTANDBY)
3618 oh->flags |= HWMOD_SWSUP_MSTANDBY;
3619 if (data->cfg->quirks & SYSC_QUIRK_CLKDM_NOAUTO)
3620 oh->flags |= HWMOD_CLKDM_NOAUTO;
3621
3622 error = omap_hwmod_check_module(dev, oh, data, sysc_fields,
3623 rev_offs, sysc_offs, syss_offs,
3624 sysc_flags, idlemodes);
3625 if (!error)
3626 return error;
3627
3628 return omap_hwmod_allocate_module(dev, oh, data, sysc_fields,
3629 cookie->clkdm, rev_offs,
3630 sysc_offs, syss_offs,
3631 sysc_flags, idlemodes);
3632 }
3633
3634
3635
3636
3637
3638
3639
3640
3641 #ifdef CONFIG_SERIAL_EARLYCON
3642 static void __init omap_hwmod_setup_earlycon_flags(void)
3643 {
3644 struct device_node *np;
3645 struct omap_hwmod *oh;
3646 const char *uart;
3647
3648 np = of_find_node_by_path("/chosen");
3649 if (np) {
3650 uart = of_get_property(np, "stdout-path", NULL);
3651 if (uart) {
3652 np = of_find_node_by_path(uart);
3653 if (np) {
3654 uart = of_get_property(np, "ti,hwmods", NULL);
3655 oh = omap_hwmod_lookup(uart);
3656 if (!oh) {
3657 uart = of_get_property(np->parent,
3658 "ti,hwmods",
3659 NULL);
3660 oh = omap_hwmod_lookup(uart);
3661 }
3662 if (oh)
3663 oh->flags |= DEBUG_OMAPUART_FLAGS;
3664 }
3665 }
3666 }
3667 }
3668 #endif
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678 static int __init omap_hwmod_setup_all(void)
3679 {
3680 if (!inited)
3681 return 0;
3682
3683 _ensure_mpu_hwmod_is_setup(NULL);
3684
3685 omap_hwmod_for_each(_init, NULL);
3686 #ifdef CONFIG_SERIAL_EARLYCON
3687 omap_hwmod_setup_earlycon_flags();
3688 #endif
3689 omap_hwmod_for_each(_setup, NULL);
3690
3691 return 0;
3692 }
3693 omap_postcore_initcall(omap_hwmod_setup_all);
3694
3695
3696
3697
3698
3699
3700
3701
3702 int omap_hwmod_enable(struct omap_hwmod *oh)
3703 {
3704 int r;
3705 unsigned long flags;
3706
3707 if (!oh)
3708 return -EINVAL;
3709
3710 spin_lock_irqsave(&oh->_lock, flags);
3711 r = _enable(oh);
3712 spin_unlock_irqrestore(&oh->_lock, flags);
3713
3714 return r;
3715 }
3716
3717
3718
3719
3720
3721
3722
3723
3724 int omap_hwmod_idle(struct omap_hwmod *oh)
3725 {
3726 int r;
3727 unsigned long flags;
3728
3729 if (!oh)
3730 return -EINVAL;
3731
3732 spin_lock_irqsave(&oh->_lock, flags);
3733 r = _idle(oh);
3734 spin_unlock_irqrestore(&oh->_lock, flags);
3735
3736 return r;
3737 }
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747 int omap_hwmod_shutdown(struct omap_hwmod *oh)
3748 {
3749 int r;
3750 unsigned long flags;
3751
3752 if (!oh)
3753 return -EINVAL;
3754
3755 spin_lock_irqsave(&oh->_lock, flags);
3756 r = _shutdown(oh);
3757 spin_unlock_irqrestore(&oh->_lock, flags);
3758
3759 return r;
3760 }
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
3778 {
3779 struct clk *c;
3780 struct omap_hwmod_ocp_if *oi;
3781 struct clockdomain *clkdm;
3782 struct clk_hw_omap *clk;
3783 struct clk_hw *hw;
3784
3785 if (!oh)
3786 return NULL;
3787
3788 if (oh->clkdm)
3789 return oh->clkdm->pwrdm.ptr;
3790
3791 if (oh->_clk) {
3792 c = oh->_clk;
3793 } else {
3794 oi = _find_mpu_rt_port(oh);
3795 if (!oi)
3796 return NULL;
3797 c = oi->_clk;
3798 }
3799
3800 hw = __clk_get_hw(c);
3801 if (!hw)
3802 return NULL;
3803
3804 clk = to_clk_hw_omap(hw);
3805 if (!clk)
3806 return NULL;
3807
3808 clkdm = clk->clkdm;
3809 if (!clkdm)
3810 return NULL;
3811
3812 return clkdm->pwrdm.ptr;
3813 }
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824 void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh)
3825 {
3826 if (!oh)
3827 return NULL;
3828
3829 if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
3830 return NULL;
3831
3832 if (oh->_state == _HWMOD_STATE_UNKNOWN)
3833 return NULL;
3834
3835 return oh->_mpu_rt_va;
3836 }
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855 int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name)
3856 {
3857 int ret;
3858 unsigned long flags;
3859
3860 if (!oh)
3861 return -EINVAL;
3862
3863 spin_lock_irqsave(&oh->_lock, flags);
3864 ret = _assert_hardreset(oh, name);
3865 spin_unlock_irqrestore(&oh->_lock, flags);
3866
3867 return ret;
3868 }
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882 int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name)
3883 {
3884 int ret;
3885 unsigned long flags;
3886
3887 if (!oh)
3888 return -EINVAL;
3889
3890 spin_lock_irqsave(&oh->_lock, flags);
3891 ret = _deassert_hardreset(oh, name);
3892 spin_unlock_irqrestore(&oh->_lock, flags);
3893
3894 return ret;
3895 }
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909 int omap_hwmod_for_each_by_class(const char *classname,
3910 int (*fn)(struct omap_hwmod *oh,
3911 void *user),
3912 void *user)
3913 {
3914 struct omap_hwmod *temp_oh;
3915 int ret = 0;
3916
3917 if (!classname || !fn)
3918 return -EINVAL;
3919
3920 pr_debug("omap_hwmod: %s: looking for modules of class %s\n",
3921 __func__, classname);
3922
3923 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
3924 if (!strcmp(temp_oh->class->name, classname)) {
3925 pr_debug("omap_hwmod: %s: %s: calling callback fn\n",
3926 __func__, temp_oh->name);
3927 ret = (*fn)(temp_oh, user);
3928 if (ret)
3929 break;
3930 }
3931 }
3932
3933 if (ret)
3934 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n",
3935 __func__, ret);
3936
3937 return ret;
3938 }
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951 int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state)
3952 {
3953 int ret;
3954 unsigned long flags;
3955
3956 if (!oh)
3957 return -EINVAL;
3958
3959 if (state != _HWMOD_STATE_DISABLED &&
3960 state != _HWMOD_STATE_ENABLED &&
3961 state != _HWMOD_STATE_IDLE)
3962 return -EINVAL;
3963
3964 spin_lock_irqsave(&oh->_lock, flags);
3965
3966 if (oh->_state != _HWMOD_STATE_REGISTERED) {
3967 ret = -EINVAL;
3968 goto ohsps_unlock;
3969 }
3970
3971 oh->_postsetup_state = state;
3972 ret = 0;
3973
3974 ohsps_unlock:
3975 spin_unlock_irqrestore(&oh->_lock, flags);
3976
3977 return ret;
3978 }
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991 int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh)
3992 {
3993 struct powerdomain *pwrdm;
3994 int ret = 0;
3995
3996 if (soc_ops.get_context_lost)
3997 return soc_ops.get_context_lost(oh);
3998
3999 pwrdm = omap_hwmod_get_pwrdm(oh);
4000 if (pwrdm)
4001 ret = pwrdm_get_context_loss_count(pwrdm);
4002
4003 return ret;
4004 }
4005
4006
4007
4008
4009
4010
4011
4012
4013 void __init omap_hwmod_init(void)
4014 {
4015 if (cpu_is_omap24xx()) {
4016 soc_ops.wait_target_ready = _omap2xxx_3xxx_wait_target_ready;
4017 soc_ops.assert_hardreset = _omap2_assert_hardreset;
4018 soc_ops.deassert_hardreset = _omap2_deassert_hardreset;
4019 soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted;
4020 } else if (cpu_is_omap34xx()) {
4021 soc_ops.wait_target_ready = _omap2xxx_3xxx_wait_target_ready;
4022 soc_ops.assert_hardreset = _omap2_assert_hardreset;
4023 soc_ops.deassert_hardreset = _omap2_deassert_hardreset;
4024 soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted;
4025 soc_ops.init_clkdm = _init_clkdm;
4026 } else if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
4027 soc_ops.enable_module = _omap4_enable_module;
4028 soc_ops.disable_module = _omap4_disable_module;
4029 soc_ops.wait_target_ready = _omap4_wait_target_ready;
4030 soc_ops.assert_hardreset = _omap4_assert_hardreset;
4031 soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
4032 soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
4033 soc_ops.init_clkdm = _init_clkdm;
4034 soc_ops.update_context_lost = _omap4_update_context_lost;
4035 soc_ops.get_context_lost = _omap4_get_context_lost;
4036 soc_ops.disable_direct_prcm = _omap4_disable_direct_prcm;
4037 soc_ops.xlate_clkctrl = _omap4_xlate_clkctrl;
4038 } else if (cpu_is_ti814x() || cpu_is_ti816x() || soc_is_am33xx() ||
4039 soc_is_am43xx()) {
4040 soc_ops.enable_module = _omap4_enable_module;
4041 soc_ops.disable_module = _omap4_disable_module;
4042 soc_ops.wait_target_ready = _omap4_wait_target_ready;
4043 soc_ops.assert_hardreset = _omap4_assert_hardreset;
4044 soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;
4045 soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
4046 soc_ops.init_clkdm = _init_clkdm;
4047 soc_ops.disable_direct_prcm = _omap4_disable_direct_prcm;
4048 soc_ops.xlate_clkctrl = _omap4_xlate_clkctrl;
4049 } else {
4050 WARN(1, "omap_hwmod: unknown SoC type\n");
4051 }
4052
4053 _init_clkctrl_providers();
4054
4055 inited = true;
4056 }
4057
4058
4059
4060
4061
4062
4063
4064
4065 const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh)
4066 {
4067 if (!oh)
4068 return NULL;
4069
4070 return oh->main_clk;
4071 }