/*
 * Simple kernel console driver for STM devices
 * Copyright (c) 2014, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * 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>");
