blob: f065d0299ef3926ae3d92abc7e1286885eb55dfa [file] [log] [blame]
/*
* Copyright (c) 2016,2017 MediaTek Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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 http://www.gnu.org/licenses/gpl-2.0.html for more details.
*/
#ifndef _BTMTK_UART_H_
#define _BTMTK_UART_H_
#include "btmtk_define.h"
#include "btmtk_main.h"
#include "btmtk_buffer_mode.h"
#include "btmtk_woble.h"
#include "btmtk_chip_reset.h"
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/serial.h>
#include <linux/of_device.h>
#include <linux/regulator/consumer.h>
#include <linux/gpio/consumer.h>
#include <linux/pinctrl/consumer.h>
#include <linux/clk.h>
#include <linux/suspend.h>
#if (USE_DEVICE_NODE == 1)
#include "btmtk_proj_sp.h"
#endif
#define HCI_HEADER_LEN 4
struct mtk_stp_hdr {
u8 prefix;
__be16 dlen;
u8 cs;
} __packed;
#define MTK_STP_TLR_SIZE 2
#define STP_HEADER_LEN 4
#define STP_HEADER_CRC_LEN 2
#define BTMTKUART_FLAG_STANDALONE_HW BIT(0)
/* CMD&Event sent by driver */
#define READ_REGISTER_CMD_LEN 16
#define READ_REGISTER_EVT_HDR_LEN 11
#define WRITE_REGISTER_CMD_LEN 24
#define WRITE_REGISTER_EVT_HDR_LEN 11
/* MCU address offset */
#define MCU_ADDRESS_OFFSET_CMD 12
#define MCU_ADDRESS_OFFSET_EVT 16
/* MCU value offset */
#define MCU_VALUE_OFFSET_CMD 16
/* Pimux Address and Value */
#define BT_PINMUX_CTRL_REG 0x70005054
#define BT_SUBSYS_RST_PINMUX 0x00000020
#define BT_CTSRTS_PINMUX 0x00044000
#define BT_PINMUX_CTRL_ENABLE (BT_SUBSYS_RST_PINMUX | BT_CTSRTS_PINMUX)
#define BT_SUBSYS_RST_REG 0x70002610
#define BT_SUBSYS_RST_ENABLE 0x00000080
#define BT_REG_LEN 4
#define BT_REG_VALUE_LEN 4
/* MCU baud define */
#define BT_FLOWCTRL_OFFSET 12
#define BT_NONE_FC 0x00
#define BT_HW_FC 0x40
#define BT_SW_FC 0x80
/**
* Send cmd dispatch evt
*/
#define HCI_EV_VENDOR 0xff
#define READ_ADDRESS_EVT_HDR_LEN 7
#define READ_ADDRESS_EVT_PAYLOAD_OFFSET 7
#define WOBLE_DEBUG_EVT_TYPE 0xE8
#define LD_PATCH_CMD_LEN 10
#define LD_PATCH_EVT_LEN 8
#define SETBAUD_CMD_LEN 14
#define SETBAUD_EVT_LEN 9
#define GETBAUD_CMD_LEN 9
#define GETBAUD_EVT_LEN 9
#define BAUD_SIZE 4
#define WAKEUP_CMD_LEN 5
#define WAKEUP_EVT_LEN 9
#if (USE_DEVICE_NODE == 0)
#define FWOWN_CMD_LEN 9
#define DRVOWN_CMD_LEN 1
#define OWNTYPE_EVT_LEN 9
#else
#define FWOWN_CMD_LEN 10
#define DRVOWN_CMD_LEN 1
#define OWNTYPE_EVT_LEN 10
#endif
#define BTMTK_MAX_SEND_RETRY 10000
#define BT_UART_DEFAULT_BAUD 115200
/* Delay time between subsys reset GPIO pull low/high */
#define SUBSYS_RESET_GPIO_DELAY_TIME 50
/* Delay time after write data to io_buf */
#define IO_BUF_DELAY_TIME 50
typedef int (*pdwnc_func) (u8 fgReset);
typedef int (*reset_func_ptr2) (unsigned int gpio, int init_value);
typedef int (*set_gpio_low)(u8 gpio);
typedef int (*set_gpio_high)(u8 gpio);
enum UART_FC {
UART_DISABLE_FC = 0, /*NO flow control*/
/*MTK SW Flow Control, differs from Linux Flow Control*/
UART_MTK_SW_FC = 1,
UART_LINUX_FC = 2, /*Linux SW Flow Control*/
UART_HW_FC = 3, /*HW Flow Control*/
};
struct UART_CONFIG {
enum UART_FC fc;
int parity;
int stop_bit;
int iBaudrate;
};
struct btmtk_uart_data {
unsigned int flags;
const char *fwname;
};
struct btmtk_uart_dev {
struct hci_dev *hdev;
struct tty_struct *tty;
unsigned long hdev_flags;
/* For tx queue */
struct sk_buff_head tx_queue;
spinlock_t tx_lock;
struct task_struct *tx_task;
atomic_t thread_status;
unsigned long tx_state;
/* For rx queue */
struct sk_buff *rx_skb;
unsigned long rx_state;
struct sk_buff *evt_skb;
wait_queue_head_t p_wait_event_q;
unsigned int subsys_reset;
unsigned int dongle_state;
unsigned int uart_baudrate_set;
u8 stp_pad[6];
u8 stp_cursor;
u16 stp_dlen;
struct UART_CONFIG uart_cfg;
struct btmtk_woble bt_woble;
/* config form dts*/
u32 baudrate;
u32 hub_en;
u32 sleep_en;
u32 flush_en;
/* For uarthub setting */
u8 fw_hub_en;
u8 crc_en;
u8 rhw_en;
u8 fw_dl_ready;
/* driver,fw own */
bool no_fw_own;
u8 own_state;
struct timer_list fw_own_timer;
atomic_t fw_own_timer_flag;
atomic_t need_drv_own;
atomic_t fw_wake;
/* sempaphore to compare event */
struct semaphore evt_comp_sem;
#if (USE_DEVICE_NODE == 1)
/* dynamic tx power control */
struct btmtk_dypwr_st dy_pwr;
#endif
};
#define btmtk_uart_is_standalone(bdev) \
((bdev)->data->flags & BTMTKUART_FLAG_STANDALONE_HW)
#define btmtk_uart_is_builtin_soc(bdev) \
!((bdev)->data->flags & BTMTKUART_FLAG_STANDALONE_HW)
/**
* Maximum rom patch file name length
*/
#define N_MTK (15+1)
/**
* Upper layeard IOCTL
*/
#define HCIUARTSETPROTO _IOW('U', 200, int)
#define HCIUARTSETBAUD _IOW('U', 201, int)
#define HCIUARTGETBAUD _IOW('U', 202, int)
#define HCIUARTSETSTP _IOW('U', 203, int)
#define HCIUARTLOADPATCH _IOW('U', 204, int)
#define HCIUARTSETWAKEUP _IOW('U', 205, int)
#define HCIUARTINIT _IOW('U', 206, int)
/**
* parameter settings
*/
#define BTMTK_HUB_EN (1 << 0)
#define BTMTK_SLEEP_EN (1 << 1)
//int btmtk_cif_send_calibration(struct hci_dev *hdev);
#endif