Message ID | 20240614040133.24967-2-jason-jh.lin@mediatek.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Fix sleeping function called from invalid context | expand |
> To avoid pm_runtime APIs calling sleep in all the atomic context APIs PM-runtime? > in mbox_chan_ops, we add power_get/power_put API to let the controllers > implement them with pm_runtime APIs outside the other atomic context APIs > in mbox_chan_ops. * How do you think about to omit the word “we” from such a change description? https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.10-rc3#n94 * Would you like to improve any indications for adjustments of data structures? > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> Does a dot really belong to the personal name (according to the Developer's Certificate of Origin)? https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.10-rc3#n438 Regards, Markus
Hi Jason-JH.Lin, kernel test robot noticed the following build errors: [auto build test ERROR on linus/master] [also build test ERROR on v6.10-rc3 next-20240613] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/mailbox-Add-power_get-power_put-API-to-mbox_chan_ops/20240614-120412 base: linus/master patch link: https://lore.kernel.org/r/20240614040133.24967-2-jason-jh.lin%40mediatek.com patch subject: [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops config: riscv-defconfig (https://download.01.org/0day-ci/archive/20240615/202406150022.LXLvvkeI-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project 78ee473784e5ef6f0b19ce4cb111fb6e4d23c6b2) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240615/202406150022.LXLvvkeI-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406150022.LXLvvkeI-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/mailbox/mailbox.c:9: In file included from include/linux/interrupt.h:21: In file included from arch/riscv/include/asm/sections.h:9: In file included from include/linux/mm.h:2253: include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ >> drivers/mailbox/mailbox.c:382:11: error: incompatible pointer to integer conversion returning 'void *' from a function with result type 'int' [-Wint-conversion] 382 | return ERR_PTR(ret); | ^~~~~~~~~~~~ 1 warning and 1 error generated. vim +382 drivers/mailbox/mailbox.c 355 356 static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl) 357 { 358 struct device *dev = cl->dev; 359 unsigned long flags; 360 int ret; 361 362 if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) { 363 dev_dbg(dev, "%s: mailbox not free\n", __func__); 364 return -EBUSY; 365 } 366 367 spin_lock_irqsave(&chan->lock, flags); 368 chan->msg_free = 0; 369 chan->msg_count = 0; 370 chan->active_req = NULL; 371 chan->cl = cl; 372 init_completion(&chan->tx_complete); 373 374 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone) 375 chan->txdone_method = TXDONE_BY_ACK; 376 377 spin_unlock_irqrestore(&chan->lock, flags); 378 379 if (chan->mbox->ops->power_get) { 380 ret = chan->mbox->ops->power_get(chan); 381 if (ret < 0) > 382 return ERR_PTR(ret); 383 } 384 385 if (chan->mbox->ops->startup) { 386 ret = chan->mbox->ops->startup(chan); 387 388 if (ret) { 389 dev_err(dev, "Unable to startup the chan (%d)\n", ret); 390 mbox_free_channel(chan); 391 return ret; 392 } 393 } 394 395 return 0; 396 } 397
Hi Jason-JH.Lin, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on fujitsu-integration/mailbox-for-next v6.10-rc3 next-20240613] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/mailbox-Add-power_get-power_put-API-to-mbox_chan_ops/20240614-120412 base: linus/master patch link: https://lore.kernel.org/r/20240614040133.24967-2-jason-jh.lin%40mediatek.com patch subject: [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops config: arc-randconfig-002-20240614 (https://download.01.org/0day-ci/archive/20240615/202406150041.QTui5Xgq-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240615/202406150041.QTui5Xgq-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406150041.QTui5Xgq-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/mailbox/mailbox.c: In function '__mbox_bind_client': >> drivers/mailbox/mailbox.c:382:32: warning: returning 'void *' from a function with return type 'int' makes integer from pointer without a cast [-Wint-conversion] 382 | return ERR_PTR(ret); | ^~~~~~~~~~~~ Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for REGMAP_SPI Depends on [n]: SPI [=n] Selected by [y]: - AD9739A [=y] && IIO [=y] && (SPI [=n] || COMPILE_TEST [=y]) vim +382 drivers/mailbox/mailbox.c 355 356 static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl) 357 { 358 struct device *dev = cl->dev; 359 unsigned long flags; 360 int ret; 361 362 if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) { 363 dev_dbg(dev, "%s: mailbox not free\n", __func__); 364 return -EBUSY; 365 } 366 367 spin_lock_irqsave(&chan->lock, flags); 368 chan->msg_free = 0; 369 chan->msg_count = 0; 370 chan->active_req = NULL; 371 chan->cl = cl; 372 init_completion(&chan->tx_complete); 373 374 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone) 375 chan->txdone_method = TXDONE_BY_ACK; 376 377 spin_unlock_irqrestore(&chan->lock, flags); 378 379 if (chan->mbox->ops->power_get) { 380 ret = chan->mbox->ops->power_get(chan); 381 if (ret < 0) > 382 return ERR_PTR(ret); 383 } 384 385 if (chan->mbox->ops->startup) { 386 ret = chan->mbox->ops->startup(chan); 387 388 if (ret) { 389 dev_err(dev, "Unable to startup the chan (%d)\n", ret); 390 mbox_free_channel(chan); 391 return ret; 392 } 393 } 394 395 return 0; 396 } 397
Hi Jason-JH.Lin, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on fujitsu-integration/mailbox-for-next v6.10-rc3 next-20240613] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/mailbox-Add-power_get-power_put-API-to-mbox_chan_ops/20240614-120412 base: linus/master patch link: https://lore.kernel.org/r/20240614040133.24967-2-jason-jh.lin%40mediatek.com patch subject: [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops config: i386-randconfig-062-20240614 (https://download.01.org/0day-ci/archive/20240615/202406150214.pVxsbllC-lkp@intel.com/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240615/202406150214.pVxsbllC-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406150214.pVxsbllC-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/mailbox/mailbox.c:382:39: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got void * @@ drivers/mailbox/mailbox.c:382:39: sparse: expected int drivers/mailbox/mailbox.c:382:39: sparse: got void * drivers/mailbox/mailbox.c: note: in included file (through include/linux/smp.h, include/linux/alloc_tag.h, include/linux/percpu.h, ...): include/linux/list.h:83:21: sparse: sparse: self-comparison always evaluates to true vim +382 drivers/mailbox/mailbox.c 355 356 static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl) 357 { 358 struct device *dev = cl->dev; 359 unsigned long flags; 360 int ret; 361 362 if (chan->cl || !try_module_get(chan->mbox->dev->driver->owner)) { 363 dev_dbg(dev, "%s: mailbox not free\n", __func__); 364 return -EBUSY; 365 } 366 367 spin_lock_irqsave(&chan->lock, flags); 368 chan->msg_free = 0; 369 chan->msg_count = 0; 370 chan->active_req = NULL; 371 chan->cl = cl; 372 init_completion(&chan->tx_complete); 373 374 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone) 375 chan->txdone_method = TXDONE_BY_ACK; 376 377 spin_unlock_irqrestore(&chan->lock, flags); 378 379 if (chan->mbox->ops->power_get) { 380 ret = chan->mbox->ops->power_get(chan); 381 if (ret < 0) > 382 return ERR_PTR(ret); 383 } 384 385 if (chan->mbox->ops->startup) { 386 ret = chan->mbox->ops->startup(chan); 387 388 if (ret) { 389 dev_err(dev, "Unable to startup the chan (%d)\n", ret); 390 mbox_free_channel(chan); 391 return ret; 392 } 393 } 394 395 return 0; 396 } 397
Hi Jason-JH.Lin, kernel test robot noticed the following build warnings: https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/mailbox-Add-power_get-power_put-API-to-mbox_chan_ops/20240614-120412 base: linus/master patch link: https://lore.kernel.org/r/20240614040133.24967-2-jason-jh.lin%40mediatek.com patch subject: [PATCH 1/2] mailbox: Add power_get/power_put API to mbox_chan_ops config: x86_64-randconfig-161-20240615 (https://download.01.org/0day-ci/archive/20240615/202406151520.TDnOFFbV-lkp@intel.com/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org> | Closes: https://lore.kernel.org/r/202406151520.TDnOFFbV-lkp@intel.com/ smatch warnings: drivers/mailbox/mailbox.c:485 mbox_request_channel() error: 'chan' dereferencing possible ERR_PTR() vim +/chan +485 drivers/mailbox/mailbox.c 2b6d83e2b8b7de Jassi Brar 2014-06-12 444 struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index) 2b6d83e2b8b7de Jassi Brar 2014-06-12 445 { 2b6d83e2b8b7de Jassi Brar 2014-06-12 446 struct device *dev = cl->dev; 2b6d83e2b8b7de Jassi Brar 2014-06-12 447 struct mbox_controller *mbox; 2b6d83e2b8b7de Jassi Brar 2014-06-12 448 struct of_phandle_args spec; 2b6d83e2b8b7de Jassi Brar 2014-06-12 449 struct mbox_chan *chan; 2b6d83e2b8b7de Jassi Brar 2014-06-12 450 int ret; 2b6d83e2b8b7de Jassi Brar 2014-06-12 451 2b6d83e2b8b7de Jassi Brar 2014-06-12 452 if (!dev || !dev->of_node) { 2b6d83e2b8b7de Jassi Brar 2014-06-12 453 pr_debug("%s: No owner device node\n", __func__); 2b6d83e2b8b7de Jassi Brar 2014-06-12 454 return ERR_PTR(-ENODEV); 2b6d83e2b8b7de Jassi Brar 2014-06-12 455 } 2b6d83e2b8b7de Jassi Brar 2014-06-12 456 2b6d83e2b8b7de Jassi Brar 2014-06-12 457 mutex_lock(&con_mutex); 2b6d83e2b8b7de Jassi Brar 2014-06-12 458 2b6d83e2b8b7de Jassi Brar 2014-06-12 459 if (of_parse_phandle_with_args(dev->of_node, "mboxes", 2b6d83e2b8b7de Jassi Brar 2014-06-12 460 "#mbox-cells", index, &spec)) { b6d83e2b8b7de Jassi Brar 2014-06-12 461 dev_dbg(dev, "%s: can't parse \"mboxes\" property\n", __func__); 2b6d83e2b8b7de Jassi Brar 2014-06-12 462 mutex_unlock(&con_mutex); 2b6d83e2b8b7de Jassi Brar 2014-06-12 463 return ERR_PTR(-ENODEV); 2b6d83e2b8b7de Jassi Brar 2014-06-12 464 } 2b6d83e2b8b7de Jassi Brar 2014-06-12 465 2d805fc1c6b2ec Benson Leung 2015-05-04 466 chan = ERR_PTR(-EPROBE_DEFER); 2b6d83e2b8b7de Jassi Brar 2014-06-12 467 list_for_each_entry(mbox, &mbox_cons, node) 2b6d83e2b8b7de Jassi Brar 2014-06-12 468 if (mbox->dev->of_node == spec.np) { 2b6d83e2b8b7de Jassi Brar 2014-06-12 469 chan = mbox->of_xlate(mbox, &spec); 8ed82e23875e60 Mikko Perttunen 2018-11-28 470 if (!IS_ERR(chan)) 2b6d83e2b8b7de Jassi Brar 2014-06-12 471 break; 2b6d83e2b8b7de Jassi Brar 2014-06-12 472 } 2b6d83e2b8b7de Jassi Brar 2014-06-12 473 2b6d83e2b8b7de Jassi Brar 2014-06-12 474 of_node_put(spec.np); 2b6d83e2b8b7de Jassi Brar 2014-06-12 475 2d805fc1c6b2ec Benson Leung 2015-05-04 476 if (IS_ERR(chan)) { 2d805fc1c6b2ec Benson Leung 2015-05-04 477 mutex_unlock(&con_mutex); 2d805fc1c6b2ec Benson Leung 2015-05-04 478 return chan; 2d805fc1c6b2ec Benson Leung 2015-05-04 479 } 2d805fc1c6b2ec Benson Leung 2015-05-04 480 85a953806557db Elliot Berman 2023-04-10 481 ret = __mbox_bind_client(chan, cl); 85a953806557db Elliot Berman 2023-04-10 482 if (ret) 2b6d83e2b8b7de Jassi Brar 2014-06-12 483 chan = ERR_PTR(ret); change is set to error pointer 2b6d83e2b8b7de Jassi Brar 2014-06-12 484 9c57f48cd805b1 Jason-JH.Lin 2024-06-14 @485 if (chan->mbox->ops->power_put) ^^^^^^ Dereferenced on the next line 9c57f48cd805b1 Jason-JH.Lin 2024-06-14 486 chan->mbox->ops->power_put(chan); 9c57f48cd805b1 Jason-JH.Lin 2024-06-14 487 2b6d83e2b8b7de Jassi Brar 2014-06-12 488 mutex_unlock(&con_mutex); 9c57f48cd805b1 Jason-JH.Lin 2024-06-14 489 2b6d83e2b8b7de Jassi Brar 2014-06-12 490 return chan; 2b6d83e2b8b7de Jassi Brar 2014-06-12 491 }
On Fri, 2024-06-14 at 13:35 +0200, Markus Elfring wrote: > > External email : Please do not click links or open attachments until > you have verified the sender or the content. > > To avoid pm_runtime APIs calling sleep in all the atomic context > APIs > > PM-runtime? > OK, I'll change this. > > > in mbox_chan_ops, we add power_get/power_put API to let the > controllers > > implement them with pm_runtime APIs outside the other atomic > context APIs > > in mbox_chan_ops. > > * How do you think about to omit the word “we” from such a change > description? > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.10-rc3#n94 > OK, I'll remove `we` and change the sentence below: Add power_get/power_put API into mbox_chan_ops to let controllers implement them with PM-runtime APIs outside the other atomic context APIs in mbox_chan_ops to avoid calling sleep in the atomic context. > * Would you like to improve any indications for adjustments of data > structures? > You mean the description of power_get and power_put in struct mbox_chan_ops? Is this better? @power_get: Called when the controller needs to increase a reference count to keep power on for the device of mailbox controller. It's optional to use PM-runtime API or more complex operations to implement this function. @power_put: Called when the controller needs to decrease a reference count to release power for the device of mailbox controller. It's optional to use PM-runtime API to more complex operations to implement this function. > > > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> > > Does a dot really belong to the personal name > (according to the Developer's Certificate of Origin)? > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.10-rc3#n438 > A dot is not in my name, but I've been using it for a long time. It's binding to my environment everywhere and it's not easy to change in a short time. But I'll try to change it before sending upstream patch. Thanks for your advice. Regards Jason-JH Lin > Regards, > Markus
diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c index ebff3baf3045..bafcc7b0c0b8 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -58,6 +58,12 @@ static void msg_submit(struct mbox_chan *chan) void *data; int err = -EBUSY; + if (chan->mbox->ops->power_get) { + err = chan->mbox->ops->power_get(chan); + if (err < 0) + return; + } + spin_lock_irqsave(&chan->lock, flags); if (!chan->msg_count || chan->active_req) @@ -89,12 +95,16 @@ static void msg_submit(struct mbox_chan *chan) hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL); spin_unlock_irqrestore(&chan->mbox->poll_hrt_lock, flags); } + + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); } static void tx_tick(struct mbox_chan *chan, int r) { unsigned long flags; void *mssg; + int ret; spin_lock_irqsave(&chan->lock, flags); mssg = chan->active_req; @@ -107,10 +117,19 @@ static void tx_tick(struct mbox_chan *chan, int r) if (!mssg) return; + if (chan->mbox->ops->power_get) { + ret = chan->mbox->ops->power_get(chan); + if (ret < 0) + return; + } + /* Notify the client */ if (chan->cl->tx_done) chan->cl->tx_done(chan->cl, mssg, r); + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); + if (r != -ETIME && chan->cl->tx_block) complete(&chan->tx_complete); } @@ -223,9 +242,16 @@ EXPORT_SYMBOL_GPL(mbox_client_txdone); */ bool mbox_client_peek_data(struct mbox_chan *chan) { + if (chan->mbox->ops->power_get) + if (chan->mbox->ops->power_get(chan) < 0) + return false; + if (chan->mbox->ops->peek_data) return chan->mbox->ops->peek_data(chan); + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); + return false; } EXPORT_SYMBOL_GPL(mbox_client_peek_data); @@ -310,10 +336,19 @@ int mbox_flush(struct mbox_chan *chan, unsigned long timeout) if (!chan->mbox->ops->flush) return -ENOTSUPP; + if (chan->mbox->ops->power_get) { + ret = chan->mbox->ops->power_get(chan); + if (ret < 0) + return ret; + } + ret = chan->mbox->ops->flush(chan, timeout); if (ret < 0) tx_tick(chan, ret); + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); + return ret; } EXPORT_SYMBOL_GPL(mbox_flush); @@ -341,6 +376,12 @@ static int __mbox_bind_client(struct mbox_chan *chan, struct mbox_client *cl) spin_unlock_irqrestore(&chan->lock, flags); + if (chan->mbox->ops->power_get) { + ret = chan->mbox->ops->power_get(chan); + if (ret < 0) + return ERR_PTR(ret); + } + if (chan->mbox->ops->startup) { ret = chan->mbox->ops->startup(chan); @@ -441,7 +482,11 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index) if (ret) chan = ERR_PTR(ret); + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); + mutex_unlock(&con_mutex); + return chan; } EXPORT_SYMBOL_GPL(mbox_request_channel); @@ -485,13 +530,23 @@ EXPORT_SYMBOL_GPL(mbox_request_channel_byname); void mbox_free_channel(struct mbox_chan *chan) { unsigned long flags; + int ret; if (!chan || !chan->cl) return; + if (chan->mbox->ops->power_get) { + ret = chan->mbox->ops->power_get(chan); + if (ret < 0) + return; + } + if (chan->mbox->ops->shutdown) chan->mbox->ops->shutdown(chan); + if (chan->mbox->ops->power_put) + chan->mbox->ops->power_put(chan); + /* The queued TX requests are simply aborted, no callbacks are made */ spin_lock_irqsave(&chan->lock, flags); chan->cl = NULL; diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h index 6fee33cb52f5..e8f26e7dabfd 100644 --- a/include/linux/mailbox_controller.h +++ b/include/linux/mailbox_controller.h @@ -42,6 +42,15 @@ struct mbox_chan; * Used only if txdone_poll:=true && txdone_irq:=false * @peek_data: Atomic check for any received data. Return true if controller * has some data to push to the client. False otherwise. + * @power_get: Called when the controller need to get the reference to keep + * the power on for the device of mailbox controller. It is + * optional to implement this function with pm_runtime APIs or + * more complicated operation. + * Return 0 is success, otherwise are fail. + * @power_put: Called when the controller need to put the reference to release + * the power for the device of mailbox controller. It is optional + * to implement this function with pm_runtime APIs or more + * complicated operation. */ struct mbox_chan_ops { int (*send_data)(struct mbox_chan *chan, void *data); @@ -50,6 +59,8 @@ struct mbox_chan_ops { void (*shutdown)(struct mbox_chan *chan); bool (*last_tx_done)(struct mbox_chan *chan); bool (*peek_data)(struct mbox_chan *chan); + int (*power_get)(struct mbox_chan *chan); + void (*power_put)(struct mbox_chan *chan); }; /**
To avoid pm_runtime APIs calling sleep in all the atomic context APIs in mbox_chan_ops, we add power_get/power_put API to let the controllers implement them with pm_runtime APIs outside the other atomic context APIs in mbox_chan_ops. Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> --- drivers/mailbox/mailbox.c | 55 ++++++++++++++++++++++++++++++ include/linux/mailbox_controller.h | 11 ++++++ 2 files changed, 66 insertions(+)