1 /* all about gd factory */
2
3 #include <string.h>
4 #include <stdlib.h>
5 #include <time.h>
6 #include <pthread.h>
7 #include <errno.h>
8 #include <unistd.h>
9 #include <hal_timer.h>
10
11 #include "inter.h"
12
13 #define NOR_ZETTA_QE_BIT BIT(1)
14 #define NOR_ZETTA_CMD_RDSR2 0x35
15 #define NOR_ZETTA_CMD_WRSR2 0x31
16
17 static struct nor_info idt_zetta[] =
18 {
19 {
20 .model = "ZD25Q64B",
21 .id = {0xBA, 0x32, 0x17},
22 .total_size = SZ_8M,
23 .flag = SUPPORT_GENERAL,
24 },
25 };
26
nor_zetta_quad_mode(struct nor_flash * unused)27 static int nor_zetta_quad_mode(struct nor_flash *unused)
28 {
29 int ret;
30 unsigned char cmd[3];
31 char reg[2] = {0};
32
33 cmd[0] = NOR_ZETTA_CMD_RDSR2;
34 ret = nor_transfer(1, cmd, 1, reg, 2);
35 if (ret) {
36 SPINOR_ERR("read status register2 fail\n");
37 return ret;
38 }
39
40 if (reg[1] & NOR_ZETTA_QE_BIT)
41 return 0;
42
43 ret = nor_write_enable();
44 if (ret)
45 return ret;
46
47 cmd[0] = NOR_ZETTA_CMD_WRSR2;
48 cmd[1] = reg[1] | NOR_ZETTA_QE_BIT;
49 ret = nor_transfer(2, cmd, 2, NULL, 0);
50 if (ret) {
51 SPINOR_ERR("set status register fail\n");
52 return ret;
53 }
54
55 if (nor_wait_ready(0, 500)) {
56 SPINOR_ERR("wait set qd mode failed\n");
57 return -EBUSY;
58 }
59
60 cmd[0] = NOR_ZETTA_CMD_RDSR2;
61 ret = nor_transfer(1, cmd, 1, reg, 2);
62 if (ret) {
63 SPINOR_ERR("read status register2 fail\n");
64 return ret;
65 }
66
67 if (!(reg[1] & NOR_ZETTA_QE_BIT)) {
68 SPINOR_ERR("set gd QE failed\n");
69 return -EINVAL;
70 }
71 return 0;
72 }
73
74 static struct nor_factory nor_zetta = {
75 .factory = FACTORY_ZETTA,
76 .idt = idt_zetta,
77 .idt_cnt = sizeof(idt_zetta),
78
79 .init = NULL,
80 .deinit = NULL,
81 .init_lock = NULL,
82 .deinit_lock = NULL,
83 .lock = NULL,
84 .unlock = NULL,
85 .islock = NULL,
86 .set_quad_mode = nor_zetta_quad_mode,
87 .set_4bytes_addr = NULL,
88 };
89
nor_register_factory_zetta(void)90 int nor_register_factory_zetta(void)
91 {
92 return nor_register_factory(&nor_zetta);
93 }
94