|
@@ -1152,11 +1152,42 @@ static int cfi_amdstd_read (struct mtd_info *mtd, loff_t from, size_t len, size_
|
|
|
typedef int (*otp_op_t)(struct map_info *map, struct flchip *chip,
|
|
|
loff_t adr, size_t len, u_char *buf);
|
|
|
|
|
|
+static inline void otp_enter(struct map_info *map, struct flchip *chip,
|
|
|
+ loff_t adr, size_t len)
|
|
|
+{
|
|
|
+ struct cfi_private *cfi = map->fldrv_priv;
|
|
|
+
|
|
|
+ cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+ cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+ cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+
|
|
|
+ INVALIDATE_CACHED_RANGE(map, chip->start + adr, len);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void otp_exit(struct map_info *map, struct flchip *chip,
|
|
|
+ loff_t adr, size_t len)
|
|
|
+{
|
|
|
+ struct cfi_private *cfi = map->fldrv_priv;
|
|
|
+
|
|
|
+ cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+ cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+ cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+ cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi,
|
|
|
+ cfi->device_type, NULL);
|
|
|
+
|
|
|
+ INVALIDATE_CACHED_RANGE(map, chip->start + adr, len);
|
|
|
+}
|
|
|
+
|
|
|
static inline int do_read_secsi_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
|
|
|
{
|
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
|
unsigned long timeo = jiffies + HZ;
|
|
|
- struct cfi_private *cfi = map->fldrv_priv;
|
|
|
|
|
|
retry:
|
|
|
mutex_lock(&chip->mutex);
|
|
@@ -1178,16 +1209,9 @@ static inline int do_read_secsi_onechip(struct map_info *map, struct flchip *chi
|
|
|
|
|
|
chip->state = FL_READY;
|
|
|
|
|
|
- cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
- cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
- cfi_send_gen_cmd(0x88, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
-
|
|
|
+ otp_enter(map, chip, adr, len);
|
|
|
map_copy_from(map, buf, adr, len);
|
|
|
-
|
|
|
- cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
- cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
- cfi_send_gen_cmd(0x90, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
- cfi_send_gen_cmd(0x00, cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type, NULL);
|
|
|
+ otp_exit(map, chip, adr, len);
|
|
|
|
|
|
wake_up(&chip->wq);
|
|
|
mutex_unlock(&chip->mutex);
|