diff options
Diffstat (limited to 'drivers')
57 files changed, 503 insertions, 579 deletions
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index e2e992599e68..baa76bbf244a 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
| @@ -475,101 +475,13 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | |||
| 475 | }, | 475 | }, |
| 476 | { | 476 | { |
| 477 | .callback = init_set_sci_en_on_resume, | 477 | .callback = init_set_sci_en_on_resume, |
| 478 | .ident = "Lenovo ThinkPad X201", | 478 | .ident = "Lenovo ThinkPad X201[s]", |
| 479 | .matches = { | 479 | .matches = { |
| 480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 480 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| 481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | 481 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), |
| 482 | }, | 482 | }, |
| 483 | }, | 483 | }, |
| 484 | { | 484 | { |
| 485 | .callback = init_set_sci_en_on_resume, | ||
| 486 | .ident = "Lenovo ThinkPad X201", | ||
| 487 | .matches = { | ||
| 488 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 489 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 490 | }, | ||
| 491 | }, | ||
| 492 | { | ||
| 493 | .callback = init_set_sci_en_on_resume, | ||
| 494 | .ident = "Lenovo ThinkPad T410", | ||
| 495 | .matches = { | ||
| 496 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 497 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
| 498 | }, | ||
| 499 | }, | ||
| 500 | { | ||
| 501 | .callback = init_set_sci_en_on_resume, | ||
| 502 | .ident = "Lenovo ThinkPad T510", | ||
| 503 | .matches = { | ||
| 504 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 505 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
| 506 | }, | ||
| 507 | }, | ||
| 508 | { | ||
| 509 | .callback = init_set_sci_en_on_resume, | ||
| 510 | .ident = "Lenovo ThinkPad W510", | ||
| 511 | .matches = { | ||
| 512 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 513 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
| 514 | }, | ||
| 515 | }, | ||
| 516 | { | ||
| 517 | .callback = init_set_sci_en_on_resume, | ||
| 518 | .ident = "Lenovo ThinkPad X201", | ||
| 519 | .matches = { | ||
| 520 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 521 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
| 522 | }, | ||
| 523 | }, | ||
| 524 | { | ||
| 525 | .callback = init_set_sci_en_on_resume, | ||
| 526 | .ident = "Lenovo ThinkPad X201", | ||
| 527 | .matches = { | ||
| 528 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 529 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 530 | }, | ||
| 531 | }, | ||
| 532 | { | ||
| 533 | .callback = init_set_sci_en_on_resume, | ||
| 534 | .ident = "Lenovo ThinkPad T410", | ||
| 535 | .matches = { | ||
| 536 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 537 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
| 538 | }, | ||
| 539 | }, | ||
| 540 | { | ||
| 541 | .callback = init_set_sci_en_on_resume, | ||
| 542 | .ident = "Lenovo ThinkPad T510", | ||
| 543 | .matches = { | ||
| 544 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 545 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
| 546 | }, | ||
| 547 | }, | ||
| 548 | { | ||
| 549 | .callback = init_set_sci_en_on_resume, | ||
| 550 | .ident = "Lenovo ThinkPad W510", | ||
| 551 | .matches = { | ||
| 552 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 553 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
| 554 | }, | ||
| 555 | }, | ||
| 556 | { | ||
| 557 | .callback = init_set_sci_en_on_resume, | ||
| 558 | .ident = "Lenovo ThinkPad X201", | ||
| 559 | .matches = { | ||
| 560 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 561 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
| 562 | }, | ||
| 563 | }, | ||
| 564 | { | ||
| 565 | .callback = init_set_sci_en_on_resume, | ||
| 566 | .ident = "Lenovo ThinkPad X201", | ||
| 567 | .matches = { | ||
| 568 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
| 569 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"), | ||
| 570 | }, | ||
| 571 | }, | ||
| 572 | { | ||
| 573 | .callback = init_old_suspend_ordering, | 485 | .callback = init_old_suspend_ordering, |
| 574 | .ident = "Panasonic CF51-2L", | 486 | .ident = "Panasonic CF51-2L", |
| 575 | .matches = { | 487 | .matches = { |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 4b4b565c835f..c5fbe198fbdb 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
| @@ -187,7 +187,7 @@ EXPORT_SYMBOL_GPL(platform_device_alloc); | |||
| 187 | * released. | 187 | * released. |
| 188 | */ | 188 | */ |
| 189 | int platform_device_add_resources(struct platform_device *pdev, | 189 | int platform_device_add_resources(struct platform_device *pdev, |
| 190 | struct resource *res, unsigned int num) | 190 | const struct resource *res, unsigned int num) |
| 191 | { | 191 | { |
| 192 | struct resource *r; | 192 | struct resource *r; |
| 193 | 193 | ||
| @@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); | |||
| 367 | */ | 367 | */ |
| 368 | struct platform_device *platform_device_register_simple(const char *name, | 368 | struct platform_device *platform_device_register_simple(const char *name, |
| 369 | int id, | 369 | int id, |
| 370 | struct resource *res, | 370 | const struct resource *res, |
| 371 | unsigned int num) | 371 | unsigned int num) |
| 372 | { | 372 | { |
| 373 | struct platform_device *pdev; | 373 | struct platform_device *pdev; |
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 0182a22c423a..832798aa14f6 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | #include <linux/blkdev.h> | 66 | #include <linux/blkdev.h> |
| 67 | #include <linux/elevator.h> | 67 | #include <linux/elevator.h> |
| 68 | #include <linux/interrupt.h> | 68 | #include <linux/interrupt.h> |
| 69 | #include <linux/platform_device.h> | ||
| 69 | 70 | ||
| 70 | #include <asm/setup.h> | 71 | #include <asm/setup.h> |
| 71 | #include <asm/uaccess.h> | 72 | #include <asm/uaccess.h> |
| @@ -1696,34 +1697,18 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data) | |||
| 1696 | return get_disk(unit[drive].gendisk); | 1697 | return get_disk(unit[drive].gendisk); |
| 1697 | } | 1698 | } |
| 1698 | 1699 | ||
| 1699 | static int __init amiga_floppy_init(void) | 1700 | static int __init amiga_floppy_probe(struct platform_device *pdev) |
| 1700 | { | 1701 | { |
| 1701 | int i, ret; | 1702 | int i, ret; |
| 1702 | 1703 | ||
| 1703 | if (!MACH_IS_AMIGA) | ||
| 1704 | return -ENODEV; | ||
| 1705 | |||
| 1706 | if (!AMIGAHW_PRESENT(AMI_FLOPPY)) | ||
| 1707 | return -ENODEV; | ||
| 1708 | |||
| 1709 | if (register_blkdev(FLOPPY_MAJOR,"fd")) | 1704 | if (register_blkdev(FLOPPY_MAJOR,"fd")) |
| 1710 | return -EBUSY; | 1705 | return -EBUSY; |
| 1711 | 1706 | ||
| 1712 | /* | ||
| 1713 | * We request DSKPTR, DSKLEN and DSKDATA only, because the other | ||
| 1714 | * floppy registers are too spreaded over the custom register space | ||
| 1715 | */ | ||
| 1716 | ret = -EBUSY; | ||
| 1717 | if (!request_mem_region(CUSTOM_PHYSADDR+0x20, 8, "amiflop [Paula]")) { | ||
| 1718 | printk("fd: cannot get floppy registers\n"); | ||
| 1719 | goto out_blkdev; | ||
| 1720 | } | ||
| 1721 | |||
| 1722 | ret = -ENOMEM; | 1707 | ret = -ENOMEM; |
| 1723 | if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == | 1708 | if ((raw_buf = (char *)amiga_chip_alloc (RAW_BUF_SIZE, "Floppy")) == |
| 1724 | NULL) { | 1709 | NULL) { |
| 1725 | printk("fd: cannot get chip mem buffer\n"); | 1710 | printk("fd: cannot get chip mem buffer\n"); |
| 1726 | goto out_memregion; | 1711 | goto out_blkdev; |
| 1727 | } | 1712 | } |
| 1728 | 1713 | ||
| 1729 | ret = -EBUSY; | 1714 | ret = -EBUSY; |
| @@ -1792,18 +1777,13 @@ out_irq2: | |||
| 1792 | free_irq(IRQ_AMIGA_DSKBLK, NULL); | 1777 | free_irq(IRQ_AMIGA_DSKBLK, NULL); |
| 1793 | out_irq: | 1778 | out_irq: |
| 1794 | amiga_chip_free(raw_buf); | 1779 | amiga_chip_free(raw_buf); |
| 1795 | out_memregion: | ||
| 1796 | release_mem_region(CUSTOM_PHYSADDR+0x20, 8); | ||
| 1797 | out_blkdev: | 1780 | out_blkdev: |
| 1798 | unregister_blkdev(FLOPPY_MAJOR,"fd"); | 1781 | unregister_blkdev(FLOPPY_MAJOR,"fd"); |
| 1799 | return ret; | 1782 | return ret; |
| 1800 | } | 1783 | } |
| 1801 | 1784 | ||
| 1802 | module_init(amiga_floppy_init); | ||
| 1803 | #ifdef MODULE | ||
| 1804 | |||
| 1805 | #if 0 /* not safe to unload */ | 1785 | #if 0 /* not safe to unload */ |
| 1806 | void cleanup_module(void) | 1786 | static int __exit amiga_floppy_remove(struct platform_device *pdev) |
| 1807 | { | 1787 | { |
| 1808 | int i; | 1788 | int i; |
| 1809 | 1789 | ||
| @@ -1820,12 +1800,25 @@ void cleanup_module(void) | |||
| 1820 | custom.dmacon = DMAF_DISK; /* disable DMA */ | 1800 | custom.dmacon = DMAF_DISK; /* disable DMA */ |
| 1821 | amiga_chip_free(raw_buf); | 1801 | amiga_chip_free(raw_buf); |
| 1822 | blk_cleanup_queue(floppy_queue); | 1802 | blk_cleanup_queue(floppy_queue); |
| 1823 | release_mem_region(CUSTOM_PHYSADDR+0x20, 8); | ||
| 1824 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | 1803 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
| 1825 | } | 1804 | } |
| 1826 | #endif | 1805 | #endif |
| 1827 | 1806 | ||
| 1828 | #else | 1807 | static struct platform_driver amiga_floppy_driver = { |
| 1808 | .driver = { | ||
| 1809 | .name = "amiga-floppy", | ||
| 1810 | .owner = THIS_MODULE, | ||
| 1811 | }, | ||
| 1812 | }; | ||
| 1813 | |||
| 1814 | static int __init amiga_floppy_init(void) | ||
| 1815 | { | ||
| 1816 | return platform_driver_probe(&amiga_floppy_driver, amiga_floppy_probe); | ||
| 1817 | } | ||
| 1818 | |||
| 1819 | module_init(amiga_floppy_init); | ||
| 1820 | |||
| 1821 | #ifndef MODULE | ||
| 1829 | static int __init amiga_floppy_setup (char *str) | 1822 | static int __init amiga_floppy_setup (char *str) |
| 1830 | { | 1823 | { |
| 1831 | int n; | 1824 | int n; |
| @@ -1840,3 +1833,5 @@ static int __init amiga_floppy_setup (char *str) | |||
| 1840 | 1833 | ||
| 1841 | __setup("floppy=", amiga_floppy_setup); | 1834 | __setup("floppy=", amiga_floppy_setup); |
| 1842 | #endif | 1835 | #endif |
| 1836 | |||
| 1837 | MODULE_ALIAS("platform:amiga-floppy"); | ||
diff --git a/drivers/char/serial167.c b/drivers/char/serial167.c index 8dfd24721a82..78a62ebe75c7 100644 --- a/drivers/char/serial167.c +++ b/drivers/char/serial167.c | |||
| @@ -627,7 +627,6 @@ static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id) | |||
| 627 | char data; | 627 | char data; |
| 628 | int char_count; | 628 | int char_count; |
| 629 | int save_cnt; | 629 | int save_cnt; |
| 630 | int len; | ||
| 631 | 630 | ||
| 632 | /* determine the channel and change to that context */ | 631 | /* determine the channel and change to that context */ |
| 633 | channel = (u_short) (base_addr[CyLICR] >> 2); | 632 | channel = (u_short) (base_addr[CyLICR] >> 2); |
| @@ -1528,7 +1527,6 @@ static int | |||
| 1528 | cy_ioctl(struct tty_struct *tty, struct file *file, | 1527 | cy_ioctl(struct tty_struct *tty, struct file *file, |
| 1529 | unsigned int cmd, unsigned long arg) | 1528 | unsigned int cmd, unsigned long arg) |
| 1530 | { | 1529 | { |
| 1531 | unsigned long val; | ||
| 1532 | struct cyclades_port *info = tty->driver_data; | 1530 | struct cyclades_port *info = tty->driver_data; |
| 1533 | int ret_val = 0; | 1531 | int ret_val = 0; |
| 1534 | void __user *argp = (void __user *)arg; | 1532 | void __user *argp = (void __user *)arg; |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 6da962c9b21c..d71f0fc34b46 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -1875,6 +1875,7 @@ got_driver: | |||
| 1875 | */ | 1875 | */ |
| 1876 | if (filp->f_op == &hung_up_tty_fops) | 1876 | if (filp->f_op == &hung_up_tty_fops) |
| 1877 | filp->f_op = &tty_fops; | 1877 | filp->f_op = &tty_fops; |
| 1878 | unlock_kernel(); | ||
| 1878 | goto retry_open; | 1879 | goto retry_open; |
| 1879 | } | 1880 | } |
| 1880 | unlock_kernel(); | 1881 | unlock_kernel(); |
diff --git a/drivers/gpio/it8761e_gpio.c b/drivers/gpio/it8761e_gpio.c index 753219cf993a..41a9388f2fde 100644 --- a/drivers/gpio/it8761e_gpio.c +++ b/drivers/gpio/it8761e_gpio.c | |||
| @@ -80,8 +80,8 @@ static int it8761e_gpio_get(struct gpio_chip *gc, unsigned gpio_num) | |||
| 80 | u16 reg; | 80 | u16 reg; |
| 81 | u8 bit; | 81 | u8 bit; |
| 82 | 82 | ||
| 83 | bit = gpio_num % 7; | 83 | bit = gpio_num % 8; |
| 84 | reg = (gpio_num >= 7) ? gpio_ba + 1 : gpio_ba; | 84 | reg = (gpio_num >= 8) ? gpio_ba + 1 : gpio_ba; |
| 85 | 85 | ||
| 86 | return !!(inb(reg) & (1 << bit)); | 86 | return !!(inb(reg) & (1 << bit)); |
| 87 | } | 87 | } |
| @@ -91,8 +91,8 @@ static int it8761e_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) | |||
| 91 | u8 curr_dirs; | 91 | u8 curr_dirs; |
| 92 | u8 io_reg, bit; | 92 | u8 io_reg, bit; |
| 93 | 93 | ||
| 94 | bit = gpio_num % 7; | 94 | bit = gpio_num % 8; |
| 95 | io_reg = (gpio_num >= 7) ? GPIO2X_IO : GPIO1X_IO; | 95 | io_reg = (gpio_num >= 8) ? GPIO2X_IO : GPIO1X_IO; |
| 96 | 96 | ||
| 97 | spin_lock(&sio_lock); | 97 | spin_lock(&sio_lock); |
| 98 | 98 | ||
| @@ -116,8 +116,8 @@ static void it8761e_gpio_set(struct gpio_chip *gc, | |||
| 116 | u8 curr_vals, bit; | 116 | u8 curr_vals, bit; |
| 117 | u16 reg; | 117 | u16 reg; |
| 118 | 118 | ||
| 119 | bit = gpio_num % 7; | 119 | bit = gpio_num % 8; |
| 120 | reg = (gpio_num >= 7) ? gpio_ba + 1 : gpio_ba; | 120 | reg = (gpio_num >= 8) ? gpio_ba + 1 : gpio_ba; |
| 121 | 121 | ||
| 122 | spin_lock(&sio_lock); | 122 | spin_lock(&sio_lock); |
| 123 | 123 | ||
| @@ -135,8 +135,8 @@ static int it8761e_gpio_direction_out(struct gpio_chip *gc, | |||
| 135 | { | 135 | { |
| 136 | u8 curr_dirs, io_reg, bit; | 136 | u8 curr_dirs, io_reg, bit; |
| 137 | 137 | ||
| 138 | bit = gpio_num % 7; | 138 | bit = gpio_num % 8; |
| 139 | io_reg = (gpio_num >= 7) ? GPIO2X_IO : GPIO1X_IO; | 139 | io_reg = (gpio_num >= 8) ? GPIO2X_IO : GPIO1X_IO; |
| 140 | 140 | ||
| 141 | it8761e_gpio_set(gc, gpio_num, val); | 141 | it8761e_gpio_set(gc, gpio_num, val); |
| 142 | 142 | ||
| @@ -200,7 +200,7 @@ static int __init it8761e_gpio_init(void) | |||
| 200 | return -EBUSY; | 200 | return -EBUSY; |
| 201 | 201 | ||
| 202 | it8761e_gpio_chip.base = -1; | 202 | it8761e_gpio_chip.base = -1; |
| 203 | it8761e_gpio_chip.ngpio = 14; | 203 | it8761e_gpio_chip.ngpio = 16; |
| 204 | 204 | ||
| 205 | err = gpiochip_add(&it8761e_gpio_chip); | 205 | err = gpiochip_add(&it8761e_gpio_chip); |
| 206 | if (err < 0) | 206 | if (err < 0) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2b8b969d0c15..df6a9cd82c4d 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -456,11 +456,15 @@ i915_error_object_create(struct drm_device *dev, | |||
| 456 | 456 | ||
| 457 | for (page = 0; page < page_count; page++) { | 457 | for (page = 0; page < page_count; page++) { |
| 458 | void *s, *d = kmalloc(PAGE_SIZE, GFP_ATOMIC); | 458 | void *s, *d = kmalloc(PAGE_SIZE, GFP_ATOMIC); |
| 459 | unsigned long flags; | ||
| 460 | |||
| 459 | if (d == NULL) | 461 | if (d == NULL) |
| 460 | goto unwind; | 462 | goto unwind; |
| 461 | s = kmap_atomic(src_priv->pages[page], KM_USER0); | 463 | local_irq_save(flags); |
| 464 | s = kmap_atomic(src_priv->pages[page], KM_IRQ0); | ||
| 462 | memcpy(d, s, PAGE_SIZE); | 465 | memcpy(d, s, PAGE_SIZE); |
| 463 | kunmap_atomic(s, KM_USER0); | 466 | kunmap_atomic(s, KM_IRQ0); |
| 467 | local_irq_restore(flags); | ||
| 464 | dst->pages[page] = d; | 468 | dst->pages[page] = d; |
| 465 | } | 469 | } |
| 466 | dst->page_count = page_count; | 470 | dst->page_count = page_count; |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 40ab6d9c3736..cc5316dcf580 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -424,7 +424,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
| 424 | if ((*cmd & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) && | 424 | if ((*cmd & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) && |
| 425 | (*cmd & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { | 425 | (*cmd & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { |
| 426 | u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3); | 426 | u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3); |
| 427 | offset = *cmd << 10; | 427 | offset = *cmd3 << 10; |
| 428 | if (radeon_check_and_fixup_offset | 428 | if (radeon_check_and_fixup_offset |
| 429 | (dev_priv, file_priv, &offset)) { | 429 | (dev_priv, file_priv, &offset)) { |
| 430 | DRM_ERROR("Invalid second packet offset\n"); | 430 | DRM_ERROR("Invalid second packet offset\n"); |
| @@ -2895,9 +2895,12 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 2895 | return rv; | 2895 | return rv; |
| 2896 | rv = drm_buffer_copy_from_user(cmdbuf->buffer, buffer, | 2896 | rv = drm_buffer_copy_from_user(cmdbuf->buffer, buffer, |
| 2897 | cmdbuf->bufsz); | 2897 | cmdbuf->bufsz); |
| 2898 | if (rv) | 2898 | if (rv) { |
| 2899 | drm_buffer_free(cmdbuf->buffer); | ||
| 2899 | return rv; | 2900 | return rv; |
| 2900 | } | 2901 | } |
| 2902 | } else | ||
| 2903 | goto done; | ||
| 2901 | 2904 | ||
| 2902 | orig_nbox = cmdbuf->nbox; | 2905 | orig_nbox = cmdbuf->nbox; |
| 2903 | 2906 | ||
| @@ -2905,8 +2908,7 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 2905 | int temp; | 2908 | int temp; |
| 2906 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); | 2909 | temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf); |
| 2907 | 2910 | ||
| 2908 | if (cmdbuf->bufsz != 0) | 2911 | drm_buffer_free(cmdbuf->buffer); |
| 2909 | drm_buffer_free(cmdbuf->buffer); | ||
| 2910 | 2912 | ||
| 2911 | return temp; | 2913 | return temp; |
| 2912 | } | 2914 | } |
| @@ -3012,16 +3014,15 @@ static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, | |||
| 3012 | } | 3014 | } |
| 3013 | } | 3015 | } |
| 3014 | 3016 | ||
| 3015 | if (cmdbuf->bufsz != 0) | 3017 | drm_buffer_free(cmdbuf->buffer); |
| 3016 | drm_buffer_free(cmdbuf->buffer); | ||
| 3017 | 3018 | ||
| 3019 | done: | ||
| 3018 | DRM_DEBUG("DONE\n"); | 3020 | DRM_DEBUG("DONE\n"); |
| 3019 | COMMIT_RING(); | 3021 | COMMIT_RING(); |
| 3020 | return 0; | 3022 | return 0; |
| 3021 | 3023 | ||
| 3022 | err: | 3024 | err: |
| 3023 | if (cmdbuf->bufsz != 0) | 3025 | drm_buffer_free(cmdbuf->buffer); |
| 3024 | drm_buffer_free(cmdbuf->buffer); | ||
| 3025 | return -EINVAL; | 3026 | return -EINVAL; |
| 3026 | } | 3027 | } |
| 3027 | 3028 | ||
diff --git a/drivers/hid/hid-cherry.c b/drivers/hid/hid-cherry.c index 7e597d7f770f..24663a8717b1 100644 --- a/drivers/hid/hid-cherry.c +++ b/drivers/hid/hid-cherry.c | |||
| @@ -59,6 +59,7 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
| 59 | 59 | ||
| 60 | static const struct hid_device_id ch_devices[] = { | 60 | static const struct hid_device_id ch_devices[] = { |
| 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 61 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 62 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 62 | { } | 63 | { } |
| 63 | }; | 64 | }; |
| 64 | MODULE_DEVICE_TABLE(hid, ch_devices); | 65 | MODULE_DEVICE_TABLE(hid, ch_devices); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 2e2aa759d230..143e788b729b 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1043,13 +1043,8 @@ void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, | |||
| 1043 | 1043 | ||
| 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) | 1044 | if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) |
| 1045 | hid->hiddev_report_event(hid, report); | 1045 | hid->hiddev_report_event(hid, report); |
| 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) { | 1046 | if (hid->claimed & HID_CLAIMED_HIDRAW) |
| 1047 | /* numbered reports need to be passed with the report num */ | 1047 | hidraw_report_event(hid, data, size); |
| 1048 | if (report_enum->numbered) | ||
| 1049 | hidraw_report_event(hid, data - 1, size + 1); | ||
| 1050 | else | ||
| 1051 | hidraw_report_event(hid, data, size); | ||
| 1052 | } | ||
| 1053 | 1048 | ||
| 1054 | for (a = 0; a < report->maxfield; a++) | 1049 | for (a = 0; a < report->maxfield; a++) |
| 1055 | hid_input_field(hid, report->field[a], cdata, interrupt); | 1050 | hid_input_field(hid, report->field[a], cdata, interrupt); |
| @@ -1296,6 +1291,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, | 1291 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
| 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, | 1292 | { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
| 1298 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, | 1293 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
| 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) }, | ||
| 1299 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, | 1295 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, |
| 1300 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, | 1296 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
| 1301 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, | 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 797e06470356..09d27649a0f7 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -131,6 +131,7 @@ | |||
| 131 | 131 | ||
| 132 | #define USB_VENDOR_ID_CHERRY 0x046a | 132 | #define USB_VENDOR_ID_CHERRY 0x046a |
| 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 133 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
| 134 | #define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027 | ||
| 134 | 135 | ||
| 135 | #define USB_VENDOR_ID_CHIC 0x05fe | 136 | #define USB_VENDOR_ID_CHIC 0x05fe |
| 136 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 | 137 | #define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 |
diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c index 9b24fc510712..4777bbfa1cc2 100644 --- a/drivers/hid/hid-ntrig.c +++ b/drivers/hid/hid-ntrig.c | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * HID driver for N-Trig touchscreens | 2 | * HID driver for N-Trig touchscreens |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2008 Rafi Rubin | 4 | * Copyright (c) 2008-2010 Rafi Rubin |
| 5 | * Copyright (c) 2009 Stephane Chatty | 5 | * Copyright (c) 2009-2010 Stephane Chatty |
| 6 | * | 6 | * |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| @@ -15,6 +15,8 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/hid.h> | 17 | #include <linux/hid.h> |
| 18 | #include <linux/usb.h> | ||
| 19 | #include "usbhid/usbhid.h" | ||
| 18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
| 19 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| 20 | 22 | ||
| @@ -22,17 +24,16 @@ | |||
| 22 | 24 | ||
| 23 | #define NTRIG_DUPLICATE_USAGES 0x001 | 25 | #define NTRIG_DUPLICATE_USAGES 0x001 |
| 24 | 26 | ||
| 25 | #define nt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ | ||
| 26 | EV_KEY, (c)) | ||
| 27 | |||
| 28 | struct ntrig_data { | 27 | struct ntrig_data { |
| 29 | /* Incoming raw values for a single contact */ | 28 | /* Incoming raw values for a single contact */ |
| 30 | __u16 x, y, w, h; | 29 | __u16 x, y, w, h; |
| 31 | __u16 id; | 30 | __u16 id; |
| 32 | __u8 confidence; | 31 | |
| 32 | bool tipswitch; | ||
| 33 | bool confidence; | ||
| 34 | bool first_contact_touch; | ||
| 33 | 35 | ||
| 34 | bool reading_mt; | 36 | bool reading_mt; |
| 35 | __u8 first_contact_confidence; | ||
| 36 | 37 | ||
| 37 | __u8 mt_footer[4]; | 38 | __u8 mt_footer[4]; |
| 38 | __u8 mt_foot_count; | 39 | __u8 mt_foot_count; |
| @@ -139,9 +140,10 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 139 | case 0xff000001: | 140 | case 0xff000001: |
| 140 | /* Tag indicating the start of a multitouch group */ | 141 | /* Tag indicating the start of a multitouch group */ |
| 141 | nd->reading_mt = 1; | 142 | nd->reading_mt = 1; |
| 142 | nd->first_contact_confidence = 0; | 143 | nd->first_contact_touch = 0; |
| 143 | break; | 144 | break; |
| 144 | case HID_DG_TIPSWITCH: | 145 | case HID_DG_TIPSWITCH: |
| 146 | nd->tipswitch = value; | ||
| 145 | /* Prevent emission of touch until validated */ | 147 | /* Prevent emission of touch until validated */ |
| 146 | return 1; | 148 | return 1; |
| 147 | case HID_DG_CONFIDENCE: | 149 | case HID_DG_CONFIDENCE: |
| @@ -169,8 +171,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 169 | * to emit a normal (X, Y) position | 171 | * to emit a normal (X, Y) position |
| 170 | */ | 172 | */ |
| 171 | if (!nd->reading_mt) { | 173 | if (!nd->reading_mt) { |
| 174 | /* | ||
| 175 | * TipSwitch indicates the presence of a | ||
| 176 | * finger in single touch mode. | ||
| 177 | */ | ||
| 178 | input_report_key(input, BTN_TOUCH, | ||
| 179 | nd->tipswitch); | ||
| 172 | input_report_key(input, BTN_TOOL_DOUBLETAP, | 180 | input_report_key(input, BTN_TOOL_DOUBLETAP, |
| 173 | (nd->confidence != 0)); | 181 | nd->tipswitch); |
| 174 | input_event(input, EV_ABS, ABS_X, nd->x); | 182 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 175 | input_event(input, EV_ABS, ABS_Y, nd->y); | 183 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 176 | } | 184 | } |
| @@ -209,7 +217,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 209 | 217 | ||
| 210 | /* emit a normal (X, Y) for the first point only */ | 218 | /* emit a normal (X, Y) for the first point only */ |
| 211 | if (nd->id == 0) { | 219 | if (nd->id == 0) { |
| 212 | nd->first_contact_confidence = nd->confidence; | 220 | /* |
| 221 | * TipSwitch is superfluous in multitouch | ||
| 222 | * mode. The footer events tell us | ||
| 223 | * if there is a finger on the screen or | ||
| 224 | * not. | ||
| 225 | */ | ||
| 226 | nd->first_contact_touch = nd->confidence; | ||
| 213 | input_event(input, EV_ABS, ABS_X, nd->x); | 227 | input_event(input, EV_ABS, ABS_X, nd->x); |
| 214 | input_event(input, EV_ABS, ABS_Y, nd->y); | 228 | input_event(input, EV_ABS, ABS_Y, nd->y); |
| 215 | } | 229 | } |
| @@ -239,30 +253,11 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, | |||
| 239 | 253 | ||
| 240 | nd->reading_mt = 0; | 254 | nd->reading_mt = 0; |
| 241 | 255 | ||
| 242 | if (nd->first_contact_confidence) { | 256 | if (nd->first_contact_touch) { |
| 243 | switch (value) { | 257 | input_report_key(input, BTN_TOOL_DOUBLETAP, 1); |
| 244 | case 0: /* for single touch devices */ | ||
| 245 | case 1: | ||
| 246 | input_report_key(input, | ||
| 247 | BTN_TOOL_DOUBLETAP, 1); | ||
| 248 | break; | ||
| 249 | case 2: | ||
| 250 | input_report_key(input, | ||
| 251 | BTN_TOOL_TRIPLETAP, 1); | ||
| 252 | break; | ||
| 253 | case 3: | ||
| 254 | default: | ||
| 255 | input_report_key(input, | ||
| 256 | BTN_TOOL_QUADTAP, 1); | ||
| 257 | } | ||
| 258 | input_report_key(input, BTN_TOUCH, 1); | 258 | input_report_key(input, BTN_TOUCH, 1); |
| 259 | } else { | 259 | } else { |
| 260 | input_report_key(input, | 260 | input_report_key(input, BTN_TOOL_DOUBLETAP, 0); |
| 261 | BTN_TOOL_DOUBLETAP, 0); | ||
| 262 | input_report_key(input, | ||
| 263 | BTN_TOOL_TRIPLETAP, 0); | ||
| 264 | input_report_key(input, | ||
| 265 | BTN_TOOL_QUADTAP, 0); | ||
| 266 | input_report_key(input, BTN_TOUCH, 0); | 261 | input_report_key(input, BTN_TOUCH, 0); |
| 267 | } | 262 | } |
| 268 | break; | 263 | break; |
| @@ -286,6 +281,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 286 | struct ntrig_data *nd; | 281 | struct ntrig_data *nd; |
| 287 | struct hid_input *hidinput; | 282 | struct hid_input *hidinput; |
| 288 | struct input_dev *input; | 283 | struct input_dev *input; |
| 284 | struct hid_report *report; | ||
| 289 | 285 | ||
| 290 | if (id->driver_data) | 286 | if (id->driver_data) |
| 291 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; | 287 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
| @@ -327,13 +323,7 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 327 | __clear_bit(BTN_TOOL_PEN, input->keybit); | 323 | __clear_bit(BTN_TOOL_PEN, input->keybit); |
| 328 | __clear_bit(BTN_TOOL_FINGER, input->keybit); | 324 | __clear_bit(BTN_TOOL_FINGER, input->keybit); |
| 329 | __clear_bit(BTN_0, input->keybit); | 325 | __clear_bit(BTN_0, input->keybit); |
| 330 | /* | ||
| 331 | * A little something special to enable | ||
| 332 | * two and three finger taps. | ||
| 333 | */ | ||
| 334 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); | 326 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); |
| 335 | __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); | ||
| 336 | __set_bit(BTN_TOOL_QUADTAP, input->keybit); | ||
| 337 | /* | 327 | /* |
| 338 | * The physical touchscreen (single touch) | 328 | * The physical touchscreen (single touch) |
| 339 | * input has a value for physical, whereas | 329 | * input has a value for physical, whereas |
| @@ -349,6 +339,12 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
| 349 | } | 339 | } |
| 350 | } | 340 | } |
| 351 | 341 | ||
| 342 | /* This is needed for devices with more recent firmware versions */ | ||
| 343 | report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[0x0a]; | ||
| 344 | if (report) | ||
| 345 | usbhid_submit_report(hdev, report, USB_DIR_OUT); | ||
| 346 | |||
| 347 | |||
| 352 | return 0; | 348 | return 0; |
| 353 | err_free: | 349 | err_free: |
| 354 | kfree(nd); | 350 | kfree(nd); |
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c index 7502a4b2fa86..402d5574b574 100644 --- a/drivers/hid/hid-sony.c +++ b/drivers/hid/hid-sony.c | |||
| @@ -76,7 +76,7 @@ static int sony_set_operational_usb(struct hid_device *hdev) | |||
| 76 | 76 | ||
| 77 | static int sony_set_operational_bt(struct hid_device *hdev) | 77 | static int sony_set_operational_bt(struct hid_device *hdev) |
| 78 | { | 78 | { |
| 79 | unsigned char buf[] = { 0x53, 0xf4, 0x42, 0x03, 0x00, 0x00 }; | 79 | unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; |
| 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); | 80 | return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); |
| 81 | } | 81 | } |
| 82 | 82 | ||
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index f7700cf49721..f947d8337e21 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
| @@ -277,7 +277,6 @@ static int __init wacom_init(void) | |||
| 277 | ret = hid_register_driver(&wacom_driver); | 277 | ret = hid_register_driver(&wacom_driver); |
| 278 | if (ret) | 278 | if (ret) |
| 279 | printk(KERN_ERR "can't register wacom driver\n"); | 279 | printk(KERN_ERR "can't register wacom driver\n"); |
| 280 | printk(KERN_ERR "wacom driver registered\n"); | ||
| 281 | return ret; | 280 | return ret; |
| 282 | } | 281 | } |
| 283 | 282 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 56d06cd8075b..7b85b696fdab 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -999,13 +999,6 @@ static int usbhid_start(struct hid_device *hid) | |||
| 999 | } | 999 | } |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | init_waitqueue_head(&usbhid->wait); | ||
| 1003 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1004 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1005 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1006 | |||
| 1007 | spin_lock_init(&usbhid->lock); | ||
| 1008 | |||
| 1009 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); | 1002 | usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); |
| 1010 | if (!usbhid->urbctrl) { | 1003 | if (!usbhid->urbctrl) { |
| 1011 | ret = -ENOMEM; | 1004 | ret = -ENOMEM; |
| @@ -1179,6 +1172,12 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 1179 | usbhid->intf = intf; | 1172 | usbhid->intf = intf; |
| 1180 | usbhid->ifnum = interface->desc.bInterfaceNumber; | 1173 | usbhid->ifnum = interface->desc.bInterfaceNumber; |
| 1181 | 1174 | ||
| 1175 | init_waitqueue_head(&usbhid->wait); | ||
| 1176 | INIT_WORK(&usbhid->reset_work, hid_reset); | ||
| 1177 | INIT_WORK(&usbhid->restart_work, __usbhid_restart_queues); | ||
| 1178 | setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid); | ||
| 1179 | spin_lock_init(&usbhid->lock); | ||
| 1180 | |||
| 1182 | ret = hid_add_device(hid); | 1181 | ret = hid_add_device(hid); |
| 1183 | if (ret) { | 1182 | if (ret) { |
| 1184 | if (ret != -ENODEV) | 1183 | if (ret != -ENODEV) |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 0f28d91f29d8..f085c18d2905 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -195,6 +195,9 @@ static unsigned int applesmc_accelerometer; | |||
| 195 | /* Indicates whether this computer has light sensors and keyboard backlight. */ | 195 | /* Indicates whether this computer has light sensors and keyboard backlight. */ |
| 196 | static unsigned int applesmc_light; | 196 | static unsigned int applesmc_light; |
| 197 | 197 | ||
| 198 | /* The number of fans handled by the driver */ | ||
| 199 | static unsigned int fans_handled; | ||
| 200 | |||
| 198 | /* Indicates which temperature sensors set to use. */ | 201 | /* Indicates which temperature sensors set to use. */ |
| 199 | static unsigned int applesmc_temperature_set; | 202 | static unsigned int applesmc_temperature_set; |
| 200 | 203 | ||
| @@ -1492,39 +1495,24 @@ static int __init applesmc_init(void) | |||
| 1492 | 1495 | ||
| 1493 | /* create fan files */ | 1496 | /* create fan files */ |
| 1494 | count = applesmc_get_fan_count(); | 1497 | count = applesmc_get_fan_count(); |
| 1495 | if (count < 0) { | 1498 | if (count < 0) |
| 1496 | printk(KERN_ERR "applesmc: Cannot get the number of fans.\n"); | 1499 | printk(KERN_ERR "applesmc: Cannot get the number of fans.\n"); |
| 1497 | } else { | 1500 | else |
| 1498 | printk(KERN_INFO "applesmc: %d fans found.\n", count); | 1501 | printk(KERN_INFO "applesmc: %d fans found.\n", count); |
| 1499 | 1502 | ||
| 1500 | switch (count) { | 1503 | if (count > 4) { |
| 1501 | default: | 1504 | count = 4; |
| 1502 | printk(KERN_WARNING "applesmc: More than 4 fans found," | 1505 | printk(KERN_WARNING "applesmc: More than 4 fans found," |
| 1503 | " but at most 4 fans are supported" | 1506 | " but at most 4 fans are supported" |
| 1504 | " by the driver.\n"); | 1507 | " by the driver.\n"); |
| 1505 | case 4: | 1508 | } |
| 1506 | ret = sysfs_create_group(&pdev->dev.kobj, | 1509 | |
| 1507 | &fan_attribute_groups[3]); | 1510 | while (fans_handled < count) { |
| 1508 | if (ret) | 1511 | ret = sysfs_create_group(&pdev->dev.kobj, |
| 1509 | goto out_key_enumeration; | 1512 | &fan_attribute_groups[fans_handled]); |
| 1510 | case 3: | 1513 | if (ret) |
| 1511 | ret = sysfs_create_group(&pdev->dev.kobj, | 1514 | goto out_fans; |
| 1512 | &fan_attribute_groups[2]); | 1515 | fans_handled++; |
| 1513 | if (ret) | ||
| 1514 | goto out_key_enumeration; | ||
| 1515 | case 2: | ||
| 1516 | ret = sysfs_create_group(&pdev->dev.kobj, | ||
| 1517 | &fan_attribute_groups[1]); | ||
| 1518 | if (ret) | ||
| 1519 | goto out_key_enumeration; | ||
| 1520 | case 1: | ||
| 1521 | ret = sysfs_create_group(&pdev->dev.kobj, | ||
| 1522 | &fan_attribute_groups[0]); | ||
| 1523 | if (ret) | ||
| 1524 | goto out_fan_1; | ||
| 1525 | case 0: | ||
| 1526 | ; | ||
| 1527 | } | ||
| 1528 | } | 1516 | } |
| 1529 | 1517 | ||
| 1530 | for (i = 0; | 1518 | for (i = 0; |
| @@ -1593,10 +1581,10 @@ out_accelerometer: | |||
| 1593 | applesmc_release_accelerometer(); | 1581 | applesmc_release_accelerometer(); |
| 1594 | out_temperature: | 1582 | out_temperature: |
| 1595 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1583 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
| 1596 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); | 1584 | out_fans: |
| 1597 | out_fan_1: | 1585 | while (fans_handled) |
| 1598 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1586 | sysfs_remove_group(&pdev->dev.kobj, |
| 1599 | out_key_enumeration: | 1587 | &fan_attribute_groups[--fans_handled]); |
| 1600 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1588 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
| 1601 | out_name: | 1589 | out_name: |
| 1602 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | 1590 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); |
| @@ -1622,8 +1610,9 @@ static void __exit applesmc_exit(void) | |||
| 1622 | if (applesmc_accelerometer) | 1610 | if (applesmc_accelerometer) |
| 1623 | applesmc_release_accelerometer(); | 1611 | applesmc_release_accelerometer(); |
| 1624 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1612 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
| 1625 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); | 1613 | while (fans_handled) |
| 1626 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1614 | sysfs_remove_group(&pdev->dev.kobj, |
| 1615 | &fan_attribute_groups[--fans_handled]); | ||
| 1627 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1616 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
| 1628 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | 1617 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); |
| 1629 | platform_device_unregister(pdev); | 1618 | platform_device_unregister(pdev); |
diff --git a/drivers/hwmon/asc7621.c b/drivers/hwmon/asc7621.c index 7f948105d8ad..0f388adc6187 100644 --- a/drivers/hwmon/asc7621.c +++ b/drivers/hwmon/asc7621.c | |||
| @@ -268,8 +268,11 @@ static ssize_t store_fan16(struct device *dev, | |||
| 268 | if (strict_strtol(buf, 10, &reqval)) | 268 | if (strict_strtol(buf, 10, &reqval)) |
| 269 | return -EINVAL; | 269 | return -EINVAL; |
| 270 | 270 | ||
| 271 | /* If a minimum RPM of zero is requested, then we set the register to | ||
| 272 | 0xffff. This value allows the fan to be stopped completely without | ||
| 273 | generating an alarm. */ | ||
| 271 | reqval = | 274 | reqval = |
| 272 | (SENSORS_LIMIT((reqval) <= 0 ? 0 : 5400000 / (reqval), 0, 65534)); | 275 | (reqval <= 0 ? 0xffff : SENSORS_LIMIT(5400000 / reqval, 0, 0xfffe)); |
| 273 | 276 | ||
| 274 | mutex_lock(&data->update_lock); | 277 | mutex_lock(&data->update_lock); |
| 275 | data->reg[param->msb[0]] = (reqval >> 8) & 0xff; | 278 | data->reg[param->msb[0]] = (reqval >> 8) & 0xff; |
| @@ -285,8 +288,9 @@ static ssize_t store_fan16(struct device *dev, | |||
| 285 | * Voltages are scaled in the device so that the nominal voltage | 288 | * Voltages are scaled in the device so that the nominal voltage |
| 286 | * is 3/4ths of the 0-255 range (i.e. 192). | 289 | * is 3/4ths of the 0-255 range (i.e. 192). |
| 287 | * If all voltages are 'normal' then all voltage registers will | 290 | * If all voltages are 'normal' then all voltage registers will |
| 288 | * read 0xC0. This doesn't help us if we don't have a point of refernce. | 291 | * read 0xC0. |
| 289 | * The data sheet however provides us with the full scale value for each | 292 | * |
| 293 | * The data sheet provides us with the 3/4 scale value for each voltage | ||
| 290 | * which is stored in in_scaling. The sda->index parameter value provides | 294 | * which is stored in in_scaling. The sda->index parameter value provides |
| 291 | * the index into in_scaling. | 295 | * the index into in_scaling. |
| 292 | * | 296 | * |
| @@ -295,7 +299,7 @@ static ssize_t store_fan16(struct device *dev, | |||
| 295 | */ | 299 | */ |
| 296 | 300 | ||
| 297 | static int asc7621_in_scaling[] = { | 301 | static int asc7621_in_scaling[] = { |
| 298 | 3320, 3000, 4380, 6640, 16000 | 302 | 2500, 2250, 3300, 5000, 12000 |
| 299 | }; | 303 | }; |
| 300 | 304 | ||
| 301 | static ssize_t show_in10(struct device *dev, struct device_attribute *attr, | 305 | static ssize_t show_in10(struct device *dev, struct device_attribute *attr, |
| @@ -306,19 +310,12 @@ static ssize_t show_in10(struct device *dev, struct device_attribute *attr, | |||
| 306 | u8 nr = sda->index; | 310 | u8 nr = sda->index; |
| 307 | 311 | ||
| 308 | mutex_lock(&data->update_lock); | 312 | mutex_lock(&data->update_lock); |
| 309 | regval = (data->reg[param->msb[0]] * asc7621_in_scaling[nr]) / 256; | 313 | regval = (data->reg[param->msb[0]] << 8) | (data->reg[param->lsb[0]]); |
| 310 | |||
| 311 | /* The LSB value is a 2-bit scaling of the MSB's LSbit value. | ||
| 312 | * I.E. If the maximim voltage for this input is 6640 millivolts then | ||
| 313 | * a MSB register value of 0 = 0mv and 255 = 6640mv. | ||
| 314 | * A 1 step change therefore represents 25.9mv (6640 / 256). | ||
| 315 | * The extra 2-bits therefore represent increments of 6.48mv. | ||
| 316 | */ | ||
| 317 | regval += ((asc7621_in_scaling[nr] / 256) / 4) * | ||
| 318 | (data->reg[param->lsb[0]] >> 6); | ||
| 319 | |||
| 320 | mutex_unlock(&data->update_lock); | 314 | mutex_unlock(&data->update_lock); |
| 321 | 315 | ||
| 316 | /* The LSB value is a 2-bit scaling of the MSB's LSbit value. */ | ||
| 317 | regval = (regval >> 6) * asc7621_in_scaling[nr] / (0xc0 << 2); | ||
| 318 | |||
| 322 | return sprintf(buf, "%u\n", regval); | 319 | return sprintf(buf, "%u\n", regval); |
| 323 | } | 320 | } |
| 324 | 321 | ||
| @@ -331,7 +328,7 @@ static ssize_t show_in8(struct device *dev, struct device_attribute *attr, | |||
| 331 | 328 | ||
| 332 | return sprintf(buf, "%u\n", | 329 | return sprintf(buf, "%u\n", |
| 333 | ((data->reg[param->msb[0]] * | 330 | ((data->reg[param->msb[0]] * |
| 334 | asc7621_in_scaling[nr]) / 256)); | 331 | asc7621_in_scaling[nr]) / 0xc0)); |
| 335 | } | 332 | } |
| 336 | 333 | ||
| 337 | static ssize_t store_in8(struct device *dev, struct device_attribute *attr, | 334 | static ssize_t store_in8(struct device *dev, struct device_attribute *attr, |
| @@ -344,9 +341,11 @@ static ssize_t store_in8(struct device *dev, struct device_attribute *attr, | |||
| 344 | if (strict_strtol(buf, 10, &reqval)) | 341 | if (strict_strtol(buf, 10, &reqval)) |
| 345 | return -EINVAL; | 342 | return -EINVAL; |
| 346 | 343 | ||
| 347 | reqval = SENSORS_LIMIT(reqval, 0, asc7621_in_scaling[nr]); | 344 | reqval = SENSORS_LIMIT(reqval, 0, 0xffff); |
| 345 | |||
| 346 | reqval = reqval * 0xc0 / asc7621_in_scaling[nr]; | ||
| 348 | 347 | ||
| 349 | reqval = (reqval * 255 + 128) / asc7621_in_scaling[nr]; | 348 | reqval = SENSORS_LIMIT(reqval, 0, 0xff); |
| 350 | 349 | ||
| 351 | mutex_lock(&data->update_lock); | 350 | mutex_lock(&data->update_lock); |
| 352 | data->reg[param->msb[0]] = reqval; | 351 | data->reg[param->msb[0]] = reqval; |
| @@ -846,11 +845,11 @@ static struct asc7621_param asc7621_params[] = { | |||
| 846 | PWRITE(in3_max, 3, PRI_LOW, 0x4b, 0, 0, 0, in8), | 845 | PWRITE(in3_max, 3, PRI_LOW, 0x4b, 0, 0, 0, in8), |
| 847 | PWRITE(in4_max, 4, PRI_LOW, 0x4d, 0, 0, 0, in8), | 846 | PWRITE(in4_max, 4, PRI_LOW, 0x4d, 0, 0, 0, in8), |
| 848 | 847 | ||
| 849 | PREAD(in0_alarm, 0, PRI_LOW, 0x41, 0, 0x01, 0, bitmask), | 848 | PREAD(in0_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 0, bitmask), |
| 850 | PREAD(in1_alarm, 1, PRI_LOW, 0x41, 0, 0x01, 1, bitmask), | 849 | PREAD(in1_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 1, bitmask), |
| 851 | PREAD(in2_alarm, 2, PRI_LOW, 0x41, 0, 0x01, 2, bitmask), | 850 | PREAD(in2_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 2, bitmask), |
| 852 | PREAD(in3_alarm, 3, PRI_LOW, 0x41, 0, 0x01, 3, bitmask), | 851 | PREAD(in3_alarm, 3, PRI_HIGH, 0x41, 0, 0x01, 3, bitmask), |
| 853 | PREAD(in4_alarm, 4, PRI_LOW, 0x42, 0, 0x01, 0, bitmask), | 852 | PREAD(in4_alarm, 4, PRI_HIGH, 0x42, 0, 0x01, 0, bitmask), |
| 854 | 853 | ||
| 855 | PREAD(fan1_input, 0, PRI_HIGH, 0x29, 0x28, 0, 0, fan16), | 854 | PREAD(fan1_input, 0, PRI_HIGH, 0x29, 0x28, 0, 0, fan16), |
| 856 | PREAD(fan2_input, 1, PRI_HIGH, 0x2b, 0x2a, 0, 0, fan16), | 855 | PREAD(fan2_input, 1, PRI_HIGH, 0x2b, 0x2a, 0, 0, fan16), |
| @@ -862,10 +861,10 @@ static struct asc7621_param asc7621_params[] = { | |||
| 862 | PWRITE(fan3_min, 2, PRI_LOW, 0x59, 0x58, 0, 0, fan16), | 861 | PWRITE(fan3_min, 2, PRI_LOW, 0x59, 0x58, 0, 0, fan16), |
| 863 | PWRITE(fan4_min, 3, PRI_LOW, 0x5b, 0x5a, 0, 0, fan16), | 862 | PWRITE(fan4_min, 3, PRI_LOW, 0x5b, 0x5a, 0, 0, fan16), |
| 864 | 863 | ||
| 865 | PREAD(fan1_alarm, 0, PRI_LOW, 0x42, 0, 0x01, 0, bitmask), | 864 | PREAD(fan1_alarm, 0, PRI_HIGH, 0x42, 0, 0x01, 2, bitmask), |
| 866 | PREAD(fan2_alarm, 1, PRI_LOW, 0x42, 0, 0x01, 1, bitmask), | 865 | PREAD(fan2_alarm, 1, PRI_HIGH, 0x42, 0, 0x01, 3, bitmask), |
| 867 | PREAD(fan3_alarm, 2, PRI_LOW, 0x42, 0, 0x01, 2, bitmask), | 866 | PREAD(fan3_alarm, 2, PRI_HIGH, 0x42, 0, 0x01, 4, bitmask), |
| 868 | PREAD(fan4_alarm, 3, PRI_LOW, 0x42, 0, 0x01, 3, bitmask), | 867 | PREAD(fan4_alarm, 3, PRI_HIGH, 0x42, 0, 0x01, 5, bitmask), |
| 869 | 868 | ||
| 870 | PREAD(temp1_input, 0, PRI_HIGH, 0x25, 0x10, 0, 0, temp10), | 869 | PREAD(temp1_input, 0, PRI_HIGH, 0x25, 0x10, 0, 0, temp10), |
| 871 | PREAD(temp2_input, 1, PRI_HIGH, 0x26, 0x15, 0, 0, temp10), | 870 | PREAD(temp2_input, 1, PRI_HIGH, 0x26, 0x15, 0, 0, temp10), |
| @@ -886,10 +885,10 @@ static struct asc7621_param asc7621_params[] = { | |||
| 886 | PWRITE(temp3_max, 2, PRI_LOW, 0x53, 0, 0, 0, temp8), | 885 | PWRITE(temp3_max, 2, PRI_LOW, 0x53, 0, 0, 0, temp8), |
| 887 | PWRITE(temp4_max, 3, PRI_LOW, 0x35, 0, 0, 0, temp8), | 886 | PWRITE(temp4_max, 3, PRI_LOW, 0x35, 0, 0, 0, temp8), |
| 888 | 887 | ||
| 889 | PREAD(temp1_alarm, 0, PRI_LOW, 0x41, 0, 0x01, 4, bitmask), | 888 | PREAD(temp1_alarm, 0, PRI_HIGH, 0x41, 0, 0x01, 4, bitmask), |
| 890 | PREAD(temp2_alarm, 1, PRI_LOW, 0x41, 0, 0x01, 5, bitmask), | 889 | PREAD(temp2_alarm, 1, PRI_HIGH, 0x41, 0, 0x01, 5, bitmask), |
| 891 | PREAD(temp3_alarm, 2, PRI_LOW, 0x41, 0, 0x01, 6, bitmask), | 890 | PREAD(temp3_alarm, 2, PRI_HIGH, 0x41, 0, 0x01, 6, bitmask), |
| 892 | PREAD(temp4_alarm, 3, PRI_LOW, 0x43, 0, 0x01, 0, bitmask), | 891 | PREAD(temp4_alarm, 3, PRI_HIGH, 0x43, 0, 0x01, 0, bitmask), |
| 893 | 892 | ||
| 894 | PWRITE(temp1_source, 0, PRI_LOW, 0x02, 0, 0x07, 4, bitmask), | 893 | PWRITE(temp1_source, 0, PRI_LOW, 0x02, 0, 0x07, 4, bitmask), |
| 895 | PWRITE(temp2_source, 1, PRI_LOW, 0x02, 0, 0x07, 0, bitmask), | 894 | PWRITE(temp2_source, 1, PRI_LOW, 0x02, 0, 0x07, 0, bitmask), |
| @@ -898,7 +897,7 @@ static struct asc7621_param asc7621_params[] = { | |||
| 898 | 897 | ||
| 899 | PWRITE(temp1_smoothing_enable, 0, PRI_LOW, 0x62, 0, 0x01, 3, bitmask), | 898 | PWRITE(temp1_smoothing_enable, 0, PRI_LOW, 0x62, 0, 0x01, 3, bitmask), |
| 900 | PWRITE(temp2_smoothing_enable, 1, PRI_LOW, 0x63, 0, 0x01, 7, bitmask), | 899 | PWRITE(temp2_smoothing_enable, 1, PRI_LOW, 0x63, 0, 0x01, 7, bitmask), |
| 901 | PWRITE(temp3_smoothing_enable, 2, PRI_LOW, 0x64, 0, 0x01, 3, bitmask), | 900 | PWRITE(temp3_smoothing_enable, 2, PRI_LOW, 0x63, 0, 0x01, 3, bitmask), |
| 902 | PWRITE(temp4_smoothing_enable, 3, PRI_LOW, 0x3c, 0, 0x01, 3, bitmask), | 901 | PWRITE(temp4_smoothing_enable, 3, PRI_LOW, 0x3c, 0, 0x01, 3, bitmask), |
| 903 | 902 | ||
| 904 | PWRITE(temp1_smoothing_time, 0, PRI_LOW, 0x62, 0, 0x07, 0, temp_st), | 903 | PWRITE(temp1_smoothing_time, 0, PRI_LOW, 0x62, 0, 0x07, 0, temp_st), |
diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c index c8ab50516672..7580f55e67e3 100644 --- a/drivers/hwmon/hp_accel.c +++ b/drivers/hwmon/hp_accel.c | |||
| @@ -328,8 +328,8 @@ static int lis3lv02d_remove(struct acpi_device *device, int type) | |||
| 328 | lis3lv02d_joystick_disable(); | 328 | lis3lv02d_joystick_disable(); |
| 329 | lis3lv02d_poweroff(&lis3_dev); | 329 | lis3lv02d_poweroff(&lis3_dev); |
| 330 | 330 | ||
| 331 | flush_work(&hpled_led.work); | ||
| 332 | led_classdev_unregister(&hpled_led.led_classdev); | 331 | led_classdev_unregister(&hpled_led.led_classdev); |
| 332 | flush_work(&hpled_led.work); | ||
| 333 | 333 | ||
| 334 | return lis3lv02d_remove_fs(&lis3_dev); | 334 | return lis3lv02d_remove_fs(&lis3_dev); |
| 335 | } | 335 | } |
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index b1edd778639c..405febd94f24 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
| @@ -54,6 +54,9 @@ static signed short btn_avb_wheel[] = | |||
| 54 | static signed short abs_joystick[] = | 54 | static signed short abs_joystick[] = |
| 55 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; | 55 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; |
| 56 | 56 | ||
| 57 | static signed short abs_joystick_rudder[] = | ||
| 58 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, -1 }; | ||
| 59 | |||
| 57 | static signed short abs_avb_pegasus[] = | 60 | static signed short abs_avb_pegasus[] = |
| 58 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, | 61 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, |
| 59 | ABS_HAT1X, ABS_HAT1Y, -1 }; | 62 | ABS_HAT1X, ABS_HAT1Y, -1 }; |
| @@ -76,8 +79,9 @@ static struct iforce_device iforce_device[] = { | |||
| 76 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? | 79 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? |
| 77 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, | 80 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, |
| 78 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? | 81 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? |
| 82 | { 0x06f8, 0x0001, "Guillemot Jet Leader Force Feedback", btn_joystick, abs_joystick_rudder, ff_iforce }, | ||
| 79 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? | 83 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? |
| 80 | { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | 84 | { 0x06f8, 0xa302, "Guillemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? |
| 81 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, | 85 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, |
| 82 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } | 86 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } |
| 83 | }; | 87 | }; |
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index b41303d3ec54..6c96631ae5d9 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
| @@ -212,6 +212,7 @@ static struct usb_device_id iforce_usb_ids [] = { | |||
| 212 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ | 212 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ |
| 213 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ | 213 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ |
| 214 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ | 214 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ |
| 215 | { USB_DEVICE(0x06f8, 0x0003) }, /* Guillemot Jet Leader Force Feedback */ | ||
| 215 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ | 216 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ |
| 216 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ | 217 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ |
| 217 | { } /* Terminating entry */ | 218 | { } /* Terminating entry */ |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 0520c2e19927..112b4ee52ff2 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
| @@ -185,7 +185,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) | |||
| 185 | int fingers; | 185 | int fingers; |
| 186 | static int old_fingers; | 186 | static int old_fingers; |
| 187 | 187 | ||
| 188 | if (etd->fw_version_maj == 0x01) { | 188 | if (etd->fw_version < 0x020000) { |
| 189 | /* | 189 | /* |
| 190 | * byte 0: D U p1 p2 1 p3 R L | 190 | * byte 0: D U p1 p2 1 p3 R L |
| 191 | * byte 1: f 0 th tw x9 x8 y9 y8 | 191 | * byte 1: f 0 th tw x9 x8 y9 y8 |
| @@ -227,7 +227,7 @@ static void elantech_report_absolute_v1(struct psmouse *psmouse) | |||
| 227 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); | 227 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
| 228 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); | 228 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
| 229 | 229 | ||
| 230 | if ((etd->fw_version_maj == 0x01) && | 230 | if (etd->fw_version < 0x020000 && |
| 231 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { | 231 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
| 232 | /* rocker up */ | 232 | /* rocker up */ |
| 233 | input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); | 233 | input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); |
| @@ -321,7 +321,7 @@ static int elantech_check_parity_v1(struct psmouse *psmouse) | |||
| 321 | unsigned char p1, p2, p3; | 321 | unsigned char p1, p2, p3; |
| 322 | 322 | ||
| 323 | /* Parity bits are placed differently */ | 323 | /* Parity bits are placed differently */ |
| 324 | if (etd->fw_version_maj == 0x01) { | 324 | if (etd->fw_version < 0x020000) { |
| 325 | /* byte 0: D U p1 p2 1 p3 R L */ | 325 | /* byte 0: D U p1 p2 1 p3 R L */ |
| 326 | p1 = (packet[0] & 0x20) >> 5; | 326 | p1 = (packet[0] & 0x20) >> 5; |
| 327 | p2 = (packet[0] & 0x10) >> 4; | 327 | p2 = (packet[0] & 0x10) >> 4; |
| @@ -457,7 +457,7 @@ static void elantech_set_input_params(struct psmouse *psmouse) | |||
| 457 | switch (etd->hw_version) { | 457 | switch (etd->hw_version) { |
| 458 | case 1: | 458 | case 1: |
| 459 | /* Rocker button */ | 459 | /* Rocker button */ |
| 460 | if ((etd->fw_version_maj == 0x01) && | 460 | if (etd->fw_version < 0x020000 && |
| 461 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { | 461 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
| 462 | __set_bit(BTN_FORWARD, dev->keybit); | 462 | __set_bit(BTN_FORWARD, dev->keybit); |
| 463 | __set_bit(BTN_BACK, dev->keybit); | 463 | __set_bit(BTN_BACK, dev->keybit); |
| @@ -686,15 +686,14 @@ int elantech_init(struct psmouse *psmouse) | |||
| 686 | pr_err("elantech.c: failed to query firmware version.\n"); | 686 | pr_err("elantech.c: failed to query firmware version.\n"); |
| 687 | goto init_fail; | 687 | goto init_fail; |
| 688 | } | 688 | } |
| 689 | etd->fw_version_maj = param[0]; | 689 | |
| 690 | etd->fw_version_min = param[2]; | 690 | etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; |
| 691 | 691 | ||
| 692 | /* | 692 | /* |
| 693 | * Assume every version greater than this is new EeePC style | 693 | * Assume every version greater than this is new EeePC style |
| 694 | * hardware with 6 byte packets | 694 | * hardware with 6 byte packets |
| 695 | */ | 695 | */ |
| 696 | if ((etd->fw_version_maj == 0x02 && etd->fw_version_min >= 0x30) || | 696 | if (etd->fw_version >= 0x020030) { |
| 697 | etd->fw_version_maj > 0x02) { | ||
| 698 | etd->hw_version = 2; | 697 | etd->hw_version = 2; |
| 699 | /* For now show extra debug information */ | 698 | /* For now show extra debug information */ |
| 700 | etd->debug = 1; | 699 | etd->debug = 1; |
| @@ -704,8 +703,9 @@ int elantech_init(struct psmouse *psmouse) | |||
| 704 | etd->hw_version = 1; | 703 | etd->hw_version = 1; |
| 705 | etd->paritycheck = 1; | 704 | etd->paritycheck = 1; |
| 706 | } | 705 | } |
| 707 | pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d\n", | 706 | |
| 708 | etd->hw_version, etd->fw_version_maj, etd->fw_version_min); | 707 | pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d.%d\n", |
| 708 | etd->hw_version, param[0], param[1], param[2]); | ||
| 709 | 709 | ||
| 710 | if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { | 710 | if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { |
| 711 | pr_err("elantech.c: failed to query capabilities.\n"); | 711 | pr_err("elantech.c: failed to query capabilities.\n"); |
| @@ -720,8 +720,8 @@ int elantech_init(struct psmouse *psmouse) | |||
| 720 | * a touch action starts causing the mouse cursor or scrolled page | 720 | * a touch action starts causing the mouse cursor or scrolled page |
| 721 | * to jump. Enable a workaround. | 721 | * to jump. Enable a workaround. |
| 722 | */ | 722 | */ |
| 723 | if (etd->fw_version_maj == 0x02 && etd->fw_version_min == 0x22) { | 723 | if (etd->fw_version == 0x020022) { |
| 724 | pr_info("elantech.c: firmware version 2.34 detected, " | 724 | pr_info("elantech.c: firmware version 2.0.34 detected, " |
| 725 | "enabling jumpy cursor workaround\n"); | 725 | "enabling jumpy cursor workaround\n"); |
| 726 | etd->jumpy_cursor = 1; | 726 | etd->jumpy_cursor = 1; |
| 727 | } | 727 | } |
diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h index feac5f7af966..ac57bde1bb9f 100644 --- a/drivers/input/mouse/elantech.h +++ b/drivers/input/mouse/elantech.h | |||
| @@ -100,11 +100,10 @@ struct elantech_data { | |||
| 100 | unsigned char reg_26; | 100 | unsigned char reg_26; |
| 101 | unsigned char debug; | 101 | unsigned char debug; |
| 102 | unsigned char capabilities; | 102 | unsigned char capabilities; |
| 103 | unsigned char fw_version_maj; | ||
| 104 | unsigned char fw_version_min; | ||
| 105 | unsigned char hw_version; | ||
| 106 | unsigned char paritycheck; | 103 | unsigned char paritycheck; |
| 107 | unsigned char jumpy_cursor; | 104 | unsigned char jumpy_cursor; |
| 105 | unsigned char hw_version; | ||
| 106 | unsigned int fw_version; | ||
| 108 | unsigned char parity[256]; | 107 | unsigned char parity[256]; |
| 109 | }; | 108 | }; |
| 110 | 109 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index cbc807264940..a3c97315a473 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
| @@ -1394,6 +1394,7 @@ static int psmouse_reconnect(struct serio *serio) | |||
| 1394 | struct psmouse *psmouse = serio_get_drvdata(serio); | 1394 | struct psmouse *psmouse = serio_get_drvdata(serio); |
| 1395 | struct psmouse *parent = NULL; | 1395 | struct psmouse *parent = NULL; |
| 1396 | struct serio_driver *drv = serio->drv; | 1396 | struct serio_driver *drv = serio->drv; |
| 1397 | unsigned char type; | ||
| 1397 | int rc = -1; | 1398 | int rc = -1; |
| 1398 | 1399 | ||
| 1399 | if (!drv || !psmouse) { | 1400 | if (!drv || !psmouse) { |
| @@ -1413,10 +1414,15 @@ static int psmouse_reconnect(struct serio *serio) | |||
| 1413 | if (psmouse->reconnect) { | 1414 | if (psmouse->reconnect) { |
| 1414 | if (psmouse->reconnect(psmouse)) | 1415 | if (psmouse->reconnect(psmouse)) |
| 1415 | goto out; | 1416 | goto out; |
| 1416 | } else if (psmouse_probe(psmouse) < 0 || | 1417 | } else { |
| 1417 | psmouse->type != psmouse_extensions(psmouse, | 1418 | psmouse_reset(psmouse); |
| 1418 | psmouse_max_proto, false)) { | 1419 | |
| 1419 | goto out; | 1420 | if (psmouse_probe(psmouse) < 0) |
| 1421 | goto out; | ||
| 1422 | |||
| 1423 | type = psmouse_extensions(psmouse, psmouse_max_proto, false); | ||
| 1424 | if (psmouse->type != type) | ||
| 1425 | goto out; | ||
| 1420 | } | 1426 | } |
| 1421 | 1427 | ||
| 1422 | /* ok, the device type (and capabilities) match the old one, | 1428 | /* ok, the device type (and capabilities) match the old one, |
diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c index e019d53d1ab4..0d2d7e54b465 100644 --- a/drivers/input/touchscreen/ad7877.c +++ b/drivers/input/touchscreen/ad7877.c | |||
| @@ -156,9 +156,14 @@ struct ser_req { | |||
| 156 | u16 reset; | 156 | u16 reset; |
| 157 | u16 ref_on; | 157 | u16 ref_on; |
| 158 | u16 command; | 158 | u16 command; |
| 159 | u16 sample; | ||
| 160 | struct spi_message msg; | 159 | struct spi_message msg; |
| 161 | struct spi_transfer xfer[6]; | 160 | struct spi_transfer xfer[6]; |
| 161 | |||
| 162 | /* | ||
| 163 | * DMA (thus cache coherency maintenance) requires the | ||
| 164 | * transfer buffers to live in their own cache lines. | ||
| 165 | */ | ||
| 166 | u16 sample ____cacheline_aligned; | ||
| 162 | }; | 167 | }; |
| 163 | 168 | ||
| 164 | struct ad7877 { | 169 | struct ad7877 { |
| @@ -182,8 +187,6 @@ struct ad7877 { | |||
| 182 | u8 averaging; | 187 | u8 averaging; |
| 183 | u8 pen_down_acc_interval; | 188 | u8 pen_down_acc_interval; |
| 184 | 189 | ||
| 185 | u16 conversion_data[AD7877_NR_SENSE]; | ||
| 186 | |||
| 187 | struct spi_transfer xfer[AD7877_NR_SENSE + 2]; | 190 | struct spi_transfer xfer[AD7877_NR_SENSE + 2]; |
| 188 | struct spi_message msg; | 191 | struct spi_message msg; |
| 189 | 192 | ||
| @@ -195,6 +198,12 @@ struct ad7877 { | |||
| 195 | spinlock_t lock; | 198 | spinlock_t lock; |
| 196 | struct timer_list timer; /* P: lock */ | 199 | struct timer_list timer; /* P: lock */ |
| 197 | unsigned pending:1; /* P: lock */ | 200 | unsigned pending:1; /* P: lock */ |
| 201 | |||
| 202 | /* | ||
| 203 | * DMA (thus cache coherency maintenance) requires the | ||
| 204 | * transfer buffers to live in their own cache lines. | ||
| 205 | */ | ||
| 206 | u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; | ||
| 198 | }; | 207 | }; |
| 199 | 208 | ||
| 200 | static int gpio3; | 209 | static int gpio3; |
diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c index a3d5728b6449..f2ab025ad97a 100644 --- a/drivers/mfd/wm831x-core.c +++ b/drivers/mfd/wm831x-core.c | |||
| @@ -349,6 +349,9 @@ int wm831x_auxadc_read(struct wm831x *wm831x, enum wm831x_auxadc input) | |||
| 349 | goto disable; | 349 | goto disable; |
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | /* If an interrupt arrived late clean up after it */ | ||
| 353 | try_wait_for_completion(&wm831x->auxadc_done); | ||
| 354 | |||
| 352 | /* Ignore the result to allow us to soldier on without IRQ hookup */ | 355 | /* Ignore the result to allow us to soldier on without IRQ hookup */ |
| 353 | wait_for_completion_timeout(&wm831x->auxadc_done, msecs_to_jiffies(5)); | 356 | wait_for_completion_timeout(&wm831x->auxadc_done, msecs_to_jiffies(5)); |
| 354 | 357 | ||
diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c index e400a3bed063..b5807484b4c9 100644 --- a/drivers/mfd/wm8350-core.c +++ b/drivers/mfd/wm8350-core.c | |||
| @@ -363,6 +363,10 @@ int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref) | |||
| 363 | reg |= 1 << channel | WM8350_AUXADC_POLL; | 363 | reg |= 1 << channel | WM8350_AUXADC_POLL; |
| 364 | wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg); | 364 | wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg); |
| 365 | 365 | ||
| 366 | /* If a late IRQ left the completion signalled then consume | ||
| 367 | * the completion. */ | ||
| 368 | try_wait_for_completion(&wm8350->auxadc_done); | ||
| 369 | |||
| 366 | /* We ignore the result of the completion and just check for a | 370 | /* We ignore the result of the completion and just check for a |
| 367 | * conversion result, allowing us to soldier on if the IRQ | 371 | * conversion result, allowing us to soldier on if the IRQ |
| 368 | * infrastructure is not set up for the chip. */ | 372 | * infrastructure is not set up for the chip. */ |
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index a6dd7da37357..336d9f553f3e 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c | |||
| @@ -314,8 +314,8 @@ static void at91_mci_post_dma_read(struct at91mci_host *host) | |||
| 314 | dmabuf = (unsigned *)tmpv; | 314 | dmabuf = (unsigned *)tmpv; |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | flush_kernel_dcache_page(sg_page(sg)); | ||
| 317 | kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ); | 318 | kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ); |
| 318 | dmac_flush_range((void *)sgbuffer, ((void *)sgbuffer) + amount); | ||
| 319 | data->bytes_xfered += amount; | 319 | data->bytes_xfered += amount; |
| 320 | if (size == 0) | 320 | if (size == 0) |
| 321 | break; | 321 | break; |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 88be37d9e9a5..fb279f4ed8b3 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -266,7 +266,7 @@ static int atmci_req_show(struct seq_file *s, void *v) | |||
| 266 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", | 266 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", |
| 267 | cmd->opcode, cmd->arg, cmd->flags, | 267 | cmd->opcode, cmd->arg, cmd->flags, |
| 268 | cmd->resp[0], cmd->resp[1], cmd->resp[2], | 268 | cmd->resp[0], cmd->resp[1], cmd->resp[2], |
| 269 | cmd->resp[2], cmd->error); | 269 | cmd->resp[3], cmd->error); |
| 270 | if (data) | 270 | if (data) |
| 271 | seq_printf(s, "DATA %u / %u * %u flg %x err %d\n", | 271 | seq_printf(s, "DATA %u / %u * %u flg %x err %d\n", |
| 272 | data->bytes_xfered, data->blocks, | 272 | data->bytes_xfered, data->blocks, |
| @@ -276,7 +276,7 @@ static int atmci_req_show(struct seq_file *s, void *v) | |||
| 276 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", | 276 | "CMD%u(0x%x) flg %x rsp %x %x %x %x err %d\n", |
| 277 | stop->opcode, stop->arg, stop->flags, | 277 | stop->opcode, stop->arg, stop->flags, |
| 278 | stop->resp[0], stop->resp[1], stop->resp[2], | 278 | stop->resp[0], stop->resp[1], stop->resp[2], |
| 279 | stop->resp[2], stop->error); | 279 | stop->resp[3], stop->error); |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | spin_unlock_bh(&slot->host->lock); | 282 | spin_unlock_bh(&slot->host->lock); |
| @@ -569,9 +569,10 @@ static void atmci_dma_cleanup(struct atmel_mci *host) | |||
| 569 | { | 569 | { |
| 570 | struct mmc_data *data = host->data; | 570 | struct mmc_data *data = host->data; |
| 571 | 571 | ||
| 572 | dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, | 572 | if (data) |
| 573 | ((data->flags & MMC_DATA_WRITE) | 573 | dma_unmap_sg(&host->pdev->dev, data->sg, data->sg_len, |
| 574 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | 574 | ((data->flags & MMC_DATA_WRITE) |
| 575 | ? DMA_TO_DEVICE : DMA_FROM_DEVICE)); | ||
| 575 | } | 576 | } |
| 576 | 577 | ||
| 577 | static void atmci_stop_dma(struct atmel_mci *host) | 578 | static void atmci_stop_dma(struct atmel_mci *host) |
| @@ -1099,8 +1100,8 @@ static void atmci_command_complete(struct atmel_mci *host, | |||
| 1099 | "command error: status=0x%08x\n", status); | 1100 | "command error: status=0x%08x\n", status); |
| 1100 | 1101 | ||
| 1101 | if (cmd->data) { | 1102 | if (cmd->data) { |
| 1102 | host->data = NULL; | ||
| 1103 | atmci_stop_dma(host); | 1103 | atmci_stop_dma(host); |
| 1104 | host->data = NULL; | ||
| 1104 | mci_writel(host, IDR, MCI_NOTBUSY | 1105 | mci_writel(host, IDR, MCI_NOTBUSY |
| 1105 | | MCI_TXRDY | MCI_RXRDY | 1106 | | MCI_TXRDY | MCI_RXRDY |
| 1106 | | ATMCI_DATA_ERROR_FLAGS); | 1107 | | ATMCI_DATA_ERROR_FLAGS); |
| @@ -1293,6 +1294,7 @@ static void atmci_tasklet_func(unsigned long priv) | |||
| 1293 | } else { | 1294 | } else { |
| 1294 | data->bytes_xfered = data->blocks * data->blksz; | 1295 | data->bytes_xfered = data->blocks * data->blksz; |
| 1295 | data->error = 0; | 1296 | data->error = 0; |
| 1297 | mci_writel(host, IDR, ATMCI_DATA_ERROR_FLAGS); | ||
| 1296 | } | 1298 | } |
| 1297 | 1299 | ||
| 1298 | if (!data->stop) { | 1300 | if (!data->stop) { |
| @@ -1751,13 +1753,13 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
| 1751 | ret = -ENODEV; | 1753 | ret = -ENODEV; |
| 1752 | if (pdata->slot[0].bus_width) { | 1754 | if (pdata->slot[0].bus_width) { |
| 1753 | ret = atmci_init_slot(host, &pdata->slot[0], | 1755 | ret = atmci_init_slot(host, &pdata->slot[0], |
| 1754 | MCI_SDCSEL_SLOT_A, 0); | 1756 | 0, MCI_SDCSEL_SLOT_A); |
| 1755 | if (!ret) | 1757 | if (!ret) |
| 1756 | nr_slots++; | 1758 | nr_slots++; |
| 1757 | } | 1759 | } |
| 1758 | if (pdata->slot[1].bus_width) { | 1760 | if (pdata->slot[1].bus_width) { |
| 1759 | ret = atmci_init_slot(host, &pdata->slot[1], | 1761 | ret = atmci_init_slot(host, &pdata->slot[1], |
| 1760 | MCI_SDCSEL_SLOT_B, 1); | 1762 | 1, MCI_SDCSEL_SLOT_B); |
| 1761 | if (!ret) | 1763 | if (!ret) |
| 1762 | nr_slots++; | 1764 | nr_slots++; |
| 1763 | } | 1765 | } |
diff --git a/drivers/net/a2065.c b/drivers/net/a2065.c index ed5e9742be2c..a8f0512bad38 100644 --- a/drivers/net/a2065.c +++ b/drivers/net/a2065.c | |||
| @@ -674,6 +674,7 @@ static struct zorro_device_id a2065_zorro_tbl[] __devinitdata = { | |||
| 674 | { ZORRO_PROD_AMERISTAR_A2065 }, | 674 | { ZORRO_PROD_AMERISTAR_A2065 }, |
| 675 | { 0 } | 675 | { 0 } |
| 676 | }; | 676 | }; |
| 677 | MODULE_DEVICE_TABLE(zorro, a2065_zorro_tbl); | ||
| 677 | 678 | ||
| 678 | static struct zorro_driver a2065_driver = { | 679 | static struct zorro_driver a2065_driver = { |
| 679 | .name = "a2065", | 680 | .name = "a2065", |
diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index fa1a2354f5f9..4b30a46486e2 100644 --- a/drivers/net/ariadne.c +++ b/drivers/net/ariadne.c | |||
| @@ -145,6 +145,7 @@ static struct zorro_device_id ariadne_zorro_tbl[] __devinitdata = { | |||
| 145 | { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE }, | 145 | { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE }, |
| 146 | { 0 } | 146 | { 0 } |
| 147 | }; | 147 | }; |
| 148 | MODULE_DEVICE_TABLE(zorro, ariadne_zorro_tbl); | ||
| 148 | 149 | ||
| 149 | static struct zorro_driver ariadne_driver = { | 150 | static struct zorro_driver ariadne_driver = { |
| 150 | .name = "ariadne", | 151 | .name = "ariadne", |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 4e97ca182997..5d3763fb3472 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -1649,6 +1649,7 @@ static void free_skb_resources(struct gfar_private *priv) | |||
| 1649 | sizeof(struct rxbd8) * priv->total_rx_ring_size, | 1649 | sizeof(struct rxbd8) * priv->total_rx_ring_size, |
| 1650 | priv->tx_queue[0]->tx_bd_base, | 1650 | priv->tx_queue[0]->tx_bd_base, |
| 1651 | priv->tx_queue[0]->tx_bd_dma_base); | 1651 | priv->tx_queue[0]->tx_bd_dma_base); |
| 1652 | skb_queue_purge(&priv->rx_recycle); | ||
| 1652 | } | 1653 | } |
| 1653 | 1654 | ||
| 1654 | void gfar_start(struct net_device *dev) | 1655 | void gfar_start(struct net_device *dev) |
| @@ -2088,7 +2089,6 @@ static int gfar_close(struct net_device *dev) | |||
| 2088 | 2089 | ||
| 2089 | disable_napi(priv); | 2090 | disable_napi(priv); |
| 2090 | 2091 | ||
| 2091 | skb_queue_purge(&priv->rx_recycle); | ||
| 2092 | cancel_work_sync(&priv->reset_task); | 2092 | cancel_work_sync(&priv->reset_task); |
| 2093 | stop_gfar(dev); | 2093 | stop_gfar(dev); |
| 2094 | 2094 | ||
diff --git a/drivers/net/hydra.c b/drivers/net/hydra.c index 24724b4ad709..07d8e5b634f3 100644 --- a/drivers/net/hydra.c +++ b/drivers/net/hydra.c | |||
| @@ -71,6 +71,7 @@ static struct zorro_device_id hydra_zorro_tbl[] __devinitdata = { | |||
| 71 | { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET }, | 71 | { ZORRO_PROD_HYDRA_SYSTEMS_AMIGANET }, |
| 72 | { 0 } | 72 | { 0 } |
| 73 | }; | 73 | }; |
| 74 | MODULE_DEVICE_TABLE(zorro, hydra_zorro_tbl); | ||
| 74 | 75 | ||
| 75 | static struct zorro_driver hydra_driver = { | 76 | static struct zorro_driver hydra_driver = { |
| 76 | .name = "hydra", | 77 | .name = "hydra", |
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 0cd80e4d71d9..e67691dca4ab 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
| @@ -32,6 +32,7 @@ static int kszphy_config_init(struct phy_device *phydev) | |||
| 32 | 32 | ||
| 33 | static struct phy_driver ks8001_driver = { | 33 | static struct phy_driver ks8001_driver = { |
| 34 | .phy_id = PHY_ID_KS8001, | 34 | .phy_id = PHY_ID_KS8001, |
| 35 | .name = "Micrel KS8001", | ||
| 35 | .phy_id_mask = 0x00fffff0, | 36 | .phy_id_mask = 0x00fffff0, |
| 36 | .features = PHY_BASIC_FEATURES, | 37 | .features = PHY_BASIC_FEATURES, |
| 37 | .flags = PHY_POLL, | 38 | .flags = PHY_POLL, |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index f9f0730b53d5..5ec542dd5b50 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
| @@ -187,7 +187,6 @@ tx_drop: | |||
| 187 | return NETDEV_TX_OK; | 187 | return NETDEV_TX_OK; |
| 188 | 188 | ||
| 189 | rx_drop: | 189 | rx_drop: |
| 190 | kfree_skb(skb); | ||
| 191 | rcv_stats->rx_dropped++; | 190 | rcv_stats->rx_dropped++; |
| 192 | return NETDEV_TX_OK; | 191 | return NETDEV_TX_OK; |
| 193 | } | 192 | } |
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 99a6da464bd3..e1c2fcaa8bed 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
| @@ -727,12 +727,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) | |||
| 727 | { | 727 | { |
| 728 | struct device *parent = aru->udev->dev.parent; | 728 | struct device *parent = aru->udev->dev.parent; |
| 729 | 729 | ||
| 730 | complete(&aru->firmware_loading_complete); | ||
| 731 | |||
| 730 | /* unbind anything failed */ | 732 | /* unbind anything failed */ |
| 731 | if (parent) | 733 | if (parent) |
| 732 | down(&parent->sem); | 734 | down(&parent->sem); |
| 733 | device_release_driver(&aru->udev->dev); | 735 | device_release_driver(&aru->udev->dev); |
| 734 | if (parent) | 736 | if (parent) |
| 735 | up(&parent->sem); | 737 | up(&parent->sem); |
| 738 | |||
| 739 | usb_put_dev(aru->udev); | ||
| 736 | } | 740 | } |
| 737 | 741 | ||
| 738 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | 742 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) |
| @@ -761,6 +765,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | |||
| 761 | if (err) | 765 | if (err) |
| 762 | goto err_unrx; | 766 | goto err_unrx; |
| 763 | 767 | ||
| 768 | complete(&aru->firmware_loading_complete); | ||
| 769 | usb_put_dev(aru->udev); | ||
| 764 | return; | 770 | return; |
| 765 | 771 | ||
| 766 | err_unrx: | 772 | err_unrx: |
| @@ -858,6 +864,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 858 | init_usb_anchor(&aru->tx_pending); | 864 | init_usb_anchor(&aru->tx_pending); |
| 859 | init_usb_anchor(&aru->tx_submitted); | 865 | init_usb_anchor(&aru->tx_submitted); |
| 860 | init_completion(&aru->cmd_wait); | 866 | init_completion(&aru->cmd_wait); |
| 867 | init_completion(&aru->firmware_loading_complete); | ||
| 861 | spin_lock_init(&aru->tx_urb_lock); | 868 | spin_lock_init(&aru->tx_urb_lock); |
| 862 | 869 | ||
| 863 | aru->tx_pending_urbs = 0; | 870 | aru->tx_pending_urbs = 0; |
| @@ -877,6 +884,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
| 877 | if (err) | 884 | if (err) |
| 878 | goto err_freehw; | 885 | goto err_freehw; |
| 879 | 886 | ||
| 887 | usb_get_dev(aru->udev); | ||
| 880 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", | 888 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", |
| 881 | &aru->udev->dev, GFP_KERNEL, aru, | 889 | &aru->udev->dev, GFP_KERNEL, aru, |
| 882 | ar9170_usb_firmware_step2); | 890 | ar9170_usb_firmware_step2); |
| @@ -896,6 +904,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) | |||
| 896 | return; | 904 | return; |
| 897 | 905 | ||
| 898 | aru->common.state = AR9170_IDLE; | 906 | aru->common.state = AR9170_IDLE; |
| 907 | |||
| 908 | wait_for_completion(&aru->firmware_loading_complete); | ||
| 909 | |||
| 899 | ar9170_unregister(&aru->common); | 910 | ar9170_unregister(&aru->common); |
| 900 | ar9170_usb_cancel_urbs(aru); | 911 | ar9170_usb_cancel_urbs(aru); |
| 901 | 912 | ||
diff --git a/drivers/net/wireless/ath/ar9170/usb.h b/drivers/net/wireless/ath/ar9170/usb.h index a2ce3b169ceb..919b06046eb3 100644 --- a/drivers/net/wireless/ath/ar9170/usb.h +++ b/drivers/net/wireless/ath/ar9170/usb.h | |||
| @@ -71,6 +71,7 @@ struct ar9170_usb { | |||
| 71 | unsigned int tx_pending_urbs; | 71 | unsigned int tx_pending_urbs; |
| 72 | 72 | ||
| 73 | struct completion cmd_wait; | 73 | struct completion cmd_wait; |
| 74 | struct completion firmware_loading_complete; | ||
| 74 | int readlen; | 75 | int readlen; |
| 75 | u8 *readbuf; | 76 | u8 *readbuf; |
| 76 | 77 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 6383d9f8c9b3..f4e59ae07f8e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
| @@ -2621,7 +2621,9 @@ struct iwl_ssid_ie { | |||
| 2621 | #define PROBE_OPTION_MAX_3945 4 | 2621 | #define PROBE_OPTION_MAX_3945 4 |
| 2622 | #define PROBE_OPTION_MAX 20 | 2622 | #define PROBE_OPTION_MAX 20 |
| 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) | 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) |
| 2624 | #define IWL_GOOD_CRC_TH cpu_to_le16(1) | 2624 | #define IWL_GOOD_CRC_TH_DISABLED 0 |
| 2625 | #define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1) | ||
| 2626 | #define IWL_GOOD_CRC_TH_NEVER cpu_to_le16(0xffff) | ||
| 2625 | #define IWL_MAX_SCAN_SIZE 1024 | 2627 | #define IWL_MAX_SCAN_SIZE 1024 |
| 2626 | #define IWL_MAX_CMD_SIZE 4096 | 2628 | #define IWL_MAX_CMD_SIZE 4096 |
| 2627 | #define IWL_MAX_PROBE_REQUEST 200 | 2629 | #define IWL_MAX_PROBE_REQUEST 200 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 12e455a4b90e..741e65ec8301 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -813,16 +813,29 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
| 813 | rate = IWL_RATE_1M_PLCP; | 813 | rate = IWL_RATE_1M_PLCP; |
| 814 | rate_flags = RATE_MCS_CCK_MSK; | 814 | rate_flags = RATE_MCS_CCK_MSK; |
| 815 | } | 815 | } |
| 816 | scan->good_CRC_th = 0; | 816 | scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED; |
| 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | 817 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { |
| 818 | band = IEEE80211_BAND_5GHZ; | 818 | band = IEEE80211_BAND_5GHZ; |
| 819 | rate = IWL_RATE_6M_PLCP; | 819 | rate = IWL_RATE_6M_PLCP; |
| 820 | /* | 820 | /* |
| 821 | * If active scaning is requested but a certain channel | 821 | * If active scanning is requested but a certain channel is |
| 822 | * is marked passive, we can do active scanning if we | 822 | * marked passive, we can do active scanning if we detect |
| 823 | * detect transmissions. | 823 | * transmissions. |
| 824 | * | ||
| 825 | * There is an issue with some firmware versions that triggers | ||
| 826 | * a sysassert on a "good CRC threshold" of zero (== disabled), | ||
| 827 | * on a radar channel even though this means that we should NOT | ||
| 828 | * send probes. | ||
| 829 | * | ||
| 830 | * The "good CRC threshold" is the number of frames that we | ||
| 831 | * need to receive during our dwell time on a channel before | ||
| 832 | * sending out probes -- setting this to a huge value will | ||
| 833 | * mean we never reach it, but at the same time work around | ||
| 834 | * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER | ||
| 835 | * here instead of IWL_GOOD_CRC_TH_DISABLED. | ||
| 824 | */ | 836 | */ |
| 825 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 837 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 838 | IWL_GOOD_CRC_TH_NEVER; | ||
| 826 | 839 | ||
| 827 | /* Force use of chains B and C (0x6) for scan Rx for 4965 | 840 | /* Force use of chains B and C (0x6) for scan Rx for 4965 |
| 828 | * Avoid A (0x1) because of its off-channel reception on A-band. | 841 | * Avoid A (0x1) because of its off-channel reception on A-band. |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index b55e4f39a9e1..b74a56c48d26 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2967,7 +2967,8 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2967 | * is marked passive, we can do active scanning if we | 2967 | * is marked passive, we can do active scanning if we |
| 2968 | * detect transmissions. | 2968 | * detect transmissions. |
| 2969 | */ | 2969 | */ |
| 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 2970 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT : |
| 2971 | IWL_GOOD_CRC_TH_DISABLED; | ||
| 2971 | band = IEEE80211_BAND_5GHZ; | 2972 | band = IEEE80211_BAND_5GHZ; |
| 2972 | } else { | 2973 | } else { |
| 2973 | IWL_WARN(priv, "Invalid scan band count\n"); | 2974 | IWL_WARN(priv, "Invalid scan band count\n"); |
diff --git a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c index 81c753a617ab..9548cbb5012a 100644 --- a/drivers/net/zorro8390.c +++ b/drivers/net/zorro8390.c | |||
| @@ -102,6 +102,7 @@ static struct zorro_device_id zorro8390_zorro_tbl[] __devinitdata = { | |||
| 102 | { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, }, | 102 | { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, }, |
| 103 | { 0 } | 103 | { 0 } |
| 104 | }; | 104 | }; |
| 105 | MODULE_DEVICE_TABLE(zorro, zorro8390_zorro_tbl); | ||
| 105 | 106 | ||
| 106 | static struct zorro_driver zorro8390_driver = { | 107 | static struct zorro_driver zorro8390_driver = { |
| 107 | .name = "zorro8390", | 108 | .name = "zorro8390", |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 4fe36d2e1049..19b111383f62 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
| @@ -838,65 +838,11 @@ static void pci_bus_dump_resources(struct pci_bus *bus) | |||
| 838 | } | 838 | } |
| 839 | } | 839 | } |
| 840 | 840 | ||
| 841 | static int __init pci_bus_get_depth(struct pci_bus *bus) | ||
| 842 | { | ||
| 843 | int depth = 0; | ||
| 844 | struct pci_dev *dev; | ||
| 845 | |||
| 846 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 847 | int ret; | ||
| 848 | struct pci_bus *b = dev->subordinate; | ||
| 849 | if (!b) | ||
| 850 | continue; | ||
| 851 | |||
| 852 | ret = pci_bus_get_depth(b); | ||
| 853 | if (ret + 1 > depth) | ||
| 854 | depth = ret + 1; | ||
| 855 | } | ||
| 856 | |||
| 857 | return depth; | ||
| 858 | } | ||
| 859 | static int __init pci_get_max_depth(void) | ||
| 860 | { | ||
| 861 | int depth = 0; | ||
| 862 | struct pci_bus *bus; | ||
| 863 | |||
| 864 | list_for_each_entry(bus, &pci_root_buses, node) { | ||
| 865 | int ret; | ||
| 866 | |||
| 867 | ret = pci_bus_get_depth(bus); | ||
| 868 | if (ret > depth) | ||
| 869 | depth = ret; | ||
| 870 | } | ||
| 871 | |||
| 872 | return depth; | ||
| 873 | } | ||
| 874 | |||
| 875 | /* | ||
| 876 | * first try will not touch pci bridge res | ||
| 877 | * second and later try will clear small leaf bridge res | ||
| 878 | * will stop till to the max deepth if can not find good one | ||
| 879 | */ | ||
| 880 | void __init | 841 | void __init |
| 881 | pci_assign_unassigned_resources(void) | 842 | pci_assign_unassigned_resources(void) |
| 882 | { | 843 | { |
| 883 | struct pci_bus *bus; | 844 | struct pci_bus *bus; |
| 884 | int tried_times = 0; | ||
| 885 | enum release_type rel_type = leaf_only; | ||
| 886 | struct resource_list_x head, *list; | ||
| 887 | unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM | | ||
| 888 | IORESOURCE_PREFETCH; | ||
| 889 | unsigned long failed_type; | ||
| 890 | int max_depth = pci_get_max_depth(); | ||
| 891 | int pci_try_num; | ||
| 892 | 845 | ||
| 893 | head.next = NULL; | ||
| 894 | |||
| 895 | pci_try_num = max_depth + 1; | ||
| 896 | printk(KERN_DEBUG "PCI: max bus depth: %d pci_try_num: %d\n", | ||
| 897 | max_depth, pci_try_num); | ||
| 898 | |||
| 899 | again: | ||
| 900 | /* Depth first, calculate sizes and alignments of all | 846 | /* Depth first, calculate sizes and alignments of all |
| 901 | subordinate buses. */ | 847 | subordinate buses. */ |
| 902 | list_for_each_entry(bus, &pci_root_buses, node) { | 848 | list_for_each_entry(bus, &pci_root_buses, node) { |
| @@ -904,65 +850,9 @@ again: | |||
| 904 | } | 850 | } |
| 905 | /* Depth last, allocate resources and update the hardware. */ | 851 | /* Depth last, allocate resources and update the hardware. */ |
| 906 | list_for_each_entry(bus, &pci_root_buses, node) { | 852 | list_for_each_entry(bus, &pci_root_buses, node) { |
| 907 | __pci_bus_assign_resources(bus, &head); | 853 | pci_bus_assign_resources(bus); |
| 908 | } | ||
| 909 | tried_times++; | ||
| 910 | |||
| 911 | /* any device complain? */ | ||
| 912 | if (!head.next) | ||
| 913 | goto enable_and_dump; | ||
| 914 | failed_type = 0; | ||
| 915 | for (list = head.next; list;) { | ||
| 916 | failed_type |= list->flags; | ||
| 917 | list = list->next; | ||
| 918 | } | ||
| 919 | /* | ||
| 920 | * io port are tight, don't try extra | ||
| 921 | * or if reach the limit, don't want to try more | ||
| 922 | */ | ||
| 923 | failed_type &= type_mask; | ||
| 924 | if ((failed_type == IORESOURCE_IO) || (tried_times >= pci_try_num)) { | ||
| 925 | free_failed_list(&head); | ||
| 926 | goto enable_and_dump; | ||
| 927 | } | ||
| 928 | |||
| 929 | printk(KERN_DEBUG "PCI: No. %d try to assign unassigned res\n", | ||
| 930 | tried_times + 1); | ||
| 931 | |||
| 932 | /* third times and later will not check if it is leaf */ | ||
| 933 | if ((tried_times + 1) > 2) | ||
| 934 | rel_type = whole_subtree; | ||
| 935 | |||
| 936 | /* | ||
| 937 | * Try to release leaf bridge's resources that doesn't fit resource of | ||
| 938 | * child device under that bridge | ||
| 939 | */ | ||
| 940 | for (list = head.next; list;) { | ||
| 941 | bus = list->dev->bus; | ||
| 942 | pci_bus_release_bridge_resources(bus, list->flags & type_mask, | ||
| 943 | rel_type); | ||
| 944 | list = list->next; | ||
| 945 | } | ||
| 946 | /* restore size and flags */ | ||
| 947 | for (list = head.next; list;) { | ||
| 948 | struct resource *res = list->res; | ||
| 949 | |||
| 950 | res->start = list->start; | ||
| 951 | res->end = list->end; | ||
| 952 | res->flags = list->flags; | ||
| 953 | if (list->dev->subordinate) | ||
| 954 | res->flags = 0; | ||
| 955 | |||
| 956 | list = list->next; | ||
| 957 | } | ||
| 958 | free_failed_list(&head); | ||
| 959 | |||
| 960 | goto again; | ||
| 961 | |||
| 962 | enable_and_dump: | ||
| 963 | /* Depth last, update the hardware. */ | ||
| 964 | list_for_each_entry(bus, &pci_root_buses, node) | ||
| 965 | pci_enable_bridges(bus); | 854 | pci_enable_bridges(bus); |
| 855 | } | ||
| 966 | 856 | ||
| 967 | /* dump the resource on buses */ | 857 | /* dump the resource on buses */ |
| 968 | list_for_each_entry(bus, &pci_root_buses, node) { | 858 | list_for_each_entry(bus, &pci_root_buses, node) { |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index acf222f91f5a..fa2339cb1681 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -37,6 +37,9 @@ | |||
| 37 | */ | 37 | */ |
| 38 | #define DASD_CHANQ_MAX_SIZE 4 | 38 | #define DASD_CHANQ_MAX_SIZE 4 |
| 39 | 39 | ||
| 40 | #define DASD_SLEEPON_START_TAG (void *) 1 | ||
| 41 | #define DASD_SLEEPON_END_TAG (void *) 2 | ||
| 42 | |||
| 40 | /* | 43 | /* |
| 41 | * SECTION: exported variables of dasd.c | 44 | * SECTION: exported variables of dasd.c |
| 42 | */ | 45 | */ |
| @@ -1472,7 +1475,10 @@ void dasd_add_request_tail(struct dasd_ccw_req *cqr) | |||
| 1472 | */ | 1475 | */ |
| 1473 | static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) | 1476 | static void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) |
| 1474 | { | 1477 | { |
| 1475 | wake_up((wait_queue_head_t *) data); | 1478 | spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); |
| 1479 | cqr->callback_data = DASD_SLEEPON_END_TAG; | ||
| 1480 | spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); | ||
| 1481 | wake_up(&generic_waitq); | ||
| 1476 | } | 1482 | } |
| 1477 | 1483 | ||
| 1478 | static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | 1484 | static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) |
| @@ -1482,10 +1488,7 @@ static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) | |||
| 1482 | 1488 | ||
| 1483 | device = cqr->startdev; | 1489 | device = cqr->startdev; |
| 1484 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1490 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
| 1485 | rc = ((cqr->status == DASD_CQR_DONE || | 1491 | rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); |
| 1486 | cqr->status == DASD_CQR_NEED_ERP || | ||
| 1487 | cqr->status == DASD_CQR_TERMINATED) && | ||
| 1488 | list_empty(&cqr->devlist)); | ||
| 1489 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1492 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
| 1490 | return rc; | 1493 | return rc; |
| 1491 | } | 1494 | } |
| @@ -1573,7 +1576,7 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible) | |||
| 1573 | wait_event(generic_waitq, !(device->stopped)); | 1576 | wait_event(generic_waitq, !(device->stopped)); |
| 1574 | 1577 | ||
| 1575 | cqr->callback = dasd_wakeup_cb; | 1578 | cqr->callback = dasd_wakeup_cb; |
| 1576 | cqr->callback_data = (void *) &generic_waitq; | 1579 | cqr->callback_data = DASD_SLEEPON_START_TAG; |
| 1577 | dasd_add_request_tail(cqr); | 1580 | dasd_add_request_tail(cqr); |
| 1578 | if (interruptible) { | 1581 | if (interruptible) { |
| 1579 | rc = wait_event_interruptible( | 1582 | rc = wait_event_interruptible( |
| @@ -1652,7 +1655,7 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) | |||
| 1652 | } | 1655 | } |
| 1653 | 1656 | ||
| 1654 | cqr->callback = dasd_wakeup_cb; | 1657 | cqr->callback = dasd_wakeup_cb; |
| 1655 | cqr->callback_data = (void *) &generic_waitq; | 1658 | cqr->callback_data = DASD_SLEEPON_START_TAG; |
| 1656 | cqr->status = DASD_CQR_QUEUED; | 1659 | cqr->status = DASD_CQR_QUEUED; |
| 1657 | list_add(&cqr->devlist, &device->ccw_queue); | 1660 | list_add(&cqr->devlist, &device->ccw_queue); |
| 1658 | 1661 | ||
diff --git a/drivers/scsi/zorro7xx.c b/drivers/scsi/zorro7xx.c index 105449c15fa9..e17764d71476 100644 --- a/drivers/scsi/zorro7xx.c +++ b/drivers/scsi/zorro7xx.c | |||
| @@ -69,6 +69,7 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] __devinitdata = { | |||
| 69 | }, | 69 | }, |
| 70 | { 0 } | 70 | { 0 } |
| 71 | }; | 71 | }; |
| 72 | MODULE_DEVICE_TABLE(zorro, zorro7xx_zorro_tbl); | ||
| 72 | 73 | ||
| 73 | static int __devinit zorro7xx_init_one(struct zorro_dev *z, | 74 | static int __devinit zorro7xx_init_one(struct zorro_dev *z, |
| 74 | const struct zorro_device_id *ent) | 75 | const struct zorro_device_id *ent) |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 4315b23590bd..eacb588a9345 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
| @@ -120,7 +120,8 @@ | |||
| 120 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ | 120 | #define MX2_UCR3_RXDMUXSEL (1<<2) /* RXD Muxed Input Select, on mx2/mx3 */ |
| 121 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ | 121 | #define UCR3_INVT (1<<1) /* Inverted Infrared transmission */ |
| 122 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ | 122 | #define UCR3_BPEN (1<<0) /* Preset registers enable */ |
| 123 | #define UCR4_CTSTL_32 (32<<10) /* CTS trigger level (32 chars) */ | 123 | #define UCR4_CTSTL_SHF 10 /* CTS trigger level shift */ |
| 124 | #define UCR4_CTSTL_MASK 0x3F /* CTS trigger is 6 bits wide */ | ||
| 124 | #define UCR4_INVR (1<<9) /* Inverted infrared reception */ | 125 | #define UCR4_INVR (1<<9) /* Inverted infrared reception */ |
| 125 | #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ | 126 | #define UCR4_ENIRI (1<<8) /* Serial infrared interrupt enable */ |
| 126 | #define UCR4_WKEN (1<<7) /* Wake interrupt enable */ | 127 | #define UCR4_WKEN (1<<7) /* Wake interrupt enable */ |
| @@ -591,6 +592,9 @@ static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) | |||
| 591 | return 0; | 592 | return 0; |
| 592 | } | 593 | } |
| 593 | 594 | ||
| 595 | /* half the RX buffer size */ | ||
| 596 | #define CTSTL 16 | ||
| 597 | |||
| 594 | static int imx_startup(struct uart_port *port) | 598 | static int imx_startup(struct uart_port *port) |
| 595 | { | 599 | { |
| 596 | struct imx_port *sport = (struct imx_port *)port; | 600 | struct imx_port *sport = (struct imx_port *)port; |
| @@ -607,6 +611,10 @@ static int imx_startup(struct uart_port *port) | |||
| 607 | if (USE_IRDA(sport)) | 611 | if (USE_IRDA(sport)) |
| 608 | temp |= UCR4_IRSC; | 612 | temp |= UCR4_IRSC; |
| 609 | 613 | ||
| 614 | /* set the trigger level for CTS */ | ||
| 615 | temp &= ~(UCR4_CTSTL_MASK<< UCR4_CTSTL_SHF); | ||
| 616 | temp |= CTSTL<< UCR4_CTSTL_SHF; | ||
| 617 | |||
| 610 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); | 618 | writel(temp & ~UCR4_DREN, sport->port.membase + UCR4); |
| 611 | 619 | ||
| 612 | if (USE_IRDA(sport)) { | 620 | if (USE_IRDA(sport)) { |
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index a176ab4bd65b..02469c31bf0b 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
| @@ -1467,7 +1467,7 @@ mpc52xx_uart_init(void) | |||
| 1467 | /* | 1467 | /* |
| 1468 | * Map the PSC FIFO Controller and init if on MPC512x. | 1468 | * Map the PSC FIFO Controller and init if on MPC512x. |
| 1469 | */ | 1469 | */ |
| 1470 | if (psc_ops->fifoc_init) { | 1470 | if (psc_ops && psc_ops->fifoc_init) { |
| 1471 | ret = psc_ops->fifoc_init(); | 1471 | ret = psc_ops->fifoc_init(); |
| 1472 | if (ret) | 1472 | if (ret) |
| 1473 | return ret; | 1473 | return ret; |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index 4a6366a42129..111a01a747fc 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
| @@ -380,6 +380,7 @@ static int usbfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 380 | mutex_lock(&inode->i_mutex); | 380 | mutex_lock(&inode->i_mutex); |
| 381 | dentry_unhash(dentry); | 381 | dentry_unhash(dentry); |
| 382 | if (usbfs_empty(dentry)) { | 382 | if (usbfs_empty(dentry)) { |
| 383 | dont_mount(dentry); | ||
| 383 | drop_nlink(dentry->d_inode); | 384 | drop_nlink(dentry->d_inode); |
| 384 | drop_nlink(dentry->d_inode); | 385 | drop_nlink(dentry->d_inode); |
| 385 | dput(dentry); | 386 | dput(dentry); |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index e69d238c5af0..49fa953aaf6e 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
| @@ -1035,7 +1035,12 @@ int vhost_add_used(struct vhost_virtqueue *vq, unsigned int head, int len) | |||
| 1035 | /* This actually signals the guest, using eventfd. */ | 1035 | /* This actually signals the guest, using eventfd. */ |
| 1036 | void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq) | 1036 | void vhost_signal(struct vhost_dev *dev, struct vhost_virtqueue *vq) |
| 1037 | { | 1037 | { |
| 1038 | __u16 flags = 0; | 1038 | __u16 flags; |
| 1039 | /* Flush out used index updates. This is paired | ||
| 1040 | * with the barrier that the Guest executes when enabling | ||
| 1041 | * interrupts. */ | ||
| 1042 | smp_mb(); | ||
| 1043 | |||
| 1039 | if (get_user(flags, &vq->avail->flags)) { | 1044 | if (get_user(flags, &vq->avail->flags)) { |
| 1040 | vq_err(vq, "Failed to get flags"); | 1045 | vq_err(vq, "Failed to get flags"); |
| 1041 | return; | 1046 | return; |
diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index dca48df98444..e5d6b56d4447 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c | |||
| @@ -50,8 +50,9 @@ | |||
| 50 | #include <linux/fb.h> | 50 | #include <linux/fb.h> |
| 51 | #include <linux/init.h> | 51 | #include <linux/init.h> |
| 52 | #include <linux/ioport.h> | 52 | #include <linux/ioport.h> |
| 53 | 53 | #include <linux/platform_device.h> | |
| 54 | #include <linux/uaccess.h> | 54 | #include <linux/uaccess.h> |
| 55 | |||
| 55 | #include <asm/system.h> | 56 | #include <asm/system.h> |
| 56 | #include <asm/irq.h> | 57 | #include <asm/irq.h> |
| 57 | #include <asm/amigahw.h> | 58 | #include <asm/amigahw.h> |
| @@ -1135,7 +1136,7 @@ static int amifb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg | |||
| 1135 | * Interface to the low level console driver | 1136 | * Interface to the low level console driver |
| 1136 | */ | 1137 | */ |
| 1137 | 1138 | ||
| 1138 | static void amifb_deinit(void); | 1139 | static void amifb_deinit(struct platform_device *pdev); |
| 1139 | 1140 | ||
| 1140 | /* | 1141 | /* |
| 1141 | * Internal routines | 1142 | * Internal routines |
| @@ -2246,7 +2247,7 @@ static inline void chipfree(void) | |||
| 2246 | * Initialisation | 2247 | * Initialisation |
| 2247 | */ | 2248 | */ |
| 2248 | 2249 | ||
| 2249 | static int __init amifb_init(void) | 2250 | static int __init amifb_probe(struct platform_device *pdev) |
| 2250 | { | 2251 | { |
| 2251 | int tag, i, err = 0; | 2252 | int tag, i, err = 0; |
| 2252 | u_long chipptr; | 2253 | u_long chipptr; |
| @@ -2261,16 +2262,6 @@ static int __init amifb_init(void) | |||
| 2261 | } | 2262 | } |
| 2262 | amifb_setup(option); | 2263 | amifb_setup(option); |
| 2263 | #endif | 2264 | #endif |
| 2264 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_VIDEO)) | ||
| 2265 | return -ENODEV; | ||
| 2266 | |||
| 2267 | /* | ||
| 2268 | * We request all registers starting from bplpt[0] | ||
| 2269 | */ | ||
| 2270 | if (!request_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120, | ||
| 2271 | "amifb [Denise/Lisa]")) | ||
| 2272 | return -EBUSY; | ||
| 2273 | |||
| 2274 | custom.dmacon = DMAF_ALL | DMAF_MASTER; | 2265 | custom.dmacon = DMAF_ALL | DMAF_MASTER; |
| 2275 | 2266 | ||
| 2276 | switch (amiga_chipset) { | 2267 | switch (amiga_chipset) { |
| @@ -2377,6 +2368,7 @@ default_chipset: | |||
| 2377 | fb_info.fbops = &amifb_ops; | 2368 | fb_info.fbops = &amifb_ops; |
| 2378 | fb_info.par = ¤tpar; | 2369 | fb_info.par = ¤tpar; |
| 2379 | fb_info.flags = FBINFO_DEFAULT; | 2370 | fb_info.flags = FBINFO_DEFAULT; |
| 2371 | fb_info.device = &pdev->dev; | ||
| 2380 | 2372 | ||
| 2381 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, | 2373 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, ami_modedb, |
| 2382 | NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { | 2374 | NUM_TOTAL_MODES, &ami_modedb[defmode], 4)) { |
| @@ -2451,18 +2443,18 @@ default_chipset: | |||
| 2451 | return 0; | 2443 | return 0; |
| 2452 | 2444 | ||
| 2453 | amifb_error: | 2445 | amifb_error: |
| 2454 | amifb_deinit(); | 2446 | amifb_deinit(pdev); |
| 2455 | return err; | 2447 | return err; |
| 2456 | } | 2448 | } |
| 2457 | 2449 | ||
| 2458 | static void amifb_deinit(void) | 2450 | static void amifb_deinit(struct platform_device *pdev) |
| 2459 | { | 2451 | { |
| 2460 | if (fb_info.cmap.len) | 2452 | if (fb_info.cmap.len) |
| 2461 | fb_dealloc_cmap(&fb_info.cmap); | 2453 | fb_dealloc_cmap(&fb_info.cmap); |
| 2454 | fb_dealloc_cmap(&fb_info.cmap); | ||
| 2462 | chipfree(); | 2455 | chipfree(); |
| 2463 | if (videomemory) | 2456 | if (videomemory) |
| 2464 | iounmap((void*)videomemory); | 2457 | iounmap((void*)videomemory); |
| 2465 | release_mem_region(CUSTOM_PHYSADDR+0xe0, 0x120); | ||
| 2466 | custom.dmacon = DMAF_ALL | DMAF_MASTER; | 2458 | custom.dmacon = DMAF_ALL | DMAF_MASTER; |
| 2467 | } | 2459 | } |
| 2468 | 2460 | ||
| @@ -3794,14 +3786,35 @@ static void ami_rebuild_copper(void) | |||
| 3794 | } | 3786 | } |
| 3795 | } | 3787 | } |
| 3796 | 3788 | ||
| 3797 | static void __exit amifb_exit(void) | 3789 | static int __exit amifb_remove(struct platform_device *pdev) |
| 3798 | { | 3790 | { |
| 3799 | unregister_framebuffer(&fb_info); | 3791 | unregister_framebuffer(&fb_info); |
| 3800 | amifb_deinit(); | 3792 | amifb_deinit(pdev); |
| 3801 | amifb_video_off(); | 3793 | amifb_video_off(); |
| 3794 | return 0; | ||
| 3795 | } | ||
| 3796 | |||
| 3797 | static struct platform_driver amifb_driver = { | ||
| 3798 | .remove = __exit_p(amifb_remove), | ||
| 3799 | .driver = { | ||
| 3800 | .name = "amiga-video", | ||
| 3801 | .owner = THIS_MODULE, | ||
| 3802 | }, | ||
| 3803 | }; | ||
| 3804 | |||
| 3805 | static int __init amifb_init(void) | ||
| 3806 | { | ||
| 3807 | return platform_driver_probe(&amifb_driver, amifb_probe); | ||
| 3802 | } | 3808 | } |
| 3803 | 3809 | ||
| 3804 | module_init(amifb_init); | 3810 | module_init(amifb_init); |
| 3811 | |||
| 3812 | static void __exit amifb_exit(void) | ||
| 3813 | { | ||
| 3814 | platform_driver_unregister(&amifb_driver); | ||
| 3815 | } | ||
| 3816 | |||
| 3805 | module_exit(amifb_exit); | 3817 | module_exit(amifb_exit); |
| 3806 | 3818 | ||
| 3807 | MODULE_LICENSE("GPL"); | 3819 | MODULE_LICENSE("GPL"); |
| 3820 | MODULE_ALIAS("platform:amiga-video"); | ||
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c index 44e49c28b2a7..c2ec3dcd4e91 100644 --- a/drivers/video/bfin-t350mcqb-fb.c +++ b/drivers/video/bfin-t350mcqb-fb.c | |||
| @@ -488,9 +488,9 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) | |||
| 488 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; | 488 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; |
| 489 | fbinfo->flags = FBINFO_FLAG_DEFAULT; | 489 | fbinfo->flags = FBINFO_FLAG_DEFAULT; |
| 490 | 490 | ||
| 491 | info->fb_buffer = | 491 | info->fb_buffer = dma_alloc_coherent(NULL, fbinfo->fix.smem_len + |
| 492 | dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle, | 492 | ACTIVE_VIDEO_MEM_OFFSET, |
| 493 | GFP_KERNEL); | 493 | &info->dma_handle, GFP_KERNEL); |
| 494 | 494 | ||
| 495 | if (NULL == info->fb_buffer) { | 495 | if (NULL == info->fb_buffer) { |
| 496 | printk(KERN_ERR DRIVER_NAME | 496 | printk(KERN_ERR DRIVER_NAME |
| @@ -568,8 +568,8 @@ out7: | |||
| 568 | out6: | 568 | out6: |
| 569 | fb_dealloc_cmap(&fbinfo->cmap); | 569 | fb_dealloc_cmap(&fbinfo->cmap); |
| 570 | out4: | 570 | out4: |
| 571 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | 571 | dma_free_coherent(NULL, fbinfo->fix.smem_len + ACTIVE_VIDEO_MEM_OFFSET, |
| 572 | info->dma_handle); | 572 | info->fb_buffer, info->dma_handle); |
| 573 | out3: | 573 | out3: |
| 574 | framebuffer_release(fbinfo); | 574 | framebuffer_release(fbinfo); |
| 575 | out2: | 575 | out2: |
| @@ -592,8 +592,9 @@ static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev) | |||
| 592 | free_irq(info->irq, info); | 592 | free_irq(info->irq, info); |
| 593 | 593 | ||
| 594 | if (info->fb_buffer != NULL) | 594 | if (info->fb_buffer != NULL) |
| 595 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | 595 | dma_free_coherent(NULL, fbinfo->fix.smem_len + |
| 596 | info->dma_handle); | 596 | ACTIVE_VIDEO_MEM_OFFSET, info->fb_buffer, |
| 597 | info->dma_handle); | ||
| 597 | 598 | ||
| 598 | fb_dealloc_cmap(&fbinfo->cmap); | 599 | fb_dealloc_cmap(&fbinfo->cmap); |
| 599 | 600 | ||
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 8d8dfda2f868..6df7c54db0a3 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -299,6 +299,7 @@ static const struct zorro_device_id cirrusfb_zorro_table[] = { | |||
| 299 | }, | 299 | }, |
| 300 | { 0 } | 300 | { 0 } |
| 301 | }; | 301 | }; |
| 302 | MODULE_DEVICE_TABLE(zorro, cirrusfb_zorro_table); | ||
| 302 | 303 | ||
| 303 | static const struct { | 304 | static const struct { |
| 304 | zorro_id id2; | 305 | zorro_id id2; |
diff --git a/drivers/video/fm2fb.c b/drivers/video/fm2fb.c index 6c91c61cdb63..1b0feb8e7244 100644 --- a/drivers/video/fm2fb.c +++ b/drivers/video/fm2fb.c | |||
| @@ -219,6 +219,7 @@ static struct zorro_device_id fm2fb_devices[] __devinitdata = { | |||
| 219 | { ZORRO_PROD_HELFRICH_RAINBOW_II }, | 219 | { ZORRO_PROD_HELFRICH_RAINBOW_II }, |
| 220 | { 0 } | 220 | { 0 } |
| 221 | }; | 221 | }; |
| 222 | MODULE_DEVICE_TABLE(zorro, fm2fb_devices); | ||
| 222 | 223 | ||
| 223 | static struct zorro_driver fm2fb_driver = { | 224 | static struct zorro_driver fm2fb_driver = { |
| 224 | .name = "fm2fb", | 225 | .name = "fm2fb", |
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 0bf5020d0d32..b87ba23442d2 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig | |||
| @@ -175,7 +175,7 @@ config SA1100_WATCHDOG | |||
| 175 | 175 | ||
| 176 | config MPCORE_WATCHDOG | 176 | config MPCORE_WATCHDOG |
| 177 | tristate "MPcore watchdog" | 177 | tristate "MPcore watchdog" |
| 178 | depends on ARM_MPCORE_PLATFORM && LOCAL_TIMERS | 178 | depends on HAVE_ARM_TWD |
| 179 | help | 179 | help |
| 180 | Watchdog timer embedded into the MPcore system. | 180 | Watchdog timer embedded into the MPcore system. |
| 181 | 181 | ||
diff --git a/drivers/watchdog/mpcore_wdt.c b/drivers/watchdog/mpcore_wdt.c index 016c6a791cab..b8ec7aca3c8e 100644 --- a/drivers/watchdog/mpcore_wdt.c +++ b/drivers/watchdog/mpcore_wdt.c | |||
| @@ -31,8 +31,9 @@ | |||
| 31 | #include <linux/platform_device.h> | 31 | #include <linux/platform_device.h> |
| 32 | #include <linux/uaccess.h> | 32 | #include <linux/uaccess.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/io.h> | ||
| 34 | 35 | ||
| 35 | #include <asm/hardware/arm_twd.h> | 36 | #include <asm/smp_twd.h> |
| 36 | 37 | ||
| 37 | struct mpcore_wdt { | 38 | struct mpcore_wdt { |
| 38 | unsigned long timer_alive; | 39 | unsigned long timer_alive; |
| @@ -44,7 +45,7 @@ struct mpcore_wdt { | |||
| 44 | }; | 45 | }; |
| 45 | 46 | ||
| 46 | static struct platform_device *mpcore_wdt_dev; | 47 | static struct platform_device *mpcore_wdt_dev; |
| 47 | extern unsigned int mpcore_timer_rate; | 48 | static DEFINE_SPINLOCK(wdt_lock); |
| 48 | 49 | ||
| 49 | #define TIMER_MARGIN 60 | 50 | #define TIMER_MARGIN 60 |
| 50 | static int mpcore_margin = TIMER_MARGIN; | 51 | static int mpcore_margin = TIMER_MARGIN; |
| @@ -94,13 +95,15 @@ static irqreturn_t mpcore_wdt_fire(int irq, void *arg) | |||
| 94 | */ | 95 | */ |
| 95 | static void mpcore_wdt_keepalive(struct mpcore_wdt *wdt) | 96 | static void mpcore_wdt_keepalive(struct mpcore_wdt *wdt) |
| 96 | { | 97 | { |
| 97 | unsigned int count; | 98 | unsigned long count; |
| 98 | 99 | ||
| 100 | spin_lock(&wdt_lock); | ||
| 99 | /* Assume prescale is set to 256 */ | 101 | /* Assume prescale is set to 256 */ |
| 100 | count = (mpcore_timer_rate / 256) * mpcore_margin; | 102 | count = __raw_readl(wdt->base + TWD_WDOG_COUNTER); |
| 103 | count = (0xFFFFFFFFU - count) * (HZ / 5); | ||
| 104 | count = (count / 256) * mpcore_margin; | ||
| 101 | 105 | ||
| 102 | /* Reload the counter */ | 106 | /* Reload the counter */ |
| 103 | spin_lock(&wdt_lock); | ||
| 104 | writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); | 107 | writel(count + wdt->perturb, wdt->base + TWD_WDOG_LOAD); |
| 105 | wdt->perturb = wdt->perturb ? 0 : 1; | 108 | wdt->perturb = wdt->perturb ? 0 : 1; |
| 106 | spin_unlock(&wdt_lock); | 109 | spin_unlock(&wdt_lock); |
| @@ -119,7 +122,6 @@ static void mpcore_wdt_start(struct mpcore_wdt *wdt) | |||
| 119 | { | 122 | { |
| 120 | dev_printk(KERN_INFO, wdt->dev, "enabling watchdog.\n"); | 123 | dev_printk(KERN_INFO, wdt->dev, "enabling watchdog.\n"); |
| 121 | 124 | ||
| 122 | spin_lock(&wdt_lock); | ||
| 123 | /* This loads the count register but does NOT start the count yet */ | 125 | /* This loads the count register but does NOT start the count yet */ |
| 124 | mpcore_wdt_keepalive(wdt); | 126 | mpcore_wdt_keepalive(wdt); |
| 125 | 127 | ||
| @@ -130,7 +132,6 @@ static void mpcore_wdt_start(struct mpcore_wdt *wdt) | |||
| 130 | /* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */ | 132 | /* Enable watchdog - prescale=256, watchdog mode=1, enable=1 */ |
| 131 | writel(0x0000FF09, wdt->base + TWD_WDOG_CONTROL); | 133 | writel(0x0000FF09, wdt->base + TWD_WDOG_CONTROL); |
| 132 | } | 134 | } |
| 133 | spin_unlock(&wdt_lock); | ||
| 134 | } | 135 | } |
| 135 | 136 | ||
| 136 | static int mpcore_wdt_set_heartbeat(int t) | 137 | static int mpcore_wdt_set_heartbeat(int t) |
| @@ -360,7 +361,7 @@ static int __devinit mpcore_wdt_probe(struct platform_device *dev) | |||
| 360 | mpcore_wdt_miscdev.parent = &dev->dev; | 361 | mpcore_wdt_miscdev.parent = &dev->dev; |
| 361 | ret = misc_register(&mpcore_wdt_miscdev); | 362 | ret = misc_register(&mpcore_wdt_miscdev); |
| 362 | if (ret) { | 363 | if (ret) { |
| 363 | dev_printk(KERN_ERR, _dev, | 364 | dev_printk(KERN_ERR, wdt->dev, |
| 364 | "cannot register miscdev on minor=%d (err=%d)\n", | 365 | "cannot register miscdev on minor=%d (err=%d)\n", |
| 365 | WATCHDOG_MINOR, ret); | 366 | WATCHDOG_MINOR, ret); |
| 366 | goto err_misc; | 367 | goto err_misc; |
| @@ -369,13 +370,13 @@ static int __devinit mpcore_wdt_probe(struct platform_device *dev) | |||
| 369 | ret = request_irq(wdt->irq, mpcore_wdt_fire, IRQF_DISABLED, | 370 | ret = request_irq(wdt->irq, mpcore_wdt_fire, IRQF_DISABLED, |
| 370 | "mpcore_wdt", wdt); | 371 | "mpcore_wdt", wdt); |
| 371 | if (ret) { | 372 | if (ret) { |
| 372 | dev_printk(KERN_ERR, _dev, | 373 | dev_printk(KERN_ERR, wdt->dev, |
| 373 | "cannot register IRQ%d for watchdog\n", wdt->irq); | 374 | "cannot register IRQ%d for watchdog\n", wdt->irq); |
| 374 | goto err_irq; | 375 | goto err_irq; |
| 375 | } | 376 | } |
| 376 | 377 | ||
| 377 | mpcore_wdt_stop(wdt); | 378 | mpcore_wdt_stop(wdt); |
| 378 | platform_set_drvdata(&dev->dev, wdt); | 379 | platform_set_drvdata(dev, wdt); |
| 379 | mpcore_wdt_dev = dev; | 380 | mpcore_wdt_dev = dev; |
| 380 | 381 | ||
| 381 | return 0; | 382 | return 0; |
diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c index d47c47fc048f..3c7046d79654 100644 --- a/drivers/zorro/proc.c +++ b/drivers/zorro/proc.c | |||
| @@ -97,7 +97,7 @@ static void zorro_seq_stop(struct seq_file *m, void *v) | |||
| 97 | 97 | ||
| 98 | static int zorro_seq_show(struct seq_file *m, void *v) | 98 | static int zorro_seq_show(struct seq_file *m, void *v) |
| 99 | { | 99 | { |
| 100 | u_int slot = *(loff_t *)v; | 100 | unsigned int slot = *(loff_t *)v; |
| 101 | struct zorro_dev *z = &zorro_autocon[slot]; | 101 | struct zorro_dev *z = &zorro_autocon[slot]; |
| 102 | 102 | ||
| 103 | seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, | 103 | seq_printf(m, "%02x\t%08x\t%08lx\t%08lx\t%02x\n", slot, z->id, |
| @@ -129,7 +129,7 @@ static const struct file_operations zorro_devices_proc_fops = { | |||
| 129 | 129 | ||
| 130 | static struct proc_dir_entry *proc_bus_zorro_dir; | 130 | static struct proc_dir_entry *proc_bus_zorro_dir; |
| 131 | 131 | ||
| 132 | static int __init zorro_proc_attach_device(u_int slot) | 132 | static int __init zorro_proc_attach_device(unsigned int slot) |
| 133 | { | 133 | { |
| 134 | struct proc_dir_entry *entry; | 134 | struct proc_dir_entry *entry; |
| 135 | char name[4]; | 135 | char name[4]; |
| @@ -146,7 +146,7 @@ static int __init zorro_proc_attach_device(u_int slot) | |||
| 146 | 146 | ||
| 147 | static int __init zorro_proc_init(void) | 147 | static int __init zorro_proc_init(void) |
| 148 | { | 148 | { |
| 149 | u_int slot; | 149 | unsigned int slot; |
| 150 | 150 | ||
| 151 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { | 151 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(ZORRO)) { |
| 152 | proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); | 152 | proc_bus_zorro_dir = proc_mkdir("bus/zorro", NULL); |
diff --git a/drivers/zorro/zorro-driver.c b/drivers/zorro/zorro-driver.c index 53180a37cc9a..7ee2b6e71786 100644 --- a/drivers/zorro/zorro-driver.c +++ b/drivers/zorro/zorro-driver.c | |||
| @@ -137,10 +137,34 @@ static int zorro_bus_match(struct device *dev, struct device_driver *drv) | |||
| 137 | return 0; | 137 | return 0; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env) | ||
| 141 | { | ||
| 142 | #ifdef CONFIG_HOTPLUG | ||
| 143 | struct zorro_dev *z; | ||
| 144 | |||
| 145 | if (!dev) | ||
| 146 | return -ENODEV; | ||
| 147 | |||
| 148 | z = to_zorro_dev(dev); | ||
| 149 | if (!z) | ||
| 150 | return -ENODEV; | ||
| 151 | |||
| 152 | if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) || | ||
| 153 | add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) || | ||
| 154 | add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) || | ||
| 155 | add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id)) | ||
| 156 | return -ENOMEM; | ||
| 157 | |||
| 158 | return 0; | ||
| 159 | #else /* !CONFIG_HOTPLUG */ | ||
| 160 | return -ENODEV; | ||
| 161 | #endif /* !CONFIG_HOTPLUG */ | ||
| 162 | } | ||
| 140 | 163 | ||
| 141 | struct bus_type zorro_bus_type = { | 164 | struct bus_type zorro_bus_type = { |
| 142 | .name = "zorro", | 165 | .name = "zorro", |
| 143 | .match = zorro_bus_match, | 166 | .match = zorro_bus_match, |
| 167 | .uevent = zorro_uevent, | ||
| 144 | .probe = zorro_device_probe, | 168 | .probe = zorro_device_probe, |
| 145 | .remove = zorro_device_remove, | 169 | .remove = zorro_device_remove, |
| 146 | }; | 170 | }; |
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c index 1d2a772ea14c..eb924e0a64ce 100644 --- a/drivers/zorro/zorro-sysfs.c +++ b/drivers/zorro/zorro-sysfs.c | |||
| @@ -77,6 +77,16 @@ static struct bin_attribute zorro_config_attr = { | |||
| 77 | .read = zorro_read_config, | 77 | .read = zorro_read_config, |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | ||
| 81 | char *buf) | ||
| 82 | { | ||
| 83 | struct zorro_dev *z = to_zorro_dev(dev); | ||
| 84 | |||
| 85 | return sprintf(buf, ZORRO_DEVICE_MODALIAS_FMT "\n", z->id); | ||
| 86 | } | ||
| 87 | |||
| 88 | static DEVICE_ATTR(modalias, S_IRUGO, modalias_show, NULL); | ||
| 89 | |||
| 80 | int zorro_create_sysfs_dev_files(struct zorro_dev *z) | 90 | int zorro_create_sysfs_dev_files(struct zorro_dev *z) |
| 81 | { | 91 | { |
| 82 | struct device *dev = &z->dev; | 92 | struct device *dev = &z->dev; |
| @@ -89,6 +99,7 @@ int zorro_create_sysfs_dev_files(struct zorro_dev *z) | |||
| 89 | (error = device_create_file(dev, &dev_attr_slotaddr)) || | 99 | (error = device_create_file(dev, &dev_attr_slotaddr)) || |
| 90 | (error = device_create_file(dev, &dev_attr_slotsize)) || | 100 | (error = device_create_file(dev, &dev_attr_slotsize)) || |
| 91 | (error = device_create_file(dev, &dev_attr_resource)) || | 101 | (error = device_create_file(dev, &dev_attr_resource)) || |
| 102 | (error = device_create_file(dev, &dev_attr_modalias)) || | ||
| 92 | (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr))) | 103 | (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr))) |
| 93 | return error; | 104 | return error; |
| 94 | 105 | ||
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c index d45fb34e2d23..6455f3a244c5 100644 --- a/drivers/zorro/zorro.c +++ b/drivers/zorro/zorro.c | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/zorro.h> | 15 | #include <linux/zorro.h> |
| 16 | #include <linux/bitops.h> | 16 | #include <linux/bitops.h> |
| 17 | #include <linux/string.h> | 17 | #include <linux/string.h> |
| 18 | #include <linux/platform_device.h> | ||
| 19 | #include <linux/slab.h> | ||
| 18 | 20 | ||
| 19 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
| 20 | #include <asm/amigahw.h> | 22 | #include <asm/amigahw.h> |
| @@ -26,24 +28,17 @@ | |||
| 26 | * Zorro Expansion Devices | 28 | * Zorro Expansion Devices |
| 27 | */ | 29 | */ |
| 28 | 30 | ||
| 29 | u_int zorro_num_autocon = 0; | 31 | unsigned int zorro_num_autocon; |
| 30 | struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; | 32 | struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; |
| 31 | 33 | ||
| 32 | 34 | ||
| 33 | /* | 35 | /* |
| 34 | * Single Zorro bus | 36 | * Zorro bus |
| 35 | */ | 37 | */ |
| 36 | 38 | ||
| 37 | struct zorro_bus zorro_bus = {\ | 39 | struct zorro_bus { |
| 38 | .resources = { | 40 | struct list_head devices; /* list of devices on this bus */ |
| 39 | /* Zorro II regions (on Zorro II/III) */ | 41 | struct device dev; |
| 40 | { .name = "Zorro II exp", .start = 0x00e80000, .end = 0x00efffff }, | ||
| 41 | { .name = "Zorro II mem", .start = 0x00200000, .end = 0x009fffff }, | ||
| 42 | /* Zorro III regions (on Zorro III only) */ | ||
| 43 | { .name = "Zorro III exp", .start = 0xff000000, .end = 0xffffffff }, | ||
| 44 | { .name = "Zorro III cfg", .start = 0x40000000, .end = 0x7fffffff } | ||
| 45 | }, | ||
| 46 | .name = "Zorro bus" | ||
| 47 | }; | 42 | }; |
| 48 | 43 | ||
| 49 | 44 | ||
| @@ -53,18 +48,19 @@ struct zorro_bus zorro_bus = {\ | |||
| 53 | 48 | ||
| 54 | struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) | 49 | struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) |
| 55 | { | 50 | { |
| 56 | struct zorro_dev *z; | 51 | struct zorro_dev *z; |
| 57 | 52 | ||
| 58 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | 53 | if (!zorro_num_autocon) |
| 59 | return NULL; | 54 | return NULL; |
| 60 | 55 | ||
| 61 | for (z = from ? from+1 : &zorro_autocon[0]; | 56 | for (z = from ? from+1 : &zorro_autocon[0]; |
| 62 | z < zorro_autocon+zorro_num_autocon; | 57 | z < zorro_autocon+zorro_num_autocon; |
| 63 | z++) | 58 | z++) |
| 64 | if (id == ZORRO_WILDCARD || id == z->id) | 59 | if (id == ZORRO_WILDCARD || id == z->id) |
| 65 | return z; | 60 | return z; |
| 66 | return NULL; | 61 | return NULL; |
| 67 | } | 62 | } |
| 63 | EXPORT_SYMBOL(zorro_find_device); | ||
| 68 | 64 | ||
| 69 | 65 | ||
| 70 | /* | 66 | /* |
| @@ -83,121 +79,138 @@ struct zorro_dev *zorro_find_device(zorro_id id, struct zorro_dev *from) | |||
| 83 | */ | 79 | */ |
| 84 | 80 | ||
| 85 | DECLARE_BITMAP(zorro_unused_z2ram, 128); | 81 | DECLARE_BITMAP(zorro_unused_z2ram, 128); |
| 82 | EXPORT_SYMBOL(zorro_unused_z2ram); | ||
| 86 | 83 | ||
| 87 | 84 | ||
| 88 | static void __init mark_region(unsigned long start, unsigned long end, | 85 | static void __init mark_region(unsigned long start, unsigned long end, |
| 89 | int flag) | 86 | int flag) |
| 90 | { | 87 | { |
| 91 | if (flag) | ||
| 92 | start += Z2RAM_CHUNKMASK; | ||
| 93 | else | ||
| 94 | end += Z2RAM_CHUNKMASK; | ||
| 95 | start &= ~Z2RAM_CHUNKMASK; | ||
| 96 | end &= ~Z2RAM_CHUNKMASK; | ||
| 97 | |||
| 98 | if (end <= Z2RAM_START || start >= Z2RAM_END) | ||
| 99 | return; | ||
| 100 | start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; | ||
| 101 | end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; | ||
| 102 | while (start < end) { | ||
| 103 | u32 chunk = start>>Z2RAM_CHUNKSHIFT; | ||
| 104 | if (flag) | 88 | if (flag) |
| 105 | set_bit(chunk, zorro_unused_z2ram); | 89 | start += Z2RAM_CHUNKMASK; |
| 106 | else | 90 | else |
| 107 | clear_bit(chunk, zorro_unused_z2ram); | 91 | end += Z2RAM_CHUNKMASK; |
| 108 | start += Z2RAM_CHUNKSIZE; | 92 | start &= ~Z2RAM_CHUNKMASK; |
| 109 | } | 93 | end &= ~Z2RAM_CHUNKMASK; |
| 94 | |||
| 95 | if (end <= Z2RAM_START || start >= Z2RAM_END) | ||
| 96 | return; | ||
| 97 | start = start < Z2RAM_START ? 0x00000000 : start-Z2RAM_START; | ||
| 98 | end = end > Z2RAM_END ? Z2RAM_SIZE : end-Z2RAM_START; | ||
| 99 | while (start < end) { | ||
| 100 | u32 chunk = start>>Z2RAM_CHUNKSHIFT; | ||
| 101 | if (flag) | ||
| 102 | set_bit(chunk, zorro_unused_z2ram); | ||
| 103 | else | ||
| 104 | clear_bit(chunk, zorro_unused_z2ram); | ||
| 105 | start += Z2RAM_CHUNKSIZE; | ||
| 106 | } | ||
| 110 | } | 107 | } |
| 111 | 108 | ||
| 112 | 109 | ||
| 113 | static struct resource __init *zorro_find_parent_resource(struct zorro_dev *z) | 110 | static struct resource __init *zorro_find_parent_resource( |
| 111 | struct platform_device *bridge, struct zorro_dev *z) | ||
| 114 | { | 112 | { |
| 115 | int i; | 113 | int i; |
| 116 | 114 | ||
| 117 | for (i = 0; i < zorro_bus.num_resources; i++) | 115 | for (i = 0; i < bridge->num_resources; i++) { |
| 118 | if (zorro_resource_start(z) >= zorro_bus.resources[i].start && | 116 | struct resource *r = &bridge->resource[i]; |
| 119 | zorro_resource_end(z) <= zorro_bus.resources[i].end) | 117 | if (zorro_resource_start(z) >= r->start && |
| 120 | return &zorro_bus.resources[i]; | 118 | zorro_resource_end(z) <= r->end) |
| 121 | return &iomem_resource; | 119 | return r; |
| 120 | } | ||
| 121 | return &iomem_resource; | ||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | 124 | ||
| 125 | /* | ||
| 126 | * Initialization | ||
| 127 | */ | ||
| 128 | 125 | ||
| 129 | static int __init zorro_init(void) | 126 | static int __init amiga_zorro_probe(struct platform_device *pdev) |
| 130 | { | 127 | { |
| 131 | struct zorro_dev *z; | 128 | struct zorro_bus *bus; |
| 132 | unsigned int i; | 129 | struct zorro_dev *z; |
| 133 | int error; | 130 | struct resource *r; |
| 134 | 131 | unsigned int i; | |
| 135 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | 132 | int error; |
| 136 | return 0; | 133 | |
| 137 | 134 | /* Initialize the Zorro bus */ | |
| 138 | pr_info("Zorro: Probing AutoConfig expansion devices: %d device%s\n", | 135 | bus = kzalloc(sizeof(*bus), GFP_KERNEL); |
| 139 | zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); | 136 | if (!bus) |
| 140 | 137 | return -ENOMEM; | |
| 141 | /* Initialize the Zorro bus */ | 138 | |
| 142 | INIT_LIST_HEAD(&zorro_bus.devices); | 139 | INIT_LIST_HEAD(&bus->devices); |
| 143 | dev_set_name(&zorro_bus.dev, "zorro"); | 140 | bus->dev.parent = &pdev->dev; |
| 144 | error = device_register(&zorro_bus.dev); | 141 | dev_set_name(&bus->dev, "zorro"); |
| 145 | if (error) { | 142 | error = device_register(&bus->dev); |
| 146 | pr_err("Zorro: Error registering zorro_bus\n"); | ||
| 147 | return error; | ||
| 148 | } | ||
| 149 | |||
| 150 | /* Request the resources */ | ||
| 151 | zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; | ||
| 152 | for (i = 0; i < zorro_bus.num_resources; i++) | ||
| 153 | request_resource(&iomem_resource, &zorro_bus.resources[i]); | ||
| 154 | |||
| 155 | /* Register all devices */ | ||
| 156 | for (i = 0; i < zorro_num_autocon; i++) { | ||
| 157 | z = &zorro_autocon[i]; | ||
| 158 | z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); | ||
| 159 | if (z->id == ZORRO_PROD_GVP_EPC_BASE) { | ||
| 160 | /* GVP quirk */ | ||
| 161 | unsigned long magic = zorro_resource_start(z)+0x8000; | ||
| 162 | z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; | ||
| 163 | } | ||
| 164 | sprintf(z->name, "Zorro device %08x", z->id); | ||
| 165 | zorro_name_device(z); | ||
| 166 | z->resource.name = z->name; | ||
| 167 | if (request_resource(zorro_find_parent_resource(z), &z->resource)) | ||
| 168 | pr_err("Zorro: Address space collision on device %s %pR\n", | ||
| 169 | z->name, &z->resource); | ||
| 170 | dev_set_name(&z->dev, "%02x", i); | ||
| 171 | z->dev.parent = &zorro_bus.dev; | ||
| 172 | z->dev.bus = &zorro_bus_type; | ||
| 173 | error = device_register(&z->dev); | ||
| 174 | if (error) { | 143 | if (error) { |
| 175 | pr_err("Zorro: Error registering device %s\n", z->name); | 144 | pr_err("Zorro: Error registering zorro_bus\n"); |
| 176 | continue; | 145 | kfree(bus); |
| 146 | return error; | ||
| 177 | } | 147 | } |
| 178 | error = zorro_create_sysfs_dev_files(z); | 148 | platform_set_drvdata(pdev, bus); |
| 179 | if (error) | 149 | |
| 180 | dev_err(&z->dev, "Error creating sysfs files\n"); | 150 | /* Register all devices */ |
| 181 | } | 151 | pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n", |
| 182 | 152 | zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s"); | |
| 183 | /* Mark all available Zorro II memory */ | 153 | |
| 184 | zorro_for_each_dev(z) { | 154 | for (i = 0; i < zorro_num_autocon; i++) { |
| 185 | if (z->rom.er_Type & ERTF_MEMLIST) | 155 | z = &zorro_autocon[i]; |
| 186 | mark_region(zorro_resource_start(z), zorro_resource_end(z)+1, 1); | 156 | z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); |
| 187 | } | 157 | if (z->id == ZORRO_PROD_GVP_EPC_BASE) { |
| 188 | 158 | /* GVP quirk */ | |
| 189 | /* Unmark all used Zorro II memory */ | 159 | unsigned long magic = zorro_resource_start(z)+0x8000; |
| 190 | for (i = 0; i < m68k_num_memory; i++) | 160 | z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK; |
| 191 | if (m68k_memory[i].addr < 16*1024*1024) | 161 | } |
| 192 | mark_region(m68k_memory[i].addr, | 162 | sprintf(z->name, "Zorro device %08x", z->id); |
| 193 | m68k_memory[i].addr+m68k_memory[i].size, 0); | 163 | zorro_name_device(z); |
| 194 | 164 | z->resource.name = z->name; | |
| 195 | return 0; | 165 | r = zorro_find_parent_resource(pdev, z); |
| 166 | error = request_resource(r, &z->resource); | ||
| 167 | if (error) | ||
| 168 | dev_err(&bus->dev, | ||
| 169 | "Address space collision on device %s %pR\n", | ||
| 170 | z->name, &z->resource); | ||
| 171 | dev_set_name(&z->dev, "%02x", i); | ||
| 172 | z->dev.parent = &bus->dev; | ||
| 173 | z->dev.bus = &zorro_bus_type; | ||
| 174 | error = device_register(&z->dev); | ||
| 175 | if (error) { | ||
| 176 | dev_err(&bus->dev, "Error registering device %s\n", | ||
| 177 | z->name); | ||
| 178 | continue; | ||
| 179 | } | ||
| 180 | error = zorro_create_sysfs_dev_files(z); | ||
| 181 | if (error) | ||
| 182 | dev_err(&z->dev, "Error creating sysfs files\n"); | ||
| 183 | } | ||
| 184 | |||
| 185 | /* Mark all available Zorro II memory */ | ||
| 186 | zorro_for_each_dev(z) { | ||
| 187 | if (z->rom.er_Type & ERTF_MEMLIST) | ||
| 188 | mark_region(zorro_resource_start(z), | ||
| 189 | zorro_resource_end(z)+1, 1); | ||
| 190 | } | ||
| 191 | |||
| 192 | /* Unmark all used Zorro II memory */ | ||
| 193 | for (i = 0; i < m68k_num_memory; i++) | ||
| 194 | if (m68k_memory[i].addr < 16*1024*1024) | ||
| 195 | mark_region(m68k_memory[i].addr, | ||
| 196 | m68k_memory[i].addr+m68k_memory[i].size, | ||
| 197 | 0); | ||
| 198 | |||
| 199 | return 0; | ||
| 196 | } | 200 | } |
| 197 | 201 | ||
| 198 | subsys_initcall(zorro_init); | 202 | static struct platform_driver amiga_zorro_driver = { |
| 203 | .driver = { | ||
| 204 | .name = "amiga-zorro", | ||
| 205 | .owner = THIS_MODULE, | ||
| 206 | }, | ||
| 207 | }; | ||
| 199 | 208 | ||
| 200 | EXPORT_SYMBOL(zorro_find_device); | 209 | static int __init amiga_zorro_init(void) |
| 201 | EXPORT_SYMBOL(zorro_unused_z2ram); | 210 | { |
| 211 | return platform_driver_probe(&amiga_zorro_driver, amiga_zorro_probe); | ||
| 212 | } | ||
| 213 | |||
| 214 | module_init(amiga_zorro_init); | ||
| 202 | 215 | ||
| 203 | MODULE_LICENSE("GPL"); | 216 | MODULE_LICENSE("GPL"); |
