From 49747b3b7b1598167e767074a8faea42f1e2f469 Mon Sep 17 00:00:00 2001 From: Zhaoyifeng Date: Fri, 22 Aug 2014 15:40:14 +0800 Subject: [PATCH] =?utf8?q?=20=20=20=20Nand=20driver:=20Fix=20RK3288=20supe?= =?utf8?q?nd=20issue.=20=20=20=20=20=20=20=20=20=20issue:=20rk3288=20have?= =?utf8?q?=20two=20nandc,and=20driver=20add=20two=20nandc=20devices=20=20?= =?utf8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20but=20with=20one=20=20?= =?utf8?q?mutex=20signal.=20The=20suspend=20function=20will=20be=20call=20?= =?utf8?q?twice,and=20crash.=20=20=20=20=20=20=20=20=20=20Fix=20=20:=20Mod?= =?utf8?q?ify=20function=20rknand=5Fsuspend=EF=BC=8Crknand=5Fresume=20and?= =?utf8?q?=20rknand=5Fshutdown=20to=20Fix=20it.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- arch/arm/mach-rockchip/rknandbase.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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) -- 2.34.1