xref: /openbmc/linux/drivers/bluetooth/hci_uart.h (revision 7c40fb8d)
11da177e4SLinus Torvalds /*
20372a662SMarcel Holtmann  *
30372a662SMarcel Holtmann  *  Bluetooth HCI UART driver
40372a662SMarcel Holtmann  *
50372a662SMarcel Holtmann  *  Copyright (C) 2000-2001  Qualcomm Incorporated
60372a662SMarcel Holtmann  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
70372a662SMarcel Holtmann  *  Copyright (C) 2004-2005  Marcel Holtmann <marcel@holtmann.org>
80372a662SMarcel Holtmann  *
90372a662SMarcel Holtmann  *
100372a662SMarcel Holtmann  *  This program is free software; you can redistribute it and/or modify
110372a662SMarcel Holtmann  *  it under the terms of the GNU General Public License as published by
120372a662SMarcel Holtmann  *  the Free Software Foundation; either version 2 of the License, or
130372a662SMarcel Holtmann  *  (at your option) any later version.
140372a662SMarcel Holtmann  *
150372a662SMarcel Holtmann  *  This program is distributed in the hope that it will be useful,
160372a662SMarcel Holtmann  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
170372a662SMarcel Holtmann  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
180372a662SMarcel Holtmann  *  GNU General Public License for more details.
190372a662SMarcel Holtmann  *
200372a662SMarcel Holtmann  *  You should have received a copy of the GNU General Public License
210372a662SMarcel Holtmann  *  along with this program; if not, write to the Free Software
220372a662SMarcel Holtmann  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
230372a662SMarcel Holtmann  *
241da177e4SLinus Torvalds  */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #ifndef N_HCI
271da177e4SLinus Torvalds #define N_HCI	15
281da177e4SLinus Torvalds #endif
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds /* Ioctls */
311da177e4SLinus Torvalds #define HCIUARTSETPROTO		_IOW('U', 200, int)
321da177e4SLinus Torvalds #define HCIUARTGETPROTO		_IOR('U', 201, int)
33d2158744SMarcel Holtmann #define HCIUARTGETDEVICE	_IOR('U', 202, int)
3463c7d09cSJohan Hedberg #define HCIUARTSETFLAGS		_IOW('U', 203, int)
3563c7d09cSJohan Hedberg #define HCIUARTGETFLAGS		_IOR('U', 204, int)
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds /* UART protocols */
38e9a2dd26SMarcel Holtmann #define HCI_UART_MAX_PROTO	8
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds #define HCI_UART_H4	0
411da177e4SLinus Torvalds #define HCI_UART_BCSP	1
421da177e4SLinus Torvalds #define HCI_UART_3WIRE	2
431da177e4SLinus Torvalds #define HCI_UART_H4DS	3
44166d2f6aSOhad Ben-Cohen #define HCI_UART_LL	4
45b3190df6SSuraj Sumangala #define HCI_UART_ATH3K	5
4616e3887fSMarcel Holtmann #define HCI_UART_INTEL	6
47e9a2dd26SMarcel Holtmann #define HCI_UART_BCM	7
481da177e4SLinus Torvalds 
4963c7d09cSJohan Hedberg #define HCI_UART_RAW_DEVICE	0
50a55e1f38SMarcel Holtmann #define HCI_UART_RESET_ON_INIT	1
518a7a3fd6SMarcel Holtmann #define HCI_UART_CREATE_AMP	2
529f2aee84SJohan Hedberg #define HCI_UART_INIT_PENDING	3
536afd04adSMarcel Holtmann #define HCI_UART_EXT_CONFIG	4
54fb2ce8d1SMarcel Holtmann #define HCI_UART_VND_DETECT	5
5563c7d09cSJohan Hedberg 
561da177e4SLinus Torvalds struct hci_uart;
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds struct hci_uart_proto {
591da177e4SLinus Torvalds 	unsigned int id;
607c40fb8dSMarcel Holtmann 	const char *name;
611da177e4SLinus Torvalds 	int (*open)(struct hci_uart *hu);
621da177e4SLinus Torvalds 	int (*close)(struct hci_uart *hu);
631da177e4SLinus Torvalds 	int (*flush)(struct hci_uart *hu);
649d1c40ebSMarcel Holtmann 	int (*recv)(struct hci_uart *hu, const void *data, int len);
651da177e4SLinus Torvalds 	int (*enqueue)(struct hci_uart *hu, struct sk_buff *skb);
66eb173809SLoic Poulain 	int (*setup)(struct hci_uart *hu);
671da177e4SLinus Torvalds 	struct sk_buff *(*dequeue)(struct hci_uart *hu);
681da177e4SLinus Torvalds };
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds struct hci_uart {
711da177e4SLinus Torvalds 	struct tty_struct	*tty;
721da177e4SLinus Torvalds 	struct hci_dev		*hdev;
731da177e4SLinus Torvalds 	unsigned long		flags;
7463c7d09cSJohan Hedberg 	unsigned long		hdev_flags;
751da177e4SLinus Torvalds 
769f2aee84SJohan Hedberg 	struct work_struct	init_ready;
77da64c27dSFelipe Balbi 	struct work_struct	write_work;
789f2aee84SJohan Hedberg 
794ee7ef19SMarcel Holtmann 	const struct hci_uart_proto *proto;
801da177e4SLinus Torvalds 	void			*priv;
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds 	struct sk_buff		*tx_skb;
831da177e4SLinus Torvalds 	unsigned long		tx_state;
841da177e4SLinus Torvalds 	spinlock_t		rx_lock;
851da177e4SLinus Torvalds };
861da177e4SLinus Torvalds 
8763c7d09cSJohan Hedberg /* HCI_UART proto flag bits */
881da177e4SLinus Torvalds #define HCI_UART_PROTO_SET	0
899f2aee84SJohan Hedberg #define HCI_UART_REGISTERED	1
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds /* TX states  */
921da177e4SLinus Torvalds #define HCI_UART_SENDING	1
931da177e4SLinus Torvalds #define HCI_UART_TX_WAKEUP	2
941da177e4SLinus Torvalds 
954ee7ef19SMarcel Holtmann int hci_uart_register_proto(const struct hci_uart_proto *p);
964ee7ef19SMarcel Holtmann int hci_uart_unregister_proto(const struct hci_uart_proto *p);
971da177e4SLinus Torvalds int hci_uart_tx_wakeup(struct hci_uart *hu);
989f2aee84SJohan Hedberg int hci_uart_init_ready(struct hci_uart *hu);
991da177e4SLinus Torvalds 
1000372a662SMarcel Holtmann #ifdef CONFIG_BT_HCIUART_H4
1010372a662SMarcel Holtmann int h4_init(void);
1020372a662SMarcel Holtmann int h4_deinit(void);
103e1a38d70SMarcel Holtmann 
104e1a38d70SMarcel Holtmann struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
105e1a38d70SMarcel Holtmann 			    const unsigned char *buffer, int count);
1060372a662SMarcel Holtmann #endif
1070372a662SMarcel Holtmann 
1080372a662SMarcel Holtmann #ifdef CONFIG_BT_HCIUART_BCSP
1090372a662SMarcel Holtmann int bcsp_init(void);
1100372a662SMarcel Holtmann int bcsp_deinit(void);
1110372a662SMarcel Holtmann #endif
112166d2f6aSOhad Ben-Cohen 
113166d2f6aSOhad Ben-Cohen #ifdef CONFIG_BT_HCIUART_LL
114166d2f6aSOhad Ben-Cohen int ll_init(void);
115166d2f6aSOhad Ben-Cohen int ll_deinit(void);
116166d2f6aSOhad Ben-Cohen #endif
117b3190df6SSuraj Sumangala 
118b3190df6SSuraj Sumangala #ifdef CONFIG_BT_HCIUART_ATH3K
119b3190df6SSuraj Sumangala int ath_init(void);
120b3190df6SSuraj Sumangala int ath_deinit(void);
121b3190df6SSuraj Sumangala #endif
1227dec65c8SJohan Hedberg 
1237dec65c8SJohan Hedberg #ifdef CONFIG_BT_HCIUART_3WIRE
1247dec65c8SJohan Hedberg int h5_init(void);
1257dec65c8SJohan Hedberg int h5_deinit(void);
1267dec65c8SJohan Hedberg #endif
12716e3887fSMarcel Holtmann 
12816e3887fSMarcel Holtmann #ifdef CONFIG_BT_HCIUART_INTEL
12916e3887fSMarcel Holtmann int intel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
13016e3887fSMarcel Holtmann #endif
131e9a2dd26SMarcel Holtmann 
132e9a2dd26SMarcel Holtmann #ifdef CONFIG_BT_HCIUART_BCM
133e9a2dd26SMarcel Holtmann int bcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
134e9a2dd26SMarcel Holtmann #endif
135