diff options
Diffstat (limited to 'drivers/ide/ide-sysfs.c')
-rw-r--r-- | drivers/ide/ide-sysfs.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/drivers/ide/ide-sysfs.c b/drivers/ide/ide-sysfs.c new file mode 100644 index 000000000000..883ffacaf45a --- /dev/null +++ b/drivers/ide/ide-sysfs.c | |||
@@ -0,0 +1,125 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/ide.h> | ||
3 | |||
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 | |||
22 | static ssize_t media_show(struct device *dev, struct device_attribute *attr, | ||
23 | char *buf) | ||
24 | { | ||
25 | ide_drive_t *drive = to_ide_device(dev); | ||
26 | return sprintf(buf, "%s\n", ide_media_string(drive)); | ||
27 | } | ||
28 | |||
29 | static ssize_t drivename_show(struct device *dev, struct device_attribute *attr, | ||
30 | char *buf) | ||
31 | { | ||
32 | ide_drive_t *drive = to_ide_device(dev); | ||
33 | return sprintf(buf, "%s\n", drive->name); | ||
34 | } | ||
35 | |||
36 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | ||
37 | char *buf) | ||
38 | { | ||
39 | ide_drive_t *drive = to_ide_device(dev); | ||
40 | return sprintf(buf, "ide:m-%s\n", ide_media_string(drive)); | ||
41 | } | ||
42 | |||
43 | static ssize_t model_show(struct device *dev, struct device_attribute *attr, | ||
44 | char *buf) | ||
45 | { | ||
46 | ide_drive_t *drive = to_ide_device(dev); | ||
47 | return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_PROD]); | ||
48 | } | ||
49 | |||
50 | static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, | ||
51 | char *buf) | ||
52 | { | ||
53 | ide_drive_t *drive = to_ide_device(dev); | ||
54 | return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_FW_REV]); | ||
55 | } | ||
56 | |||
57 | static ssize_t serial_show(struct device *dev, struct device_attribute *attr, | ||
58 | char *buf) | ||
59 | { | ||
60 | ide_drive_t *drive = to_ide_device(dev); | ||
61 | return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_SERNO]); | ||
62 | } | ||
63 | |||
64 | struct device_attribute ide_dev_attrs[] = { | ||
65 | __ATTR_RO(media), | ||
66 | __ATTR_RO(drivename), | ||
67 | __ATTR_RO(modalias), | ||
68 | __ATTR_RO(model), | ||
69 | __ATTR_RO(firmware), | ||
70 | __ATTR(serial, 0400, serial_show, NULL), | ||
71 | __ATTR(unload_heads, 0644, ide_park_show, ide_park_store), | ||
72 | __ATTR_NULL | ||
73 | }; | ||
74 | |||
75 | static ssize_t store_delete_devices(struct device *portdev, | ||
76 | struct device_attribute *attr, | ||
77 | const char *buf, size_t n) | ||
78 | { | ||
79 | ide_hwif_t *hwif = dev_get_drvdata(portdev); | ||
80 | |||
81 | if (strncmp(buf, "1", n)) | ||
82 | return -EINVAL; | ||
83 | |||
84 | ide_port_unregister_devices(hwif); | ||
85 | |||
86 | return n; | ||
87 | }; | ||
88 | |||
89 | static DEVICE_ATTR(delete_devices, S_IWUSR, NULL, store_delete_devices); | ||
90 | |||
91 | static ssize_t store_scan(struct device *portdev, | ||
92 | struct device_attribute *attr, | ||
93 | const char *buf, size_t n) | ||
94 | { | ||
95 | ide_hwif_t *hwif = dev_get_drvdata(portdev); | ||
96 | |||
97 | if (strncmp(buf, "1", n)) | ||
98 | return -EINVAL; | ||
99 | |||
100 | ide_port_unregister_devices(hwif); | ||
101 | ide_port_scan(hwif); | ||
102 | |||
103 | return n; | ||
104 | }; | ||
105 | |||
106 | static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan); | ||
107 | |||
108 | static struct device_attribute *ide_port_attrs[] = { | ||
109 | &dev_attr_delete_devices, | ||
110 | &dev_attr_scan, | ||
111 | NULL | ||
112 | }; | ||
113 | |||
114 | int ide_sysfs_register_port(ide_hwif_t *hwif) | ||
115 | { | ||
116 | int i, uninitialized_var(rc); | ||
117 | |||
118 | for (i = 0; ide_port_attrs[i]; i++) { | ||
119 | rc = device_create_file(hwif->portdev, ide_port_attrs[i]); | ||
120 | if (rc) | ||
121 | break; | ||
122 | } | ||
123 | |||
124 | return rc; | ||
125 | } | ||