From: Zhaoyifeng Date: Fri, 22 Aug 2014 07:40:14 +0000 (+0800) Subject: Nand driver: Fix RK3288 supend issue. X-Git-Tag: firefly_0821_release~4814 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=49747b3b7b1598167e767074a8faea42f1e2f469;p=firefly-linux-kernel-4.4.55.git Nand driver: Fix RK3288 supend issue. issue: rk3288 have two nandc,and driver add two nandc devices but with one mutex signal. The suspend function will be call twice,and crash. Fix : Modify function rknand_suspend,rknand_resume and rknand_shutdown to Fix it. --- diff --git a/arch/arm/mach-rockchip/rknandbase.c b/arch/arm/mach-rockchip/rknandbase.c index f70cdcaa047d..24d43619aa6d 100755 --- a/arch/arm/mach-rockchip/rknandbase.c +++ b/arch/arm/mach-rockchip/rknandbase.c @@ -22,7 +22,9 @@ struct rknand_info { int tag; int enable; int clk_rate[2]; - int reserved0[8]; + int nand_suspend_state; + int nand_shutdown_state; + int reserved0[6]; void (*rknand_suspend)(void); void (*rknand_resume)(void); @@ -201,6 +203,8 @@ static int rknand_probe(struct platform_device *pdev) gpNandInfo = kzalloc(sizeof(struct rknand_info), GFP_KERNEL); if (!gpNandInfo) return -ENOMEM; + gpNandInfo->nand_suspend_state = 0; + gpNandInfo->nand_shutdown_state = 0; } mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); membase = devm_request_and_ioremap(&pdev->dev, mem); @@ -260,8 +264,8 @@ static int rknand_probe(struct platform_device *pdev) static int rknand_suspend(struct platform_device *pdev, pm_message_t state) { - if(gpNandInfo->rknand_suspend) - { + if(gpNandInfo->rknand_suspend && gpNandInfo->nand_suspend_state == 0){ + gpNandInfo->nand_suspend_state = 1; gpNandInfo->rknand_suspend(); //TODO:nandc clk disable } @@ -270,8 +274,8 @@ static int rknand_suspend(struct platform_device *pdev, pm_message_t state) static int rknand_resume(struct platform_device *pdev) { - if(gpNandInfo->rknand_resume) - { + if(gpNandInfo->rknand_resume && gpNandInfo->nand_suspend_state == 1){ + gpNandInfo->nand_suspend_state = 0; //TODO:nandc clk enable gpNandInfo->rknand_resume(); } @@ -280,8 +284,10 @@ static int rknand_resume(struct platform_device *pdev) static void rknand_shutdown(struct platform_device *pdev) { - if(gpNandInfo->rknand_buffer_shutdown) - gpNandInfo->rknand_buffer_shutdown(); + if(gpNandInfo->rknand_buffer_shutdown && gpNandInfo->nand_shutdown_state == 0){ + gpNandInfo->nand_shutdown_state = 1; + gpNandInfo->rknand_buffer_shutdown(); + } } void rknand_dev_cache_flush(void)