1 /* 2 * omap_hwmod implementation for OMAP2/3/4 3 * 4 * Copyright (C) 2009-2011 Nokia Corporation 5 * Copyright (C) 2011 Texas Instruments, Inc. 6 * 7 * Paul Walmsley, Benoît Cousson, Kevin Hilman 8 * 9 * Created in collaboration with (alphabetical order): Thara Gopinath, 10 * Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari Poussa, Anand 11 * Sawant, Santosh Shilimkar, Richard Woodruff 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License version 2 as 15 * published by the Free Software Foundation. 16 * 17 * Introduction 18 * ------------ 19 * One way to view an OMAP SoC is as a collection of largely unrelated 20 * IP blocks connected by interconnects. The IP blocks include 21 * devices such as ARM processors, audio serial interfaces, UARTs, 22 * etc. Some of these devices, like the DSP, are created by TI; 23 * others, like the SGX, largely originate from external vendors. In 24 * TI's documentation, on-chip devices are referred to as "OMAP 25 * modules." Some of these IP blocks are identical across several 26 * OMAP versions. Others are revised frequently. 27 * 28 * These OMAP modules are tied together by various interconnects. 29 * Most of the address and data flow between modules is via OCP-based 30 * interconnects such as the L3 and L4 buses; but there are other 31 * interconnects that distribute the hardware clock tree, handle idle 32 * and reset signaling, supply power, and connect the modules to 33 * various pads or balls on the OMAP package. 34 * 35 * OMAP hwmod provides a consistent way to describe the on-chip 36 * hardware blocks and their integration into the rest of the chip. 37 * This description can be automatically generated from the TI 38 * hardware database. OMAP hwmod provides a standard, consistent API 39 * to reset, enable, idle, and disable these hardware blocks. And 40 * hwmod provides a way for other core code, such as the Linux device 41 * code or the OMAP power management and address space mapping code, 42 * to query the hardware database. 43 * 44 * Using hwmod 45 * ----------- 46 * Drivers won't call hwmod functions directly. That is done by the 47 * omap_device code, and in rare occasions, by custom integration code 48 * in arch/arm/ *omap*. The omap_device code includes functions to 49 * build a struct platform_device using omap_hwmod data, and that is 50 * currently how hwmod data is communicated to drivers and to the 51 * Linux driver model. Most drivers will call omap_hwmod functions only 52 * indirectly, via pm_runtime*() functions. 53 * 54 * From a layering perspective, here is where the OMAP hwmod code 55 * fits into the kernel software stack: 56 * 57 * +-------------------------------+ 58 * | Device driver code | 59 * | (e.g., drivers/) | 60 * +-------------------------------+ 61 * | Linux driver model | 62 * | (platform_device / | 63 * | platform_driver data/code) | 64 * +-------------------------------+ 65 * | OMAP core-driver integration | 66 * |(arch/arm/mach-omap2/devices.c)| 67 * +-------------------------------+ 68 * | omap_device code | 69 * | (../plat-omap/omap_device.c) | 70 * +-------------------------------+ 71 * ----> | omap_hwmod code/data | <----- 72 * | (../mach-omap2/omap_hwmod*) | 73 * +-------------------------------+ 74 * | OMAP clock/PRCM/register fns | 75 * | (__raw_{read,write}l, clk*) | 76 * +-------------------------------+ 77 * 78 * Device drivers should not contain any OMAP-specific code or data in 79 * them. They should only contain code to operate the IP block that 80 * the driver is responsible for. This is because these IP blocks can 81 * also appear in other SoCs, either from TI (such as DaVinci) or from 82 * other manufacturers; and drivers should be reusable across other 83 * platforms. 84 * 85 * The OMAP hwmod code also will attempt to reset and idle all on-chip 86 * devices upon boot. The goal here is for the kernel to be 87 * completely self-reliant and independent from bootloaders. This is 88 * to ensure a repeatable configuration, both to ensure consistent 89 * runtime behavior, and to make it easier for others to reproduce 90 * bugs. 91 * 92 * OMAP module activity states 93 * --------------------------- 94 * The hwmod code considers modules to be in one of several activity 95 * states. IP blocks start out in an UNKNOWN state, then once they 96 * are registered via the hwmod code, proceed to the REGISTERED state. 97 * Once their clock names are resolved to clock pointers, the module 98 * enters the CLKS_INITED state; and finally, once the module has been 99 * reset and the integration registers programmed, the INITIALIZED state 100 * is entered. The hwmod code will then place the module into either 101 * the IDLE state to save power, or in the case of a critical system 102 * module, the ENABLED state. 103 * 104 * OMAP core integration code can then call omap_hwmod*() functions 105 * directly to move the module between the IDLE, ENABLED, and DISABLED 106 * states, as needed. This is done during both the PM idle loop, and 107 * in the OMAP core integration code's implementation of the PM runtime 108 * functions. 109 * 110 * References 111 * ---------- 112 * This is a partial list. 113 * - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064) 114 * - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090) 115 * - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108) 116 * - OMAP4430 Multimedia Device Silicon Revision 1.0 (SWPU140) 117 * - Open Core Protocol Specification 2.2 118 * 119 * To do: 120 * - handle IO mapping 121 * - bus throughput & module latency measurement code 122 * 123 * XXX add tests at the beginning of each function to ensure the hwmod is 124 * in the appropriate state 125 * XXX error return values should be checked to ensure that they are 126 * appropriate 127 */ 128 #undef DEBUG 129 130 #include <linux/kernel.h> 131 #include <linux/errno.h> 132 #include <linux/io.h> 133 #include <linux/clk.h> 134 #include <linux/delay.h> 135 #include <linux/err.h> 136 #include <linux/list.h> 137 #include <linux/mutex.h> 138 #include <linux/spinlock.h> 139 #include <linux/slab.h> 140 141 #include "common.h" 142 #include <plat/cpu.h> 143 #include "clockdomain.h" 144 #include "powerdomain.h" 145 #include <plat/clock.h> 146 #include <plat/omap_hwmod.h> 147 #include <plat/prcm.h> 148 149 #include "cm2xxx_3xxx.h" 150 #include "cminst44xx.h" 151 #include "prm2xxx_3xxx.h" 152 #include "prm44xx.h" 153 #include "prminst44xx.h" 154 #include "mux.h" 155 156 /* Maximum microseconds to wait for OMAP module to softreset */ 157 #define MAX_MODULE_SOFTRESET_WAIT 10000 158 159 /* Name of the OMAP hwmod for the MPU */ 160 #define MPU_INITIATOR_NAME "mpu" 161 162 /* omap_hwmod_list contains all registered struct omap_hwmods */ 163 static LIST_HEAD(omap_hwmod_list); 164 165 /* mpu_oh: used to add/remove MPU initiator from sleepdep list */ 166 static struct omap_hwmod *mpu_oh; 167 168 169 /* Private functions */ 170 171 /** 172 * _update_sysc_cache - return the module OCP_SYSCONFIG register, keep copy 173 * @oh: struct omap_hwmod * 174 * 175 * Load the current value of the hwmod OCP_SYSCONFIG register into the 176 * struct omap_hwmod for later use. Returns -EINVAL if the hwmod has no 177 * OCP_SYSCONFIG register or 0 upon success. 178 */ 179 static int _update_sysc_cache(struct omap_hwmod *oh) 180 { 181 if (!oh->class->sysc) { 182 WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name); 183 return -EINVAL; 184 } 185 186 /* XXX ensure module interface clock is up */ 187 188 oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs); 189 190 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE)) 191 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; 192 193 return 0; 194 } 195 196 /** 197 * _write_sysconfig - write a value to the module's OCP_SYSCONFIG register 198 * @v: OCP_SYSCONFIG value to write 199 * @oh: struct omap_hwmod * 200 * 201 * Write @v into the module class' OCP_SYSCONFIG register, if it has 202 * one. No return value. 203 */ 204 static void _write_sysconfig(u32 v, struct omap_hwmod *oh) 205 { 206 if (!oh->class->sysc) { 207 WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name); 208 return; 209 } 210 211 /* XXX ensure module interface clock is up */ 212 213 /* Module might have lost context, always update cache and register */ 214 oh->_sysc_cache = v; 215 omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs); 216 } 217 218 /** 219 * _set_master_standbymode: set the OCP_SYSCONFIG MIDLEMODE field in @v 220 * @oh: struct omap_hwmod * 221 * @standbymode: MIDLEMODE field bits 222 * @v: pointer to register contents to modify 223 * 224 * Update the master standby mode bits in @v to be @standbymode for 225 * the @oh hwmod. Does not write to the hardware. Returns -EINVAL 226 * upon error or 0 upon success. 227 */ 228 static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode, 229 u32 *v) 230 { 231 u32 mstandby_mask; 232 u8 mstandby_shift; 233 234 if (!oh->class->sysc || 235 !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE)) 236 return -EINVAL; 237 238 if (!oh->class->sysc->sysc_fields) { 239 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 240 return -EINVAL; 241 } 242 243 mstandby_shift = oh->class->sysc->sysc_fields->midle_shift; 244 mstandby_mask = (0x3 << mstandby_shift); 245 246 *v &= ~mstandby_mask; 247 *v |= __ffs(standbymode) << mstandby_shift; 248 249 return 0; 250 } 251 252 /** 253 * _set_slave_idlemode: set the OCP_SYSCONFIG SIDLEMODE field in @v 254 * @oh: struct omap_hwmod * 255 * @idlemode: SIDLEMODE field bits 256 * @v: pointer to register contents to modify 257 * 258 * Update the slave idle mode bits in @v to be @idlemode for the @oh 259 * hwmod. Does not write to the hardware. Returns -EINVAL upon error 260 * or 0 upon success. 261 */ 262 static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v) 263 { 264 u32 sidle_mask; 265 u8 sidle_shift; 266 267 if (!oh->class->sysc || 268 !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE)) 269 return -EINVAL; 270 271 if (!oh->class->sysc->sysc_fields) { 272 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 273 return -EINVAL; 274 } 275 276 sidle_shift = oh->class->sysc->sysc_fields->sidle_shift; 277 sidle_mask = (0x3 << sidle_shift); 278 279 *v &= ~sidle_mask; 280 *v |= __ffs(idlemode) << sidle_shift; 281 282 return 0; 283 } 284 285 /** 286 * _set_clockactivity: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v 287 * @oh: struct omap_hwmod * 288 * @clockact: CLOCKACTIVITY field bits 289 * @v: pointer to register contents to modify 290 * 291 * Update the clockactivity mode bits in @v to be @clockact for the 292 * @oh hwmod. Used for additional powersaving on some modules. Does 293 * not write to the hardware. Returns -EINVAL upon error or 0 upon 294 * success. 295 */ 296 static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v) 297 { 298 u32 clkact_mask; 299 u8 clkact_shift; 300 301 if (!oh->class->sysc || 302 !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY)) 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 clkact_shift = oh->class->sysc->sysc_fields->clkact_shift; 311 clkact_mask = (0x3 << clkact_shift); 312 313 *v &= ~clkact_mask; 314 *v |= clockact << clkact_shift; 315 316 return 0; 317 } 318 319 /** 320 * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v 321 * @oh: struct omap_hwmod * 322 * @v: pointer to register contents to modify 323 * 324 * Set the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon 325 * error or 0 upon success. 326 */ 327 static int _set_softreset(struct omap_hwmod *oh, u32 *v) 328 { 329 u32 softrst_mask; 330 331 if (!oh->class->sysc || 332 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) 333 return -EINVAL; 334 335 if (!oh->class->sysc->sysc_fields) { 336 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 337 return -EINVAL; 338 } 339 340 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); 341 342 *v |= softrst_mask; 343 344 return 0; 345 } 346 347 /** 348 * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v 349 * @oh: struct omap_hwmod * 350 * @autoidle: desired AUTOIDLE bitfield value (0 or 1) 351 * @v: pointer to register contents to modify 352 * 353 * Update the module autoidle bit in @v to be @autoidle for the @oh 354 * hwmod. The autoidle bit controls whether the module can gate 355 * internal clocks automatically when it isn't doing anything; the 356 * exact function of this bit varies on a per-module basis. This 357 * function does not write to the hardware. Returns -EINVAL upon 358 * error or 0 upon success. 359 */ 360 static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle, 361 u32 *v) 362 { 363 u32 autoidle_mask; 364 u8 autoidle_shift; 365 366 if (!oh->class->sysc || 367 !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE)) 368 return -EINVAL; 369 370 if (!oh->class->sysc->sysc_fields) { 371 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 372 return -EINVAL; 373 } 374 375 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift; 376 autoidle_mask = (0x1 << autoidle_shift); 377 378 *v &= ~autoidle_mask; 379 *v |= autoidle << autoidle_shift; 380 381 return 0; 382 } 383 384 /** 385 * _set_idle_ioring_wakeup - enable/disable IO pad wakeup on hwmod idle for mux 386 * @oh: struct omap_hwmod * 387 * @set_wake: bool value indicating to set (true) or clear (false) wakeup enable 388 * 389 * Set or clear the I/O pad wakeup flag in the mux entries for the 390 * hwmod @oh. This function changes the @oh->mux->pads_dynamic array 391 * in memory. If the hwmod is currently idled, and the new idle 392 * values don't match the previous ones, this function will also 393 * update the SCM PADCTRL registers. Otherwise, if the hwmod is not 394 * currently idled, this function won't touch the hardware: the new 395 * mux settings are written to the SCM PADCTRL registers when the 396 * hwmod is idled. No return value. 397 */ 398 static void _set_idle_ioring_wakeup(struct omap_hwmod *oh, bool set_wake) 399 { 400 struct omap_device_pad *pad; 401 bool change = false; 402 u16 prev_idle; 403 int j; 404 405 if (!oh->mux || !oh->mux->enabled) 406 return; 407 408 for (j = 0; j < oh->mux->nr_pads_dynamic; j++) { 409 pad = oh->mux->pads_dynamic[j]; 410 411 if (!(pad->flags & OMAP_DEVICE_PAD_WAKEUP)) 412 continue; 413 414 prev_idle = pad->idle; 415 416 if (set_wake) 417 pad->idle |= OMAP_WAKEUP_EN; 418 else 419 pad->idle &= ~OMAP_WAKEUP_EN; 420 421 if (prev_idle != pad->idle) 422 change = true; 423 } 424 425 if (change && oh->_state == _HWMOD_STATE_IDLE) 426 omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); 427 } 428 429 /** 430 * _enable_wakeup: set OCP_SYSCONFIG.ENAWAKEUP bit in the hardware 431 * @oh: struct omap_hwmod * 432 * 433 * Allow the hardware module @oh to send wakeups. Returns -EINVAL 434 * upon error or 0 upon success. 435 */ 436 static int _enable_wakeup(struct omap_hwmod *oh, u32 *v) 437 { 438 if (!oh->class->sysc || 439 !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) || 440 (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) || 441 (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP))) 442 return -EINVAL; 443 444 if (!oh->class->sysc->sysc_fields) { 445 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 446 return -EINVAL; 447 } 448 449 if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) 450 *v |= 0x1 << oh->class->sysc->sysc_fields->enwkup_shift; 451 452 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) 453 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v); 454 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) 455 _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v); 456 457 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 458 459 oh->_int_flags |= _HWMOD_WAKEUP_ENABLED; 460 461 return 0; 462 } 463 464 /** 465 * _disable_wakeup: clear OCP_SYSCONFIG.ENAWAKEUP bit in the hardware 466 * @oh: struct omap_hwmod * 467 * 468 * Prevent the hardware module @oh to send wakeups. Returns -EINVAL 469 * upon error or 0 upon success. 470 */ 471 static int _disable_wakeup(struct omap_hwmod *oh, u32 *v) 472 { 473 if (!oh->class->sysc || 474 !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) || 475 (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) || 476 (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP))) 477 return -EINVAL; 478 479 if (!oh->class->sysc->sysc_fields) { 480 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name); 481 return -EINVAL; 482 } 483 484 if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) 485 *v &= ~(0x1 << oh->class->sysc->sysc_fields->enwkup_shift); 486 487 if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) 488 _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v); 489 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) 490 _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v); 491 492 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 493 494 oh->_int_flags &= ~_HWMOD_WAKEUP_ENABLED; 495 496 return 0; 497 } 498 499 /** 500 * _add_initiator_dep: prevent @oh from smart-idling while @init_oh is active 501 * @oh: struct omap_hwmod * 502 * 503 * Prevent the hardware module @oh from entering idle while the 504 * hardare module initiator @init_oh is active. Useful when a module 505 * will be accessed by a particular initiator (e.g., if a module will 506 * be accessed by the IVA, there should be a sleepdep between the IVA 507 * initiator and the module). Only applies to modules in smart-idle 508 * mode. If the clockdomain is marked as not needing autodeps, return 509 * 0 without doing anything. Otherwise, returns -EINVAL upon error or 510 * passes along clkdm_add_sleepdep() value upon success. 511 */ 512 static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 513 { 514 if (!oh->_clk) 515 return -EINVAL; 516 517 if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS) 518 return 0; 519 520 return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 521 } 522 523 /** 524 * _del_initiator_dep: allow @oh to smart-idle even if @init_oh is active 525 * @oh: struct omap_hwmod * 526 * 527 * Allow the hardware module @oh to enter idle while the hardare 528 * module initiator @init_oh is active. Useful when a module will not 529 * be accessed by a particular initiator (e.g., if a module will not 530 * be accessed by the IVA, there should be no sleepdep between the IVA 531 * initiator and the module). Only applies to modules in smart-idle 532 * mode. If the clockdomain is marked as not needing autodeps, return 533 * 0 without doing anything. Returns -EINVAL upon error or passes 534 * along clkdm_del_sleepdep() value upon success. 535 */ 536 static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 537 { 538 if (!oh->_clk) 539 return -EINVAL; 540 541 if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS) 542 return 0; 543 544 return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm); 545 } 546 547 /** 548 * _init_main_clk - get a struct clk * for the the hwmod's main functional clk 549 * @oh: struct omap_hwmod * 550 * 551 * Called from _init_clocks(). Populates the @oh _clk (main 552 * functional clock pointer) if a main_clk is present. Returns 0 on 553 * success or -EINVAL on error. 554 */ 555 static int _init_main_clk(struct omap_hwmod *oh) 556 { 557 int ret = 0; 558 559 if (!oh->main_clk) 560 return 0; 561 562 oh->_clk = omap_clk_get_by_name(oh->main_clk); 563 if (!oh->_clk) { 564 pr_warning("omap_hwmod: %s: cannot clk_get main_clk %s\n", 565 oh->name, oh->main_clk); 566 return -EINVAL; 567 } 568 569 if (!oh->_clk->clkdm) 570 pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", 571 oh->main_clk, oh->_clk->name); 572 573 return ret; 574 } 575 576 /** 577 * _init_interface_clks - get a struct clk * for the the hwmod's interface clks 578 * @oh: struct omap_hwmod * 579 * 580 * Called from _init_clocks(). Populates the @oh OCP slave interface 581 * clock pointers. Returns 0 on success or -EINVAL on error. 582 */ 583 static int _init_interface_clks(struct omap_hwmod *oh) 584 { 585 struct clk *c; 586 int i; 587 int ret = 0; 588 589 if (oh->slaves_cnt == 0) 590 return 0; 591 592 for (i = 0; i < oh->slaves_cnt; i++) { 593 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 594 595 if (!os->clk) 596 continue; 597 598 c = omap_clk_get_by_name(os->clk); 599 if (!c) { 600 pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", 601 oh->name, os->clk); 602 ret = -EINVAL; 603 } 604 os->_clk = c; 605 } 606 607 return ret; 608 } 609 610 /** 611 * _init_opt_clk - get a struct clk * for the the hwmod's optional clocks 612 * @oh: struct omap_hwmod * 613 * 614 * Called from _init_clocks(). Populates the @oh omap_hwmod_opt_clk 615 * clock pointers. Returns 0 on success or -EINVAL on error. 616 */ 617 static int _init_opt_clks(struct omap_hwmod *oh) 618 { 619 struct omap_hwmod_opt_clk *oc; 620 struct clk *c; 621 int i; 622 int ret = 0; 623 624 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { 625 c = omap_clk_get_by_name(oc->clk); 626 if (!c) { 627 pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", 628 oh->name, oc->clk); 629 ret = -EINVAL; 630 } 631 oc->_clk = c; 632 } 633 634 return ret; 635 } 636 637 /** 638 * _enable_clocks - enable hwmod main clock and interface clocks 639 * @oh: struct omap_hwmod * 640 * 641 * Enables all clocks necessary for register reads and writes to succeed 642 * on the hwmod @oh. Returns 0. 643 */ 644 static int _enable_clocks(struct omap_hwmod *oh) 645 { 646 int i; 647 648 pr_debug("omap_hwmod: %s: enabling clocks\n", oh->name); 649 650 if (oh->_clk) 651 clk_enable(oh->_clk); 652 653 if (oh->slaves_cnt > 0) { 654 for (i = 0; i < oh->slaves_cnt; i++) { 655 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 656 struct clk *c = os->_clk; 657 658 if (c && (os->flags & OCPIF_SWSUP_IDLE)) 659 clk_enable(c); 660 } 661 } 662 663 /* The opt clocks are controlled by the device driver. */ 664 665 return 0; 666 } 667 668 /** 669 * _disable_clocks - disable hwmod main clock and interface clocks 670 * @oh: struct omap_hwmod * 671 * 672 * Disables the hwmod @oh main functional and interface clocks. Returns 0. 673 */ 674 static int _disable_clocks(struct omap_hwmod *oh) 675 { 676 int i; 677 678 pr_debug("omap_hwmod: %s: disabling clocks\n", oh->name); 679 680 if (oh->_clk) 681 clk_disable(oh->_clk); 682 683 if (oh->slaves_cnt > 0) { 684 for (i = 0; i < oh->slaves_cnt; i++) { 685 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 686 struct clk *c = os->_clk; 687 688 if (c && (os->flags & OCPIF_SWSUP_IDLE)) 689 clk_disable(c); 690 } 691 } 692 693 /* The opt clocks are controlled by the device driver. */ 694 695 return 0; 696 } 697 698 static void _enable_optional_clocks(struct omap_hwmod *oh) 699 { 700 struct omap_hwmod_opt_clk *oc; 701 int i; 702 703 pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name); 704 705 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) 706 if (oc->_clk) { 707 pr_debug("omap_hwmod: enable %s:%s\n", oc->role, 708 oc->_clk->name); 709 clk_enable(oc->_clk); 710 } 711 } 712 713 static void _disable_optional_clocks(struct omap_hwmod *oh) 714 { 715 struct omap_hwmod_opt_clk *oc; 716 int i; 717 718 pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name); 719 720 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) 721 if (oc->_clk) { 722 pr_debug("omap_hwmod: disable %s:%s\n", oc->role, 723 oc->_clk->name); 724 clk_disable(oc->_clk); 725 } 726 } 727 728 /** 729 * _enable_module - enable CLKCTRL modulemode on OMAP4 730 * @oh: struct omap_hwmod * 731 * 732 * Enables the PRCM module mode related to the hwmod @oh. 733 * No return value. 734 */ 735 static void _enable_module(struct omap_hwmod *oh) 736 { 737 /* The module mode does not exist prior OMAP4 */ 738 if (cpu_is_omap24xx() || cpu_is_omap34xx()) 739 return; 740 741 if (!oh->clkdm || !oh->prcm.omap4.modulemode) 742 return; 743 744 pr_debug("omap_hwmod: %s: _enable_module: %d\n", 745 oh->name, oh->prcm.omap4.modulemode); 746 747 omap4_cminst_module_enable(oh->prcm.omap4.modulemode, 748 oh->clkdm->prcm_partition, 749 oh->clkdm->cm_inst, 750 oh->clkdm->clkdm_offs, 751 oh->prcm.omap4.clkctrl_offs); 752 } 753 754 /** 755 * _omap4_wait_target_disable - wait for a module to be disabled on OMAP4 756 * @oh: struct omap_hwmod * 757 * 758 * Wait for a module @oh to enter slave idle. Returns 0 if the module 759 * does not have an IDLEST bit or if the module successfully enters 760 * slave idle; otherwise, pass along the return value of the 761 * appropriate *_cm*_wait_module_idle() function. 762 */ 763 static int _omap4_wait_target_disable(struct omap_hwmod *oh) 764 { 765 if (!cpu_is_omap44xx()) 766 return 0; 767 768 if (!oh) 769 return -EINVAL; 770 771 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 772 return 0; 773 774 if (oh->flags & HWMOD_NO_IDLEST) 775 return 0; 776 777 return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition, 778 oh->clkdm->cm_inst, 779 oh->clkdm->clkdm_offs, 780 oh->prcm.omap4.clkctrl_offs); 781 } 782 783 /** 784 * _omap4_disable_module - enable CLKCTRL modulemode on OMAP4 785 * @oh: struct omap_hwmod * 786 * 787 * Disable the PRCM module mode related to the hwmod @oh. 788 * Return EINVAL if the modulemode is not supported and 0 in case of success. 789 */ 790 static int _omap4_disable_module(struct omap_hwmod *oh) 791 { 792 int v; 793 794 /* The module mode does not exist prior OMAP4 */ 795 if (!cpu_is_omap44xx()) 796 return -EINVAL; 797 798 if (!oh->clkdm || !oh->prcm.omap4.modulemode) 799 return -EINVAL; 800 801 pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__); 802 803 omap4_cminst_module_disable(oh->clkdm->prcm_partition, 804 oh->clkdm->cm_inst, 805 oh->clkdm->clkdm_offs, 806 oh->prcm.omap4.clkctrl_offs); 807 808 v = _omap4_wait_target_disable(oh); 809 if (v) 810 pr_warn("omap_hwmod: %s: _wait_target_disable failed\n", 811 oh->name); 812 813 return 0; 814 } 815 816 /** 817 * _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh 818 * @oh: struct omap_hwmod *oh 819 * 820 * Count and return the number of MPU IRQs associated with the hwmod 821 * @oh. Used to allocate struct resource data. Returns 0 if @oh is 822 * NULL. 823 */ 824 static int _count_mpu_irqs(struct omap_hwmod *oh) 825 { 826 struct omap_hwmod_irq_info *ohii; 827 int i = 0; 828 829 if (!oh || !oh->mpu_irqs) 830 return 0; 831 832 do { 833 ohii = &oh->mpu_irqs[i++]; 834 } while (ohii->irq != -1); 835 836 return i-1; 837 } 838 839 /** 840 * _count_sdma_reqs - count the number of SDMA request lines associated with @oh 841 * @oh: struct omap_hwmod *oh 842 * 843 * Count and return the number of SDMA request lines associated with 844 * the hwmod @oh. Used to allocate struct resource data. Returns 0 845 * if @oh is NULL. 846 */ 847 static int _count_sdma_reqs(struct omap_hwmod *oh) 848 { 849 struct omap_hwmod_dma_info *ohdi; 850 int i = 0; 851 852 if (!oh || !oh->sdma_reqs) 853 return 0; 854 855 do { 856 ohdi = &oh->sdma_reqs[i++]; 857 } while (ohdi->dma_req != -1); 858 859 return i-1; 860 } 861 862 /** 863 * _count_ocp_if_addr_spaces - count the number of address space entries for @oh 864 * @oh: struct omap_hwmod *oh 865 * 866 * Count and return the number of address space ranges associated with 867 * the hwmod @oh. Used to allocate struct resource data. Returns 0 868 * if @oh is NULL. 869 */ 870 static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os) 871 { 872 struct omap_hwmod_addr_space *mem; 873 int i = 0; 874 875 if (!os || !os->addr) 876 return 0; 877 878 do { 879 mem = &os->addr[i++]; 880 } while (mem->pa_start != mem->pa_end); 881 882 return i-1; 883 } 884 885 /** 886 * _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use 887 * @oh: struct omap_hwmod * 888 * 889 * Returns the array index of the OCP slave port that the MPU 890 * addresses the device on, or -EINVAL upon error or not found. 891 */ 892 static int __init _find_mpu_port_index(struct omap_hwmod *oh) 893 { 894 int i; 895 int found = 0; 896 897 if (!oh || oh->slaves_cnt == 0) 898 return -EINVAL; 899 900 for (i = 0; i < oh->slaves_cnt; i++) { 901 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 902 903 if (os->user & OCP_USER_MPU) { 904 found = 1; 905 break; 906 } 907 } 908 909 if (found) 910 pr_debug("omap_hwmod: %s: MPU OCP slave port ID %d\n", 911 oh->name, i); 912 else 913 pr_debug("omap_hwmod: %s: no MPU OCP slave port found\n", 914 oh->name); 915 916 return (found) ? i : -EINVAL; 917 } 918 919 /** 920 * _find_mpu_rt_base - find hwmod register target base addr accessible by MPU 921 * @oh: struct omap_hwmod * 922 * 923 * Return the virtual address of the base of the register target of 924 * device @oh, or NULL on error. 925 */ 926 static void __iomem * __init _find_mpu_rt_base(struct omap_hwmod *oh, u8 index) 927 { 928 struct omap_hwmod_ocp_if *os; 929 struct omap_hwmod_addr_space *mem; 930 int i = 0, found = 0; 931 void __iomem *va_start; 932 933 if (!oh || oh->slaves_cnt == 0) 934 return NULL; 935 936 os = oh->slaves[index]; 937 938 if (!os->addr) 939 return NULL; 940 941 do { 942 mem = &os->addr[i++]; 943 if (mem->flags & ADDR_TYPE_RT) 944 found = 1; 945 } while (!found && mem->pa_start != mem->pa_end); 946 947 if (found) { 948 va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start); 949 if (!va_start) { 950 pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); 951 return NULL; 952 } 953 pr_debug("omap_hwmod: %s: MPU register target at va %p\n", 954 oh->name, va_start); 955 } else { 956 pr_debug("omap_hwmod: %s: no MPU register target found\n", 957 oh->name); 958 } 959 960 return (found) ? va_start : NULL; 961 } 962 963 /** 964 * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG 965 * @oh: struct omap_hwmod * 966 * 967 * If module is marked as SWSUP_SIDLE, force the module out of slave 968 * idle; otherwise, configure it for smart-idle. If module is marked 969 * as SWSUP_MSUSPEND, force the module out of master standby; 970 * otherwise, configure it for smart-standby. No return value. 971 */ 972 static void _enable_sysc(struct omap_hwmod *oh) 973 { 974 u8 idlemode, sf; 975 u32 v; 976 977 if (!oh->class->sysc) 978 return; 979 980 v = oh->_sysc_cache; 981 sf = oh->class->sysc->sysc_flags; 982 983 if (sf & SYSC_HAS_SIDLEMODE) { 984 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 985 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; 986 _set_slave_idlemode(oh, idlemode, &v); 987 } 988 989 if (sf & SYSC_HAS_MIDLEMODE) { 990 if (oh->flags & HWMOD_SWSUP_MSTANDBY) { 991 idlemode = HWMOD_IDLEMODE_NO; 992 } else { 993 if (sf & SYSC_HAS_ENAWAKEUP) 994 _enable_wakeup(oh, &v); 995 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) 996 idlemode = HWMOD_IDLEMODE_SMART_WKUP; 997 else 998 idlemode = HWMOD_IDLEMODE_SMART; 999 } 1000 _set_master_standbymode(oh, idlemode, &v); 1001 } 1002 1003 /* 1004 * XXX The clock framework should handle this, by 1005 * calling into this code. But this must wait until the 1006 * clock structures are tagged with omap_hwmod entries 1007 */ 1008 if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) && 1009 (sf & SYSC_HAS_CLOCKACTIVITY)) 1010 _set_clockactivity(oh, oh->class->sysc->clockact, &v); 1011 1012 /* If slave is in SMARTIDLE, also enable wakeup */ 1013 if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) 1014 _enable_wakeup(oh, &v); 1015 1016 _write_sysconfig(v, oh); 1017 1018 /* 1019 * Set the autoidle bit only after setting the smartidle bit 1020 * Setting this will not have any impact on the other modules. 1021 */ 1022 if (sf & SYSC_HAS_AUTOIDLE) { 1023 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ? 1024 0 : 1; 1025 _set_module_autoidle(oh, idlemode, &v); 1026 _write_sysconfig(v, oh); 1027 } 1028 } 1029 1030 /** 1031 * _idle_sysc - try to put a module into idle via OCP_SYSCONFIG 1032 * @oh: struct omap_hwmod * 1033 * 1034 * If module is marked as SWSUP_SIDLE, force the module into slave 1035 * idle; otherwise, configure it for smart-idle. If module is marked 1036 * as SWSUP_MSUSPEND, force the module into master standby; otherwise, 1037 * configure it for smart-standby. No return value. 1038 */ 1039 static void _idle_sysc(struct omap_hwmod *oh) 1040 { 1041 u8 idlemode, sf; 1042 u32 v; 1043 1044 if (!oh->class->sysc) 1045 return; 1046 1047 v = oh->_sysc_cache; 1048 sf = oh->class->sysc->sysc_flags; 1049 1050 if (sf & SYSC_HAS_SIDLEMODE) { 1051 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 1052 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; 1053 _set_slave_idlemode(oh, idlemode, &v); 1054 } 1055 1056 if (sf & SYSC_HAS_MIDLEMODE) { 1057 if (oh->flags & HWMOD_SWSUP_MSTANDBY) { 1058 idlemode = HWMOD_IDLEMODE_FORCE; 1059 } else { 1060 if (sf & SYSC_HAS_ENAWAKEUP) 1061 _enable_wakeup(oh, &v); 1062 if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) 1063 idlemode = HWMOD_IDLEMODE_SMART_WKUP; 1064 else 1065 idlemode = HWMOD_IDLEMODE_SMART; 1066 } 1067 _set_master_standbymode(oh, idlemode, &v); 1068 } 1069 1070 /* If slave is in SMARTIDLE, also enable wakeup */ 1071 if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) 1072 _enable_wakeup(oh, &v); 1073 1074 _write_sysconfig(v, oh); 1075 } 1076 1077 /** 1078 * _shutdown_sysc - force a module into idle via OCP_SYSCONFIG 1079 * @oh: struct omap_hwmod * 1080 * 1081 * Force the module into slave idle and master suspend. No return 1082 * value. 1083 */ 1084 static void _shutdown_sysc(struct omap_hwmod *oh) 1085 { 1086 u32 v; 1087 u8 sf; 1088 1089 if (!oh->class->sysc) 1090 return; 1091 1092 v = oh->_sysc_cache; 1093 sf = oh->class->sysc->sysc_flags; 1094 1095 if (sf & SYSC_HAS_SIDLEMODE) 1096 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v); 1097 1098 if (sf & SYSC_HAS_MIDLEMODE) 1099 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v); 1100 1101 if (sf & SYSC_HAS_AUTOIDLE) 1102 _set_module_autoidle(oh, 1, &v); 1103 1104 _write_sysconfig(v, oh); 1105 } 1106 1107 /** 1108 * _lookup - find an omap_hwmod by name 1109 * @name: find an omap_hwmod by name 1110 * 1111 * Return a pointer to an omap_hwmod by name, or NULL if not found. 1112 */ 1113 static struct omap_hwmod *_lookup(const char *name) 1114 { 1115 struct omap_hwmod *oh, *temp_oh; 1116 1117 oh = NULL; 1118 1119 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 1120 if (!strcmp(name, temp_oh->name)) { 1121 oh = temp_oh; 1122 break; 1123 } 1124 } 1125 1126 return oh; 1127 } 1128 /** 1129 * _init_clkdm - look up a clockdomain name, store pointer in omap_hwmod 1130 * @oh: struct omap_hwmod * 1131 * 1132 * Convert a clockdomain name stored in a struct omap_hwmod into a 1133 * clockdomain pointer, and save it into the struct omap_hwmod. 1134 * return -EINVAL if clkdm_name does not exist or if the lookup failed. 1135 */ 1136 static int _init_clkdm(struct omap_hwmod *oh) 1137 { 1138 if (cpu_is_omap24xx() || cpu_is_omap34xx()) 1139 return 0; 1140 1141 if (!oh->clkdm_name) { 1142 pr_warning("omap_hwmod: %s: no clkdm_name\n", oh->name); 1143 return -EINVAL; 1144 } 1145 1146 oh->clkdm = clkdm_lookup(oh->clkdm_name); 1147 if (!oh->clkdm) { 1148 pr_warning("omap_hwmod: %s: could not associate to clkdm %s\n", 1149 oh->name, oh->clkdm_name); 1150 return -EINVAL; 1151 } 1152 1153 pr_debug("omap_hwmod: %s: associated to clkdm %s\n", 1154 oh->name, oh->clkdm_name); 1155 1156 return 0; 1157 } 1158 1159 /** 1160 * _init_clocks - clk_get() all clocks associated with this hwmod. Retrieve as 1161 * well the clockdomain. 1162 * @oh: struct omap_hwmod * 1163 * @data: not used; pass NULL 1164 * 1165 * Called by omap_hwmod_setup_*() (after omap2_clk_init()). 1166 * Resolves all clock names embedded in the hwmod. Returns 0 on 1167 * success, or a negative error code on failure. 1168 */ 1169 static int _init_clocks(struct omap_hwmod *oh, void *data) 1170 { 1171 int ret = 0; 1172 1173 if (oh->_state != _HWMOD_STATE_REGISTERED) 1174 return 0; 1175 1176 pr_debug("omap_hwmod: %s: looking up clocks\n", oh->name); 1177 1178 ret |= _init_main_clk(oh); 1179 ret |= _init_interface_clks(oh); 1180 ret |= _init_opt_clks(oh); 1181 ret |= _init_clkdm(oh); 1182 1183 if (!ret) 1184 oh->_state = _HWMOD_STATE_CLKS_INITED; 1185 else 1186 pr_warning("omap_hwmod: %s: cannot _init_clocks\n", oh->name); 1187 1188 return ret; 1189 } 1190 1191 /** 1192 * _wait_target_ready - wait for a module to leave slave idle 1193 * @oh: struct omap_hwmod * 1194 * 1195 * Wait for a module @oh to leave slave idle. Returns 0 if the module 1196 * does not have an IDLEST bit or if the module successfully leaves 1197 * slave idle; otherwise, pass along the return value of the 1198 * appropriate *_cm*_wait_module_ready() function. 1199 */ 1200 static int _wait_target_ready(struct omap_hwmod *oh) 1201 { 1202 struct omap_hwmod_ocp_if *os; 1203 int ret; 1204 1205 if (!oh) 1206 return -EINVAL; 1207 1208 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 1209 return 0; 1210 1211 os = oh->slaves[oh->_mpu_port_index]; 1212 1213 if (oh->flags & HWMOD_NO_IDLEST) 1214 return 0; 1215 1216 /* XXX check module SIDLEMODE */ 1217 1218 /* XXX check clock enable states */ 1219 1220 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1221 ret = omap2_cm_wait_module_ready(oh->prcm.omap2.module_offs, 1222 oh->prcm.omap2.idlest_reg_id, 1223 oh->prcm.omap2.idlest_idle_bit); 1224 } else if (cpu_is_omap44xx()) { 1225 if (!oh->clkdm) 1226 return -EINVAL; 1227 1228 ret = omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition, 1229 oh->clkdm->cm_inst, 1230 oh->clkdm->clkdm_offs, 1231 oh->prcm.omap4.clkctrl_offs); 1232 } else { 1233 BUG(); 1234 }; 1235 1236 return ret; 1237 } 1238 1239 /** 1240 * _lookup_hardreset - fill register bit info for this hwmod/reset line 1241 * @oh: struct omap_hwmod * 1242 * @name: name of the reset line in the context of this hwmod 1243 * @ohri: struct omap_hwmod_rst_info * that this function will fill in 1244 * 1245 * Return the bit position of the reset line that match the 1246 * input name. Return -ENOENT if not found. 1247 */ 1248 static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name, 1249 struct omap_hwmod_rst_info *ohri) 1250 { 1251 int i; 1252 1253 for (i = 0; i < oh->rst_lines_cnt; i++) { 1254 const char *rst_line = oh->rst_lines[i].name; 1255 if (!strcmp(rst_line, name)) { 1256 ohri->rst_shift = oh->rst_lines[i].rst_shift; 1257 ohri->st_shift = oh->rst_lines[i].st_shift; 1258 pr_debug("omap_hwmod: %s: %s: %s: rst %d st %d\n", 1259 oh->name, __func__, rst_line, ohri->rst_shift, 1260 ohri->st_shift); 1261 1262 return 0; 1263 } 1264 } 1265 1266 return -ENOENT; 1267 } 1268 1269 /** 1270 * _assert_hardreset - assert the HW reset line of submodules 1271 * contained in the hwmod module. 1272 * @oh: struct omap_hwmod * 1273 * @name: name of the reset line to lookup and assert 1274 * 1275 * Some IP like dsp, ipu or iva contain processor that require 1276 * an HW reset line to be assert / deassert in order to enable fully 1277 * the IP. 1278 */ 1279 static int _assert_hardreset(struct omap_hwmod *oh, const char *name) 1280 { 1281 struct omap_hwmod_rst_info ohri; 1282 u8 ret; 1283 1284 if (!oh) 1285 return -EINVAL; 1286 1287 ret = _lookup_hardreset(oh, name, &ohri); 1288 if (IS_ERR_VALUE(ret)) 1289 return ret; 1290 1291 if (cpu_is_omap24xx() || cpu_is_omap34xx()) 1292 return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, 1293 ohri.rst_shift); 1294 else if (cpu_is_omap44xx()) 1295 return omap4_prminst_assert_hardreset(ohri.rst_shift, 1296 oh->clkdm->pwrdm.ptr->prcm_partition, 1297 oh->clkdm->pwrdm.ptr->prcm_offs, 1298 oh->prcm.omap4.rstctrl_offs); 1299 else 1300 return -EINVAL; 1301 } 1302 1303 /** 1304 * _deassert_hardreset - deassert the HW reset line of submodules contained 1305 * in the hwmod module. 1306 * @oh: struct omap_hwmod * 1307 * @name: name of the reset line to look up and deassert 1308 * 1309 * Some IP like dsp, ipu or iva contain processor that require 1310 * an HW reset line to be assert / deassert in order to enable fully 1311 * the IP. 1312 */ 1313 static int _deassert_hardreset(struct omap_hwmod *oh, const char *name) 1314 { 1315 struct omap_hwmod_rst_info ohri; 1316 int ret; 1317 1318 if (!oh) 1319 return -EINVAL; 1320 1321 ret = _lookup_hardreset(oh, name, &ohri); 1322 if (IS_ERR_VALUE(ret)) 1323 return ret; 1324 1325 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1326 ret = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, 1327 ohri.rst_shift, 1328 ohri.st_shift); 1329 } else if (cpu_is_omap44xx()) { 1330 if (ohri.st_shift) 1331 pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", 1332 oh->name, name); 1333 ret = omap4_prminst_deassert_hardreset(ohri.rst_shift, 1334 oh->clkdm->pwrdm.ptr->prcm_partition, 1335 oh->clkdm->pwrdm.ptr->prcm_offs, 1336 oh->prcm.omap4.rstctrl_offs); 1337 } else { 1338 return -EINVAL; 1339 } 1340 1341 if (ret == -EBUSY) 1342 pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name); 1343 1344 return ret; 1345 } 1346 1347 /** 1348 * _read_hardreset - read the HW reset line state of submodules 1349 * contained in the hwmod module 1350 * @oh: struct omap_hwmod * 1351 * @name: name of the reset line to look up and read 1352 * 1353 * Return the state of the reset line. 1354 */ 1355 static int _read_hardreset(struct omap_hwmod *oh, const char *name) 1356 { 1357 struct omap_hwmod_rst_info ohri; 1358 u8 ret; 1359 1360 if (!oh) 1361 return -EINVAL; 1362 1363 ret = _lookup_hardreset(oh, name, &ohri); 1364 if (IS_ERR_VALUE(ret)) 1365 return ret; 1366 1367 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1368 return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, 1369 ohri.st_shift); 1370 } else if (cpu_is_omap44xx()) { 1371 return omap4_prminst_is_hardreset_asserted(ohri.rst_shift, 1372 oh->clkdm->pwrdm.ptr->prcm_partition, 1373 oh->clkdm->pwrdm.ptr->prcm_offs, 1374 oh->prcm.omap4.rstctrl_offs); 1375 } else { 1376 return -EINVAL; 1377 } 1378 } 1379 1380 /** 1381 * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit 1382 * @oh: struct omap_hwmod * 1383 * 1384 * Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be 1385 * enabled for this to work. Returns -EINVAL if the hwmod cannot be 1386 * reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if 1387 * the module did not reset in time, or 0 upon success. 1388 * 1389 * In OMAP3 a specific SYSSTATUS register is used to get the reset status. 1390 * Starting in OMAP4, some IPs do not have SYSSTATUS registers and instead 1391 * use the SYSCONFIG softreset bit to provide the status. 1392 * 1393 * Note that some IP like McBSP do have reset control but don't have 1394 * reset status. 1395 */ 1396 static int _ocp_softreset(struct omap_hwmod *oh) 1397 { 1398 u32 v, softrst_mask; 1399 int c = 0; 1400 int ret = 0; 1401 1402 if (!oh->class->sysc || 1403 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) 1404 return -EINVAL; 1405 1406 /* clocks must be on for this operation */ 1407 if (oh->_state != _HWMOD_STATE_ENABLED) { 1408 pr_warning("omap_hwmod: %s: reset can only be entered from " 1409 "enabled state\n", oh->name); 1410 return -EINVAL; 1411 } 1412 1413 /* For some modules, all optionnal clocks need to be enabled as well */ 1414 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET) 1415 _enable_optional_clocks(oh); 1416 1417 pr_debug("omap_hwmod: %s: resetting via OCP SOFTRESET\n", oh->name); 1418 1419 v = oh->_sysc_cache; 1420 ret = _set_softreset(oh, &v); 1421 if (ret) 1422 goto dis_opt_clks; 1423 _write_sysconfig(v, oh); 1424 1425 if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS) 1426 omap_test_timeout((omap_hwmod_read(oh, 1427 oh->class->sysc->syss_offs) 1428 & SYSS_RESETDONE_MASK), 1429 MAX_MODULE_SOFTRESET_WAIT, c); 1430 else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) { 1431 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); 1432 omap_test_timeout(!(omap_hwmod_read(oh, 1433 oh->class->sysc->sysc_offs) 1434 & softrst_mask), 1435 MAX_MODULE_SOFTRESET_WAIT, c); 1436 } 1437 1438 if (c == MAX_MODULE_SOFTRESET_WAIT) 1439 pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", 1440 oh->name, MAX_MODULE_SOFTRESET_WAIT); 1441 else 1442 pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c); 1443 1444 /* 1445 * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from 1446 * _wait_target_ready() or _reset() 1447 */ 1448 1449 ret = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0; 1450 1451 dis_opt_clks: 1452 if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET) 1453 _disable_optional_clocks(oh); 1454 1455 return ret; 1456 } 1457 1458 /** 1459 * _reset - reset an omap_hwmod 1460 * @oh: struct omap_hwmod * 1461 * 1462 * Resets an omap_hwmod @oh. The default software reset mechanism for 1463 * most OMAP IP blocks is triggered via the OCP_SYSCONFIG.SOFTRESET 1464 * bit. However, some hwmods cannot be reset via this method: some 1465 * are not targets and therefore have no OCP header registers to 1466 * access; others (like the IVA) have idiosyncratic reset sequences. 1467 * So for these relatively rare cases, custom reset code can be 1468 * supplied in the struct omap_hwmod_class .reset function pointer. 1469 * Passes along the return value from either _reset() or the custom 1470 * reset function - these must return -EINVAL if the hwmod cannot be 1471 * reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if 1472 * the module did not reset in time, or 0 upon success. 1473 */ 1474 static int _reset(struct omap_hwmod *oh) 1475 { 1476 int ret; 1477 1478 pr_debug("omap_hwmod: %s: resetting\n", oh->name); 1479 1480 ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); 1481 1482 if (oh->class->sysc) { 1483 _update_sysc_cache(oh); 1484 _enable_sysc(oh); 1485 } 1486 1487 return ret; 1488 } 1489 1490 /** 1491 * _enable - enable an omap_hwmod 1492 * @oh: struct omap_hwmod * 1493 * 1494 * Enables an omap_hwmod @oh such that the MPU can access the hwmod's 1495 * register target. Returns -EINVAL if the hwmod is in the wrong 1496 * state or passes along the return value of _wait_target_ready(). 1497 */ 1498 static int _enable(struct omap_hwmod *oh) 1499 { 1500 int r; 1501 int hwsup = 0; 1502 1503 pr_debug("omap_hwmod: %s: enabling\n", oh->name); 1504 1505 /* 1506 * hwmods with HWMOD_INIT_NO_IDLE flag set are left 1507 * in enabled state at init. 1508 * Now that someone is really trying to enable them, 1509 * just ensure that the hwmod mux is set. 1510 */ 1511 if (oh->_int_flags & _HWMOD_SKIP_ENABLE) { 1512 /* 1513 * If the caller has mux data populated, do the mux'ing 1514 * which wouldn't have been done as part of the _enable() 1515 * done during setup. 1516 */ 1517 if (oh->mux) 1518 omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); 1519 1520 oh->_int_flags &= ~_HWMOD_SKIP_ENABLE; 1521 return 0; 1522 } 1523 1524 if (oh->_state != _HWMOD_STATE_INITIALIZED && 1525 oh->_state != _HWMOD_STATE_IDLE && 1526 oh->_state != _HWMOD_STATE_DISABLED) { 1527 WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n", 1528 oh->name); 1529 return -EINVAL; 1530 } 1531 1532 1533 /* 1534 * If an IP contains only one HW reset line, then de-assert it in order 1535 * to allow the module state transition. Otherwise the PRCM will return 1536 * Intransition status, and the init will failed. 1537 */ 1538 if ((oh->_state == _HWMOD_STATE_INITIALIZED || 1539 oh->_state == _HWMOD_STATE_DISABLED) && oh->rst_lines_cnt == 1) 1540 _deassert_hardreset(oh, oh->rst_lines[0].name); 1541 1542 /* Mux pins for device runtime if populated */ 1543 if (oh->mux && (!oh->mux->enabled || 1544 ((oh->_state == _HWMOD_STATE_IDLE) && 1545 oh->mux->pads_dynamic))) 1546 omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); 1547 1548 _add_initiator_dep(oh, mpu_oh); 1549 1550 if (oh->clkdm) { 1551 /* 1552 * A clockdomain must be in SW_SUP before enabling 1553 * completely the module. The clockdomain can be set 1554 * in HW_AUTO only when the module become ready. 1555 */ 1556 hwsup = clkdm_in_hwsup(oh->clkdm); 1557 r = clkdm_hwmod_enable(oh->clkdm, oh); 1558 if (r) { 1559 WARN(1, "omap_hwmod: %s: could not enable clockdomain %s: %d\n", 1560 oh->name, oh->clkdm->name, r); 1561 return r; 1562 } 1563 } 1564 1565 _enable_clocks(oh); 1566 _enable_module(oh); 1567 1568 r = _wait_target_ready(oh); 1569 if (!r) { 1570 /* 1571 * Set the clockdomain to HW_AUTO only if the target is ready, 1572 * assuming that the previous state was HW_AUTO 1573 */ 1574 if (oh->clkdm && hwsup) 1575 clkdm_allow_idle(oh->clkdm); 1576 1577 oh->_state = _HWMOD_STATE_ENABLED; 1578 1579 /* Access the sysconfig only if the target is ready */ 1580 if (oh->class->sysc) { 1581 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) 1582 _update_sysc_cache(oh); 1583 _enable_sysc(oh); 1584 } 1585 } else { 1586 _disable_clocks(oh); 1587 pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", 1588 oh->name, r); 1589 1590 if (oh->clkdm) 1591 clkdm_hwmod_disable(oh->clkdm, oh); 1592 } 1593 1594 return r; 1595 } 1596 1597 /** 1598 * _idle - idle an omap_hwmod 1599 * @oh: struct omap_hwmod * 1600 * 1601 * Idles an omap_hwmod @oh. This should be called once the hwmod has 1602 * no further work. Returns -EINVAL if the hwmod is in the wrong 1603 * state or returns 0. 1604 */ 1605 static int _idle(struct omap_hwmod *oh) 1606 { 1607 pr_debug("omap_hwmod: %s: idling\n", oh->name); 1608 1609 if (oh->_state != _HWMOD_STATE_ENABLED) { 1610 WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n", 1611 oh->name); 1612 return -EINVAL; 1613 } 1614 1615 if (oh->class->sysc) 1616 _idle_sysc(oh); 1617 _del_initiator_dep(oh, mpu_oh); 1618 1619 _omap4_disable_module(oh); 1620 1621 /* 1622 * The module must be in idle mode before disabling any parents 1623 * clocks. Otherwise, the parent clock might be disabled before 1624 * the module transition is done, and thus will prevent the 1625 * transition to complete properly. 1626 */ 1627 _disable_clocks(oh); 1628 if (oh->clkdm) 1629 clkdm_hwmod_disable(oh->clkdm, oh); 1630 1631 /* Mux pins for device idle if populated */ 1632 if (oh->mux && oh->mux->pads_dynamic) 1633 omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); 1634 1635 oh->_state = _HWMOD_STATE_IDLE; 1636 1637 return 0; 1638 } 1639 1640 /** 1641 * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit 1642 * @oh: struct omap_hwmod * 1643 * @autoidle: desired AUTOIDLE bitfield value (0 or 1) 1644 * 1645 * Sets the IP block's OCP autoidle bit in hardware, and updates our 1646 * local copy. Intended to be used by drivers that require 1647 * direct manipulation of the AUTOIDLE bits. 1648 * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes 1649 * along the return value from _set_module_autoidle(). 1650 * 1651 * Any users of this function should be scrutinized carefully. 1652 */ 1653 int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) 1654 { 1655 u32 v; 1656 int retval = 0; 1657 unsigned long flags; 1658 1659 if (!oh || oh->_state != _HWMOD_STATE_ENABLED) 1660 return -EINVAL; 1661 1662 spin_lock_irqsave(&oh->_lock, flags); 1663 1664 v = oh->_sysc_cache; 1665 1666 retval = _set_module_autoidle(oh, autoidle, &v); 1667 1668 if (!retval) 1669 _write_sysconfig(v, oh); 1670 1671 spin_unlock_irqrestore(&oh->_lock, flags); 1672 1673 return retval; 1674 } 1675 1676 /** 1677 * _shutdown - shutdown an omap_hwmod 1678 * @oh: struct omap_hwmod * 1679 * 1680 * Shut down an omap_hwmod @oh. This should be called when the driver 1681 * used for the hwmod is removed or unloaded or if the driver is not 1682 * used by the system. Returns -EINVAL if the hwmod is in the wrong 1683 * state or returns 0. 1684 */ 1685 static int _shutdown(struct omap_hwmod *oh) 1686 { 1687 int ret; 1688 u8 prev_state; 1689 1690 if (oh->_state != _HWMOD_STATE_IDLE && 1691 oh->_state != _HWMOD_STATE_ENABLED) { 1692 WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n", 1693 oh->name); 1694 return -EINVAL; 1695 } 1696 1697 pr_debug("omap_hwmod: %s: disabling\n", oh->name); 1698 1699 if (oh->class->pre_shutdown) { 1700 prev_state = oh->_state; 1701 if (oh->_state == _HWMOD_STATE_IDLE) 1702 _enable(oh); 1703 ret = oh->class->pre_shutdown(oh); 1704 if (ret) { 1705 if (prev_state == _HWMOD_STATE_IDLE) 1706 _idle(oh); 1707 return ret; 1708 } 1709 } 1710 1711 if (oh->class->sysc) { 1712 if (oh->_state == _HWMOD_STATE_IDLE) 1713 _enable(oh); 1714 _shutdown_sysc(oh); 1715 } 1716 1717 /* clocks and deps are already disabled in idle */ 1718 if (oh->_state == _HWMOD_STATE_ENABLED) { 1719 _del_initiator_dep(oh, mpu_oh); 1720 /* XXX what about the other system initiators here? dma, dsp */ 1721 _omap4_disable_module(oh); 1722 _disable_clocks(oh); 1723 if (oh->clkdm) 1724 clkdm_hwmod_disable(oh->clkdm, oh); 1725 } 1726 /* XXX Should this code also force-disable the optional clocks? */ 1727 1728 /* 1729 * If an IP contains only one HW reset line, then assert it 1730 * after disabling the clocks and before shutting down the IP. 1731 */ 1732 if (oh->rst_lines_cnt == 1) 1733 _assert_hardreset(oh, oh->rst_lines[0].name); 1734 1735 /* Mux pins to safe mode or use populated off mode values */ 1736 if (oh->mux) 1737 omap_hwmod_mux(oh->mux, _HWMOD_STATE_DISABLED); 1738 1739 oh->_state = _HWMOD_STATE_DISABLED; 1740 1741 return 0; 1742 } 1743 1744 /** 1745 * _setup - do initial configuration of omap_hwmod 1746 * @oh: struct omap_hwmod * 1747 * 1748 * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh 1749 * OCP_SYSCONFIG register. Returns 0. 1750 */ 1751 static int _setup(struct omap_hwmod *oh, void *data) 1752 { 1753 int i, r; 1754 u8 postsetup_state; 1755 1756 if (oh->_state != _HWMOD_STATE_CLKS_INITED) 1757 return 0; 1758 1759 /* Set iclk autoidle mode */ 1760 if (oh->slaves_cnt > 0) { 1761 for (i = 0; i < oh->slaves_cnt; i++) { 1762 struct omap_hwmod_ocp_if *os = oh->slaves[i]; 1763 struct clk *c = os->_clk; 1764 1765 if (!c) 1766 continue; 1767 1768 if (os->flags & OCPIF_SWSUP_IDLE) { 1769 /* XXX omap_iclk_deny_idle(c); */ 1770 } else { 1771 /* XXX omap_iclk_allow_idle(c); */ 1772 clk_enable(c); 1773 } 1774 } 1775 } 1776 1777 oh->_state = _HWMOD_STATE_INITIALIZED; 1778 1779 /* 1780 * In the case of hwmod with hardreset that should not be 1781 * de-assert at boot time, we have to keep the module 1782 * initialized, because we cannot enable it properly with the 1783 * reset asserted. Exit without warning because that behavior is 1784 * expected. 1785 */ 1786 if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt == 1) 1787 return 0; 1788 1789 r = _enable(oh); 1790 if (r) { 1791 pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n", 1792 oh->name, oh->_state); 1793 return 0; 1794 } 1795 1796 if (!(oh->flags & HWMOD_INIT_NO_RESET)) 1797 _reset(oh); 1798 1799 postsetup_state = oh->_postsetup_state; 1800 if (postsetup_state == _HWMOD_STATE_UNKNOWN) 1801 postsetup_state = _HWMOD_STATE_ENABLED; 1802 1803 /* 1804 * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data - 1805 * it should be set by the core code as a runtime flag during startup 1806 */ 1807 if ((oh->flags & HWMOD_INIT_NO_IDLE) && 1808 (postsetup_state == _HWMOD_STATE_IDLE)) { 1809 oh->_int_flags |= _HWMOD_SKIP_ENABLE; 1810 postsetup_state = _HWMOD_STATE_ENABLED; 1811 } 1812 1813 if (postsetup_state == _HWMOD_STATE_IDLE) 1814 _idle(oh); 1815 else if (postsetup_state == _HWMOD_STATE_DISABLED) 1816 _shutdown(oh); 1817 else if (postsetup_state != _HWMOD_STATE_ENABLED) 1818 WARN(1, "hwmod: %s: unknown postsetup state %d! defaulting to enabled\n", 1819 oh->name, postsetup_state); 1820 1821 return 0; 1822 } 1823 1824 /** 1825 * _register - register a struct omap_hwmod 1826 * @oh: struct omap_hwmod * 1827 * 1828 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod 1829 * already has been registered by the same name; -EINVAL if the 1830 * omap_hwmod is in the wrong state, if @oh is NULL, if the 1831 * omap_hwmod's class field is NULL; if the omap_hwmod is missing a 1832 * name, or if the omap_hwmod's class is missing a name; or 0 upon 1833 * success. 1834 * 1835 * XXX The data should be copied into bootmem, so the original data 1836 * should be marked __initdata and freed after init. This would allow 1837 * unneeded omap_hwmods to be freed on multi-OMAP configurations. Note 1838 * that the copy process would be relatively complex due to the large number 1839 * of substructures. 1840 */ 1841 static int __init _register(struct omap_hwmod *oh) 1842 { 1843 int ms_id; 1844 1845 if (!oh || !oh->name || !oh->class || !oh->class->name || 1846 (oh->_state != _HWMOD_STATE_UNKNOWN)) 1847 return -EINVAL; 1848 1849 pr_debug("omap_hwmod: %s: registering\n", oh->name); 1850 1851 if (_lookup(oh->name)) 1852 return -EEXIST; 1853 1854 ms_id = _find_mpu_port_index(oh); 1855 if (!IS_ERR_VALUE(ms_id)) 1856 oh->_mpu_port_index = ms_id; 1857 else 1858 oh->_int_flags |= _HWMOD_NO_MPU_PORT; 1859 1860 list_add_tail(&oh->node, &omap_hwmod_list); 1861 1862 spin_lock_init(&oh->_lock); 1863 1864 oh->_state = _HWMOD_STATE_REGISTERED; 1865 1866 /* 1867 * XXX Rather than doing a strcmp(), this should test a flag 1868 * set in the hwmod data, inserted by the autogenerator code. 1869 */ 1870 if (!strcmp(oh->name, MPU_INITIATOR_NAME)) 1871 mpu_oh = oh; 1872 1873 return 0; 1874 } 1875 1876 1877 /* Public functions */ 1878 1879 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs) 1880 { 1881 if (oh->flags & HWMOD_16BIT_REG) 1882 return __raw_readw(oh->_mpu_rt_va + reg_offs); 1883 else 1884 return __raw_readl(oh->_mpu_rt_va + reg_offs); 1885 } 1886 1887 void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs) 1888 { 1889 if (oh->flags & HWMOD_16BIT_REG) 1890 __raw_writew(v, oh->_mpu_rt_va + reg_offs); 1891 else 1892 __raw_writel(v, oh->_mpu_rt_va + reg_offs); 1893 } 1894 1895 /** 1896 * omap_hwmod_softreset - reset a module via SYSCONFIG.SOFTRESET bit 1897 * @oh: struct omap_hwmod * 1898 * 1899 * This is a public function exposed to drivers. Some drivers may need to do 1900 * some settings before and after resetting the device. Those drivers after 1901 * doing the necessary settings could use this function to start a reset by 1902 * setting the SYSCONFIG.SOFTRESET bit. 1903 */ 1904 int omap_hwmod_softreset(struct omap_hwmod *oh) 1905 { 1906 if (!oh) 1907 return -EINVAL; 1908 1909 return _ocp_softreset(oh); 1910 } 1911 1912 /** 1913 * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode 1914 * @oh: struct omap_hwmod * 1915 * @idlemode: SIDLEMODE field bits (shifted to bit 0) 1916 * 1917 * Sets the IP block's OCP slave idlemode in hardware, and updates our 1918 * local copy. Intended to be used by drivers that have some erratum 1919 * that requires direct manipulation of the SIDLEMODE bits. Returns 1920 * -EINVAL if @oh is null, or passes along the return value from 1921 * _set_slave_idlemode(). 1922 * 1923 * XXX Does this function have any current users? If not, we should 1924 * remove it; it is better to let the rest of the hwmod code handle this. 1925 * Any users of this function should be scrutinized carefully. 1926 */ 1927 int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) 1928 { 1929 u32 v; 1930 int retval = 0; 1931 1932 if (!oh) 1933 return -EINVAL; 1934 1935 v = oh->_sysc_cache; 1936 1937 retval = _set_slave_idlemode(oh, idlemode, &v); 1938 if (!retval) 1939 _write_sysconfig(v, oh); 1940 1941 return retval; 1942 } 1943 1944 /** 1945 * omap_hwmod_lookup - look up a registered omap_hwmod by name 1946 * @name: name of the omap_hwmod to look up 1947 * 1948 * Given a @name of an omap_hwmod, return a pointer to the registered 1949 * struct omap_hwmod *, or NULL upon error. 1950 */ 1951 struct omap_hwmod *omap_hwmod_lookup(const char *name) 1952 { 1953 struct omap_hwmod *oh; 1954 1955 if (!name) 1956 return NULL; 1957 1958 oh = _lookup(name); 1959 1960 return oh; 1961 } 1962 1963 /** 1964 * omap_hwmod_for_each - call function for each registered omap_hwmod 1965 * @fn: pointer to a callback function 1966 * @data: void * data to pass to callback function 1967 * 1968 * Call @fn for each registered omap_hwmod, passing @data to each 1969 * function. @fn must return 0 for success or any other value for 1970 * failure. If @fn returns non-zero, the iteration across omap_hwmods 1971 * will stop and the non-zero return value will be passed to the 1972 * caller of omap_hwmod_for_each(). @fn is called with 1973 * omap_hwmod_for_each() held. 1974 */ 1975 int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data), 1976 void *data) 1977 { 1978 struct omap_hwmod *temp_oh; 1979 int ret = 0; 1980 1981 if (!fn) 1982 return -EINVAL; 1983 1984 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 1985 ret = (*fn)(temp_oh, data); 1986 if (ret) 1987 break; 1988 } 1989 1990 return ret; 1991 } 1992 1993 /** 1994 * omap_hwmod_register - register an array of hwmods 1995 * @ohs: pointer to an array of omap_hwmods to register 1996 * 1997 * Intended to be called early in boot before the clock framework is 1998 * initialized. If @ohs is not null, will register all omap_hwmods 1999 * listed in @ohs that are valid for this chip. Returns 0. 2000 */ 2001 int __init omap_hwmod_register(struct omap_hwmod **ohs) 2002 { 2003 int r, i; 2004 2005 if (!ohs) 2006 return 0; 2007 2008 i = 0; 2009 do { 2010 r = _register(ohs[i]); 2011 WARN(r, "omap_hwmod: %s: _register returned %d\n", ohs[i]->name, 2012 r); 2013 } while (ohs[++i]); 2014 2015 return 0; 2016 } 2017 2018 /* 2019 * _populate_mpu_rt_base - populate the virtual address for a hwmod 2020 * 2021 * Must be called only from omap_hwmod_setup_*() so ioremap works properly. 2022 * Assumes the caller takes care of locking if needed. 2023 */ 2024 static int __init _populate_mpu_rt_base(struct omap_hwmod *oh, void *data) 2025 { 2026 if (oh->_state != _HWMOD_STATE_REGISTERED) 2027 return 0; 2028 2029 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 2030 return 0; 2031 2032 oh->_mpu_rt_va = _find_mpu_rt_base(oh, oh->_mpu_port_index); 2033 2034 return 0; 2035 } 2036 2037 /** 2038 * omap_hwmod_setup_one - set up a single hwmod 2039 * @oh_name: const char * name of the already-registered hwmod to set up 2040 * 2041 * Must be called after omap2_clk_init(). Resolves the struct clk 2042 * names to struct clk pointers for each registered omap_hwmod. Also 2043 * calls _setup() on each hwmod. Returns -EINVAL upon error or 0 upon 2044 * success. 2045 */ 2046 int __init omap_hwmod_setup_one(const char *oh_name) 2047 { 2048 struct omap_hwmod *oh; 2049 int r; 2050 2051 pr_debug("omap_hwmod: %s: %s\n", oh_name, __func__); 2052 2053 if (!mpu_oh) { 2054 pr_err("omap_hwmod: %s: cannot setup_one: MPU initiator hwmod %s not yet registered\n", 2055 oh_name, MPU_INITIATOR_NAME); 2056 return -EINVAL; 2057 } 2058 2059 oh = _lookup(oh_name); 2060 if (!oh) { 2061 WARN(1, "omap_hwmod: %s: hwmod not yet registered\n", oh_name); 2062 return -EINVAL; 2063 } 2064 2065 if (mpu_oh->_state == _HWMOD_STATE_REGISTERED && oh != mpu_oh) 2066 omap_hwmod_setup_one(MPU_INITIATOR_NAME); 2067 2068 r = _populate_mpu_rt_base(oh, NULL); 2069 if (IS_ERR_VALUE(r)) { 2070 WARN(1, "omap_hwmod: %s: couldn't set mpu_rt_base\n", oh_name); 2071 return -EINVAL; 2072 } 2073 2074 r = _init_clocks(oh, NULL); 2075 if (IS_ERR_VALUE(r)) { 2076 WARN(1, "omap_hwmod: %s: couldn't init clocks\n", oh_name); 2077 return -EINVAL; 2078 } 2079 2080 _setup(oh, NULL); 2081 2082 return 0; 2083 } 2084 2085 /** 2086 * omap_hwmod_setup - do some post-clock framework initialization 2087 * 2088 * Must be called after omap2_clk_init(). Resolves the struct clk names 2089 * to struct clk pointers for each registered omap_hwmod. Also calls 2090 * _setup() on each hwmod. Returns 0 upon success. 2091 */ 2092 static int __init omap_hwmod_setup_all(void) 2093 { 2094 int r; 2095 2096 if (!mpu_oh) { 2097 pr_err("omap_hwmod: %s: MPU initiator hwmod %s not yet registered\n", 2098 __func__, MPU_INITIATOR_NAME); 2099 return -EINVAL; 2100 } 2101 2102 r = omap_hwmod_for_each(_populate_mpu_rt_base, NULL); 2103 2104 r = omap_hwmod_for_each(_init_clocks, NULL); 2105 WARN(IS_ERR_VALUE(r), 2106 "omap_hwmod: %s: _init_clocks failed\n", __func__); 2107 2108 omap_hwmod_for_each(_setup, NULL); 2109 2110 return 0; 2111 } 2112 core_initcall(omap_hwmod_setup_all); 2113 2114 /** 2115 * omap_hwmod_enable - enable an omap_hwmod 2116 * @oh: struct omap_hwmod * 2117 * 2118 * Enable an omap_hwmod @oh. Intended to be called by omap_device_enable(). 2119 * Returns -EINVAL on error or passes along the return value from _enable(). 2120 */ 2121 int omap_hwmod_enable(struct omap_hwmod *oh) 2122 { 2123 int r; 2124 unsigned long flags; 2125 2126 if (!oh) 2127 return -EINVAL; 2128 2129 spin_lock_irqsave(&oh->_lock, flags); 2130 r = _enable(oh); 2131 spin_unlock_irqrestore(&oh->_lock, flags); 2132 2133 return r; 2134 } 2135 2136 /** 2137 * omap_hwmod_idle - idle an omap_hwmod 2138 * @oh: struct omap_hwmod * 2139 * 2140 * Idle an omap_hwmod @oh. Intended to be called by omap_device_idle(). 2141 * Returns -EINVAL on error or passes along the return value from _idle(). 2142 */ 2143 int omap_hwmod_idle(struct omap_hwmod *oh) 2144 { 2145 unsigned long flags; 2146 2147 if (!oh) 2148 return -EINVAL; 2149 2150 spin_lock_irqsave(&oh->_lock, flags); 2151 _idle(oh); 2152 spin_unlock_irqrestore(&oh->_lock, flags); 2153 2154 return 0; 2155 } 2156 2157 /** 2158 * omap_hwmod_shutdown - shutdown an omap_hwmod 2159 * @oh: struct omap_hwmod * 2160 * 2161 * Shutdown an omap_hwmod @oh. Intended to be called by 2162 * omap_device_shutdown(). Returns -EINVAL on error or passes along 2163 * the return value from _shutdown(). 2164 */ 2165 int omap_hwmod_shutdown(struct omap_hwmod *oh) 2166 { 2167 unsigned long flags; 2168 2169 if (!oh) 2170 return -EINVAL; 2171 2172 spin_lock_irqsave(&oh->_lock, flags); 2173 _shutdown(oh); 2174 spin_unlock_irqrestore(&oh->_lock, flags); 2175 2176 return 0; 2177 } 2178 2179 /** 2180 * omap_hwmod_enable_clocks - enable main_clk, all interface clocks 2181 * @oh: struct omap_hwmod *oh 2182 * 2183 * Intended to be called by the omap_device code. 2184 */ 2185 int omap_hwmod_enable_clocks(struct omap_hwmod *oh) 2186 { 2187 unsigned long flags; 2188 2189 spin_lock_irqsave(&oh->_lock, flags); 2190 _enable_clocks(oh); 2191 spin_unlock_irqrestore(&oh->_lock, flags); 2192 2193 return 0; 2194 } 2195 2196 /** 2197 * omap_hwmod_disable_clocks - disable main_clk, all interface clocks 2198 * @oh: struct omap_hwmod *oh 2199 * 2200 * Intended to be called by the omap_device code. 2201 */ 2202 int omap_hwmod_disable_clocks(struct omap_hwmod *oh) 2203 { 2204 unsigned long flags; 2205 2206 spin_lock_irqsave(&oh->_lock, flags); 2207 _disable_clocks(oh); 2208 spin_unlock_irqrestore(&oh->_lock, flags); 2209 2210 return 0; 2211 } 2212 2213 /** 2214 * omap_hwmod_ocp_barrier - wait for posted writes against the hwmod to complete 2215 * @oh: struct omap_hwmod *oh 2216 * 2217 * Intended to be called by drivers and core code when all posted 2218 * writes to a device must complete before continuing further 2219 * execution (for example, after clearing some device IRQSTATUS 2220 * register bits) 2221 * 2222 * XXX what about targets with multiple OCP threads? 2223 */ 2224 void omap_hwmod_ocp_barrier(struct omap_hwmod *oh) 2225 { 2226 BUG_ON(!oh); 2227 2228 if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { 2229 WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n", 2230 oh->name); 2231 return; 2232 } 2233 2234 /* 2235 * Forces posted writes to complete on the OCP thread handling 2236 * register writes 2237 */ 2238 omap_hwmod_read(oh, oh->class->sysc->sysc_offs); 2239 } 2240 2241 /** 2242 * omap_hwmod_reset - reset the hwmod 2243 * @oh: struct omap_hwmod * 2244 * 2245 * Under some conditions, a driver may wish to reset the entire device. 2246 * Called from omap_device code. Returns -EINVAL on error or passes along 2247 * the return value from _reset(). 2248 */ 2249 int omap_hwmod_reset(struct omap_hwmod *oh) 2250 { 2251 int r; 2252 unsigned long flags; 2253 2254 if (!oh) 2255 return -EINVAL; 2256 2257 spin_lock_irqsave(&oh->_lock, flags); 2258 r = _reset(oh); 2259 spin_unlock_irqrestore(&oh->_lock, flags); 2260 2261 return r; 2262 } 2263 2264 /** 2265 * omap_hwmod_count_resources - count number of struct resources needed by hwmod 2266 * @oh: struct omap_hwmod * 2267 * @res: pointer to the first element of an array of struct resource to fill 2268 * 2269 * Count the number of struct resource array elements necessary to 2270 * contain omap_hwmod @oh resources. Intended to be called by code 2271 * that registers omap_devices. Intended to be used to determine the 2272 * size of a dynamically-allocated struct resource array, before 2273 * calling omap_hwmod_fill_resources(). Returns the number of struct 2274 * resource array elements needed. 2275 * 2276 * XXX This code is not optimized. It could attempt to merge adjacent 2277 * resource IDs. 2278 * 2279 */ 2280 int omap_hwmod_count_resources(struct omap_hwmod *oh) 2281 { 2282 int ret, i; 2283 2284 ret = _count_mpu_irqs(oh) + _count_sdma_reqs(oh); 2285 2286 for (i = 0; i < oh->slaves_cnt; i++) 2287 ret += _count_ocp_if_addr_spaces(oh->slaves[i]); 2288 2289 return ret; 2290 } 2291 2292 /** 2293 * omap_hwmod_fill_resources - fill struct resource array with hwmod data 2294 * @oh: struct omap_hwmod * 2295 * @res: pointer to the first element of an array of struct resource to fill 2296 * 2297 * Fill the struct resource array @res with resource data from the 2298 * omap_hwmod @oh. Intended to be called by code that registers 2299 * omap_devices. See also omap_hwmod_count_resources(). Returns the 2300 * number of array elements filled. 2301 */ 2302 int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) 2303 { 2304 int i, j, mpu_irqs_cnt, sdma_reqs_cnt; 2305 int r = 0; 2306 2307 /* For each IRQ, DMA, memory area, fill in array.*/ 2308 2309 mpu_irqs_cnt = _count_mpu_irqs(oh); 2310 for (i = 0; i < mpu_irqs_cnt; i++) { 2311 (res + r)->name = (oh->mpu_irqs + i)->name; 2312 (res + r)->start = (oh->mpu_irqs + i)->irq; 2313 (res + r)->end = (oh->mpu_irqs + i)->irq; 2314 (res + r)->flags = IORESOURCE_IRQ; 2315 r++; 2316 } 2317 2318 sdma_reqs_cnt = _count_sdma_reqs(oh); 2319 for (i = 0; i < sdma_reqs_cnt; i++) { 2320 (res + r)->name = (oh->sdma_reqs + i)->name; 2321 (res + r)->start = (oh->sdma_reqs + i)->dma_req; 2322 (res + r)->end = (oh->sdma_reqs + i)->dma_req; 2323 (res + r)->flags = IORESOURCE_DMA; 2324 r++; 2325 } 2326 2327 for (i = 0; i < oh->slaves_cnt; i++) { 2328 struct omap_hwmod_ocp_if *os; 2329 int addr_cnt; 2330 2331 os = oh->slaves[i]; 2332 addr_cnt = _count_ocp_if_addr_spaces(os); 2333 2334 for (j = 0; j < addr_cnt; j++) { 2335 (res + r)->name = (os->addr + j)->name; 2336 (res + r)->start = (os->addr + j)->pa_start; 2337 (res + r)->end = (os->addr + j)->pa_end; 2338 (res + r)->flags = IORESOURCE_MEM; 2339 r++; 2340 } 2341 } 2342 2343 return r; 2344 } 2345 2346 /** 2347 * omap_hwmod_get_pwrdm - return pointer to this module's main powerdomain 2348 * @oh: struct omap_hwmod * 2349 * 2350 * Return the powerdomain pointer associated with the OMAP module 2351 * @oh's main clock. If @oh does not have a main clk, return the 2352 * powerdomain associated with the interface clock associated with the 2353 * module's MPU port. (XXX Perhaps this should use the SDMA port 2354 * instead?) Returns NULL on error, or a struct powerdomain * on 2355 * success. 2356 */ 2357 struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh) 2358 { 2359 struct clk *c; 2360 2361 if (!oh) 2362 return NULL; 2363 2364 if (oh->_clk) { 2365 c = oh->_clk; 2366 } else { 2367 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 2368 return NULL; 2369 c = oh->slaves[oh->_mpu_port_index]->_clk; 2370 } 2371 2372 if (!c->clkdm) 2373 return NULL; 2374 2375 return c->clkdm->pwrdm.ptr; 2376 2377 } 2378 2379 /** 2380 * omap_hwmod_get_mpu_rt_va - return the module's base address (for the MPU) 2381 * @oh: struct omap_hwmod * 2382 * 2383 * Returns the virtual address corresponding to the beginning of the 2384 * module's register target, in the address range that is intended to 2385 * be used by the MPU. Returns the virtual address upon success or NULL 2386 * upon error. 2387 */ 2388 void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh) 2389 { 2390 if (!oh) 2391 return NULL; 2392 2393 if (oh->_int_flags & _HWMOD_NO_MPU_PORT) 2394 return NULL; 2395 2396 if (oh->_state == _HWMOD_STATE_UNKNOWN) 2397 return NULL; 2398 2399 return oh->_mpu_rt_va; 2400 } 2401 2402 /** 2403 * omap_hwmod_add_initiator_dep - add sleepdep from @init_oh to @oh 2404 * @oh: struct omap_hwmod * 2405 * @init_oh: struct omap_hwmod * (initiator) 2406 * 2407 * Add a sleep dependency between the initiator @init_oh and @oh. 2408 * Intended to be called by DSP/Bridge code via platform_data for the 2409 * DSP case; and by the DMA code in the sDMA case. DMA code, *Bridge 2410 * code needs to add/del initiator dependencies dynamically 2411 * before/after accessing a device. Returns the return value from 2412 * _add_initiator_dep(). 2413 * 2414 * XXX Keep a usecount in the clockdomain code 2415 */ 2416 int omap_hwmod_add_initiator_dep(struct omap_hwmod *oh, 2417 struct omap_hwmod *init_oh) 2418 { 2419 return _add_initiator_dep(oh, init_oh); 2420 } 2421 2422 /* 2423 * XXX what about functions for drivers to save/restore ocp_sysconfig 2424 * for context save/restore operations? 2425 */ 2426 2427 /** 2428 * omap_hwmod_del_initiator_dep - remove sleepdep from @init_oh to @oh 2429 * @oh: struct omap_hwmod * 2430 * @init_oh: struct omap_hwmod * (initiator) 2431 * 2432 * Remove a sleep dependency between the initiator @init_oh and @oh. 2433 * Intended to be called by DSP/Bridge code via platform_data for the 2434 * DSP case; and by the DMA code in the sDMA case. DMA code, *Bridge 2435 * code needs to add/del initiator dependencies dynamically 2436 * before/after accessing a device. Returns the return value from 2437 * _del_initiator_dep(). 2438 * 2439 * XXX Keep a usecount in the clockdomain code 2440 */ 2441 int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh, 2442 struct omap_hwmod *init_oh) 2443 { 2444 return _del_initiator_dep(oh, init_oh); 2445 } 2446 2447 /** 2448 * omap_hwmod_enable_wakeup - allow device to wake up the system 2449 * @oh: struct omap_hwmod * 2450 * 2451 * Sets the module OCP socket ENAWAKEUP bit to allow the module to 2452 * send wakeups to the PRCM, and enable I/O ring wakeup events for 2453 * this IP block if it has dynamic mux entries. Eventually this 2454 * should set PRCM wakeup registers to cause the PRCM to receive 2455 * wakeup events from the module. Does not set any wakeup routing 2456 * registers beyond this point - if the module is to wake up any other 2457 * module or subsystem, that must be set separately. Called by 2458 * omap_device code. Returns -EINVAL on error or 0 upon success. 2459 */ 2460 int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) 2461 { 2462 unsigned long flags; 2463 u32 v; 2464 2465 spin_lock_irqsave(&oh->_lock, flags); 2466 2467 if (oh->class->sysc && 2468 (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { 2469 v = oh->_sysc_cache; 2470 _enable_wakeup(oh, &v); 2471 _write_sysconfig(v, oh); 2472 } 2473 2474 _set_idle_ioring_wakeup(oh, true); 2475 spin_unlock_irqrestore(&oh->_lock, flags); 2476 2477 return 0; 2478 } 2479 2480 /** 2481 * omap_hwmod_disable_wakeup - prevent device from waking the system 2482 * @oh: struct omap_hwmod * 2483 * 2484 * Clears the module OCP socket ENAWAKEUP bit to prevent the module 2485 * from sending wakeups to the PRCM, and disable I/O ring wakeup 2486 * events for this IP block if it has dynamic mux entries. Eventually 2487 * this should clear PRCM wakeup registers to cause the PRCM to ignore 2488 * wakeup events from the module. Does not set any wakeup routing 2489 * registers beyond this point - if the module is to wake up any other 2490 * module or subsystem, that must be set separately. Called by 2491 * omap_device code. Returns -EINVAL on error or 0 upon success. 2492 */ 2493 int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) 2494 { 2495 unsigned long flags; 2496 u32 v; 2497 2498 spin_lock_irqsave(&oh->_lock, flags); 2499 2500 if (oh->class->sysc && 2501 (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { 2502 v = oh->_sysc_cache; 2503 _disable_wakeup(oh, &v); 2504 _write_sysconfig(v, oh); 2505 } 2506 2507 _set_idle_ioring_wakeup(oh, false); 2508 spin_unlock_irqrestore(&oh->_lock, flags); 2509 2510 return 0; 2511 } 2512 2513 /** 2514 * omap_hwmod_assert_hardreset - assert the HW reset line of submodules 2515 * contained in the hwmod module. 2516 * @oh: struct omap_hwmod * 2517 * @name: name of the reset line to lookup and assert 2518 * 2519 * Some IP like dsp, ipu or iva contain processor that require 2520 * an HW reset line to be assert / deassert in order to enable fully 2521 * the IP. Returns -EINVAL if @oh is null or if the operation is not 2522 * yet supported on this OMAP; otherwise, passes along the return value 2523 * from _assert_hardreset(). 2524 */ 2525 int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name) 2526 { 2527 int ret; 2528 unsigned long flags; 2529 2530 if (!oh) 2531 return -EINVAL; 2532 2533 spin_lock_irqsave(&oh->_lock, flags); 2534 ret = _assert_hardreset(oh, name); 2535 spin_unlock_irqrestore(&oh->_lock, flags); 2536 2537 return ret; 2538 } 2539 2540 /** 2541 * omap_hwmod_deassert_hardreset - deassert the HW reset line of submodules 2542 * contained in the hwmod module. 2543 * @oh: struct omap_hwmod * 2544 * @name: name of the reset line to look up and deassert 2545 * 2546 * Some IP like dsp, ipu or iva contain processor that require 2547 * an HW reset line to be assert / deassert in order to enable fully 2548 * the IP. Returns -EINVAL if @oh is null or if the operation is not 2549 * yet supported on this OMAP; otherwise, passes along the return value 2550 * from _deassert_hardreset(). 2551 */ 2552 int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name) 2553 { 2554 int ret; 2555 unsigned long flags; 2556 2557 if (!oh) 2558 return -EINVAL; 2559 2560 spin_lock_irqsave(&oh->_lock, flags); 2561 ret = _deassert_hardreset(oh, name); 2562 spin_unlock_irqrestore(&oh->_lock, flags); 2563 2564 return ret; 2565 } 2566 2567 /** 2568 * omap_hwmod_read_hardreset - read the HW reset line state of submodules 2569 * contained in the hwmod module 2570 * @oh: struct omap_hwmod * 2571 * @name: name of the reset line to look up and read 2572 * 2573 * Return the current state of the hwmod @oh's reset line named @name: 2574 * returns -EINVAL upon parameter error or if this operation 2575 * is unsupported on the current OMAP; otherwise, passes along the return 2576 * value from _read_hardreset(). 2577 */ 2578 int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name) 2579 { 2580 int ret; 2581 unsigned long flags; 2582 2583 if (!oh) 2584 return -EINVAL; 2585 2586 spin_lock_irqsave(&oh->_lock, flags); 2587 ret = _read_hardreset(oh, name); 2588 spin_unlock_irqrestore(&oh->_lock, flags); 2589 2590 return ret; 2591 } 2592 2593 2594 /** 2595 * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname 2596 * @classname: struct omap_hwmod_class name to search for 2597 * @fn: callback function pointer to call for each hwmod in class @classname 2598 * @user: arbitrary context data to pass to the callback function 2599 * 2600 * For each omap_hwmod of class @classname, call @fn. 2601 * If the callback function returns something other than 2602 * zero, the iterator is terminated, and the callback function's return 2603 * value is passed back to the caller. Returns 0 upon success, -EINVAL 2604 * if @classname or @fn are NULL, or passes back the error code from @fn. 2605 */ 2606 int omap_hwmod_for_each_by_class(const char *classname, 2607 int (*fn)(struct omap_hwmod *oh, 2608 void *user), 2609 void *user) 2610 { 2611 struct omap_hwmod *temp_oh; 2612 int ret = 0; 2613 2614 if (!classname || !fn) 2615 return -EINVAL; 2616 2617 pr_debug("omap_hwmod: %s: looking for modules of class %s\n", 2618 __func__, classname); 2619 2620 list_for_each_entry(temp_oh, &omap_hwmod_list, node) { 2621 if (!strcmp(temp_oh->class->name, classname)) { 2622 pr_debug("omap_hwmod: %s: %s: calling callback fn\n", 2623 __func__, temp_oh->name); 2624 ret = (*fn)(temp_oh, user); 2625 if (ret) 2626 break; 2627 } 2628 } 2629 2630 if (ret) 2631 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n", 2632 __func__, ret); 2633 2634 return ret; 2635 } 2636 2637 /** 2638 * omap_hwmod_set_postsetup_state - set the post-_setup() state for this hwmod 2639 * @oh: struct omap_hwmod * 2640 * @state: state that _setup() should leave the hwmod in 2641 * 2642 * Sets the hwmod state that @oh will enter at the end of _setup() 2643 * (called by omap_hwmod_setup_*()). Only valid to call between 2644 * calling omap_hwmod_register() and omap_hwmod_setup_*(). Returns 2645 * 0 upon success or -EINVAL if there is a problem with the arguments 2646 * or if the hwmod is in the wrong state. 2647 */ 2648 int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state) 2649 { 2650 int ret; 2651 unsigned long flags; 2652 2653 if (!oh) 2654 return -EINVAL; 2655 2656 if (state != _HWMOD_STATE_DISABLED && 2657 state != _HWMOD_STATE_ENABLED && 2658 state != _HWMOD_STATE_IDLE) 2659 return -EINVAL; 2660 2661 spin_lock_irqsave(&oh->_lock, flags); 2662 2663 if (oh->_state != _HWMOD_STATE_REGISTERED) { 2664 ret = -EINVAL; 2665 goto ohsps_unlock; 2666 } 2667 2668 oh->_postsetup_state = state; 2669 ret = 0; 2670 2671 ohsps_unlock: 2672 spin_unlock_irqrestore(&oh->_lock, flags); 2673 2674 return ret; 2675 } 2676 2677 /** 2678 * omap_hwmod_get_context_loss_count - get lost context count 2679 * @oh: struct omap_hwmod * 2680 * 2681 * Query the powerdomain of of @oh to get the context loss 2682 * count for this device. 2683 * 2684 * Returns the context loss count of the powerdomain assocated with @oh 2685 * upon success, or zero if no powerdomain exists for @oh. 2686 */ 2687 int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) 2688 { 2689 struct powerdomain *pwrdm; 2690 int ret = 0; 2691 2692 pwrdm = omap_hwmod_get_pwrdm(oh); 2693 if (pwrdm) 2694 ret = pwrdm_get_context_loss_count(pwrdm); 2695 2696 return ret; 2697 } 2698 2699 /** 2700 * omap_hwmod_no_setup_reset - prevent a hwmod from being reset upon setup 2701 * @oh: struct omap_hwmod * 2702 * 2703 * Prevent the hwmod @oh from being reset during the setup process. 2704 * Intended for use by board-*.c files on boards with devices that 2705 * cannot tolerate being reset. Must be called before the hwmod has 2706 * been set up. Returns 0 upon success or negative error code upon 2707 * failure. 2708 */ 2709 int omap_hwmod_no_setup_reset(struct omap_hwmod *oh) 2710 { 2711 if (!oh) 2712 return -EINVAL; 2713 2714 if (oh->_state != _HWMOD_STATE_REGISTERED) { 2715 pr_err("omap_hwmod: %s: cannot prevent setup reset; in wrong state\n", 2716 oh->name); 2717 return -EINVAL; 2718 } 2719 2720 oh->flags |= HWMOD_INIT_NO_RESET; 2721 2722 return 0; 2723 } 2724 2725 /** 2726 * omap_hwmod_pad_route_irq - route an I/O pad wakeup to a particular MPU IRQ 2727 * @oh: struct omap_hwmod * containing hwmod mux entries 2728 * @pad_idx: array index in oh->mux of the hwmod mux entry to route wakeup 2729 * @irq_idx: the hwmod mpu_irqs array index of the IRQ to trigger on wakeup 2730 * 2731 * When an I/O pad wakeup arrives for the dynamic or wakeup hwmod mux 2732 * entry number @pad_idx for the hwmod @oh, trigger the interrupt 2733 * service routine for the hwmod's mpu_irqs array index @irq_idx. If 2734 * this function is not called for a given pad_idx, then the ISR 2735 * associated with @oh's first MPU IRQ will be triggered when an I/O 2736 * pad wakeup occurs on that pad. Note that @pad_idx is the index of 2737 * the _dynamic or wakeup_ entry: if there are other entries not 2738 * marked with OMAP_DEVICE_PAD_WAKEUP or OMAP_DEVICE_PAD_REMUX, these 2739 * entries are NOT COUNTED in the dynamic pad index. This function 2740 * must be called separately for each pad that requires its interrupt 2741 * to be re-routed this way. Returns -EINVAL if there is an argument 2742 * problem or if @oh does not have hwmod mux entries or MPU IRQs; 2743 * returns -ENOMEM if memory cannot be allocated; or 0 upon success. 2744 * 2745 * XXX This function interface is fragile. Rather than using array 2746 * indexes, which are subject to unpredictable change, it should be 2747 * using hwmod IRQ names, and some other stable key for the hwmod mux 2748 * pad records. 2749 */ 2750 int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx) 2751 { 2752 int nr_irqs; 2753 2754 might_sleep(); 2755 2756 if (!oh || !oh->mux || !oh->mpu_irqs || pad_idx < 0 || 2757 pad_idx >= oh->mux->nr_pads_dynamic) 2758 return -EINVAL; 2759 2760 /* Check the number of available mpu_irqs */ 2761 for (nr_irqs = 0; oh->mpu_irqs[nr_irqs].irq >= 0; nr_irqs++) 2762 ; 2763 2764 if (irq_idx >= nr_irqs) 2765 return -EINVAL; 2766 2767 if (!oh->mux->irqs) { 2768 /* XXX What frees this? */ 2769 oh->mux->irqs = kzalloc(sizeof(int) * oh->mux->nr_pads_dynamic, 2770 GFP_KERNEL); 2771 if (!oh->mux->irqs) 2772 return -ENOMEM; 2773 } 2774 oh->mux->irqs[pad_idx] = irq_idx; 2775 2776 return 0; 2777 } 2778