关于6410 HSMMC 驱动的bug

修复HSMMC驱动问题
本文介绍了一种针对HSMMC驱动的改进方法,通过重写s3c_hsmmc_remove函数解决了在电源管理和WIFI重新加载过程中导致的内核崩溃问题,并分享了具体的实现细节和测试结果。

问题:
为了配合电源管理以及WIFI多次重新加载需求,测试HSMMC驱动。发现
rmmod s3c-hsmmc.ko出现kernel OOPS,系统崩溃。

解决方法:
重写s3c_hsmmc_remove函数。
static int s3c_hsmmc_remove(struct platform_device *dev)
{
        int i ;
        struct s3c_hsmmc_host *s3c_host = global_host[dev->id];
        struct mmc_host *mmc = s3c_host->mmc;

        mmc_remove_host(s3c_host->mmc);

        s3c_hsmmc_reset(s3c_host, S3C_HSMMC_RESET_ALL);


#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
        clk_disable(clk_get(&dev->dev, "sclk_48m"));
#endif

        for (i=0; i<NUM_OF_HSMMC_CLKSOURCES; i++) {
        clk_disable(s3c_host->clk[i]);
        clk_put(s3c_host->clk[i]);
        }
       free_irq(s3c_host->irq, s3c_host);

        del_timer_sync(&s3c_host->timer);
        tasklet_kill(&s3c_host->card_tasklet);
        tasklet_kill(&s3c_host->finish_tasklet);
        flush_scheduled_work();

        release_mem_region(s3c_host->mem->start,RESSIZE(s3c_host->mem));

        mmc_free_host(mmc);
 

       /******WIFI 复位时序************/

}


测试结果:
root@mid-fun:/# insmod mmc_core.ko
root@mid-fun:/# insmod s3c-hsmmc.ko
[s3c_hsmmc_probe]: s3c-hsmmc.0: at 0xc7c00000 with irq 56. clk src:
sclk_DOUTmpll_mmc0
[s3c_hsmmc_probe]: s3c-hsmmc.1: at 0xc7e00000 with irq 57. clk src:
sclk_DOUTmpll_mmc1
root@mid-fun:/# mmc0: new SDIO card at address 0001
can NOT find sdio card!

root@mid-fun:/# rmmod s3c-hsmmc.ko
mmc0: card 0001 removed
root@mid-fun:/# insmod s3c-hsmmc.ko
[s3c_hsmmc_probe]: s3c-hsmmc.0: at 0xc8600000 with irq 56. clk src:
sclk_DOUTmpll_mmc0
[s3c_hsmmc_probe]: s3c-hsmmc.1: at 0xc8800000 with irq 57. clk src:
sclk_DOUTmpll_mmc1
root@mid-fun:/# mmc0: new SDIO card at address 0001
can NOT find sdio card!

root@mid-fun:/# rmmod s3c-hsmmc.ko
mmc0: card 0001 removed
root@mid-fun:/# insmod s3c-hsmmc.ko
[s3c_hsmmc_probe]: s3c-hsmmc.0: at 0xc8a00000 with irq 56. clk src:
sclk_DOUTmpll_mmc0
[s3c_hsmmc_probe]: s3c-hsmmc.1: at 0xc8c00000 with irq 57. clk src:
sclk_DOUTmpll_mmc1
root@mid-fun:/# mmc0: new SDIO card at address 0001
can NOT find sdio card!

如果插SD卡移除s3c-hsmmc.ko模块出现错误,需要修改probe相关
s3c_hsmmc_irq_cd 中断服务程序关于外部中断检测的设置。
由于本人的硬件不是用GPN13来检测,会导致remove的时候释放中断资源不干净,
会影响下次加载申请资源,特此说明。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值