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