blob: 26c59efd9ed8f49f2936aae175752bd202789572 [file] [log] [blame]
Alex Elder4ccb6b72014-10-28 19:36:00 -05001/*
2 * Greybus protocol handling
3 *
4 * Copyright 2014 Google Inc.
Alex Eldera46e9672014-12-12 12:08:42 -06005 * Copyright 2014 Linaro Ltd.
Alex Elder4ccb6b72014-10-28 19:36:00 -05006 *
7 * Released under the GPLv2 only.
8 */
9
10#ifndef __PROTOCOL_H
11#define __PROTOCOL_H
12
Johan Hovoldfed78bf2015-05-19 11:22:41 +020013struct gb_connection;
Alex Elderf8fb05e2014-11-05 16:12:55 -060014struct gb_operation;
15
Alex Elder5d9fd7e2014-11-05 16:12:54 -060016typedef int (*gb_connection_init_t)(struct gb_connection *);
17typedef void (*gb_connection_exit_t)(struct gb_connection *);
Johan Hovold973ccfd2015-03-27 12:45:49 +010018typedef int (*gb_request_recv_t)(u8, struct gb_operation *);
Alex Elder5d9fd7e2014-11-05 16:12:54 -060019
Alex Elder6ae7fa42014-11-05 16:12:50 -060020/*
21 * Protocols having the same id but different major and/or minor
22 * version numbers are treated as distinct protocols. If it makes
23 * sense someday we could group protocols having the same id.
24 */
Alex Elder4ccb6b72014-10-28 19:36:00 -050025struct gb_protocol {
Alex Elder6ae7fa42014-11-05 16:12:50 -060026 u8 id;
27 u8 major;
28 u8 minor;
Alex Elder0e447652014-11-05 16:12:51 -060029 u8 count;
Alex Elder6ae7fa42014-11-05 16:12:50 -060030
Alex Elder6ae7fa42014-11-05 16:12:50 -060031 struct list_head links; /* global list */
Alex Elder5d9fd7e2014-11-05 16:12:54 -060032
33 gb_connection_init_t connection_init;
34 gb_connection_exit_t connection_exit;
Alex Elderf8fb05e2014-11-05 16:12:55 -060035 gb_request_recv_t request_recv;
Greg Kroah-Hartman12a5dfc2014-12-24 13:01:40 -080036 struct module *owner;
Greg Kroah-Hartman7422a1e2014-12-24 13:01:45 -080037 char *name;
Alex Elder4ccb6b72014-10-28 19:36:00 -050038};
39
Greg Kroah-Hartman12a5dfc2014-12-24 13:01:40 -080040int __gb_protocol_register(struct gb_protocol *protocol, struct module *module);
Johan Hovold78033842015-10-13 19:10:24 +020041void gb_protocol_deregister(struct gb_protocol *protocol);
Alex Elder4ccb6b72014-10-28 19:36:00 -050042
Greg Kroah-Hartman12a5dfc2014-12-24 13:01:40 -080043#define gb_protocol_register(protocol) \
44 __gb_protocol_register(protocol, THIS_MODULE)
45
Alex Elder0e447652014-11-05 16:12:51 -060046struct gb_protocol *gb_protocol_get(u8 id, u8 major, u8 minor);
Viresh Kumar1cb5fa42015-08-12 11:04:06 +053047int gb_protocol_get_version(struct gb_connection *connection);
Viresh Kumar36e79de2015-01-21 18:12:36 +053048
Alex Elder0e447652014-11-05 16:12:51 -060049void gb_protocol_put(struct gb_protocol *protocol);
Alex Elder4ccb6b72014-10-28 19:36:00 -050050
Alex Elder19d03de2014-11-05 16:12:53 -060051/*
52 * These are defined in their respective protocol source files.
53 * Declared here for now. They could be added via modules, or maybe
54 * just use initcalls (which level?).
55 */
Greg Kroah-Hartman7c7d5b92014-12-23 15:16:51 -080056extern int gb_gpio_protocol_init(void);
Alex Elder19d03de2014-11-05 16:12:53 -060057extern void gb_gpio_protocol_exit(void);
58
Greg Kroah-Hartman7c7d5b92014-12-23 15:16:51 -080059extern int gb_pwm_protocol_init(void);
Matt Porter34c65072014-11-13 09:14:13 -050060extern void gb_pwm_protocol_exit(void);
61
Greg Kroah-Hartman7c7d5b92014-12-23 15:16:51 -080062extern int gb_uart_protocol_init(void);
Alex Elder19d03de2014-11-05 16:12:53 -060063extern void gb_uart_protocol_exit(void);
64
Greg Kroah-Hartman7c7d5b92014-12-23 15:16:51 -080065extern int gb_sdio_protocol_init(void);
Alex Elder19d03de2014-11-05 16:12:53 -060066extern void gb_sdio_protocol_exit(void);
67
Greg Kroah-Hartman7c7d5b92014-12-23 15:16:51 -080068extern int gb_usb_protocol_init(void);
Greg Kroah-Hartman615772a2014-11-25 16:59:21 -080069extern void gb_usb_protocol_exit(void);
70
Greg Kroah-Hartman2c078172014-12-24 13:01:44 -080071extern int gb_i2c_protocol_init(void);
72extern void gb_i2c_protocol_exit(void);
73
Viresh Kumar15d651b2015-01-23 13:07:45 +053074extern int gb_spi_protocol_init(void);
75extern void gb_spi_protocol_exit(void);
76
Viresh Kumar27551b12015-05-20 17:20:09 +053077/* __protocol: Pointer to struct gb_protocol */
Greg Kroah-Hartman900ceba2014-12-23 15:16:54 -080078#define gb_protocol_driver(__protocol) \
79static int __init protocol_init(void) \
80{ \
81 return gb_protocol_register(__protocol); \
82} \
83module_init(protocol_init); \
84static void __exit protocol_exit(void) \
85{ \
86 gb_protocol_deregister(__protocol); \
87} \
Greg Kroah-Hartmanf487c802015-05-01 21:05:50 +020088module_exit(protocol_exit)
Greg Kroah-Hartman900ceba2014-12-23 15:16:54 -080089
Viresh Kumar27551b12015-05-20 17:20:09 +053090/* __protocol: string matching name of struct gb_protocol */
Viresh Kumare18822e2015-07-01 12:13:52 +053091#define gb_builtin_protocol_driver(__protocol) \
Viresh Kumar27551b12015-05-20 17:20:09 +053092int __init gb_##__protocol##_init(void) \
93{ \
94 return gb_protocol_register(&__protocol); \
95} \
Johan Hovold8d346df2015-05-21 11:47:24 +020096void gb_##__protocol##_exit(void) \
Viresh Kumar27551b12015-05-20 17:20:09 +053097{ \
98 gb_protocol_deregister(&__protocol); \
99} \
100
Alex Elder4ccb6b72014-10-28 19:36:00 -0500101#endif /* __PROTOCOL_H */