eeprom_93xx46.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. /*
  2. * Driver for 93xx46 EEPROMs
  3. *
  4. * (C) 2011 DENX Software Engineering, Anatolij Gustschin <agust@denx.de>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/delay.h>
  11. #include <linux/device.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/mutex.h>
  16. #include <linux/of.h>
  17. #include <linux/of_device.h>
  18. #include <linux/of_gpio.h>
  19. #include <linux/slab.h>
  20. #include <linux/spi/spi.h>
  21. #include <linux/nvmem-provider.h>
  22. #include <linux/regmap.h>
  23. #include <linux/eeprom_93xx46.h>
  24. #define OP_START 0x4
  25. #define OP_WRITE (OP_START | 0x1)
  26. #define OP_READ (OP_START | 0x2)
  27. #define ADDR_EWDS 0x00
  28. #define ADDR_ERAL 0x20
  29. #define ADDR_EWEN 0x30
  30. struct eeprom_93xx46_devtype_data {
  31. unsigned int quirks;
  32. };
  33. static const struct eeprom_93xx46_devtype_data atmel_at93c46d_data = {
  34. .quirks = EEPROM_93XX46_QUIRK_SINGLE_WORD_READ |
  35. EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH,
  36. };
  37. struct eeprom_93xx46_dev {
  38. struct spi_device *spi;
  39. struct eeprom_93xx46_platform_data *pdata;
  40. struct mutex lock;
  41. struct regmap_config regmap_config;
  42. struct nvmem_config nvmem_config;
  43. struct nvmem_device *nvmem;
  44. int addrlen;
  45. int size;
  46. };
  47. static inline bool has_quirk_single_word_read(struct eeprom_93xx46_dev *edev)
  48. {
  49. return edev->pdata->quirks & EEPROM_93XX46_QUIRK_SINGLE_WORD_READ;
  50. }
  51. static inline bool has_quirk_instruction_length(struct eeprom_93xx46_dev *edev)
  52. {
  53. return edev->pdata->quirks & EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH;
  54. }
  55. static ssize_t
  56. eeprom_93xx46_read(struct eeprom_93xx46_dev *edev, char *buf,
  57. unsigned off, size_t count)
  58. {
  59. ssize_t ret = 0;
  60. if (unlikely(off >= edev->size))
  61. return 0;
  62. if ((off + count) > edev->size)
  63. count = edev->size - off;
  64. if (unlikely(!count))
  65. return count;
  66. mutex_lock(&edev->lock);
  67. if (edev->pdata->prepare)
  68. edev->pdata->prepare(edev);
  69. while (count) {
  70. struct spi_message m;
  71. struct spi_transfer t[2] = { { 0 } };
  72. u16 cmd_addr = OP_READ << edev->addrlen;
  73. size_t nbytes = count;
  74. int bits;
  75. int err;
  76. if (edev->addrlen == 7) {
  77. cmd_addr |= off & 0x7f;
  78. bits = 10;
  79. if (has_quirk_single_word_read(edev))
  80. nbytes = 1;
  81. } else {
  82. cmd_addr |= (off >> 1) & 0x3f;
  83. bits = 9;
  84. if (has_quirk_single_word_read(edev))
  85. nbytes = 2;
  86. }
  87. dev_dbg(&edev->spi->dev, "read cmd 0x%x, %d Hz\n",
  88. cmd_addr, edev->spi->max_speed_hz);
  89. spi_message_init(&m);
  90. t[0].tx_buf = (char *)&cmd_addr;
  91. t[0].len = 2;
  92. t[0].bits_per_word = bits;
  93. spi_message_add_tail(&t[0], &m);
  94. t[1].rx_buf = buf;
  95. t[1].len = count;
  96. t[1].bits_per_word = 8;
  97. spi_message_add_tail(&t[1], &m);
  98. err = spi_sync(edev->spi, &m);
  99. /* have to wait at least Tcsl ns */
  100. ndelay(250);
  101. if (err) {
  102. dev_err(&edev->spi->dev, "read %zu bytes at %d: err. %d\n",
  103. nbytes, (int)off, err);
  104. ret = err;
  105. break;
  106. }
  107. buf += nbytes;
  108. off += nbytes;
  109. count -= nbytes;
  110. ret += nbytes;
  111. }
  112. if (edev->pdata->finish)
  113. edev->pdata->finish(edev);
  114. mutex_unlock(&edev->lock);
  115. return ret;
  116. }
  117. static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on)
  118. {
  119. struct spi_message m;
  120. struct spi_transfer t;
  121. int bits, ret;
  122. u16 cmd_addr;
  123. cmd_addr = OP_START << edev->addrlen;
  124. if (edev->addrlen == 7) {
  125. cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1;
  126. bits = 10;
  127. } else {
  128. cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS);
  129. bits = 9;
  130. }
  131. if (has_quirk_instruction_length(edev)) {
  132. cmd_addr <<= 2;
  133. bits += 2;
  134. }
  135. dev_dbg(&edev->spi->dev, "ew%s cmd 0x%04x, %d bits\n",
  136. is_on ? "en" : "ds", cmd_addr, bits);
  137. spi_message_init(&m);
  138. memset(&t, 0, sizeof(t));
  139. t.tx_buf = &cmd_addr;
  140. t.len = 2;
  141. t.bits_per_word = bits;
  142. spi_message_add_tail(&t, &m);
  143. mutex_lock(&edev->lock);
  144. if (edev->pdata->prepare)
  145. edev->pdata->prepare(edev);
  146. ret = spi_sync(edev->spi, &m);
  147. /* have to wait at least Tcsl ns */
  148. ndelay(250);
  149. if (ret)
  150. dev_err(&edev->spi->dev, "erase/write %sable error %d\n",
  151. is_on ? "en" : "dis", ret);
  152. if (edev->pdata->finish)
  153. edev->pdata->finish(edev);
  154. mutex_unlock(&edev->lock);
  155. return ret;
  156. }
  157. static ssize_t
  158. eeprom_93xx46_write_word(struct eeprom_93xx46_dev *edev,
  159. const char *buf, unsigned off)
  160. {
  161. struct spi_message m;
  162. struct spi_transfer t[2];
  163. int bits, data_len, ret;
  164. u16 cmd_addr;
  165. cmd_addr = OP_WRITE << edev->addrlen;
  166. if (edev->addrlen == 7) {
  167. cmd_addr |= off & 0x7f;
  168. bits = 10;
  169. data_len = 1;
  170. } else {
  171. cmd_addr |= (off >> 1) & 0x3f;
  172. bits = 9;
  173. data_len = 2;
  174. }
  175. dev_dbg(&edev->spi->dev, "write cmd 0x%x\n", cmd_addr);
  176. spi_message_init(&m);
  177. memset(t, 0, sizeof(t));
  178. t[0].tx_buf = (char *)&cmd_addr;
  179. t[0].len = 2;
  180. t[0].bits_per_word = bits;
  181. spi_message_add_tail(&t[0], &m);
  182. t[1].tx_buf = buf;
  183. t[1].len = data_len;
  184. t[1].bits_per_word = 8;
  185. spi_message_add_tail(&t[1], &m);
  186. ret = spi_sync(edev->spi, &m);
  187. /* have to wait program cycle time Twc ms */
  188. mdelay(6);
  189. return ret;
  190. }
  191. static ssize_t
  192. eeprom_93xx46_write(struct eeprom_93xx46_dev *edev, const char *buf,
  193. loff_t off, size_t count)
  194. {
  195. int i, ret, step = 1;
  196. if (unlikely(off >= edev->size))
  197. return -EFBIG;
  198. if ((off + count) > edev->size)
  199. count = edev->size - off;
  200. if (unlikely(!count))
  201. return count;
  202. /* only write even number of bytes on 16-bit devices */
  203. if (edev->addrlen == 6) {
  204. step = 2;
  205. count &= ~1;
  206. }
  207. /* erase/write enable */
  208. ret = eeprom_93xx46_ew(edev, 1);
  209. if (ret)
  210. return ret;
  211. mutex_lock(&edev->lock);
  212. if (edev->pdata->prepare)
  213. edev->pdata->prepare(edev);
  214. for (i = 0; i < count; i += step) {
  215. ret = eeprom_93xx46_write_word(edev, &buf[i], off + i);
  216. if (ret) {
  217. dev_err(&edev->spi->dev, "write failed at %d: %d\n",
  218. (int)off + i, ret);
  219. break;
  220. }
  221. }
  222. if (edev->pdata->finish)
  223. edev->pdata->finish(edev);
  224. mutex_unlock(&edev->lock);
  225. /* erase/write disable */
  226. eeprom_93xx46_ew(edev, 0);
  227. return ret ? : count;
  228. }
  229. /*
  230. * Provide a regmap interface, which is registered with the NVMEM
  231. * framework
  232. */
  233. static int eeprom_93xx46_regmap_read(void *context, const void *reg,
  234. size_t reg_size, void *val,
  235. size_t val_size)
  236. {
  237. struct eeprom_93xx46_dev *eeprom_93xx46 = context;
  238. off_t offset = *(u32 *)reg;
  239. int err;
  240. err = eeprom_93xx46_read(eeprom_93xx46, val, offset, val_size);
  241. if (err)
  242. return err;
  243. return 0;
  244. }
  245. static int eeprom_93xx46_regmap_write(void *context, const void *data,
  246. size_t count)
  247. {
  248. struct eeprom_93xx46_dev *eeprom_93xx46 = context;
  249. const char *buf;
  250. u32 offset;
  251. size_t len;
  252. int err;
  253. memcpy(&offset, data, sizeof(offset));
  254. buf = (const char *)data + sizeof(offset);
  255. len = count - sizeof(offset);
  256. err = eeprom_93xx46_write(eeprom_93xx46, buf, offset, len);
  257. if (err)
  258. return err;
  259. return 0;
  260. }
  261. static const struct regmap_bus eeprom_93xx46_regmap_bus = {
  262. .read = eeprom_93xx46_regmap_read,
  263. .write = eeprom_93xx46_regmap_write,
  264. .reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
  265. };
  266. static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev)
  267. {
  268. struct eeprom_93xx46_platform_data *pd = edev->pdata;
  269. struct spi_message m;
  270. struct spi_transfer t;
  271. int bits, ret;
  272. u16 cmd_addr;
  273. cmd_addr = OP_START << edev->addrlen;
  274. if (edev->addrlen == 7) {
  275. cmd_addr |= ADDR_ERAL << 1;
  276. bits = 10;
  277. } else {
  278. cmd_addr |= ADDR_ERAL;
  279. bits = 9;
  280. }
  281. if (has_quirk_instruction_length(edev)) {
  282. cmd_addr <<= 2;
  283. bits += 2;
  284. }
  285. dev_dbg(&edev->spi->dev, "eral cmd 0x%04x, %d bits\n", cmd_addr, bits);
  286. spi_message_init(&m);
  287. memset(&t, 0, sizeof(t));
  288. t.tx_buf = &cmd_addr;
  289. t.len = 2;
  290. t.bits_per_word = bits;
  291. spi_message_add_tail(&t, &m);
  292. mutex_lock(&edev->lock);
  293. if (edev->pdata->prepare)
  294. edev->pdata->prepare(edev);
  295. ret = spi_sync(edev->spi, &m);
  296. if (ret)
  297. dev_err(&edev->spi->dev, "erase error %d\n", ret);
  298. /* have to wait erase cycle time Tec ms */
  299. mdelay(6);
  300. if (pd->finish)
  301. pd->finish(edev);
  302. mutex_unlock(&edev->lock);
  303. return ret;
  304. }
  305. static ssize_t eeprom_93xx46_store_erase(struct device *dev,
  306. struct device_attribute *attr,
  307. const char *buf, size_t count)
  308. {
  309. struct eeprom_93xx46_dev *edev = dev_get_drvdata(dev);
  310. int erase = 0, ret;
  311. sscanf(buf, "%d", &erase);
  312. if (erase) {
  313. ret = eeprom_93xx46_ew(edev, 1);
  314. if (ret)
  315. return ret;
  316. ret = eeprom_93xx46_eral(edev);
  317. if (ret)
  318. return ret;
  319. ret = eeprom_93xx46_ew(edev, 0);
  320. if (ret)
  321. return ret;
  322. }
  323. return count;
  324. }
  325. static DEVICE_ATTR(erase, S_IWUSR, NULL, eeprom_93xx46_store_erase);
  326. static void select_assert(void *context)
  327. {
  328. struct eeprom_93xx46_dev *edev = context;
  329. gpiod_set_value_cansleep(edev->pdata->select, 1);
  330. }
  331. static void select_deassert(void *context)
  332. {
  333. struct eeprom_93xx46_dev *edev = context;
  334. gpiod_set_value_cansleep(edev->pdata->select, 0);
  335. }
  336. static const struct of_device_id eeprom_93xx46_of_table[] = {
  337. { .compatible = "eeprom-93xx46", },
  338. { .compatible = "atmel,at93c46d", .data = &atmel_at93c46d_data, },
  339. {}
  340. };
  341. MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table);
  342. static int eeprom_93xx46_probe_dt(struct spi_device *spi)
  343. {
  344. const struct of_device_id *of_id =
  345. of_match_device(eeprom_93xx46_of_table, &spi->dev);
  346. struct device_node *np = spi->dev.of_node;
  347. struct eeprom_93xx46_platform_data *pd;
  348. u32 tmp;
  349. int gpio;
  350. enum of_gpio_flags of_flags;
  351. int ret;
  352. pd = devm_kzalloc(&spi->dev, sizeof(*pd), GFP_KERNEL);
  353. if (!pd)
  354. return -ENOMEM;
  355. ret = of_property_read_u32(np, "data-size", &tmp);
  356. if (ret < 0) {
  357. dev_err(&spi->dev, "data-size property not found\n");
  358. return ret;
  359. }
  360. if (tmp == 8) {
  361. pd->flags |= EE_ADDR8;
  362. } else if (tmp == 16) {
  363. pd->flags |= EE_ADDR16;
  364. } else {
  365. dev_err(&spi->dev, "invalid data-size (%d)\n", tmp);
  366. return -EINVAL;
  367. }
  368. if (of_property_read_bool(np, "read-only"))
  369. pd->flags |= EE_READONLY;
  370. gpio = of_get_named_gpio_flags(np, "select-gpios", 0, &of_flags);
  371. if (gpio_is_valid(gpio)) {
  372. unsigned long flags =
  373. of_flags == OF_GPIO_ACTIVE_LOW ? GPIOF_ACTIVE_LOW : 0;
  374. ret = devm_gpio_request_one(&spi->dev, gpio, flags,
  375. "eeprom_93xx46_select");
  376. if (ret)
  377. return ret;
  378. pd->select = gpio_to_desc(gpio);
  379. pd->prepare = select_assert;
  380. pd->finish = select_deassert;
  381. gpiod_direction_output(pd->select, 0);
  382. }
  383. if (of_id->data) {
  384. const struct eeprom_93xx46_devtype_data *data = of_id->data;
  385. pd->quirks = data->quirks;
  386. }
  387. spi->dev.platform_data = pd;
  388. return 0;
  389. }
  390. static int eeprom_93xx46_probe(struct spi_device *spi)
  391. {
  392. struct eeprom_93xx46_platform_data *pd;
  393. struct eeprom_93xx46_dev *edev;
  394. struct regmap *regmap;
  395. int err;
  396. if (spi->dev.of_node) {
  397. err = eeprom_93xx46_probe_dt(spi);
  398. if (err < 0)
  399. return err;
  400. }
  401. pd = spi->dev.platform_data;
  402. if (!pd) {
  403. dev_err(&spi->dev, "missing platform data\n");
  404. return -ENODEV;
  405. }
  406. edev = kzalloc(sizeof(*edev), GFP_KERNEL);
  407. if (!edev)
  408. return -ENOMEM;
  409. if (pd->flags & EE_ADDR8)
  410. edev->addrlen = 7;
  411. else if (pd->flags & EE_ADDR16)
  412. edev->addrlen = 6;
  413. else {
  414. dev_err(&spi->dev, "unspecified address type\n");
  415. err = -EINVAL;
  416. goto fail;
  417. }
  418. mutex_init(&edev->lock);
  419. edev->spi = spi_dev_get(spi);
  420. edev->pdata = pd;
  421. edev->size = 128;
  422. edev->regmap_config.reg_bits = 32;
  423. edev->regmap_config.val_bits = 8;
  424. edev->regmap_config.reg_stride = 1;
  425. edev->regmap_config.max_register = edev->size - 1;
  426. regmap = devm_regmap_init(&spi->dev, &eeprom_93xx46_regmap_bus, edev,
  427. &edev->regmap_config);
  428. if (IS_ERR(regmap)) {
  429. dev_err(&spi->dev, "regmap init failed\n");
  430. err = PTR_ERR(regmap);
  431. goto fail;
  432. }
  433. edev->nvmem_config.name = dev_name(&spi->dev);
  434. edev->nvmem_config.dev = &spi->dev;
  435. edev->nvmem_config.read_only = pd->flags & EE_READONLY;
  436. edev->nvmem_config.root_only = true;
  437. edev->nvmem_config.owner = THIS_MODULE;
  438. edev->nvmem_config.compat = true;
  439. edev->nvmem_config.base_dev = &spi->dev;
  440. edev->nvmem = nvmem_register(&edev->nvmem_config);
  441. if (IS_ERR(edev->nvmem)) {
  442. err = PTR_ERR(edev->nvmem);
  443. goto fail;
  444. }
  445. dev_info(&spi->dev, "%d-bit eeprom %s\n",
  446. (pd->flags & EE_ADDR8) ? 8 : 16,
  447. (pd->flags & EE_READONLY) ? "(readonly)" : "");
  448. if (!(pd->flags & EE_READONLY)) {
  449. if (device_create_file(&spi->dev, &dev_attr_erase))
  450. dev_err(&spi->dev, "can't create erase interface\n");
  451. }
  452. spi_set_drvdata(spi, edev);
  453. return 0;
  454. fail:
  455. kfree(edev);
  456. return err;
  457. }
  458. static int eeprom_93xx46_remove(struct spi_device *spi)
  459. {
  460. struct eeprom_93xx46_dev *edev = spi_get_drvdata(spi);
  461. nvmem_unregister(edev->nvmem);
  462. if (!(edev->pdata->flags & EE_READONLY))
  463. device_remove_file(&spi->dev, &dev_attr_erase);
  464. kfree(edev);
  465. return 0;
  466. }
  467. static struct spi_driver eeprom_93xx46_driver = {
  468. .driver = {
  469. .name = "93xx46",
  470. .of_match_table = of_match_ptr(eeprom_93xx46_of_table),
  471. },
  472. .probe = eeprom_93xx46_probe,
  473. .remove = eeprom_93xx46_remove,
  474. };
  475. module_spi_driver(eeprom_93xx46_driver);
  476. MODULE_LICENSE("GPL");
  477. MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs");
  478. MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>");
  479. MODULE_ALIAS("spi:93xx46");