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