summaryrefslogtreecommitdiff
path: root/drivers/staging/cg2900/include/cg2900.h
blob: eddfb71c8e41a90dad74472bb37edb430f69079f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
/*
 * Copyright (C) ST-Ericsson SA 2010
 * Authors:
 * Par-Gunnar Hjalmdahl (par-gunnar.p.hjalmdahl@stericsson.com) for ST-Ericsson.
 * Henrik Possung (henrik.possung@stericsson.com) for ST-Ericsson.
 * Josef Kindberg (josef.kindberg@stericsson.com) for ST-Ericsson.
 * Dariusz Szymszak (dariusz.xd.szymczak@stericsson.com) for ST-Ericsson.
 * Kjell Andersson (kjell.k.andersson@stericsson.com) for ST-Ericsson.
 * License terms:  GNU General Public License (GPL), version 2
 *
 * Linux Bluetooth HCI H:4 Driver for ST-Ericsson CG2900 connectivity
 * controller.
 */

#ifndef _CG2900_H_
#define _CG2900_H_

#include <linux/types.h>

/* Perform reset. No parameters used */
#define CG2900_CHAR_DEV_IOCTL_RESET		_IOW('U', 210, int)
/* Check for reset */
#define CG2900_CHAR_DEV_IOCTL_CHECK4RESET	_IOR('U', 212, int)
/* Retrieve revision info */
#define CG2900_CHAR_DEV_IOCTL_GET_REVISION	_IOR('U', 213, \
						     struct cg2900_rev_data)

#define CG2900_CHAR_DEV_IOCTL_EVENT_IDLE	0
#define CG2900_CHAR_DEV_IOCTL_EVENT_RESET	1

/**
 * struct cg2900_rev_data - Contains revision data for the local controller.
 * @revision:		Revision of the controller, e.g. to indicate that it is
 *			a CG2900 controller.
 * @sub_version:	Subversion of the controller, e.g. to indicate a certain
 *			tape-out of the controller.
 *
 * The values to match retrieved values to each controller may be retrieved from
 * the manufacturer.
 */
struct cg2900_rev_data {
	int revision;
	int sub_version;
};

#ifdef __KERNEL__
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/skbuff.h>

/* Temporary solution while in staging directory */
#include "cg2900_hci.h"

/**
 * struct cg2900_chip_rev_info - Chip info structure.
 * @manufacturer:	Chip manufacturer.
 * @hci_version:	Bluetooth version supported over HCI.
 * @hci_revision:	Chip revision, i.e. which chip is this.
 * @lmp_pal_version:	Bluetooth version supported over air.
 * @hci_sub_version:	Chip sub-version, i.e. which tape-out is this.
 *
 * Note that these values match the Bluetooth Assigned Numbers,
 * see http://www.bluetooth.org/
 */
struct cg2900_chip_rev_info {
	u16	manufacturer;
	u8	hci_version;
	u16	hci_revision;
	u8	lmp_pal_version;
	u16	hci_sub_version;
};

struct cg2900_chip_dev;

/**
 * struct cg2900_id_callbacks - Chip handler identification callbacks.
 * @check_chip_support:	Called when chip is connected. If chip is supported by
 *			driver, return true and fill in @callbacks in @dev.
 *
 * Note that the callback may be NULL. It must always be NULL checked before
 * calling.
 */
struct cg2900_id_callbacks {
	bool (*check_chip_support)(struct cg2900_chip_dev *dev);
};

/**
 * struct cg2900_chip_callbacks - Callback functions registered by chip handler.
 * @data_from_chip:	Called when data shall be transmitted to user.
 * @chip_removed:	Called when chip is removed.
 *
 * Note that some callbacks may be NULL. They must always be NULL checked before
 * calling.
 */
struct cg2900_chip_callbacks {
	void (*data_from_chip)(struct cg2900_chip_dev *dev,
			       struct sk_buff *skb);
	void (*chip_removed)(struct cg2900_chip_dev *dev);
};

/**
 * struct cg2900_trans_callbacks - Callback functions registered by transport.
 * @open:		CG2900 Core needs a transport.
 * @close:		CG2900 Core does not need a transport.
 * @write:		CG2900 Core transmits to the chip.
 * @set_chip_power:	CG2900 Core enables or disables the chip.
 * @chip_startup_finished:	CG2900 Chip startup finished notification.
 *
 * Note that some callbacks may be NULL. They must always be NULL checked before
 * calling.
 */
struct cg2900_trans_callbacks {
	int (*open)(struct cg2900_chip_dev *dev);
	int (*close)(struct cg2900_chip_dev *dev);
	int (*write)(struct cg2900_chip_dev *dev, struct sk_buff *skb);
	void (*set_chip_power)(struct cg2900_chip_dev *dev, bool chip_on);
	void (*chip_startup_finished)(struct cg2900_chip_dev *dev);
};

/**
 * struct cg2900_chip_dev - Chip handler info structure.
 * @dev:	Device associated with this chip.
 * @pdev:	Platform device associated with this chip.
 * @chip:	Chip info such as manufacturer.
 * @c_cb:	Callback structure for the chip handler.
 * @t_cb:	Callback structure for the transport.
 * @c_data:	Arbitrary data set by chip handler.
 * @t_data:	Arbitrary data set by transport.
 * @b_data:	Arbitrary data set by board handler.
 * @prv_data:	Arbitrary data set by CG2900 Core.
 */
struct cg2900_chip_dev {
	struct device			*dev;
	struct platform_device		*pdev;
	struct cg2900_chip_rev_info	chip;
	struct cg2900_chip_callbacks	c_cb;
	struct cg2900_trans_callbacks	t_cb;
	void				*c_data;
	void				*t_data;
	void				*b_data;
	void				*prv_data;
};

/**
 * struct cg2900_platform_data - Contains platform data for CG2900.
 * @init:		Callback called upon system start.
 * @exit:		Callback called upon system shutdown.
 * @enable_chip:	Callback called for enabling CG2900 chip.
 * @disable_chip:	Callback called for disabling CG2900 chip.
 * @get_power_switch_off_cmd:	Callback called to retrieve
 *				HCI VS_Power_Switch_Off command (command
 *				HCI requires platform specific GPIO data).
 * @regulator_id:	Id of the regulator that powers on the chip
 * @bus:		Transport used, see @include/net/bluetooth/hci.h.
 * @gpio_sleep:		Array of GPIO sleep settings.
 * @enable_uart:	Callback called when switching from UART GPIO to
 *			UART HW.
 * @disable_uart:	Callback called when switching from UART HW to
 *			UART GPIO.
 * @n_uart_gpios:	Number of UART GPIOs.
 * @uart_enabled:	Array of size @n_uart_gpios with GPIO setting for
 *			enabling UART HW (switching from GPIO mode).
 * @uart_disabled:	Array of size @n_uart_gpios with GPIO setting for
 *			disabling UART HW (switching to GPIO mode).
 * @uart:		Platform data structure for UART transport.
 *
 * Any callback may be NULL if not needed.
 */
struct cg2900_platform_data {
	int (*init)(struct cg2900_chip_dev *dev);
	void (*exit)(struct cg2900_chip_dev *dev);
	void (*enable_chip)(struct cg2900_chip_dev *dev);
	void (*disable_chip)(struct cg2900_chip_dev *dev);
	struct sk_buff* (*get_power_switch_off_cmd)(struct cg2900_chip_dev *dev,
						    u16 *op_code);

	char *regulator_id;
	__u8 bus;
	enum cg2900_gpio_pull_sleep *gpio_sleep;

	struct {
		int (*enable_uart)(struct cg2900_chip_dev *dev);
		int (*disable_uart)(struct cg2900_chip_dev *dev);
		int n_uart_gpios;
		unsigned long *uart_enabled;
		unsigned long *uart_disabled;
	} uart;
};

/**
 * struct cg2900_user_data - Contains platform data for CG2900 user.
 * @dev:		Current device. Set by CG2900 user upon probe.
 * @opened:		True if channel is opened.
 * @user_data:		Data set and used by CG2900 user.
 * @private_data:	Data set and used by CG2900 driver.
 * @h4_channel:		H4 channel. Set by CG2900 driver.
 * @is_audio:		True if this channel is an audio channel. Set by CG2900
 *			driver.
 * @is_clk_user:	whether enabling CG29XX was started external entity
 *			for eg. WLAN.
 * @chip_independent:	True if this channel does not require chip to be
 *			powered. Set by CG2900 driver.
 * @bt_bus:		Transport used, see @include/net/bluetooth/hci.h.
 * @char_dev_name:	Name to be used for character device.
 * @channel_data:	Input data specific to current device.
 * @open:		Open device channel. Set by CG2900 driver.
 * @close:		Close device channel. Set by CG2900 driver.
 * @reset:		Reset connectivity controller. Set by CG2900 driver.
 * @alloc_skb:		Alloc sk_buffer. Set by CG2900 driver.
 * @write:		Write to device channel. Set by CG2900 driver.
 * @get_local_revision:	Get revision data of conncected chip. Set by CG2900
 *			driver.
 * @read_cb:		Callback function called when data is received on the
 *			device channel. Set by CG2900 user. Mandatory.
 * @reset_cb:		Callback function called when the connectivity
 *			controller has been reset. Set by CG2900 user.
 *
 * Any callback may be NULL if not needed.
 */
struct cg2900_user_data {
	struct device *dev;
	bool opened;

	void *user_data;
	void *private_data;

	int	h4_channel;
	bool	is_audio;
	bool	is_clk_user;
	bool	chip_independent;

	union {
		__u8 bt_bus;
		char *char_dev_name;
	} channel_data;

	int (*open)(struct cg2900_user_data *user_data);
	void (*close)(struct cg2900_user_data *user_data);
	int (*reset)(struct cg2900_user_data *user_data);
	struct sk_buff * (*alloc_skb)(unsigned int size, gfp_t priority);
	int (*write)(struct cg2900_user_data *user_data, struct sk_buff *skb);
	bool (*get_local_revision)(struct cg2900_user_data *user_data,
				   struct cg2900_rev_data *rev_data);

	void (*read_cb)(struct cg2900_user_data *user_data,
			struct sk_buff *skb);
	void (*reset_cb)(struct cg2900_user_data *user_data);
};

static inline void *cg2900_get_usr(struct cg2900_user_data *dev)
{
	if (dev)
		return dev->user_data;
	return NULL;
}

static inline void cg2900_set_usr(struct cg2900_user_data *dev, void *data)
{
	if (dev)
		dev->user_data = data;
}

static inline void *cg2900_get_prv(struct cg2900_user_data *dev)
{
	if (dev)
		return dev->private_data;
	return NULL;
}

static inline void cg2900_set_prv(struct cg2900_user_data *dev, void *data)
{
	if (dev)
		dev->private_data = data;
}

extern int cg2900_register_chip_driver(struct cg2900_id_callbacks *cb);
extern void cg2900_deregister_chip_driver(struct cg2900_id_callbacks *cb);
extern int cg2900_register_trans_driver(struct cg2900_chip_dev *dev);
extern int cg2900_deregister_trans_driver(struct cg2900_chip_dev *dev);
extern unsigned long cg2900_get_sleep_timeout(void);

#endif /* __KERNEL__ */
#endif /* _CG2900_H_ */