| 351 | }; |
| 352 | |
| 353 | rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card) |
| 354 | { |
| 355 | rt_err_t err; |
| 356 | struct rt_mmcsd_host *host = card->host; |
| 357 | struct mmcsd_blk_device *blk_dev = rt_calloc(1, sizeof(*blk_dev)); |
| 358 | |
| 359 | if (!blk_dev) |
| 360 | { |
| 361 | return -RT_ENOMEM; |
| 362 | } |
| 363 | card->blk_dev = blk_dev; |
| 364 | |
| 365 | #ifdef RT_USING_DM |
| 366 | blk_dev->parent.ida = &sdio_ida; |
| 367 | #endif |
| 368 | blk_dev->parent.parallel_io = RT_FALSE; |
| 369 | blk_dev->parent.removable = controller_is_removable(host); |
| 370 | blk_dev->parent.ops = &mmcsd_blk_ops; |
| 371 | blk_dev->parent.max_partitions = RT_MMCSD_MAX_PARTITION; |
| 372 | |
| 373 | blk_dev->card = card; |
| 374 | blk_dev->max_req_size = rt_min_t(rt_size_t, |
| 375 | host->max_dma_segs * host->max_seg_size, |
| 376 | host->max_blk_count * host->max_blk_size) >> 9; |
| 377 | blk_dev->geometry.bytes_per_sector = 1 << 9; |
| 378 | blk_dev->geometry.block_size = card->card_blksize; |
| 379 | blk_dev->geometry.sector_count = card->card_capacity * (1024 / 512); |
| 380 | |
| 381 | /* Set blk size before partitions probe, Why? */ |
| 382 | if ((err = mmcsd_set_blksize(card))) |
| 383 | { |
| 384 | goto _fail; |
| 385 | } |
| 386 | rt_thread_mdelay(1); |
| 387 | |
| 388 | #ifdef RT_USING_DM |
| 389 | rt_dm_dev_set_name(&blk_dev->parent.parent, host->name); |
| 390 | #else |
| 391 | rt_strncpy(blk_dev->parent.parent.parent.name, host->name, RT_NAME_MAX); |
| 392 | #endif |
| 393 | |
| 394 | if ((err = rt_hw_blk_disk_register(&blk_dev->parent))) |
| 395 | { |
| 396 | goto _fail; |
| 397 | } |
| 398 | |
| 399 | return RT_EOK; |
| 400 | |
| 401 | _fail: |
| 402 | card->blk_dev = RT_NULL; |
| 403 | free(blk_dev); |
| 404 | |
| 405 | return err; |
| 406 | } |
| 407 | |
| 408 | void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card) |
| 409 | { |
no test coverage detected