Merge branch 'master' of ssh://gemini/home/wd/git/u-boot/master
authorWolfgang Denk <wd@denx.de>
Wed, 18 Aug 2010 19:16:35 +0000 (21:16 +0200)
committerWolfgang Denk <wd@denx.de>
Wed, 18 Aug 2010 19:16:35 +0000 (21:16 +0200)
drivers/mtd/cfi_flash.c

index 1191ef02f80b3ed5647e5aea1efb4c8dd66b2cc4..44ebb9d06aadca4898cf97f85c40e36b57dbf3c2 100644 (file)
@@ -1355,15 +1355,32 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)
                case CFI_CMDSET_INTEL_PROG_REGIONS:
                case CFI_CMDSET_INTEL_STANDARD:
                case CFI_CMDSET_INTEL_EXTENDED:
-                       flash_write_cmd (info, sector, 0,
-                                        FLASH_CMD_CLEAR_STATUS);
-                       flash_write_cmd (info, sector, 0, FLASH_CMD_PROTECT);
-                       if (prot)
-                               flash_write_cmd (info, sector, 0,
-                                       FLASH_CMD_PROTECT_SET);
-                       else
+                       /*
+                        * see errata called
+                        * "Numonyx Axcell P33/P30 Specification Update" :)
+                        */
+                       flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID);
+                       if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT,
+                                           prot)) {
+                               /*
+                                * cmd must come before FLASH_CMD_PROTECT + 20us
+                                * Disable interrupts which might cause a timeout here.
+                                */
+                               int flag = disable_interrupts ();
+                               unsigned short cmd;
+
+                               if (prot)
+                                       cmd = FLASH_CMD_PROTECT_SET;
+                               else
+                                       cmd = FLASH_CMD_PROTECT_CLEAR;
+
                                flash_write_cmd (info, sector, 0,
-                                       FLASH_CMD_PROTECT_CLEAR);
+                                                 FLASH_CMD_PROTECT);
+                               flash_write_cmd (info, sector, 0, cmd);
+                               /* re-enable interrupts if necessary */
+                               if (flag)
+                                       enable_interrupts ();
+                       }
                        break;
                case CFI_CMDSET_AMD_EXTENDED:
                case CFI_CMDSET_AMD_STANDARD: