/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *     * Neither the name of The Linux Foundation nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef _USB30_DWC_H
#define _USB30_DWC_H

#include <bits.h>


/********************* START: h/w defined values ******************************/
/* device command ids */
typedef enum
{
	DWC_DEV_CMD_TX_SET_LINK_FN_LMP_VAL     = 0x01,
	DWC_DEV_CMD_SET_PERIODIC_PARAMS_VAL    = 0x02,
	DWC_DEV_CMD_TX_FN_WAKE_DEV_NOTIFY_VAL  = 0x03,
	DWC_DEV_CMD_SET_SCRATCHPAD_BUF_LO_VAL  = 0x04,
	DWC_DEV_CMD_SET_SCRATCHPAD_BUF_HI_VAL  = 0x05,
	DWC_DEV_CMD_TX_FN_HOST_REQ_NOTIFY_VAL  = 0x06,
	DWC_DEV_CMD_TX_DEVICE_NOTIFY_VAL       = 0x07,
	DWC_DEV_CMD_SELECTED_FIFO_FLUSH_VAL    = 0x09,
	DWC_DEV_CMD_ALL_FIFO_FLUSH_VAL         = 0x0A,
	DWC_DEV_CMD_SET_EP_NRDY_VAL            = 0x0C,
	DWC_DEV_CMD_RUN_SOC_LOOPBACK_TEST_VAL  = 0x10,
} dwc_dev_cmd_t;

/* ep command ids */
typedef enum
{
	DEPCMD_CMD_SET_EP_CONF     = 0x1,
	DEPCMD_CMD_SET_TR_CONF     = 0x2,
	DEPCMD_CMD_GET_EP_STATE    = 0x3,
	DEPCMD_CMD_SET_STALL       = 0x4,
	DEPCMD_CMD_CLEAR_STALL     = 0x5,
	DEPCMD_CMD_START_TRANSFER  = 0x6,
	DEPCMD_CMD_UPDATE_TRANSFER = 0x7,
	DEPCMD_CMD_END_TRANSFER    = 0x8,
	DEPCMD_CMD_START_NEW_CONF  = 0x9,
} dwc_dep_cmd_id_t;

/* ep type */
typedef enum {
   EP_TYPE_CONTROL     = 0x0,
   EP_TYPE_ISOCHRONOUS = 0x1,
   EP_TYPE_BULK        = 0x2,
   EP_TYPE_INTERRUPT   = 0x3,
} dwc_ep_type_t;

/* ep direction */
typedef enum
{
	DWC_EP_DIRECTION_OUT = 0x0,
	DWC_EP_DIRECTION_IN  = 0x1
} dwc_ep_direction_t;


/* macros to parse event information */
#define DWC_EVENT_IS_DEVICE_EVENT(_event)                   BIT_SHIFT(_event, 0)

/* parse device events */
#define DWC_EVENT_DEVICE_EVENT_ID(_event)                   BITS_SHIFT(_event, 11, 8)
#define DWC_EVENT_DEVICE_EVENT_INFO(_event)                 BITS_SHIFT(_event, 24, 16)

#define DWC_EVENT_DEVICE_EVENT_INFO_SS_EVENT(_event_info)   BIT_SHIFT(_event_info, 4)
#define DWC_EVENT_DEVICE_EVENT_INFO_LINK_STATE(_event_info) BITS_SHIFT(_event_info, 3, 0)

/* parse ep events */
#define DWC_EVENT_EP_EVENT_PARAM(_event)                    BITS_SHIFT(_event, 31, 16)
#define DWC_EVENT_EP_EVENT_CMD_TYPE(_event)                 BITS_SHIFT(_event, 27, 24)
#define DWC_EVENT_EP_EVENT_XFER_RES_IDX(_event)             BITS_SHIFT(_event, 22, 16)
#define DWC_EVENT_EP_EVENT_STATUS(_event)                   BITS_SHIFT(_event, 15, 12)
#define DWC_EVENT_EP_EVENT_CTRL_STAGE(_event)               BITS_SHIFT(_event, 13, 12)
#define DWC_EVENT_EP_EVENT_ID(_event)                       BITS_SHIFT(_event,  9,  6)
#define DWC_EVENT_EP_EVENT_EP_NUM(_event)                   BITS_SHIFT(_event,  5,  1)

/* device event ids */
typedef enum
{
	DWC_EVENT_DEVICE_EVENT_ID_VENDOR_DEVICE_TEST_LMP = 12,
	DWC_EVENT_DEVICE_EVENT_ID_BUFFER_OVERFLOW        = 11,
	DWC_EVENT_DEVICE_EVENT_ID_GENERIC_CMD_COMPLETE   = 10,
	DWC_EVENT_DEVICE_EVENT_ID_ERRATIC_ERROR          = 9,
	DWC_EVENT_DEVICE_EVENT_ID_SOF                    = 7,
	DWC_EVENT_DEVICE_EVENT_ID_SUSPEND_ENTRY          = 6,
	DWC_EVENT_DEVICE_EVENT_ID_HIBER                  = 5,
	DWC_EVENT_DEVICE_EVENT_ID_WAKEUP                 = 4,
	DWC_EVENT_DEVICE_EVENT_ID_USB_LINK_STATUS_CHANGE = 3,
	DWC_EVENT_DEVICE_EVENT_ID_CONNECT_DONE           = 2,
	DWC_EVENT_DEVICE_EVENT_ID_USB_RESET              = 1,
	DWC_EVENT_DEVICE_EVENT_ID_DISCONNECT             = 0,
	DWC_EVENT_DEVICE_EVENTS_ALL                      =  BITS(0xFFFFFFFF, 12, 0)
} dwc_event_device_event_id_t;

/* ep event ids */
typedef enum
{
	DWC_EVENT_EP_CMD_COMPLETE     = 7,
	DWC_EVENT_EP_XFER_NOT_READY   = 3,
	DWC_EVENT_EP_XFER_IN_PROGRESS = 2,
	DWC_EVENT_EP_XFER_COMPLETE    = 1,
} dwc_event_ep_event_id_t;

/* values for control stage in ep events */
#define CONTROL_DATA_REQUEST     1
#define CONTROL_STATUS_REQUEST   2

/* values for event status field for transfer complete event */
#define DWC_XFER_COMPLETE_EVT_STATUS_SHORT_PKT 0x2
#define DWC_XFER_COMPLETE_EVT_STATUS_IOC       0x4
#define DWC_XFER_COMPLETE_EVT_STATUS_LST       0x8

/* master bus data width (DWC_USB3_MDWIDTH in snps data book) */
#define DWC_MASTER_BUS_WIDTH   8

/* super speed link states */
typedef enum
{
   U0 = 0x0,
   U1,
   U2,
   U3,
   SS_DIS,
   RX_DET,
   SS_INACT,
   POLL,
   RECOV,
   HRESET,
   CMPLY,
   LPBK,
   RESUME_RESET = 0xF,
} dwc_event_device_ss_link_state_t;

/* high speed link states */
typedef enum
{
   ON            = 0x0,
   L1            = 0x2,
   L2            = 0x3,
   DISCONNECTED  = 0x4,
   EARLY_SUSPEND = 0x5,
   RESET         = 0xE,
   RESUME        = 0xF,
} dwc_event_device_hs_link_state_t;

/* action for set config*/
enum
{
	SET_CONFIG_ACTION_INIT    = 0x0,
	SET_CONFIG_ACTION_RESTORE = 0x1,
	SET_CONFIG_ACTION_MODIFY  = 0x2,
};

/* EP Cmd Param bits */
#define DEPCMDPAR1_USB_EP_NUM_BIT     26
#define DEPCMDPAR1_USB_EP_DIR_BIT     25

#define DEPCMDPAR0_ACTION_BIT         30
#define DEPCMDPAR0_BURST_SIZE_BIT     22
#define DEPCMDPAR0_FIFO_NUM_BIT       17
#define DEPCMDPAR0_MAX_PKT_SIZE_BIT   3
#define DEPCMDPAR0_EP_TYPE_BIT        1

#define DEPCMDPAR2_XFER_N_RDY_BIT     10
#define DEPCMDPAR2_XFER_IN_PROG_BIT   9
#define DEPCMDPAR2_XFER_COMPLETE_BIT  8

enum
{
	DSTS_CONNECTSPD_HS  = 0,
	DSTS_CONNECTSPD_FS1 = 1, /* phy clk @ 30 or 60 MHz */
	DSTS_CONNECTSPD_LS  = 2,
	DSTS_CONNECTSPD_FS2 = 3, /* phy clk @ 48 MHz */
	DSTS_CONNECTSPD_SS  = 4,
};

/**************************** TRB (Transfer Request Block)*********************/
#define DWC_TRB_F1_PTR_LOW_BMSK  0xFFFFFFFF
#define DWC_TRB_F1_PTR_LOW_SHFT  0

#define DWC_TRB_F2_PTR_HIGH_BMSK 0xFFFFFFFF
#define DWC_TRB_F2_PTR_HIGH_SHFT 0

#define DWC_TRB_F3_BUFSIZ_BMSK   0x00FFFFFF
#define DWC_TRB_F3_BUFSIZ_SHFT   0
#define DWC_TRB_F3_PCM1_BMSK     0x03000000
#define DWC_TRB_F3_PCM1_SHFT     24
#define DWC_TRB_F3_TRBSTS_BMSK   0xF0000000
#define DWC_TRB_F3_TRBSTS_SHFT   28

#define DWC_TRB_F4_IOC_BMSK      0x800
#define DWC_TRB_F4_IOC_SHFT      11

#define DWC_TRB_F4_ISP_BMSK      0x400
#define DWC_TRB_F4_ISP_SHFT      10

#define DWC_TRB_F4_TRBCTL_BMSK   0x3F0
#define DWC_TRB_F4_TRBCTL_SHFT   4

#define DWC_TRB_F4_CSP_BMSK      0x8
#define DWC_TRB_F4_CSP_SHFT      3

#define DWC_TRB_F4_CHN_BMSK      0x4
#define DWC_TRB_F4_CHN_SHFT      2

#define DWC_TRB_F4_LST_BMSK      0x2
#define DWC_TRB_F4_LST_SHFT      1

#define DWC_TRB_F4_HWO_BMSK      0x1
#define DWC_TRB_F4_HWO_SHFT      0
/**************************** END - TRB ***************************************/

#define DWC_MAX_BYTES_PER_TRB  0x00FFFFFF

/********************* END: h/w defined values ********************************/



/******************** START: local data not needed by external APIs ***********/

/* event buffer: used to manage various controller events */
typedef struct {
   uint32_t *buf;       /* ptr to event buffer. */
   uint16_t  buf_size;  /* size of buf. */
   uint16_t  max_index; /* max index value. initialized once. used to track rollover. */
   uint16_t  index;     /* index into the buf for reading next event */
} dwc_event_buf_t;

/* device command */
typedef struct {
	uint32_t cmd;
	uint32_t param;
} dwc_device_cmd_t;

/* ep command */
typedef struct {
	uint32_t cmd;
	uint8_t  xfer_resource_index;
	uint32_t param2;
	uint32_t param1;
	uint32_t param0;
} dwc_ep_cmd_t;

/* state of data transfer on an ep */
typedef enum
{
	EP_STATE_INIT           = 0x0, /* initial state. cannot start transfer. */
	EP_STATE_INACTIVE       = 0x1, /* start xfer has not been issued. transfer is NOT in progress. start transfer can be issued ONLY in this state. */
	EP_STATE_START_TRANSFER = 0x2, /* start xfer is issued but cmd is not completed yet. */
	EP_STATE_XFER_IN_PROG   = 0x3, /* start xfer is issued and xfer is in progress. */
} dwc_ep_state_t;

/* control fsm states: states to manage control transfers */
typedef enum
{
	EP_FSM_INIT            = 0,
	EP_FSM_SETUP           = 1,
	EP_FSM_CTRL_DATA       = 2,
	EP_FSM_WAIT_FOR_HOST_2 = 3, /* 2-stage transfer wait-for-host stage */
	EP_FSM_WAIT_FOR_HOST_3 = 4, /* 3-stage transfer wait-for-host stage */
	EP_FSM_STATUS_2        = 5,
	EP_FSM_STATUS_3        = 6,
	EP_FSM_STALL           = 7,
} dwc_ctrl_fsm_t;

/* TRB type */
typedef enum
{
	TRBCTL_NORMAL            = 1,
	TRBCTL_CONTROL_SETUP     = 2,
	TRBCTL_CONTROL_STATUS_2  = 3,
	TRBCTL_CONTROL_STATUS_3  = 4,
	TRBCTL_CONTROL_DATA      = 5,
	TRBCTL_LINK_TRB          = 8,
} dwc_trb_trbctl_t;

/* data transfer request */
typedef struct
{
	uint8_t         *data;
	uint32_t         len;
	dwc_trb_trbctl_t trbctl;
	void            *context;
	void (*callback)(void *context, uint32_t actual, int status);
} dwc_request_t;

/******************** END: local data not needed by external APIs *************/


/******************** START: data needed by external APIs *********************/

/* TRB fields */
typedef struct
{
   uint32_t f1;
   uint32_t f2;
   uint32_t f3;
   uint32_t f4;
} dwc_trb_t;

/* index into the ep array of the dwc device */
#define DWC_EP_INDEX(_usb_ep, _direction) (((_usb_ep) << 1) | (_direction))

/* phyical ep number: same as ep index. */
#define DWC_EP_PHY_NUM(_usb_ep, _direction) (((_usb_ep) << 1) | (_direction))

/* since we assume non-flexible mapping, phy_num is same as index. */
#define DWC_EP_PHY_TO_INDEX(_ep_phy_num)  (_ep_phy_num)

typedef void (*dwc_transfer_callback_t)(void *context, uint32_t actual, int status);

/* length of zero-length-packet */
/* TODO: shouldn't this be same a max pkt size for the EP
 * which is specified by udc? fastboot doesn't need this.
 * So this is not verified.
 */
#define DWC_ZLP_BUF_SIZE    512

/* Structure to keep all information about an endpoint */
typedef struct
{
	uint8_t             number;        /* usb ep number */
	dwc_ep_direction_t  dir;           /* usb ep direction */
	dwc_ep_type_t       type;          /* ctrl/blk etc. */
	uint16_t            max_pkt_size;  /* max packet size */
	uint8_t             zlp;           /* uses zero length pkt to terminate xfer */
	uint32_t            burst_size;    /* max packets to transfer before waiting for ack */

	uint8_t             phy_num;       /* physical EP to which this usb ep is mapped */
	uint8_t             tx_fifo_num;   /* which TX FIFO to use. only applies to IN endpoints */

	uint8_t             zlp_buf[DWC_ZLP_BUF_SIZE];  /* buffer needed to pad when OUT requests are not exact multiple of max_pkt_size and for zlp */

	uint8_t             resource_idx;  /* assigned by h/w on each start xfer cmd. Needed to stop/update xfers. */

	dwc_trb_t          *trb;           /* ptr to the first TRB in the chain. */
	uint32_t            trb_count;     /* size of TRB chain. */
	uint32_t            trb_queued;    /* number of TRBs queued in the current request. */
	uint32_t            bytes_queued;  /* number of bytes queued in the current request. */
	dwc_request_t       req;           /* transfer request that is currently queued on this ep. */

	dwc_ep_state_t      state;         /* data transfer state of the ep. */

} dwc_ep_t;


/* dwc device events */
typedef enum
{
	DWC_NOTIFY_EVENT_OFFLINE,
	DWC_NOTIFY_EVENT_CONNECTED_LS,
	DWC_NOTIFY_EVENT_CONNECTED_FS,
	DWC_NOTIFY_EVENT_CONNECTED_HS,
	DWC_NOTIFY_EVENT_CONNECTED_SS,
	DWC_NOTIFY_EVENT_DISCONNECTED,
} dwc_notify_event_t;

/* maximum number of endpoints supported. */
#define DWC_MAX_NUM_OF_EP     8

/* length of setup packet */
#define DWC_SETUP_PKT_LEN    8

enum
{
	DWC_SETUP_ERROR    = -1,
	DWC_SETUP_2_STAGE  =  2,
	DWC_SETUP_3_STAGE  =  3,
};

/* Structure to keep all DWC device information. */
typedef struct
{
	void           *base;       /* base address for snps core registers */
	uint32_t        core_id;    /* snps core version. read from h/w during init */

	dwc_ep_t        ep[DWC_MAX_NUM_OF_EP]; /* array of endpoint data */
	dwc_event_buf_t event_buf;  /* event buffer management */
	dwc_ctrl_fsm_t  ctrl_state; /* states to manage control transfers : setup/data/wait/status */

	uint8_t         *setup_pkt; /* Buffer for the received setup packet */

	/* callback into client to notify device events: online/offline/connect speed */
	void *notify_context;
	void (*notify)(void *context, dwc_notify_event_t event);

	/* callback into client to process the setup msgs. */
	void *setup_context;
	int (*setup_handler)(void* context, uint8_t* data);

} dwc_dev_t;


/* config data to initialize dwc layer */
typedef struct
{
   void     *base;            /* dwc base address */
   uint32_t *event_buf;       /* buffer to be used for h/w events */
   uint16_t  event_buf_size;  /* buffer size */

   /* callback for dwc events */
   void *notify_context;
   void (*notify)(void *context, dwc_notify_event_t event);

   /* callback for handling setup packets */
   void *setup_context;
   int (*setup_handler)(void *context, uint8_t *data);

} dwc_config_t;

/********************************* dwc global apis ****************************/

/* generic apis */
dwc_dev_t* dwc_init(dwc_config_t *config);
void dwc_reset(dwc_dev_t *dev, uint8_t reset);

/* phy specific apis */
void dwc_phy_digital_reset(dwc_dev_t *dev);
void dwc_usb2_phy_soft_reset(dwc_dev_t *dev);
void dwc_ss_phy_workaround_12(dwc_dev_t *dev);

/* device specific apis */
void dwc_device_init(dwc_dev_t *dev);
void dwc_device_reset(dwc_dev_t *dev);
void dwc_device_run(dwc_dev_t *dev, uint8_t run);
void dwc_device_set_addr(dwc_dev_t *dev, uint16_t addr);
void dwc_device_set_configuration(dwc_dev_t *dev);
void dwc_device_set_periodic_param(dwc_dev_t *dev, uint32_t val);
void dwc_device_add_ep(dwc_dev_t *dev, dwc_ep_t *new_ep);

/* data transfer apis */
int dwc_transfer_request(dwc_dev_t *dwc,
						 uint8_t usb_ep,
						 dwc_ep_direction_t dir,
						 void *buf,
						 uint32_t len,
						 dwc_transfer_callback_t callback,
						 void *callback_context);

/******************** END: data needed by external APIs *********************/
/* static apis */

/* command complete event handler */
static void dwc_event_handle_cmd_complete(dwc_dev_t *dev, uint32_t *event);

/* device event handler */
static void dwc_event_handler_device(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_device_link_status_change(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_device_reset(dwc_dev_t *dev);
static void dwc_event_device_connect_done(dwc_dev_t *dev);
static void dwc_event_device_disconnect(dwc_dev_t *dev);

/* bulk ep event handling functions */
static void dwc_event_handler_ep_bulk(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_bulk_state_inactive(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_bulk_state_xfer_in_prog(dwc_dev_t *dev, uint32_t *event);
static void dwc_ep_bulk_state_inactive_enter(dwc_dev_t *dev, uint8_t ep_phy_num);

/* control ep event handling functions */
static void dwc_event_handler_ep_ctrl(dwc_dev_t *dev, uint32_t *event);

static void dwc_ep_ctrl_state_setup_enter(dwc_dev_t *dev);
static void dwc_event_handler_ep_ctrl_state_setup(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_data(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_wait_for_host_2(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_wait_for_host_3(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_status_2(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_status_3(dwc_dev_t *dev, uint32_t *event);
static void dwc_event_handler_ep_ctrl_state_stall(dwc_dev_t *dev, uint32_t *event);

static enum handler_return dwc_irq_handler_ee1(void* arg);
static void dwc_ep_config_init_enable(dwc_dev_t *dev, uint8_t index);
void dwc_ep_cmd_clear_stall(dwc_dev_t *dev, uint8_t ep_phy_num);

static int dwc_request_queue(dwc_dev_t *dev, uint8_t ep_phy_num, dwc_request_t *req);
#endif
