1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * OMAP Remote Processor driver 4 * 5 * Copyright (C) 2011-2020 Texas Instruments Incorporated - http://www.ti.com/ 6 * Copyright (C) 2011 Google, Inc. 7 * 8 * Ohad Ben-Cohen <ohad@wizery.com> 9 * Brian Swetland <swetland@google.com> 10 * Fernando Guzman Lugo <fernando.lugo@ti.com> 11 * Mark Grosen <mgrosen@ti.com> 12 * Suman Anna <s-anna@ti.com> 13 * Hari Kanigeri <h-kanigeri2@ti.com> 14 */ 15 16 #include <linux/kernel.h> 17 #include <linux/module.h> 18 #include <linux/clk.h> 19 #include <linux/clk/ti.h> 20 #include <linux/err.h> 21 #include <linux/io.h> 22 #include <linux/of.h> 23 #include <linux/of_platform.h> 24 #include <linux/of_reserved_mem.h> 25 #include <linux/platform_device.h> 26 #include <linux/pm_runtime.h> 27 #include <linux/dma-mapping.h> 28 #include <linux/interrupt.h> 29 #include <linux/remoteproc.h> 30 #include <linux/mailbox_client.h> 31 #include <linux/omap-iommu.h> 32 #include <linux/omap-mailbox.h> 33 #include <linux/regmap.h> 34 #include <linux/mfd/syscon.h> 35 #include <linux/reset.h> 36 #include <clocksource/timer-ti-dm.h> 37 38 #include <linux/platform_data/dmtimer-omap.h> 39 40 #ifdef CONFIG_ARM_DMA_USE_IOMMU 41 #include <asm/dma-iommu.h> 42 #endif 43 44 #include "omap_remoteproc.h" 45 #include "remoteproc_internal.h" 46 47 /* default auto-suspend delay (ms) */ 48 #define DEFAULT_AUTOSUSPEND_DELAY 10000 49 50 /** 51 * struct omap_rproc_boot_data - boot data structure for the DSP omap rprocs 52 * @syscon: regmap handle for the system control configuration module 53 * @boot_reg: boot register offset within the @syscon regmap 54 * @boot_reg_shift: bit-field shift required for the boot address value in 55 * @boot_reg 56 */ 57 struct omap_rproc_boot_data { 58 struct regmap *syscon; 59 unsigned int boot_reg; 60 unsigned int boot_reg_shift; 61 }; 62 63 /** 64 * struct omap_rproc_mem - internal memory structure 65 * @cpu_addr: MPU virtual address of the memory region 66 * @bus_addr: bus address used to access the memory region 67 * @dev_addr: device address of the memory region from DSP view 68 * @size: size of the memory region 69 */ 70 struct omap_rproc_mem { 71 void __iomem *cpu_addr; 72 phys_addr_t bus_addr; 73 u32 dev_addr; 74 size_t size; 75 }; 76 77 /** 78 * struct omap_rproc_timer - data structure for a timer used by a omap rproc 79 * @odt: timer pointer 80 * @timer_ops: OMAP dmtimer ops for @odt timer 81 * @irq: timer irq 82 */ 83 struct omap_rproc_timer { 84 struct omap_dm_timer *odt; 85 const struct omap_dm_timer_ops *timer_ops; 86 int irq; 87 }; 88 89 /** 90 * struct omap_rproc - omap remote processor state 91 * @mbox: mailbox channel handle 92 * @client: mailbox client to request the mailbox channel 93 * @boot_data: boot data structure for setting processor boot address 94 * @mem: internal memory regions data 95 * @num_mems: number of internal memory regions 96 * @num_timers: number of rproc timer(s) 97 * @num_wd_timers: number of rproc watchdog timers 98 * @timers: timer(s) info used by rproc 99 * @autosuspend_delay: auto-suspend delay value to be used for runtime pm 100 * @need_resume: if true a resume is needed in the system resume callback 101 * @rproc: rproc handle 102 * @reset: reset handle 103 * @pm_comp: completion primitive to sync for suspend response 104 * @fck: functional clock for the remoteproc 105 * @suspend_acked: state machine flag to store the suspend request ack 106 */ 107 struct omap_rproc { 108 struct mbox_chan *mbox; 109 struct mbox_client client; 110 struct omap_rproc_boot_data *boot_data; 111 struct omap_rproc_mem *mem; 112 int num_mems; 113 int num_timers; 114 int num_wd_timers; 115 struct omap_rproc_timer *timers; 116 int autosuspend_delay; 117 bool need_resume; 118 struct rproc *rproc; 119 struct reset_control *reset; 120 struct completion pm_comp; 121 struct clk *fck; 122 bool suspend_acked; 123 }; 124 125 /** 126 * struct omap_rproc_mem_data - memory definitions for an omap remote processor 127 * @name: name for this memory entry 128 * @dev_addr: device address for the memory entry 129 */ 130 struct omap_rproc_mem_data { 131 const char *name; 132 const u32 dev_addr; 133 }; 134 135 /** 136 * struct omap_rproc_dev_data - device data for the omap remote processor 137 * @device_name: device name of the remote processor 138 * @mems: memory definitions for this remote processor 139 */ 140 struct omap_rproc_dev_data { 141 const char *device_name; 142 const struct omap_rproc_mem_data *mems; 143 }; 144 145 /** 146 * omap_rproc_request_timer() - request a timer for a remoteproc 147 * @dev: device requesting the timer 148 * @np: device node pointer to the desired timer 149 * @timer: handle to a struct omap_rproc_timer to return the timer handle 150 * 151 * This helper function is used primarily to request a timer associated with 152 * a remoteproc. The returned handle is stored in the .odt field of the 153 * @timer structure passed in, and is used to invoke other timer specific 154 * ops (like starting a timer either during device initialization or during 155 * a resume operation, or for stopping/freeing a timer). 156 * 157 * Return: 0 on success, otherwise an appropriate failure 158 */ 159 static int omap_rproc_request_timer(struct device *dev, struct device_node *np, 160 struct omap_rproc_timer *timer) 161 { 162 int ret; 163 164 timer->odt = timer->timer_ops->request_by_node(np); 165 if (!timer->odt) { 166 dev_err(dev, "request for timer node %p failed\n", np); 167 return -EBUSY; 168 } 169 170 ret = timer->timer_ops->set_source(timer->odt, OMAP_TIMER_SRC_SYS_CLK); 171 if (ret) { 172 dev_err(dev, "error setting OMAP_TIMER_SRC_SYS_CLK as source for timer node %p\n", 173 np); 174 timer->timer_ops->free(timer->odt); 175 return ret; 176 } 177 178 /* clean counter, remoteproc code will set the value */ 179 timer->timer_ops->set_load(timer->odt, 0); 180 181 return 0; 182 } 183 184 /** 185 * omap_rproc_start_timer() - start a timer for a remoteproc 186 * @timer: handle to a OMAP rproc timer 187 * 188 * This helper function is used to start a timer associated with a remoteproc, 189 * obtained using the request_timer ops. The helper function needs to be 190 * invoked by the driver to start the timer (during device initialization) 191 * or to just resume the timer. 192 * 193 * Return: 0 on success, otherwise a failure as returned by DMTimer ops 194 */ 195 static inline int omap_rproc_start_timer(struct omap_rproc_timer *timer) 196 { 197 return timer->timer_ops->start(timer->odt); 198 } 199 200 /** 201 * omap_rproc_stop_timer() - stop a timer for a remoteproc 202 * @timer: handle to a OMAP rproc timer 203 * 204 * This helper function is used to disable a timer associated with a 205 * remoteproc, and needs to be called either during a device shutdown 206 * or suspend operation. The separate helper function allows the driver 207 * to just stop a timer without having to release the timer during a 208 * suspend operation. 209 * 210 * Return: 0 on success, otherwise a failure as returned by DMTimer ops 211 */ 212 static inline int omap_rproc_stop_timer(struct omap_rproc_timer *timer) 213 { 214 return timer->timer_ops->stop(timer->odt); 215 } 216 217 /** 218 * omap_rproc_release_timer() - release a timer for a remoteproc 219 * @timer: handle to a OMAP rproc timer 220 * 221 * This helper function is used primarily to release a timer associated 222 * with a remoteproc. The dmtimer will be available for other clients to 223 * use once released. 224 * 225 * Return: 0 on success, otherwise a failure as returned by DMTimer ops 226 */ 227 static inline int omap_rproc_release_timer(struct omap_rproc_timer *timer) 228 { 229 return timer->timer_ops->free(timer->odt); 230 } 231 232 /** 233 * omap_rproc_get_timer_irq() - get the irq for a timer 234 * @timer: handle to a OMAP rproc timer 235 * 236 * This function is used to get the irq associated with a watchdog timer. The 237 * function is called by the OMAP remoteproc driver to register a interrupt 238 * handler to handle watchdog events on the remote processor. 239 * 240 * Return: irq id on success, otherwise a failure as returned by DMTimer ops 241 */ 242 static inline int omap_rproc_get_timer_irq(struct omap_rproc_timer *timer) 243 { 244 return timer->timer_ops->get_irq(timer->odt); 245 } 246 247 /** 248 * omap_rproc_ack_timer_irq() - acknowledge a timer irq 249 * @timer: handle to a OMAP rproc timer 250 * 251 * This function is used to clear the irq associated with a watchdog timer. 252 * The function is called by the OMAP remoteproc upon a watchdog event on the 253 * remote processor to clear the interrupt status of the watchdog timer. 254 */ 255 static inline void omap_rproc_ack_timer_irq(struct omap_rproc_timer *timer) 256 { 257 timer->timer_ops->write_status(timer->odt, OMAP_TIMER_INT_OVERFLOW); 258 } 259 260 /** 261 * omap_rproc_watchdog_isr() - Watchdog ISR handler for remoteproc device 262 * @irq: IRQ number associated with a watchdog timer 263 * @data: IRQ handler data 264 * 265 * This ISR routine executes the required necessary low-level code to 266 * acknowledge a watchdog timer interrupt. There can be multiple watchdog 267 * timers associated with a rproc (like IPUs which have 2 watchdog timers, 268 * one per Cortex M3/M4 core), so a lookup has to be performed to identify 269 * the timer to acknowledge its interrupt. 270 * 271 * The function also invokes rproc_report_crash to report the watchdog event 272 * to the remoteproc driver core, to trigger a recovery. 273 * 274 * Return: IRQ_HANDLED on success, otherwise IRQ_NONE 275 */ 276 static irqreturn_t omap_rproc_watchdog_isr(int irq, void *data) 277 { 278 struct rproc *rproc = data; 279 struct omap_rproc *oproc = rproc->priv; 280 struct device *dev = rproc->dev.parent; 281 struct omap_rproc_timer *timers = oproc->timers; 282 struct omap_rproc_timer *wd_timer = NULL; 283 int num_timers = oproc->num_timers + oproc->num_wd_timers; 284 int i; 285 286 for (i = oproc->num_timers; i < num_timers; i++) { 287 if (timers[i].irq > 0 && irq == timers[i].irq) { 288 wd_timer = &timers[i]; 289 break; 290 } 291 } 292 293 if (!wd_timer) { 294 dev_err(dev, "invalid timer\n"); 295 return IRQ_NONE; 296 } 297 298 omap_rproc_ack_timer_irq(wd_timer); 299 300 rproc_report_crash(rproc, RPROC_WATCHDOG); 301 302 return IRQ_HANDLED; 303 } 304 305 /** 306 * omap_rproc_enable_timers() - enable the timers for a remoteproc 307 * @rproc: handle of a remote processor 308 * @configure: boolean flag used to acquire and configure the timer handle 309 * 310 * This function is used primarily to enable the timers associated with 311 * a remoteproc. The configure flag is provided to allow the driver 312 * to either acquire and start a timer (during device initialization) or 313 * to just start a timer (during a resume operation). 314 * 315 * Return: 0 on success, otherwise an appropriate failure 316 */ 317 static int omap_rproc_enable_timers(struct rproc *rproc, bool configure) 318 { 319 int i; 320 int ret = 0; 321 struct platform_device *tpdev; 322 struct dmtimer_platform_data *tpdata; 323 const struct omap_dm_timer_ops *timer_ops; 324 struct omap_rproc *oproc = rproc->priv; 325 struct omap_rproc_timer *timers = oproc->timers; 326 struct device *dev = rproc->dev.parent; 327 struct device_node *np = NULL; 328 int num_timers = oproc->num_timers + oproc->num_wd_timers; 329 330 if (!num_timers) 331 return 0; 332 333 if (!configure) 334 goto start_timers; 335 336 for (i = 0; i < num_timers; i++) { 337 if (i < oproc->num_timers) 338 np = of_parse_phandle(dev->of_node, "ti,timers", i); 339 else 340 np = of_parse_phandle(dev->of_node, 341 "ti,watchdog-timers", 342 (i - oproc->num_timers)); 343 if (!np) { 344 ret = -ENXIO; 345 dev_err(dev, "device node lookup for timer at index %d failed: %d\n", 346 i < oproc->num_timers ? i : 347 i - oproc->num_timers, ret); 348 goto free_timers; 349 } 350 351 tpdev = of_find_device_by_node(np); 352 if (!tpdev) { 353 ret = -ENODEV; 354 dev_err(dev, "could not get timer platform device\n"); 355 goto put_node; 356 } 357 358 tpdata = dev_get_platdata(&tpdev->dev); 359 put_device(&tpdev->dev); 360 if (!tpdata) { 361 ret = -EINVAL; 362 dev_err(dev, "dmtimer pdata structure NULL\n"); 363 goto put_node; 364 } 365 366 timer_ops = tpdata->timer_ops; 367 if (!timer_ops || !timer_ops->request_by_node || 368 !timer_ops->set_source || !timer_ops->set_load || 369 !timer_ops->free || !timer_ops->start || 370 !timer_ops->stop || !timer_ops->get_irq || 371 !timer_ops->write_status) { 372 ret = -EINVAL; 373 dev_err(dev, "device does not have required timer ops\n"); 374 goto put_node; 375 } 376 377 timers[i].irq = -1; 378 timers[i].timer_ops = timer_ops; 379 ret = omap_rproc_request_timer(dev, np, &timers[i]); 380 if (ret) { 381 dev_err(dev, "request for timer %p failed: %d\n", np, 382 ret); 383 goto put_node; 384 } 385 of_node_put(np); 386 387 if (i >= oproc->num_timers) { 388 timers[i].irq = omap_rproc_get_timer_irq(&timers[i]); 389 if (timers[i].irq < 0) { 390 dev_err(dev, "get_irq for timer %p failed: %d\n", 391 np, timers[i].irq); 392 ret = -EBUSY; 393 goto free_timers; 394 } 395 396 ret = request_irq(timers[i].irq, 397 omap_rproc_watchdog_isr, IRQF_SHARED, 398 "rproc-wdt", rproc); 399 if (ret) { 400 dev_err(dev, "error requesting irq for timer %p\n", 401 np); 402 omap_rproc_release_timer(&timers[i]); 403 timers[i].odt = NULL; 404 timers[i].timer_ops = NULL; 405 timers[i].irq = -1; 406 goto free_timers; 407 } 408 } 409 } 410 411 start_timers: 412 for (i = 0; i < num_timers; i++) { 413 ret = omap_rproc_start_timer(&timers[i]); 414 if (ret) { 415 dev_err(dev, "start timer %p failed failed: %d\n", np, 416 ret); 417 break; 418 } 419 } 420 if (ret) { 421 while (i >= 0) { 422 omap_rproc_stop_timer(&timers[i]); 423 i--; 424 } 425 goto put_node; 426 } 427 return 0; 428 429 put_node: 430 if (configure) 431 of_node_put(np); 432 free_timers: 433 while (i--) { 434 if (i >= oproc->num_timers) 435 free_irq(timers[i].irq, rproc); 436 omap_rproc_release_timer(&timers[i]); 437 timers[i].odt = NULL; 438 timers[i].timer_ops = NULL; 439 timers[i].irq = -1; 440 } 441 442 return ret; 443 } 444 445 /** 446 * omap_rproc_disable_timers() - disable the timers for a remoteproc 447 * @rproc: handle of a remote processor 448 * @configure: boolean flag used to release the timer handle 449 * 450 * This function is used primarily to disable the timers associated with 451 * a remoteproc. The configure flag is provided to allow the driver 452 * to either stop and release a timer (during device shutdown) or to just 453 * stop a timer (during a suspend operation). 454 * 455 * Return: 0 on success or no timers 456 */ 457 static int omap_rproc_disable_timers(struct rproc *rproc, bool configure) 458 { 459 int i; 460 struct omap_rproc *oproc = rproc->priv; 461 struct omap_rproc_timer *timers = oproc->timers; 462 int num_timers = oproc->num_timers + oproc->num_wd_timers; 463 464 if (!num_timers) 465 return 0; 466 467 for (i = 0; i < num_timers; i++) { 468 omap_rproc_stop_timer(&timers[i]); 469 if (configure) { 470 if (i >= oproc->num_timers) 471 free_irq(timers[i].irq, rproc); 472 omap_rproc_release_timer(&timers[i]); 473 timers[i].odt = NULL; 474 timers[i].timer_ops = NULL; 475 timers[i].irq = -1; 476 } 477 } 478 479 return 0; 480 } 481 482 /** 483 * omap_rproc_mbox_callback() - inbound mailbox message handler 484 * @client: mailbox client pointer used for requesting the mailbox channel 485 * @data: mailbox payload 486 * 487 * This handler is invoked by omap's mailbox driver whenever a mailbox 488 * message is received. Usually, the mailbox payload simply contains 489 * the index of the virtqueue that is kicked by the remote processor, 490 * and we let remoteproc core handle it. 491 * 492 * In addition to virtqueue indices, we also have some out-of-band values 493 * that indicates different events. Those values are deliberately very 494 * big so they don't coincide with virtqueue indices. 495 */ 496 static void omap_rproc_mbox_callback(struct mbox_client *client, void *data) 497 { 498 struct omap_rproc *oproc = container_of(client, struct omap_rproc, 499 client); 500 struct device *dev = oproc->rproc->dev.parent; 501 const char *name = oproc->rproc->name; 502 u32 msg = (u32)data; 503 504 dev_dbg(dev, "mbox msg: 0x%x\n", msg); 505 506 switch (msg) { 507 case RP_MBOX_CRASH: 508 /* 509 * remoteproc detected an exception, notify the rproc core. 510 * The remoteproc core will handle the recovery. 511 */ 512 dev_err(dev, "omap rproc %s crashed\n", name); 513 rproc_report_crash(oproc->rproc, RPROC_FATAL_ERROR); 514 break; 515 case RP_MBOX_ECHO_REPLY: 516 dev_info(dev, "received echo reply from %s\n", name); 517 break; 518 case RP_MBOX_SUSPEND_ACK: 519 case RP_MBOX_SUSPEND_CANCEL: 520 oproc->suspend_acked = msg == RP_MBOX_SUSPEND_ACK; 521 complete(&oproc->pm_comp); 522 break; 523 default: 524 if (msg >= RP_MBOX_READY && msg < RP_MBOX_END_MSG) 525 return; 526 if (msg > oproc->rproc->max_notifyid) { 527 dev_dbg(dev, "dropping unknown message 0x%x", msg); 528 return; 529 } 530 /* msg contains the index of the triggered vring */ 531 if (rproc_vq_interrupt(oproc->rproc, msg) == IRQ_NONE) 532 dev_dbg(dev, "no message was found in vqid %d\n", msg); 533 } 534 } 535 536 /* kick a virtqueue */ 537 static void omap_rproc_kick(struct rproc *rproc, int vqid) 538 { 539 struct omap_rproc *oproc = rproc->priv; 540 struct device *dev = rproc->dev.parent; 541 int ret; 542 543 /* wake up the rproc before kicking it */ 544 ret = pm_runtime_get_sync(dev); 545 if (WARN_ON(ret < 0)) { 546 dev_err(dev, "pm_runtime_get_sync() failed during kick, ret = %d\n", 547 ret); 548 pm_runtime_put_noidle(dev); 549 return; 550 } 551 552 /* send the index of the triggered virtqueue in the mailbox payload */ 553 ret = mbox_send_message(oproc->mbox, (void *)vqid); 554 if (ret < 0) 555 dev_err(dev, "failed to send mailbox message, status = %d\n", 556 ret); 557 558 pm_runtime_mark_last_busy(dev); 559 pm_runtime_put_autosuspend(dev); 560 } 561 562 /** 563 * omap_rproc_write_dsp_boot_addr() - set boot address for DSP remote processor 564 * @rproc: handle of a remote processor 565 * 566 * Set boot address for a supported DSP remote processor. 567 * 568 * Return: 0 on success, or -EINVAL if boot address is not aligned properly 569 */ 570 static int omap_rproc_write_dsp_boot_addr(struct rproc *rproc) 571 { 572 struct device *dev = rproc->dev.parent; 573 struct omap_rproc *oproc = rproc->priv; 574 struct omap_rproc_boot_data *bdata = oproc->boot_data; 575 u32 offset = bdata->boot_reg; 576 u32 value; 577 u32 mask; 578 579 if (rproc->bootaddr & (SZ_1K - 1)) { 580 dev_err(dev, "invalid boot address 0x%llx, must be aligned on a 1KB boundary\n", 581 rproc->bootaddr); 582 return -EINVAL; 583 } 584 585 value = rproc->bootaddr >> bdata->boot_reg_shift; 586 mask = ~(SZ_1K - 1) >> bdata->boot_reg_shift; 587 588 return regmap_update_bits(bdata->syscon, offset, mask, value); 589 } 590 591 /* 592 * Power up the remote processor. 593 * 594 * This function will be invoked only after the firmware for this rproc 595 * was loaded, parsed successfully, and all of its resource requirements 596 * were met. 597 */ 598 static int omap_rproc_start(struct rproc *rproc) 599 { 600 struct omap_rproc *oproc = rproc->priv; 601 struct device *dev = rproc->dev.parent; 602 int ret; 603 struct mbox_client *client = &oproc->client; 604 605 if (oproc->boot_data) { 606 ret = omap_rproc_write_dsp_boot_addr(rproc); 607 if (ret) 608 return ret; 609 } 610 611 client->dev = dev; 612 client->tx_done = NULL; 613 client->rx_callback = omap_rproc_mbox_callback; 614 client->tx_block = false; 615 client->knows_txdone = false; 616 617 oproc->mbox = mbox_request_channel(client, 0); 618 if (IS_ERR(oproc->mbox)) { 619 ret = -EBUSY; 620 dev_err(dev, "mbox_request_channel failed: %ld\n", 621 PTR_ERR(oproc->mbox)); 622 return ret; 623 } 624 625 /* 626 * Ping the remote processor. this is only for sanity-sake; 627 * there is no functional effect whatsoever. 628 * 629 * Note that the reply will _not_ arrive immediately: this message 630 * will wait in the mailbox fifo until the remote processor is booted. 631 */ 632 ret = mbox_send_message(oproc->mbox, (void *)RP_MBOX_ECHO_REQUEST); 633 if (ret < 0) { 634 dev_err(dev, "mbox_send_message failed: %d\n", ret); 635 goto put_mbox; 636 } 637 638 ret = omap_rproc_enable_timers(rproc, true); 639 if (ret) { 640 dev_err(dev, "omap_rproc_enable_timers failed: %d\n", ret); 641 goto put_mbox; 642 } 643 644 ret = reset_control_deassert(oproc->reset); 645 if (ret) { 646 dev_err(dev, "reset control deassert failed: %d\n", ret); 647 goto disable_timers; 648 } 649 650 /* 651 * remote processor is up, so update the runtime pm status and 652 * enable the auto-suspend. The device usage count is incremented 653 * manually for balancing it for auto-suspend 654 */ 655 pm_runtime_set_active(dev); 656 pm_runtime_use_autosuspend(dev); 657 pm_runtime_get_noresume(dev); 658 pm_runtime_enable(dev); 659 pm_runtime_mark_last_busy(dev); 660 pm_runtime_put_autosuspend(dev); 661 662 return 0; 663 664 disable_timers: 665 omap_rproc_disable_timers(rproc, true); 666 put_mbox: 667 mbox_free_channel(oproc->mbox); 668 return ret; 669 } 670 671 /* power off the remote processor */ 672 static int omap_rproc_stop(struct rproc *rproc) 673 { 674 struct device *dev = rproc->dev.parent; 675 struct omap_rproc *oproc = rproc->priv; 676 int ret; 677 678 /* 679 * cancel any possible scheduled runtime suspend by incrementing 680 * the device usage count, and resuming the device. The remoteproc 681 * also needs to be woken up if suspended, to avoid the remoteproc 682 * OS to continue to remember any context that it has saved, and 683 * avoid potential issues in misindentifying a subsequent device 684 * reboot as a power restore boot 685 */ 686 ret = pm_runtime_get_sync(dev); 687 if (ret < 0) { 688 pm_runtime_put_noidle(dev); 689 return ret; 690 } 691 692 ret = reset_control_assert(oproc->reset); 693 if (ret) 694 goto out; 695 696 ret = omap_rproc_disable_timers(rproc, true); 697 if (ret) 698 goto enable_device; 699 700 mbox_free_channel(oproc->mbox); 701 702 /* 703 * update the runtime pm states and status now that the remoteproc 704 * has stopped 705 */ 706 pm_runtime_disable(dev); 707 pm_runtime_dont_use_autosuspend(dev); 708 pm_runtime_put_noidle(dev); 709 pm_runtime_set_suspended(dev); 710 711 return 0; 712 713 enable_device: 714 reset_control_deassert(oproc->reset); 715 out: 716 /* schedule the next auto-suspend */ 717 pm_runtime_mark_last_busy(dev); 718 pm_runtime_put_autosuspend(dev); 719 return ret; 720 } 721 722 /** 723 * omap_rproc_da_to_va() - internal memory translation helper 724 * @rproc: remote processor to apply the address translation for 725 * @da: device address to translate 726 * @len: length of the memory buffer 727 * @is_iomem: pointer filled in to indicate if @da is iomapped memory 728 * 729 * Custom function implementing the rproc .da_to_va ops to provide address 730 * translation (device address to kernel virtual address) for internal RAMs 731 * present in a DSP or IPU device). The translated addresses can be used 732 * either by the remoteproc core for loading, or by any rpmsg bus drivers. 733 * 734 * Return: translated virtual address in kernel memory space on success, 735 * or NULL on failure. 736 */ 737 static void *omap_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem) 738 { 739 struct omap_rproc *oproc = rproc->priv; 740 int i; 741 u32 offset; 742 743 if (len <= 0) 744 return NULL; 745 746 if (!oproc->num_mems) 747 return NULL; 748 749 for (i = 0; i < oproc->num_mems; i++) { 750 if (da >= oproc->mem[i].dev_addr && da + len <= 751 oproc->mem[i].dev_addr + oproc->mem[i].size) { 752 offset = da - oproc->mem[i].dev_addr; 753 /* __force to make sparse happy with type conversion */ 754 return (__force void *)(oproc->mem[i].cpu_addr + 755 offset); 756 } 757 } 758 759 return NULL; 760 } 761 762 static const struct rproc_ops omap_rproc_ops = { 763 .start = omap_rproc_start, 764 .stop = omap_rproc_stop, 765 .kick = omap_rproc_kick, 766 .da_to_va = omap_rproc_da_to_va, 767 }; 768 769 #ifdef CONFIG_PM 770 static bool _is_rproc_in_standby(struct omap_rproc *oproc) 771 { 772 return ti_clk_is_in_standby(oproc->fck); 773 } 774 775 /* 1 sec is long enough time to let the remoteproc side suspend the device */ 776 #define DEF_SUSPEND_TIMEOUT 1000 777 static int _omap_rproc_suspend(struct rproc *rproc, bool auto_suspend) 778 { 779 struct device *dev = rproc->dev.parent; 780 struct omap_rproc *oproc = rproc->priv; 781 unsigned long to = msecs_to_jiffies(DEF_SUSPEND_TIMEOUT); 782 unsigned long ta = jiffies + to; 783 u32 suspend_msg = auto_suspend ? 784 RP_MBOX_SUSPEND_AUTO : RP_MBOX_SUSPEND_SYSTEM; 785 int ret; 786 787 reinit_completion(&oproc->pm_comp); 788 oproc->suspend_acked = false; 789 ret = mbox_send_message(oproc->mbox, (void *)suspend_msg); 790 if (ret < 0) { 791 dev_err(dev, "PM mbox_send_message failed: %d\n", ret); 792 return ret; 793 } 794 795 ret = wait_for_completion_timeout(&oproc->pm_comp, to); 796 if (!oproc->suspend_acked) 797 return -EBUSY; 798 799 /* 800 * The remoteproc side is returning the ACK message before saving the 801 * context, because the context saving is performed within a SYS/BIOS 802 * function, and it cannot have any inter-dependencies against the IPC 803 * layer. Also, as the SYS/BIOS needs to preserve properly the processor 804 * register set, sending this ACK or signalling the completion of the 805 * context save through a shared memory variable can never be the 806 * absolute last thing to be executed on the remoteproc side, and the 807 * MPU cannot use the ACK message as a sync point to put the remoteproc 808 * into reset. The only way to ensure that the remote processor has 809 * completed saving the context is to check that the module has reached 810 * STANDBY state (after saving the context, the SYS/BIOS executes the 811 * appropriate target-specific WFI instruction causing the module to 812 * enter STANDBY). 813 */ 814 while (!_is_rproc_in_standby(oproc)) { 815 if (time_after(jiffies, ta)) 816 return -ETIME; 817 schedule(); 818 } 819 820 ret = reset_control_assert(oproc->reset); 821 if (ret) { 822 dev_err(dev, "reset assert during suspend failed %d\n", ret); 823 return ret; 824 } 825 826 ret = omap_rproc_disable_timers(rproc, false); 827 if (ret) { 828 dev_err(dev, "disabling timers during suspend failed %d\n", 829 ret); 830 goto enable_device; 831 } 832 833 /* 834 * IOMMUs would have to be disabled specifically for runtime suspend. 835 * They are handled automatically through System PM callbacks for 836 * regular system suspend 837 */ 838 if (auto_suspend) { 839 ret = omap_iommu_domain_deactivate(rproc->domain); 840 if (ret) { 841 dev_err(dev, "iommu domain deactivate failed %d\n", 842 ret); 843 goto enable_timers; 844 } 845 } 846 847 return 0; 848 849 enable_timers: 850 /* ignore errors on re-enabling code */ 851 omap_rproc_enable_timers(rproc, false); 852 enable_device: 853 reset_control_deassert(oproc->reset); 854 return ret; 855 } 856 857 static int _omap_rproc_resume(struct rproc *rproc, bool auto_suspend) 858 { 859 struct device *dev = rproc->dev.parent; 860 struct omap_rproc *oproc = rproc->priv; 861 int ret; 862 863 /* 864 * IOMMUs would have to be enabled specifically for runtime resume. 865 * They would have been already enabled automatically through System 866 * PM callbacks for regular system resume 867 */ 868 if (auto_suspend) { 869 ret = omap_iommu_domain_activate(rproc->domain); 870 if (ret) { 871 dev_err(dev, "omap_iommu activate failed %d\n", ret); 872 goto out; 873 } 874 } 875 876 /* boot address could be lost after suspend, so restore it */ 877 if (oproc->boot_data) { 878 ret = omap_rproc_write_dsp_boot_addr(rproc); 879 if (ret) { 880 dev_err(dev, "boot address restore failed %d\n", ret); 881 goto suspend_iommu; 882 } 883 } 884 885 ret = omap_rproc_enable_timers(rproc, false); 886 if (ret) { 887 dev_err(dev, "enabling timers during resume failed %d\n", ret); 888 goto suspend_iommu; 889 } 890 891 ret = reset_control_deassert(oproc->reset); 892 if (ret) { 893 dev_err(dev, "reset deassert during resume failed %d\n", ret); 894 goto disable_timers; 895 } 896 897 return 0; 898 899 disable_timers: 900 omap_rproc_disable_timers(rproc, false); 901 suspend_iommu: 902 if (auto_suspend) 903 omap_iommu_domain_deactivate(rproc->domain); 904 out: 905 return ret; 906 } 907 908 static int __maybe_unused omap_rproc_suspend(struct device *dev) 909 { 910 struct rproc *rproc = dev_get_drvdata(dev); 911 struct omap_rproc *oproc = rproc->priv; 912 int ret = 0; 913 914 mutex_lock(&rproc->lock); 915 if (rproc->state == RPROC_OFFLINE) 916 goto out; 917 918 if (rproc->state == RPROC_SUSPENDED) 919 goto out; 920 921 if (rproc->state != RPROC_RUNNING) { 922 ret = -EBUSY; 923 goto out; 924 } 925 926 ret = _omap_rproc_suspend(rproc, false); 927 if (ret) { 928 dev_err(dev, "suspend failed %d\n", ret); 929 goto out; 930 } 931 932 /* 933 * remoteproc is running at the time of system suspend, so remember 934 * it so as to wake it up during system resume 935 */ 936 oproc->need_resume = true; 937 rproc->state = RPROC_SUSPENDED; 938 939 out: 940 mutex_unlock(&rproc->lock); 941 return ret; 942 } 943 944 static int __maybe_unused omap_rproc_resume(struct device *dev) 945 { 946 struct rproc *rproc = dev_get_drvdata(dev); 947 struct omap_rproc *oproc = rproc->priv; 948 int ret = 0; 949 950 mutex_lock(&rproc->lock); 951 if (rproc->state == RPROC_OFFLINE) 952 goto out; 953 954 if (rproc->state != RPROC_SUSPENDED) { 955 ret = -EBUSY; 956 goto out; 957 } 958 959 /* 960 * remoteproc was auto-suspended at the time of system suspend, 961 * so no need to wake-up the processor (leave it in suspended 962 * state, will be woken up during a subsequent runtime_resume) 963 */ 964 if (!oproc->need_resume) 965 goto out; 966 967 ret = _omap_rproc_resume(rproc, false); 968 if (ret) { 969 dev_err(dev, "resume failed %d\n", ret); 970 goto out; 971 } 972 973 oproc->need_resume = false; 974 rproc->state = RPROC_RUNNING; 975 976 pm_runtime_mark_last_busy(dev); 977 out: 978 mutex_unlock(&rproc->lock); 979 return ret; 980 } 981 982 static int omap_rproc_runtime_suspend(struct device *dev) 983 { 984 struct rproc *rproc = dev_get_drvdata(dev); 985 struct omap_rproc *oproc = rproc->priv; 986 int ret; 987 988 mutex_lock(&rproc->lock); 989 if (rproc->state == RPROC_CRASHED) { 990 dev_dbg(dev, "rproc cannot be runtime suspended when crashed!\n"); 991 ret = -EBUSY; 992 goto out; 993 } 994 995 if (WARN_ON(rproc->state != RPROC_RUNNING)) { 996 dev_err(dev, "rproc cannot be runtime suspended when not running!\n"); 997 ret = -EBUSY; 998 goto out; 999 } 1000 1001 /* 1002 * do not even attempt suspend if the remote processor is not 1003 * idled for runtime auto-suspend 1004 */ 1005 if (!_is_rproc_in_standby(oproc)) { 1006 ret = -EBUSY; 1007 goto abort; 1008 } 1009 1010 ret = _omap_rproc_suspend(rproc, true); 1011 if (ret) 1012 goto abort; 1013 1014 rproc->state = RPROC_SUSPENDED; 1015 mutex_unlock(&rproc->lock); 1016 return 0; 1017 1018 abort: 1019 pm_runtime_mark_last_busy(dev); 1020 out: 1021 mutex_unlock(&rproc->lock); 1022 return ret; 1023 } 1024 1025 static int omap_rproc_runtime_resume(struct device *dev) 1026 { 1027 struct rproc *rproc = dev_get_drvdata(dev); 1028 int ret; 1029 1030 mutex_lock(&rproc->lock); 1031 if (WARN_ON(rproc->state != RPROC_SUSPENDED)) { 1032 dev_err(dev, "rproc cannot be runtime resumed if not suspended! state=%d\n", 1033 rproc->state); 1034 ret = -EBUSY; 1035 goto out; 1036 } 1037 1038 ret = _omap_rproc_resume(rproc, true); 1039 if (ret) { 1040 dev_err(dev, "runtime resume failed %d\n", ret); 1041 goto out; 1042 } 1043 1044 rproc->state = RPROC_RUNNING; 1045 out: 1046 mutex_unlock(&rproc->lock); 1047 return ret; 1048 } 1049 #endif /* CONFIG_PM */ 1050 1051 static const struct omap_rproc_mem_data ipu_mems[] = { 1052 { .name = "l2ram", .dev_addr = 0x20000000 }, 1053 { }, 1054 }; 1055 1056 static const struct omap_rproc_mem_data dra7_dsp_mems[] = { 1057 { .name = "l2ram", .dev_addr = 0x800000 }, 1058 { .name = "l1pram", .dev_addr = 0xe00000 }, 1059 { .name = "l1dram", .dev_addr = 0xf00000 }, 1060 { }, 1061 }; 1062 1063 static const struct omap_rproc_dev_data omap4_dsp_dev_data = { 1064 .device_name = "dsp", 1065 }; 1066 1067 static const struct omap_rproc_dev_data omap4_ipu_dev_data = { 1068 .device_name = "ipu", 1069 .mems = ipu_mems, 1070 }; 1071 1072 static const struct omap_rproc_dev_data omap5_dsp_dev_data = { 1073 .device_name = "dsp", 1074 }; 1075 1076 static const struct omap_rproc_dev_data omap5_ipu_dev_data = { 1077 .device_name = "ipu", 1078 .mems = ipu_mems, 1079 }; 1080 1081 static const struct omap_rproc_dev_data dra7_dsp_dev_data = { 1082 .device_name = "dsp", 1083 .mems = dra7_dsp_mems, 1084 }; 1085 1086 static const struct omap_rproc_dev_data dra7_ipu_dev_data = { 1087 .device_name = "ipu", 1088 .mems = ipu_mems, 1089 }; 1090 1091 static const struct of_device_id omap_rproc_of_match[] = { 1092 { 1093 .compatible = "ti,omap4-dsp", 1094 .data = &omap4_dsp_dev_data, 1095 }, 1096 { 1097 .compatible = "ti,omap4-ipu", 1098 .data = &omap4_ipu_dev_data, 1099 }, 1100 { 1101 .compatible = "ti,omap5-dsp", 1102 .data = &omap5_dsp_dev_data, 1103 }, 1104 { 1105 .compatible = "ti,omap5-ipu", 1106 .data = &omap5_ipu_dev_data, 1107 }, 1108 { 1109 .compatible = "ti,dra7-dsp", 1110 .data = &dra7_dsp_dev_data, 1111 }, 1112 { 1113 .compatible = "ti,dra7-ipu", 1114 .data = &dra7_ipu_dev_data, 1115 }, 1116 { 1117 /* end */ 1118 }, 1119 }; 1120 MODULE_DEVICE_TABLE(of, omap_rproc_of_match); 1121 1122 static const char *omap_rproc_get_firmware(struct platform_device *pdev) 1123 { 1124 const char *fw_name; 1125 int ret; 1126 1127 ret = of_property_read_string(pdev->dev.of_node, "firmware-name", 1128 &fw_name); 1129 if (ret) 1130 return ERR_PTR(ret); 1131 1132 return fw_name; 1133 } 1134 1135 static int omap_rproc_get_boot_data(struct platform_device *pdev, 1136 struct rproc *rproc) 1137 { 1138 struct device_node *np = pdev->dev.of_node; 1139 struct omap_rproc *oproc = rproc->priv; 1140 const struct omap_rproc_dev_data *data; 1141 1142 data = of_device_get_match_data(&pdev->dev); 1143 if (!data) 1144 return -ENODEV; 1145 1146 if (!of_property_read_bool(np, "ti,bootreg")) 1147 return 0; 1148 1149 oproc->boot_data = devm_kzalloc(&pdev->dev, sizeof(*oproc->boot_data), 1150 GFP_KERNEL); 1151 if (!oproc->boot_data) 1152 return -ENOMEM; 1153 1154 oproc->boot_data->syscon = 1155 syscon_regmap_lookup_by_phandle(np, "ti,bootreg"); 1156 if (IS_ERR(oproc->boot_data->syscon)) 1157 return PTR_ERR(oproc->boot_data->syscon); 1158 1159 if (of_property_read_u32_index(np, "ti,bootreg", 1, 1160 &oproc->boot_data->boot_reg)) { 1161 dev_err(&pdev->dev, "couldn't get the boot register\n"); 1162 return -EINVAL; 1163 } 1164 1165 of_property_read_u32_index(np, "ti,bootreg", 2, 1166 &oproc->boot_data->boot_reg_shift); 1167 1168 return 0; 1169 } 1170 1171 static int omap_rproc_of_get_internal_memories(struct platform_device *pdev, 1172 struct rproc *rproc) 1173 { 1174 struct omap_rproc *oproc = rproc->priv; 1175 struct device *dev = &pdev->dev; 1176 const struct omap_rproc_dev_data *data; 1177 struct resource *res; 1178 int num_mems; 1179 int i; 1180 1181 data = of_device_get_match_data(dev); 1182 if (!data) 1183 return -ENODEV; 1184 1185 if (!data->mems) 1186 return 0; 1187 1188 num_mems = of_property_count_elems_of_size(dev->of_node, "reg", 1189 sizeof(u32)) / 2; 1190 1191 oproc->mem = devm_kcalloc(dev, num_mems, sizeof(*oproc->mem), 1192 GFP_KERNEL); 1193 if (!oproc->mem) 1194 return -ENOMEM; 1195 1196 for (i = 0; data->mems[i].name; i++) { 1197 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, 1198 data->mems[i].name); 1199 if (!res) { 1200 dev_err(dev, "no memory defined for %s\n", 1201 data->mems[i].name); 1202 return -ENOMEM; 1203 } 1204 oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res); 1205 if (IS_ERR(oproc->mem[i].cpu_addr)) { 1206 dev_err(dev, "failed to parse and map %s memory\n", 1207 data->mems[i].name); 1208 return PTR_ERR(oproc->mem[i].cpu_addr); 1209 } 1210 oproc->mem[i].bus_addr = res->start; 1211 oproc->mem[i].dev_addr = data->mems[i].dev_addr; 1212 oproc->mem[i].size = resource_size(res); 1213 1214 dev_dbg(dev, "memory %8s: bus addr %pa size 0x%x va %p da 0x%x\n", 1215 data->mems[i].name, &oproc->mem[i].bus_addr, 1216 oproc->mem[i].size, oproc->mem[i].cpu_addr, 1217 oproc->mem[i].dev_addr); 1218 } 1219 oproc->num_mems = num_mems; 1220 1221 return 0; 1222 } 1223 1224 #ifdef CONFIG_OMAP_REMOTEPROC_WATCHDOG 1225 static int omap_rproc_count_wdog_timers(struct device *dev) 1226 { 1227 struct device_node *np = dev->of_node; 1228 int ret; 1229 1230 ret = of_count_phandle_with_args(np, "ti,watchdog-timers", NULL); 1231 if (ret <= 0) { 1232 dev_dbg(dev, "device does not have watchdog timers, status = %d\n", 1233 ret); 1234 ret = 0; 1235 } 1236 1237 return ret; 1238 } 1239 #else 1240 static int omap_rproc_count_wdog_timers(struct device *dev) 1241 { 1242 return 0; 1243 } 1244 #endif 1245 1246 static int omap_rproc_of_get_timers(struct platform_device *pdev, 1247 struct rproc *rproc) 1248 { 1249 struct device_node *np = pdev->dev.of_node; 1250 struct omap_rproc *oproc = rproc->priv; 1251 struct device *dev = &pdev->dev; 1252 int num_timers; 1253 1254 /* 1255 * Timer nodes are directly used in client nodes as phandles, so 1256 * retrieve the count using appropriate size 1257 */ 1258 oproc->num_timers = of_count_phandle_with_args(np, "ti,timers", NULL); 1259 if (oproc->num_timers <= 0) { 1260 dev_dbg(dev, "device does not have timers, status = %d\n", 1261 oproc->num_timers); 1262 oproc->num_timers = 0; 1263 } 1264 1265 oproc->num_wd_timers = omap_rproc_count_wdog_timers(dev); 1266 1267 num_timers = oproc->num_timers + oproc->num_wd_timers; 1268 if (num_timers) { 1269 oproc->timers = devm_kcalloc(dev, num_timers, 1270 sizeof(*oproc->timers), 1271 GFP_KERNEL); 1272 if (!oproc->timers) 1273 return -ENOMEM; 1274 1275 dev_dbg(dev, "device has %d tick timers and %d watchdog timers\n", 1276 oproc->num_timers, oproc->num_wd_timers); 1277 } 1278 1279 return 0; 1280 } 1281 1282 static void omap_rproc_mem_release(void *data) 1283 { 1284 struct device *dev = data; 1285 1286 of_reserved_mem_device_release(dev); 1287 } 1288 1289 static int omap_rproc_probe(struct platform_device *pdev) 1290 { 1291 struct device_node *np = pdev->dev.of_node; 1292 struct omap_rproc *oproc; 1293 struct rproc *rproc; 1294 const char *firmware; 1295 int ret; 1296 struct reset_control *reset; 1297 1298 if (!np) { 1299 dev_err(&pdev->dev, "only DT-based devices are supported\n"); 1300 return -ENODEV; 1301 } 1302 1303 reset = devm_reset_control_array_get_exclusive(&pdev->dev); 1304 if (IS_ERR(reset)) 1305 return PTR_ERR(reset); 1306 1307 firmware = omap_rproc_get_firmware(pdev); 1308 if (IS_ERR(firmware)) 1309 return PTR_ERR(firmware); 1310 1311 ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); 1312 if (ret) { 1313 dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret); 1314 return ret; 1315 } 1316 1317 rproc = devm_rproc_alloc(&pdev->dev, dev_name(&pdev->dev), &omap_rproc_ops, 1318 firmware, sizeof(*oproc)); 1319 if (!rproc) 1320 return -ENOMEM; 1321 1322 oproc = rproc->priv; 1323 oproc->rproc = rproc; 1324 oproc->reset = reset; 1325 /* All existing OMAP IPU and DSP processors have an MMU */ 1326 rproc->has_iommu = true; 1327 1328 #ifdef CONFIG_ARM_DMA_USE_IOMMU 1329 /* 1330 * Throw away the ARM DMA mapping that we'll never use, so it doesn't 1331 * interfere with the core rproc->domain and we get the right DMA ops. 1332 */ 1333 if (pdev->dev.archdata.mapping) { 1334 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(&pdev->dev); 1335 1336 arm_iommu_detach_device(&pdev->dev); 1337 arm_iommu_release_mapping(mapping); 1338 } 1339 #endif 1340 1341 ret = omap_rproc_of_get_internal_memories(pdev, rproc); 1342 if (ret) 1343 return ret; 1344 1345 ret = omap_rproc_get_boot_data(pdev, rproc); 1346 if (ret) 1347 return ret; 1348 1349 ret = omap_rproc_of_get_timers(pdev, rproc); 1350 if (ret) 1351 return ret; 1352 1353 init_completion(&oproc->pm_comp); 1354 oproc->autosuspend_delay = DEFAULT_AUTOSUSPEND_DELAY; 1355 1356 of_property_read_u32(pdev->dev.of_node, "ti,autosuspend-delay-ms", 1357 &oproc->autosuspend_delay); 1358 1359 pm_runtime_set_autosuspend_delay(&pdev->dev, oproc->autosuspend_delay); 1360 1361 oproc->fck = devm_clk_get(&pdev->dev, 0); 1362 if (IS_ERR(oproc->fck)) 1363 return PTR_ERR(oproc->fck); 1364 1365 ret = of_reserved_mem_device_init(&pdev->dev); 1366 if (ret) { 1367 dev_warn(&pdev->dev, "device does not have specific CMA pool.\n"); 1368 dev_warn(&pdev->dev, "Typically this should be provided,\n"); 1369 dev_warn(&pdev->dev, "only omit if you know what you are doing.\n"); 1370 } 1371 ret = devm_add_action_or_reset(&pdev->dev, omap_rproc_mem_release, &pdev->dev); 1372 if (ret) 1373 return ret; 1374 1375 platform_set_drvdata(pdev, rproc); 1376 1377 ret = devm_rproc_add(&pdev->dev, rproc); 1378 if (ret) 1379 return ret; 1380 1381 return 0; 1382 } 1383 1384 static const struct dev_pm_ops omap_rproc_pm_ops = { 1385 SET_SYSTEM_SLEEP_PM_OPS(omap_rproc_suspend, omap_rproc_resume) 1386 SET_RUNTIME_PM_OPS(omap_rproc_runtime_suspend, 1387 omap_rproc_runtime_resume, NULL) 1388 }; 1389 1390 static struct platform_driver omap_rproc_driver = { 1391 .probe = omap_rproc_probe, 1392 .driver = { 1393 .name = "omap-rproc", 1394 .pm = &omap_rproc_pm_ops, 1395 .of_match_table = omap_rproc_of_match, 1396 }, 1397 }; 1398 1399 module_platform_driver(omap_rproc_driver); 1400 1401 MODULE_LICENSE("GPL v2"); 1402 MODULE_DESCRIPTION("OMAP Remote Processor control driver"); 1403