![Thomas Gleixner](/assets/img/avatar_default.png)
Based on 1 normalized pattern(s): 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 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 136 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190530000436.384967451@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
165 lines
3.4 KiB
C
165 lines
3.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Bluetooth supports for Qualcomm Atheros ROME chips
|
|
*
|
|
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#define EDL_PATCH_CMD_OPCODE (0xFC00)
|
|
#define EDL_NVM_ACCESS_OPCODE (0xFC0B)
|
|
#define EDL_WRITE_BD_ADDR_OPCODE (0xFC14)
|
|
#define EDL_PATCH_CMD_LEN (1)
|
|
#define EDL_PATCH_VER_REQ_CMD (0x19)
|
|
#define EDL_PATCH_TLV_REQ_CMD (0x1E)
|
|
#define EDL_NVM_ACCESS_SET_REQ_CMD (0x01)
|
|
#define MAX_SIZE_PER_TLV_SEGMENT (243)
|
|
|
|
#define EDL_CMD_REQ_RES_EVT (0x00)
|
|
#define EDL_PATCH_VER_RES_EVT (0x19)
|
|
#define EDL_APP_VER_RES_EVT (0x02)
|
|
#define EDL_TVL_DNLD_RES_EVT (0x04)
|
|
#define EDL_CMD_EXE_STATUS_EVT (0x00)
|
|
#define EDL_SET_BAUDRATE_RSP_EVT (0x92)
|
|
#define EDL_NVM_ACCESS_CODE_EVT (0x0B)
|
|
|
|
#define EDL_TAG_ID_HCI (17)
|
|
#define EDL_TAG_ID_DEEP_SLEEP (27)
|
|
|
|
#define QCA_WCN3990_POWERON_PULSE 0xFC
|
|
#define QCA_WCN3990_POWEROFF_PULSE 0xC0
|
|
|
|
enum qca_baudrate {
|
|
QCA_BAUDRATE_115200 = 0,
|
|
QCA_BAUDRATE_57600,
|
|
QCA_BAUDRATE_38400,
|
|
QCA_BAUDRATE_19200,
|
|
QCA_BAUDRATE_9600,
|
|
QCA_BAUDRATE_230400,
|
|
QCA_BAUDRATE_250000,
|
|
QCA_BAUDRATE_460800,
|
|
QCA_BAUDRATE_500000,
|
|
QCA_BAUDRATE_720000,
|
|
QCA_BAUDRATE_921600,
|
|
QCA_BAUDRATE_1000000,
|
|
QCA_BAUDRATE_1250000,
|
|
QCA_BAUDRATE_2000000,
|
|
QCA_BAUDRATE_3000000,
|
|
QCA_BAUDRATE_4000000,
|
|
QCA_BAUDRATE_1600000,
|
|
QCA_BAUDRATE_3200000,
|
|
QCA_BAUDRATE_3500000,
|
|
QCA_BAUDRATE_AUTO = 0xFE,
|
|
QCA_BAUDRATE_RESERVED
|
|
};
|
|
|
|
enum rome_tlv_dnld_mode {
|
|
ROME_SKIP_EVT_NONE,
|
|
ROME_SKIP_EVT_VSE,
|
|
ROME_SKIP_EVT_CC,
|
|
ROME_SKIP_EVT_VSE_CC
|
|
};
|
|
|
|
enum rome_tlv_type {
|
|
TLV_TYPE_PATCH = 1,
|
|
TLV_TYPE_NVM
|
|
};
|
|
|
|
struct rome_config {
|
|
u8 type;
|
|
char fwname[64];
|
|
uint8_t user_baud_rate;
|
|
enum rome_tlv_dnld_mode dnld_mode;
|
|
};
|
|
|
|
struct edl_event_hdr {
|
|
__u8 cresp;
|
|
__u8 rtype;
|
|
__u8 data[0];
|
|
} __packed;
|
|
|
|
struct rome_version {
|
|
__le32 product_id;
|
|
__le16 patch_ver;
|
|
__le16 rome_ver;
|
|
__le32 soc_id;
|
|
} __packed;
|
|
|
|
struct tlv_seg_resp {
|
|
__u8 result;
|
|
} __packed;
|
|
|
|
struct tlv_type_patch {
|
|
__le32 total_size;
|
|
__le32 data_length;
|
|
__u8 format_version;
|
|
__u8 signature;
|
|
__u8 download_mode;
|
|
__u8 reserved1;
|
|
__le16 product_id;
|
|
__le16 rom_build;
|
|
__le16 patch_version;
|
|
__le16 reserved2;
|
|
__le32 entry;
|
|
} __packed;
|
|
|
|
struct tlv_type_nvm {
|
|
__le16 tag_id;
|
|
__le16 tag_len;
|
|
__le32 reserve1;
|
|
__le32 reserve2;
|
|
__u8 data[0];
|
|
} __packed;
|
|
|
|
struct tlv_type_hdr {
|
|
__le32 type_len;
|
|
__u8 data[0];
|
|
} __packed;
|
|
|
|
enum qca_btsoc_type {
|
|
QCA_INVALID = -1,
|
|
QCA_AR3002,
|
|
QCA_ROME,
|
|
QCA_WCN3990,
|
|
QCA_WCN3998,
|
|
};
|
|
|
|
#if IS_ENABLED(CONFIG_BT_QCA)
|
|
|
|
int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr);
|
|
int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
|
enum qca_btsoc_type soc_type, u32 soc_ver);
|
|
int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version);
|
|
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
|
|
static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
|
|
{
|
|
return soc_type == QCA_WCN3990 || soc_type == QCA_WCN3998;
|
|
}
|
|
#else
|
|
|
|
static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
|
enum qca_btsoc_type soc_type, u32 soc_ver)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|