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_GD_QE_BIT BIT(1)
14 #define NOR_GD_CMP_BIT BIT(6)
15 #define NOR_GD_CMD_RDSR2 0x35
16 #define NOR_GD_CMD_WRSR2 0x31
17
18 static struct nor_info idt_gd[] =
19 {
20 {
21 .model = "GD25Q127C",
22 .id = {0xc8, 0x40, 0x18},
23 .total_size = SZ_16M,
24 .flag = SUPPORT_GENERAL,
25 },
26 {
27 .model = "GD25Q256",
28 .id = {0xc8, 0x40, 0x19},
29 .total_size = SZ_16M,
30 .flag = SUPPORT_GENERAL,
31 },
32 };
33
nor_gd_quad_mode(struct nor_flash * unused)34 static int nor_gd_quad_mode(struct nor_flash *unused)
35 {
36 int ret;
37 unsigned char cmd[3];
38 char reg[2] = {0};
39
40 cmd[0] = NOR_GD_CMD_RDSR2;
41 ret = nor_transfer(1, cmd, 1, reg, 2);
42 if (ret) {
43 SPINOR_ERR("read status register2 fail\n");
44 return ret;
45 }
46
47 if (reg[1] & NOR_GD_QE_BIT)
48 return 0;
49
50 ret = nor_write_enable();
51 if (ret)
52 return ret;
53
54 cmd[0] = NOR_GD_CMD_WRSR2;
55 cmd[1] = reg[1] | NOR_GD_QE_BIT;
56 ret = nor_transfer(2, cmd, 2, NULL, 0);
57 if (ret) {
58 SPINOR_ERR("set status register fail\n");
59 return ret;
60 }
61
62 if (nor_wait_ready(0, 500)) {
63 SPINOR_ERR("wait set qd mode failed\n");
64 return -EBUSY;
65 }
66
67 cmd[0] = NOR_GD_CMD_RDSR2;
68 ret = nor_transfer(1, cmd, 1, reg, 2);
69 if (ret) {
70 SPINOR_ERR("read status register2 fail\n");
71 return ret;
72 }
73
74 if (!(reg[1] & NOR_GD_QE_BIT)) {
75 SPINOR_ERR("set gd QE failed\n");
76 return -EINVAL;
77 }
78 return 0;
79 }
80
81 static struct nor_factory nor_gd = {
82 .factory = FACTORY_GD,
83 .idt = idt_gd,
84 .idt_cnt = sizeof(idt_gd),
85
86 .init = NULL,
87 .deinit = NULL,
88 .init_lock = NULL,
89 .deinit_lock = NULL,
90 .lock = NULL,
91 .unlock = NULL,
92 .islock = NULL,
93 .set_quad_mode = nor_gd_quad_mode,
94 .set_4bytes_addr = NULL,
95 };
96
nor_register_factory_gd(void)97 int nor_register_factory_gd(void)
98 {
99 return nor_register_factory(&nor_gd);
100 }
101