2018-03-28 18:43:57 +03:00
// SPDX-License-Identifier: GPL-2.0
2015-09-22 15:47:13 +03:00
/*
* Simple kernel console driver for STM devices
* Copyright ( c ) 2014 , Intel Corporation .
*
* STM console will send kernel messages over STM devices to a trace host .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/console.h>
# include <linux/slab.h>
# include <linux/stm.h>
static int stm_console_link ( struct stm_source_data * data ) ;
static void stm_console_unlink ( struct stm_source_data * data ) ;
static struct stm_console {
struct stm_source_data data ;
struct console console ;
} stm_console = {
. data = {
. name = " console " ,
. nr_chans = 1 ,
. link = stm_console_link ,
. unlink = stm_console_unlink ,
} ,
} ;
static void
stm_console_write ( struct console * con , const char * buf , unsigned len )
{
struct stm_console * sc = container_of ( con , struct stm_console , console ) ;
stm_source_write ( & sc - > data , 0 , buf , len ) ;
}
static int stm_console_link ( struct stm_source_data * data )
{
struct stm_console * sc = container_of ( data , struct stm_console , data ) ;
strcpy ( sc - > console . name , " stm_console " ) ;
sc - > console . write = stm_console_write ;
sc - > console . flags = CON_ENABLED | CON_PRINTBUFFER ;
register_console ( & sc - > console ) ;
return 0 ;
}
static void stm_console_unlink ( struct stm_source_data * data )
{
struct stm_console * sc = container_of ( data , struct stm_console , data ) ;
unregister_console ( & sc - > console ) ;
}
static int stm_console_init ( void )
{
return stm_source_register_device ( NULL , & stm_console . data ) ;
}
static void stm_console_exit ( void )
{
stm_source_unregister_device ( & stm_console . data ) ;
}
module_init ( stm_console_init ) ;
module_exit ( stm_console_exit ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_DESCRIPTION ( " stm_console driver " ) ;
MODULE_AUTHOR ( " Alexander Shishkin <alexander.shishkin@linux.intel.com> " ) ;