/* * MediaTek Bluetooth USB Driver * * Copyright (C) 2013, MediaTek co. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * or on the worldwide web at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * */ #ifndef __BTMTK_USB_H__ #define __BTMTK_USB_H_ /* Memory map for MTK BT */ /* SYS Control */ #define SYSCTL 0x400000 /* WLAN */ #define WLAN 0x410000 /* MCUCTL */ #define INT_LEVEL 0x0718 #define COM_REG0 0x0730 #define SEMAPHORE_00 0x07B0 #define SEMAPHORE_01 0x07B4 #define SEMAPHORE_02 0x07B8 #define SEMAPHORE_03 0x07BC /* Chip definition */ #define CONTROL_TIMEOUT_JIFFIES ((300 * HZ) / 100) #define DEVICE_VENDOR_REQUEST_OUT 0x40 #define DEVICE_VENDOR_REQUEST_IN 0xc0 #define DEVICE_CLASS_REQUEST_OUT 0x20 #define BTUSB_MAX_ISOC_FRAMES 10 #define BTUSB_INTR_RUNNING 0 #define BTUSB_BULK_RUNNING 1 #define BTUSB_ISOC_RUNNING 2 #define BTUSB_SUSPENDING 3 #define BTUSB_DID_ISO_RESUME 4 /* ROM Patch */ #define PATCH_HCI_HEADER_SIZE 4 #define PATCH_WMT_HEADER_SIZE 5 #define PATCH_HEADER_SIZE (PATCH_HCI_HEADER_SIZE + PATCH_WMT_HEADER_SIZE) #define UPLOAD_PATCH_UNIT 2048 #define PATCH_INFO_SIZE 30 #define PATCH_PHASE1 1 #define PATCH_PHASE2 2 #define PATCH_PHASE3 3 struct btmtk_usb_data { struct hci_dev *hdev; struct usb_device *udev; struct usb_interface *intf; struct usb_interface *isoc; spinlock_t lock; unsigned long flags; struct work_struct work; struct work_struct waker; struct usb_anchor tx_anchor; struct usb_anchor intr_anchor; struct usb_anchor bulk_anchor; struct usb_anchor isoc_anchor; struct usb_anchor deferred; int tx_in_flight; spinlock_t txlock; struct usb_endpoint_descriptor *intr_ep; struct usb_endpoint_descriptor *bulk_tx_ep; struct usb_endpoint_descriptor *bulk_rx_ep; struct usb_endpoint_descriptor *isoc_tx_ep; struct usb_endpoint_descriptor *isoc_rx_ep; __u8 cmdreq_type; unsigned int sco_num; int isoc_altsetting; int suspend_count; /* request for different io operation */ u8 w_request; u8 r_request; /* io buffer for usb control transfer */ char *io_buf; struct semaphore fw_upload_sem; /* unsigned char *fw_image; */ /* unsigned char *rom_patch; */ const struct firmware *firmware; u32 chip_id; u8 need_load_fw; u8 need_load_rom_patch; u32 rom_patch_offset; u32 rom_patch_len; }; static inline int is_mt7630(struct btmtk_usb_data *data) { return ((data->chip_id & 0xffff0000) == 0x76300000); } static inline int is_mt7650(struct btmtk_usb_data *data) { return ((data->chip_id & 0xffff0000) == 0x76500000); } static inline int is_mt7632(struct btmtk_usb_data *data) { return ((data->chip_id & 0xffff0000) == 0x76320000); } static inline int is_mt7662(struct btmtk_usb_data *data) { return ((data->chip_id & 0xffff0000) == 0x76620000); } #endif