2 * at25.c -- support most SPI EEPROMs, such as Atmel AT25 models
4 * Copyright (C) 2006 David Brownell
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/delay.h>
16 #include <linux/device.h>
17 #include <linux/sched.h>
19 #include <linux/nvmem-provider.h>
20 #include <linux/regmap.h>
21 #include <linux/spi/spi.h>
22 #include <linux/spi/eeprom.h>
23 #include <linux/property.h>
26 * NOTE: this is an *EEPROM* driver. The vagaries of product naming
27 * mean that some AT25 products are EEPROMs, and others are FLASH.
28 * Handle FLASH chips with the drivers/mtd/devices/m25p80.c driver,
33 struct spi_device
*spi
;
35 struct spi_eeprom chip
;
37 struct regmap_config regmap_config
;
38 struct nvmem_config nvmem_config
;
39 struct nvmem_device
*nvmem
;
42 #define AT25_WREN 0x06 /* latch the write enable */
43 #define AT25_WRDI 0x04 /* reset the write enable */
44 #define AT25_RDSR 0x05 /* read status register */
45 #define AT25_WRSR 0x01 /* write status register */
46 #define AT25_READ 0x03 /* read byte(s) */
47 #define AT25_WRITE 0x02 /* write byte(s)/sector */
49 #define AT25_SR_nRDY 0x01 /* nRDY = write-in-progress */
50 #define AT25_SR_WEN 0x02 /* write enable (latched) */
51 #define AT25_SR_BP0 0x04 /* BP for software writeprotect */
52 #define AT25_SR_BP1 0x08
53 #define AT25_SR_WPEN 0x80 /* writeprotect enable */
55 #define AT25_INSTR_BIT3 0x08 /* Additional address bit in instr */
57 #define EE_MAXADDRLEN 3 /* 24 bit addresses, up to 2 MBytes */
59 /* Specs often allow 5 msec for a page write, sometimes 20 msec;
60 * it's important to recover from write timeouts.
64 /*-------------------------------------------------------------------------*/
66 #define io_limit PAGE_SIZE /* bytes */
70 struct at25_data
*at25
,
76 u8 command
[EE_MAXADDRLEN
+ 1];
79 struct spi_transfer t
[2];
83 if (unlikely(offset
>= at25
->chip
.byte_len
))
85 if ((offset
+ count
) > at25
->chip
.byte_len
)
86 count
= at25
->chip
.byte_len
- offset
;
93 if (at25
->chip
.flags
& EE_INSTR_BIT3_IS_ADDR
)
94 if (offset
>= (1U << (at25
->addrlen
* 8)))
95 instr
|= AT25_INSTR_BIT3
;
98 /* 8/16/24-bit address is written MSB first */
99 switch (at25
->addrlen
) {
100 default: /* case 3 */
101 *cp
++ = offset
>> 16;
105 case 0: /* can't happen: for better codegen */
109 spi_message_init(&m
);
110 memset(t
, 0, sizeof t
);
112 t
[0].tx_buf
= command
;
113 t
[0].len
= at25
->addrlen
+ 1;
114 spi_message_add_tail(&t
[0], &m
);
118 spi_message_add_tail(&t
[1], &m
);
120 mutex_lock(&at25
->lock
);
122 /* Read it all at once.
124 * REVISIT that's potentially a problem with large chips, if
125 * other devices on the bus need to be accessed regularly or
126 * this chip is clocked very slowly
128 status
= spi_sync(at25
->spi
, &m
);
129 dev_dbg(&at25
->spi
->dev
,
130 "read %Zd bytes at %d --> %d\n",
131 count
, offset
, (int) status
);
133 mutex_unlock(&at25
->lock
);
134 return status
? status
: count
;
137 static int at25_regmap_read(void *context
, const void *reg
, size_t reg_size
,
138 void *val
, size_t val_size
)
140 struct at25_data
*at25
= context
;
141 off_t offset
= *(u32
*)reg
;
144 err
= at25_ee_read(at25
, val
, offset
, val_size
);
151 at25_ee_write(struct at25_data
*at25
, const char *buf
, loff_t off
,
155 unsigned written
= 0;
159 if (unlikely(off
>= at25
->chip
.byte_len
))
161 if ((off
+ count
) > at25
->chip
.byte_len
)
162 count
= at25
->chip
.byte_len
- off
;
163 if (unlikely(!count
))
166 /* Temp buffer starts with command and address */
167 buf_size
= at25
->chip
.page_size
;
168 if (buf_size
> io_limit
)
170 bounce
= kmalloc(buf_size
+ at25
->addrlen
+ 1, GFP_KERNEL
);
174 /* For write, rollover is within the page ... so we write at
175 * most one page, then manually roll over to the next page.
177 mutex_lock(&at25
->lock
);
179 unsigned long timeout
, retries
;
181 unsigned offset
= (unsigned) off
;
187 status
= spi_write(at25
->spi
, cp
, 1);
189 dev_dbg(&at25
->spi
->dev
, "WREN --> %d\n",
195 if (at25
->chip
.flags
& EE_INSTR_BIT3_IS_ADDR
)
196 if (offset
>= (1U << (at25
->addrlen
* 8)))
197 instr
|= AT25_INSTR_BIT3
;
200 /* 8/16/24-bit address is written MSB first */
201 switch (at25
->addrlen
) {
202 default: /* case 3 */
203 *cp
++ = offset
>> 16;
207 case 0: /* can't happen: for better codegen */
211 /* Write as much of a page as we can */
212 segment
= buf_size
- (offset
% buf_size
);
215 memcpy(cp
, buf
, segment
);
216 status
= spi_write(at25
->spi
, bounce
,
217 segment
+ at25
->addrlen
+ 1);
218 dev_dbg(&at25
->spi
->dev
,
219 "write %u bytes at %u --> %d\n",
220 segment
, offset
, (int) status
);
224 /* REVISIT this should detect (or prevent) failed writes
225 * to readonly sections of the EEPROM...
228 /* Wait for non-busy status */
229 timeout
= jiffies
+ msecs_to_jiffies(EE_TIMEOUT
);
233 sr
= spi_w8r8(at25
->spi
, AT25_RDSR
);
234 if (sr
< 0 || (sr
& AT25_SR_nRDY
)) {
235 dev_dbg(&at25
->spi
->dev
,
236 "rdsr --> %d (%02x)\n", sr
, sr
);
237 /* at HZ=100, this is sloooow */
241 if (!(sr
& AT25_SR_nRDY
))
243 } while (retries
++ < 3 || time_before_eq(jiffies
, timeout
));
245 if ((sr
< 0) || (sr
& AT25_SR_nRDY
)) {
246 dev_err(&at25
->spi
->dev
,
247 "write %d bytes offset %d, "
248 "timeout after %u msecs\n",
250 jiffies_to_msecs(jiffies
-
251 (timeout
- EE_TIMEOUT
)));
263 mutex_unlock(&at25
->lock
);
266 return written
? written
: status
;
269 static int at25_regmap_write(void *context
, const void *data
, size_t count
)
271 struct at25_data
*at25
= context
;
277 memcpy(&offset
, data
, sizeof(offset
));
278 buf
= (const char *)data
+ sizeof(offset
);
279 len
= count
- sizeof(offset
);
281 err
= at25_ee_write(at25
, buf
, offset
, len
);
287 static const struct regmap_bus at25_regmap_bus
= {
288 .read
= at25_regmap_read
,
289 .write
= at25_regmap_write
,
290 .reg_format_endian_default
= REGMAP_ENDIAN_NATIVE
,
293 /*-------------------------------------------------------------------------*/
295 static int at25_fw_to_chip(struct device
*dev
, struct spi_eeprom
*chip
)
299 memset(chip
, 0, sizeof(*chip
));
300 strncpy(chip
->name
, "at25", sizeof(chip
->name
));
302 if (device_property_read_u32(dev
, "size", &val
) == 0 ||
303 device_property_read_u32(dev
, "at25,byte-len", &val
) == 0) {
304 chip
->byte_len
= val
;
306 dev_err(dev
, "Error: missing \"size\" property\n");
310 if (device_property_read_u32(dev
, "pagesize", &val
) == 0 ||
311 device_property_read_u32(dev
, "at25,page-size", &val
) == 0) {
312 chip
->page_size
= (u16
)val
;
314 dev_err(dev
, "Error: missing \"pagesize\" property\n");
318 if (device_property_read_u32(dev
, "at25,addr-mode", &val
) == 0) {
319 chip
->flags
= (u16
)val
;
321 if (device_property_read_u32(dev
, "address-width", &val
)) {
323 "Error: missing \"address-width\" property\n");
328 chip
->flags
|= EE_ADDR1
;
331 chip
->flags
|= EE_ADDR2
;
334 chip
->flags
|= EE_ADDR3
;
338 "Error: bad \"address-width\" property: %u\n",
342 if (device_property_present(dev
, "read-only"))
343 chip
->flags
|= EE_READONLY
;
348 static int at25_probe(struct spi_device
*spi
)
350 struct at25_data
*at25
= NULL
;
351 struct spi_eeprom chip
;
352 struct regmap
*regmap
;
357 /* Chip description */
358 if (!spi
->dev
.platform_data
) {
359 err
= at25_fw_to_chip(&spi
->dev
, &chip
);
363 chip
= *(struct spi_eeprom
*)spi
->dev
.platform_data
;
365 /* For now we only support 8/16/24 bit addressing */
366 if (chip
.flags
& EE_ADDR1
)
368 else if (chip
.flags
& EE_ADDR2
)
370 else if (chip
.flags
& EE_ADDR3
)
373 dev_dbg(&spi
->dev
, "unsupported address type\n");
377 /* Ping the chip ... the status register is pretty portable,
378 * unlike probing manufacturer IDs. We do expect that system
379 * firmware didn't write it in the past few milliseconds!
381 sr
= spi_w8r8(spi
, AT25_RDSR
);
382 if (sr
< 0 || sr
& AT25_SR_nRDY
) {
383 dev_dbg(&spi
->dev
, "rdsr --> %d (%02x)\n", sr
, sr
);
387 at25
= devm_kzalloc(&spi
->dev
, sizeof(struct at25_data
), GFP_KERNEL
);
391 mutex_init(&at25
->lock
);
393 at25
->spi
= spi_dev_get(spi
);
394 spi_set_drvdata(spi
, at25
);
395 at25
->addrlen
= addrlen
;
397 at25
->regmap_config
.reg_bits
= 32;
398 at25
->regmap_config
.val_bits
= 8;
399 at25
->regmap_config
.reg_stride
= 1;
400 at25
->regmap_config
.max_register
= chip
.byte_len
- 1;
402 regmap
= devm_regmap_init(&spi
->dev
, &at25_regmap_bus
, at25
,
403 &at25
->regmap_config
);
404 if (IS_ERR(regmap
)) {
405 dev_err(&spi
->dev
, "regmap init failed\n");
406 return PTR_ERR(regmap
);
409 at25
->nvmem_config
.name
= dev_name(&spi
->dev
);
410 at25
->nvmem_config
.dev
= &spi
->dev
;
411 at25
->nvmem_config
.read_only
= chip
.flags
& EE_READONLY
;
412 at25
->nvmem_config
.root_only
= true;
413 at25
->nvmem_config
.owner
= THIS_MODULE
;
414 at25
->nvmem_config
.compat
= true;
415 at25
->nvmem_config
.base_dev
= &spi
->dev
;
417 at25
->nvmem
= nvmem_register(&at25
->nvmem_config
);
418 if (IS_ERR(at25
->nvmem
))
419 return PTR_ERR(at25
->nvmem
);
421 dev_info(&spi
->dev
, "%d %s %s eeprom%s, pagesize %u\n",
422 (chip
.byte_len
< 1024)
424 : (chip
.byte_len
/ 1024),
425 (chip
.byte_len
< 1024) ? "Byte" : "KByte",
427 (chip
.flags
& EE_READONLY
) ? " (readonly)" : "",
428 at25
->chip
.page_size
);
432 static int at25_remove(struct spi_device
*spi
)
434 struct at25_data
*at25
;
436 at25
= spi_get_drvdata(spi
);
437 nvmem_unregister(at25
->nvmem
);
442 /*-------------------------------------------------------------------------*/
444 static const struct of_device_id at25_of_match
[] = {
445 { .compatible
= "atmel,at25", },
448 MODULE_DEVICE_TABLE(of
, at25_of_match
);
450 static struct spi_driver at25_driver
= {
453 .of_match_table
= at25_of_match
,
456 .remove
= at25_remove
,
459 module_spi_driver(at25_driver
);
461 MODULE_DESCRIPTION("Driver for most SPI EEPROMs");
462 MODULE_AUTHOR("David Brownell");
463 MODULE_LICENSE("GPL");
464 MODULE_ALIAS("spi:at25");