X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fsbus%2Fchar%2Fbpp.c;h=ac7d1258efee13610244b8e7a81feaf4a0348c7f;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=95d403c559a7b5cf06b3a2b59f27f27d5eac4adb;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index 95d403c55..ac7d1258e 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -79,17 +78,13 @@ struct inst { unsigned char run_length; unsigned char repeat_byte; - - /* These members manage timeouts for programmed delays */ - wait_queue_head_t wait_queue; - struct timer_list timer_list; }; static struct inst instances[BPP_NO]; #if defined(__i386__) -const unsigned short base_addrs[BPP_NO] = { 0x278, 0x378, 0x3bc }; +static const unsigned short base_addrs[BPP_NO] = { 0x278, 0x378, 0x3bc }; /* * These are for data access. @@ -246,7 +241,7 @@ static unsigned short get_pins(unsigned minor) #define P_ERR_IRP 0x0002 /* RW1 1= rising edge */ #define P_ERR_IRQ_EN 0x0001 /* RW */ -unsigned long base_addrs[BPP_NO]; +static void __iomem *base_addrs[BPP_NO]; #define bpp_outb_p(data, base) sbus_writeb(data, (base) + BPP_DR) #define bpp_inb_p(base) sbus_readb((base) + BPP_DR) @@ -254,7 +249,7 @@ unsigned long base_addrs[BPP_NO]; static void set_pins(unsigned short pins, unsigned minor) { - unsigned long base = base_addrs[minor]; + void __iomem *base = base_addrs[minor]; unsigned char bits_tcr = 0, bits_or = 0; if (instances[minor].direction & 0x20) bits_tcr |= P_TCR_DIR; @@ -275,7 +270,7 @@ static void set_pins(unsigned short pins, unsigned minor) */ static unsigned short get_pins(unsigned minor) { - unsigned long base = base_addrs[minor]; + void __iomem *base = base_addrs[minor]; unsigned short bits = 0; unsigned value_tcr = sbus_readb(base + BPP_TCR); unsigned value_ir = sbus_readb(base + BPP_IR); @@ -297,16 +292,9 @@ static unsigned short get_pins(unsigned minor) #endif /* __sparc__ */ -static void bpp_wake_up(unsigned long val) -{ wake_up(&instances[val].wait_queue); } - static void snooze(unsigned long snooze_time, unsigned minor) { - init_timer(&instances[minor].timer_list); - instances[minor].timer_list.expires = jiffies + snooze_time + 1; - instances[minor].timer_list.data = minor; - add_timer(&instances[minor].timer_list); - sleep_on (&instances[minor].wait_queue); + schedule_timeout_uninterruptible(snooze_time + 1); } static int wait_for(unsigned short set, unsigned short clr, @@ -432,7 +420,7 @@ static int terminate(unsigned minor) return 0; } -static spinlock_t bpp_open_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(bpp_open_lock); /* * Allow only one process to open the device at a time. @@ -482,7 +470,7 @@ static int bpp_release(struct inode *inode, struct file *f) return 0; } -static long read_nibble(unsigned minor, char *c, unsigned long cnt) +static long read_nibble(unsigned minor, char __user *c, unsigned long cnt) { unsigned long remaining = cnt; long rc; @@ -535,7 +523,7 @@ static long read_nibble(unsigned minor, char *c, unsigned long cnt) return cnt - remaining; } -static long read_ecp(unsigned minor, char *c, unsigned long cnt) +static long read_ecp(unsigned minor, char __user *c, unsigned long cnt) { unsigned long remaining; long rc; @@ -630,10 +618,10 @@ static long read_ecp(unsigned minor, char *c, unsigned long cnt) return cnt - remaining; } -static ssize_t bpp_read(struct file *f, char *c, size_t cnt, loff_t * ppos) +static ssize_t bpp_read(struct file *f, char __user *c, size_t cnt, loff_t * ppos) { long rc; - unsigned minor = iminor(f->f_dentry->d_inode); + unsigned minor = iminor(f->f_path.dentry->d_inode); if (minor >= BPP_NO) return -ENODEV; if (!instances[minor].present) return -ENODEV; @@ -692,7 +680,7 @@ static ssize_t bpp_read(struct file *f, char *c, size_t cnt, loff_t * ppos) * Compatibility mode handshaking is a matter of writing data, * strobing it, and waiting for the printer to stop being busy. */ -static long write_compat(unsigned minor, const char *c, unsigned long cnt) +static long write_compat(unsigned minor, const char __user *c, unsigned long cnt) { long rc; unsigned short pins = get_pins(minor); @@ -730,7 +718,7 @@ static long write_compat(unsigned minor, const char *c, unsigned long cnt) * Write data using ECP mode. Watch out that the port may be set up * for reading. If so, turn the port around. */ -static long write_ecp(unsigned minor, const char *c, unsigned long cnt) +static long write_ecp(unsigned minor, const char __user *c, unsigned long cnt) { unsigned short pins = get_pins(minor); unsigned long remaining = cnt; @@ -783,10 +771,10 @@ static long write_ecp(unsigned minor, const char *c, unsigned long cnt) * that. Otherwise, terminate and do my writing in compat mode. This * is the safest course as any device can handle it. */ -static ssize_t bpp_write(struct file *f, const char *c, size_t cnt, loff_t * ppos) +static ssize_t bpp_write(struct file *f, const char __user *c, size_t cnt, loff_t * ppos) { long errno = 0; - unsigned minor = iminor(f->f_dentry->d_inode); + unsigned minor = iminor(f->f_path.dentry->d_inode); if (minor >= BPP_NO) return -ENODEV; if (!instances[minor].present) return -ENODEV; @@ -880,11 +868,8 @@ static void probeLptPort(unsigned idx) instances[idx].enhanced = 0; instances[idx].direction = 0; instances[idx].mode = COMPATIBILITY; - instances[idx].wait_queue = 0; instances[idx].run_length = 0; instances[idx].run_flag = 0; - init_timer(&instances[idx].timer_list); - instances[idx].timer_list.function = bpp_wake_up; if (!request_region(lpAddr,3, dev_name)) return; /* @@ -940,7 +925,7 @@ static inline void freeLptPort(int idx) #if defined(__sparc__) -static unsigned long map_bpp(struct sbus_dev *dev, int idx) +static void __iomem *map_bpp(struct sbus_dev *dev, int idx) { return sbus_ioremap(&dev->resource[0], 0, BPP_SIZE, "bpp"); } @@ -969,7 +954,7 @@ static int collectLptPorts(void) static void probeLptPort(unsigned idx) { - unsigned long rp = base_addrs[idx]; + void __iomem *rp = base_addrs[idx]; __u32 csr; char *brand; @@ -977,13 +962,10 @@ static void probeLptPort(unsigned idx) instances[idx].enhanced = 0; instances[idx].direction = 0; instances[idx].mode = COMPATIBILITY; - init_waitqueue_head(&instances[idx].wait_queue); instances[idx].run_length = 0; instances[idx].run_flag = 0; - init_timer(&instances[idx].timer_list); - instances[idx].timer_list.function = bpp_wake_up; - if (rp == 0) return; + if (!rp) return; instances[idx].present = 1; instances[idx].enhanced = 1; /* Sure */ @@ -1014,7 +996,7 @@ static void probeLptPort(unsigned idx) default: brand = "Unknown"; } - printk("bpp%d: %s at 0x%lx\n", idx, brand, rp); + printk("bpp%d: %s at %p\n", idx, brand, rp); /* * Leave the port in compat idle mode. @@ -1048,11 +1030,6 @@ static int __init bpp_init(void) instances[idx].opened = 0; probeLptPort(idx); } - devfs_mk_dir("bpp"); - for (idx = 0; idx < BPP_NO; idx++) { - devfs_mk_cdev(MKDEV(BPP_MAJOR, idx), - S_IFCHR | S_IRUSR | S_IWUSR, "bpp/%d", idx); - } return 0; } @@ -1061,9 +1038,6 @@ static void __exit bpp_cleanup(void) { unsigned idx; - for (idx = 0; idx < BPP_NO; idx++) - devfs_remove("bpp/%d", idx); - devfs_remove("bpp"); unregister_chrdev(BPP_MAJOR, dev_name); for (idx = 0; idx < BPP_NO; idx++) {