144 lines
4.8 KiB
C
144 lines
4.8 KiB
C
/*
|
|
* Copyright (c) 202X Amlogic, Inc. All rights reserved.
|
|
*
|
|
* This source code is subject to the terms and conditions defined in the
|
|
* file 'LICENSE' which is part of this source code package.
|
|
*
|
|
* Description:
|
|
*/
|
|
|
|
#ifndef __INTF_SDIO_H__
|
|
#define __INTF_SDIO_H__
|
|
|
|
enum SDIO_STD_FUNNUM {
|
|
SDIO_FUNC0=0,
|
|
SDIO_FUNC1,
|
|
SDIO_FUNC2,
|
|
SDIO_FUNC3,
|
|
SDIO_FUNC4,
|
|
SDIO_FUNC5,
|
|
SDIO_FUNC6,
|
|
SDIO_FUNC7,
|
|
};
|
|
|
|
/* max page num while process a sdio write operation*/
|
|
#define SG_PAGE_MAX 80
|
|
#define MAXSG_SIZE (SG_PAGE_MAX * 2)
|
|
#define MAX_SG_ENTRIES (MAXSG_SIZE+2)
|
|
#define SG_NUM_MAX 16
|
|
#define SG_WRITE 1 //MMC_DATA_WRITE
|
|
#define SG_FRAME_MAX (1 * SG_NUM_MAX)
|
|
|
|
#define FUNCNUM_SDIO_LAST SDIO_FUNC7
|
|
#define SDIO_FUNCNUM_MAX (FUNCNUM_SDIO_LAST+1)
|
|
#define OS_LOCK spinlock_t
|
|
|
|
struct tx_trb_info_ex
|
|
{
|
|
/* The number of pages needed for a single transfer */
|
|
unsigned int packet_num;
|
|
/* Actual size used for each page */
|
|
unsigned short buffer_size[128];
|
|
};
|
|
|
|
struct amlw_hif_scatter_item {
|
|
struct sk_buff *skbbuf;
|
|
int len;
|
|
int page_num;
|
|
void *packet;
|
|
};
|
|
|
|
struct amlw_hif_scatter_req {
|
|
/* address for the read/write operation */
|
|
unsigned int addr;
|
|
/* request flags */
|
|
unsigned int req;
|
|
/* total length of entire transfer */
|
|
unsigned int len;
|
|
|
|
void (*complete) (struct sk_buff *);
|
|
|
|
bool free;
|
|
int result;
|
|
int scat_count;
|
|
|
|
struct scatterlist sgentries[MAX_SG_ENTRIES];
|
|
struct amlw_hif_scatter_item scat_list[MAX_SG_ENTRIES];
|
|
struct tx_trb_info_ex page;
|
|
};
|
|
|
|
struct aml_hwif_sdio {
|
|
struct sdio_func * sdio_func_if[SDIO_FUNCNUM_MAX];
|
|
bool scatter_enabled;
|
|
|
|
/* protects access to scat_req */
|
|
OS_LOCK scat_lock;
|
|
|
|
/* scatter request list head */
|
|
struct amlw_hif_scatter_req *scat_req;
|
|
};
|
|
|
|
struct aml_hif_sdio_ops {
|
|
//sdio func0 for self define domain, cmd52
|
|
int (*hi_self_define_domain_func0_write8)(int addr, unsigned char data);
|
|
unsigned char (*hi_self_define_domain_func0_read8)(int addr);
|
|
//sdio func1 for self define domain, cmd52
|
|
int (*hi_self_define_domain_write8)(int addr, unsigned char data);
|
|
unsigned char (*hi_self_define_domain_read8)(int addr);
|
|
int (*hi_self_define_domain_write32)(unsigned long sram_addr, unsigned long sramdata);
|
|
unsigned long (*hi_self_define_domain_read32)(unsigned long sram_addr);
|
|
|
|
//sdio func2 for random ram
|
|
void (*hi_random_word_write)(unsigned int addr, unsigned int data);
|
|
unsigned int (*hi_random_word_read)(unsigned int addr);
|
|
void (*hi_random_ram_write)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
void (*hi_random_ram_read)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
|
|
//sdio func3 for sram
|
|
void (*hi_sram_word_write)(unsigned int addr, unsigned int data);
|
|
unsigned int (*hi_sram_word_read)(unsigned int addr);
|
|
void (*hi_sram_write)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
void (*hi_sram_read)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
|
|
//sdio func4 for tx buffer
|
|
void (*hi_tx_buffer_write)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
void (*hi_tx_buffer_read)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
|
|
//sdio func5 for rxdesc
|
|
void (*hi_desc_read)(unsigned char *buf, unsigned char *addr, size_t len);
|
|
|
|
//sdio func6 for rx buffer
|
|
void (*hi_rx_buffer_read)(unsigned char* buf, unsigned char* addr, size_t len, unsigned char scat_use);
|
|
|
|
//scatter list operation
|
|
int (*hi_enable_scat)(struct aml_hwif_sdio *hif_sdio);
|
|
void (*hi_cleanup_scat)(struct aml_hwif_sdio *hif_sdio);
|
|
struct amlw_hif_scatter_req * (*hi_get_scatreq)(struct aml_hwif_sdio *hif_sdio);
|
|
int (*hi_scat_rw)(struct scatterlist *sg_list, unsigned int sg_num, unsigned int blkcnt,
|
|
unsigned char func_num, unsigned int addr, unsigned char write);
|
|
int (*hi_send_frame)(struct amlw_hif_scatter_req *scat_req);
|
|
int (*hi_recv_frame)(struct amlw_hif_scatter_req *scat_req);
|
|
|
|
//sdio func7 for bt
|
|
void (*bt_hi_write_sram)(unsigned char* buf, unsigned char* addr, SYS_TYPE len);
|
|
void (*bt_hi_read_sram)(unsigned char* buf, unsigned char* addr, SYS_TYPE len);
|
|
void (*bt_hi_write_word)(unsigned int addr,unsigned int data);
|
|
unsigned int (*bt_hi_read_word)(unsigned int addr);
|
|
|
|
//suspend & resume
|
|
int (*hif_suspend)(unsigned int suspend_enable);
|
|
};
|
|
|
|
extern struct aml_hif_sdio_ops g_hif_sdio_ops;
|
|
extern struct sdio_func *aml_priv_to_func(int func_n);
|
|
|
|
void amlbt_intf_sdio_write_word(unsigned int addr, unsigned int data);
|
|
unsigned int amlbt_intf_sdio_read_word(unsigned int addr);
|
|
void amlbt_intf_sdio_read_sram(unsigned char* buf, unsigned char* addr, unsigned int len);
|
|
void amlbt_intf_sdio_write_sram(unsigned char* buf, unsigned char* addr, unsigned int len);
|
|
void amlbt_intf_sdio_register(void);
|
|
void amlbt_intf_sdio_unregister(void);
|
|
|
|
#endif
|
|
|