Commit 94fd0db7 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Greg Kroah-Hartman

[PATCH] Floppy: Add cmos attribute to floppy driver

Currently only a device 'fdX' shows up in sysfs; the other possible
device for this drive (like fd0h1440 etc) must be guessed from there.

This patch corrects the floppy driver to create a platform device for
each floppy found; each platform device also has an attribute 'cmos'
which represents the cmos type for this drive. From this attribute the
other possible device types can be computed.

From: Hannes Reinecke <hare@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 76d1ce00
...@@ -493,6 +493,8 @@ static struct floppy_struct user_params[N_DRIVE]; ...@@ -493,6 +493,8 @@ static struct floppy_struct user_params[N_DRIVE];
static sector_t floppy_sizes[256]; static sector_t floppy_sizes[256];
static char floppy_device_name[] = "floppy";
/* /*
* The driver is trying to determine the correct media format * The driver is trying to determine the correct media format
* while probing is set. rw_interrupt() clears it after a * while probing is set. rw_interrupt() clears it after a
...@@ -4191,18 +4193,25 @@ static int __init floppy_setup(char *str) ...@@ -4191,18 +4193,25 @@ static int __init floppy_setup(char *str)
static int have_no_fdc = -ENODEV; static int have_no_fdc = -ENODEV;
static ssize_t floppy_cmos_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct platform_device *p = container_of(dev,struct platform_device,dev);
int drive = p->id;
ssize_t retval;
retval = sprintf(buf,"%X\n", UDP->cmos);
return retval;
}
DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
static void floppy_device_release(struct device *dev) static void floppy_device_release(struct device *dev)
{ {
complete(&device_release); complete(&device_release);
} }
static struct platform_device floppy_device = { static struct platform_device floppy_device[N_DRIVE];
.name = "floppy",
.id = 0,
.dev = {
.release = floppy_device_release,
}
};
static struct kobject *floppy_find(dev_t dev, int *part, void *data) static struct kobject *floppy_find(dev_t dev, int *part, void *data)
{ {
...@@ -4370,20 +4379,26 @@ static int __init floppy_init(void) ...@@ -4370,20 +4379,26 @@ static int __init floppy_init(void)
goto out_flush_work; goto out_flush_work;
} }
err = platform_device_register(&floppy_device);
if (err)
goto out_flush_work;
for (drive = 0; drive < N_DRIVE; drive++) { for (drive = 0; drive < N_DRIVE; drive++) {
if (!(allowed_drive_mask & (1 << drive))) if (!(allowed_drive_mask & (1 << drive)))
continue; continue;
if (fdc_state[FDC(drive)].version == FDC_NONE) if (fdc_state[FDC(drive)].version == FDC_NONE)
continue; continue;
floppy_device[drive].name = floppy_device_name;
floppy_device[drive].id = drive;
floppy_device[drive].dev.release = floppy_device_release;
err = platform_device_register(&floppy_device[drive]);
if (err)
goto out_flush_work;
device_create_file(&floppy_device[drive].dev,&dev_attr_cmos);
/* to be cleaned up... */ /* to be cleaned up... */
disks[drive]->private_data = (void *)(long)drive; disks[drive]->private_data = (void *)(long)drive;
disks[drive]->queue = floppy_queue; disks[drive]->queue = floppy_queue;
disks[drive]->flags |= GENHD_FL_REMOVABLE; disks[drive]->flags |= GENHD_FL_REMOVABLE;
disks[drive]->driverfs_dev = &floppy_device.dev; disks[drive]->driverfs_dev = &floppy_device[drive].dev;
add_disk(disks[drive]); add_disk(disks[drive]);
} }
...@@ -4603,10 +4618,11 @@ void cleanup_module(void) ...@@ -4603,10 +4618,11 @@ void cleanup_module(void)
fdc_state[FDC(drive)].version != FDC_NONE) { fdc_state[FDC(drive)].version != FDC_NONE) {
del_gendisk(disks[drive]); del_gendisk(disks[drive]);
unregister_devfs_entries(drive); unregister_devfs_entries(drive);
device_remove_file(&floppy_device[drive].dev, &dev_attr_cmos);
platform_device_unregister(&floppy_device[drive]);
} }
put_disk(disks[drive]); put_disk(disks[drive]);
} }
platform_device_unregister(&floppy_device);
devfs_remove("floppy"); devfs_remove("floppy");
del_timer_sync(&fd_timeout); del_timer_sync(&fd_timeout);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment