diff options
Diffstat (limited to 'drivers/char')
| -rw-r--r-- | drivers/char/nsc_gpio.c | 6 | ||||
| -rw-r--r-- | drivers/char/pc8736x_gpio.c | 15 | ||||
| -rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 14 | ||||
| -rw-r--r-- | drivers/char/scx200_gpio.c | 72 | ||||
| -rw-r--r-- | drivers/char/synclink.c | 14 | ||||
| -rw-r--r-- | drivers/char/synclink_gt.c | 14 | ||||
| -rw-r--r-- | drivers/char/synclinkmp.c | 14 | ||||
| -rw-r--r-- | drivers/char/tpm/tpm.c | 1 | ||||
| -rw-r--r-- | drivers/char/tpm/tpm_tis.c | 77 |
9 files changed, 136 insertions, 91 deletions
diff --git a/drivers/char/nsc_gpio.c b/drivers/char/nsc_gpio.c index 5b91e4e25641..7719bd75810b 100644 --- a/drivers/char/nsc_gpio.c +++ b/drivers/char/nsc_gpio.c | |||
| @@ -68,13 +68,11 @@ ssize_t nsc_gpio_write(struct file *file, const char __user *data, | |||
| 68 | amp->gpio_config(m, ~1, 0); | 68 | amp->gpio_config(m, ~1, 0); |
| 69 | break; | 69 | break; |
| 70 | case 'T': | 70 | case 'T': |
| 71 | dev_dbg(dev, "GPIO%d output is push pull\n", | 71 | dev_dbg(dev, "GPIO%d output is push pull\n", m); |
| 72 | m); | ||
| 73 | amp->gpio_config(m, ~2, 2); | 72 | amp->gpio_config(m, ~2, 2); |
| 74 | break; | 73 | break; |
| 75 | case 't': | 74 | case 't': |
| 76 | dev_dbg(dev, "GPIO%d output is open drain\n", | 75 | dev_dbg(dev, "GPIO%d output is open drain\n", m); |
| 77 | m); | ||
| 78 | amp->gpio_config(m, ~2, 0); | 76 | amp->gpio_config(m, ~2, 0); |
| 79 | break; | 77 | break; |
| 80 | case 'P': | 78 | case 'P': |
diff --git a/drivers/char/pc8736x_gpio.c b/drivers/char/pc8736x_gpio.c index 11bd78c80628..645eb81cb5a9 100644 --- a/drivers/char/pc8736x_gpio.c +++ b/drivers/char/pc8736x_gpio.c | |||
| @@ -212,22 +212,21 @@ static void pc8736x_gpio_change(unsigned index) | |||
| 212 | pc8736x_gpio_set(index, !pc8736x_gpio_current(index)); | 212 | pc8736x_gpio_set(index, !pc8736x_gpio_current(index)); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | static struct nsc_gpio_ops pc8736x_access = { | 215 | static struct nsc_gpio_ops pc8736x_gpio_ops = { |
| 216 | .owner = THIS_MODULE, | 216 | .owner = THIS_MODULE, |
| 217 | .gpio_config = pc8736x_gpio_configure, | 217 | .gpio_config = pc8736x_gpio_configure, |
| 218 | .gpio_dump = nsc_gpio_dump, | 218 | .gpio_dump = nsc_gpio_dump, |
| 219 | .gpio_get = pc8736x_gpio_get, | 219 | .gpio_get = pc8736x_gpio_get, |
| 220 | .gpio_set = pc8736x_gpio_set, | 220 | .gpio_set = pc8736x_gpio_set, |
| 221 | .gpio_set_high = pc8736x_gpio_set_high, | ||
| 222 | .gpio_set_low = pc8736x_gpio_set_low, | ||
| 223 | .gpio_change = pc8736x_gpio_change, | 221 | .gpio_change = pc8736x_gpio_change, |
| 224 | .gpio_current = pc8736x_gpio_current | 222 | .gpio_current = pc8736x_gpio_current |
| 225 | }; | 223 | }; |
| 224 | EXPORT_SYMBOL(pc8736x_gpio_ops); | ||
| 226 | 225 | ||
| 227 | static int pc8736x_gpio_open(struct inode *inode, struct file *file) | 226 | static int pc8736x_gpio_open(struct inode *inode, struct file *file) |
| 228 | { | 227 | { |
| 229 | unsigned m = iminor(inode); | 228 | unsigned m = iminor(inode); |
| 230 | file->private_data = &pc8736x_access; | 229 | file->private_data = &pc8736x_gpio_ops; |
| 231 | 230 | ||
| 232 | dev_dbg(&pdev->dev, "open %d\n", m); | 231 | dev_dbg(&pdev->dev, "open %d\n", m); |
| 233 | 232 | ||
| @@ -236,7 +235,7 @@ static int pc8736x_gpio_open(struct inode *inode, struct file *file) | |||
| 236 | return nonseekable_open(inode, file); | 235 | return nonseekable_open(inode, file); |
| 237 | } | 236 | } |
| 238 | 237 | ||
| 239 | static const struct file_operations pc8736x_gpio_fops = { | 238 | static const struct file_operations pc8736x_gpio_fileops = { |
| 240 | .owner = THIS_MODULE, | 239 | .owner = THIS_MODULE, |
| 241 | .open = pc8736x_gpio_open, | 240 | .open = pc8736x_gpio_open, |
| 242 | .write = nsc_gpio_write, | 241 | .write = nsc_gpio_write, |
| @@ -278,7 +277,7 @@ static int __init pc8736x_gpio_init(void) | |||
| 278 | dev_err(&pdev->dev, "no device found\n"); | 277 | dev_err(&pdev->dev, "no device found\n"); |
| 279 | goto undo_platform_dev_add; | 278 | goto undo_platform_dev_add; |
| 280 | } | 279 | } |
| 281 | pc8736x_access.dev = &pdev->dev; | 280 | pc8736x_gpio_ops.dev = &pdev->dev; |
| 282 | 281 | ||
| 283 | /* Verify that chip and it's GPIO unit are both enabled. | 282 | /* Verify that chip and it's GPIO unit are both enabled. |
| 284 | My BIOS does this, so I take minimum action here | 283 | My BIOS does this, so I take minimum action here |
| @@ -328,7 +327,7 @@ static int __init pc8736x_gpio_init(void) | |||
| 328 | pc8736x_init_shadow(); | 327 | pc8736x_init_shadow(); |
| 329 | 328 | ||
| 330 | /* ignore minor errs, and succeed */ | 329 | /* ignore minor errs, and succeed */ |
| 331 | cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fops); | 330 | cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fileops); |
| 332 | cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT); | 331 | cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT); |
| 333 | 332 | ||
| 334 | return 0; | 333 | return 0; |
| @@ -355,7 +354,5 @@ static void __exit pc8736x_gpio_cleanup(void) | |||
| 355 | platform_device_put(pdev); | 354 | platform_device_put(pdev); |
| 356 | } | 355 | } |
| 357 | 356 | ||
| 358 | EXPORT_SYMBOL(pc8736x_access); | ||
| 359 | |||
| 360 | module_init(pc8736x_gpio_init); | 357 | module_init(pc8736x_gpio_init); |
| 361 | module_exit(pc8736x_gpio_cleanup); | 358 | module_exit(pc8736x_gpio_cleanup); |
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 17bc8abd5df5..00f574cbb0d4 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
| @@ -1174,8 +1174,12 @@ static void dcd_change(MGSLPC_INFO *info) | |||
| 1174 | else | 1174 | else |
| 1175 | info->input_signal_events.dcd_down++; | 1175 | info->input_signal_events.dcd_down++; |
| 1176 | #ifdef CONFIG_HDLC | 1176 | #ifdef CONFIG_HDLC |
| 1177 | if (info->netcount) | 1177 | if (info->netcount) { |
| 1178 | hdlc_set_carrier(info->serial_signals & SerialSignal_DCD, info->netdev); | 1178 | if (info->serial_signals & SerialSignal_DCD) |
| 1179 | netif_carrier_on(info->netdev); | ||
| 1180 | else | ||
| 1181 | netif_carrier_off(info->netdev); | ||
| 1182 | } | ||
| 1179 | #endif | 1183 | #endif |
| 1180 | wake_up_interruptible(&info->status_event_wait_q); | 1184 | wake_up_interruptible(&info->status_event_wait_q); |
| 1181 | wake_up_interruptible(&info->event_wait_q); | 1185 | wake_up_interruptible(&info->event_wait_q); |
| @@ -4251,8 +4255,10 @@ static int hdlcdev_open(struct net_device *dev) | |||
| 4251 | spin_lock_irqsave(&info->lock, flags); | 4255 | spin_lock_irqsave(&info->lock, flags); |
| 4252 | get_signals(info); | 4256 | get_signals(info); |
| 4253 | spin_unlock_irqrestore(&info->lock, flags); | 4257 | spin_unlock_irqrestore(&info->lock, flags); |
| 4254 | hdlc_set_carrier(info->serial_signals & SerialSignal_DCD, dev); | 4258 | if (info->serial_signals & SerialSignal_DCD) |
| 4255 | 4259 | netif_carrier_on(dev); | |
| 4260 | else | ||
| 4261 | netif_carrier_off(dev); | ||
| 4256 | return 0; | 4262 | return 0; |
| 4257 | } | 4263 | } |
| 4258 | 4264 | ||
diff --git a/drivers/char/scx200_gpio.c b/drivers/char/scx200_gpio.c index 425c58719db6..b956c7babd18 100644 --- a/drivers/char/scx200_gpio.c +++ b/drivers/char/scx200_gpio.c | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | 5 | ||
| 6 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> */ | 6 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> */ |
| 7 | 7 | ||
| 8 | #include <linux/config.h> | ||
| 9 | #include <linux/device.h> | 8 | #include <linux/device.h> |
| 10 | #include <linux/fs.h> | 9 | #include <linux/fs.h> |
| 11 | #include <linux/module.h> | 10 | #include <linux/module.h> |
| @@ -22,37 +21,37 @@ | |||
| 22 | #include <linux/scx200_gpio.h> | 21 | #include <linux/scx200_gpio.h> |
| 23 | #include <linux/nsc_gpio.h> | 22 | #include <linux/nsc_gpio.h> |
| 24 | 23 | ||
| 25 | #define NAME "scx200_gpio" | 24 | #define DRVNAME "scx200_gpio" |
| 26 | #define DEVNAME NAME | ||
| 27 | 25 | ||
| 28 | static struct platform_device *pdev; | 26 | static struct platform_device *pdev; |
| 29 | 27 | ||
| 30 | MODULE_AUTHOR("Christer Weinigel <wingel@nano-system.com>"); | 28 | MODULE_AUTHOR("Christer Weinigel <wingel@nano-system.com>"); |
| 31 | MODULE_DESCRIPTION("NatSemi SCx200 GPIO Pin Driver"); | 29 | MODULE_DESCRIPTION("NatSemi/AMD SCx200 GPIO Pin Driver"); |
| 32 | MODULE_LICENSE("GPL"); | 30 | MODULE_LICENSE("GPL"); |
| 33 | 31 | ||
| 34 | static int major = 0; /* default to dynamic major */ | 32 | static int major = 0; /* default to dynamic major */ |
| 35 | module_param(major, int, 0); | 33 | module_param(major, int, 0); |
| 36 | MODULE_PARM_DESC(major, "Major device number"); | 34 | MODULE_PARM_DESC(major, "Major device number"); |
| 37 | 35 | ||
| 38 | struct nsc_gpio_ops scx200_access = { | 36 | #define MAX_PINS 32 /* 64 later, when known ok */ |
| 37 | |||
| 38 | struct nsc_gpio_ops scx200_gpio_ops = { | ||
| 39 | .owner = THIS_MODULE, | 39 | .owner = THIS_MODULE, |
| 40 | .gpio_config = scx200_gpio_configure, | 40 | .gpio_config = scx200_gpio_configure, |
| 41 | .gpio_dump = nsc_gpio_dump, | 41 | .gpio_dump = nsc_gpio_dump, |
| 42 | .gpio_get = scx200_gpio_get, | 42 | .gpio_get = scx200_gpio_get, |
| 43 | .gpio_set = scx200_gpio_set, | 43 | .gpio_set = scx200_gpio_set, |
| 44 | .gpio_set_high = scx200_gpio_set_high, | ||
| 45 | .gpio_set_low = scx200_gpio_set_low, | ||
| 46 | .gpio_change = scx200_gpio_change, | 44 | .gpio_change = scx200_gpio_change, |
| 47 | .gpio_current = scx200_gpio_current | 45 | .gpio_current = scx200_gpio_current |
| 48 | }; | 46 | }; |
| 47 | EXPORT_SYMBOL(scx200_gpio_ops); | ||
| 49 | 48 | ||
| 50 | static int scx200_gpio_open(struct inode *inode, struct file *file) | 49 | static int scx200_gpio_open(struct inode *inode, struct file *file) |
| 51 | { | 50 | { |
| 52 | unsigned m = iminor(inode); | 51 | unsigned m = iminor(inode); |
| 53 | file->private_data = &scx200_access; | 52 | file->private_data = &scx200_gpio_ops; |
| 54 | 53 | ||
| 55 | if (m > 63) | 54 | if (m >= MAX_PINS) |
| 56 | return -EINVAL; | 55 | return -EINVAL; |
| 57 | return nonseekable_open(inode, file); | 56 | return nonseekable_open(inode, file); |
| 58 | } | 57 | } |
| @@ -62,8 +61,7 @@ static int scx200_gpio_release(struct inode *inode, struct file *file) | |||
| 62 | return 0; | 61 | return 0; |
| 63 | } | 62 | } |
| 64 | 63 | ||
| 65 | 64 | static const struct file_operations scx200_gpio_fileops = { | |
| 66 | static const struct file_operations scx200_gpio_fops = { | ||
| 67 | .owner = THIS_MODULE, | 65 | .owner = THIS_MODULE, |
| 68 | .write = nsc_gpio_write, | 66 | .write = nsc_gpio_write, |
| 69 | .read = nsc_gpio_read, | 67 | .read = nsc_gpio_read, |
| @@ -71,21 +69,20 @@ static const struct file_operations scx200_gpio_fops = { | |||
| 71 | .release = scx200_gpio_release, | 69 | .release = scx200_gpio_release, |
| 72 | }; | 70 | }; |
| 73 | 71 | ||
| 74 | struct cdev *scx200_devices; | 72 | struct cdev scx200_gpio_cdev; /* use 1 cdev for all pins */ |
| 75 | static int num_pins = 32; | ||
| 76 | 73 | ||
| 77 | static int __init scx200_gpio_init(void) | 74 | static int __init scx200_gpio_init(void) |
| 78 | { | 75 | { |
| 79 | int rc, i; | 76 | int rc; |
| 80 | dev_t dev = MKDEV(major, 0); | 77 | dev_t devid; |
| 81 | 78 | ||
| 82 | if (!scx200_gpio_present()) { | 79 | if (!scx200_gpio_present()) { |
| 83 | printk(KERN_ERR NAME ": no SCx200 gpio present\n"); | 80 | printk(KERN_ERR DRVNAME ": no SCx200 gpio present\n"); |
| 84 | return -ENODEV; | 81 | return -ENODEV; |
| 85 | } | 82 | } |
| 86 | 83 | ||
| 87 | /* support dev_dbg() with pdev->dev */ | 84 | /* support dev_dbg() with pdev->dev */ |
| 88 | pdev = platform_device_alloc(DEVNAME, 0); | 85 | pdev = platform_device_alloc(DRVNAME, 0); |
| 89 | if (!pdev) | 86 | if (!pdev) |
| 90 | return -ENOMEM; | 87 | return -ENOMEM; |
| 91 | 88 | ||
| @@ -94,37 +91,25 @@ static int __init scx200_gpio_init(void) | |||
| 94 | goto undo_malloc; | 91 | goto undo_malloc; |
| 95 | 92 | ||
| 96 | /* nsc_gpio uses dev_dbg(), so needs this */ | 93 | /* nsc_gpio uses dev_dbg(), so needs this */ |
| 97 | scx200_access.dev = &pdev->dev; | 94 | scx200_gpio_ops.dev = &pdev->dev; |
| 98 | 95 | ||
| 99 | if (major) | 96 | if (major) { |
| 100 | rc = register_chrdev_region(dev, num_pins, "scx200_gpio"); | 97 | devid = MKDEV(major, 0); |
| 101 | else { | 98 | rc = register_chrdev_region(devid, MAX_PINS, "scx200_gpio"); |
| 102 | rc = alloc_chrdev_region(&dev, 0, num_pins, "scx200_gpio"); | 99 | } else { |
| 103 | major = MAJOR(dev); | 100 | rc = alloc_chrdev_region(&devid, 0, MAX_PINS, "scx200_gpio"); |
| 101 | major = MAJOR(devid); | ||
| 104 | } | 102 | } |
| 105 | if (rc < 0) { | 103 | if (rc < 0) { |
| 106 | dev_err(&pdev->dev, "SCx200 chrdev_region err: %d\n", rc); | 104 | dev_err(&pdev->dev, "SCx200 chrdev_region err: %d\n", rc); |
| 107 | goto undo_platform_device_add; | 105 | goto undo_platform_device_add; |
| 108 | } | 106 | } |
| 109 | scx200_devices = kzalloc(num_pins * sizeof(struct cdev), GFP_KERNEL); | 107 | |
| 110 | if (!scx200_devices) { | 108 | cdev_init(&scx200_gpio_cdev, &scx200_gpio_fileops); |
| 111 | rc = -ENOMEM; | 109 | cdev_add(&scx200_gpio_cdev, devid, MAX_PINS); |
| 112 | goto undo_chrdev_region; | ||
| 113 | } | ||
| 114 | for (i = 0; i < num_pins; i++) { | ||
| 115 | struct cdev *cdev = &scx200_devices[i]; | ||
| 116 | cdev_init(cdev, &scx200_gpio_fops); | ||
| 117 | cdev->owner = THIS_MODULE; | ||
| 118 | rc = cdev_add(cdev, MKDEV(major, i), 1); | ||
| 119 | /* tolerate 'minor' errors */ | ||
| 120 | if (rc) | ||
| 121 | dev_err(&pdev->dev, "Error %d on minor %d", rc, i); | ||
| 122 | } | ||
| 123 | 110 | ||
| 124 | return 0; /* succeed */ | 111 | return 0; /* succeed */ |
| 125 | 112 | ||
| 126 | undo_chrdev_region: | ||
| 127 | unregister_chrdev_region(dev, num_pins); | ||
| 128 | undo_platform_device_add: | 113 | undo_platform_device_add: |
| 129 | platform_device_del(pdev); | 114 | platform_device_del(pdev); |
| 130 | undo_malloc: | 115 | undo_malloc: |
| @@ -135,10 +120,11 @@ undo_malloc: | |||
| 135 | 120 | ||
| 136 | static void __exit scx200_gpio_cleanup(void) | 121 | static void __exit scx200_gpio_cleanup(void) |
| 137 | { | 122 | { |
| 138 | kfree(scx200_devices); | 123 | cdev_del(&scx200_gpio_cdev); |
| 139 | unregister_chrdev_region(MKDEV(major, 0), num_pins); | 124 | /* cdev_put(&scx200_gpio_cdev); */ |
| 125 | |||
| 126 | unregister_chrdev_region(MKDEV(major, 0), MAX_PINS); | ||
| 140 | platform_device_unregister(pdev); | 127 | platform_device_unregister(pdev); |
| 141 | /* kfree(pdev); */ | ||
| 142 | } | 128 | } |
| 143 | 129 | ||
| 144 | module_init(scx200_gpio_init); | 130 | module_init(scx200_gpio_init); |
diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c index df782dd1098c..78b1b1a2732b 100644 --- a/drivers/char/synclink.c +++ b/drivers/char/synclink.c | |||
| @@ -1344,8 +1344,12 @@ static void mgsl_isr_io_pin( struct mgsl_struct *info ) | |||
| 1344 | } else | 1344 | } else |
| 1345 | info->input_signal_events.dcd_down++; | 1345 | info->input_signal_events.dcd_down++; |
| 1346 | #ifdef CONFIG_HDLC | 1346 | #ifdef CONFIG_HDLC |
| 1347 | if (info->netcount) | 1347 | if (info->netcount) { |
| 1348 | hdlc_set_carrier(status & MISCSTATUS_DCD, info->netdev); | 1348 | if (status & MISCSTATUS_DCD) |
| 1349 | netif_carrier_on(info->netdev); | ||
| 1350 | else | ||
| 1351 | netif_carrier_off(info->netdev); | ||
| 1352 | } | ||
| 1349 | #endif | 1353 | #endif |
| 1350 | } | 1354 | } |
| 1351 | if (status & MISCSTATUS_CTS_LATCHED) | 1355 | if (status & MISCSTATUS_CTS_LATCHED) |
| @@ -7844,8 +7848,10 @@ static int hdlcdev_open(struct net_device *dev) | |||
| 7844 | spin_lock_irqsave(&info->irq_spinlock, flags); | 7848 | spin_lock_irqsave(&info->irq_spinlock, flags); |
| 7845 | usc_get_serial_signals(info); | 7849 | usc_get_serial_signals(info); |
| 7846 | spin_unlock_irqrestore(&info->irq_spinlock, flags); | 7850 | spin_unlock_irqrestore(&info->irq_spinlock, flags); |
| 7847 | hdlc_set_carrier(info->serial_signals & SerialSignal_DCD, dev); | 7851 | if (info->serial_signals & SerialSignal_DCD) |
| 7848 | 7852 | netif_carrier_on(dev); | |
| 7853 | else | ||
| 7854 | netif_carrier_off(dev); | ||
| 7849 | return 0; | 7855 | return 0; |
| 7850 | } | 7856 | } |
| 7851 | 7857 | ||
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index e829594195c1..b2dbbdb1bf81 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
| @@ -1497,8 +1497,10 @@ static int hdlcdev_open(struct net_device *dev) | |||
| 1497 | spin_lock_irqsave(&info->lock, flags); | 1497 | spin_lock_irqsave(&info->lock, flags); |
| 1498 | get_signals(info); | 1498 | get_signals(info); |
| 1499 | spin_unlock_irqrestore(&info->lock, flags); | 1499 | spin_unlock_irqrestore(&info->lock, flags); |
| 1500 | hdlc_set_carrier(info->signals & SerialSignal_DCD, dev); | 1500 | if (info->signals & SerialSignal_DCD) |
| 1501 | 1501 | netif_carrier_on(dev); | |
| 1502 | else | ||
| 1503 | netif_carrier_off(dev); | ||
| 1502 | return 0; | 1504 | return 0; |
| 1503 | } | 1505 | } |
| 1504 | 1506 | ||
| @@ -1997,8 +1999,12 @@ static void dcd_change(struct slgt_info *info) | |||
| 1997 | info->input_signal_events.dcd_down++; | 1999 | info->input_signal_events.dcd_down++; |
| 1998 | } | 2000 | } |
| 1999 | #ifdef CONFIG_HDLC | 2001 | #ifdef CONFIG_HDLC |
| 2000 | if (info->netcount) | 2002 | if (info->netcount) { |
| 2001 | hdlc_set_carrier(info->signals & SerialSignal_DCD, info->netdev); | 2003 | if (info->signals & SerialSignal_DCD) |
| 2004 | netif_carrier_on(info->netdev); | ||
| 2005 | else | ||
| 2006 | netif_carrier_off(info->netdev); | ||
| 2007 | } | ||
| 2002 | #endif | 2008 | #endif |
| 2003 | wake_up_interruptible(&info->status_event_wait_q); | 2009 | wake_up_interruptible(&info->status_event_wait_q); |
| 2004 | wake_up_interruptible(&info->event_wait_q); | 2010 | wake_up_interruptible(&info->event_wait_q); |
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index 1e443a233f51..66f3754fbbdf 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c | |||
| @@ -1752,8 +1752,10 @@ static int hdlcdev_open(struct net_device *dev) | |||
| 1752 | spin_lock_irqsave(&info->lock, flags); | 1752 | spin_lock_irqsave(&info->lock, flags); |
| 1753 | get_signals(info); | 1753 | get_signals(info); |
| 1754 | spin_unlock_irqrestore(&info->lock, flags); | 1754 | spin_unlock_irqrestore(&info->lock, flags); |
| 1755 | hdlc_set_carrier(info->serial_signals & SerialSignal_DCD, dev); | 1755 | if (info->serial_signals & SerialSignal_DCD) |
| 1756 | 1756 | netif_carrier_on(dev); | |
| 1757 | else | ||
| 1758 | netif_carrier_off(dev); | ||
| 1757 | return 0; | 1759 | return 0; |
| 1758 | } | 1760 | } |
| 1759 | 1761 | ||
| @@ -2522,8 +2524,12 @@ void isr_io_pin( SLMP_INFO *info, u16 status ) | |||
| 2522 | } else | 2524 | } else |
| 2523 | info->input_signal_events.dcd_down++; | 2525 | info->input_signal_events.dcd_down++; |
| 2524 | #ifdef CONFIG_HDLC | 2526 | #ifdef CONFIG_HDLC |
| 2525 | if (info->netcount) | 2527 | if (info->netcount) { |
| 2526 | hdlc_set_carrier(status & SerialSignal_DCD, info->netdev); | 2528 | if (status & SerialSignal_DCD) |
| 2529 | netif_carrier_on(info->netdev); | ||
| 2530 | else | ||
| 2531 | netif_carrier_off(info->netdev); | ||
| 2532 | } | ||
| 2527 | #endif | 2533 | #endif |
| 2528 | } | 2534 | } |
| 2529 | if (status & MISCSTATUS_CTS_LATCHED) | 2535 | if (status & MISCSTATUS_CTS_LATCHED) |
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index 6889e7db3aff..a082a2e34252 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
| @@ -1141,6 +1141,7 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend | |||
| 1141 | put_device(dev); | 1141 | put_device(dev); |
| 1142 | clear_bit(chip->dev_num, dev_mask); | 1142 | clear_bit(chip->dev_num, dev_mask); |
| 1143 | kfree(chip); | 1143 | kfree(chip); |
| 1144 | kfree(devname); | ||
| 1144 | return NULL; | 1145 | return NULL; |
| 1145 | } | 1146 | } |
| 1146 | 1147 | ||
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 3232b1932597..ee7ac6f43c65 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
| @@ -424,6 +424,7 @@ static irqreturn_t tis_int_handler(int irq, void *dev_id, struct pt_regs *regs) | |||
| 424 | iowrite32(interrupt, | 424 | iowrite32(interrupt, |
| 425 | chip->vendor.iobase + | 425 | chip->vendor.iobase + |
| 426 | TPM_INT_STATUS(chip->vendor.locality)); | 426 | TPM_INT_STATUS(chip->vendor.locality)); |
| 427 | ioread32(chip->vendor.iobase + TPM_INT_STATUS(chip->vendor.locality)); | ||
| 427 | return IRQ_HANDLED; | 428 | return IRQ_HANDLED; |
| 428 | } | 429 | } |
| 429 | 430 | ||
| @@ -431,23 +432,19 @@ static int interrupts = 1; | |||
| 431 | module_param(interrupts, bool, 0444); | 432 | module_param(interrupts, bool, 0444); |
| 432 | MODULE_PARM_DESC(interrupts, "Enable interrupts"); | 433 | MODULE_PARM_DESC(interrupts, "Enable interrupts"); |
| 433 | 434 | ||
| 434 | static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, | 435 | static int tpm_tis_init(struct device *dev, resource_size_t start, |
| 435 | const struct pnp_device_id *pnp_id) | 436 | resource_size_t len) |
| 436 | { | 437 | { |
| 437 | u32 vendor, intfcaps, intmask; | 438 | u32 vendor, intfcaps, intmask; |
| 438 | int rc, i; | 439 | int rc, i; |
| 439 | unsigned long start, len; | ||
| 440 | struct tpm_chip *chip; | 440 | struct tpm_chip *chip; |
| 441 | 441 | ||
| 442 | start = pnp_mem_start(pnp_dev, 0); | ||
| 443 | len = pnp_mem_len(pnp_dev, 0); | ||
| 444 | |||
| 445 | if (!start) | 442 | if (!start) |
| 446 | start = TIS_MEM_BASE; | 443 | start = TIS_MEM_BASE; |
| 447 | if (!len) | 444 | if (!len) |
| 448 | len = TIS_MEM_LEN; | 445 | len = TIS_MEM_LEN; |
| 449 | 446 | ||
| 450 | if (!(chip = tpm_register_hardware(&pnp_dev->dev, &tpm_tis))) | 447 | if (!(chip = tpm_register_hardware(dev, &tpm_tis))) |
| 451 | return -ENODEV; | 448 | return -ENODEV; |
| 452 | 449 | ||
| 453 | chip->vendor.iobase = ioremap(start, len); | 450 | chip->vendor.iobase = ioremap(start, len); |
| @@ -464,7 +461,7 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, | |||
| 464 | chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); | 461 | chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT); |
| 465 | chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); | 462 | chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT); |
| 466 | 463 | ||
| 467 | dev_info(&pnp_dev->dev, | 464 | dev_info(dev, |
| 468 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", | 465 | "1.2 TPM (device-id 0x%X, rev-id %d)\n", |
| 469 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); | 466 | vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0))); |
| 470 | 467 | ||
| @@ -472,26 +469,26 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, | |||
| 472 | intfcaps = | 469 | intfcaps = |
| 473 | ioread32(chip->vendor.iobase + | 470 | ioread32(chip->vendor.iobase + |
| 474 | TPM_INTF_CAPS(chip->vendor.locality)); | 471 | TPM_INTF_CAPS(chip->vendor.locality)); |
| 475 | dev_dbg(&pnp_dev->dev, "TPM interface capabilities (0x%x):\n", | 472 | dev_dbg(dev, "TPM interface capabilities (0x%x):\n", |
| 476 | intfcaps); | 473 | intfcaps); |
| 477 | if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) | 474 | if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) |
| 478 | dev_dbg(&pnp_dev->dev, "\tBurst Count Static\n"); | 475 | dev_dbg(dev, "\tBurst Count Static\n"); |
| 479 | if (intfcaps & TPM_INTF_CMD_READY_INT) | 476 | if (intfcaps & TPM_INTF_CMD_READY_INT) |
| 480 | dev_dbg(&pnp_dev->dev, "\tCommand Ready Int Support\n"); | 477 | dev_dbg(dev, "\tCommand Ready Int Support\n"); |
| 481 | if (intfcaps & TPM_INTF_INT_EDGE_FALLING) | 478 | if (intfcaps & TPM_INTF_INT_EDGE_FALLING) |
| 482 | dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Falling\n"); | 479 | dev_dbg(dev, "\tInterrupt Edge Falling\n"); |
| 483 | if (intfcaps & TPM_INTF_INT_EDGE_RISING) | 480 | if (intfcaps & TPM_INTF_INT_EDGE_RISING) |
| 484 | dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Rising\n"); | 481 | dev_dbg(dev, "\tInterrupt Edge Rising\n"); |
| 485 | if (intfcaps & TPM_INTF_INT_LEVEL_LOW) | 482 | if (intfcaps & TPM_INTF_INT_LEVEL_LOW) |
| 486 | dev_dbg(&pnp_dev->dev, "\tInterrupt Level Low\n"); | 483 | dev_dbg(dev, "\tInterrupt Level Low\n"); |
| 487 | if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) | 484 | if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) |
| 488 | dev_dbg(&pnp_dev->dev, "\tInterrupt Level High\n"); | 485 | dev_dbg(dev, "\tInterrupt Level High\n"); |
| 489 | if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) | 486 | if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) |
| 490 | dev_dbg(&pnp_dev->dev, "\tLocality Change Int Support\n"); | 487 | dev_dbg(dev, "\tLocality Change Int Support\n"); |
| 491 | if (intfcaps & TPM_INTF_STS_VALID_INT) | 488 | if (intfcaps & TPM_INTF_STS_VALID_INT) |
| 492 | dev_dbg(&pnp_dev->dev, "\tSts Valid Int Support\n"); | 489 | dev_dbg(dev, "\tSts Valid Int Support\n"); |
| 493 | if (intfcaps & TPM_INTF_DATA_AVAIL_INT) | 490 | if (intfcaps & TPM_INTF_DATA_AVAIL_INT) |
| 494 | dev_dbg(&pnp_dev->dev, "\tData Avail Int Support\n"); | 491 | dev_dbg(dev, "\tData Avail Int Support\n"); |
| 495 | 492 | ||
| 496 | if (request_locality(chip, 0) != 0) { | 493 | if (request_locality(chip, 0) != 0) { |
| 497 | rc = -ENODEV; | 494 | rc = -ENODEV; |
| @@ -594,6 +591,16 @@ out_err: | |||
| 594 | return rc; | 591 | return rc; |
| 595 | } | 592 | } |
| 596 | 593 | ||
| 594 | static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev, | ||
| 595 | const struct pnp_device_id *pnp_id) | ||
| 596 | { | ||
| 597 | resource_size_t start, len; | ||
| 598 | start = pnp_mem_start(pnp_dev, 0); | ||
| 599 | len = pnp_mem_len(pnp_dev, 0); | ||
| 600 | |||
| 601 | return tpm_tis_init(&pnp_dev->dev, start, len); | ||
| 602 | } | ||
| 603 | |||
| 597 | static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg) | 604 | static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg) |
| 598 | { | 605 | { |
| 599 | return tpm_pm_suspend(&dev->dev, msg); | 606 | return tpm_pm_suspend(&dev->dev, msg); |
| @@ -628,8 +635,36 @@ module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id, | |||
| 628 | sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444); | 635 | sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444); |
| 629 | MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe"); | 636 | MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe"); |
| 630 | 637 | ||
| 638 | static struct device_driver tis_drv = { | ||
| 639 | .name = "tpm_tis", | ||
| 640 | .bus = &platform_bus_type, | ||
| 641 | .owner = THIS_MODULE, | ||
| 642 | .suspend = tpm_pm_suspend, | ||
| 643 | .resume = tpm_pm_resume, | ||
| 644 | }; | ||
| 645 | |||
| 646 | static struct platform_device *pdev; | ||
| 647 | |||
| 648 | static int force; | ||
| 649 | module_param(force, bool, 0444); | ||
| 650 | MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry"); | ||
| 631 | static int __init init_tis(void) | 651 | static int __init init_tis(void) |
| 632 | { | 652 | { |
| 653 | int rc; | ||
| 654 | |||
| 655 | if (force) { | ||
| 656 | rc = driver_register(&tis_drv); | ||
| 657 | if (rc < 0) | ||
| 658 | return rc; | ||
| 659 | if (IS_ERR(pdev=platform_device_register_simple("tpm_tis", -1, NULL, 0))) | ||
| 660 | return PTR_ERR(pdev); | ||
| 661 | if((rc=tpm_tis_init(&pdev->dev, 0, 0)) != 0) { | ||
| 662 | platform_device_unregister(pdev); | ||
| 663 | driver_unregister(&tis_drv); | ||
| 664 | } | ||
| 665 | return rc; | ||
| 666 | } | ||
| 667 | |||
| 633 | return pnp_register_driver(&tis_pnp_driver); | 668 | return pnp_register_driver(&tis_pnp_driver); |
| 634 | } | 669 | } |
| 635 | 670 | ||
| @@ -654,7 +689,11 @@ static void __exit cleanup_tis(void) | |||
| 654 | tpm_remove_hardware(chip->dev); | 689 | tpm_remove_hardware(chip->dev); |
| 655 | } | 690 | } |
| 656 | spin_unlock(&tis_lock); | 691 | spin_unlock(&tis_lock); |
| 657 | pnp_unregister_driver(&tis_pnp_driver); | 692 | if (force) { |
| 693 | platform_device_unregister(pdev); | ||
| 694 | driver_unregister(&tis_drv); | ||
| 695 | } else | ||
| 696 | pnp_unregister_driver(&tis_pnp_driver); | ||
| 658 | } | 697 | } |
| 659 | 698 | ||
| 660 | module_init(init_tis); | 699 | module_init(init_tis); |
