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