X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=drivers%2Fblock%2Famiflop.c;h=5d6562171533ff31f226756ae025f4fe7a678be7;hb=dee6515b6d12188f4b9bbe76613371f7840a8a53;hp=cb2a545e57dcbcdb75258cea1888952fee5d4df5;hpb=a885c8c4316e1c1d2d2c8755da3f3d14f852528d;p=~andy%2Flinux diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index cb2a545e57d..5d656217153 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c @@ -64,6 +64,7 @@ #include #include #include +#include #include #include @@ -131,7 +132,7 @@ static struct fd_drive_type drive_types[] = { { FD_DD_5, "DD 5.25", 40, 2, 14716, 13630, 1, 40, 81, 6, 30, 2}, { FD_NODRIVE, "No Drive", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; -static int num_dr_types = sizeof(drive_types) / sizeof(drive_types[0]); +static int num_dr_types = ARRAY_SIZE(drive_types); static int amiga_read(int), dos_read(int); static void amiga_write(int), dos_write(int); @@ -194,6 +195,8 @@ static DECLARE_WAIT_QUEUE_HEAD(ms_wait); */ #define MAX_ERRORS 12 +#define custom amiga_custom + /* Prevent "aliased" accesses. */ static int fd_ref[4] = { 0,0,0,0 }; static int fd_device[4] = { 0, 0, 0, 0 }; @@ -206,7 +209,7 @@ static int fd_device[4] = { 0, 0, 0, 0 }; /* Milliseconds timer */ -static irqreturn_t ms_isr(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t ms_isr(int irq, void *dummy) { ms_busy = -1; wake_up(&ms_wait); @@ -557,7 +560,7 @@ static unsigned long fd_get_drive_id(int drive) return (id); } -static irqreturn_t fd_block_done(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t fd_block_done(int irq, void *dummy) { if (block_flag) custom.dsklen = 0x4000; @@ -1439,6 +1442,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, { int drive = iminor(inode) & 3; static struct floppy_struct getprm; + void __user *argp = (void __user *)param; switch(cmd){ case FDFMTBEG: @@ -1484,9 +1488,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, getprm.head=unit[drive].type->heads; getprm.sect=unit[drive].dtype->sects * unit[drive].type->sect_mult; getprm.size=unit[drive].blocks; - if (copy_to_user((void *)param, - (void *)&getprm, - sizeof(struct floppy_struct))) + if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct))) return -EFAULT; break; case FDSETPRM: @@ -1498,8 +1500,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, break; #ifdef RAW_IOCTL case IOCTL_RAW_TRACK: - if (copy_to_user((void *)param, raw_buf, - unit[drive].type->read_size)) + if (copy_to_user(argp, raw_buf, unit[drive].type->read_size)) return -EFAULT; else return unit[drive].type->read_size; @@ -1654,12 +1655,6 @@ static struct block_device_operations floppy_fops = { .media_changed = amiga_floppy_change, }; -void __init amiga_floppy_setup (char *str, int *ints) -{ - printk (KERN_INFO "amiflop: Setting default df0 to %x\n", ints[1]); - fd_def_df0 = ints[1]; -} - static int __init fd_probe_drives(void) { int drive,drives,nomem; @@ -1714,10 +1709,13 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data) return get_disk(unit[drive].gendisk); } -int __init amiga_floppy_init(void) +static int __init amiga_floppy_init(void) { int i, ret; + if (!MACH_IS_AMIGA) + return -ENXIO; + if (!AMIGAHW_PRESENT(AMI_FLOPPY)) return -ENXIO; @@ -1814,15 +1812,9 @@ out_blkdev: return ret; } +module_init(amiga_floppy_init); #ifdef MODULE -int init_module(void) -{ - if (!MACH_IS_AMIGA) - return -ENXIO; - return amiga_floppy_init(); -} - #if 0 /* not safe to unload */ void cleanup_module(void) { @@ -1845,4 +1837,19 @@ void cleanup_module(void) unregister_blkdev(FLOPPY_MAJOR, "fd"); } #endif + +#else +static int __init amiga_floppy_setup (char *str) +{ + int n; + if (!MACH_IS_AMIGA) + return 0; + if (!get_option(&str, &n)) + return 0; + printk (KERN_INFO "amiflop: Setting default df0 to %x\n", n); + fd_def_df0 = n; + return 1; +} + +__setup("floppy=", amiga_floppy_setup); #endif