diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/bsr.c | 2 | ||||
-rw-r--r-- | drivers/char/hpet.c | 22 | ||||
-rw-r--r-- | drivers/char/hw_random/timeriomem-rng.c | 39 | ||||
-rw-r--r-- | drivers/char/random.c | 3 | ||||
-rw-r--r-- | drivers/char/synclink_gt.c | 58 | ||||
-rw-r--r-- | drivers/char/tty_audit.c | 2 | ||||
-rw-r--r-- | drivers/char/tty_io.c | 6 | ||||
-rw-r--r-- | drivers/char/tty_ldisc.c | 1 |
8 files changed, 100 insertions, 33 deletions
diff --git a/drivers/char/bsr.c b/drivers/char/bsr.c index f6094ae0ef33..140ea10ecb88 100644 --- a/drivers/char/bsr.c +++ b/drivers/char/bsr.c | |||
@@ -140,7 +140,7 @@ static int bsr_open(struct inode * inode, struct file * filp) | |||
140 | return 0; | 140 | return 0; |
141 | } | 141 | } |
142 | 142 | ||
143 | const static struct file_operations bsr_fops = { | 143 | static const struct file_operations bsr_fops = { |
144 | .owner = THIS_MODULE, | 144 | .owner = THIS_MODULE, |
145 | .mmap = bsr_mmap, | 145 | .mmap = bsr_mmap, |
146 | .open = bsr_open, | 146 | .open = bsr_open, |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 32b8bbf5003e..50dfa3bc71ce 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -713,7 +713,7 @@ static struct ctl_table_header *sysctl_header; | |||
713 | */ | 713 | */ |
714 | #define TICK_CALIBRATE (1000UL) | 714 | #define TICK_CALIBRATE (1000UL) |
715 | 715 | ||
716 | static unsigned long hpet_calibrate(struct hpets *hpetp) | 716 | static unsigned long __hpet_calibrate(struct hpets *hpetp) |
717 | { | 717 | { |
718 | struct hpet_timer __iomem *timer = NULL; | 718 | struct hpet_timer __iomem *timer = NULL; |
719 | unsigned long t, m, count, i, flags, start; | 719 | unsigned long t, m, count, i, flags, start; |
@@ -750,6 +750,26 @@ static unsigned long hpet_calibrate(struct hpets *hpetp) | |||
750 | return (m - start) / i; | 750 | return (m - start) / i; |
751 | } | 751 | } |
752 | 752 | ||
753 | static unsigned long hpet_calibrate(struct hpets *hpetp) | ||
754 | { | ||
755 | unsigned long ret = -1; | ||
756 | unsigned long tmp; | ||
757 | |||
758 | /* | ||
759 | * Try to calibrate until return value becomes stable small value. | ||
760 | * If SMI interruption occurs in calibration loop, the return value | ||
761 | * will be big. This avoids its impact. | ||
762 | */ | ||
763 | for ( ; ; ) { | ||
764 | tmp = __hpet_calibrate(hpetp); | ||
765 | if (ret <= tmp) | ||
766 | break; | ||
767 | ret = tmp; | ||
768 | } | ||
769 | |||
770 | return ret; | ||
771 | } | ||
772 | |||
753 | int hpet_alloc(struct hpet_data *hdp) | 773 | int hpet_alloc(struct hpet_data *hdp) |
754 | { | 774 | { |
755 | u64 cap, mcfg; | 775 | u64 cap, mcfg; |
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c index 10ad41be5897..dcd352ad0e7f 100644 --- a/drivers/char/hw_random/timeriomem-rng.c +++ b/drivers/char/hw_random/timeriomem-rng.c | |||
@@ -90,10 +90,30 @@ static struct hwrng timeriomem_rng_ops = { | |||
90 | 90 | ||
91 | static int __init timeriomem_rng_probe(struct platform_device *pdev) | 91 | static int __init timeriomem_rng_probe(struct platform_device *pdev) |
92 | { | 92 | { |
93 | struct resource *res, *mem; | ||
93 | int ret; | 94 | int ret; |
94 | 95 | ||
96 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
97 | |||
98 | if (!res) | ||
99 | return -ENOENT; | ||
100 | |||
101 | mem = request_mem_region(res->start, res->end - res->start + 1, | ||
102 | pdev->name); | ||
103 | if (mem == NULL) | ||
104 | return -EBUSY; | ||
105 | |||
106 | dev_set_drvdata(&pdev->dev, mem); | ||
107 | |||
95 | timeriomem_rng_data = pdev->dev.platform_data; | 108 | timeriomem_rng_data = pdev->dev.platform_data; |
96 | 109 | ||
110 | timeriomem_rng_data->address = ioremap(res->start, | ||
111 | res->end - res->start + 1); | ||
112 | if (!timeriomem_rng_data->address) { | ||
113 | ret = -ENOMEM; | ||
114 | goto err_ioremap; | ||
115 | } | ||
116 | |||
97 | if (timeriomem_rng_data->period != 0 | 117 | if (timeriomem_rng_data->period != 0 |
98 | && usecs_to_jiffies(timeriomem_rng_data->period) > 0) { | 118 | && usecs_to_jiffies(timeriomem_rng_data->period) > 0) { |
99 | timeriomem_rng_timer.expires = jiffies; | 119 | timeriomem_rng_timer.expires = jiffies; |
@@ -104,23 +124,34 @@ static int __init timeriomem_rng_probe(struct platform_device *pdev) | |||
104 | timeriomem_rng_data->present = 1; | 124 | timeriomem_rng_data->present = 1; |
105 | 125 | ||
106 | ret = hwrng_register(&timeriomem_rng_ops); | 126 | ret = hwrng_register(&timeriomem_rng_ops); |
107 | if (ret) { | 127 | if (ret) |
108 | dev_err(&pdev->dev, "problem registering\n"); | 128 | goto err_register; |
109 | return ret; | ||
110 | } | ||
111 | 129 | ||
112 | dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", | 130 | dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", |
113 | timeriomem_rng_data->address, | 131 | timeriomem_rng_data->address, |
114 | timeriomem_rng_data->period); | 132 | timeriomem_rng_data->period); |
115 | 133 | ||
116 | return 0; | 134 | return 0; |
135 | |||
136 | err_register: | ||
137 | dev_err(&pdev->dev, "problem registering\n"); | ||
138 | iounmap(timeriomem_rng_data->address); | ||
139 | err_ioremap: | ||
140 | release_resource(mem); | ||
141 | |||
142 | return ret; | ||
117 | } | 143 | } |
118 | 144 | ||
119 | static int __devexit timeriomem_rng_remove(struct platform_device *pdev) | 145 | static int __devexit timeriomem_rng_remove(struct platform_device *pdev) |
120 | { | 146 | { |
147 | struct resource *mem = dev_get_drvdata(&pdev->dev); | ||
148 | |||
121 | del_timer_sync(&timeriomem_rng_timer); | 149 | del_timer_sync(&timeriomem_rng_timer); |
122 | hwrng_unregister(&timeriomem_rng_ops); | 150 | hwrng_unregister(&timeriomem_rng_ops); |
123 | 151 | ||
152 | iounmap(timeriomem_rng_data->address); | ||
153 | release_resource(mem); | ||
154 | |||
124 | return 0; | 155 | return 0; |
125 | } | 156 | } |
126 | 157 | ||
diff --git a/drivers/char/random.c b/drivers/char/random.c index 7c43ae782b26..f824ef8a9273 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -1488,7 +1488,8 @@ static void rekey_seq_generator(struct work_struct *work) | |||
1488 | keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; | 1488 | keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; |
1489 | smp_wmb(); | 1489 | smp_wmb(); |
1490 | ip_cnt++; | 1490 | ip_cnt++; |
1491 | schedule_delayed_work(&rekey_work, REKEY_INTERVAL); | 1491 | schedule_delayed_work(&rekey_work, |
1492 | round_jiffies_relative(REKEY_INTERVAL)); | ||
1492 | } | 1493 | } |
1493 | 1494 | ||
1494 | static inline struct keydata *get_keyptr(void) | 1495 | static inline struct keydata *get_keyptr(void) |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 6ec6e13d47d7..5e256494686a 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
@@ -298,6 +298,7 @@ struct slgt_info { | |||
298 | 298 | ||
299 | unsigned int rbuf_fill_level; | 299 | unsigned int rbuf_fill_level; |
300 | unsigned int if_mode; | 300 | unsigned int if_mode; |
301 | unsigned int base_clock; | ||
301 | 302 | ||
302 | /* device status */ | 303 | /* device status */ |
303 | 304 | ||
@@ -1156,22 +1157,26 @@ static long set_params32(struct slgt_info *info, struct MGSL_PARAMS32 __user *ne | |||
1156 | return -EFAULT; | 1157 | return -EFAULT; |
1157 | 1158 | ||
1158 | spin_lock(&info->lock); | 1159 | spin_lock(&info->lock); |
1159 | info->params.mode = tmp_params.mode; | 1160 | if (tmp_params.mode == MGSL_MODE_BASE_CLOCK) { |
1160 | info->params.loopback = tmp_params.loopback; | 1161 | info->base_clock = tmp_params.clock_speed; |
1161 | info->params.flags = tmp_params.flags; | 1162 | } else { |
1162 | info->params.encoding = tmp_params.encoding; | 1163 | info->params.mode = tmp_params.mode; |
1163 | info->params.clock_speed = tmp_params.clock_speed; | 1164 | info->params.loopback = tmp_params.loopback; |
1164 | info->params.addr_filter = tmp_params.addr_filter; | 1165 | info->params.flags = tmp_params.flags; |
1165 | info->params.crc_type = tmp_params.crc_type; | 1166 | info->params.encoding = tmp_params.encoding; |
1166 | info->params.preamble_length = tmp_params.preamble_length; | 1167 | info->params.clock_speed = tmp_params.clock_speed; |
1167 | info->params.preamble = tmp_params.preamble; | 1168 | info->params.addr_filter = tmp_params.addr_filter; |
1168 | info->params.data_rate = tmp_params.data_rate; | 1169 | info->params.crc_type = tmp_params.crc_type; |
1169 | info->params.data_bits = tmp_params.data_bits; | 1170 | info->params.preamble_length = tmp_params.preamble_length; |
1170 | info->params.stop_bits = tmp_params.stop_bits; | 1171 | info->params.preamble = tmp_params.preamble; |
1171 | info->params.parity = tmp_params.parity; | 1172 | info->params.data_rate = tmp_params.data_rate; |
1173 | info->params.data_bits = tmp_params.data_bits; | ||
1174 | info->params.stop_bits = tmp_params.stop_bits; | ||
1175 | info->params.parity = tmp_params.parity; | ||
1176 | } | ||
1172 | spin_unlock(&info->lock); | 1177 | spin_unlock(&info->lock); |
1173 | 1178 | ||
1174 | change_params(info); | 1179 | program_hw(info); |
1175 | 1180 | ||
1176 | return 0; | 1181 | return 0; |
1177 | } | 1182 | } |
@@ -2559,10 +2564,13 @@ static int set_params(struct slgt_info *info, MGSL_PARAMS __user *new_params) | |||
2559 | return -EFAULT; | 2564 | return -EFAULT; |
2560 | 2565 | ||
2561 | spin_lock_irqsave(&info->lock, flags); | 2566 | spin_lock_irqsave(&info->lock, flags); |
2562 | memcpy(&info->params, &tmp_params, sizeof(MGSL_PARAMS)); | 2567 | if (tmp_params.mode == MGSL_MODE_BASE_CLOCK) |
2568 | info->base_clock = tmp_params.clock_speed; | ||
2569 | else | ||
2570 | memcpy(&info->params, &tmp_params, sizeof(MGSL_PARAMS)); | ||
2563 | spin_unlock_irqrestore(&info->lock, flags); | 2571 | spin_unlock_irqrestore(&info->lock, flags); |
2564 | 2572 | ||
2565 | change_params(info); | 2573 | program_hw(info); |
2566 | 2574 | ||
2567 | return 0; | 2575 | return 0; |
2568 | } | 2576 | } |
@@ -3432,6 +3440,7 @@ static struct slgt_info *alloc_dev(int adapter_num, int port_num, struct pci_dev | |||
3432 | info->magic = MGSL_MAGIC; | 3440 | info->magic = MGSL_MAGIC; |
3433 | INIT_WORK(&info->task, bh_handler); | 3441 | INIT_WORK(&info->task, bh_handler); |
3434 | info->max_frame_size = 4096; | 3442 | info->max_frame_size = 4096; |
3443 | info->base_clock = 14745600; | ||
3435 | info->rbuf_fill_level = DMABUFSIZE; | 3444 | info->rbuf_fill_level = DMABUFSIZE; |
3436 | info->port.close_delay = 5*HZ/10; | 3445 | info->port.close_delay = 5*HZ/10; |
3437 | info->port.closing_wait = 30*HZ; | 3446 | info->port.closing_wait = 30*HZ; |
@@ -3779,7 +3788,7 @@ static void enable_loopback(struct slgt_info *info) | |||
3779 | static void set_rate(struct slgt_info *info, u32 rate) | 3788 | static void set_rate(struct slgt_info *info, u32 rate) |
3780 | { | 3789 | { |
3781 | unsigned int div; | 3790 | unsigned int div; |
3782 | static unsigned int osc = 14745600; | 3791 | unsigned int osc = info->base_clock; |
3783 | 3792 | ||
3784 | /* div = osc/rate - 1 | 3793 | /* div = osc/rate - 1 |
3785 | * | 3794 | * |
@@ -4083,18 +4092,27 @@ static void async_mode(struct slgt_info *info) | |||
4083 | * 06 CTS IRQ enable | 4092 | * 06 CTS IRQ enable |
4084 | * 05 DCD IRQ enable | 4093 | * 05 DCD IRQ enable |
4085 | * 04 RI IRQ enable | 4094 | * 04 RI IRQ enable |
4086 | * 03 reserved, must be zero | 4095 | * 03 0=16x sampling, 1=8x sampling |
4087 | * 02 1=txd->rxd internal loopback enable | 4096 | * 02 1=txd->rxd internal loopback enable |
4088 | * 01 reserved, must be zero | 4097 | * 01 reserved, must be zero |
4089 | * 00 1=master IRQ enable | 4098 | * 00 1=master IRQ enable |
4090 | */ | 4099 | */ |
4091 | val = BIT15 + BIT14 + BIT0; | 4100 | val = BIT15 + BIT14 + BIT0; |
4101 | /* JCR[8] : 1 = x8 async mode feature available */ | ||
4102 | if ((rd_reg32(info, JCR) & BIT8) && info->params.data_rate && | ||
4103 | ((info->base_clock < (info->params.data_rate * 16)) || | ||
4104 | (info->base_clock % (info->params.data_rate * 16)))) { | ||
4105 | /* use 8x sampling */ | ||
4106 | val |= BIT3; | ||
4107 | set_rate(info, info->params.data_rate * 8); | ||
4108 | } else { | ||
4109 | /* use 16x sampling */ | ||
4110 | set_rate(info, info->params.data_rate * 16); | ||
4111 | } | ||
4092 | wr_reg16(info, SCR, val); | 4112 | wr_reg16(info, SCR, val); |
4093 | 4113 | ||
4094 | slgt_irq_on(info, IRQ_RXBREAK | IRQ_RXOVER); | 4114 | slgt_irq_on(info, IRQ_RXBREAK | IRQ_RXOVER); |
4095 | 4115 | ||
4096 | set_rate(info, info->params.data_rate * 16); | ||
4097 | |||
4098 | if (info->params.loopback) | 4116 | if (info->params.loopback) |
4099 | enable_loopback(info); | 4117 | enable_loopback(info); |
4100 | } | 4118 | } |
diff --git a/drivers/char/tty_audit.c b/drivers/char/tty_audit.c index 34ab6d798f81..55ba6f142883 100644 --- a/drivers/char/tty_audit.c +++ b/drivers/char/tty_audit.c | |||
@@ -10,8 +10,6 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/audit.h> | 12 | #include <linux/audit.h> |
13 | #include <linux/file.h> | ||
14 | #include <linux/fdtable.h> | ||
15 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
16 | 14 | ||
17 | struct tty_audit_buf { | 15 | struct tty_audit_buf { |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 33dac94922a7..66b99a2049e3 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1758,7 +1758,7 @@ static int __tty_open(struct inode *inode, struct file *filp) | |||
1758 | struct tty_driver *driver; | 1758 | struct tty_driver *driver; |
1759 | int index; | 1759 | int index; |
1760 | dev_t device = inode->i_rdev; | 1760 | dev_t device = inode->i_rdev; |
1761 | unsigned short saved_flags = filp->f_flags; | 1761 | unsigned saved_flags = filp->f_flags; |
1762 | 1762 | ||
1763 | nonseekable_open(inode, filp); | 1763 | nonseekable_open(inode, filp); |
1764 | 1764 | ||
@@ -2681,7 +2681,7 @@ void __do_SAK(struct tty_struct *tty) | |||
2681 | /* Kill the entire session */ | 2681 | /* Kill the entire session */ |
2682 | do_each_pid_task(session, PIDTYPE_SID, p) { | 2682 | do_each_pid_task(session, PIDTYPE_SID, p) { |
2683 | printk(KERN_NOTICE "SAK: killed process %d" | 2683 | printk(KERN_NOTICE "SAK: killed process %d" |
2684 | " (%s): task_session_nr(p)==tty->session\n", | 2684 | " (%s): task_session(p)==tty->session\n", |
2685 | task_pid_nr(p), p->comm); | 2685 | task_pid_nr(p), p->comm); |
2686 | send_sig(SIGKILL, p, 1); | 2686 | send_sig(SIGKILL, p, 1); |
2687 | } while_each_pid_task(session, PIDTYPE_SID, p); | 2687 | } while_each_pid_task(session, PIDTYPE_SID, p); |
@@ -2691,7 +2691,7 @@ void __do_SAK(struct tty_struct *tty) | |||
2691 | do_each_thread(g, p) { | 2691 | do_each_thread(g, p) { |
2692 | if (p->signal->tty == tty) { | 2692 | if (p->signal->tty == tty) { |
2693 | printk(KERN_NOTICE "SAK: killed process %d" | 2693 | printk(KERN_NOTICE "SAK: killed process %d" |
2694 | " (%s): task_session_nr(p)==tty->session\n", | 2694 | " (%s): task_session(p)==tty->session\n", |
2695 | task_pid_nr(p), p->comm); | 2695 | task_pid_nr(p), p->comm); |
2696 | send_sig(SIGKILL, p, 1); | 2696 | send_sig(SIGKILL, p, 1); |
2697 | continue; | 2697 | continue; |
diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c index 7a84b406a952..f78f5b0127a8 100644 --- a/drivers/char/tty_ldisc.c +++ b/drivers/char/tty_ldisc.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/tty_flip.h> | 10 | #include <linux/tty_flip.h> |
11 | #include <linux/devpts_fs.h> | 11 | #include <linux/devpts_fs.h> |
12 | #include <linux/file.h> | 12 | #include <linux/file.h> |
13 | #include <linux/fdtable.h> | ||
14 | #include <linux/console.h> | 13 | #include <linux/console.h> |
15 | #include <linux/timer.h> | 14 | #include <linux/timer.h> |
16 | #include <linux/ctype.h> | 15 | #include <linux/ctype.h> |