sysfs.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/mtd/spi-nor.h>
  3. #include <linux/spi/spi.h>
  4. #include <linux/spi/spi-mem.h>
  5. #include <linux/sysfs.h>
  6. #include "core.h"
  7. static ssize_t manufacturer_show(struct device *dev,
  8. struct device_attribute *attr, char *buf)
  9. {
  10. struct spi_device *spi = to_spi_device(dev);
  11. struct spi_mem *spimem = spi_get_drvdata(spi);
  12. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  13. return sysfs_emit(buf, "%s\n", nor->manufacturer->name);
  14. }
  15. static DEVICE_ATTR_RO(manufacturer);
  16. static ssize_t partname_show(struct device *dev,
  17. struct device_attribute *attr, char *buf)
  18. {
  19. struct spi_device *spi = to_spi_device(dev);
  20. struct spi_mem *spimem = spi_get_drvdata(spi);
  21. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  22. return sysfs_emit(buf, "%s\n", nor->info->name);
  23. }
  24. static DEVICE_ATTR_RO(partname);
  25. static ssize_t jedec_id_show(struct device *dev,
  26. struct device_attribute *attr, char *buf)
  27. {
  28. struct spi_device *spi = to_spi_device(dev);
  29. struct spi_mem *spimem = spi_get_drvdata(spi);
  30. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  31. return sysfs_emit(buf, "%*phN\n", nor->info->id_len, nor->info->id);
  32. }
  33. static DEVICE_ATTR_RO(jedec_id);
  34. static struct attribute *spi_nor_sysfs_entries[] = {
  35. &dev_attr_manufacturer.attr,
  36. &dev_attr_partname.attr,
  37. &dev_attr_jedec_id.attr,
  38. NULL
  39. };
  40. static ssize_t sfdp_read(struct file *filp, struct kobject *kobj,
  41. struct bin_attribute *bin_attr, char *buf,
  42. loff_t off, size_t count)
  43. {
  44. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  45. struct spi_mem *spimem = spi_get_drvdata(spi);
  46. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  47. struct sfdp *sfdp = nor->sfdp;
  48. size_t sfdp_size = sfdp->num_dwords * sizeof(*sfdp->dwords);
  49. return memory_read_from_buffer(buf, count, &off, nor->sfdp->dwords,
  50. sfdp_size);
  51. }
  52. static BIN_ATTR_RO(sfdp, 0);
  53. static struct bin_attribute *spi_nor_sysfs_bin_entries[] = {
  54. &bin_attr_sfdp,
  55. NULL
  56. };
  57. static umode_t spi_nor_sysfs_is_visible(struct kobject *kobj,
  58. struct attribute *attr, int n)
  59. {
  60. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  61. struct spi_mem *spimem = spi_get_drvdata(spi);
  62. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  63. if (attr == &dev_attr_jedec_id.attr && !nor->info->id_len)
  64. return 0;
  65. return 0444;
  66. }
  67. static umode_t spi_nor_sysfs_is_bin_visible(struct kobject *kobj,
  68. struct bin_attribute *attr, int n)
  69. {
  70. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  71. struct spi_mem *spimem = spi_get_drvdata(spi);
  72. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  73. if (attr == &bin_attr_sfdp && nor->sfdp)
  74. return 0444;
  75. return 0;
  76. }
  77. static const struct attribute_group spi_nor_sysfs_group = {
  78. .name = "spi-nor",
  79. .is_visible = spi_nor_sysfs_is_visible,
  80. .is_bin_visible = spi_nor_sysfs_is_bin_visible,
  81. .attrs = spi_nor_sysfs_entries,
  82. .bin_attrs = spi_nor_sysfs_bin_entries,
  83. };
  84. const struct attribute_group *spi_nor_sysfs_groups[] = {
  85. &spi_nor_sysfs_group,
  86. NULL
  87. };