eeprom_93xx46.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/mutex.h>
  15. #include <linux/slab.h>
  16. #include <linux/spi/spi.h>
  17. #include <linux/sysfs.h>
  18. #include <linux/eeprom_93xx46.h>
  19. #define OP_START 0x4
  20. #define OP_WRITE (OP_START | 0x1)
  21. #define OP_READ (OP_START | 0x2)
  22. #define ADDR_EWDS 0x00
  23. #define ADDR_ERAL 0x20
  24. #define ADDR_EWEN 0x30
  25. struct eeprom_93xx46_dev {
  26. struct spi_device *spi;
  27. struct eeprom_93xx46_platform_data *pdata;
  28. struct bin_attribute bin;
  29. struct mutex lock;
  30. int addrlen;
  31. };
  32. static ssize_t
  33. eeprom_93xx46_bin_read(struct file *filp, struct kobject *kobj,
  34. struct bin_attribute *bin_attr,
  35. char *buf, loff_t off, size_t count)
  36. {
  37. struct eeprom_93xx46_dev *edev;
  38. struct device *dev;
  39. struct spi_message m;
  40. struct spi_transfer t[2];
  41. int bits, ret;
  42. u16 cmd_addr;
  43. dev = container_of(kobj, struct device, kobj);
  44. edev = dev_get_drvdata(dev);
  45. if (unlikely(off >= edev->bin.size))
  46. return 0;
  47. if ((off + count) > edev->bin.size)
  48. count = edev->bin.size - off;
  49. if (unlikely(!count))
  50. return count;
  51. cmd_addr = OP_READ << edev->addrlen;
  52. if (edev->addrlen == 7) {
  53. cmd_addr |= off & 0x7f;
  54. bits = 10;
  55. } else {
  56. cmd_addr |= off & 0x3f;
  57. bits = 9;
  58. }
  59. dev_dbg(&edev->spi->dev, "read cmd 0x%x, %d Hz\n",
  60. cmd_addr, edev->spi->max_speed_hz);
  61. spi_message_init(&m);
  62. memset(t, 0, sizeof(t));
  63. t[0].tx_buf = (char *)&cmd_addr;
  64. t[0].len = 2;
  65. t[0].bits_per_word = bits;
  66. spi_message_add_tail(&t[0], &m);
  67. t[1].rx_buf = buf;
  68. t[1].len = count;
  69. t[1].bits_per_word = 8;
  70. spi_message_add_tail(&t[1], &m);
  71. mutex_lock(&edev->lock);
  72. if (edev->pdata->prepare)
  73. edev->pdata->prepare(edev);
  74. ret = spi_sync(edev->spi, &m);
  75. /* have to wait at least Tcsl ns */
  76. ndelay(250);
  77. if (ret) {
  78. dev_err(&edev->spi->dev, "read %zu bytes at %d: err. %d\n",
  79. count, (int)off, ret);
  80. }
  81. if (edev->pdata->finish)
  82. edev->pdata->finish(edev);
  83. mutex_unlock(&edev->lock);
  84. return ret ? : count;
  85. }
  86. static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on)
  87. {
  88. struct spi_message m;
  89. struct spi_transfer t;
  90. int bits, ret;
  91. u16 cmd_addr;
  92. cmd_addr = OP_START << edev->addrlen;
  93. if (edev->addrlen == 7) {
  94. cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1;
  95. bits = 10;
  96. } else {
  97. cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS);
  98. bits = 9;
  99. }
  100. dev_dbg(&edev->spi->dev, "ew cmd 0x%04x\n", cmd_addr);
  101. spi_message_init(&m);
  102. memset(&t, 0, sizeof(t));
  103. t.tx_buf = &cmd_addr;
  104. t.len = 2;
  105. t.bits_per_word = bits;
  106. spi_message_add_tail(&t, &m);
  107. mutex_lock(&edev->lock);
  108. if (edev->pdata->prepare)
  109. edev->pdata->prepare(edev);
  110. ret = spi_sync(edev->spi, &m);
  111. /* have to wait at least Tcsl ns */
  112. ndelay(250);
  113. if (ret)
  114. dev_err(&edev->spi->dev, "erase/write %sable error %d\n",
  115. is_on ? "en" : "dis", ret);
  116. if (edev->pdata->finish)
  117. edev->pdata->finish(edev);
  118. mutex_unlock(&edev->lock);
  119. return ret;
  120. }
  121. static ssize_t
  122. eeprom_93xx46_write_word(struct eeprom_93xx46_dev *edev,
  123. const char *buf, unsigned off)
  124. {
  125. struct spi_message m;
  126. struct spi_transfer t[2];
  127. int bits, data_len, ret;
  128. u16 cmd_addr;
  129. cmd_addr = OP_WRITE << edev->addrlen;
  130. if (edev->addrlen == 7) {
  131. cmd_addr |= off & 0x7f;
  132. bits = 10;
  133. data_len = 1;
  134. } else {
  135. cmd_addr |= off & 0x3f;
  136. bits = 9;
  137. data_len = 2;
  138. }
  139. dev_dbg(&edev->spi->dev, "write cmd 0x%x\n", cmd_addr);
  140. spi_message_init(&m);
  141. memset(t, 0, sizeof(t));
  142. t[0].tx_buf = (char *)&cmd_addr;
  143. t[0].len = 2;
  144. t[0].bits_per_word = bits;
  145. spi_message_add_tail(&t[0], &m);
  146. t[1].tx_buf = buf;
  147. t[1].len = data_len;
  148. t[1].bits_per_word = 8;
  149. spi_message_add_tail(&t[1], &m);
  150. ret = spi_sync(edev->spi, &m);
  151. /* have to wait program cycle time Twc ms */
  152. mdelay(6);
  153. return ret;
  154. }
  155. static ssize_t
  156. eeprom_93xx46_bin_write(struct file *filp, struct kobject *kobj,
  157. struct bin_attribute *bin_attr,
  158. char *buf, loff_t off, size_t count)
  159. {
  160. struct eeprom_93xx46_dev *edev;
  161. struct device *dev;
  162. int i, ret, step = 1;
  163. dev = container_of(kobj, struct device, kobj);
  164. edev = dev_get_drvdata(dev);
  165. if (unlikely(off >= edev->bin.size))
  166. return -EFBIG;
  167. if ((off + count) > edev->bin.size)
  168. count = edev->bin.size - off;
  169. if (unlikely(!count))
  170. return count;
  171. /* only write even number of bytes on 16-bit devices */
  172. if (edev->addrlen == 6) {
  173. step = 2;
  174. count &= ~1;
  175. }
  176. /* erase/write enable */
  177. ret = eeprom_93xx46_ew(edev, 1);
  178. if (ret)
  179. return ret;
  180. mutex_lock(&edev->lock);
  181. if (edev->pdata->prepare)
  182. edev->pdata->prepare(edev);
  183. for (i = 0; i < count; i += step) {
  184. ret = eeprom_93xx46_write_word(edev, &buf[i], off + i);
  185. if (ret) {
  186. dev_err(&edev->spi->dev, "write failed at %d: %d\n",
  187. (int)off + i, ret);
  188. break;
  189. }
  190. }
  191. if (edev->pdata->finish)
  192. edev->pdata->finish(edev);
  193. mutex_unlock(&edev->lock);
  194. /* erase/write disable */
  195. eeprom_93xx46_ew(edev, 0);
  196. return ret ? : count;
  197. }
  198. static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev)
  199. {
  200. struct eeprom_93xx46_platform_data *pd = edev->pdata;
  201. struct spi_message m;
  202. struct spi_transfer t;
  203. int bits, ret;
  204. u16 cmd_addr;
  205. cmd_addr = OP_START << edev->addrlen;
  206. if (edev->addrlen == 7) {
  207. cmd_addr |= ADDR_ERAL << 1;
  208. bits = 10;
  209. } else {
  210. cmd_addr |= ADDR_ERAL;
  211. bits = 9;
  212. }
  213. spi_message_init(&m);
  214. memset(&t, 0, sizeof(t));
  215. t.tx_buf = &cmd_addr;
  216. t.len = 2;
  217. t.bits_per_word = bits;
  218. spi_message_add_tail(&t, &m);
  219. mutex_lock(&edev->lock);
  220. if (edev->pdata->prepare)
  221. edev->pdata->prepare(edev);
  222. ret = spi_sync(edev->spi, &m);
  223. if (ret)
  224. dev_err(&edev->spi->dev, "erase error %d\n", ret);
  225. /* have to wait erase cycle time Tec ms */
  226. mdelay(6);
  227. if (pd->finish)
  228. pd->finish(edev);
  229. mutex_unlock(&edev->lock);
  230. return ret;
  231. }
  232. static ssize_t eeprom_93xx46_store_erase(struct device *dev,
  233. struct device_attribute *attr,
  234. const char *buf, size_t count)
  235. {
  236. struct eeprom_93xx46_dev *edev = dev_get_drvdata(dev);
  237. int erase = 0, ret;
  238. sscanf(buf, "%d", &erase);
  239. if (erase) {
  240. ret = eeprom_93xx46_ew(edev, 1);
  241. if (ret)
  242. return ret;
  243. ret = eeprom_93xx46_eral(edev);
  244. if (ret)
  245. return ret;
  246. ret = eeprom_93xx46_ew(edev, 0);
  247. if (ret)
  248. return ret;
  249. }
  250. return count;
  251. }
  252. static DEVICE_ATTR(erase, S_IWUSR, NULL, eeprom_93xx46_store_erase);
  253. static int eeprom_93xx46_probe(struct spi_device *spi)
  254. {
  255. struct eeprom_93xx46_platform_data *pd;
  256. struct eeprom_93xx46_dev *edev;
  257. int err;
  258. pd = spi->dev.platform_data;
  259. if (!pd) {
  260. dev_err(&spi->dev, "missing platform data\n");
  261. return -ENODEV;
  262. }
  263. edev = kzalloc(sizeof(*edev), GFP_KERNEL);
  264. if (!edev)
  265. return -ENOMEM;
  266. if (pd->flags & EE_ADDR8)
  267. edev->addrlen = 7;
  268. else if (pd->flags & EE_ADDR16)
  269. edev->addrlen = 6;
  270. else {
  271. dev_err(&spi->dev, "unspecified address type\n");
  272. err = -EINVAL;
  273. goto fail;
  274. }
  275. mutex_init(&edev->lock);
  276. edev->spi = spi_dev_get(spi);
  277. edev->pdata = pd;
  278. sysfs_bin_attr_init(&edev->bin);
  279. edev->bin.attr.name = "eeprom";
  280. edev->bin.attr.mode = S_IRUSR;
  281. edev->bin.read = eeprom_93xx46_bin_read;
  282. edev->bin.size = 128;
  283. if (!(pd->flags & EE_READONLY)) {
  284. edev->bin.write = eeprom_93xx46_bin_write;
  285. edev->bin.attr.mode |= S_IWUSR;
  286. }
  287. err = sysfs_create_bin_file(&spi->dev.kobj, &edev->bin);
  288. if (err)
  289. goto fail;
  290. dev_info(&spi->dev, "%d-bit eeprom %s\n",
  291. (pd->flags & EE_ADDR8) ? 8 : 16,
  292. (pd->flags & EE_READONLY) ? "(readonly)" : "");
  293. if (!(pd->flags & EE_READONLY)) {
  294. if (device_create_file(&spi->dev, &dev_attr_erase))
  295. dev_err(&spi->dev, "can't create erase interface\n");
  296. }
  297. spi_set_drvdata(spi, edev);
  298. return 0;
  299. fail:
  300. kfree(edev);
  301. return err;
  302. }
  303. static int eeprom_93xx46_remove(struct spi_device *spi)
  304. {
  305. struct eeprom_93xx46_dev *edev = spi_get_drvdata(spi);
  306. if (!(edev->pdata->flags & EE_READONLY))
  307. device_remove_file(&spi->dev, &dev_attr_erase);
  308. sysfs_remove_bin_file(&spi->dev.kobj, &edev->bin);
  309. kfree(edev);
  310. return 0;
  311. }
  312. static struct spi_driver eeprom_93xx46_driver = {
  313. .driver = {
  314. .name = "93xx46",
  315. .owner = THIS_MODULE,
  316. },
  317. .probe = eeprom_93xx46_probe,
  318. .remove = eeprom_93xx46_remove,
  319. };
  320. module_spi_driver(eeprom_93xx46_driver);
  321. MODULE_LICENSE("GPL");
  322. MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs");
  323. MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>");
  324. MODULE_ALIAS("spi:93xx46");