/* * 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