linux SDIO實現

在Linu 2.6.21的SDIO驅動,它是除了是mmc_host的驅動外,仍是一個Platform驅動.身兼兩職.
在這個版本中,首先是定義三個platform_deivce 以註冊到系統當中。可是它定義在
  arch/arm/plat-s3c24xx/devs.c (這會讓人感當至關迷惑),它建立是 s3c-hsmmc設備
 
struct platform_device s3c_device_hsmmc0 = {                
        .name             = "s3c-hsmmc",                    
        .id               = 0,                              
        .num_resources    = ARRAY_SIZE(s3c_hsmmc0_resource),
        .resource         = s3c_hsmmc0_resource,            
        .dev            = {                                 
                .platform_data = &s3c_hsmmc0_platform,      
        }                                                   
};                                                          
                                                            
                                                            
struct platform_device s3c_device_hsmmc1 = {                
        .name             = "s3c-hsmmc",                    
        .id               = 1,                              
        .num_resources    = ARRAY_SIZE(s3c_hsmmc1_resource),
        .resource         = s3c_hsmmc1_resource,            
        .dev            = {                                 
                .platform_data = &s3c_hsmmc1_platform,      
        }                                                   
};                                                          
 
  其platform_driver 定義在drivers/mmc/s3c-hsmmc.c
 
static struct platform_driver s3c_hsmmc_driver =            
{                                                           
        .probe          = s3c_hsmmc_probe,                  
        .remove         = s3c_hsmmc_remove,                 
        .suspend        = s3c_hsmmc_suspend,                
        .resume         = s3c_hsmmc_resume,                 
        .driver         = {                                 
                .name   = "s3c-hsmmc",                      
                .owner  = THIS_MODULE,                      
        },                                                  
};                                                          
                                                            
static int __init s3c_hsmmc_drv_init(void)                  
{                                                           
        return platform_driver_register(&s3c_hsmmc_driver); 
}                                                           
                                                            
static void __exit s3c_hsmmc_drv_exit(void)                 
{                                                           
        platform_driver_unregister(&s3c_hsmmc_driver);      
}                                                           
 
在s3c_hsmmc_probe函數中,會進行一系列的初始化操做.

 
Linux 2.6.28的SDIO的實現
  Linux 2.6.28又作了進一步調整,原來的s3c-hsmmc的設備和驅動已經放棄,原來在s3c-hsmmc.c 已經成爲殘餘代碼,雖然在內核中,可是不會加入Makefile編譯。
其新的platform_device 定義分佈定義在 dev-hsmmc.c /dev-hsmmc1.c / dev-hsmmc2.c,能夠看到設備名字已經變成了 s3c-sdhci

struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = {
 .max_width = 4,
 .host_caps = (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED |
    MMC_CAP_SD_HIGHSPEED),
 .cfg_ext_cd = setup_sdhci0_irq_cd,
 .detect_ext_cd = detect_sdhci0_irq_cd,
 .ext_cd  = S3C_EINT(13),
};函數

struct platform_device s3c_device_hsmmc0 = {
 .name  = "s3c-sdhci",
 .id  = 0,
 .num_resources = ARRAY_SIZE(s3c_hsmmc_resource),
 .resource = s3c_hsmmc_resource,
 .dev  = {
  .dma_mask  = &s3c_device_hsmmc_dmamask,
  .coherent_dma_mask = 0xffffffffUL,
  .platform_data  = &s3c_hsmmc0_def_platdata,
 },
};spa

 
它會在系統初始化註冊deivce.
 而platform_driver定義在 drivers/mmc/host/sdhci-s3c.c
 

//drivers/mmc/host/sdhci-s3c.corm

static struct platform_driver sdhci_s3c_driver = {
 .probe  = sdhci_s3c_probe,
 .remove  = __devexit_p(sdhci_s3c_remove),
        .suspend        = sdhci_s3c_suspend,
        .resume         = sdhci_s3c_resume,
 .driver  = {
  .owner = THIS_MODULE,
  .name = "s3c-sdhci",
 },
};ci

相關文章
相關標籤/搜索