提交 e47515d8 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #758 from JianRuiqian/master

[DeviceDrivers] improve sdio
...@@ -135,6 +135,8 @@ struct rt_sdio_function { ...@@ -135,6 +135,8 @@ struct rt_sdio_function {
rt_uint32_t enable_timeout_val; /* max enable timeout in msec */ rt_uint32_t enable_timeout_val; /* max enable timeout in msec */
struct rt_sdio_function_tuple *tuples; struct rt_sdio_function_tuple *tuples;
void *priv;
}; };
#define SDIO_MAX_FUNCTIONS 7 #define SDIO_MAX_FUNCTIONS 7
......
...@@ -111,7 +111,7 @@ struct rt_mmcsd_host { ...@@ -111,7 +111,7 @@ struct rt_mmcsd_host {
rt_uint32_t max_blk_count; /* maximum block count */ rt_uint32_t max_blk_count; /* maximum block count */
rt_uint32_t spi_use_crc; rt_uint32_t spi_use_crc;
struct rt_semaphore bus_lock; struct rt_mutex bus_lock;
struct rt_semaphore sem_ack; struct rt_semaphore sem_ack;
rt_uint32_t sdio_irq_num; rt_uint32_t sdio_irq_num;
......
...@@ -229,6 +229,8 @@ rt_int32_t sdio_detach_irq(struct rt_sdio_function *func); ...@@ -229,6 +229,8 @@ rt_int32_t sdio_detach_irq(struct rt_sdio_function *func);
void sdio_irq_wakeup(struct rt_mmcsd_host *host); void sdio_irq_wakeup(struct rt_mmcsd_host *host);
rt_int32_t sdio_enable_func(struct rt_sdio_function *func); rt_int32_t sdio_enable_func(struct rt_sdio_function *func);
rt_int32_t sdio_disable_func(struct rt_sdio_function *func); rt_int32_t sdio_disable_func(struct rt_sdio_function *func);
void sdio_set_drvdata(struct rt_sdio_function *func, void *data);
void* sdio_get_drvdata(struct rt_sdio_function *func);
rt_int32_t sdio_set_block_size(struct rt_sdio_function *func, rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
rt_uint32_t blksize); rt_uint32_t blksize);
rt_int32_t sdio_register_driver(struct rt_sdio_driver *driver); rt_int32_t sdio_register_driver(struct rt_sdio_driver *driver);
......
...@@ -49,12 +49,12 @@ static rt_uint32_t mmcsd_hotpluge_mb_pool[4]; ...@@ -49,12 +49,12 @@ static rt_uint32_t mmcsd_hotpluge_mb_pool[4];
void mmcsd_host_lock(struct rt_mmcsd_host *host) void mmcsd_host_lock(struct rt_mmcsd_host *host)
{ {
rt_sem_take(&host->bus_lock, RT_WAITING_FOREVER); rt_mutex_take(&host->bus_lock, RT_WAITING_FOREVER);
} }
void mmcsd_host_unlock(struct rt_mmcsd_host *host) void mmcsd_host_unlock(struct rt_mmcsd_host *host)
{ {
rt_sem_release(&host->bus_lock); rt_mutex_release(&host->bus_lock);
} }
void mmcsd_req_complete(struct rt_mmcsd_host *host) void mmcsd_req_complete(struct rt_mmcsd_host *host)
...@@ -713,7 +713,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void) ...@@ -713,7 +713,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void)
host->max_blk_size = 512; host->max_blk_size = 512;
host->max_blk_count = 4096; host->max_blk_count = 4096;
rt_sem_init(&host->bus_lock, "sd_bus_lock", 1, RT_IPC_FLAG_FIFO); rt_mutex_init(&host->bus_lock, "sd_bus_lock", RT_IPC_FLAG_FIFO);
rt_sem_init(&host->sem_ack, "sd_ack", 0, RT_IPC_FLAG_FIFO); rt_sem_init(&host->sem_ack, "sd_ack", 0, RT_IPC_FLAG_FIFO);
return host; return host;
...@@ -721,7 +721,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void) ...@@ -721,7 +721,7 @@ struct rt_mmcsd_host *mmcsd_alloc_host(void)
void mmcsd_free_host(struct rt_mmcsd_host *host) void mmcsd_free_host(struct rt_mmcsd_host *host)
{ {
rt_sem_detach(&host->bus_lock); rt_mutex_detach(&host->bus_lock);
rt_sem_detach(&host->sem_ack); rt_sem_detach(&host->sem_ack);
rt_free(host); rt_free(host);
} }
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
#ifndef RT_SDIO_STACK_SIZE #ifndef RT_SDIO_STACK_SIZE
#define RT_SDIO_STACK_SIZE 512 #define RT_SDIO_STACK_SIZE 512
#endif #endif
#ifndef RT_SDIO_THREAD_PREORITY #ifndef RT_SDIO_THREAD_PRIORITY
#define RT_SDIO_THREAD_PREORITY 0x40 #define RT_SDIO_THREAD_PRIORITY 0x40
#endif #endif
static rt_list_t sdio_cards; static rt_list_t sdio_cards;
...@@ -1059,7 +1059,7 @@ static rt_int32_t sdio_irq_thread_create(struct rt_mmcsd_card *card) ...@@ -1059,7 +1059,7 @@ static rt_int32_t sdio_irq_thread_create(struct rt_mmcsd_card *card)
RT_ASSERT(host->sdio_irq_sem != RT_NULL); RT_ASSERT(host->sdio_irq_sem != RT_NULL);
host->sdio_irq_thread = rt_thread_create("sdio_irq", sdio_irq_thread, host, host->sdio_irq_thread = rt_thread_create("sdio_irq", sdio_irq_thread, host,
RT_SDIO_STACK_SIZE, RT_SDIO_THREAD_PREORITY, 20); RT_SDIO_STACK_SIZE, RT_SDIO_THREAD_PRIORITY, 20);
if (host->sdio_irq_thread != RT_NULL) if (host->sdio_irq_thread != RT_NULL)
{ {
rt_thread_startup(host->sdio_irq_thread); rt_thread_startup(host->sdio_irq_thread);
...@@ -1079,7 +1079,7 @@ static rt_int32_t sdio_irq_thread_delete(struct rt_mmcsd_card *card) ...@@ -1079,7 +1079,7 @@ static rt_int32_t sdio_irq_thread_delete(struct rt_mmcsd_card *card)
if (!host->sdio_irq_num) if (!host->sdio_irq_num)
{ {
if (host->flags & MMCSD_SUP_SDIO_IRQ) if (host->flags & MMCSD_SUP_SDIO_IRQ)
host->ops->enable_sdio_irq(host, 0); host->ops->enable_sdio_irq(host, 0);
rt_sem_delete(host->sdio_irq_sem); rt_sem_delete(host->sdio_irq_sem);
host->sdio_irq_sem = RT_NULL; host->sdio_irq_sem = RT_NULL;
rt_thread_delete(host->sdio_irq_thread); rt_thread_delete(host->sdio_irq_thread);
...@@ -1253,6 +1253,16 @@ err: ...@@ -1253,6 +1253,16 @@ err:
return -RT_EIO; return -RT_EIO;
} }
void sdio_set_drvdata(struct rt_sdio_function *func, void *data)
{
func->priv = data;
}
void* sdio_get_drvdata(struct rt_sdio_function *func)
{
return func->priv;
}
rt_int32_t sdio_set_block_size(struct rt_sdio_function *func, rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
rt_uint32_t blksize) rt_uint32_t blksize)
{ {
...@@ -1284,16 +1294,24 @@ rt_int32_t sdio_set_block_size(struct rt_sdio_function *func, ...@@ -1284,16 +1294,24 @@ rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
rt_inline rt_int32_t sdio_match_card(struct rt_mmcsd_card *card, rt_inline rt_int32_t sdio_match_card(struct rt_mmcsd_card *card,
const struct rt_sdio_device_id *id) const struct rt_sdio_device_id *id)
{ {
rt_uint8_t num = 1;
if ((id->manufacturer != SDIO_ANY_MAN_ID) && if ((id->manufacturer != SDIO_ANY_MAN_ID) &&
(id->manufacturer != card->cis.manufacturer)) (id->manufacturer != card->cis.manufacturer))
return 0; return 0;
if ((id->product != SDIO_ANY_PROD_ID) &&
(id->product != (card->cis.product | 1))) while (num <= card->sdio_function_num)
return 0; {
if ((id->product != SDIO_ANY_PROD_ID) &&
(id->product == card->sdio_function[num]->product))
return 1;
num++;
}
return 1; return 0;
} }
static struct rt_mmcsd_card *sdio_match_driver(struct rt_sdio_device_id *id) static struct rt_mmcsd_card *sdio_match_driver(struct rt_sdio_device_id *id)
{ {
rt_list_t *l; rt_list_t *l;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册