18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Simple kernel console driver for STM devices
48c2ecf20Sopenharmony_ci * Copyright (c) 2014, Intel Corporation.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * STM console will send kernel messages over STM devices to a trace host.
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/kernel.h>
108c2ecf20Sopenharmony_ci#include <linux/module.h>
118c2ecf20Sopenharmony_ci#include <linux/console.h>
128c2ecf20Sopenharmony_ci#include <linux/slab.h>
138c2ecf20Sopenharmony_ci#include <linux/stm.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistatic int stm_console_link(struct stm_source_data *data);
168c2ecf20Sopenharmony_cistatic void stm_console_unlink(struct stm_source_data *data);
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistatic struct stm_console {
198c2ecf20Sopenharmony_ci	struct stm_source_data	data;
208c2ecf20Sopenharmony_ci	struct console		console;
218c2ecf20Sopenharmony_ci} stm_console = {
228c2ecf20Sopenharmony_ci	.data	= {
238c2ecf20Sopenharmony_ci		.name		= "console",
248c2ecf20Sopenharmony_ci		.nr_chans	= 1,
258c2ecf20Sopenharmony_ci		.link		= stm_console_link,
268c2ecf20Sopenharmony_ci		.unlink		= stm_console_unlink,
278c2ecf20Sopenharmony_ci	},
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic void
318c2ecf20Sopenharmony_cistm_console_write(struct console *con, const char *buf, unsigned len)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	struct stm_console *sc = container_of(con, struct stm_console, console);
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	stm_source_write(&sc->data, 0, buf, len);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic int stm_console_link(struct stm_source_data *data)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	struct stm_console *sc = container_of(data, struct stm_console, data);
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	strcpy(sc->console.name, "stm_console");
438c2ecf20Sopenharmony_ci	sc->console.write = stm_console_write;
448c2ecf20Sopenharmony_ci	sc->console.flags = CON_ENABLED | CON_PRINTBUFFER;
458c2ecf20Sopenharmony_ci	register_console(&sc->console);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	return 0;
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic void stm_console_unlink(struct stm_source_data *data)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	struct stm_console *sc = container_of(data, struct stm_console, data);
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	unregister_console(&sc->console);
558c2ecf20Sopenharmony_ci}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic int stm_console_init(void)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	return stm_source_register_device(NULL, &stm_console.data);
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistatic void stm_console_exit(void)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	stm_source_unregister_device(&stm_console.data);
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cimodule_init(stm_console_init);
688c2ecf20Sopenharmony_cimodule_exit(stm_console_exit);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
718c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("stm_console driver");
728c2ecf20Sopenharmony_ciMODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@linux.intel.com>");
73