| /* |
| * Shared Transport Line discipline driver Core |
| * Init Manager Module header file |
| * Copyright (C) 2009 Texas Instruments |
| * |
| * 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 |
| * |
| */ |
| |
| #ifndef ST_KIM_H |
| #define ST_KIM_H |
| |
| #include <linux/types.h> |
| #include "st.h" |
| #include "st_core.h" |
| #include "st_ll.h" |
| #include <linux/rfkill.h> |
| |
| /* time in msec to wait for |
| * line discipline to be installed |
| */ |
| #define LDISC_TIME 500 |
| #define CMD_RESP_TIME 500 |
| #define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \ |
| | ((unsigned short)((unsigned char)(b))) << 8)) |
| |
| #define GPIO_HIGH 1 |
| #define GPIO_LOW 0 |
| |
| /* the Power-On-Reset logic, requires to attempt |
| * to download firmware onto chip more than once |
| * since the self-test for chip takes a while |
| */ |
| #define POR_RETRY_COUNT 5 |
| |
| /** |
| * struct chip_version - save the chip version |
| */ |
| struct chip_version { |
| unsigned short full; |
| unsigned short chip; |
| unsigned short min_ver; |
| unsigned short maj_ver; |
| }; |
| |
| /** |
| * struct kim_data_s - the KIM internal data, embedded as the |
| * platform's drv data. One for each ST device in the system. |
| * @uim_pid: KIM needs to communicate with UIM to request to install |
| * the ldisc by opening UART when protocol drivers register. |
| * @kim_pdev: the platform device added in one of the board-XX.c file |
| * in arch/XX/ directory, 1 for each ST device. |
| * @kim_rcvd: completion handler to notify when data was received, |
| * mainly used during fw download, which involves multiple send/wait |
| * for each of the HCI-VS commands. |
| * @ldisc_installed: completion handler to notify that the UIM accepted |
| * the request to install ldisc, notify from tty_open which suggests |
| * the ldisc was properly installed. |
| * @resp_buffer: data buffer for the .bts fw file name. |
| * @fw_entry: firmware class struct to request/release the fw. |
| * @gpios: the list of core/chip enable gpios for BT, FM and GPS cores. |
| * @rx_state: the rx state for kim's receive func during fw download. |
| * @rx_count: the rx count for the kim's receive func during fw download. |
| * @rx_skb: all of fw data might not come at once, and hence data storage for |
| * whole of the fw response, only HCI_EVENTs and hence diff from ST's |
| * response. |
| * @rfkill: rfkill data for each of the cores to be registered with rfkill. |
| * @rf_protos: proto types of the data registered with rfkill sub-system. |
| * @core_data: ST core's data, which mainly is the tty's disc_data |
| * @version: chip version available via a sysfs entry. |
| * |
| */ |
| struct kim_data_s { |
| long uim_pid; |
| struct platform_device *kim_pdev; |
| struct completion kim_rcvd, ldisc_installed; |
| char resp_buffer[30]; |
| const struct firmware *fw_entry; |
| long gpios[ST_MAX]; |
| unsigned long rx_state; |
| unsigned long rx_count; |
| struct sk_buff *rx_skb; |
| struct rfkill *rfkill[ST_MAX]; |
| enum proto_type rf_protos[ST_MAX]; |
| struct st_data_s *core_data; |
| struct chip_version version; |
| }; |
| |
| /** |
| * functions called when 1 of the protocol drivers gets |
| * registered, these need to communicate with UIM to request |
| * ldisc installed, read chip_version, download relevant fw |
| */ |
| long st_kim_start(void *); |
| long st_kim_stop(void *); |
| |
| void st_kim_recv(void *, const unsigned char *, long count); |
| void st_kim_chip_toggle(enum proto_type, enum kim_gpio_state); |
| void st_kim_complete(void *); |
| void kim_st_list_protocols(struct st_data_s *, void *); |
| |
| /* |
| * BTS headers |
| */ |
| #define ACTION_SEND_COMMAND 1 |
| #define ACTION_WAIT_EVENT 2 |
| #define ACTION_SERIAL 3 |
| #define ACTION_DELAY 4 |
| #define ACTION_RUN_SCRIPT 5 |
| #define ACTION_REMARKS 6 |
| |
| /** |
| * struct bts_header - the fw file is NOT binary which can |
| * be sent onto TTY as is. The .bts is more a script |
| * file which has different types of actions. |
| * Each such action needs to be parsed by the KIM and |
| * relevant procedure to be called. |
| */ |
| struct bts_header { |
| uint32_t magic; |
| uint32_t version; |
| uint8_t future[24]; |
| uint8_t actions[0]; |
| } __attribute__ ((packed)); |
| |
| /** |
| * struct bts_action - Each .bts action has its own type of |
| * data. |
| */ |
| struct bts_action { |
| uint16_t type; |
| uint16_t size; |
| uint8_t data[0]; |
| } __attribute__ ((packed)); |
| |
| struct bts_action_send { |
| uint8_t data[0]; |
| } __attribute__ ((packed)); |
| |
| struct bts_action_wait { |
| uint32_t msec; |
| uint32_t size; |
| uint8_t data[0]; |
| } __attribute__ ((packed)); |
| |
| struct bts_action_delay { |
| uint32_t msec; |
| } __attribute__ ((packed)); |
| |
| struct bts_action_serial { |
| uint32_t baud; |
| uint32_t flow_control; |
| } __attribute__ ((packed)); |
| |
| /** |
| * struct hci_command - the HCI-VS for intrepreting |
| * the change baud rate of host-side UART, which |
| * needs to be ignored, since UIM would do that |
| * when it receives request from KIM for ldisc installation. |
| */ |
| struct hci_command { |
| uint8_t prefix; |
| uint16_t opcode; |
| uint8_t plen; |
| uint32_t speed; |
| } __attribute__ ((packed)); |
| |
| |
| #endif /* ST_KIM_H */ |