blob: bd7bc12c60b68a25a86f7e202e73682a23b4638a [file] [log] [blame]
Simon Glass41877402013-03-19 04:58:56 +00001/*
2 * Copyright (c) 2011 The Chromium OS Authors.
3 *
4 * See file CREDITS for list of people who contributed to this
5 * project.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but without any warranty; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20 * MA 02111-1307 USA
21 *
22 * This file is derived from the flashrom project.
23 */
24
25struct ich7_spi_regs {
26 uint16_t spis;
27 uint16_t spic;
28 uint32_t spia;
29 uint64_t spid[8];
30 uint64_t _pad;
31 uint32_t bbar;
32 uint16_t preop;
33 uint16_t optype;
34 uint8_t opmenu[8];
35} __packed;
36
37struct ich9_spi_regs {
38 uint32_t bfpr; /* 0x00 */
39 uint16_t hsfs;
40 uint16_t hsfc;
41 uint32_t faddr;
42 uint32_t _reserved0;
43 uint32_t fdata[16]; /* 0x10 */
44 uint32_t frap; /* 0x50 */
45 uint32_t freg[5];
46 uint32_t _reserved1[3];
47 uint32_t pr[5]; /* 0x74 */
48 uint32_t _reserved2[2];
49 uint8_t ssfs; /* 0x90 */
50 uint8_t ssfc[3];
51 uint16_t preop; /* 0x94 */
52 uint16_t optype;
53 uint8_t opmenu[8]; /* 0x98 */
54 uint32_t bbar;
55 uint8_t _reserved3[12];
56 uint32_t fdoc;
57 uint32_t fdod;
58 uint8_t _reserved4[8];
59 uint32_t afc;
60 uint32_t lvscc;
61 uint32_t uvscc;
62 uint8_t _reserved5[4];
63 uint32_t fpb;
64 uint8_t _reserved6[28];
65 uint32_t srdl;
66 uint32_t srdc;
67 uint32_t srd;
68} __packed;
69
70enum {
71 SPIS_SCIP = 0x0001,
72 SPIS_GRANT = 0x0002,
73 SPIS_CDS = 0x0004,
74 SPIS_FCERR = 0x0008,
75 SSFS_AEL = 0x0010,
76 SPIS_LOCK = 0x8000,
77 SPIS_RESERVED_MASK = 0x7ff0,
78 SSFS_RESERVED_MASK = 0x7fe2
79};
80
81enum {
82 SPIC_SCGO = 0x000002,
83 SPIC_ACS = 0x000004,
84 SPIC_SPOP = 0x000008,
85 SPIC_DBC = 0x003f00,
86 SPIC_DS = 0x004000,
87 SPIC_SME = 0x008000,
88 SSFC_SCF_MASK = 0x070000,
89 SSFC_RESERVED = 0xf80000,
90
91 /* Mask for speed byte, biuts 23:16 of SSFC */
92 SSFC_SCF_33MHZ = 0x01,
93};
94
95enum {
96 HSFS_FDONE = 0x0001,
97 HSFS_FCERR = 0x0002,
98 HSFS_AEL = 0x0004,
99 HSFS_BERASE_MASK = 0x0018,
100 HSFS_BERASE_SHIFT = 3,
101 HSFS_SCIP = 0x0020,
102 HSFS_FDOPSS = 0x2000,
103 HSFS_FDV = 0x4000,
104 HSFS_FLOCKDN = 0x8000
105};
106
107enum {
108 HSFC_FGO = 0x0001,
109 HSFC_FCYCLE_MASK = 0x0006,
110 HSFC_FCYCLE_SHIFT = 1,
111 HSFC_FDBC_MASK = 0x3f00,
112 HSFC_FDBC_SHIFT = 8,
113 HSFC_FSMIE = 0x8000
114};
115
116enum {
117 SPI_OPCODE_TYPE_READ_NO_ADDRESS = 0,
118 SPI_OPCODE_TYPE_WRITE_NO_ADDRESS = 1,
119 SPI_OPCODE_TYPE_READ_WITH_ADDRESS = 2,
120 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS = 3
121};
122
123enum {
124 ICH_MAX_CMD_LEN = 5,
125};
126
127struct spi_trans {
128 uint8_t cmd[ICH_MAX_CMD_LEN];
129 int cmd_len;
130 const uint8_t *out;
131 uint32_t bytesout;
132 uint8_t *in;
133 uint32_t bytesin;
134 uint8_t type;
135 uint8_t opcode;
136 uint32_t offset;
137};
138
139struct ich_spi_slave {
140 struct spi_slave slave;
141 struct spi_trans trans; /* current transaction in progress */
142 int speed; /* SPI speed in Hz */
143};