1 /* 2 * omap_hwmod implementation for OMAP2/3/4 3 * 4 * Copyright (C) 2009-2010 Nokia Corporation 5 * 6 * Paul Walmsley, Benoît Cousson, Kevin Hilman 7 * 8 * Created in collaboration with (alphabetical order): Thara Gopinath, 9 * Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari Poussa, Anand 10 * Sawant, Santosh Shilimkar, Richard Woodruff 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2 as 14 * published by the Free Software Foundation. 15 * 16 * This code manages "OMAP modules" (on-chip devices) and their 17 * integration with Linux device driver and bus code. 18 * 19 * References: 20 * - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064) 21 * - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090) 22 * - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108) 23 * - OMAP4430 Multimedia Device Silicon Revision 1.0 (SWPU140) 24 * - Open Core Protocol Specification 2.2 25 * 26 * To do: 27 * - pin mux handling 28 * - handle IO mapping 29 * - bus throughput & module latency measurement code 30 * 31 * XXX add tests at the beginning of each function to ensure the hwmod is 32 * in the appropriate state 33 * XXX error return values should be checked to ensure that they are 34 * appropriate 35 */ 36 #undef DEBUG 37 38 #include <linux/kernel.h> 39 #include <linux/errno.h> 40 #include <linux/io.h> 41 #include <linux/clk.h> 42 #include <linux/delay.h> 43 #include <linux/err.h> 44 #include <linux/list.h> 45 #include <linux/mutex.h> 46 47 #include <plat/common.h> 48 #include <plat/cpu.h> 49 #include <plat/clockdomain.h> 50 #include <plat/powerdomain.h> 51 #include <plat/clock.h> 52 #include <plat/omap_hwmod.h> 53 54 #include "cm.h" 55 56 /* Maximum microseconds to wait for OMAP module to reset */ 57 #define MAX_MODULE_RESET_WAIT 10000 58 59 /* Name of the OMAP hwmod for the MPU */ 60 #define MPU_INITIATOR_NAME "mpu" 61 62 /* omap_hwmod_list contains all registered struct omap_hwmods */ 63 static LIST_HEAD(omap_hwmod_list); 64 65 static DEFINE_MUTEX(omap_hwmod_mutex); 66 67 /* mpu_oh: used to add/remove MPU initiator from sleepdep list */ 68 static struct omap_hwmod *mpu_oh; 69 70 /* inited: 0 if omap_hwmod_init() has not yet been called; 1 otherwise */ 71 static u8 inited; 72 73 74 /* Private functions */ 75 76 /** 77 * _update_sysc_cache - return the module OCP_SYSCONFIG register, keep copy 78 * @oh: struct omap_hwmod * 79 * 80 * Load the current value of the hwmod OCP_SYSCONFIG register into the 81 * struct omap_hwmod for later use. Returns -EINVAL if the hwmod has no 82 * OCP_SYSCONFIG register or 0 upon success. 83 */ 84 static int _update_sysc_cache(struct omap_hwmod *oh) 85 { 86 if (!oh->class->sysc) { 87 WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name); 88 return -EINVAL; 89 } 90 91 /* XXX ensure module interface clock is up */ 92 93 oh->_sysc_cache = omap_hwmod_readl(oh, oh->class->sysc->sysc_offs); 94 95 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE)) 96 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; 97 98 return 0; 99 } 100 101 /** 102 * _write_sysconfig - write a value to the module's OCP_SYSCONFIG register 103 * @v: OCP_SYSCONFIG value to write 104 * @oh: struct omap_hwmod * 105 * 106 * Write @v into the module class' OCP_SYSCONFIG register, if it has 107 * one. No return value. 108 */ 109 static void _write_sysconfig(u32 v, struct omap_hwmod *oh) 110 { 111 if (!oh->class->sysc) { 112 WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name); 113 return; 114 } 115 116 /* XXX ensure module interface clock is up */ 117 118 if (oh->_sysc_cache != v) { 119 oh->_sysc_cache = v; 120 omap_hwmod_writel(v, oh, oh->class->sysc->sysc_offs); 121 } 122 } 123 124 /** 125 * _set_master_standbymode: set the OCP_SYSCONFIG MIDLEMODE field in @v 126 * @oh: struct omap_hwmod * 127 * @standbymode: MIDLEMODE field bits 128 * @v: pointer to register contents to modify 129 * 130 * Update the master standby mode bits in @v to be @standbymode for 131 * the @oh hwmod. Does not write to the hardware. Returns -EINVAL 132 * upon error or 0 upon success. 133 */ 134 static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode, 135 u32 *v) 136 { 137 u32 mstandby_mask; 138 u8 mstandby_shift; 139 140 if (!oh->class->sysc || 141 !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE)) 142 return -EINVAL; 143 144 if (!oh->class->sysc->sysc_fields) { 145 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 146 return -EINVAL; 147 } 148 149 mstandby_shift = oh->class->sysc->sysc_fields->midle_shift; 150 mstandby_mask = (0x3 << mstandby_shift); 151 152 *v &= ~mstandby_mask; 153 *v |= __ffs(standbymode) << mstandby_shift; 154 155 return 0; 156 } 157 158 /** 159 * _set_slave_idlemode: set the OCP_SYSCONFIG SIDLEMODE field in @v 160 * @oh: struct omap_hwmod * 161 * @idlemode: SIDLEMODE field bits 162 * @v: pointer to register contents to modify 163 * 164 * Update the slave idle mode bits in @v to be @idlemode for the @oh 165 * hwmod. Does not write to the hardware. Returns -EINVAL upon error 166 * or 0 upon success. 167 */ 168 static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v) 169 { 170 u32 sidle_mask; 171 u8 sidle_shift; 172 173 if (!oh->class->sysc || 174 !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE)) 175 return -EINVAL; 176 177 if (!oh->class->sysc->sysc_fields) { 178 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 179 return -EINVAL; 180 } 181 182 sidle_shift = oh->class->sysc->sysc_fields->sidle_shift; 183 sidle_mask = (0x3 << sidle_shift); 184 185 *v &= ~sidle_mask; 186 *v |= __ffs(idlemode) << sidle_shift; 187 188 return 0; 189 } 190 191 /** 192 * _set_clockactivity: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v 193 * @oh: struct omap_hwmod * 194 * @clockact: CLOCKACTIVITY field bits 195 * @v: pointer to register contents to modify 196 * 197 * Update the clockactivity mode bits in @v to be @clockact for the 198 * @oh hwmod. Used for additional powersaving on some modules. Does 199 * not write to the hardware. Returns -EINVAL upon error or 0 upon 200 * success. 201 */ 202 static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v) 203 { 204 u32 clkact_mask; 205 u8 clkact_shift; 206 207 if (!oh->class->sysc || 208 !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY)) 209 return -EINVAL; 210 211 if (!oh->class->sysc->sysc_fields) { 212 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 213 return -EINVAL; 214 } 215 216 clkact_shift = oh->class->sysc->sysc_fields->clkact_shift; 217 clkact_mask = (0x3 << clkact_shift); 218 219 *v &= ~clkact_mask; 220 *v |= clockact << clkact_shift; 221 222 return 0; 223 } 224 225 /** 226 * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v 227 * @oh: struct omap_hwmod * 228 * @v: pointer to register contents to modify 229 * 230 * Set the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon 231 * error or 0 upon success. 232 */ 233 static int _set_softreset(struct omap_hwmod *oh, u32 *v) 234 { 235 u32 softrst_mask; 236 237 if (!oh->class->sysc || 238 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) 239 return -EINVAL; 240 241 if (!oh->class->sysc->sysc_fields) { 242 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 243 return -EINVAL; 244 } 245 246 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); 247 248 *v |= softrst_mask; 249 250 return 0; 251 } 252 253 /** 254 * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v 255 * @oh: struct omap_hwmod * 256 * @autoidle: desired AUTOIDLE bitfield value (0 or 1) 257 * @v: pointer to register contents to modify 258 * 259 * Update the module autoidle bit in @v to be @autoidle for the @oh 260 * hwmod. The autoidle bit controls whether the module can gate 261 * internal clocks automatically when it isn't doing anything; the 262 * exact function of this bit varies on a per-module basis. This 263 * function does not write to the hardware. Returns -EINVAL upon 264 * error or 0 upon success. 265 */ 266 static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle, 267 u32 *v) 268 { 269 u32 autoidle_mask; 270 u8 autoidle_shift; 271 272 if (!oh->class->sysc || 273 !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE)) 274 return -EINVAL; 275 276 if (!oh->class->sysc->sysc_fields) { 277 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 278 return -EINVAL; 279 } 280 281 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift; 282 autoidle_mask = (0x3 << autoidle_shift); 283 284 *v &= ~autoidle_mask; 285 *v |= autoidle << autoidle_shift; 286 287 return 0; 288 } 289 290 /** 291 * _enable_wakeup: set OCP_SYSCONFIG.ENAWAKEUP bit in the hardware 292 * @oh: struct omap_hwmod * 293 * 294 * Allow the hardware module @oh to send wakeups. Returns -EINVAL 295 * upon error or 0 upon success. 296 */ 297 static int _enable_wakeup(struct omap_hwmod *oh) 298 { 299 u32 v, wakeup_mask; 300 301 if (!oh->class->sysc || 302 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 303 return -EINVAL; 304 305 if (!oh->class->sysc->sysc_fields) { 306 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 307 return -EINVAL; 308 } 309 310 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift); 311 312 v = oh->_sysc_cache; 313 v |= wakeup_mask; 314 _write_sysconfig(v, oh); 315 316 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 317 318 oh->_int_flags |= _HWMOD_WAKEUP_ENABLED; 319 320 return 0; 321 } 322 323 /** 324 * _disable_wakeup: clear OCP_SYSCONFIG.ENAWAKEUP bit in the hardware 325 * @oh: struct omap_hwmod * 326 * 327 * Prevent the hardware module @oh to send wakeups. Returns -EINVAL 328 * upon error or 0 upon success. 329 */ 330 static int _disable_wakeup(struct omap_hwmod *oh) 331 { 332 u32 v, wakeup_mask; 333 334 if (!oh->class->sysc || 335 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 336 return -EINVAL; 337 338 if (!oh->class->sysc->sysc_fields) { 339 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 340 return -EINVAL; 341 } 342 343 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift); 344 345 v = oh->_sysc_cache; 346 v &= ~wakeup_mask; 347 _write_sysconfig(v, oh); 348 349 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 350 351 oh->_int_flags &= ~_HWMOD_WAKEUP_ENABLED; 352 353 return 0; 354 } 355 356 /** 357 * _add_initiator_dep: prevent @oh from smart-idling while @init_oh is active 358 * @oh: struct omap_hwmod * 359 * 360 * Prevent the hardware module @oh from entering idle while the 361 * hardare module initiator @init_oh is active. Useful when a module 362 * will be accessed by a particular initiator (e.g., if a module will 363 * be accessed by the IVA, there should be a sleepdep between the IVA 364 * initiator and the module). Only applies to modules in smart-idle 365 * mode. Returns -EINVAL upon error or passes along 366 * clkdm_add_sleepdep() value upon success. 367 */ 368 static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 369 { 370 if (!oh->_clk) 371 return -EINVAL; 372 373 return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 374 } 375 376 /** 377 * _del_initiator_dep: allow @oh to smart-idle even if @init_oh is active 378 * @oh: struct omap_hwmod * 379 * 380 * Allow the hardware module @oh to enter idle while the hardare 381 * module initiator @init_oh is active. Useful when a module will not 382 * be accessed by a particular initiator (e.g., if a module will not 383 * be accessed by the IVA, there should be no sleepdep between the IVA 384 * initiator and the module). Only applies to modules in smart-idle 385 * mode. Returns -EINVAL upon error or passes along 386 * clkdm_del_sleepdep() value upon success. 387 */ 388 static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 389 { 390 if (!oh->_clk) 391 return -EINVAL; 392 393 return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 394 } 395 396 /** 397 * _init_main_clk - get a struct clk * for the the hwmod's main functional clk 398 * @oh: struct omap_hwmod * 399 * 400 * Called from _init_clocks(). Populates the @oh _clk (main 401 * functional clock pointer) if a main_clk is present. Returns 0 on 402 * success or -EINVAL on error. 403 */ 404 static int _init_main_clk(struct omap_hwmod *oh) 405 { 406 int ret = 0; 407 408 if (!oh->main_clk) 409 return 0; 410 411 oh->_clk = omap_clk_get_by_name(oh->main_clk); 412 if (!oh->_clk) { 413 pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", 414 oh->name, oh->main_clk); 415 return -EINVAL; 416 } 417 418 if (!oh->_clk->clkdm) 419 pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", 420 oh->main_clk, oh->_clk->name); 421 422 return ret; 423 } 424 425 /** 426 * _init_interface_clks - get a struct clk * for the the hwmod's interface clks 427 * @oh: struct omap_hwmod * 428 * 429 * Called from _init_clocks(). Populates the @oh OCP slave interface 430 * clock pointers. Returns 0 on success or -EINVAL on error. 431 */ 432 static int _init_interface_clks(struct omap_hwmod *oh) 433 { 434 struct clk *c; 435 int i; 436 int ret = 0; 437 438 if (oh->slaves_cnt == 0) 439 return 0; 440 441 for (i = 0; i < oh->slaves_cnt; i++) { 442 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 443 444 if (!os->clk) 445 continue; 446 447 c = omap_clk_get_by_name(os->clk); 448 if (!c) { 449 pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", 450 oh->name, os->clk); 451 ret = -EINVAL; 452 } 453 os->_clk = c; 454 } 455 456 return ret; 457 } 458 459 /** 460 * _init_opt_clk - get a struct clk * for the the hwmod's optional clocks 461 * @oh: struct omap_hwmod * 462 * 463 * Called from _init_clocks(). Populates the @oh omap_hwmod_opt_clk 464 * clock pointers. Returns 0 on success or -EINVAL on error. 465 */ 466 static int _init_opt_clks(struct omap_hwmod *oh) 467 { 468 struct omap_hwmod_opt_clk *oc; 469 struct clk *c; 470 int i; 471 int ret = 0; 472 473 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { 474 c = omap_clk_get_by_name(oc->clk); 475 if (!c) { 476 pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", 477 oh->name, oc->clk); 478 ret = -EINVAL; 479 } 480 oc->_clk = c; 481 } 482 483 return ret; 484 } 485 486 /** 487 * _enable_clocks - enable hwmod main clock and interface clocks 488 * @oh: struct omap_hwmod * 489 * 490 * Enables all clocks necessary for register reads and writes to succeed 491 * on the hwmod @oh. Returns 0. 492 */ 493 static int _enable_clocks(struct omap_hwmod *oh) 494 { 495 int i; 496 497 pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name); 498 499 if (oh->_clk) 500 clk_enable(oh->_clk); 501 502 if (oh->slaves_cnt > 0) { 503 for (i = 0; i < oh->slaves_cnt; i++) { 504 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 505 struct clk *c = os->_clk; 506 507 if (c && (os->flags & OCPIF_SWSUP_IDLE)) 508 clk_enable(c); 509 } 510 } 511 512 /* The opt clocks are controlled by the device driver. */ 513 514 return 0; 515 } 516 517 /** 518 * _disable_clocks - disable hwmod main clock and interface clocks 519 * @oh: struct omap_hwmod * 520 * 521 * Disables the hwmod @oh main functional and interface clocks. Returns 0. 522 */ 523 static int _disable_clocks(struct omap_hwmod *oh) 524 { 525 int i; 526 527 pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name); 528 529 if (oh->_clk) 530 clk_disable(oh->_clk); 531 532 if (oh->slaves_cnt > 0) { 533 for (i = 0; i < oh->slaves_cnt; i++) { 534 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 535 struct clk *c = os->_clk; 536 537 if (c && (os->flags & OCPIF_SWSUP_IDLE)) 538 clk_disable(c); 539 } 540 } 541 542 /* The opt clocks are controlled by the device driver. */ 543 544 return 0; 545 } 546 547 /** 548 * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use 549 * @oh: struct omap_hwmod * 550 * 551 * Returns the array index of the OCP slave port that the MPU 552 * addresses the device on, or -EINVAL upon error or not found. 553 */ 554 static int _find_mpu_port_index(struct omap_hwmod *oh) 555 { 556 int i; 557 int found = 0; 558 559 if (!oh || oh->slaves_cnt == 0) 560 return -EINVAL; 561 562 for (i = 0; i < oh->slaves_cnt; i++) { 563 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 564 565 if (os->user & OCP_USER_MPU) { 566 found = 1; 567 break; 568 } 569 } 570 571 if (found) 572 pr_debug("omap_hwmod: %s: MPU OCP slave port ID %d\n", 573 oh->name, i); 574 else 575 pr_debug("omap_hwmod: %s: no MPU OCP slave port found\n", 576 oh->name); 577 578 return (found) ? i : -EINVAL; 579 } 580 581 /** 582 * _find_mpu_rt_base - find hwmod register target base addr accessible by MPU 583 * @oh: struct omap_hwmod * 584 * 585 * Return the virtual address of the base of the register target of 586 * device @oh, or NULL on error. 587 */ 588 static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index) 589 { 590 struct omap_hwmod_ocp_if *os; 591 struct omap_hwmod_addr_space *mem; 592 int i; 593 int found = 0; 594 void __iomem *va_start; 595 596 if (!oh || oh->slaves_cnt == 0) 597 return NULL; 598 599 os = oh->slaves[index]; 600 601 for (i = 0, mem = os->addr; i < os->addr_cnt; i++, mem++) { 602 if (mem->flags & ADDR_TYPE_RT) { 603 found = 1; 604 break; 605 } 606 } 607 608 if (found) { 609 va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start); 610 if (!va_start) { 611 pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); 612 return NULL; 613 } 614 pr_debug("omap_hwmod: %s: MPU register target at va %p\n", 615 oh->name, va_start); 616 } else { 617 pr_debug("omap_hwmod: %s: no MPU register target found\n", 618 oh->name); 619 } 620 621 return (found) ? va_start : NULL; 622 } 623 624 /** 625 * _sysc_enable - try to bring a module out of idle via OCP_SYSCONFIG 626 * @oh: struct omap_hwmod * 627 * 628 * If module is marked as SWSUP_SIDLE, force the module out of slave 629 * idle; otherwise, configure it for smart-idle. If module is marked 630 * as SWSUP_MSUSPEND, force the module out of master standby; 631 * otherwise, configure it for smart-standby. No return value. 632 */ 633 static void _sysc_enable(struct omap_hwmod *oh) 634 { 635 u8 idlemode, sf; 636 u32 v; 637 638 if (!oh->class->sysc) 639 return; 640 641 v = oh->_sysc_cache; 642 sf = oh->class->sysc->sysc_flags; 643 644 if (sf & SYSC_HAS_SIDLEMODE) { 645 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 646 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; 647 _set_slave_idlemode(oh, idlemode, &v); 648 } 649 650 if (sf & SYSC_HAS_MIDLEMODE) { 651 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ? 652 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; 653 _set_master_standbymode(oh, idlemode, &v); 654 } 655 656 if (sf & SYSC_HAS_AUTOIDLE) { 657 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ? 658 0 : 1; 659 _set_module_autoidle(oh, idlemode, &v); 660 } 661 662 /* XXX OCP ENAWAKEUP bit? */ 663 664 /* 665 * XXX The clock framework should handle this, by 666 * calling into this code. But this must wait until the 667 * clock structures are tagged with omap_hwmod entries 668 */ 669 if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) && 670 (sf & SYSC_HAS_CLOCKACTIVITY)) 671 _set_clockactivity(oh, oh->class->sysc->clockact, &v); 672 673 _write_sysconfig(v, oh); 674 } 675 676 /** 677 * _sysc_idle - try to put a module into idle via OCP_SYSCONFIG 678 * @oh: struct omap_hwmod * 679 * 680 * If module is marked as SWSUP_SIDLE, force the module into slave 681 * idle; otherwise, configure it for smart-idle. If module is marked 682 * as SWSUP_MSUSPEND, force the module into master standby; otherwise, 683 * configure it for smart-standby. No return value. 684 */ 685 static void _sysc_idle(struct omap_hwmod *oh) 686 { 687 u8 idlemode, sf; 688 u32 v; 689 690 if (!oh->class->sysc) 691 return; 692 693 v = oh->_sysc_cache; 694 sf = oh->class->sysc->sysc_flags; 695 696 if (sf & SYSC_HAS_SIDLEMODE) { 697 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 698 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; 699 _set_slave_idlemode(oh, idlemode, &v); 700 } 701 702 if (sf & SYSC_HAS_MIDLEMODE) { 703 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ? 704 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; 705 _set_master_standbymode(oh, idlemode, &v); 706 } 707 708 _write_sysconfig(v, oh); 709 } 710 711 /** 712 * _sysc_shutdown - force a module into idle via OCP_SYSCONFIG 713 * @oh: struct omap_hwmod * 714 * 715 * Force the module into slave idle and master suspend. No return 716 * value. 717 */ 718 static void _sysc_shutdown(struct omap_hwmod *oh) 719 { 720 u32 v; 721 u8 sf; 722 723 if (!oh->class->sysc) 724 return; 725 726 v = oh->_sysc_cache; 727 sf = oh->class->sysc->sysc_flags; 728 729 if (sf & SYSC_HAS_SIDLEMODE) 730 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v); 731 732 if (sf & SYSC_HAS_MIDLEMODE) 733 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v); 734 735 if (sf & SYSC_HAS_AUTOIDLE) 736 _set_module_autoidle(oh, 1, &v); 737 738 _write_sysconfig(v, oh); 739 } 740 741 /** 742 * _lookup - find an omap_hwmod by name 743 * @name: find an omap_hwmod by name 744 * 745 * Return a pointer to an omap_hwmod by name, or NULL if not found. 746 * Caller must hold omap_hwmod_mutex. 747 */ 748 static struct omap_hwmod *_lookup(const char *name) 749 { 750 struct omap_hwmod *oh, *temp_oh; 751 752 oh = NULL; 753 754 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 755 if (!strcmp(name, temp_oh->name)) { 756 oh = temp_oh; 757 break; 758 } 759 } 760 761 return oh; 762 } 763 764 /** 765 * _init_clocks - clk_get() all clocks associated with this hwmod 766 * @oh: struct omap_hwmod * 767 * @data: not used; pass NULL 768 * 769 * Called by omap_hwmod_late_init() (after omap2_clk_init()). 770 * Resolves all clock names embedded in the hwmod. Must be called 771 * with omap_hwmod_mutex held. Returns -EINVAL if the omap_hwmod 772 * has not yet been registered or if the clocks have already been 773 * initialized, 0 on success, or a non-zero error on failure. 774 */ 775 static int _init_clocks(struct omap_hwmod *oh, void *data) 776 { 777 int ret = 0; 778 779 if (!oh || (oh->_state != _HWMOD_STATE_REGISTERED)) 780 return -EINVAL; 781 782 pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name); 783 784 ret |= _init_main_clk(oh); 785 ret |= _init_interface_clks(oh); 786 ret |= _init_opt_clks(oh); 787 788 if (!ret) 789 oh->_state = _HWMOD_STATE_CLKS_INITED; 790 791 return 0; 792 } 793 794 /** 795 * _wait_target_ready - wait for a module to leave slave idle 796 * @oh: struct omap_hwmod * 797 * 798 * Wait for a module @oh to leave slave idle. Returns 0 if the module 799 * does not have an IDLEST bit or if the module successfully leaves 800 * slave idle; otherwise, pass along the return value of the 801 * appropriate *_cm_wait_module_ready() function. 802 */ 803 static int _wait_target_ready(struct omap_hwmod *oh) 804 { 805 struct omap_hwmod_ocp_if *os; 806 int ret; 807 808 if (!oh) 809 return -EINVAL; 810 811 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 812 return 0; 813 814 os = oh->slaves[oh->_mpu_port_index]; 815 816 if (oh->flags & HWMOD_NO_IDLEST) 817 return 0; 818 819 /* XXX check module SIDLEMODE */ 820 821 /* XXX check clock enable states */ 822 823 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 824 ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs, 825 oh->prcm.omap2.idlest_reg_id, 826 oh->prcm.omap2.idlest_idle_bit); 827 } else if (cpu_is_omap44xx()) { 828 ret = omap4_cm_wait_module_ready(oh->prcm.omap4.clkctrl_reg); 829 } else { 830 BUG(); 831 }; 832 833 return ret; 834 } 835 836 /** 837 * _reset - reset an omap_hwmod 838 * @oh: struct omap_hwmod * 839 * 840 * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be 841 * enabled for this to work. Must be called with omap_hwmod_mutex 842 * held. Returns -EINVAL if the hwmod cannot be reset this way or if 843 * the hwmod is in the wrong state, -ETIMEDOUT if the module did not 844 * reset in time, or 0 upon success. 845 */ 846 static int _reset(struct omap_hwmod *oh) 847 { 848 u32 r, v; 849 int c = 0; 850 851 if (!oh->class->sysc || 852 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET) || 853 (oh->class->sysc->sysc_flags & SYSS_MISSING)) 854 return -EINVAL; 855 856 /* clocks must be on for this operation */ 857 if (oh->_state != _HWMOD_STATE_ENABLED) { 858 WARN(1, "omap_hwmod: %s: reset can only be entered from " 859 "enabled state\n", oh->name); 860 return -EINVAL; 861 } 862 863 pr_debug("omap_hwmod: %s: resetting\n", oh->name); 864 865 v = oh->_sysc_cache; 866 r = _set_softreset(oh, &v); 867 if (r) 868 return r; 869 _write_sysconfig(v, oh); 870 871 omap_test_timeout((omap_hwmod_readl(oh, oh->class->sysc->syss_offs) & 872 SYSS_RESETDONE_MASK), 873 MAX_MODULE_RESET_WAIT, c); 874 875 if (c == MAX_MODULE_RESET_WAIT) 876 WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", 877 oh->name, MAX_MODULE_RESET_WAIT); 878 else 879 pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, c); 880 881 /* 882 * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from 883 * _wait_target_ready() or _reset() 884 */ 885 886 return (c == MAX_MODULE_RESET_WAIT) ? -ETIMEDOUT : 0; 887 } 888 889 /** 890 * _omap_hwmod_enable - enable an omap_hwmod 891 * @oh: struct omap_hwmod * 892 * 893 * Enables an omap_hwmod @oh such that the MPU can access the hwmod's 894 * register target. Must be called with omap_hwmod_mutex held. 895 * Returns -EINVAL if the hwmod is in the wrong state or passes along 896 * the return value of _wait_target_ready(). 897 */ 898 int _omap_hwmod_enable(struct omap_hwmod *oh) 899 { 900 int r; 901 902 if (oh->_state != _HWMOD_STATE_INITIALIZED && 903 oh->_state != _HWMOD_STATE_IDLE && 904 oh->_state != _HWMOD_STATE_DISABLED) { 905 WARN(1, "omap_hwmod: %s: enabled state can only be entered " 906 "from initialized, idle, or disabled state\n", oh->name); 907 return -EINVAL; 908 } 909 910 pr_debug("omap_hwmod: %s: enabling\n", oh->name); 911 912 /* XXX mux balls */ 913 914 _add_initiator_dep(oh, mpu_oh); 915 _enable_clocks(oh); 916 917 r = _wait_target_ready(oh); 918 if (!r) { 919 oh->_state = _HWMOD_STATE_ENABLED; 920 921 /* Access the sysconfig only if the target is ready */ 922 if (oh->class->sysc) { 923 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) 924 _update_sysc_cache(oh); 925 _sysc_enable(oh); 926 } 927 } else { 928 pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", 929 oh->name, r); 930 } 931 932 return r; 933 } 934 935 /** 936 * _idle - idle an omap_hwmod 937 * @oh: struct omap_hwmod * 938 * 939 * Idles an omap_hwmod @oh. This should be called once the hwmod has 940 * no further work. Returns -EINVAL if the hwmod is in the wrong 941 * state or returns 0. 942 */ 943 int _omap_hwmod_idle(struct omap_hwmod *oh) 944 { 945 if (oh->_state != _HWMOD_STATE_ENABLED) { 946 WARN(1, "omap_hwmod: %s: idle state can only be entered from " 947 "enabled state\n", oh->name); 948 return -EINVAL; 949 } 950 951 pr_debug("omap_hwmod: %s: idling\n", oh->name); 952 953 if (oh->class->sysc) 954 _sysc_idle(oh); 955 _del_initiator_dep(oh, mpu_oh); 956 _disable_clocks(oh); 957 958 oh->_state = _HWMOD_STATE_IDLE; 959 960 return 0; 961 } 962 963 /** 964 * _shutdown - shutdown an omap_hwmod 965 * @oh: struct omap_hwmod * 966 * 967 * Shut down an omap_hwmod @oh. This should be called when the driver 968 * used for the hwmod is removed or unloaded or if the driver is not 969 * used by the system. Returns -EINVAL if the hwmod is in the wrong 970 * state or returns 0. 971 */ 972 static int _shutdown(struct omap_hwmod *oh) 973 { 974 if (oh->_state != _HWMOD_STATE_IDLE && 975 oh->_state != _HWMOD_STATE_ENABLED) { 976 WARN(1, "omap_hwmod: %s: disabled state can only be entered " 977 "from idle, or enabled state\n", oh->name); 978 return -EINVAL; 979 } 980 981 pr_debug("omap_hwmod: %s: disabling\n", oh->name); 982 983 if (oh->class->sysc) 984 _sysc_shutdown(oh); 985 _del_initiator_dep(oh, mpu_oh); 986 /* XXX what about the other system initiators here? DMA, tesla, d2d */ 987 _disable_clocks(oh); 988 /* XXX Should this code also force-disable the optional clocks? */ 989 990 /* XXX mux any associated balls to safe mode */ 991 992 oh->_state = _HWMOD_STATE_DISABLED; 993 994 return 0; 995 } 996 997 /** 998 * _setup - do initial configuration of omap_hwmod 999 * @oh: struct omap_hwmod * 1000 * @skip_setup_idle_p: do not idle hwmods at the end of the fn if 1 1001 * 1002 * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh 1003 * OCP_SYSCONFIG register. Must be called with omap_hwmod_mutex held. 1004 * @skip_setup_idle is intended to be used on a system that will not 1005 * call omap_hwmod_enable() to enable devices (e.g., a system without 1006 * PM runtime). Returns -EINVAL if the hwmod is in the wrong state or 1007 * returns 0. 1008 */ 1009 static int _setup(struct omap_hwmod *oh, void *data) 1010 { 1011 int i, r; 1012 u8 skip_setup_idle; 1013 1014 if (!oh || !data) 1015 return -EINVAL; 1016 1017 skip_setup_idle = *(u8 *)data; 1018 1019 /* Set iclk autoidle mode */ 1020 if (oh->slaves_cnt > 0) { 1021 for (i = 0; i < oh->slaves_cnt; i++) { 1022 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 1023 struct clk *c = os->_clk; 1024 1025 if (!c) 1026 continue; 1027 1028 if (os->flags & OCPIF_SWSUP_IDLE) { 1029 /* XXX omap_iclk_deny_idle(c); */ 1030 } else { 1031 /* XXX omap_iclk_allow_idle(c); */ 1032 clk_enable(c); 1033 } 1034 } 1035 } 1036 1037 oh->_state = _HWMOD_STATE_INITIALIZED; 1038 1039 r = _omap_hwmod_enable(oh); 1040 if (r) { 1041 pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", 1042 oh->name, oh->_state); 1043 return 0; 1044 } 1045 1046 if (!(oh->flags & HWMOD_INIT_NO_RESET)) { 1047 /* 1048 * XXX Do the OCP_SYSCONFIG bits need to be 1049 * reprogrammed after a reset? If not, then this can 1050 * be removed. If they do, then probably the 1051 * _omap_hwmod_enable() function should be split to avoid the 1052 * rewrite of the OCP_SYSCONFIG register. 1053 */ 1054 if (oh->class->sysc) { 1055 _update_sysc_cache(oh); 1056 _sysc_enable(oh); 1057 } 1058 } 1059 1060 if (!(oh->flags & HWMOD_INIT_NO_IDLE) && !skip_setup_idle) 1061 _omap_hwmod_idle(oh); 1062 1063 return 0; 1064 } 1065 1066 1067 1068 /* Public functions */ 1069 1070 u32 omap_hwmod_readl(struct omap_hwmod *oh, u16 reg_offs) 1071 { 1072 return __raw_readl(oh->_mpu_rt_va + reg_offs); 1073 } 1074 1075 void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs) 1076 { 1077 __raw_writel(v, oh->_mpu_rt_va + reg_offs); 1078 } 1079 1080 /** 1081 * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode 1082 * @oh: struct omap_hwmod * 1083 * @idlemode: SIDLEMODE field bits (shifted to bit 0) 1084 * 1085 * Sets the IP block's OCP slave idlemode in hardware, and updates our 1086 * local copy. Intended to be used by drivers that have some erratum 1087 * that requires direct manipulation of the SIDLEMODE bits. Returns 1088 * -EINVAL if @oh is null, or passes along the return value from 1089 * _set_slave_idlemode(). 1090 * 1091 * XXX Does this function have any current users? If not, we should 1092 * remove it; it is better to let the rest of the hwmod code handle this. 1093 * Any users of this function should be scrutinized carefully. 1094 */ 1095 int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) 1096 { 1097 u32 v; 1098 int retval = 0; 1099 1100 if (!oh) 1101 return -EINVAL; 1102 1103 v = oh->_sysc_cache; 1104 1105 retval = _set_slave_idlemode(oh, idlemode, &v); 1106 if (!retval) 1107 _write_sysconfig(v, oh); 1108 1109 return retval; 1110 } 1111 1112 /** 1113 * omap_hwmod_register - register a struct omap_hwmod 1114 * @oh: struct omap_hwmod * 1115 * 1116 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod 1117 * already has been registered by the same name; -EINVAL if the 1118 * omap_hwmod is in the wrong state, if @oh is NULL, if the 1119 * omap_hwmod's class field is NULL; if the omap_hwmod is missing a 1120 * name, or if the omap_hwmod's class is missing a name; or 0 upon 1121 * success. 1122 * 1123 * XXX The data should be copied into bootmem, so the original data 1124 * should be marked __initdata and freed after init. This would allow 1125 * unneeded omap_hwmods to be freed on multi-OMAP configurations. Note 1126 * that the copy process would be relatively complex due to the large number 1127 * of substructures. 1128 */ 1129 int omap_hwmod_register(struct omap_hwmod *oh) 1130 { 1131 int ret, ms_id; 1132 1133 if (!oh || !oh->name || !oh->class || !oh->class->name || 1134 (oh->_state != _HWMOD_STATE_UNKNOWN)) 1135 return -EINVAL; 1136 1137 mutex_lock(&omap_hwmod_mutex); 1138 1139 pr_debug("omap_hwmod: %s: registering\n", oh->name); 1140 1141 if (_lookup(oh->name)) { 1142 ret = -EEXIST; 1143 goto ohr_unlock; 1144 } 1145 1146 ms_id = _find_mpu_port_index(oh); 1147 if (!IS_ERR_VALUE(ms_id)) { 1148 oh->_mpu_port_index = ms_id; 1149 oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index); 1150 } else { 1151 oh->_int_flags |= _HWMOD_NO_MPU_PORT; 1152 } 1153 1154 list_add_tail(&oh->node, &omap_hwmod_list); 1155 1156 oh->_state = _HWMOD_STATE_REGISTERED; 1157 1158 ret = 0; 1159 1160 ohr_unlock: 1161 mutex_unlock(&omap_hwmod_mutex); 1162 return ret; 1163 } 1164 1165 /** 1166 * omap_hwmod_lookup - look up a registered omap_hwmod by name 1167 * @name: name of the omap_hwmod to look up 1168 * 1169 * Given a @name of an omap_hwmod, return a pointer to the registered 1170 * struct omap_hwmod *, or NULL upon error. 1171 */ 1172 struct omap_hwmod *omap_hwmod_lookup(const char *name) 1173 { 1174 struct omap_hwmod *oh; 1175 1176 if (!name) 1177 return NULL; 1178 1179 mutex_lock(&omap_hwmod_mutex); 1180 oh = _lookup(name); 1181 mutex_unlock(&omap_hwmod_mutex); 1182 1183 return oh; 1184 } 1185 1186 /** 1187 * omap_hwmod_for_each - call function for each registered omap_hwmod 1188 * @fn: pointer to a callback function 1189 * @data: void * data to pass to callback function 1190 * 1191 * Call @fn for each registered omap_hwmod, passing @data to each 1192 * function. @fn must return 0 for success or any other value for 1193 * failure. If @fn returns non-zero, the iteration across omap_hwmods 1194 * will stop and the non-zero return value will be passed to the 1195 * caller of omap_hwmod_for_each(). @fn is called with 1196 * omap_hwmod_for_each() held. 1197 */ 1198 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), 1199 void *data) 1200 { 1201 struct omap_hwmod *temp_oh; 1202 int ret; 1203 1204 if (!fn) 1205 return -EINVAL; 1206 1207 mutex_lock(&omap_hwmod_mutex); 1208 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 1209 ret = (*fn)(temp_oh, data); 1210 if (ret) 1211 break; 1212 } 1213 mutex_unlock(&omap_hwmod_mutex); 1214 1215 return ret; 1216 } 1217 1218 1219 /** 1220 * omap_hwmod_init - init omap_hwmod code and register hwmods 1221 * @ohs: pointer to an array of omap_hwmods to register 1222 * 1223 * Intended to be called early in boot before the clock framework is 1224 * initialized. If @ohs is not null, will register all omap_hwmods 1225 * listed in @ohs that are valid for this chip. Returns -EINVAL if 1226 * omap_hwmod_init() has already been called or 0 otherwise. 1227 */ 1228 int omap_hwmod_init(struct omap_hwmod **ohs) 1229 { 1230 struct omap_hwmod *oh; 1231 int r; 1232 1233 if (inited) 1234 return -EINVAL; 1235 1236 inited = 1; 1237 1238 if (!ohs) 1239 return 0; 1240 1241 oh = *ohs; 1242 while (oh) { 1243 if (omap_chip_is(oh->omap_chip)) { 1244 r = omap_hwmod_register(oh); 1245 WARN(r, "omap_hwmod: %s: omap_hwmod_register returned " 1246 "%d\n", oh->name, r); 1247 } 1248 oh = *++ohs; 1249 } 1250 1251 return 0; 1252 } 1253 1254 /** 1255 * omap_hwmod_late_init - do some post-clock framework initialization 1256 * @skip_setup_idle: if 1, do not idle hwmods in _setup() 1257 * 1258 * Must be called after omap2_clk_init(). Resolves the struct clk names 1259 * to struct clk pointers for each registered omap_hwmod. Also calls 1260 * _setup() on each hwmod. Returns 0. 1261 */ 1262 int omap_hwmod_late_init(u8 skip_setup_idle) 1263 { 1264 int r; 1265 1266 /* XXX check return value */ 1267 r = omap_hwmod_for_each(_init_clocks, NULL); 1268 WARN(r, "omap_hwmod: omap_hwmod_late_init(): _init_clocks failed\n"); 1269 1270 mpu_oh = omap_hwmod_lookup(MPU_INITIATOR_NAME); 1271 WARN(!mpu_oh, "omap_hwmod: could not find MPU initiator hwmod %s\n", 1272 MPU_INITIATOR_NAME); 1273 1274 if (skip_setup_idle) 1275 pr_debug("omap_hwmod: will leave hwmods enabled during setup\n"); 1276 1277 omap_hwmod_for_each(_setup, &skip_setup_idle); 1278 1279 return 0; 1280 } 1281 1282 /** 1283 * omap_hwmod_unregister - unregister an omap_hwmod 1284 * @oh: struct omap_hwmod * 1285 * 1286 * Unregisters a previously-registered omap_hwmod @oh. There's probably 1287 * no use case for this, so it is likely to be removed in a later version. 1288 * 1289 * XXX Free all of the bootmem-allocated structures here when that is 1290 * implemented. Make it clear that core code is the only code that is 1291 * expected to unregister modules. 1292 */ 1293 int omap_hwmod_unregister(struct omap_hwmod *oh) 1294 { 1295 if (!oh) 1296 return -EINVAL; 1297 1298 pr_debug("omap_hwmod: %s: unregistering\n", oh->name); 1299 1300 mutex_lock(&omap_hwmod_mutex); 1301 iounmap(oh->_mpu_rt_va); 1302 list_del(&oh->node); 1303 mutex_unlock(&omap_hwmod_mutex); 1304 1305 return 0; 1306 } 1307 1308 /** 1309 * omap_hwmod_enable - enable an omap_hwmod 1310 * @oh: struct omap_hwmod * 1311 * 1312 * Enable an omap_hwomd @oh. Intended to be called by omap_device_enable(). 1313 * Returns -EINVAL on error or passes along the return value from _enable(). 1314 */ 1315 int omap_hwmod_enable(struct omap_hwmod *oh) 1316 { 1317 int r; 1318 1319 if (!oh) 1320 return -EINVAL; 1321 1322 mutex_lock(&omap_hwmod_mutex); 1323 r = _omap_hwmod_enable(oh); 1324 mutex_unlock(&omap_hwmod_mutex); 1325 1326 return r; 1327 } 1328 1329 1330 /** 1331 * omap_hwmod_idle - idle an omap_hwmod 1332 * @oh: struct omap_hwmod * 1333 * 1334 * Idle an omap_hwomd @oh. Intended to be called by omap_device_idle(). 1335 * Returns -EINVAL on error or passes along the return value from _idle(). 1336 */ 1337 int omap_hwmod_idle(struct omap_hwmod *oh) 1338 { 1339 if (!oh) 1340 return -EINVAL; 1341 1342 mutex_lock(&omap_hwmod_mutex); 1343 _omap_hwmod_idle(oh); 1344 mutex_unlock(&omap_hwmod_mutex); 1345 1346 return 0; 1347 } 1348 1349 /** 1350 * omap_hwmod_shutdown - shutdown an omap_hwmod 1351 * @oh: struct omap_hwmod * 1352 * 1353 * Shutdown an omap_hwomd @oh. Intended to be called by 1354 * omap_device_shutdown(). Returns -EINVAL on error or passes along 1355 * the return value from _shutdown(). 1356 */ 1357 int omap_hwmod_shutdown(struct omap_hwmod *oh) 1358 { 1359 if (!oh) 1360 return -EINVAL; 1361 1362 mutex_lock(&omap_hwmod_mutex); 1363 _shutdown(oh); 1364 mutex_unlock(&omap_hwmod_mutex); 1365 1366 return 0; 1367 } 1368 1369 /** 1370 * omap_hwmod_enable_clocks - enable main_clk, all interface clocks 1371 * @oh: struct omap_hwmod *oh 1372 * 1373 * Intended to be called by the omap_device code. 1374 */ 1375 int omap_hwmod_enable_clocks(struct omap_hwmod *oh) 1376 { 1377 mutex_lock(&omap_hwmod_mutex); 1378 _enable_clocks(oh); 1379 mutex_unlock(&omap_hwmod_mutex); 1380 1381 return 0; 1382 } 1383 1384 /** 1385 * omap_hwmod_disable_clocks - disable main_clk, all interface clocks 1386 * @oh: struct omap_hwmod *oh 1387 * 1388 * Intended to be called by the omap_device code. 1389 */ 1390 int omap_hwmod_disable_clocks(struct omap_hwmod *oh) 1391 { 1392 mutex_lock(&omap_hwmod_mutex); 1393 _disable_clocks(oh); 1394 mutex_unlock(&omap_hwmod_mutex); 1395 1396 return 0; 1397 } 1398 1399 /** 1400 * omap_hwmod_ocp_barrier - wait for posted writes against the hwmod to complete 1401 * @oh: struct omap_hwmod *oh 1402 * 1403 * Intended to be called by drivers and core code when all posted 1404 * writes to a device must complete before continuing further 1405 * execution (for example, after clearing some device IRQSTATUS 1406 * register bits) 1407 * 1408 * XXX what about targets with multiple OCP threads? 1409 */ 1410 void omap_hwmod_ocp_barrier(struct omap_hwmod *oh) 1411 { 1412 BUG_ON(!oh); 1413 1414 if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { 1415 WARN(1, "omap_device: %s: OCP barrier impossible due to " 1416 "device configuration\n", oh->name); 1417 return; 1418 } 1419 1420 /* 1421 * Forces posted writes to complete on the OCP thread handling 1422 * register writes 1423 */ 1424 omap_hwmod_readl(oh, oh->class->sysc->sysc_offs); 1425 } 1426 1427 /** 1428 * omap_hwmod_reset - reset the hwmod 1429 * @oh: struct omap_hwmod * 1430 * 1431 * Under some conditions, a driver may wish to reset the entire device. 1432 * Called from omap_device code. Returns -EINVAL on error or passes along 1433 * the return value from _reset()/_enable(). 1434 */ 1435 int omap_hwmod_reset(struct omap_hwmod *oh) 1436 { 1437 int r; 1438 1439 if (!oh || !(oh->_state & _HWMOD_STATE_ENABLED)) 1440 return -EINVAL; 1441 1442 mutex_lock(&omap_hwmod_mutex); 1443 r = _reset(oh); 1444 if (!r) 1445 r = _omap_hwmod_enable(oh); 1446 mutex_unlock(&omap_hwmod_mutex); 1447 1448 return r; 1449 } 1450 1451 /** 1452 * omap_hwmod_count_resources - count number of struct resources needed by hwmod 1453 * @oh: struct omap_hwmod * 1454 * @res: pointer to the first element of an array of struct resource to fill 1455 * 1456 * Count the number of struct resource array elements necessary to 1457 * contain omap_hwmod @oh resources. Intended to be called by code 1458 * that registers omap_devices. Intended to be used to determine the 1459 * size of a dynamically-allocated struct resource array, before 1460 * calling omap_hwmod_fill_resources(). Returns the number of struct 1461 * resource array elements needed. 1462 * 1463 * XXX This code is not optimized. It could attempt to merge adjacent 1464 * resource IDs. 1465 * 1466 */ 1467 int omap_hwmod_count_resources(struct omap_hwmod *oh) 1468 { 1469 int ret, i; 1470 1471 ret = oh->mpu_irqs_cnt + oh->sdma_chs_cnt; 1472 1473 for (i = 0; i < oh->slaves_cnt; i++) 1474 ret += oh->slaves[i]->addr_cnt; 1475 1476 return ret; 1477 } 1478 1479 /** 1480 * omap_hwmod_fill_resources - fill struct resource array with hwmod data 1481 * @oh: struct omap_hwmod * 1482 * @res: pointer to the first element of an array of struct resource to fill 1483 * 1484 * Fill the struct resource array @res with resource data from the 1485 * omap_hwmod @oh. Intended to be called by code that registers 1486 * omap_devices. See also omap_hwmod_count_resources(). Returns the 1487 * number of array elements filled. 1488 */ 1489 int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) 1490 { 1491 int i, j; 1492 int r = 0; 1493 1494 /* For each IRQ, DMA, memory area, fill in array.*/ 1495 1496 for (i = 0; i < oh->mpu_irqs_cnt; i++) { 1497 (res + r)->name = (oh->mpu_irqs + i)->name; 1498 (res + r)->start = (oh->mpu_irqs + i)->irq; 1499 (res + r)->end = (oh->mpu_irqs + i)->irq; 1500 (res + r)->flags = IORESOURCE_IRQ; 1501 r++; 1502 } 1503 1504 for (i = 0; i < oh->sdma_chs_cnt; i++) { 1505 (res + r)->name = (oh->sdma_chs + i)->name; 1506 (res + r)->start = (oh->sdma_chs + i)->dma_ch; 1507 (res + r)->end = (oh->sdma_chs + i)->dma_ch; 1508 (res + r)->flags = IORESOURCE_DMA; 1509 r++; 1510 } 1511 1512 for (i = 0; i < oh->slaves_cnt; i++) { 1513 struct omap_hwmod_ocp_if *os; 1514 1515 os = oh->slaves[i]; 1516 1517 for (j = 0; j < os->addr_cnt; j++) { 1518 (res + r)->start = (os->addr + j)->pa_start; 1519 (res + r)->end = (os->addr + j)->pa_end; 1520 (res + r)->flags = IORESOURCE_MEM; 1521 r++; 1522 } 1523 } 1524 1525 return r; 1526 } 1527 1528 /** 1529 * omap_hwmod_get_pwrdm - return pointer to this module's main powerdomain 1530 * @oh: struct omap_hwmod * 1531 * 1532 * Return the powerdomain pointer associated with the OMAP module 1533 * @oh's main clock. If @oh does not have a main clk, return the 1534 * powerdomain associated with the interface clock associated with the 1535 * module's MPU port. (XXX Perhaps this should use the SDMA port 1536 * instead?) Returns NULL on error, or a struct powerdomain * on 1537 * success. 1538 */ 1539 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh) 1540 { 1541 struct clk *c; 1542 1543 if (!oh) 1544 return NULL; 1545 1546 if (oh->_clk) { 1547 c = oh->_clk; 1548 } else { 1549 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 1550 return NULL; 1551 c = oh->slaves[oh->_mpu_port_index]->_clk; 1552 } 1553 1554 if (!c->clkdm) 1555 return NULL; 1556 1557 return c->clkdm->pwrdm.ptr; 1558 1559 } 1560 1561 /** 1562 * omap_hwmod_get_mpu_rt_va - return the module's base address (for the MPU) 1563 * @oh: struct omap_hwmod * 1564 * 1565 * Returns the virtual address corresponding to the beginning of the 1566 * module's register target, in the address range that is intended to 1567 * be used by the MPU. Returns the virtual address upon success or NULL 1568 * upon error. 1569 */ 1570 void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh) 1571 { 1572 if (!oh) 1573 return NULL; 1574 1575 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 1576 return NULL; 1577 1578 if (oh->_state == _HWMOD_STATE_UNKNOWN) 1579 return NULL; 1580 1581 return oh->_mpu_rt_va; 1582 } 1583 1584 /** 1585 * omap_hwmod_add_initiator_dep - add sleepdep from @init_oh to @oh 1586 * @oh: struct omap_hwmod * 1587 * @init_oh: struct omap_hwmod * (initiator) 1588 * 1589 * Add a sleep dependency between the initiator @init_oh and @oh. 1590 * Intended to be called by DSP/Bridge code via platform_data for the 1591 * DSP case; and by the DMA code in the sDMA case. DMA code, *Bridge 1592 * code needs to add/del initiator dependencies dynamically 1593 * before/after accessing a device. Returns the return value from 1594 * _add_initiator_dep(). 1595 * 1596 * XXX Keep a usecount in the clockdomain code 1597 */ 1598 int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh, 1599 struct omap_hwmod *init_oh) 1600 { 1601 return _add_initiator_dep(oh, init_oh); 1602 } 1603 1604 /* 1605 * XXX what about functions for drivers to save/restore ocp_sysconfig 1606 * for context save/restore operations? 1607 */ 1608 1609 /** 1610 * omap_hwmod_del_initiator_dep - remove sleepdep from @init_oh to @oh 1611 * @oh: struct omap_hwmod * 1612 * @init_oh: struct omap_hwmod * (initiator) 1613 * 1614 * Remove a sleep dependency between the initiator @init_oh and @oh. 1615 * Intended to be called by DSP/Bridge code via platform_data for the 1616 * DSP case; and by the DMA code in the sDMA case. DMA code, *Bridge 1617 * code needs to add/del initiator dependencies dynamically 1618 * before/after accessing a device. Returns the return value from 1619 * _del_initiator_dep(). 1620 * 1621 * XXX Keep a usecount in the clockdomain code 1622 */ 1623 int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh, 1624 struct omap_hwmod *init_oh) 1625 { 1626 return _del_initiator_dep(oh, init_oh); 1627 } 1628 1629 /** 1630 * omap_hwmod_enable_wakeup - allow device to wake up the system 1631 * @oh: struct omap_hwmod * 1632 * 1633 * Sets the module OCP socket ENAWAKEUP bit to allow the module to 1634 * send wakeups to the PRCM. Eventually this should sets PRCM wakeup 1635 * registers to cause the PRCM to receive wakeup events from the 1636 * module. Does not set any wakeup routing registers beyond this 1637 * point - if the module is to wake up any other module or subsystem, 1638 * that must be set separately. Called by omap_device code. Returns 1639 * -EINVAL on error or 0 upon success. 1640 */ 1641 int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) 1642 { 1643 if (!oh->class->sysc || 1644 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 1645 return -EINVAL; 1646 1647 mutex_lock(&omap_hwmod_mutex); 1648 _enable_wakeup(oh); 1649 mutex_unlock(&omap_hwmod_mutex); 1650 1651 return 0; 1652 } 1653 1654 /** 1655 * omap_hwmod_disable_wakeup - prevent device from waking the system 1656 * @oh: struct omap_hwmod * 1657 * 1658 * Clears the module OCP socket ENAWAKEUP bit to prevent the module 1659 * from sending wakeups to the PRCM. Eventually this should clear 1660 * PRCM wakeup registers to cause the PRCM to ignore wakeup events 1661 * from the module. Does not set any wakeup routing registers beyond 1662 * this point - if the module is to wake up any other module or 1663 * subsystem, that must be set separately. Called by omap_device 1664 * code. Returns -EINVAL on error or 0 upon success. 1665 */ 1666 int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) 1667 { 1668 if (!oh->class->sysc || 1669 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) 1670 return -EINVAL; 1671 1672 mutex_lock(&omap_hwmod_mutex); 1673 _disable_wakeup(oh); 1674 mutex_unlock(&omap_hwmod_mutex); 1675 1676 return 0; 1677 } 1678 1679 /** 1680 * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname 1681 * @classname: struct omap_hwmod_class name to search for 1682 * @fn: callback function pointer to call for each hwmod in class @classname 1683 * @user: arbitrary context data to pass to the callback function 1684 * 1685 * For each omap_hwmod of class @classname, call @fn. Takes 1686 * omap_hwmod_mutex to prevent the hwmod list from changing during the 1687 * iteration. If the callback function returns something other than 1688 * zero, the iterator is terminated, and the callback function's return 1689 * value is passed back to the caller. Returns 0 upon success, -EINVAL 1690 * if @classname or @fn are NULL, or passes back the error code from @fn. 1691 */ 1692 int omap_hwmod_for_each_by_class(const char *classname, 1693 int (*fn)(struct omap_hwmod *oh, 1694 void *user), 1695 void *user) 1696 { 1697 struct omap_hwmod *temp_oh; 1698 int ret = 0; 1699 1700 if (!classname || !fn) 1701 return -EINVAL; 1702 1703 pr_debug("omap_hwmod: %s: looking for modules of class %s\n", 1704 __func__, classname); 1705 1706 mutex_lock(&omap_hwmod_mutex); 1707 1708 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 1709 if (!strcmp(temp_oh->class->name, classname)) { 1710 pr_debug("omap_hwmod: %s: %s: calling callback fn\n", 1711 __func__, temp_oh->name); 1712 ret = (*fn)(temp_oh, user); 1713 if (ret) 1714 break; 1715 } 1716 } 1717 1718 mutex_unlock(&omap_hwmod_mutex); 1719 1720 if (ret) 1721 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n", 1722 __func__, ret); 1723 1724 return ret; 1725 } 1726 1727