update sdio driver
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1980 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
dea9c19e5e
commit
79a699b7bf
|
@ -44,6 +44,10 @@ static const rt_uint8_t speed_value[16] =
|
||||||
static const rt_uint32_t speed_unit[8] =
|
static const rt_uint32_t speed_unit[8] =
|
||||||
{ 10000, 100000, 1000000, 10000000, 0, 0, 0, 0 };
|
{ 10000, 100000, 1000000, 10000000, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
rt_inline rt_int32_t sdio_match_function(struct rt_sdio_function *func,
|
||||||
|
const struct rt_sdio_device_id *id);
|
||||||
|
|
||||||
|
|
||||||
rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr, rt_uint32_t
|
rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr, rt_uint32_t
|
||||||
*cmd5_resp)
|
*cmd5_resp)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +443,7 @@ static rt_int32_t sdio_read_cis(struct rt_sdio_function *func)
|
||||||
|
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
data = sdio_io_readb(func,
|
data = sdio_io_readb(func0,
|
||||||
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_CIS + i, &ret);
|
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_CIS + i, &ret);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -529,8 +533,8 @@ static rt_int32_t sdio_read_cis(struct rt_sdio_function *func)
|
||||||
curr->size = tpl_link;
|
curr->size = tpl_link;
|
||||||
*prev = curr;
|
*prev = curr;
|
||||||
prev = &curr->next;
|
prev = &curr->next;
|
||||||
rt_kprintf( "CIS tuple code %#x, length %d\n",
|
rt_kprintf( "function %d, CIS tuple code %#x, length %d\n",
|
||||||
tpl_code, tpl_link);
|
func->num, tpl_code, tpl_link);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,7 +576,7 @@ static rt_int32_t sdio_read_fbr(struct rt_sdio_function *func)
|
||||||
rt_int32_t ret;
|
rt_int32_t ret;
|
||||||
rt_uint8_t data;
|
rt_uint8_t data;
|
||||||
|
|
||||||
data = sdio_io_readb(func,
|
data = sdio_io_readb(func->card->sdio_func0,
|
||||||
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_FUNC_IF, &ret);
|
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_FUNC_IF, &ret);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -581,7 +585,7 @@ static rt_int32_t sdio_read_fbr(struct rt_sdio_function *func)
|
||||||
|
|
||||||
if (data == 0x0f)
|
if (data == 0x0f)
|
||||||
{
|
{
|
||||||
data = sdio_io_readb(func,
|
data = sdio_io_readb(func->card->sdio_func0,
|
||||||
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_IF_EXT, &ret);
|
SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_IF_EXT, &ret);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -610,6 +614,7 @@ static rt_int32_t sdio_initialize_function(struct rt_mmcsd_card *card, rt_uint32
|
||||||
}
|
}
|
||||||
rt_memset(func, 0, sizeof(struct rt_sdio_function));
|
rt_memset(func, 0, sizeof(struct rt_sdio_function));
|
||||||
|
|
||||||
|
func->card = card;
|
||||||
func->num = func_num;
|
func->num = func_num;
|
||||||
|
|
||||||
ret = sdio_read_fbr(func);
|
ret = sdio_read_fbr(func);
|
||||||
|
@ -688,7 +693,10 @@ static rt_int32_t sdio_set_bus_wide(struct rt_mmcsd_card *card)
|
||||||
|
|
||||||
static rt_int32_t sdio_register_card(struct rt_mmcsd_card *card)
|
static rt_int32_t sdio_register_card(struct rt_mmcsd_card *card)
|
||||||
{
|
{
|
||||||
|
rt_uint32_t fn;
|
||||||
struct sdio_card *sc;
|
struct sdio_card *sc;
|
||||||
|
struct sdio_driver *sd;
|
||||||
|
rt_list_t *l;
|
||||||
|
|
||||||
sc = rt_malloc(sizeof(struct sdio_card));
|
sc = rt_malloc(sizeof(struct sdio_card));
|
||||||
if (sc == RT_NULL)
|
if (sc == RT_NULL)
|
||||||
|
@ -698,6 +706,24 @@ static rt_int32_t sdio_register_card(struct rt_mmcsd_card *card)
|
||||||
}
|
}
|
||||||
list_insert_after(&sdio_cards, &sc->list);
|
list_insert_after(&sdio_cards, &sc->list);
|
||||||
|
|
||||||
|
if (list_isempty(&sdio_drivers))
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (fn = 0; fn < card->sdio_function_num; fn++)
|
||||||
|
{
|
||||||
|
for (l = (&sdio_drivers)->next; l != &sdio_drivers; l = l->next)
|
||||||
|
{
|
||||||
|
sd = (struct sdio_driver *)list_entry(l, struct sdio_driver, list);
|
||||||
|
if (sdio_match_function(card->sdio_function[fn], sd->drv->id))
|
||||||
|
{
|
||||||
|
sd->drv->probe(card->sdio_function[fn]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue