xref: /openbmc/linux/drivers/hwtracing/stm/console.c (revision e3e5a3d3da3e68ac5a7ab0278dffec8353ca8174)
1*e3e5a3d3SAlexander Shishkin /*
2*e3e5a3d3SAlexander Shishkin  * Simple kernel console driver for STM devices
3*e3e5a3d3SAlexander Shishkin  * Copyright (c) 2014, Intel Corporation.
4*e3e5a3d3SAlexander Shishkin  *
5*e3e5a3d3SAlexander Shishkin  * This program is free software; you can redistribute it and/or modify it
6*e3e5a3d3SAlexander Shishkin  * under the terms and conditions of the GNU General Public License,
7*e3e5a3d3SAlexander Shishkin  * version 2, as published by the Free Software Foundation.
8*e3e5a3d3SAlexander Shishkin  *
9*e3e5a3d3SAlexander Shishkin  * This program is distributed in the hope it will be useful, but WITHOUT
10*e3e5a3d3SAlexander Shishkin  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*e3e5a3d3SAlexander Shishkin  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12*e3e5a3d3SAlexander Shishkin  * more details.
13*e3e5a3d3SAlexander Shishkin  *
14*e3e5a3d3SAlexander Shishkin  * STM console will send kernel messages over STM devices to a trace host.
15*e3e5a3d3SAlexander Shishkin  */
16*e3e5a3d3SAlexander Shishkin 
17*e3e5a3d3SAlexander Shishkin #include <linux/kernel.h>
18*e3e5a3d3SAlexander Shishkin #include <linux/module.h>
19*e3e5a3d3SAlexander Shishkin #include <linux/console.h>
20*e3e5a3d3SAlexander Shishkin #include <linux/slab.h>
21*e3e5a3d3SAlexander Shishkin #include <linux/stm.h>
22*e3e5a3d3SAlexander Shishkin 
23*e3e5a3d3SAlexander Shishkin static int stm_console_link(struct stm_source_data *data);
24*e3e5a3d3SAlexander Shishkin static void stm_console_unlink(struct stm_source_data *data);
25*e3e5a3d3SAlexander Shishkin 
26*e3e5a3d3SAlexander Shishkin static struct stm_console {
27*e3e5a3d3SAlexander Shishkin 	struct stm_source_data	data;
28*e3e5a3d3SAlexander Shishkin 	struct console		console;
29*e3e5a3d3SAlexander Shishkin } stm_console = {
30*e3e5a3d3SAlexander Shishkin 	.data	= {
31*e3e5a3d3SAlexander Shishkin 		.name		= "console",
32*e3e5a3d3SAlexander Shishkin 		.nr_chans	= 1,
33*e3e5a3d3SAlexander Shishkin 		.link		= stm_console_link,
34*e3e5a3d3SAlexander Shishkin 		.unlink		= stm_console_unlink,
35*e3e5a3d3SAlexander Shishkin 	},
36*e3e5a3d3SAlexander Shishkin };
37*e3e5a3d3SAlexander Shishkin 
38*e3e5a3d3SAlexander Shishkin static void
39*e3e5a3d3SAlexander Shishkin stm_console_write(struct console *con, const char *buf, unsigned len)
40*e3e5a3d3SAlexander Shishkin {
41*e3e5a3d3SAlexander Shishkin 	struct stm_console *sc = container_of(con, struct stm_console, console);
42*e3e5a3d3SAlexander Shishkin 
43*e3e5a3d3SAlexander Shishkin 	stm_source_write(&sc->data, 0, buf, len);
44*e3e5a3d3SAlexander Shishkin }
45*e3e5a3d3SAlexander Shishkin 
46*e3e5a3d3SAlexander Shishkin static int stm_console_link(struct stm_source_data *data)
47*e3e5a3d3SAlexander Shishkin {
48*e3e5a3d3SAlexander Shishkin 	struct stm_console *sc = container_of(data, struct stm_console, data);
49*e3e5a3d3SAlexander Shishkin 
50*e3e5a3d3SAlexander Shishkin 	strcpy(sc->console.name, "stm_console");
51*e3e5a3d3SAlexander Shishkin 	sc->console.write = stm_console_write;
52*e3e5a3d3SAlexander Shishkin 	sc->console.flags = CON_ENABLED | CON_PRINTBUFFER;
53*e3e5a3d3SAlexander Shishkin 	register_console(&sc->console);
54*e3e5a3d3SAlexander Shishkin 
55*e3e5a3d3SAlexander Shishkin 	return 0;
56*e3e5a3d3SAlexander Shishkin }
57*e3e5a3d3SAlexander Shishkin 
58*e3e5a3d3SAlexander Shishkin static void stm_console_unlink(struct stm_source_data *data)
59*e3e5a3d3SAlexander Shishkin {
60*e3e5a3d3SAlexander Shishkin 	struct stm_console *sc = container_of(data, struct stm_console, data);
61*e3e5a3d3SAlexander Shishkin 
62*e3e5a3d3SAlexander Shishkin 	unregister_console(&sc->console);
63*e3e5a3d3SAlexander Shishkin }
64*e3e5a3d3SAlexander Shishkin 
65*e3e5a3d3SAlexander Shishkin static int stm_console_init(void)
66*e3e5a3d3SAlexander Shishkin {
67*e3e5a3d3SAlexander Shishkin 	return stm_source_register_device(NULL, &stm_console.data);
68*e3e5a3d3SAlexander Shishkin }
69*e3e5a3d3SAlexander Shishkin 
70*e3e5a3d3SAlexander Shishkin static void stm_console_exit(void)
71*e3e5a3d3SAlexander Shishkin {
72*e3e5a3d3SAlexander Shishkin 	stm_source_unregister_device(&stm_console.data);
73*e3e5a3d3SAlexander Shishkin }
74*e3e5a3d3SAlexander Shishkin 
75*e3e5a3d3SAlexander Shishkin module_init(stm_console_init);
76*e3e5a3d3SAlexander Shishkin module_exit(stm_console_exit);
77*e3e5a3d3SAlexander Shishkin 
78*e3e5a3d3SAlexander Shishkin MODULE_LICENSE("GPL v2");
79*e3e5a3d3SAlexander Shishkin MODULE_DESCRIPTION("stm_console driver");
80*e3e5a3d3SAlexander Shishkin MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@linux.intel.com>");
81