From: kbuild test robot <lkp@intel.com>
To: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Vignesh Raghavendra <vigneshr@ti.com>,
Arnd Bergmann <arnd@arndb.de>,
Boris Brezillon <bbrezillon@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Miquel Raynal <miquel.raynal@bootlin.com>,
linux-kernel@vger.kernel.org,
Boris Brezillon <boris.brezillon@collabora.com>,
linux-spi@vger.kernel.org, Marek Vasut <marek.vasut@gmail.com>,
Mark Brown <broonie@kernel.org>,
linux-mtd@lists.infradead.org, kbuild-all@01.org,
Richard Weinberger <richard@nod.at>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Brian Norris <computersforpeace@gmail.com>,
David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH] eeprom: at25: Convert the driver to the spi-mem interface
Date: Mon, 1 Apr 2019 22:01:17 +0800 [thread overview]
Message-ID: <201904012147.YfjKOfBl%lkp@intel.com> (raw)
In-Reply-To: <20190330141637.22632-1-boris.brezillon@collabora.com>
[-- Attachment #1: Type: text/plain, Size: 9252 bytes --]
Hi Boris,
I love your patch! Yet something to improve:
[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v5.1-rc3 next-20190401]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Boris-Brezillon/eeprom-at25-Convert-the-driver-to-the-spi-mem-interface/20190401-160450
config: x86_64-randconfig-m3-201913 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All errors (new ones prefixed by >>):
drivers/misc/eeprom/at25.o: In function `at25_rdsr':
>> drivers/misc/eeprom/at25.c:130: undefined reference to `spi_mem_exec_op'
drivers/misc/eeprom/at25.o: In function `at25_ee_read':
>> drivers/misc/eeprom/at25.c:178: undefined reference to `spi_mem_dirmap_read'
drivers/misc/eeprom/at25.o: In function `at25_create_dirmaps':
>> drivers/misc/eeprom/at25.c:86: undefined reference to `devm_spi_mem_dirmap_create'
drivers/misc/eeprom/at25.c:94: undefined reference to `devm_spi_mem_dirmap_create'
drivers/misc/eeprom/at25.c:106: undefined reference to `devm_spi_mem_dirmap_create'
drivers/misc/eeprom/at25.c:114: undefined reference to `devm_spi_mem_dirmap_create'
drivers/misc/eeprom/at25.o: In function `at25_wren':
drivers/misc/eeprom/at25.c:144: undefined reference to `spi_mem_exec_op'
drivers/misc/eeprom/at25.o: In function `at25_ee_write':
>> drivers/misc/eeprom/at25.c:240: undefined reference to `spi_mem_dirmap_write'
drivers/misc/eeprom/at25.o: In function `at25_driver_init':
>> drivers/misc/eeprom/at25.c:468: undefined reference to `spi_mem_driver_register_with_owner'
drivers/misc/eeprom/at25.o: In function `at25_driver_exit':
>> drivers/misc/eeprom/at25.c:468: undefined reference to `spi_mem_driver_unregister'
vim +130 drivers/misc/eeprom/at25.c
70
71 static int at25_create_dirmaps(struct at25_data *at25)
72 {
73 struct spi_mem_dirmap_info info = {
74 .op_tmpl = SPI_MEM_OP(SPI_MEM_OP_CMD(AT25_READ, 1),
75 SPI_MEM_OP_ADDR(at25->addrlen, 0, 1),
76 SPI_MEM_OP_NO_DUMMY,
77 SPI_MEM_OP_DATA_IN(0, NULL, 1)),
78 .offset = 0,
79 .length = at25->chip.byte_len,
80 };
81 struct device *dev = &at25->spimem->spi->dev;
82
83 if (at25->chip.flags & EE_INSTR_BIT3_IS_ADDR)
84 info.length = 256;
85
> 86 at25->dirmap.rdesc[0] = devm_spi_mem_dirmap_create(dev, at25->spimem,
87 &info);
88 if (IS_ERR(at25->dirmap.rdesc[0]))
89 return PTR_ERR(at25->dirmap.rdesc[0]);
90
91 info.op_tmpl.cmd.opcode = AT25_WRITE;
92 info.op_tmpl.data.dir = SPI_MEM_DATA_OUT;
93
94 at25->dirmap.wdesc[0] = devm_spi_mem_dirmap_create(dev, at25->spimem,
95 &info);
96 if (IS_ERR(at25->dirmap.wdesc[0]))
97 return PTR_ERR(at25->dirmap.wdesc[0]);
98
99 if (!(at25->chip.flags & EE_INSTR_BIT3_IS_ADDR))
100 return 0;
101
102 info.length = at25->chip.byte_len - 256;
103 info.op_tmpl.cmd.opcode = AT25_READ | AT25_INSTR_BIT3;
104 info.op_tmpl.data.dir = SPI_MEM_DATA_IN;
105
> 106 at25->dirmap.rdesc[1] = devm_spi_mem_dirmap_create(dev, at25->spimem,
107 &info);
108 if (IS_ERR(at25->dirmap.rdesc[1]))
109 return PTR_ERR(at25->dirmap.rdesc[1]);
110
111 info.op_tmpl.cmd.opcode = AT25_WRITE | AT25_INSTR_BIT3;
112 info.op_tmpl.data.dir = SPI_MEM_DATA_OUT;
113
114 at25->dirmap.wdesc[1] = devm_spi_mem_dirmap_create(dev, at25->spimem,
115 &info);
116 if (IS_ERR(at25->dirmap.wdesc[1]))
117 return PTR_ERR(at25->dirmap.wdesc[1]);
118
119 return 0;
120 }
121
122 static int at25_rdsr(struct at25_data *at25)
123 {
124 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(AT25_RDSR, 1),
125 SPI_MEM_OP_NO_ADDR,
126 SPI_MEM_OP_NO_DUMMY,
127 SPI_MEM_OP_DATA_IN(1, at25->scratchbuf, 1));
128 int ret;
129
> 130 ret = spi_mem_exec_op(at25->spimem, &op);
131 if (ret)
132 return ret;
133
134 return *((u8 *)at25->scratchbuf);
135 }
136
137 static int at25_wren(struct at25_data *at25)
138 {
139 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(AT25_WREN, 1),
140 SPI_MEM_OP_NO_ADDR,
141 SPI_MEM_OP_NO_DUMMY,
142 SPI_MEM_OP_NO_DATA);
143
144 return spi_mem_exec_op(at25->spimem, &op);
145 }
146
147 static int at25_ee_read(void *priv, unsigned int offset,
148 void *val, size_t count)
149 {
150 struct spi_mem_dirmap_desc *desc;
151 struct at25_data *at25 = priv;
152 unsigned int dirmap_offset;
153 ssize_t status;
154
155 if (unlikely(offset >= at25->chip.byte_len))
156 return -EINVAL;
157 if ((offset + count) > at25->chip.byte_len)
158 count = at25->chip.byte_len - offset;
159 if (unlikely(!count))
160 return -EINVAL;
161
162 if (at25->chip.flags & EE_INSTR_BIT3_IS_ADDR && offset > 255) {
163 desc = at25->dirmap.rdesc[1];
164 dirmap_offset = offset - 256;
165 } else {
166 desc = at25->dirmap.rdesc[0];
167 dirmap_offset = offset;
168 }
169
170 mutex_lock(&at25->lock);
171
172 /* Read it all at once.
173 *
174 * REVISIT that's potentially a problem with large chips, if
175 * other devices on the bus need to be accessed regularly or
176 * this chip is clocked very slowly
177 */
> 178 status = spi_mem_dirmap_read(desc, dirmap_offset, count, val);
179 dev_dbg(&at25->spimem->spi->dev, "read %zu bytes at %d --> %zd\n",
180 count, offset, status);
181
182 mutex_unlock(&at25->lock);
183 return status;
184 }
185
186 static int at25_ee_write(void *priv, unsigned int off, void *val, size_t count)
187 {
188 struct at25_data *at25 = priv;
189 const char *buf = val;
190 int status = 0;
191 unsigned buf_size;
192 u8 *bounce;
193
194 if (unlikely(off >= at25->chip.byte_len))
195 return -EFBIG;
196 if ((off + count) > at25->chip.byte_len)
197 count = at25->chip.byte_len - off;
198 if (unlikely(!count))
199 return -EINVAL;
200
201 /* Temp buffer starts with command and address */
202 buf_size = at25->chip.page_size;
203 if (buf_size > io_limit)
204 buf_size = io_limit;
205 bounce = kmalloc(buf_size, GFP_KERNEL);
206 if (!bounce)
207 return -ENOMEM;
208
209 /* For write, rollover is within the page ... so we write at
210 * most one page, then manually roll over to the next page.
211 */
212 mutex_lock(&at25->lock);
213 do {
214 struct spi_mem_dirmap_desc *desc;
215 unsigned long timeout, retries;
216 unsigned segment;
217 unsigned int dirmap_offset;
218 int sr;
219
220 status = at25_wren(at25);
221 if (status < 0) {
222 dev_dbg(&at25->spimem->spi->dev, "WREN --> %d\n",
223 status);
224 break;
225 }
226
227 if (at25->chip.flags & EE_INSTR_BIT3_IS_ADDR && off > 255) {
228 desc = at25->dirmap.wdesc[1];
229 dirmap_offset = off - 256;
230 } else {
231 desc = at25->dirmap.wdesc[0];
232 dirmap_offset = off;
233 }
234
235 /* Write as much of a page as we can */
236 segment = buf_size - (dirmap_offset % buf_size);
237 if (segment > count)
238 segment = count;
239 memcpy(bounce, buf, segment);
> 240 status = spi_mem_dirmap_write(desc, dirmap_offset, segment,
241 bounce);
242 dev_dbg(&at25->spimem->spi->dev,
243 "write %u bytes at %u --> %d\n",
244 segment, off, status);
245 if (status < 0)
246 break;
247
248 /* REVISIT this should detect (or prevent) failed writes
249 * to readonly sections of the EEPROM...
250 */
251
252 /* Wait for non-busy status */
253 timeout = jiffies + msecs_to_jiffies(EE_TIMEOUT);
254 retries = 0;
255 do {
256 sr = at25_rdsr(at25);
257 if (sr < 0 || (sr & AT25_SR_nRDY)) {
258 dev_dbg(&at25->spimem->spi->dev,
259 "rdsr --> %d (%02x)\n", sr, sr);
260 /* at HZ=100, this is sloooow */
261 msleep(1);
262 continue;
263 }
264 if (!(sr & AT25_SR_nRDY))
265 break;
266 } while (retries++ < 3 || time_before_eq(jiffies, timeout));
267
268 if ((sr < 0) || (sr & AT25_SR_nRDY)) {
269 dev_err(&at25->spimem->spi->dev,
270 "write %u bytes offset %u, timeout after %u msecs\n",
271 segment, off,
272 jiffies_to_msecs(jiffies -
273 (timeout - EE_TIMEOUT)));
274 status = -ETIMEDOUT;
275 break;
276 }
277
278 off += segment;
279 buf += segment;
280 count -= segment;
281
282 } while (count > 0);
283
284 mutex_unlock(&at25->lock);
285
286 kfree(bounce);
287 return status;
288 }
289
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35405 bytes --]
[-- Attachment #3: Type: text/plain, Size: 144 bytes --]
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2019-04-01 14:01 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-30 14:16 [PATCH] eeprom: at25: Convert the driver to the spi-mem interface Boris Brezillon
2019-04-01 9:25 ` Geert Uytterhoeven
2019-04-01 11:00 ` kbuild test robot
2019-04-01 14:01 ` kbuild test robot [this message]
2019-04-25 19:44 ` Greg Kroah-Hartman
2019-09-03 15:06 ` Geert Uytterhoeven
2019-09-03 15:08 ` Boris Brezillon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201904012147.YfjKOfBl%lkp@intel.com \
--to=lkp@intel.com \
--cc=arnd@arndb.de \
--cc=bbrezillon@kernel.org \
--cc=boris.brezillon@collabora.com \
--cc=broonie@kernel.org \
--cc=computersforpeace@gmail.com \
--cc=dwmw2@infradead.org \
--cc=geert@linux-m68k.org \
--cc=gregkh@linuxfoundation.org \
--cc=kbuild-all@01.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=linux-spi@vger.kernel.org \
--cc=marek.vasut@gmail.com \
--cc=miquel.raynal@bootlin.com \
--cc=richard@nod.at \
--cc=vigneshr@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).