/* * hsi-if.h * * Part of the HSI character driver, private headers. * * Copyright (C) 2009 Nokia Corporation. All rights reserved. * Copyright (C) 2009 Texas Instruments, Inc. * * Author: Andras Domokos * Author: Sebastien JAN * * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _HSI_IF_H #define _HSI_IF_H #define HSI_EV_MASK (0xffff << 0) #define HSI_EV_TYPE_MASK (0x0f << 16) #define HSI_EV_IN (0x01 << 16) #define HSI_EV_OUT (0x02 << 16) #define HSI_EV_EXCEP (0x03 << 16) #define HSI_EV_AVAIL (0x04 << 16) #define HSI_EV_TYPE(event) ((event) & HSI_EV_TYPE_MASK) #define HSI_HWBREAK 1 #define HSI_ERROR 2 #define HSI_MAX_CHANNELS 16 #define CHANNEL_MASK 0xFF #define HSI_LL_INVALID_CHANNEL 0xFF struct hsi_event { unsigned int event; u32 *data; unsigned int count; }; struct if_hsi_channel { struct hsi_device *dev; unsigned int channel_id; u32 *tx_data; unsigned int tx_count; u32 *rx_data; unsigned int rx_count; unsigned int opened; unsigned int state; u32 *tx_buf; u32 *rx_buf; unsigned int tx_state; unsigned int rx_state; unsigned int tx_nak_count; unsigned int rx_nak_count; spinlock_t lock; /* Serializes access to channel data */ }; struct if_hsi_iface { struct if_hsi_channel channels[HSI_MAX_CHANNELS]; #if 0 int bootstrap; #endif unsigned long init_chan_map; spinlock_t lock; /* Serializes access to HSI functional interface */ }; struct if_hsi_cmd { u32 tx_cmd[50]; u32 rx_cmd[50]; struct timespec tx_cmd_time[50]; struct timespec rx_cmd_time[50]; }; enum { HSI_LL_MSG_BREAK = 0x00, HSI_LL_MSG_ECHO = 0x01, HSI_LL_MSG_INFO_REQ = 0x02, HSI_LL_MSG_INFO = 0x03, HSI_LL_MSG_CONFIGURE = 0x04, HSI_LL_MSG_ALLOCATE_CH = 0x05, HSI_LL_MSG_RELEASE_CH = 0x06, HSI_LL_MSG_OPEN_CONN = 0x07, HSI_LL_MSG_CONN_READY = 0x08, HSI_LL_MSG_CONN_CLOSED = 0x09, HSI_LL_MSG_CANCEL_CONN = 0x0A, HSI_LL_MSG_ACK = 0x0B, HSI_LL_MSG_NAK = 0x0C, HSI_LL_MSG_CONF_RATE = 0x0D, HSI_LL_MSG_OPEN_CONN_OCTET = 0x0E, HSI_LL_MSG_INVALID = 0xFF, }; enum { HSI_LL_TX_STATE_UNDEF, HSI_LL_TX_STATE_CLOSED, HSI_LL_TX_STATE_IDLE, HSI_LL_TX_STATE_POWER_DOWN, HSI_LL_TX_STATE_ERROR, HSI_LL_TX_STATE_SEND_OPEN_CONN, HSI_LL_TX_STATE_WAIT_FOR_ACK, HSI_LL_TX_STATE_NACK, HSI_LL_TX_STATE_WAIT_FOR_CONN_READY, HSI_LL_TX_STATE_SEND_CONF_RATE, HSI_LL_TX_STATE_WAIT_FOR_CONF_ACK, HSI_LL_TX_STATE_TX, HSI_LL_TX_STATE_WAIT_FOR_CONN_CLOSED, HSI_LL_TX_STATE_TO_OPEN_CONN, HSI_LL_TX_STATE_TO_ACK, HSI_LL_TX_STATE_TO_READY, HSI_LL_TX_STATE_TO_CONF, HSI_LL_TX_STATE_TO_CONF_ACK, HSI_LL_TX_STATE_TO_TX, HSI_LL_TX_STATE_TO_CLOSE, HSI_LL_TX_STATE_SEND_BREAK, }; enum { HSI_LL_RX_STATE_UNDEF, HSI_LL_RX_STATE_CLOSED, HSI_LL_RX_STATE_IDLE, HSI_LL_RX_STATE_POWER_DOWN, HSI_LL_RX_STATE_ERROR, HSI_LL_RX_STATE_BLOCKED, HSI_LL_RX_STATE_SEND_ACK, HSI_LL_RX_STATE_SEND_NACK, HSI_LL_RX_STATE_SEND_CONN_READY, HSI_LL_RX_STATE_RX, HSI_LL_RX_STATE_SEND_CONN_CLOSED, HSI_LL_RX_STATE_SEND_CONN_CANCEL, HSI_LL_RX_STATE_WAIT_FOR_CANCEL_CONN_ACK, HSI_LL_RX_STATE_SEND_CONF_ACK, HSI_LL_RX_STATE_SEND_CONF_NACK, HSI_LL_RX_STATE_TO_RX, HSI_LL_RX_STATE_TO_ACK, HSI_LL_RX_STATE_TO_NACK, HSI_LL_RX_STATE_TO_CONN_READY, HSI_LL_RX_STATE_TO_CONN_CLOSED, HSI_LL_RX_STATE_TO_CONN_CANCEL, HSI_LL_RX_STATE_TO_CONN_CANCEL_ACK, HSI_LL_RX_STATE_TO_CONF_ACK, HSI_LL_RX_STATE_SEND_BREAK, }; int if_hsi_init(void); int if_hsi_exit(void); int if_hsi_start(int ch); void if_hsi_stop(int ch); void if_hsi_send_break(int ch); void if_hsi_flush_rx(int ch); void if_hsi_flush_tx(int ch); void if_hsi_bootstrap(int ch); void if_hsi_set_wakeline(int ch, unsigned int state); void if_hsi_get_wakeline(int ch, unsigned int *state); #if 0 int if_hsi_set_rx(int ch, struct hsi_rx_config *cfg); void if_hsi_get_rx(int ch, struct hsi_rx_config *cfg); int if_hsi_set_tx(int ch, struct hsi_tx_config *cfg); void if_hsi_get_tx(int ch, struct hsi_tx_config *cfg); #endif int if_hsi_read(int ch, u32 *data, unsigned int count); int if_hsi_poll(int ch); int if_hsi_write(int ch, u32 *data, unsigned int count); void if_hsi_cancel_read(int ch); void if_hsi_cancel_write(int ch); void if_notify(int ch, struct hsi_event *ev); int hsi_proto_read(int ch, u32 *buffer, int count); int hsi_proto_write(int ch, u32 *buffer, int length); int hsi_decode_cmd(u32 *data, u32 *cmd, u32 *ch, u32 *param); int protocol_create_cmd(int cmd_type, unsigned int channel, void *arg); int hsi_protocol_send_command(u32 cmd, u32 channel, u32 param); void rx_stm(u32 cmd, u32 ch, u32 param); #if 0 int hsi_start_protocol(void); #endif #endif /* _HSI_IF_H */