aboutsummaryrefslogtreecommitdiffstats
path: root/include
Commit message (Expand)AuthorAgeFilesLines
...
* kernel: bump 5.10 to 5.10.53Rui Salvaterra2021-07-291-2/+2
* kernel: bump 5.4 to 5.4.134John Audia2021-07-251-2/+2
* kernel: bump 5.4 to 5.4.133John Audia2021-07-251-2/+2
* kernel: bump 5.10 to 5.10.52Rui Salvaterra2021-07-251-2/+2
* kernel: bump 5.10 to 5.10.51Rui Salvaterra2021-07-201-2/+2
* kernel: bump 5.10 to 5.10.50Rui Salvaterra2021-07-171-2/+2
* kernel: bump 5.10 to 5.10.49Rui Salvaterra2021-07-171-2/+2
* kernel: bump 5.10 to 5.10.48Rui Salvaterra2021-07-171-2/+2
* kernel: bump 5.10 to 5.10.47Rui Salvaterra2021-07-171-2/+2
* kernel: bump 5.4 to 5.4.132John Audia2021-07-171-2/+2
* kernel: bump 5.4 to 5.4.131John Audia2021-07-171-2/+2
* kernel: bump 5.4 to 5.4.130John Audia2021-07-171-2/+2
* kernel: bump 5.4 to 5.4.129John Audia2021-07-171-2/+2
* kernel: bump 5.4 to 5.4.128John Audia2021-06-261-2/+2
* kernel: bump 5.4 to 5.4.127John Audia2021-06-261-2/+2
* kernel: bump 5.4 to 5.4.126John Audia2021-06-261-2/+2
* kernel: bump 5.4 to 5.4.125John Audia2021-06-261-2/+2
* kernel: bump 5.10 to 5.10.46Rui Salvaterra2021-06-261-2/+2
* kernel: bump 5.10 to 5.10.44Rui Salvaterra2021-06-221-2/+2
* build: ensure that dash isn't prepended twice to abi version suffixJo-Philipp Wich2021-06-151-1/+1
* build: prepend ABI suffixes with a dash if package name ends with digitJo-Philipp Wich2021-06-142-2/+8
* kernel: bump 5.10 to 5.10.43Rui Salvaterra2021-06-141-2/+2
* prereq-build: diff requirement to GNURosen Penev2021-06-121-3/+3
* build: do not override DESTDIR for cmake ninja host buildsFelix Fietkau2021-06-121-2/+2
* build: use ninja for cmake packages by defaultFelix Fietkau2021-06-121-0/+2
* build: add ninja build tool and make it available for cmakeFelix Fietkau2021-06-121-0/+34
* u-boot: support verbose buildFelix Fietkau2021-06-121-1/+2
* build: fix build for devices without initramfsDavid Bauer2021-06-081-1/+1
* kernel: bump 5.4 to 5.4.124John Audia2021-06-061-2/+2
* kernel: bump 5.10 to 5.10.42Rui Salvaterra2021-06-061-2/+2
* build/json: fix DEVICE_PACKAGESPaul Spooren2021-06-021-1/+1
* kernel: bump 5.4 to 5.4.123John Audia2021-05-291-2/+2
* kernel: bump 5.4 to 5.4.122John Audia2021-05-291-2/+2
* kernel: bump 5.10 to 5.10.41Kevin Darbyshire-Bryant2021-05-291-2/+2
* kernel: bump 5.10 to 5.10.40Rui Salvaterra2021-05-271-2/+2
* build: fix regression for kernels < 5.10Sebastian Kemper2021-05-251-2/+7
* prereq-build: g++ formatting and consistency fixesKarl Palsson2021-05-231-2/+2
* kernel-defaults: fix external kernel build when user_headers is missingMatt Merhar2021-05-231-1/+3
* kernel: bump 5.4 to 5.4.121John Audia2021-05-231-2/+2
* kernel: bump 5.4 to 5.4.120John Audia2021-05-231-2/+2
* kernel: bump 5.4 to 5.4.119John Audia2021-05-231-2/+2
* kernel: bump 5.4 to 5.4.118John Audia2021-05-231-2/+2
* kernel: bump 5.10 to 5.10.39Kevin Darbyshire-Bryant2021-05-221-2/+2
* kernel: bump 5.10 to 5.10.38Rui Salvaterra2021-05-221-2/+2
* kernel: bump 5.10 to 5.10.37Rui Salvaterra2021-05-141-2/+2
* kernel: bump 5.10 to 5.10.36Rui Salvaterra2021-05-141-2/+2
* build: introduce $(MKHASH)Leonardo Mörlein2021-05-138-12/+11
* build: kernel2minor: work around path length limitFrançois Chavant2021-05-121-2/+5
* kernel: bump 5.10 to 5.10.35Kevin Darbyshire-Bryant2021-05-091-2/+2
* kernel: bump 5.10 to 5.10.34Kevin Darbyshire-Bryant2021-05-091-2/+2
s/mfd/glamo/glamo-core.c index c094a8c..e310382 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -1248,6 +1248,8 @@ void glamo_register_resume_dependency(struct resume_dependency * { register_resume_dependency(&glamo_handle->resume_dependency, resume_dependency); + if (glamo_handle->is_suspended) + activate_all_resume_dependencies(&glamo_handle->resume_dependency); } EXPORT_SYMBOL_GPL(glamo_register_resume_dependency); @@ -1255,12 +1257,15 @@ EXPORT_SYMBOL_GPL(glamo_register_resume_dependency); static int glamo_suspend(struct platform_device *pdev, pm_message_t state) { glamo_power(glamo_handle, GLAMO_POWER_SUSPEND); + glamo_handle->is_suspended = 1; + activate_all_resume_dependencies(&glamo_handle->resume_dependency); return 0; } static int glamo_resume(struct platform_device *pdev) { glamo_power(glamo_handle, GLAMO_POWER_ON); + glamo_handle->is_suspended = 0; callback_all_resume_dependencies(&glamo_handle->resume_dependency); return 0; diff --git a/drivers/mfd/glamo/glamo-core.h b/drivers/mfd/glamo/glamo-core.h index d3f4309..ac5eacf 100644 --- a/drivers/mfd/glamo/glamo-core.h +++ b/drivers/mfd/glamo/glamo-core.h @@ -32,6 +32,7 @@ struct glamo_core { struct resume_dependency resume_dependency; u32 engine_enabled_bitfield; u32 engine_enabled_bitfield_suspend; + int is_suspended; }; struct glamo_script { diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c index 2a388cf..3b1c07b 100644 --- a/drivers/serial/s3c2410.c +++ b/drivers/serial/s3c2410.c @@ -116,6 +116,7 @@ struct s3c24xx_uart_port { struct uart_port port; struct resume_dependency resume_dependency; + int is_suspended; }; @@ -1188,10 +1189,13 @@ static int s3c24xx_serial_remove(struct platform_device *dev) static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state) { struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); + struct s3c24xx_uart_port *ourport = to_ourport(port); if (port) uart_suspend_port(&s3c24xx_uart_drv, port); + activate_all_resume_dependencies(&ourport->resume_dependency); + ourport->is_suspended = 1; return 0; } @@ -1202,6 +1206,8 @@ void s3c24xx_serial_register_resume_dependency(struct resume_dependency * register_resume_dependency(&ourport->resume_dependency, resume_dependency); + if (ourport->is_suspended) + activate_all_resume_dependencies(&ourport->resume_dependency); } EXPORT_SYMBOL(s3c24xx_serial_register_resume_dependency); @@ -1218,6 +1224,7 @@ static int s3c24xx_serial_resume(struct platform_device *dev) uart_resume_port(&s3c24xx_uart_drv, port); } + ourport->is_suspended = 0; callback_all_resume_dependencies(&ourport->resume_dependency); return 0; diff --git a/include/linux/resume-dependency.h b/include/linux/resume-dependency.h index e0c0f33..959cadd 100644 --- a/include/linux/resume-dependency.h +++ b/include/linux/resume-dependency.h @@ -38,6 +38,7 @@ struct resume_dependency { */ #define init_resume_dependency_list(_head) \ + printk(KERN_ERR "##### init_resume_dependency_list(head=%p)\n", (_head)); \ INIT_LIST_HEAD(&(_head)->list); @@ -48,7 +49,18 @@ struct resume_dependency { */ #define register_resume_dependency(_head, _dep) { \ - (_dep)->called_flag = 0; \ + struct list_head *_pos, *_q; \ + struct resume_dependency *_d; \ +\ + printk(KERN_ERR "##### register_resume_dependency(head=%p, dep=%p)\n", (_head), (_dep)); \ + (_dep)->called_flag = 1; \ + list_for_each_safe(_pos, _q, &((_head)->list)) { \ + _d = list_entry(_pos, struct resume_dependency, list); \ + if (_d == (_dep)) { \ + list_del(_pos); \ + printk(KERN_ERR "##### duplicate dependency removed first\n"); \ + } \ + } \ list_add(&(_dep)->list, &(_head)->list); \ } @@ -61,14 +73,38 @@ struct resume_dependency { struct list_head *_pos, *_q; \ struct resume_dependency *_dep; \ \ + printk(KERN_ERR "##### callback_all_resume_dependencies(head=%p)\n", (_head)); \ list_for_each_safe(_pos, _q, &((_head)->list)) { \ _dep = list_entry(_pos, struct resume_dependency, list); \ + printk(KERN_ERR "##### callback list entry (head=%p, dep=%p)\n", (_head), (_dep)); \ _dep->called_flag = 1; \ + printk(KERN_ERR "##### callback=%p(context=%p))\n", (_dep->callback),(_dep->context)); \ (_dep->callback)(_dep->context); \ list_del(_pos); \ } \ } +/* When a dependency is added, it is not actually active; the dependent resume + * handler will function as normal. The dependency is activated by the suspend + * handler for the driver that will be doing the callbacks. This ensures that + * if the suspend is aborted for any reason (error, driver busy, etc), that all + * suspended drivers will resume, even if the driver upon which they are dependent + * did not suspend, and hence will not resume, and thus would be unable to perform + * the callbacks. + */ + +#define activate_all_resume_dependencies(_head) { \ + struct list_head *_pos, *_q; \ + struct resume_dependency *_dep; \ +\ + printk(KERN_ERR "##### activate_all_resume_dependencies(head=%p)\n", (_head)); \ + list_for_each_safe(_pos, _q, &((_head)->list)) { \ + _dep = list_entry(_pos, struct resume_dependency, list); \ + printk(KERN_ERR "##### activating callback list entry (head=%p, dep=%p)\n", (_head), (_dep)); \ + _dep->called_flag = 0; \ + } \ +} + /* if your resume action is dependent on multiple drivers being resumed already, * register the same callback with each driver you are dependent on, and check * .called_flag for all of the struct resume_dependency. When they are all 1 -- 1.5.6.5