sysfs.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. const u8 *id = nor->info->id ? nor->info->id->bytes : nor->id;
  32. u8 id_len = nor->info->id ? nor->info->id->len : SPI_NOR_MAX_ID_LEN;
  33. return sysfs_emit(buf, "%*phN\n", id_len, id);
  34. }
  35. static DEVICE_ATTR_RO(jedec_id);
  36. static struct attribute *spi_nor_sysfs_entries[] = {
  37. &dev_attr_manufacturer.attr,
  38. &dev_attr_partname.attr,
  39. &dev_attr_jedec_id.attr,
  40. NULL
  41. };
  42. static ssize_t sfdp_read(struct file *filp, struct kobject *kobj,
  43. struct bin_attribute *bin_attr, char *buf,
  44. loff_t off, size_t count)
  45. {
  46. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  47. struct spi_mem *spimem = spi_get_drvdata(spi);
  48. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  49. struct sfdp *sfdp = nor->sfdp;
  50. size_t sfdp_size = sfdp->num_dwords * sizeof(*sfdp->dwords);
  51. return memory_read_from_buffer(buf, count, &off, nor->sfdp->dwords,
  52. sfdp_size);
  53. }
  54. static BIN_ATTR_RO(sfdp, 0);
  55. static struct bin_attribute *spi_nor_sysfs_bin_entries[] = {
  56. &bin_attr_sfdp,
  57. NULL
  58. };
  59. static umode_t spi_nor_sysfs_is_visible(struct kobject *kobj,
  60. struct attribute *attr, int n)
  61. {
  62. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  63. struct spi_mem *spimem = spi_get_drvdata(spi);
  64. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  65. if (attr == &dev_attr_manufacturer.attr && !nor->manufacturer)
  66. return 0;
  67. if (attr == &dev_attr_partname.attr && !nor->info->name)
  68. return 0;
  69. if (attr == &dev_attr_jedec_id.attr && !nor->info->id && !nor->id)
  70. return 0;
  71. return 0444;
  72. }
  73. static umode_t spi_nor_sysfs_is_bin_visible(struct kobject *kobj,
  74. struct bin_attribute *attr, int n)
  75. {
  76. struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
  77. struct spi_mem *spimem = spi_get_drvdata(spi);
  78. struct spi_nor *nor = spi_mem_get_drvdata(spimem);
  79. if (attr == &bin_attr_sfdp && nor->sfdp)
  80. return 0444;
  81. return 0;
  82. }
  83. static const struct attribute_group spi_nor_sysfs_group = {
  84. .name = "spi-nor",
  85. .is_visible = spi_nor_sysfs_is_visible,
  86. .is_bin_visible = spi_nor_sysfs_is_bin_visible,
  87. .attrs = spi_nor_sysfs_entries,
  88. .bin_attrs = spi_nor_sysfs_bin_entries,
  89. };
  90. const struct attribute_group *spi_nor_sysfs_groups[] = {
  91. &spi_nor_sysfs_group,
  92. NULL
  93. };