162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci#include <linux/module.h>
362306a36Sopenharmony_ci#include <linux/kthread.h>
462306a36Sopenharmony_ci#include <linux/irq_work.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci/* Must not be static to force gcc to consider these non constant */
762306a36Sopenharmony_cichar *trace_printk_test_global_str =
862306a36Sopenharmony_ci	"This is a dynamic string that will use trace_puts\n";
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cichar *trace_printk_test_global_str_irq =
1162306a36Sopenharmony_ci	"(irq) This is a dynamic string that will use trace_puts\n";
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cichar *trace_printk_test_global_str_fmt =
1462306a36Sopenharmony_ci	"%sThis is a %s that will use trace_printk\n";
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic struct irq_work irqwork;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic void trace_printk_irq_work(struct irq_work *work)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	trace_printk("(irq) This is a static string that will use trace_bputs\n");
2162306a36Sopenharmony_ci	trace_printk(trace_printk_test_global_str_irq);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	trace_printk("(irq) This is a %s that will use trace_bprintk()\n",
2462306a36Sopenharmony_ci		     "static string");
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	trace_printk(trace_printk_test_global_str_fmt,
2762306a36Sopenharmony_ci		     "(irq) ", "dynamic string");
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic int __init trace_printk_init(void)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	init_irq_work(&irqwork, trace_printk_irq_work);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	trace_printk("This is a static string that will use trace_bputs\n");
3562306a36Sopenharmony_ci	trace_printk(trace_printk_test_global_str);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	/* Kick off printing in irq context */
3862306a36Sopenharmony_ci	irq_work_queue(&irqwork);
3962306a36Sopenharmony_ci	irq_work_sync(&irqwork);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	trace_printk("This is a %s that will use trace_bprintk()\n",
4262306a36Sopenharmony_ci		     "static string");
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	trace_printk(trace_printk_test_global_str_fmt, "", "dynamic string");
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	return 0;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic void __exit trace_printk_exit(void)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cimodule_init(trace_printk_init);
5462306a36Sopenharmony_cimodule_exit(trace_printk_exit);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ciMODULE_AUTHOR("Steven Rostedt");
5762306a36Sopenharmony_ciMODULE_DESCRIPTION("trace-printk");
5862306a36Sopenharmony_ciMODULE_LICENSE("GPL");
59