/*
 * Greybus protocol handling
 *
 * Copyright 2014 Google Inc.
 *
 * Released under the GPLv2 only.
 */

#ifndef __PROTOCOL_H
#define __PROTOCOL_H

#include "greybus.h"

struct gb_operation;

typedef int (*gb_connection_init_t)(struct gb_connection *);
typedef void (*gb_connection_exit_t)(struct gb_connection *);
typedef void (*gb_request_recv_t)(struct gb_operation *);

/*
 * Protocols having the same id but different major and/or minor
 * version numbers are treated as distinct protocols.  If it makes
 * sense someday we could group protocols having the same id.
 */
struct gb_protocol {
	u8			id;
	u8			major;
	u8			minor;
	u8			count;

	struct list_head	links;		/* global list */

	gb_connection_init_t	connection_init;
	gb_connection_exit_t	connection_exit;
	gb_request_recv_t	request_recv;
};

bool gb_protocol_register(struct gb_protocol *protocol);
bool gb_protocol_deregister(struct gb_protocol *protocol);

struct gb_protocol *gb_protocol_get(u8 id, u8 major, u8 minor);
void gb_protocol_put(struct gb_protocol *protocol);

/*
 * These are defined in their respective protocol source files.
 * Declared here for now.  They could be added via modules, or maybe
 * just use initcalls (which level?).
 */
extern bool gb_battery_protocol_init(void);
extern void gb_battery_protocol_exit(void);

extern bool gb_gpio_protocol_init(void);
extern void gb_gpio_protocol_exit(void);

extern bool gb_i2c_protocol_init(void);
extern void gb_i2c_protocol_exit(void);

extern bool gb_uart_protocol_init(void);
extern void gb_uart_protocol_exit(void);

extern bool gb_sdio_protocol_init(void);
extern void gb_sdio_protocol_exit(void);

bool gb_protocol_init(void);
void gb_protocol_exit(void);

#endif /* __PROTOCOL_H */
