Commit a02509f3 authored by Alexander Shishkin's avatar Alexander Shishkin Committed by Greg Kroah-Hartman
Browse files

stm class: Factor out default framing protocol



The STP framing pattern that the stm class implicitly applies to the
data payload is, in fact, a protocol. This patch moves the relevant code
out of the stm core into its own driver module.

Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
Tested-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d279a380
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -11,6 +11,21 @@ config STM

if STM

config STM_PROTO_BASIC
	tristate "Basic STM framing protocol driver"
	default CONFIG_STM
	help
	  This is a simple framing protocol for sending data over STM
	  devices. This was the protocol that the STM framework used
	  exclusively until the MIPI SyS-T support was added. Use this
	  driver for compatibility with your existing STM setup.

	  The receiving side only needs to be able to decode the MIPI
	  STP protocol in order to extract the data.

	  If you want to be able to use the basic protocol or want the
	  backwards compatibility for your existing setup, say Y.

config STM_DUMMY
	tristate "Dummy STM driver"
	help
+4 −0
Original line number Diff line number Diff line
@@ -3,6 +3,10 @@ obj-$(CONFIG_STM) += stm_core.o

stm_core-y		:= core.o policy.o

obj-$(CONFIG_STM_PROTO_BASIC) += stm_p_basic.o

stm_p_basic-y		:= p_basic.o

obj-$(CONFIG_STM_DUMMY)	+= dummy_stm.o

obj-$(CONFIG_STM_SOURCE_CONSOLE)	+= stm_console.o
+48 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Basic framing protocol for STM devices.
 * Copyright (c) 2018, Intel Corporation.
 */

#include <linux/module.h>
#include <linux/device.h>
#include <linux/stm.h>
#include "stm.h"

static ssize_t basic_write(struct stm_data *data, struct stm_output *output,
			   unsigned int chan, const char *buf, size_t count)
{
	unsigned int c = output->channel + chan;
	unsigned int m = output->master;
	const unsigned char nil = 0;
	ssize_t sz;

	sz = stm_data_write(data, m, c, true, buf, count);
	if (sz > 0)
		data->packet(data, m, c, STP_PACKET_FLAG, 0, 0, &nil);

	return sz;
}

static const struct stm_protocol_driver basic_pdrv = {
	.owner	= THIS_MODULE,
	.name	= "p_basic",
	.write	= basic_write,
};

static int basic_stm_init(void)
{
	return stm_register_protocol(&basic_pdrv);
}

static void basic_stm_exit(void)
{
	stm_unregister_protocol(&basic_pdrv);
}

module_init(basic_stm_init);
module_exit(basic_stm_exit);

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Basic STM framing protocol driver");
MODULE_AUTHOR("Alexander Shishkin <alexander.shishkin@linux.intel.com>");