ide-sysfs.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/kernel.h>
  3. #include <linux/ide.h>
  4. char *ide_media_string(ide_drive_t *drive)
  5. {
  6. switch (drive->media) {
  7. case ide_disk:
  8. return "disk";
  9. case ide_cdrom:
  10. return "cdrom";
  11. case ide_tape:
  12. return "tape";
  13. case ide_floppy:
  14. return "floppy";
  15. case ide_optical:
  16. return "optical";
  17. default:
  18. return "UNKNOWN";
  19. }
  20. }
  21. static ssize_t media_show(struct device *dev, struct device_attribute *attr,
  22. char *buf)
  23. {
  24. ide_drive_t *drive = to_ide_device(dev);
  25. return sprintf(buf, "%s\n", ide_media_string(drive));
  26. }
  27. static DEVICE_ATTR_RO(media);
  28. static ssize_t drivename_show(struct device *dev, struct device_attribute *attr,
  29. char *buf)
  30. {
  31. ide_drive_t *drive = to_ide_device(dev);
  32. return sprintf(buf, "%s\n", drive->name);
  33. }
  34. static DEVICE_ATTR_RO(drivename);
  35. static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
  36. char *buf)
  37. {
  38. ide_drive_t *drive = to_ide_device(dev);
  39. return sprintf(buf, "ide:m-%s\n", ide_media_string(drive));
  40. }
  41. static DEVICE_ATTR_RO(modalias);
  42. static ssize_t model_show(struct device *dev, struct device_attribute *attr,
  43. char *buf)
  44. {
  45. ide_drive_t *drive = to_ide_device(dev);
  46. return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_PROD]);
  47. }
  48. static DEVICE_ATTR_RO(model);
  49. static ssize_t firmware_show(struct device *dev, struct device_attribute *attr,
  50. char *buf)
  51. {
  52. ide_drive_t *drive = to_ide_device(dev);
  53. return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_FW_REV]);
  54. }
  55. static DEVICE_ATTR_RO(firmware);
  56. static ssize_t serial_show(struct device *dev, struct device_attribute *attr,
  57. char *buf)
  58. {
  59. ide_drive_t *drive = to_ide_device(dev);
  60. return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_SERNO]);
  61. }
  62. static DEVICE_ATTR(serial, 0400, serial_show, NULL);
  63. static DEVICE_ATTR(unload_heads, 0644, ide_park_show, ide_park_store);
  64. static struct attribute *ide_attrs[] = {
  65. &dev_attr_media.attr,
  66. &dev_attr_drivename.attr,
  67. &dev_attr_modalias.attr,
  68. &dev_attr_model.attr,
  69. &dev_attr_firmware.attr,
  70. &dev_attr_serial.attr,
  71. &dev_attr_unload_heads.attr,
  72. NULL,
  73. };
  74. static const struct attribute_group ide_attr_group = {
  75. .attrs = ide_attrs,
  76. };
  77. const struct attribute_group *ide_dev_groups[] = {
  78. &ide_attr_group,
  79. NULL,
  80. };
  81. static ssize_t store_delete_devices(struct device *portdev,
  82. struct device_attribute *attr,
  83. const char *buf, size_t n)
  84. {
  85. ide_hwif_t *hwif = dev_get_drvdata(portdev);
  86. if (strncmp(buf, "1", n))
  87. return -EINVAL;
  88. ide_port_unregister_devices(hwif);
  89. return n;
  90. };
  91. static DEVICE_ATTR(delete_devices, S_IWUSR, NULL, store_delete_devices);
  92. static ssize_t store_scan(struct device *portdev,
  93. struct device_attribute *attr,
  94. const char *buf, size_t n)
  95. {
  96. ide_hwif_t *hwif = dev_get_drvdata(portdev);
  97. if (strncmp(buf, "1", n))
  98. return -EINVAL;
  99. ide_port_unregister_devices(hwif);
  100. ide_port_scan(hwif);
  101. return n;
  102. };
  103. static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan);
  104. static struct device_attribute *ide_port_attrs[] = {
  105. &dev_attr_delete_devices,
  106. &dev_attr_scan,
  107. NULL
  108. };
  109. int ide_sysfs_register_port(ide_hwif_t *hwif)
  110. {
  111. int i, rc;
  112. for (i = 0; ide_port_attrs[i]; i++) {
  113. rc = device_create_file(hwif->portdev, ide_port_attrs[i]);
  114. if (rc)
  115. break;
  116. }
  117. return rc;
  118. }