diff --git a/[refs] b/[refs] index 40584d0deca3..e666049df931 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d7b96ca5d08a8f2f836feb2b3b3bd721d2837a8e +refs/heads/master: 9f67675a249f6f993edd41bc084827411366a652 diff --git a/trunk/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt b/trunk/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt deleted file mode 100644 index ead641c65e0a..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/gpio-matrix-keypad.txt +++ /dev/null @@ -1,46 +0,0 @@ -* GPIO driven matrix keypad device tree bindings - -GPIO driven matrix keypad is used to interface a SoC with a matrix keypad. -The matrix keypad supports multiple row and column lines, a key can be -placed at each intersection of a unique row and a unique column. The matrix -keypad can sense a key-press and key-release by means of GPIO lines and -report the event using GPIO interrupts to the cpu. - -Required Properties: -- compatible: Should be "gpio-matrix-keypad" -- row-gpios: List of gpios used as row lines. The gpio specifier - for this property depends on the gpio controller to - which these row lines are connected. -- col-gpios: List of gpios used as column lines. The gpio specifier - for this property depends on the gpio controller to - which these column lines are connected. -- linux,keymap: The definition can be found at - bindings/input/matrix-keymap.txt - -Optional Properties: -- linux,no-autorepeat: do no enable autorepeat feature. -- linux,wakeup: use any event on keypad as wakeup event. -- debounce-delay-ms: debounce interval in milliseconds -- col-scan-delay-us: delay, measured in microseconds, that is needed - before we can scan keypad after activating column gpio - -Example: - matrix-keypad { - compatible = "gpio-matrix-keypad"; - debounce-delay-ms = <5>; - col-scan-delay-us = <2>; - - row-gpios = <&gpio2 25 0 - &gpio2 26 0 - &gpio2 27 0>; - - col-gpios = <&gpio2 21 0 - &gpio2 22 0>; - - linux,keymap = <0x0000008B - 0x0100009E - 0x02000069 - 0x0001006A - 0x0101001C - 0x0201006C>; - }; diff --git a/trunk/Documentation/devicetree/bindings/input/pwm-beeper.txt b/trunk/Documentation/devicetree/bindings/input/pwm-beeper.txt deleted file mode 100644 index be332ae4f2d6..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/pwm-beeper.txt +++ /dev/null @@ -1,7 +0,0 @@ -* PWM beeper device tree bindings - -Registers a PWM device as beeper. - -Required properties: -- compatible: should be "pwm-beeper" -- pwms: phandle to the physical PWM device diff --git a/trunk/Documentation/devicetree/bindings/input/stmpe-keypad.txt b/trunk/Documentation/devicetree/bindings/input/stmpe-keypad.txt deleted file mode 100644 index 1b97222e8a0b..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/stmpe-keypad.txt +++ /dev/null @@ -1,39 +0,0 @@ -* STMPE Keypad - -Required properties: - - compatible : "st,stmpe-keypad" - - linux,keymap : See ./matrix-keymap.txt - -Optional properties: - - debounce-interval : Debouncing interval time in milliseconds - - st,scan-count : Scanning cycles elapsed before key data is updated - - st,no-autorepeat : If specified device will not autorepeat - -Example: - - stmpe_keypad { - compatible = "st,stmpe-keypad"; - - debounce-interval = <64>; - st,scan-count = <8>; - st,no-autorepeat; - - linux,keymap = <0x205006b - 0x4010074 - 0x3050072 - 0x1030004 - 0x502006a - 0x500000a - 0x5008b - 0x706001c - 0x405000b - 0x6070003 - 0x3040067 - 0x303006c - 0x60400e7 - 0x602009e - 0x4020073 - 0x5050002 - 0x4030069 - 0x3020008>; - }; diff --git a/trunk/Documentation/devicetree/bindings/input/tca8418_keypad.txt b/trunk/Documentation/devicetree/bindings/input/tca8418_keypad.txt deleted file mode 100644 index 2a1538f0053f..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/tca8418_keypad.txt +++ /dev/null @@ -1,8 +0,0 @@ - -Required properties: -- compatible: "ti,tca8418" -- reg: the I2C address -- interrupts: IRQ line number, should trigger on falling edge -- keypad,num-rows: The number of rows -- keypad,num-columns: The number of columns -- linux,keymap: Keys definitions, see keypad-matrix. diff --git a/trunk/Documentation/devicetree/bindings/input/touchscreen/mms114.txt b/trunk/Documentation/devicetree/bindings/input/touchscreen/mms114.txt deleted file mode 100644 index 89d4c56c5671..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/touchscreen/mms114.txt +++ /dev/null @@ -1,34 +0,0 @@ -* MELFAS MMS114 touchscreen controller - -Required properties: -- compatible: must be "melfas,mms114" -- reg: I2C address of the chip -- interrupts: interrupt to which the chip is connected -- x-size: horizontal resolution of touchscreen -- y-size: vertical resolution of touchscreen - -Optional properties: -- contact-threshold: -- moving-threshold: -- x-invert: invert X axis -- y-invert: invert Y axis - -Example: - - i2c@00000000 { - /* ... */ - - touchscreen@48 { - compatible = "melfas,mms114"; - reg = <0x48>; - interrupts = <39 0>; - x-size = <720>; - y-size = <1280>; - contact-threshold = <10>; - moving-threshold = <10>; - x-invert; - y-invert; - }; - - /* ... */ - }; diff --git a/trunk/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt b/trunk/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt deleted file mode 100644 index 127baa31a77a..000000000000 --- a/trunk/Documentation/devicetree/bindings/input/touchscreen/stmpe.txt +++ /dev/null @@ -1,43 +0,0 @@ -STMPE Touchscreen ----------------- - -Required properties: - - compatible: "st,stmpe-ts" - -Optional properties: -- st,sample-time: ADC converstion time in number of clock. (0 -> 36 clocks, 1 -> - 44 clocks, 2 -> 56 clocks, 3 -> 64 clocks, 4 -> 80 clocks, 5 -> 96 clocks, 6 - -> 144 clocks), recommended is 4. -- st,mod-12b: ADC Bit mode (0 -> 10bit ADC, 1 -> 12bit ADC) -- st,ref-sel: ADC reference source (0 -> internal reference, 1 -> external - reference) -- st,adc-freq: ADC Clock speed (0 -> 1.625 MHz, 1 -> 3.25 MHz, 2 || 3 -> 6.5 MHz) -- st,ave-ctrl: Sample average control (0 -> 1 sample, 1 -> 2 samples, 2 -> 4 - samples, 3 -> 8 samples) -- st,touch-det-delay: Touch detect interrupt delay (0 -> 10 us, 1 -> 50 us, 2 -> - 100 us, 3 -> 500 us, 4-> 1 ms, 5 -> 5 ms, 6 -> 10 ms, 7 -> 50 ms) recommended - is 3 -- st,settling: Panel driver settling time (0 -> 10 us, 1 -> 100 us, 2 -> 500 us, 3 - -> 1 ms, 4 -> 5 ms, 5 -> 10 ms, 6 for 50 ms, 7 -> 100 ms) recommended is 2 -- st,fraction-z: Length of the fractional part in z (fraction-z ([0..7]) = Count of - the fractional part) recommended is 7 -- st,i-drive: current limit value of the touchscreen drivers (0 -> 20 mA typical 35 - mA max, 1 -> 50 mA typical 80 mA max) - -Node name must be stmpe_touchscreen and should be child node of stmpe node to -which it belongs. - -Example: - - stmpe_touchscreen { - compatible = "st,stmpe-ts"; - st,sample-time = <4>; - st,mod-12b = <1>; - st,ref-sel = <0>; - st,adc-freq = <1>; - st,ave-ctrl = <1>; - st,touch-det-delay = <2>; - st,settling = <2>; - st,fraction-z = <7>; - st,i-drive = <1>; - }; diff --git a/trunk/arch/arm/mach-omap1/board-nokia770.c b/trunk/arch/arm/mach-omap1/board-nokia770.c index 24d2f2df11a0..3e8ead67e459 100644 --- a/trunk/arch/arm/mach-omap1/board-nokia770.c +++ b/trunk/arch/arm/mach-omap1/board-nokia770.c @@ -112,6 +112,17 @@ static void __init mipid_dev_init(void) omapfb_set_lcd_config(&nokia770_lcd_config); } +static void __init ads7846_dev_init(void) +{ + if (gpio_request(ADS7846_PENDOWN_GPIO, "ADS7846 pendown") < 0) + printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); +} + +static int ads7846_get_pendown_state(void) +{ + return !gpio_get_value(ADS7846_PENDOWN_GPIO); +} + static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = { .x_max = 0x0fff, .y_max = 0x0fff, @@ -120,7 +131,7 @@ static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = .debounce_max = 10, .debounce_tol = 3, .debounce_rep = 1, - .gpio_pendown = ADS7846_PENDOWN_GPIO, + .get_pendown_state = ads7846_get_pendown_state, }; static struct spi_board_info nokia770_spi_board_info[] __initdata = { @@ -230,6 +241,7 @@ static void __init omap_nokia770_init(void) omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); hwa742_dev_init(); + ads7846_dev_init(); mipid_dev_init(); omap1_usb_init(&nokia770_usb_config); nokia770_mmc_init(); diff --git a/trunk/arch/arm/mach-ux500/board-mop500-stuib.c b/trunk/arch/arm/mach-ux500/board-mop500-stuib.c index 7e1f294f0434..564f57d5d8a7 100644 --- a/trunk/arch/arm/mach-ux500/board-mop500-stuib.c +++ b/trunk/arch/arm/mach-ux500/board-mop500-stuib.c @@ -77,6 +77,9 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = { * BU21013 ROHM touchscreen interface on the STUIBs */ +/* tracks number of bu21013 devices being enabled */ +static int bu21013_devices; + #define TOUCH_GPIO_PIN 84 #define TOUCH_XMAX 384 @@ -85,8 +88,73 @@ static struct i2c_board_info __initdata mop500_i2c0_devices_stuib[] = { #define PRCMU_CLOCK_OCR 0x1CC #define TSC_EXT_CLOCK_9_6MHZ 0x840000 +/** + * bu21013_gpio_board_init : configures the touch panel. + * @reset_pin: reset pin number + * This function can be used to configures + * the voltage and reset the touch panel controller. + */ +static int bu21013_gpio_board_init(int reset_pin) +{ + int retval = 0; + + bu21013_devices++; + if (bu21013_devices == 1) { + retval = gpio_request(reset_pin, "touchp_reset"); + if (retval) { + printk(KERN_ERR "Unable to request gpio reset_pin"); + return retval; + } + retval = gpio_direction_output(reset_pin, 1); + if (retval < 0) { + printk(KERN_ERR "%s: gpio direction failed\n", + __func__); + return retval; + } + } + + return retval; +} + +/** + * bu21013_gpio_board_exit : deconfigures the touch panel controller + * @reset_pin: reset pin number + * This function can be used to deconfigures the chip selection + * for touch panel controller. + */ +static int bu21013_gpio_board_exit(int reset_pin) +{ + int retval = 0; + + if (bu21013_devices == 1) { + retval = gpio_direction_output(reset_pin, 0); + if (retval < 0) { + printk(KERN_ERR "%s: gpio direction failed\n", + __func__); + return retval; + } + gpio_set_value(reset_pin, 0); + } + bu21013_devices--; + + return retval; +} + +/** + * bu21013_read_pin_val : get the interrupt pin value + * This function can be used to get the interrupt pin value for touch panel + * controller. + */ +static int bu21013_read_pin_val(void) +{ + return gpio_get_value(TOUCH_GPIO_PIN); +} + static struct bu21013_platform_device tsc_plat_device = { - .touch_pin = TOUCH_GPIO_PIN, + .cs_en = bu21013_gpio_board_init, + .cs_dis = bu21013_gpio_board_exit, + .irq_read_val = bu21013_read_pin_val, + .irq = NOMADIK_GPIO_TO_IRQ(TOUCH_GPIO_PIN), .touch_x_max = TOUCH_XMAX, .touch_y_max = TOUCH_YMAX, .ext_clk = false, @@ -103,6 +171,7 @@ static struct i2c_board_info __initdata u8500_i2c3_devices_stuib[] = { I2C_BOARD_INFO("bu21013_tp", 0x5D), .platform_data = &tsc_plat_device, }, + }; void __init mop500_stuib_init(void) diff --git a/trunk/arch/tile/include/asm/elf.h b/trunk/arch/tile/include/asm/elf.h index ff8a93408823..b73e1039c911 100644 --- a/trunk/arch/tile/include/asm/elf.h +++ b/trunk/arch/tile/include/asm/elf.h @@ -170,6 +170,4 @@ do { \ #endif /* CONFIG_COMPAT */ -#define CORE_DUMP_USE_REGSET - #endif /* _ASM_TILE_ELF_H */ diff --git a/trunk/arch/tile/include/asm/ptrace.h b/trunk/arch/tile/include/asm/ptrace.h index 5ce052e16b7b..1a4fd9ab0ee1 100644 --- a/trunk/arch/tile/include/asm/ptrace.h +++ b/trunk/arch/tile/include/asm/ptrace.h @@ -24,7 +24,8 @@ typedef unsigned long pt_reg_t; #include #define PTRACE_O_MASK_TILE (PTRACE_O_TRACEMIGRATE) -#define PT_TRACE_MIGRATE PT_EVENT_FLAG(PTRACE_EVENT_MIGRATE) +#define PT_TRACE_MIGRATE 0x00080000 +#define PT_TRACE_MASK_TILE (PT_TRACE_MIGRATE) /* Flag bits in pt_regs.flags */ #define PT_FLAGS_DISABLE_IRQ 1 /* on return to kernel, disable irqs */ diff --git a/trunk/arch/tile/include/uapi/asm/ptrace.h b/trunk/arch/tile/include/uapi/asm/ptrace.h index 7757e1985fb6..c717d0fec72e 100644 --- a/trunk/arch/tile/include/uapi/asm/ptrace.h +++ b/trunk/arch/tile/include/uapi/asm/ptrace.h @@ -81,14 +81,8 @@ struct pt_regs { #define PTRACE_SETFPREGS 15 /* Support TILE-specific ptrace options, with events starting at 16. */ +#define PTRACE_O_TRACEMIGRATE 0x00010000 #define PTRACE_EVENT_MIGRATE 16 -#define PTRACE_O_TRACEMIGRATE (1 << PTRACE_EVENT_MIGRATE) -/* - * Flag bits in pt_regs.flags that are part of the ptrace API. - * We start our numbering higher up to avoid confusion with the - * non-ABI kernel-internal values that use the low 16 bits. - */ -#define PT_FLAGS_COMPAT 0x10000 /* process is an -m32 compat process */ #endif /* _UAPI_ASM_TILE_PTRACE_H */ diff --git a/trunk/arch/tile/kernel/pci.c b/trunk/arch/tile/kernel/pci.c index aac1cd586966..759822687e8f 100644 --- a/trunk/arch/tile/kernel/pci.c +++ b/trunk/arch/tile/kernel/pci.c @@ -245,7 +245,7 @@ static void __devinit fixup_read_and_payload_sizes(void) u16 new_values; /* Scan for the smallest maximum payload size. */ - for_each_pci_dev(dev) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { u32 devcap; int max_payload; @@ -260,7 +260,7 @@ static void __devinit fixup_read_and_payload_sizes(void) /* Now, set the max_payload_size for all devices to that value. */ new_values = (max_read_size << 12) | (smallest_max_payload << 5); - for_each_pci_dev(dev) + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_PAYLOAD | PCI_EXP_DEVCTL_READRQ, new_values); diff --git a/trunk/arch/tile/kernel/pci_gx.c b/trunk/arch/tile/kernel/pci_gx.c index 94810d4a6332..2ba6d052f85d 100644 --- a/trunk/arch/tile/kernel/pci_gx.c +++ b/trunk/arch/tile/kernel/pci_gx.c @@ -1047,7 +1047,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) } /* Called for each device after PCI setup is done. */ -static void pcibios_fixup_final(struct pci_dev *pdev) +static void __init +pcibios_fixup_final(struct pci_dev *pdev) { set_dma_ops(&pdev->dev, gx_pci_dma_map_ops); set_dma_offset(&pdev->dev, TILE_PCI_MEM_MAP_BASE_OFFSET); diff --git a/trunk/arch/tile/kernel/ptrace.c b/trunk/arch/tile/kernel/ptrace.c index 9835312d5a91..e92e40527d6d 100644 --- a/trunk/arch/tile/kernel/ptrace.c +++ b/trunk/arch/tile/kernel/ptrace.c @@ -19,10 +19,7 @@ #include #include #include -#include -#include #include -#include void user_enable_single_step(struct task_struct *child) { @@ -48,100 +45,6 @@ void ptrace_disable(struct task_struct *child) clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); } -/* - * Get registers from task and ready the result for userspace. - * Note that we localize the API issues to getregs() and putregs() at - * some cost in performance, e.g. we need a full pt_regs copy for - * PEEKUSR, and two copies for POKEUSR. But in general we expect - * GETREGS/PUTREGS to be the API of choice anyway. - */ -static char *getregs(struct task_struct *child, struct pt_regs *uregs) -{ - *uregs = *task_pt_regs(child); - - /* Set up flags ABI bits. */ - uregs->flags = 0; -#ifdef CONFIG_COMPAT - if (task_thread_info(child)->status & TS_COMPAT) - uregs->flags |= PT_FLAGS_COMPAT; -#endif - - return (char *)uregs; -} - -/* Put registers back to task. */ -static void putregs(struct task_struct *child, struct pt_regs *uregs) -{ - struct pt_regs *regs = task_pt_regs(child); - - /* Don't allow overwriting the kernel-internal flags word. */ - uregs->flags = regs->flags; - - /* Only allow setting the ICS bit in the ex1 word. */ - uregs->ex1 = PL_ICS_EX1(USER_PL, EX1_ICS(uregs->ex1)); - - *regs = *uregs; -} - -enum tile_regset { - REGSET_GPR, -}; - -static int tile_gpr_get(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - void *kbuf, void __user *ubuf) -{ - struct pt_regs regs; - - getregs(target, ®s); - - return user_regset_copyout(&pos, &count, &kbuf, &ubuf, ®s, 0, - sizeof(regs)); -} - -static int tile_gpr_set(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - const void *kbuf, const void __user *ubuf) -{ - int ret; - struct pt_regs regs; - - ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ®s, 0, - sizeof(regs)); - if (ret) - return ret; - - putregs(target, ®s); - - return 0; -} - -static const struct user_regset tile_user_regset[] = { - [REGSET_GPR] = { - .core_note_type = NT_PRSTATUS, - .n = ELF_NGREG, - .size = sizeof(elf_greg_t), - .align = sizeof(elf_greg_t), - .get = tile_gpr_get, - .set = tile_gpr_set, - }, -}; - -static const struct user_regset_view tile_user_regset_view = { - .name = CHIP_ARCH_NAME, - .e_machine = ELF_ARCH, - .ei_osabi = ELF_OSABI, - .regsets = tile_user_regset, - .n = ARRAY_SIZE(tile_user_regset), -}; - -const struct user_regset_view *task_user_regset_view(struct task_struct *task) -{ - return &tile_user_regset_view; -} - long arch_ptrace(struct task_struct *child, long request, unsigned long addr, unsigned long data) { @@ -150,13 +53,14 @@ long arch_ptrace(struct task_struct *child, long request, long ret = -EIO; char *childreg; struct pt_regs copyregs; + int ex1_offset; switch (request) { case PTRACE_PEEKUSR: /* Read register from pt_regs. */ if (addr >= PTREGS_SIZE) break; - childreg = getregs(child, ©regs) + addr; + childreg = (char *)task_pt_regs(child) + addr; #ifdef CONFIG_COMPAT if (is_compat_task()) { if (addr & (sizeof(compat_long_t)-1)) @@ -175,7 +79,17 @@ long arch_ptrace(struct task_struct *child, long request, case PTRACE_POKEUSR: /* Write register in pt_regs. */ if (addr >= PTREGS_SIZE) break; - childreg = getregs(child, ©regs) + addr; + childreg = (char *)task_pt_regs(child) + addr; + + /* Guard against overwrites of the privilege level. */ + ex1_offset = PTREGS_OFFSET_EX1; +#if defined(CONFIG_COMPAT) && defined(__BIG_ENDIAN) + if (is_compat_task()) /* point at low word */ + ex1_offset += sizeof(compat_long_t); +#endif + if (addr == ex1_offset) + data = PL_ICS_EX1(USER_PL, EX1_ICS(data)); + #ifdef CONFIG_COMPAT if (is_compat_task()) { if (addr & (sizeof(compat_long_t)-1)) @@ -188,20 +102,24 @@ long arch_ptrace(struct task_struct *child, long request, break; *(long *)childreg = data; } - putregs(child, ©regs); ret = 0; break; case PTRACE_GETREGS: /* Get all registers from the child. */ - ret = copy_regset_to_user(child, &tile_user_regset_view, - REGSET_GPR, 0, - sizeof(struct pt_regs), datap); + if (copy_to_user(datap, task_pt_regs(child), + sizeof(struct pt_regs)) == 0) { + ret = 0; + } break; case PTRACE_SETREGS: /* Set all registers in the child. */ - ret = copy_regset_from_user(child, &tile_user_regset_view, - REGSET_GPR, 0, - sizeof(struct pt_regs), datap); + if (copy_from_user(©regs, datap, + sizeof(struct pt_regs)) == 0) { + copyregs.ex1 = + PL_ICS_EX1(USER_PL, EX1_ICS(copyregs.ex1)); + *task_pt_regs(child) = copyregs; + ret = 0; + } break; case PTRACE_GETFPREGS: /* Get the child FPU state. */ @@ -210,16 +128,12 @@ long arch_ptrace(struct task_struct *child, long request, case PTRACE_SETOPTIONS: /* Support TILE-specific ptrace options. */ - BUILD_BUG_ON(PTRACE_O_MASK_TILE & PTRACE_O_MASK); + child->ptrace &= ~PT_TRACE_MASK_TILE; tmp = data & PTRACE_O_MASK_TILE; data &= ~PTRACE_O_MASK_TILE; ret = ptrace_request(child, request, addr, data); - if (ret == 0) { - unsigned int flags = child->ptrace; - flags &= ~(PTRACE_O_MASK_TILE << PT_OPT_FLAG_SHIFT); - flags |= (tmp << PT_OPT_FLAG_SHIFT); - child->ptrace = flags; - } + if (tmp & PTRACE_O_TRACEMIGRATE) + child->ptrace |= PT_TRACE_MIGRATE; break; default: diff --git a/trunk/arch/x86/include/uapi/asm/msr-index.h b/trunk/arch/x86/include/uapi/asm/msr-index.h index 433a59fb1a74..6e930b218724 100644 --- a/trunk/arch/x86/include/uapi/asm/msr-index.h +++ b/trunk/arch/x86/include/uapi/asm/msr-index.h @@ -35,14 +35,11 @@ #define MSR_IA32_PERFCTR0 0x000000c1 #define MSR_IA32_PERFCTR1 0x000000c2 #define MSR_FSB_FREQ 0x000000cd -#define MSR_NHM_PLATFORM_INFO 0x000000ce #define MSR_NHM_SNB_PKG_CST_CFG_CTL 0x000000e2 #define NHM_C3_AUTO_DEMOTE (1UL << 25) #define NHM_C1_AUTO_DEMOTE (1UL << 26) #define ATM_LNC_C6_AUTO_DEMOTE (1UL << 25) -#define SNB_C1_AUTO_UNDEMOTE (1UL << 27) -#define SNB_C3_AUTO_UNDEMOTE (1UL << 28) #define MSR_MTRRcap 0x000000fe #define MSR_IA32_BBL_CR_CTL 0x00000119 @@ -58,8 +55,6 @@ #define MSR_OFFCORE_RSP_0 0x000001a6 #define MSR_OFFCORE_RSP_1 0x000001a7 -#define MSR_NHM_TURBO_RATIO_LIMIT 0x000001ad -#define MSR_IVT_TURBO_RATIO_LIMIT 0x000001ae #define MSR_LBR_SELECT 0x000001c8 #define MSR_LBR_TOS 0x000001c9 @@ -108,38 +103,6 @@ #define MSR_IA32_MC0_ADDR 0x00000402 #define MSR_IA32_MC0_MISC 0x00000403 -/* C-state Residency Counters */ -#define MSR_PKG_C3_RESIDENCY 0x000003f8 -#define MSR_PKG_C6_RESIDENCY 0x000003f9 -#define MSR_PKG_C7_RESIDENCY 0x000003fa -#define MSR_CORE_C3_RESIDENCY 0x000003fc -#define MSR_CORE_C6_RESIDENCY 0x000003fd -#define MSR_CORE_C7_RESIDENCY 0x000003fe -#define MSR_PKG_C2_RESIDENCY 0x0000060d - -/* Run Time Average Power Limiting (RAPL) Interface */ - -#define MSR_RAPL_POWER_UNIT 0x00000606 - -#define MSR_PKG_POWER_LIMIT 0x00000610 -#define MSR_PKG_ENERGY_STATUS 0x00000611 -#define MSR_PKG_PERF_STATUS 0x00000613 -#define MSR_PKG_POWER_INFO 0x00000614 - -#define MSR_DRAM_POWER_LIMIT 0x00000618 -#define MSR_DRAM_ENERGY_STATUS 0x00000619 -#define MSR_DRAM_PERF_STATUS 0x0000061b -#define MSR_DRAM_POWER_INFO 0x0000061c - -#define MSR_PP0_POWER_LIMIT 0x00000638 -#define MSR_PP0_ENERGY_STATUS 0x00000639 -#define MSR_PP0_POLICY 0x0000063a -#define MSR_PP0_PERF_STATUS 0x0000063b - -#define MSR_PP1_POWER_LIMIT 0x00000640 -#define MSR_PP1_ENERGY_STATUS 0x00000641 -#define MSR_PP1_POLICY 0x00000642 - #define MSR_AMD64_MC0_MASK 0xc0010044 #define MSR_IA32_MCx_CTL(x) (MSR_IA32_MC0_CTL + 4*(x)) diff --git a/trunk/arch/x86/xen/enlighten.c b/trunk/arch/x86/xen/enlighten.c index 138e5667409a..3aeaa933b527 100644 --- a/trunk/arch/x86/xen/enlighten.c +++ b/trunk/arch/x86/xen/enlighten.c @@ -193,11 +193,10 @@ void xen_vcpu_restore(void) { int cpu; - for_each_possible_cpu(cpu) { + for_each_online_cpu(cpu) { bool other_cpu = (cpu != smp_processor_id()); - bool is_up = HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL); - if (other_cpu && is_up && + if (other_cpu && HYPERVISOR_vcpu_op(VCPUOP_down, cpu, NULL)) BUG(); @@ -206,7 +205,7 @@ void xen_vcpu_restore(void) if (have_vcpu_info_placement) xen_vcpu_setup(cpu); - if (other_cpu && is_up && + if (other_cpu && HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL)) BUG(); } diff --git a/trunk/arch/x86/xen/smp.c b/trunk/arch/x86/xen/smp.c index 4f7d2599b484..353c50f18702 100644 --- a/trunk/arch/x86/xen/smp.c +++ b/trunk/arch/x86/xen/smp.c @@ -254,7 +254,7 @@ static void __init xen_smp_prepare_cpus(unsigned int max_cpus) } xen_init_lock_cpu(0); - smp_store_boot_cpu_info(); + smp_store_cpu_info(0); cpu_data(0).x86_max_cores = 1; for_each_possible_cpu(i) { diff --git a/trunk/drivers/hwmon/twl4030-madc-hwmon.c b/trunk/drivers/hwmon/twl4030-madc-hwmon.c index 6c6d440bb2dd..149d44a7c584 100644 --- a/trunk/drivers/hwmon/twl4030-madc-hwmon.c +++ b/trunk/drivers/hwmon/twl4030-madc-hwmon.c @@ -130,7 +130,7 @@ static int twl4030_madc_hwmon_remove(struct platform_device *pdev) static struct platform_driver twl4030_madc_hwmon_driver = { .probe = twl4030_madc_hwmon_probe, - .remove = twl4030_madc_hwmon_remove, + .remove = __exit_p(twl4030_madc_hwmon_remove), .driver = { .name = "twl4030_madc_hwmon", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/gameport/emu10k1-gp.c b/trunk/drivers/input/gameport/emu10k1-gp.c index fa7a95c1da0e..daceafe7ee7d 100644 --- a/trunk/drivers/input/gameport/emu10k1-gp.c +++ b/trunk/drivers/input/gameport/emu10k1-gp.c @@ -57,7 +57,7 @@ static const struct pci_device_id emu_tbl[] = { MODULE_DEVICE_TABLE(pci, emu_tbl); -static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct emu *emu; struct gameport *port; @@ -107,7 +107,7 @@ static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) return error; } -static void emu_remove(struct pci_dev *pdev) +static void __devexit emu_remove(struct pci_dev *pdev) { struct emu *emu = pci_get_drvdata(pdev); @@ -122,7 +122,7 @@ static struct pci_driver emu_driver = { .name = "Emu10k1_gameport", .id_table = emu_tbl, .probe = emu_probe, - .remove = emu_remove, + .remove = __devexit_p(emu_remove), }; module_pci_driver(emu_driver); diff --git a/trunk/drivers/input/gameport/fm801-gp.c b/trunk/drivers/input/gameport/fm801-gp.c index ae912d3aee4e..48ad3829ff20 100644 --- a/trunk/drivers/input/gameport/fm801-gp.c +++ b/trunk/drivers/input/gameport/fm801-gp.c @@ -78,7 +78,7 @@ static int fm801_gp_open(struct gameport *gameport, int mode) return 0; } -static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) +static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) { struct fm801_gp *gp; struct gameport *port; @@ -129,7 +129,7 @@ static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) return error; } -static void fm801_gp_remove(struct pci_dev *pci) +static void __devexit fm801_gp_remove(struct pci_dev *pci) { struct fm801_gp *gp = pci_get_drvdata(pci); @@ -150,7 +150,7 @@ static struct pci_driver fm801_gp_driver = { .name = "FM801_gameport", .id_table = fm801_gp_id_table, .probe = fm801_gp_probe, - .remove = fm801_gp_remove, + .remove = __devexit_p(fm801_gp_remove), }; module_pci_driver(fm801_gp_driver); diff --git a/trunk/drivers/input/input-mt.c b/trunk/drivers/input/input-mt.c index 47a6009dbf43..8c4b50fd9a79 100644 --- a/trunk/drivers/input/input-mt.c +++ b/trunk/drivers/input/input-mt.c @@ -194,7 +194,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) if (!mt) return; - oldest = NULL; + oldest = 0; oldid = mt->trkid; count = 0; diff --git a/trunk/drivers/input/input.c b/trunk/drivers/input/input.c index ce01332f7b3a..53a0ddee7872 100644 --- a/trunk/drivers/input/input.c +++ b/trunk/drivers/input/input.c @@ -534,11 +534,8 @@ EXPORT_SYMBOL(input_grab_device); static void __input_release_device(struct input_handle *handle) { struct input_dev *dev = handle->dev; - struct input_handle *grabber; - grabber = rcu_dereference_protected(dev->grab, - lockdep_is_held(&dev->mutex)); - if (grabber == handle) { + if (dev->grab == handle) { rcu_assign_pointer(dev->grab, NULL); /* Make sure input_pass_event() notices that grab is gone */ synchronize_rcu(); @@ -1726,7 +1723,7 @@ EXPORT_SYMBOL_GPL(input_class); /** * input_allocate_device - allocate memory for new input device * - * Returns prepared struct input_dev or %NULL. + * Returns prepared struct input_dev or NULL. * * NOTE: Use input_free_device() to free devices that have not been * registered; input_unregister_device() should be used for already @@ -1753,70 +1750,6 @@ struct input_dev *input_allocate_device(void) } EXPORT_SYMBOL(input_allocate_device); -struct input_devres { - struct input_dev *input; -}; - -static int devm_input_device_match(struct device *dev, void *res, void *data) -{ - struct input_devres *devres = res; - - return devres->input == data; -} - -static void devm_input_device_release(struct device *dev, void *res) -{ - struct input_devres *devres = res; - struct input_dev *input = devres->input; - - dev_dbg(dev, "%s: dropping reference to %s\n", - __func__, dev_name(&input->dev)); - input_put_device(input); -} - -/** - * devm_input_allocate_device - allocate managed input device - * @dev: device owning the input device being created - * - * Returns prepared struct input_dev or %NULL. - * - * Managed input devices do not need to be explicitly unregistered or - * freed as it will be done automatically when owner device unbinds from - * its driver (or binding fails). Once managed input device is allocated, - * it is ready to be set up and registered in the same fashion as regular - * input device. There are no special devm_input_device_[un]register() - * variants, regular ones work with both managed and unmanaged devices. - * - * NOTE: the owner device is set up as parent of input device and users - * should not override it. - */ - -struct input_dev *devm_input_allocate_device(struct device *dev) -{ - struct input_dev *input; - struct input_devres *devres; - - devres = devres_alloc(devm_input_device_release, - sizeof(struct input_devres), GFP_KERNEL); - if (!devres) - return NULL; - - input = input_allocate_device(); - if (!input) { - devres_free(devres); - return NULL; - } - - input->dev.parent = dev; - input->devres_managed = true; - - devres->input = input; - devres_add(dev, devres); - - return input; -} -EXPORT_SYMBOL(devm_input_allocate_device); - /** * input_free_device - free memory occupied by input_dev structure * @dev: input device to free @@ -1833,14 +1766,8 @@ EXPORT_SYMBOL(devm_input_allocate_device); */ void input_free_device(struct input_dev *dev) { - if (dev) { - if (dev->devres_managed) - WARN_ON(devres_destroy(dev->dev.parent, - devm_input_device_release, - devm_input_device_match, - dev)); + if (dev) input_put_device(dev); - } } EXPORT_SYMBOL(input_free_device); @@ -1961,38 +1888,6 @@ static void input_cleanse_bitmasks(struct input_dev *dev) INPUT_CLEANSE_BITMASK(dev, SW, sw); } -static void __input_unregister_device(struct input_dev *dev) -{ - struct input_handle *handle, *next; - - input_disconnect_device(dev); - - mutex_lock(&input_mutex); - - list_for_each_entry_safe(handle, next, &dev->h_list, d_node) - handle->handler->disconnect(handle); - WARN_ON(!list_empty(&dev->h_list)); - - del_timer_sync(&dev->timer); - list_del_init(&dev->node); - - input_wakeup_procfs_readers(); - - mutex_unlock(&input_mutex); - - device_del(&dev->dev); -} - -static void devm_input_device_unregister(struct device *dev, void *res) -{ - struct input_devres *devres = res; - struct input_dev *input = devres->input; - - dev_dbg(dev, "%s: unregistering device %s\n", - __func__, dev_name(&input->dev)); - __input_unregister_device(input); -} - /** * input_register_device - register device with input core * @dev: device to be registered @@ -2008,21 +1903,11 @@ static void devm_input_device_unregister(struct device *dev, void *res) int input_register_device(struct input_dev *dev) { static atomic_t input_no = ATOMIC_INIT(0); - struct input_devres *devres = NULL; struct input_handler *handler; unsigned int packet_size; const char *path; int error; - if (dev->devres_managed) { - devres = devres_alloc(devm_input_device_unregister, - sizeof(struct input_devres), GFP_KERNEL); - if (!devres) - return -ENOMEM; - - devres->input = dev; - } - /* Every input device generates EV_SYN/SYN_REPORT events. */ __set_bit(EV_SYN, dev->evbit); @@ -2038,10 +1923,8 @@ int input_register_device(struct input_dev *dev) dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2; dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); - if (!dev->vals) { - error = -ENOMEM; - goto err_devres_free; - } + if (!dev->vals) + return -ENOMEM; /* * If delay and period are pre-set by the driver, then autorepeating @@ -2066,7 +1949,7 @@ int input_register_device(struct input_dev *dev) error = device_add(&dev->dev); if (error) - goto err_free_vals; + return error; path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); pr_info("%s as %s\n", @@ -2075,8 +1958,10 @@ int input_register_device(struct input_dev *dev) kfree(path); error = mutex_lock_interruptible(&input_mutex); - if (error) - goto err_device_del; + if (error) { + device_del(&dev->dev); + return error; + } list_add_tail(&dev->node, &input_dev_list); @@ -2087,21 +1972,7 @@ int input_register_device(struct input_dev *dev) mutex_unlock(&input_mutex); - if (dev->devres_managed) { - dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n", - __func__, dev_name(&dev->dev)); - devres_add(dev->dev.parent, devres); - } return 0; - -err_device_del: - device_del(&dev->dev); -err_free_vals: - kfree(dev->vals); - dev->vals = NULL; -err_devres_free: - devres_free(devres); - return error; } EXPORT_SYMBOL(input_register_device); @@ -2114,20 +1985,24 @@ EXPORT_SYMBOL(input_register_device); */ void input_unregister_device(struct input_dev *dev) { - if (dev->devres_managed) { - WARN_ON(devres_destroy(dev->dev.parent, - devm_input_device_unregister, - devm_input_device_match, - dev)); - __input_unregister_device(dev); - /* - * We do not do input_put_device() here because it will be done - * when 2nd devres fires up. - */ - } else { - __input_unregister_device(dev); - input_put_device(dev); - } + struct input_handle *handle, *next; + + input_disconnect_device(dev); + + mutex_lock(&input_mutex); + + list_for_each_entry_safe(handle, next, &dev->h_list, d_node) + handle->handler->disconnect(handle); + WARN_ON(!list_empty(&dev->h_list)); + + del_timer_sync(&dev->timer); + list_del_init(&dev->node); + + input_wakeup_procfs_readers(); + + mutex_unlock(&input_mutex); + + device_unregister(&dev->dev); } EXPORT_SYMBOL(input_unregister_device); diff --git a/trunk/drivers/input/joystick/as5011.c b/trunk/drivers/input/joystick/as5011.c index 121cd63d3334..c96653b58867 100644 --- a/trunk/drivers/input/joystick/as5011.c +++ b/trunk/drivers/input/joystick/as5011.c @@ -85,10 +85,7 @@ static int as5011_i2c_write(struct i2c_client *client, { uint8_t data[2] = { aregaddr, avalue }; struct i2c_msg msg = { - .addr = client->addr, - .flags = I2C_M_IGNORE_NAK, - .len = 2, - .buf = (uint8_t *)data + client->addr, I2C_M_IGNORE_NAK, 2, (uint8_t *)data }; int error; @@ -101,18 +98,8 @@ static int as5011_i2c_read(struct i2c_client *client, { uint8_t data[2] = { aregaddr }; struct i2c_msg msg_set[2] = { - { - .addr = client->addr, - .flags = I2C_M_REV_DIR_ADDR, - .len = 1, - .buf = (uint8_t *)data - }, - { - .addr = client->addr, - .flags = I2C_M_RD | I2C_M_NOSTART, - .len = 1, - .buf = (uint8_t *)data - } + { client->addr, I2C_M_REV_DIR_ADDR, 1, (uint8_t *)data }, + { client->addr, I2C_M_RD | I2C_M_NOSTART, 1, (uint8_t *)data } }; int error; @@ -157,7 +144,7 @@ static irqreturn_t as5011_axis_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int as5011_configure_chip(struct as5011_device *as5011, +static int __devinit as5011_configure_chip(struct as5011_device *as5011, const struct as5011_platform_data *plat_dat) { struct i2c_client *client = as5011->i2c_client; @@ -225,8 +212,8 @@ static int as5011_configure_chip(struct as5011_device *as5011, return 0; } -static int as5011_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int __devinit as5011_probe(struct i2c_client *client, + const struct i2c_device_id *id) { const struct as5011_platform_data *plat_data; struct as5011_device *as5011; @@ -341,7 +328,7 @@ static int as5011_probe(struct i2c_client *client, return error; } -static int as5011_remove(struct i2c_client *client) +static int __devexit as5011_remove(struct i2c_client *client) { struct as5011_device *as5011 = i2c_get_clientdata(client); @@ -366,7 +353,7 @@ static struct i2c_driver as5011_driver = { .name = "as5011", }, .probe = as5011_probe, - .remove = as5011_remove, + .remove = __devexit_p(as5011_remove), .id_table = as5011_id, }; diff --git a/trunk/drivers/input/joystick/maplecontrol.c b/trunk/drivers/input/joystick/maplecontrol.c index 59c10ec5a2a1..77cfde571bd9 100644 --- a/trunk/drivers/input/joystick/maplecontrol.c +++ b/trunk/drivers/input/joystick/maplecontrol.c @@ -78,7 +78,7 @@ static void dc_pad_close(struct input_dev *dev) } /* allow the controller to be used */ -static int probe_maple_controller(struct device *dev) +static int __devinit probe_maple_controller(struct device *dev) { static const short btn_bit[32] = { BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1, @@ -157,7 +157,7 @@ static int probe_maple_controller(struct device *dev) return error; } -static int remove_maple_controller(struct device *dev) +static int __devexit remove_maple_controller(struct device *dev) { struct maple_device *mdev = to_maple_dev(dev); struct dc_pad *pad = maple_get_drvdata(mdev); @@ -175,7 +175,7 @@ static struct maple_driver dc_pad_driver = { .drv = { .name = "Dreamcast_controller", .probe = probe_maple_controller, - .remove = remove_maple_controller, + .remove = __devexit_p(remove_maple_controller), }, }; diff --git a/trunk/drivers/input/joystick/walkera0701.c b/trunk/drivers/input/joystick/walkera0701.c index f8f892b076e8..4dfa1eed4b7c 100644 --- a/trunk/drivers/input/joystick/walkera0701.c +++ b/trunk/drivers/input/joystick/walkera0701.c @@ -196,7 +196,6 @@ static void walkera0701_close(struct input_dev *dev) struct walkera_dev *w = input_get_drvdata(dev); parport_disable_irq(w->parport); - hrtimer_cancel(&w->timer); } static int walkera0701_connect(struct walkera_dev *w, int parport) @@ -225,9 +224,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) if (parport_claim(w->pardevice)) goto init_err1; - hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - w->timer.function = timer_handler; - w->input_dev = input_allocate_device(); if (!w->input_dev) goto init_err2; @@ -258,6 +254,8 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) if (err) goto init_err3; + hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + w->timer.function = timer_handler; return 0; init_err3: @@ -273,6 +271,7 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) static void walkera0701_disconnect(struct walkera_dev *w) { + hrtimer_cancel(&w->timer); input_unregister_device(w->input_dev); parport_release(w->pardevice); parport_unregister_device(w->pardevice); diff --git a/trunk/drivers/input/joystick/xpad.c b/trunk/drivers/input/joystick/xpad.c index d6cbfe9df218..83811e45d633 100644 --- a/trunk/drivers/input/joystick/xpad.c +++ b/trunk/drivers/input/joystick/xpad.c @@ -118,12 +118,11 @@ static const struct xpad_device { u8 xtype; } xpad_device[] = { { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, + { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, - { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, - { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, - { 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, + { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX }, { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, @@ -137,12 +136,9 @@ static const struct xpad_device { { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, - { 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", XTYPE_XBOX360 }, { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, - { 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 }, { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, - { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX }, { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, @@ -152,28 +148,24 @@ static const struct xpad_device { { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, - { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0e6f, 0x0006, "Pelican 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, - { 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, - { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, - { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, - { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, - { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 }, { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, - { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 }, - { 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 }, - { 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 }, - { 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 }, - { 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 }, + { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } }; @@ -243,7 +235,7 @@ static const signed short xpad_abs_triggers[] = { { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } -static struct usb_device_id xpad_table[] = { +static struct usb_device_id xpad_table [] = { { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ @@ -256,11 +248,10 @@ static struct usb_device_id xpad_table[] = { XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */ - XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */ { } }; -MODULE_DEVICE_TABLE(usb, xpad_table); +MODULE_DEVICE_TABLE (usb, xpad_table); struct usb_xpad { struct input_dev *dev; /* input device interface */ @@ -792,7 +783,7 @@ static int xpad_open(struct input_dev *dev) struct usb_xpad *xpad = input_get_drvdata(dev); /* URB was submitted in probe */ - if (xpad->xtype == XTYPE_XBOX360W) + if(xpad->xtype == XTYPE_XBOX360W) return 0; xpad->irq_in->dev = xpad->udev; diff --git a/trunk/drivers/input/keyboard/Kconfig b/trunk/drivers/input/keyboard/Kconfig index 5a240c60342d..febead4bf8a5 100644 --- a/trunk/drivers/input/keyboard/Kconfig +++ b/trunk/drivers/input/keyboard/Kconfig @@ -134,7 +134,7 @@ config KEYBOARD_QT1070 config KEYBOARD_QT2160 tristate "Atmel AT42QT2160 Touch Sensor Chip" - depends on I2C + depends on I2C && EXPERIMENTAL help If you say yes here you get support for Atmel AT42QT2160 Touch Sensor chip as a keyboard input. diff --git a/trunk/drivers/input/keyboard/adp5520-keys.c b/trunk/drivers/input/keyboard/adp5520-keys.c index ef26b17fb159..e9e8674dfda1 100644 --- a/trunk/drivers/input/keyboard/adp5520-keys.c +++ b/trunk/drivers/input/keyboard/adp5520-keys.c @@ -69,7 +69,7 @@ static int adp5520_keys_notifier(struct notifier_block *nb, return 0; } -static int adp5520_keys_probe(struct platform_device *pdev) +static int __devinit adp5520_keys_probe(struct platform_device *pdev) { struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data; struct input_dev *input; @@ -182,7 +182,7 @@ static int adp5520_keys_probe(struct platform_device *pdev) return ret; } -static int adp5520_keys_remove(struct platform_device *pdev) +static int __devexit adp5520_keys_remove(struct platform_device *pdev) { struct adp5520_keys *dev = platform_get_drvdata(pdev); @@ -200,7 +200,7 @@ static struct platform_driver adp5520_keys_driver = { .owner = THIS_MODULE, }, .probe = adp5520_keys_probe, - .remove = adp5520_keys_remove, + .remove = __devexit_p(adp5520_keys_remove), }; module_platform_driver(adp5520_keys_driver); diff --git a/trunk/drivers/input/keyboard/adp5588-keys.c b/trunk/drivers/input/keyboard/adp5588-keys.c index dbd2047f1641..b083bf10f139 100644 --- a/trunk/drivers/input/keyboard/adp5588-keys.c +++ b/trunk/drivers/input/keyboard/adp5588-keys.c @@ -145,7 +145,7 @@ static int adp5588_gpio_direction_output(struct gpio_chip *chip, return ret; } -static int adp5588_build_gpiomap(struct adp5588_kpad *kpad, +static int __devinit adp5588_build_gpiomap(struct adp5588_kpad *kpad, const struct adp5588_kpad_platform_data *pdata) { bool pin_used[ADP5588_MAXGPIO]; @@ -170,7 +170,7 @@ static int adp5588_build_gpiomap(struct adp5588_kpad *kpad, return n_unused; } -static int adp5588_gpio_add(struct adp5588_kpad *kpad) +static int __devinit adp5588_gpio_add(struct adp5588_kpad *kpad) { struct device *dev = &kpad->client->dev; const struct adp5588_kpad_platform_data *pdata = dev->platform_data; @@ -224,7 +224,7 @@ static int adp5588_gpio_add(struct adp5588_kpad *kpad) return 0; } -static void adp5588_gpio_remove(struct adp5588_kpad *kpad) +static void __devexit adp5588_gpio_remove(struct adp5588_kpad *kpad) { struct device *dev = &kpad->client->dev; const struct adp5588_kpad_platform_data *pdata = dev->platform_data; @@ -319,7 +319,7 @@ static irqreturn_t adp5588_irq(int irq, void *handle) return IRQ_HANDLED; } -static int adp5588_setup(struct i2c_client *client) +static int __devinit adp5588_setup(struct i2c_client *client) { const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; @@ -382,7 +382,7 @@ static int adp5588_setup(struct i2c_client *client) return 0; } -static void adp5588_report_switch_state(struct adp5588_kpad *kpad) +static void __devinit adp5588_report_switch_state(struct adp5588_kpad *kpad) { int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1); int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); @@ -420,8 +420,8 @@ static void adp5588_report_switch_state(struct adp5588_kpad *kpad) } -static int adp5588_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int __devinit adp5588_probe(struct i2c_client *client, + const struct i2c_device_id *id) { struct adp5588_kpad *kpad; const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; @@ -587,7 +587,7 @@ static int adp5588_probe(struct i2c_client *client, return error; } -static int adp5588_remove(struct i2c_client *client) +static int __devexit adp5588_remove(struct i2c_client *client) { struct adp5588_kpad *kpad = i2c_get_clientdata(client); @@ -650,7 +650,7 @@ static struct i2c_driver adp5588_driver = { #endif }, .probe = adp5588_probe, - .remove = adp5588_remove, + .remove = __devexit_p(adp5588_remove), .id_table = adp5588_id, }; diff --git a/trunk/drivers/input/keyboard/adp5589-keys.c b/trunk/drivers/input/keyboard/adp5589-keys.c index 67d12b3427c9..74e603213386 100644 --- a/trunk/drivers/input/keyboard/adp5589-keys.c +++ b/trunk/drivers/input/keyboard/adp5589-keys.c @@ -464,7 +464,7 @@ static int adp5589_gpio_direction_output(struct gpio_chip *chip, return ret; } -static int adp5589_build_gpiomap(struct adp5589_kpad *kpad, +static int __devinit adp5589_build_gpiomap(struct adp5589_kpad *kpad, const struct adp5589_kpad_platform_data *pdata) { bool pin_used[ADP5589_MAXGPIO]; @@ -496,7 +496,7 @@ static int adp5589_build_gpiomap(struct adp5589_kpad *kpad, return n_unused; } -static int adp5589_gpio_add(struct adp5589_kpad *kpad) +static int __devinit adp5589_gpio_add(struct adp5589_kpad *kpad) { struct device *dev = &kpad->client->dev; const struct adp5589_kpad_platform_data *pdata = dev->platform_data; @@ -550,7 +550,7 @@ static int adp5589_gpio_add(struct adp5589_kpad *kpad) return 0; } -static void adp5589_gpio_remove(struct adp5589_kpad *kpad) +static void __devexit adp5589_gpio_remove(struct adp5589_kpad *kpad) { struct device *dev = &kpad->client->dev; const struct adp5589_kpad_platform_data *pdata = dev->platform_data; @@ -641,7 +641,8 @@ static irqreturn_t adp5589_irq(int irq, void *handle) return IRQ_HANDLED; } -static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key) +static int __devinit adp5589_get_evcode(struct adp5589_kpad *kpad, + unsigned short key) { int i; @@ -654,7 +655,7 @@ static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key) return -EINVAL; } -static int adp5589_setup(struct adp5589_kpad *kpad) +static int __devinit adp5589_setup(struct adp5589_kpad *kpad) { struct i2c_client *client = kpad->client; const struct adp5589_kpad_platform_data *pdata = @@ -819,7 +820,7 @@ static int adp5589_setup(struct adp5589_kpad *kpad) return 0; } -static void adp5589_report_switch_state(struct adp5589_kpad *kpad) +static void __devinit adp5589_report_switch_state(struct adp5589_kpad *kpad) { int gpi_stat_tmp, pin_loc; int i; @@ -859,8 +860,8 @@ static void adp5589_report_switch_state(struct adp5589_kpad *kpad) input_sync(kpad->input); } -static int adp5589_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int __devinit adp5589_probe(struct i2c_client *client, + const struct i2c_device_id *id) { struct adp5589_kpad *kpad; const struct adp5589_kpad_platform_data *pdata = @@ -1044,7 +1045,7 @@ static int adp5589_probe(struct i2c_client *client, return error; } -static int adp5589_remove(struct i2c_client *client) +static int __devexit adp5589_remove(struct i2c_client *client) { struct adp5589_kpad *kpad = i2c_get_clientdata(client); @@ -1103,7 +1104,7 @@ static struct i2c_driver adp5589_driver = { .pm = &adp5589_dev_pm_ops, }, .probe = adp5589_probe, - .remove = adp5589_remove, + .remove = __devexit_p(adp5589_remove), .id_table = adp5589_id, }; diff --git a/trunk/drivers/input/keyboard/bf54x-keys.c b/trunk/drivers/input/keyboard/bf54x-keys.c index 20b9fa91fb9e..8eb9116e0a5f 100644 --- a/trunk/drivers/input/keyboard/bf54x-keys.c +++ b/trunk/drivers/input/keyboard/bf54x-keys.c @@ -177,7 +177,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int bfin_kpad_probe(struct platform_device *pdev) +static int __devinit bfin_kpad_probe(struct platform_device *pdev) { struct bf54x_kpad *bf54x_kpad; struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; @@ -331,7 +331,7 @@ static int bfin_kpad_probe(struct platform_device *pdev) return error; } -static int bfin_kpad_remove(struct platform_device *pdev) +static int __devexit bfin_kpad_remove(struct platform_device *pdev) { struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); @@ -390,7 +390,7 @@ static struct platform_driver bfin_kpad_device_driver = { .owner = THIS_MODULE, }, .probe = bfin_kpad_probe, - .remove = bfin_kpad_remove, + .remove = __devexit_p(bfin_kpad_remove), .suspend = bfin_kpad_suspend, .resume = bfin_kpad_resume, }; diff --git a/trunk/drivers/input/keyboard/davinci_keyscan.c b/trunk/drivers/input/keyboard/davinci_keyscan.c index 4e4e453ea15e..d5bacbb479b0 100644 --- a/trunk/drivers/input/keyboard/davinci_keyscan.c +++ b/trunk/drivers/input/keyboard/davinci_keyscan.c @@ -303,7 +303,7 @@ static int __init davinci_ks_probe(struct platform_device *pdev) return error; } -static int davinci_ks_remove(struct platform_device *pdev) +static int __devexit davinci_ks_remove(struct platform_device *pdev) { struct davinci_ks *davinci_ks = platform_get_drvdata(pdev); @@ -326,7 +326,7 @@ static struct platform_driver davinci_ks_driver = { .name = "davinci_keyscan", .owner = THIS_MODULE, }, - .remove = davinci_ks_remove, + .remove = __devexit_p(davinci_ks_remove), }; static int __init davinci_ks_init(void) diff --git a/trunk/drivers/input/keyboard/ep93xx_keypad.c b/trunk/drivers/input/keyboard/ep93xx_keypad.c index 9857e8fd0987..7363402de8d4 100644 --- a/trunk/drivers/input/keyboard/ep93xx_keypad.c +++ b/trunk/drivers/input/keyboard/ep93xx_keypad.c @@ -232,7 +232,7 @@ static int ep93xx_keypad_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, ep93xx_keypad_suspend, ep93xx_keypad_resume); -static int ep93xx_keypad_probe(struct platform_device *pdev) +static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) { struct ep93xx_keypad *keypad; const struct matrix_keymap_data *keymap_data; @@ -346,7 +346,7 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) return err; } -static int ep93xx_keypad_remove(struct platform_device *pdev) +static int __devexit ep93xx_keypad_remove(struct platform_device *pdev) { struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); struct resource *res; @@ -380,7 +380,7 @@ static struct platform_driver ep93xx_keypad_driver = { .pm = &ep93xx_keypad_pm_ops, }, .probe = ep93xx_keypad_probe, - .remove = ep93xx_keypad_remove, + .remove = __devexit_p(ep93xx_keypad_remove), }; module_platform_driver(ep93xx_keypad_driver); diff --git a/trunk/drivers/input/keyboard/gpio_keys.c b/trunk/drivers/input/keyboard/gpio_keys.c index d327f5a2bb0e..6a68041c261d 100644 --- a/trunk/drivers/input/keyboard/gpio_keys.c +++ b/trunk/drivers/input/keyboard/gpio_keys.c @@ -423,10 +423,10 @@ static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int gpio_keys_setup_key(struct platform_device *pdev, - struct input_dev *input, - struct gpio_button_data *bdata, - const struct gpio_keys_button *button) +static int __devinit gpio_keys_setup_key(struct platform_device *pdev, + struct input_dev *input, + struct gpio_button_data *bdata, + const struct gpio_keys_button *button) { const char *desc = button->desc ? button->desc : "gpio_keys"; struct device *dev = &pdev->dev; @@ -440,13 +440,21 @@ static int gpio_keys_setup_key(struct platform_device *pdev, if (gpio_is_valid(button->gpio)) { - error = gpio_request_one(button->gpio, GPIOF_IN, desc); + error = gpio_request(button->gpio, desc); if (error < 0) { dev_err(dev, "Failed to request GPIO %d, error %d\n", button->gpio, error); return error; } + error = gpio_direction_input(button->gpio); + if (error < 0) { + dev_err(dev, + "Failed to configure direction for GPIO %d, error %d\n", + button->gpio, error); + goto fail; + } + if (button->debounce_interval) { error = gpio_set_debounce(button->gpio, button->debounce_interval * 1000); @@ -518,35 +526,12 @@ static int gpio_keys_setup_key(struct platform_device *pdev, return error; } -static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata) -{ - struct input_dev *input = ddata->input; - int i; - - for (i = 0; i < ddata->pdata->nbuttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - if (gpio_is_valid(bdata->button->gpio)) - gpio_keys_gpio_report_event(bdata); - } - input_sync(input); -} - static int gpio_keys_open(struct input_dev *input) { struct gpio_keys_drvdata *ddata = input_get_drvdata(input); const struct gpio_keys_platform_data *pdata = ddata->pdata; - int error; - - if (pdata->enable) { - error = pdata->enable(input->dev.parent); - if (error) - return error; - } - - /* Report current state of buttons that are connected to GPIOs */ - gpio_keys_report_state(ddata); - return 0; + return pdata->enable ? pdata->enable(input->dev.parent) : 0; } static void gpio_keys_close(struct input_dev *input) @@ -566,7 +551,7 @@ static void gpio_keys_close(struct input_dev *input) /* * Translate OpenFirmware node properties into platform_data */ -static struct gpio_keys_platform_data * +static struct gpio_keys_platform_data * __devinit gpio_keys_get_devtree_pdata(struct device *dev) { struct device_node *node, *pp; @@ -673,7 +658,7 @@ static void gpio_remove_key(struct gpio_button_data *bdata) gpio_free(bdata->button->gpio); } -static int gpio_keys_probe(struct platform_device *pdev) +static int __devinit gpio_keys_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); @@ -746,6 +731,14 @@ static int gpio_keys_probe(struct platform_device *pdev) goto fail3; } + /* get current state of buttons that are connected to GPIOs */ + for (i = 0; i < pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (gpio_is_valid(bdata->button->gpio)) + gpio_keys_gpio_report_event(bdata); + } + input_sync(input); + device_init_wakeup(&pdev->dev, wakeup); return 0; @@ -767,7 +760,7 @@ static int gpio_keys_probe(struct platform_device *pdev) return error; } -static int gpio_keys_remove(struct platform_device *pdev) +static int __devexit gpio_keys_remove(struct platform_device *pdev) { struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); struct input_dev *input = ddata->input; @@ -795,7 +788,6 @@ static int gpio_keys_remove(struct platform_device *pdev) static int gpio_keys_suspend(struct device *dev) { struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); - struct input_dev *input = ddata->input; int i; if (device_may_wakeup(dev)) { @@ -804,11 +796,6 @@ static int gpio_keys_suspend(struct device *dev) if (bdata->button->wakeup) enable_irq_wake(bdata->irq); } - } else { - mutex_lock(&input->mutex); - if (input->users) - gpio_keys_close(input); - mutex_unlock(&input->mutex); } return 0; @@ -817,27 +804,18 @@ static int gpio_keys_suspend(struct device *dev) static int gpio_keys_resume(struct device *dev) { struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); - struct input_dev *input = ddata->input; - int error = 0; int i; - if (device_may_wakeup(dev)) { - for (i = 0; i < ddata->pdata->nbuttons; i++) { - struct gpio_button_data *bdata = &ddata->data[i]; - if (bdata->button->wakeup) - disable_irq_wake(bdata->irq); - } - } else { - mutex_lock(&input->mutex); - if (input->users) - error = gpio_keys_open(input); - mutex_unlock(&input->mutex); - } + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (bdata->button->wakeup && device_may_wakeup(dev)) + disable_irq_wake(bdata->irq); - if (error) - return error; + if (gpio_is_valid(bdata->button->gpio)) + gpio_keys_gpio_report_event(bdata); + } + input_sync(ddata->input); - gpio_keys_report_state(ddata); return 0; } #endif @@ -846,7 +824,7 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); static struct platform_driver gpio_keys_device_driver = { .probe = gpio_keys_probe, - .remove = gpio_keys_remove, + .remove = __devexit_p(gpio_keys_remove), .driver = { .name = "gpio-keys", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/gpio_keys_polled.c b/trunk/drivers/input/keyboard/gpio_keys_polled.c index f686fd970553..f2142de789e7 100644 --- a/trunk/drivers/input/keyboard/gpio_keys_polled.c +++ b/trunk/drivers/input/keyboard/gpio_keys_polled.c @@ -103,7 +103,8 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev) } #ifdef CONFIG_OF -static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev) +static struct gpio_keys_platform_data * __devinit +gpio_keys_polled_get_devtree_pdata(struct device *dev) { struct device_node *node, *pp; struct gpio_keys_platform_data *pdata; @@ -195,7 +196,7 @@ gpio_keys_polled_get_devtree_pdata(struct device *dev) } #endif -static int gpio_keys_polled_probe(struct platform_device *pdev) +static int __devinit gpio_keys_polled_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); @@ -245,6 +246,7 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) input = poll_dev->input; + input->evbit[0] = BIT(EV_KEY); input->name = pdev->name; input->phys = DRV_NAME"/input0"; input->dev.parent = &pdev->dev; @@ -254,10 +256,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) input->id.product = 0x0001; input->id.version = 0x0100; - __set_bit(EV_KEY, input->evbit); - if (pdata->rep) - __set_bit(EV_REP, input->evbit); - for (i = 0; i < pdata->nbuttons; i++) { struct gpio_keys_button *button = &pdata->buttons[i]; struct gpio_keys_button_data *bdata = &bdev->data[i]; @@ -270,14 +268,22 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) goto err_free_gpio; } - error = gpio_request_one(gpio, GPIOF_IN, - button->desc ?: DRV_NAME); + error = gpio_request(gpio, + button->desc ? button->desc : DRV_NAME); if (error) { dev_err(dev, "unable to claim gpio %u, err=%d\n", gpio, error); goto err_free_gpio; } + error = gpio_direction_input(gpio); + if (error) { + dev_err(dev, + "unable to set direction on gpio %u, err=%d\n", + gpio, error); + goto err_free_gpio; + } + bdata->can_sleep = gpio_cansleep(gpio); bdata->last_state = -1; bdata->threshold = DIV_ROUND_UP(button->debounce_interval, @@ -323,7 +329,7 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) return error; } -static int gpio_keys_polled_remove(struct platform_device *pdev) +static int __devexit gpio_keys_polled_remove(struct platform_device *pdev) { struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev); const struct gpio_keys_platform_data *pdata = bdev->pdata; @@ -351,7 +357,7 @@ static int gpio_keys_polled_remove(struct platform_device *pdev) static struct platform_driver gpio_keys_polled_driver = { .probe = gpio_keys_polled_probe, - .remove = gpio_keys_polled_remove, + .remove = __devexit_p(gpio_keys_polled_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/hilkbd.c b/trunk/drivers/input/keyboard/hilkbd.c index 198dc07a1be5..5f72440b50c8 100644 --- a/trunk/drivers/input/keyboard/hilkbd.c +++ b/trunk/drivers/input/keyboard/hilkbd.c @@ -200,7 +200,7 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len) /* initialize HIL */ -static int hil_keyb_init(void) +static int __devinit hil_keyb_init(void) { unsigned char c; unsigned int i, kbid; @@ -286,7 +286,7 @@ static int hil_keyb_init(void) return err; } -static void hil_keyb_exit(void) +static void __devexit hil_keyb_exit(void) { if (HIL_IRQ) free_irq(HIL_IRQ, hil_dev.dev_id); @@ -299,7 +299,7 @@ static void hil_keyb_exit(void) } #if defined(CONFIG_PARISC) -static int hil_probe_chip(struct parisc_device *dev) +static int __devinit hil_probe_chip(struct parisc_device *dev) { /* Only allow one HIL keyboard */ if (hil_dev.dev) @@ -320,7 +320,7 @@ static int hil_probe_chip(struct parisc_device *dev) return hil_keyb_init(); } -static int hil_remove_chip(struct parisc_device *dev) +static int __devexit hil_remove_chip(struct parisc_device *dev) { hil_keyb_exit(); @@ -341,7 +341,7 @@ static struct parisc_driver hil_driver = { .name = "hil", .id_table = hil_tbl, .probe = hil_probe_chip, - .remove = hil_remove_chip, + .remove = __devexit_p(hil_remove_chip), }; static int __init hil_init(void) diff --git a/trunk/drivers/input/keyboard/imx_keypad.c b/trunk/drivers/input/keyboard/imx_keypad.c index 6d150e3e1f55..cdc252612c0b 100644 --- a/trunk/drivers/input/keyboard/imx_keypad.c +++ b/trunk/drivers/input/keyboard/imx_keypad.c @@ -362,8 +362,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad) writew(reg_val, keypad->mmio_base + KPSR); /* Colums as open drain and disable all rows */ - reg_val = (keypad->cols_en_mask & 0xff) << 8; - writew(reg_val, keypad->mmio_base + KPCR); + writew(0xff00, keypad->mmio_base + KPCR); } static void imx_keypad_close(struct input_dev *dev) @@ -414,7 +413,7 @@ static int imx_keypad_open(struct input_dev *dev) return -EIO; } -static int imx_keypad_probe(struct platform_device *pdev) +static int __devinit imx_keypad_probe(struct platform_device *pdev) { const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; struct imx_keypad *keypad; @@ -555,7 +554,7 @@ static int imx_keypad_probe(struct platform_device *pdev) return error; } -static int imx_keypad_remove(struct platform_device *pdev) +static int __devexit imx_keypad_remove(struct platform_device *pdev) { struct imx_keypad *keypad = platform_get_drvdata(pdev); struct resource *res; @@ -633,7 +632,7 @@ static struct platform_driver imx_keypad_driver = { .pm = &imx_kbd_pm_ops, }, .probe = imx_keypad_probe, - .remove = imx_keypad_remove, + .remove = __devexit_p(imx_keypad_remove), }; module_platform_driver(imx_keypad_driver); diff --git a/trunk/drivers/input/keyboard/jornada680_kbd.c b/trunk/drivers/input/keyboard/jornada680_kbd.c index 74e75a6e8deb..24f3ea01c4d5 100644 --- a/trunk/drivers/input/keyboard/jornada680_kbd.c +++ b/trunk/drivers/input/keyboard/jornada680_kbd.c @@ -179,7 +179,7 @@ static void jornadakbd680_poll(struct input_polled_dev *dev) memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE); } -static int jornada680kbd_probe(struct platform_device *pdev) +static int __devinit jornada680kbd_probe(struct platform_device *pdev) { struct jornadakbd *jornadakbd; struct input_polled_dev *poll_dev; @@ -240,7 +240,7 @@ static int jornada680kbd_probe(struct platform_device *pdev) } -static int jornada680kbd_remove(struct platform_device *pdev) +static int __devexit jornada680kbd_remove(struct platform_device *pdev) { struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); @@ -258,7 +258,7 @@ static struct platform_driver jornada680kbd_driver = { .owner = THIS_MODULE, }, .probe = jornada680kbd_probe, - .remove = jornada680kbd_remove, + .remove = __devexit_p(jornada680kbd_remove), }; module_platform_driver(jornada680kbd_driver); diff --git a/trunk/drivers/input/keyboard/jornada720_kbd.c b/trunk/drivers/input/keyboard/jornada720_kbd.c index 5ceef636df2f..9d639fa1afbd 100644 --- a/trunk/drivers/input/keyboard/jornada720_kbd.c +++ b/trunk/drivers/input/keyboard/jornada720_kbd.c @@ -94,7 +94,7 @@ static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) return IRQ_HANDLED; }; -static int jornada720_kbd_probe(struct platform_device *pdev) +static int __devinit jornada720_kbd_probe(struct platform_device *pdev) { struct jornadakbd *jornadakbd; struct input_dev *input_dev; @@ -152,7 +152,7 @@ static int jornada720_kbd_probe(struct platform_device *pdev) return err; }; -static int jornada720_kbd_remove(struct platform_device *pdev) +static int __devexit jornada720_kbd_remove(struct platform_device *pdev) { struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); @@ -173,6 +173,6 @@ static struct platform_driver jornada720_kbd_driver = { .owner = THIS_MODULE, }, .probe = jornada720_kbd_probe, - .remove = jornada720_kbd_remove, + .remove = __devexit_p(jornada720_kbd_remove), }; module_platform_driver(jornada720_kbd_driver); diff --git a/trunk/drivers/input/keyboard/lm8323.c b/trunk/drivers/input/keyboard/lm8323.c index 93c812662134..39ac2787e275 100644 --- a/trunk/drivers/input/keyboard/lm8323.c +++ b/trunk/drivers/input/keyboard/lm8323.c @@ -624,7 +624,7 @@ static ssize_t lm8323_set_disable(struct device *dev, } static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); -static int lm8323_probe(struct i2c_client *client, +static int __devinit lm8323_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct lm8323_platform_data *pdata = client->dev.platform_data; @@ -764,7 +764,7 @@ static int lm8323_probe(struct i2c_client *client, return err; } -static int lm8323_remove(struct i2c_client *client) +static int __devexit lm8323_remove(struct i2c_client *client) { struct lm8323_chip *lm = i2c_get_clientdata(client); int i; @@ -846,7 +846,7 @@ static struct i2c_driver lm8323_i2c_driver = { .pm = &lm8323_pm_ops, }, .probe = lm8323_probe, - .remove = lm8323_remove, + .remove = __devexit_p(lm8323_remove), .id_table = lm8323_id, }; MODULE_DEVICE_TABLE(i2c, lm8323_id); diff --git a/trunk/drivers/input/keyboard/lm8333.c b/trunk/drivers/input/keyboard/lm8333.c index 5a8ca35dc9af..081fd9effa8c 100644 --- a/trunk/drivers/input/keyboard/lm8333.c +++ b/trunk/drivers/input/keyboard/lm8333.c @@ -128,7 +128,7 @@ static irqreturn_t lm8333_irq_thread(int irq, void *data) return IRQ_HANDLED; } -static int lm8333_probe(struct i2c_client *client, +static int __devinit lm8333_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct lm8333_platform_data *pdata = client->dev.platform_data; @@ -202,7 +202,7 @@ static int lm8333_probe(struct i2c_client *client, return err; } -static int lm8333_remove(struct i2c_client *client) +static int __devexit lm8333_remove(struct i2c_client *client) { struct lm8333 *lm8333 = i2c_get_clientdata(client); @@ -225,7 +225,7 @@ static struct i2c_driver lm8333_driver = { .owner = THIS_MODULE, }, .probe = lm8333_probe, - .remove = lm8333_remove, + .remove = __devexit_p(lm8333_remove), .id_table = lm8333_id, }; module_i2c_driver(lm8333_driver); diff --git a/trunk/drivers/input/keyboard/locomokbd.c b/trunk/drivers/input/keyboard/locomokbd.c index c94d610b9d78..b1ab29861e1c 100644 --- a/trunk/drivers/input/keyboard/locomokbd.c +++ b/trunk/drivers/input/keyboard/locomokbd.c @@ -46,7 +46,7 @@ MODULE_LICENSE("GPL"); #define KEY_CENTER KEY_F15 static const unsigned char -locomokbd_keycode[LOCOMOKBD_NUMKEYS] = { +locomokbd_keycode[LOCOMOKBD_NUMKEYS] __devinitconst = { 0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */ 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */ @@ -236,7 +236,7 @@ static void locomokbd_close(struct input_dev *dev) locomo_writel(r, locomokbd->base + LOCOMO_KIC); } -static int locomokbd_probe(struct locomo_dev *dev) +static int __devinit locomokbd_probe(struct locomo_dev *dev) { struct locomokbd *locomokbd; struct input_dev *input_dev; @@ -321,7 +321,7 @@ static int locomokbd_probe(struct locomo_dev *dev) return err; } -static int locomokbd_remove(struct locomo_dev *dev) +static int __devexit locomokbd_remove(struct locomo_dev *dev) { struct locomokbd *locomokbd = locomo_get_drvdata(dev); @@ -345,7 +345,7 @@ static struct locomo_driver keyboard_driver = { }, .devid = LOCOMO_DEVID_KEYBOARD, .probe = locomokbd_probe, - .remove = locomokbd_remove, + .remove = __devexit_p(locomokbd_remove), }; static int __init locomokbd_init(void) diff --git a/trunk/drivers/input/keyboard/lpc32xx-keys.c b/trunk/drivers/input/keyboard/lpc32xx-keys.c index 1b8add6cfb9d..dd786c8a7584 100644 --- a/trunk/drivers/input/keyboard/lpc32xx-keys.c +++ b/trunk/drivers/input/keyboard/lpc32xx-keys.c @@ -139,7 +139,7 @@ static void lpc32xx_kscan_close(struct input_dev *dev) clk_disable_unprepare(kscandat->clk); } -static int lpc32xx_parse_dt(struct device *dev, +static int __devinit lpc32xx_parse_dt(struct device *dev, struct lpc32xx_kscan_drv *kscandat) { struct device_node *np = dev->of_node; @@ -166,7 +166,7 @@ static int lpc32xx_parse_dt(struct device *dev, return 0; } -static int lpc32xx_kscan_probe(struct platform_device *pdev) +static int __devinit lpc32xx_kscan_probe(struct platform_device *pdev) { struct lpc32xx_kscan_drv *kscandat; struct input_dev *input; @@ -310,7 +310,7 @@ static int lpc32xx_kscan_probe(struct platform_device *pdev) return error; } -static int lpc32xx_kscan_remove(struct platform_device *pdev) +static int __devexit lpc32xx_kscan_remove(struct platform_device *pdev) { struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); @@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match); static struct platform_driver lpc32xx_kscan_driver = { .probe = lpc32xx_kscan_probe, - .remove = lpc32xx_kscan_remove, + .remove = __devexit_p(lpc32xx_kscan_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/matrix_keypad.c b/trunk/drivers/input/keyboard/matrix_keypad.c index f4ff0dda7597..18b72372028a 100644 --- a/trunk/drivers/input/keyboard/matrix_keypad.c +++ b/trunk/drivers/input/keyboard/matrix_keypad.c @@ -23,9 +23,6 @@ #include #include #include -#include -#include -#include struct matrix_keypad { const struct matrix_keypad_platform_data *pdata; @@ -40,6 +37,8 @@ struct matrix_keypad { bool scan_pending; bool stopped; bool gpio_all_disabled; + + unsigned short keycodes[]; }; /* @@ -119,7 +118,6 @@ static void matrix_keypad_scan(struct work_struct *work) struct matrix_keypad *keypad = container_of(work, struct matrix_keypad, work.work); struct input_dev *input_dev = keypad->input_dev; - const unsigned short *keycodes = input_dev->keycode; const struct matrix_keypad_platform_data *pdata = keypad->pdata; uint32_t new_state[MATRIX_MAX_COLS]; int row, col, code; @@ -155,7 +153,7 @@ static void matrix_keypad_scan(struct work_struct *work) code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); input_event(input_dev, EV_MSC, MSC_SCAN, code); input_report_key(input_dev, - keycodes[code], + keypad->keycodes[code], new_state[col] & (1 << row)); } } @@ -301,8 +299,8 @@ static int matrix_keypad_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops, matrix_keypad_suspend, matrix_keypad_resume); -static int matrix_keypad_init_gpio(struct platform_device *pdev, - struct matrix_keypad *keypad) +static int __devinit matrix_keypad_init_gpio(struct platform_device *pdev, + struct matrix_keypad *keypad) { const struct matrix_keypad_platform_data *pdata = keypad->pdata; int i, err; @@ -396,95 +394,33 @@ static void matrix_keypad_free_gpio(struct matrix_keypad *keypad) gpio_free(pdata->col_gpios[i]); } -#ifdef CONFIG_OF -static struct matrix_keypad_platform_data * -matrix_keypad_parse_dt(struct device *dev) -{ - struct matrix_keypad_platform_data *pdata; - struct device_node *np = dev->of_node; - unsigned int *gpios; - int i; - - if (!np) { - dev_err(dev, "device lacks DT data\n"); - return ERR_PTR(-ENODEV); - } - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) { - dev_err(dev, "could not allocate memory for platform data\n"); - return ERR_PTR(-ENOMEM); - } - - pdata->num_row_gpios = of_gpio_named_count(np, "row-gpios"); - pdata->num_col_gpios = of_gpio_named_count(np, "col-gpios"); - if (!pdata->num_row_gpios || !pdata->num_col_gpios) { - dev_err(dev, "number of keypad rows/columns not specified\n"); - return ERR_PTR(-EINVAL); - } - - if (of_get_property(np, "linux,no-autorepeat", NULL)) - pdata->no_autorepeat = true; - if (of_get_property(np, "linux,wakeup", NULL)) - pdata->wakeup = true; - if (of_get_property(np, "gpio-activelow", NULL)) - pdata->active_low = true; - - of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms); - of_property_read_u32(np, "col-scan-delay-us", - &pdata->col_scan_delay_us); - - gpios = devm_kzalloc(dev, - sizeof(unsigned int) * - (pdata->num_row_gpios + pdata->num_col_gpios), - GFP_KERNEL); - if (!gpios) { - dev_err(dev, "could not allocate memory for gpios\n"); - return ERR_PTR(-ENOMEM); - } - - for (i = 0; i < pdata->num_row_gpios; i++) - gpios[i] = of_get_named_gpio(np, "row-gpios", i); - - for (i = 0; i < pdata->num_col_gpios; i++) - gpios[pdata->num_row_gpios + i] = - of_get_named_gpio(np, "col-gpios", i); - - pdata->row_gpios = gpios; - pdata->col_gpios = &gpios[pdata->num_row_gpios]; - - return pdata; -} -#else -static inline struct matrix_keypad_platform_data * -matrix_keypad_parse_dt(struct device *dev) -{ - dev_err(dev, "no platform data defined\n"); - - return ERR_PTR(-EINVAL); -} -#endif - -static int matrix_keypad_probe(struct platform_device *pdev) +static int __devinit matrix_keypad_probe(struct platform_device *pdev) { const struct matrix_keypad_platform_data *pdata; + const struct matrix_keymap_data *keymap_data; struct matrix_keypad *keypad; struct input_dev *input_dev; + unsigned int row_shift; + size_t keymap_size; int err; - pdata = dev_get_platdata(&pdev->dev); + pdata = pdev->dev.platform_data; if (!pdata) { - pdata = matrix_keypad_parse_dt(&pdev->dev); - if (IS_ERR(pdata)) { - dev_err(&pdev->dev, "no platform data defined\n"); - return PTR_ERR(pdata); - } - } else if (!pdata->keymap_data) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + if (!keymap_data) { dev_err(&pdev->dev, "no keymap data defined\n"); return -EINVAL; } - keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); + row_shift = get_count_order(pdata->num_col_gpios); + keymap_size = (pdata->num_row_gpios << row_shift) * + sizeof(keypad->keycodes[0]); + keypad = kzalloc(sizeof(struct matrix_keypad) + keymap_size, + GFP_KERNEL); input_dev = input_allocate_device(); if (!keypad || !input_dev) { err = -ENOMEM; @@ -493,7 +429,7 @@ static int matrix_keypad_probe(struct platform_device *pdev) keypad->input_dev = input_dev; keypad->pdata = pdata; - keypad->row_shift = get_count_order(pdata->num_col_gpios); + keypad->row_shift = row_shift; keypad->stopped = true; INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); spin_lock_init(&keypad->lock); @@ -504,14 +440,12 @@ static int matrix_keypad_probe(struct platform_device *pdev) input_dev->open = matrix_keypad_start; input_dev->close = matrix_keypad_stop; - err = matrix_keypad_build_keymap(pdata->keymap_data, NULL, + err = matrix_keypad_build_keymap(keymap_data, NULL, pdata->num_row_gpios, pdata->num_col_gpios, - NULL, input_dev); - if (err) { - dev_err(&pdev->dev, "failed to build keymap\n"); + keypad->keycodes, input_dev); + if (err) goto err_free_mem; - } if (!pdata->no_autorepeat) __set_bit(EV_REP, input_dev->evbit); @@ -539,7 +473,7 @@ static int matrix_keypad_probe(struct platform_device *pdev) return err; } -static int matrix_keypad_remove(struct platform_device *pdev) +static int __devexit matrix_keypad_remove(struct platform_device *pdev) { struct matrix_keypad *keypad = platform_get_drvdata(pdev); @@ -554,22 +488,13 @@ static int matrix_keypad_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_OF -static const struct of_device_id matrix_keypad_dt_match[] = { - { .compatible = "gpio-matrix-keypad" }, - { } -}; -MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match); -#endif - static struct platform_driver matrix_keypad_driver = { .probe = matrix_keypad_probe, - .remove = matrix_keypad_remove, + .remove = __devexit_p(matrix_keypad_remove), .driver = { .name = "matrix-keypad", .owner = THIS_MODULE, .pm = &matrix_keypad_pm_ops, - .of_match_table = of_match_ptr(matrix_keypad_dt_match), }, }; module_platform_driver(matrix_keypad_driver); diff --git a/trunk/drivers/input/keyboard/max7359_keypad.c b/trunk/drivers/input/keyboard/max7359_keypad.c index 7c7af2b01e65..8edada8ae712 100644 --- a/trunk/drivers/input/keyboard/max7359_keypad.c +++ b/trunk/drivers/input/keyboard/max7359_keypad.c @@ -179,7 +179,7 @@ static void max7359_initialize(struct i2c_client *client) max7359_fall_deepsleep(client); } -static int max7359_probe(struct i2c_client *client, +static int __devinit max7359_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct matrix_keymap_data *keymap_data = client->dev.platform_data; @@ -260,7 +260,7 @@ static int max7359_probe(struct i2c_client *client, return error; } -static int max7359_remove(struct i2c_client *client) +static int __devexit max7359_remove(struct i2c_client *client) { struct max7359_keypad *keypad = i2c_get_clientdata(client); @@ -312,7 +312,7 @@ static struct i2c_driver max7359_i2c_driver = { .pm = &max7359_pm, }, .probe = max7359_probe, - .remove = max7359_remove, + .remove = __devexit_p(max7359_remove), .id_table = max7359_ids, }; diff --git a/trunk/drivers/input/keyboard/mcs_touchkey.c b/trunk/drivers/input/keyboard/mcs_touchkey.c index 7c236f9c6a51..0d77f6c84950 100644 --- a/trunk/drivers/input/keyboard/mcs_touchkey.c +++ b/trunk/drivers/input/keyboard/mcs_touchkey.c @@ -97,7 +97,7 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int mcs_touchkey_probe(struct i2c_client *client, +static int __devinit mcs_touchkey_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct mcs_platform_data *pdata; @@ -200,7 +200,7 @@ static int mcs_touchkey_probe(struct i2c_client *client, return error; } -static int mcs_touchkey_remove(struct i2c_client *client) +static int __devexit mcs_touchkey_remove(struct i2c_client *client) { struct mcs_touchkey_data *data = i2c_get_clientdata(client); @@ -270,7 +270,7 @@ static struct i2c_driver mcs_touchkey_driver = { .pm = &mcs_touchkey_pm_ops, }, .probe = mcs_touchkey_probe, - .remove = mcs_touchkey_remove, + .remove = __devexit_p(mcs_touchkey_remove), .shutdown = mcs_touchkey_shutdown, .id_table = mcs_touchkey_id, }; diff --git a/trunk/drivers/input/keyboard/mpr121_touchkey.c b/trunk/drivers/input/keyboard/mpr121_touchkey.c index f7f3e9a9fd3f..7613f1cac951 100644 --- a/trunk/drivers/input/keyboard/mpr121_touchkey.c +++ b/trunk/drivers/input/keyboard/mpr121_touchkey.c @@ -71,7 +71,7 @@ struct mpr121_init_register { u8 val; }; -static const struct mpr121_init_register init_reg_table[] = { +static const struct mpr121_init_register init_reg_table[] __devinitconst = { { MHD_RISING_ADDR, 0x1 }, { NHD_RISING_ADDR, 0x1 }, { MHD_FALLING_ADDR, 0x1 }, @@ -123,7 +123,7 @@ static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int mpr121_phys_init(const struct mpr121_platform_data *pdata, +static int __devinit mpr121_phys_init(const struct mpr121_platform_data *pdata, struct mpr121_touchkey *mpr121, struct i2c_client *client) { @@ -185,8 +185,8 @@ static int mpr121_phys_init(const struct mpr121_platform_data *pdata, return ret; } -static int mpr_touchkey_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int __devinit mpr_touchkey_probe(struct i2c_client *client, + const struct i2c_device_id *id) { const struct mpr121_platform_data *pdata = client->dev.platform_data; struct mpr121_touchkey *mpr121; @@ -272,7 +272,7 @@ static int mpr_touchkey_probe(struct i2c_client *client, return error; } -static int mpr_touchkey_remove(struct i2c_client *client) +static int __devexit mpr_touchkey_remove(struct i2c_client *client) { struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); @@ -327,7 +327,7 @@ static struct i2c_driver mpr_touchkey_driver = { }, .id_table = mpr121_id, .probe = mpr_touchkey_probe, - .remove = mpr_touchkey_remove, + .remove = __devexit_p(mpr_touchkey_remove), }; module_i2c_driver(mpr_touchkey_driver); diff --git a/trunk/drivers/input/keyboard/nomadik-ske-keypad.c b/trunk/drivers/input/keyboard/nomadik-ske-keypad.c index 0e6a8151fee3..49f5fa64e0b1 100644 --- a/trunk/drivers/input/keyboard/nomadik-ske-keypad.c +++ b/trunk/drivers/input/keyboard/nomadik-ske-keypad.c @@ -67,7 +67,6 @@ struct ske_keypad { const struct ske_keypad_platform_data *board; unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS]; struct clk *clk; - struct clk *pclk; spinlock_t ske_keypad_lock; }; @@ -272,18 +271,11 @@ static int __init ske_keypad_probe(struct platform_device *pdev) goto err_free_mem_region; } - keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); - if (IS_ERR(keypad->pclk)) { - dev_err(&pdev->dev, "failed to get pclk\n"); - error = PTR_ERR(keypad->pclk); - goto err_iounmap; - } - keypad->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(keypad->clk)) { dev_err(&pdev->dev, "failed to get clk\n"); error = PTR_ERR(keypad->clk); - goto err_pclk; + goto err_iounmap; } input->id.bustype = BUS_HOST; @@ -295,25 +287,14 @@ static int __init ske_keypad_probe(struct platform_device *pdev) keypad->keymap, input); if (error) { dev_err(&pdev->dev, "Failed to build keymap\n"); - goto err_clk; + goto err_iounmap; } input_set_capability(input, EV_MSC, MSC_SCAN); if (!plat->no_autorepeat) __set_bit(EV_REP, input->evbit); - error = clk_prepare_enable(keypad->pclk); - if (error) { - dev_err(&pdev->dev, "Failed to prepare/enable pclk\n"); - goto err_clk; - } - - error = clk_prepare_enable(keypad->clk); - if (error) { - dev_err(&pdev->dev, "Failed to prepare/enable clk\n"); - goto err_pclk_disable; - } - + clk_enable(keypad->clk); /* go through board initialization helpers */ if (keypad->board->init) @@ -349,13 +330,8 @@ static int __init ske_keypad_probe(struct platform_device *pdev) err_free_irq: free_irq(keypad->irq, keypad); err_clk_disable: - clk_disable_unprepare(keypad->clk); -err_pclk_disable: - clk_disable_unprepare(keypad->pclk); -err_clk: + clk_disable(keypad->clk); clk_put(keypad->clk); -err_pclk: - clk_put(keypad->pclk); err_iounmap: iounmap(keypad->reg_base); err_free_mem_region: @@ -366,7 +342,7 @@ static int __init ske_keypad_probe(struct platform_device *pdev) return error; } -static int ske_keypad_remove(struct platform_device *pdev) +static int __devexit ske_keypad_remove(struct platform_device *pdev) { struct ske_keypad *keypad = platform_get_drvdata(pdev); struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -375,7 +351,7 @@ static int ske_keypad_remove(struct platform_device *pdev) input_unregister_device(keypad->input); - clk_disable_unprepare(keypad->clk); + clk_disable(keypad->clk); clk_put(keypad->clk); if (keypad->board->exit) @@ -427,7 +403,7 @@ static struct platform_driver ske_keypad_driver = { .owner = THIS_MODULE, .pm = &ske_keypad_dev_pm_ops, }, - .remove = ske_keypad_remove, + .remove = __devexit_p(ske_keypad_remove), }; static int __init ske_keypad_init(void) diff --git a/trunk/drivers/input/keyboard/omap-keypad.c b/trunk/drivers/input/keyboard/omap-keypad.c index d0d5226d9cd4..4a5fcc8026f5 100644 --- a/trunk/drivers/input/keyboard/omap-keypad.c +++ b/trunk/drivers/input/keyboard/omap-keypad.c @@ -244,7 +244,7 @@ static int omap_kp_resume(struct platform_device *dev) #define omap_kp_resume NULL #endif -static int omap_kp_probe(struct platform_device *pdev) +static int __devinit omap_kp_probe(struct platform_device *pdev) { struct omap_kp *omap_kp; struct input_dev *input_dev; @@ -357,7 +357,7 @@ static int omap_kp_probe(struct platform_device *pdev) return -EINVAL; } -static int omap_kp_remove(struct platform_device *pdev) +static int __devexit omap_kp_remove(struct platform_device *pdev) { struct omap_kp *omap_kp = platform_get_drvdata(pdev); @@ -379,7 +379,7 @@ static int omap_kp_remove(struct platform_device *pdev) static struct platform_driver omap_kp_driver = { .probe = omap_kp_probe, - .remove = omap_kp_remove, + .remove = __devexit_p(omap_kp_remove), .suspend = omap_kp_suspend, .resume = omap_kp_resume, .driver = { diff --git a/trunk/drivers/input/keyboard/omap4-keypad.c b/trunk/drivers/input/keyboard/omap4-keypad.c index e25b022692cd..c05f98c41410 100644 --- a/trunk/drivers/input/keyboard/omap4-keypad.c +++ b/trunk/drivers/input/keyboard/omap4-keypad.c @@ -211,8 +211,8 @@ static void omap4_keypad_close(struct input_dev *input) } #ifdef CONFIG_OF -static int omap4_keypad_parse_dt(struct device *dev, - struct omap4_keypad *keypad_data) +static int __devinit omap4_keypad_parse_dt(struct device *dev, + struct omap4_keypad *keypad_data) { struct device_node *np = dev->of_node; @@ -241,7 +241,7 @@ static inline int omap4_keypad_parse_dt(struct device *dev, } #endif -static int omap4_keypad_probe(struct platform_device *pdev) +static int __devinit omap4_keypad_probe(struct platform_device *pdev) { const struct omap4_keypad_platform_data *pdata = dev_get_platdata(&pdev->dev); @@ -406,7 +406,7 @@ static int omap4_keypad_probe(struct platform_device *pdev) return error; } -static int omap4_keypad_remove(struct platform_device *pdev) +static int __devexit omap4_keypad_remove(struct platform_device *pdev) { struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); struct resource *res; @@ -440,7 +440,7 @@ MODULE_DEVICE_TABLE(of, omap_keypad_dt_match); static struct platform_driver omap4_keypad_driver = { .probe = omap4_keypad_probe, - .remove = omap4_keypad_remove, + .remove = __devexit_p(omap4_keypad_remove), .driver = { .name = "omap4-keypad", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/opencores-kbd.c b/trunk/drivers/input/keyboard/opencores-kbd.c index 7ac5f174c6f7..abe728c7b88e 100644 --- a/trunk/drivers/input/keyboard/opencores-kbd.c +++ b/trunk/drivers/input/keyboard/opencores-kbd.c @@ -37,7 +37,7 @@ static irqreturn_t opencores_kbd_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int opencores_kbd_probe(struct platform_device *pdev) +static int __devinit opencores_kbd_probe(struct platform_device *pdev) { struct input_dev *input; struct opencores_kbd *opencores_kbd; @@ -139,7 +139,7 @@ static int opencores_kbd_probe(struct platform_device *pdev) return error; } -static int opencores_kbd_remove(struct platform_device *pdev) +static int __devexit opencores_kbd_remove(struct platform_device *pdev) { struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev); @@ -158,7 +158,7 @@ static int opencores_kbd_remove(struct platform_device *pdev) static struct platform_driver opencores_kbd_device_driver = { .probe = opencores_kbd_probe, - .remove = opencores_kbd_remove, + .remove = __devexit_p(opencores_kbd_remove), .driver = { .name = "opencores-kbd", }, diff --git a/trunk/drivers/input/keyboard/pmic8xxx-keypad.c b/trunk/drivers/input/keyboard/pmic8xxx-keypad.c index 74339e139d43..52c34657d301 100644 --- a/trunk/drivers/input/keyboard/pmic8xxx-keypad.c +++ b/trunk/drivers/input/keyboard/pmic8xxx-keypad.c @@ -397,7 +397,7 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data) return IRQ_HANDLED; } -static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) +static int __devinit pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) { int bits, rc, cycles; u8 scan_val = 0, ctrl_val = 0; @@ -447,7 +447,7 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) } -static int pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, +static int __devinit pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config) { int rc, i; @@ -518,7 +518,7 @@ static void pmic8xxx_kp_close(struct input_dev *dev) * - set irq edge type. * - enable the keypad controller. */ -static int pmic8xxx_kp_probe(struct platform_device *pdev) +static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev) { const struct pm8xxx_keypad_platform_data *pdata = dev_get_platdata(&pdev->dev); @@ -712,7 +712,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev) return rc; } -static int pmic8xxx_kp_remove(struct platform_device *pdev) +static int __devexit pmic8xxx_kp_remove(struct platform_device *pdev) { struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); @@ -773,7 +773,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops, static struct platform_driver pmic8xxx_kp_driver = { .probe = pmic8xxx_kp_probe, - .remove = pmic8xxx_kp_remove, + .remove = __devexit_p(pmic8xxx_kp_remove), .driver = { .name = PM8XXX_KEYPAD_DEV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/pxa27x_keypad.c b/trunk/drivers/input/keyboard/pxa27x_keypad.c index 5330d8fbf6c0..cad9d5dd5973 100644 --- a/trunk/drivers/input/keyboard/pxa27x_keypad.c +++ b/trunk/drivers/input/keyboard/pxa27x_keypad.c @@ -482,7 +482,7 @@ static const struct dev_pm_ops pxa27x_keypad_pm_ops = { }; #endif -static int pxa27x_keypad_probe(struct platform_device *pdev) +static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) { struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data; struct pxa27x_keypad *keypad; @@ -595,7 +595,7 @@ static int pxa27x_keypad_probe(struct platform_device *pdev) return error; } -static int pxa27x_keypad_remove(struct platform_device *pdev) +static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) { struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); struct resource *res; @@ -620,7 +620,7 @@ MODULE_ALIAS("platform:pxa27x-keypad"); static struct platform_driver pxa27x_keypad_driver = { .probe = pxa27x_keypad_probe, - .remove = pxa27x_keypad_remove, + .remove = __devexit_p(pxa27x_keypad_remove), .driver = { .name = "pxa27x-keypad", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/pxa930_rotary.c b/trunk/drivers/input/keyboard/pxa930_rotary.c index bcad95be73aa..41488f9add20 100644 --- a/trunk/drivers/input/keyboard/pxa930_rotary.c +++ b/trunk/drivers/input/keyboard/pxa930_rotary.c @@ -82,7 +82,7 @@ static void pxa930_rotary_close(struct input_dev *dev) clear_sbcr(r); } -static int pxa930_rotary_probe(struct platform_device *pdev) +static int __devinit pxa930_rotary_probe(struct platform_device *pdev) { struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data; struct pxa930_rotary *r; @@ -174,7 +174,7 @@ static int pxa930_rotary_probe(struct platform_device *pdev) return err; } -static int pxa930_rotary_remove(struct platform_device *pdev) +static int __devexit pxa930_rotary_remove(struct platform_device *pdev) { struct pxa930_rotary *r = platform_get_drvdata(pdev); @@ -193,7 +193,7 @@ static struct platform_driver pxa930_rotary_driver = { .owner = THIS_MODULE, }, .probe = pxa930_rotary_probe, - .remove = pxa930_rotary_remove, + .remove = __devexit_p(pxa930_rotary_remove), }; module_platform_driver(pxa930_rotary_driver); diff --git a/trunk/drivers/input/keyboard/qt1070.c b/trunk/drivers/input/keyboard/qt1070.c index 42b773b3125a..ca68f2992d72 100644 --- a/trunk/drivers/input/keyboard/qt1070.c +++ b/trunk/drivers/input/keyboard/qt1070.c @@ -91,7 +91,7 @@ static int qt1070_write(struct i2c_client *client, u8 reg, u8 data) return ret; } -static bool qt1070_identify(struct i2c_client *client) +static bool __devinit qt1070_identify(struct i2c_client *client) { int id, ver; @@ -140,7 +140,7 @@ static irqreturn_t qt1070_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int qt1070_probe(struct i2c_client *client, +static int __devinit qt1070_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct qt1070_data *data; @@ -230,7 +230,7 @@ static int qt1070_probe(struct i2c_client *client, return err; } -static int qt1070_remove(struct i2c_client *client) +static int __devexit qt1070_remove(struct i2c_client *client) { struct qt1070_data *data = i2c_get_clientdata(client); @@ -256,7 +256,7 @@ static struct i2c_driver qt1070_driver = { }, .id_table = qt1070_id, .probe = qt1070_probe, - .remove = qt1070_remove, + .remove = __devexit_p(qt1070_remove), }; module_i2c_driver(qt1070_driver); diff --git a/trunk/drivers/input/keyboard/qt2160.c b/trunk/drivers/input/keyboard/qt2160.c index 3dc2b0f27b0c..76b7d430d03a 100644 --- a/trunk/drivers/input/keyboard/qt2160.c +++ b/trunk/drivers/input/keyboard/qt2160.c @@ -183,7 +183,7 @@ static void qt2160_worker(struct work_struct *work) qt2160_schedule_read(qt2160); } -static int qt2160_read(struct i2c_client *client, u8 reg) +static int __devinit qt2160_read(struct i2c_client *client, u8 reg) { int ret; @@ -204,20 +204,29 @@ static int qt2160_read(struct i2c_client *client, u8 reg) return ret; } -static int qt2160_write(struct i2c_client *client, u8 reg, u8 data) +static int __devinit qt2160_write(struct i2c_client *client, u8 reg, u8 data) { - int ret; + int error; - ret = i2c_smbus_write_byte_data(client, reg, data); - if (ret < 0) + error = i2c_smbus_write_byte(client, reg); + if (error) { dev_err(&client->dev, - "couldn't write data. Returned %d\n", ret); + "couldn't send request. Returned %d\n", error); + return error; + } - return ret; + error = i2c_smbus_write_byte(client, data); + if (error) { + dev_err(&client->dev, + "couldn't write data. Returned %d\n", error); + return error; + } + + return error; } -static bool qt2160_identify(struct i2c_client *client) +static bool __devinit qt2160_identify(struct i2c_client *client) { int id, ver, rev; @@ -248,7 +257,7 @@ static bool qt2160_identify(struct i2c_client *client) return true; } -static int qt2160_probe(struct i2c_client *client, +static int __devinit qt2160_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct qt2160_data *qt2160; @@ -335,7 +344,7 @@ static int qt2160_probe(struct i2c_client *client, return error; } -static int qt2160_remove(struct i2c_client *client) +static int __devexit qt2160_remove(struct i2c_client *client) { struct qt2160_data *qt2160 = i2c_get_clientdata(client); @@ -366,7 +375,7 @@ static struct i2c_driver qt2160_driver = { .id_table = qt2160_idtable, .probe = qt2160_probe, - .remove = qt2160_remove, + .remove = __devexit_p(qt2160_remove), }; module_i2c_driver(qt2160_driver); diff --git a/trunk/drivers/input/keyboard/samsung-keypad.c b/trunk/drivers/input/keyboard/samsung-keypad.c index 22e357b51024..9d7a111486f7 100644 --- a/trunk/drivers/input/keyboard/samsung-keypad.c +++ b/trunk/drivers/input/keyboard/samsung-keypad.c @@ -309,7 +309,7 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev, struct samsung_keypad *keypad) { struct device_node *np = dev->of_node; - int gpio, error, row, col; + int gpio, ret, row, col; for (row = 0; row < keypad->rows; row++) { gpio = of_get_named_gpio(np, "row-gpios", row); @@ -320,11 +320,10 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev, continue; } - error = devm_gpio_request(dev, gpio, "keypad-row"); - if (error) - dev_err(dev, - "keypad row[%d] gpio request failed: %d\n", - row, error); + ret = gpio_request(gpio, "keypad-row"); + if (ret) + dev_err(dev, "keypad row[%d] gpio request failed\n", + row); } for (col = 0; col < keypad->cols; col++) { @@ -336,22 +335,38 @@ static void samsung_keypad_parse_dt_gpio(struct device *dev, continue; } - error = devm_gpio_request(dev, gpio, "keypad-col"); - if (error) - dev_err(dev, - "keypad column[%d] gpio request failed: %d\n", - col, error); + ret = gpio_request(gpio, "keypad-col"); + if (ret) + dev_err(dev, "keypad column[%d] gpio request failed\n", + col); } } + +static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) +{ + int cnt; + + for (cnt = 0; cnt < keypad->rows; cnt++) + if (gpio_is_valid(keypad->row_gpios[cnt])) + gpio_free(keypad->row_gpios[cnt]); + + for (cnt = 0; cnt < keypad->cols; cnt++) + if (gpio_is_valid(keypad->col_gpios[cnt])) + gpio_free(keypad->col_gpios[cnt]); +} #else static struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev) { return NULL; } + +static void samsung_keypad_dt_gpio_free(struct samsung_keypad *keypad) +{ +} #endif -static int samsung_keypad_probe(struct platform_device *pdev) +static int __devinit samsung_keypad_probe(struct platform_device *pdev) { const struct samsung_keypad_platdata *pdata; const struct matrix_keymap_data *keymap_data; @@ -390,30 +405,36 @@ static int samsung_keypad_probe(struct platform_device *pdev) row_shift = get_count_order(pdata->cols); keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); - keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size, - GFP_KERNEL); - input_dev = devm_input_allocate_device(&pdev->dev); - if (!keypad || !input_dev) - return -ENOMEM; + keypad = kzalloc(sizeof(*keypad) + keymap_size, GFP_KERNEL); + input_dev = input_allocate_device(); + if (!keypad || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENODEV; + if (!res) { + error = -ENODEV; + goto err_free_mem; + } - keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); - if (!keypad->base) - return -EBUSY; + keypad->base = ioremap(res->start, resource_size(res)); + if (!keypad->base) { + error = -EBUSY; + goto err_free_mem; + } - keypad->clk = devm_clk_get(&pdev->dev, "keypad"); + keypad->clk = clk_get(&pdev->dev, "keypad"); if (IS_ERR(keypad->clk)) { dev_err(&pdev->dev, "failed to get keypad clk\n"); - return PTR_ERR(keypad->clk); + error = PTR_ERR(keypad->clk); + goto err_unmap_base; } error = clk_prepare(keypad->clk); if (error) { dev_err(&pdev->dev, "keypad clock prepare failed\n"); - return error; + goto err_put_clk; } keypad->input_dev = input_dev; @@ -458,15 +479,14 @@ static int samsung_keypad_probe(struct platform_device *pdev) keypad->irq = platform_get_irq(pdev, 0); if (keypad->irq < 0) { error = keypad->irq; - goto err_unprepare_clk; + goto err_put_clk; } - error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL, - samsung_keypad_irq, IRQF_ONESHOT, - dev_name(&pdev->dev), keypad); + error = request_threaded_irq(keypad->irq, NULL, samsung_keypad_irq, + IRQF_ONESHOT, dev_name(&pdev->dev), keypad); if (error) { dev_err(&pdev->dev, "failed to register keypad interrupt\n"); - goto err_unprepare_clk; + goto err_put_clk; } device_init_wakeup(&pdev->dev, pdata->wakeup); @@ -475,7 +495,7 @@ static int samsung_keypad_probe(struct platform_device *pdev) error = input_register_device(keypad->input_dev); if (error) - goto err_disable_runtime_pm; + goto err_free_irq; if (pdev->dev.of_node) { devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); @@ -484,16 +504,26 @@ static int samsung_keypad_probe(struct platform_device *pdev) } return 0; -err_disable_runtime_pm: +err_free_irq: + free_irq(keypad->irq, keypad); pm_runtime_disable(&pdev->dev); device_init_wakeup(&pdev->dev, 0); platform_set_drvdata(pdev, NULL); err_unprepare_clk: clk_unprepare(keypad->clk); +err_put_clk: + clk_put(keypad->clk); + samsung_keypad_dt_gpio_free(keypad); +err_unmap_base: + iounmap(keypad->base); +err_free_mem: + input_free_device(input_dev); + kfree(keypad); + return error; } -static int samsung_keypad_remove(struct platform_device *pdev) +static int __devexit samsung_keypad_remove(struct platform_device *pdev) { struct samsung_keypad *keypad = platform_get_drvdata(pdev); @@ -503,7 +533,18 @@ static int samsung_keypad_remove(struct platform_device *pdev) input_unregister_device(keypad->input_dev); + /* + * It is safe to free IRQ after unregistering device because + * samsung_keypad_close will shut off interrupts. + */ + free_irq(keypad->irq, keypad); + clk_unprepare(keypad->clk); + clk_put(keypad->clk); + samsung_keypad_dt_gpio_free(keypad); + + iounmap(keypad->base); + kfree(keypad); return 0; } @@ -644,7 +685,7 @@ MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids); static struct platform_driver samsung_keypad_driver = { .probe = samsung_keypad_probe, - .remove = samsung_keypad_remove, + .remove = __devexit_p(samsung_keypad_remove), .driver = { .name = "samsung-keypad", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/sh_keysc.c b/trunk/drivers/input/keyboard/sh_keysc.c index fdb9eb2df380..da54ad5db154 100644 --- a/trunk/drivers/input/keyboard/sh_keysc.c +++ b/trunk/drivers/input/keyboard/sh_keysc.c @@ -162,7 +162,7 @@ static irqreturn_t sh_keysc_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int sh_keysc_probe(struct platform_device *pdev) +static int __devinit sh_keysc_probe(struct platform_device *pdev) { struct sh_keysc_priv *priv; struct sh_keysc_info *pdata; @@ -272,7 +272,7 @@ static int sh_keysc_probe(struct platform_device *pdev) return error; } -static int sh_keysc_remove(struct platform_device *pdev) +static int __devexit sh_keysc_remove(struct platform_device *pdev) { struct sh_keysc_priv *priv = platform_get_drvdata(pdev); @@ -331,7 +331,7 @@ static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops, static struct platform_driver sh_keysc_device_driver = { .probe = sh_keysc_probe, - .remove = sh_keysc_remove, + .remove = __devexit_p(sh_keysc_remove), .driver = { .name = "sh_keysc", .pm = &sh_keysc_dev_pm_ops, diff --git a/trunk/drivers/input/keyboard/spear-keyboard.c b/trunk/drivers/input/keyboard/spear-keyboard.c index 695d237417d6..c7ca97f44bfb 100644 --- a/trunk/drivers/input/keyboard/spear-keyboard.c +++ b/trunk/drivers/input/keyboard/spear-keyboard.c @@ -55,15 +55,15 @@ struct spear_kbd { struct input_dev *input; + struct resource *res; void __iomem *io_base; struct clk *clk; unsigned int irq; unsigned int mode; - unsigned int suspended_rate; unsigned short last_key; unsigned short keycodes[NUM_ROWS * NUM_COLS]; bool rep; - bool irq_wake_enabled; + unsigned int suspended_rate; u32 mode_ctl_reg; }; @@ -146,7 +146,7 @@ static void spear_kbd_close(struct input_dev *dev) } #ifdef CONFIG_OF -static int spear_kbd_parse_dt(struct platform_device *pdev, +static int __devinit spear_kbd_parse_dt(struct platform_device *pdev, struct spear_kbd *kbd) { struct device_node *np = pdev->dev.of_node; @@ -181,7 +181,7 @@ static inline int spear_kbd_parse_dt(struct platform_device *pdev, } #endif -static int spear_kbd_probe(struct platform_device *pdev) +static int __devinit spear_kbd_probe(struct platform_device *pdev) { struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev); const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL; @@ -203,16 +203,12 @@ static int spear_kbd_probe(struct platform_device *pdev) return irq; } - kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL); - if (!kbd) { - dev_err(&pdev->dev, "not enough memory for driver data\n"); - return -ENOMEM; - } - - input_dev = devm_input_allocate_device(&pdev->dev); - if (!input_dev) { - dev_err(&pdev->dev, "unable to allocate input device\n"); - return -ENOMEM; + kbd = kzalloc(sizeof(*kbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!kbd || !input_dev) { + dev_err(&pdev->dev, "out of memory\n"); + error = -ENOMEM; + goto err_free_mem; } kbd->input = input_dev; @@ -221,25 +217,37 @@ static int spear_kbd_probe(struct platform_device *pdev) if (!pdata) { error = spear_kbd_parse_dt(pdev, kbd); if (error) - return error; + goto err_free_mem; } else { kbd->mode = pdata->mode; kbd->rep = pdata->rep; kbd->suspended_rate = pdata->suspended_rate; } - kbd->io_base = devm_request_and_ioremap(&pdev->dev, res); + kbd->res = request_mem_region(res->start, resource_size(res), + pdev->name); + if (!kbd->res) { + dev_err(&pdev->dev, "keyboard region already claimed\n"); + error = -EBUSY; + goto err_free_mem; + } + + kbd->io_base = ioremap(res->start, resource_size(res)); if (!kbd->io_base) { - dev_err(&pdev->dev, "request-ioremap failed for kbd_region\n"); - return -ENOMEM; + dev_err(&pdev->dev, "ioremap failed for kbd_region\n"); + error = -ENOMEM; + goto err_release_mem_region; } - kbd->clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(kbd->clk)) - return PTR_ERR(kbd->clk); + kbd->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(kbd->clk)) { + error = PTR_ERR(kbd->clk); + goto err_iounmap; + } input_dev->name = "Spear Keyboard"; input_dev->phys = "keyboard/input0"; + input_dev->dev.parent = &pdev->dev; input_dev->id.bustype = BUS_HOST; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0001; @@ -251,7 +259,7 @@ static int spear_kbd_probe(struct platform_device *pdev) kbd->keycodes, input_dev); if (error) { dev_err(&pdev->dev, "Failed to build keymap\n"); - return error; + goto err_put_clk; } if (kbd->rep) @@ -260,36 +268,48 @@ static int spear_kbd_probe(struct platform_device *pdev) input_set_drvdata(input_dev, kbd); - error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0, - "keyboard", kbd); + error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd); if (error) { - dev_err(&pdev->dev, "request_irq failed\n"); - return error; + dev_err(&pdev->dev, "request_irq fail\n"); + goto err_put_clk; } - error = clk_prepare(kbd->clk); - if (error) - return error; - error = input_register_device(input_dev); if (error) { dev_err(&pdev->dev, "Unable to register keyboard device\n"); - clk_unprepare(kbd->clk); - return error; + goto err_free_irq; } device_init_wakeup(&pdev->dev, 1); platform_set_drvdata(pdev, kbd); return 0; + +err_free_irq: + free_irq(kbd->irq, kbd); +err_put_clk: + clk_put(kbd->clk); +err_iounmap: + iounmap(kbd->io_base); +err_release_mem_region: + release_mem_region(res->start, resource_size(res)); +err_free_mem: + input_free_device(input_dev); + kfree(kbd); + + return error; } -static int spear_kbd_remove(struct platform_device *pdev) +static int __devexit spear_kbd_remove(struct platform_device *pdev) { struct spear_kbd *kbd = platform_get_drvdata(pdev); + free_irq(kbd->irq, kbd); input_unregister_device(kbd->input); - clk_unprepare(kbd->clk); + clk_put(kbd->clk); + iounmap(kbd->io_base); + release_mem_region(kbd->res->start, resource_size(kbd->res)); + kfree(kbd); device_init_wakeup(&pdev->dev, 0); platform_set_drvdata(pdev, NULL); @@ -313,8 +333,7 @@ static int spear_kbd_suspend(struct device *dev) mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG); if (device_may_wakeup(&pdev->dev)) { - if (!enable_irq_wake(kbd->irq)) - kbd->irq_wake_enabled = true; + enable_irq_wake(kbd->irq); /* * reprogram the keyboard operating frequency as on some @@ -360,10 +379,7 @@ static int spear_kbd_resume(struct device *dev) mutex_lock(&input_dev->mutex); if (device_may_wakeup(&pdev->dev)) { - if (kbd->irq_wake_enabled) { - kbd->irq_wake_enabled = false; - disable_irq_wake(kbd->irq); - } + disable_irq_wake(kbd->irq); } else { if (input_dev->users) clk_enable(kbd->clk); @@ -391,7 +407,7 @@ MODULE_DEVICE_TABLE(of, spear_kbd_id_table); static struct platform_driver spear_kbd_driver = { .probe = spear_kbd_probe, - .remove = spear_kbd_remove, + .remove = __devexit_p(spear_kbd_remove), .driver = { .name = "keyboard", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/stmpe-keypad.c b/trunk/drivers/input/keyboard/stmpe-keypad.c index 5cbec56f7720..470a8778dec1 100644 --- a/trunk/drivers/input/keyboard/stmpe-keypad.c +++ b/trunk/drivers/input/keyboard/stmpe-keypad.c @@ -166,7 +166,7 @@ static irqreturn_t stmpe_keypad_irq(int irq, void *dev) return IRQ_HANDLED; } -static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) +static int __devinit stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) { const struct stmpe_keypad_variant *variant = keypad->variant; unsigned int col_gpios = variant->col_gpios; @@ -207,7 +207,7 @@ static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD); } -static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) +static int __devinit stmpe_keypad_chip_init(struct stmpe_keypad *keypad) { const struct stmpe_keypad_platform_data *plat = keypad->plat; const struct stmpe_keypad_variant *variant = keypad->variant; @@ -257,131 +257,105 @@ static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) (plat->debounce_ms << 1)); } -static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad) -{ - int row, col; - - for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) { - for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) { - int code = MATRIX_SCAN_CODE(row, col, - STMPE_KEYPAD_ROW_SHIFT); - if (keypad->keymap[code] != KEY_RESERVED) { - keypad->rows |= 1 << row; - keypad->cols |= 1 << col; - } - } - } -} - -#ifdef CONFIG_OF -static const struct stmpe_keypad_platform_data * -stmpe_keypad_of_probe(struct device *dev) -{ - struct device_node *np = dev->of_node; - struct stmpe_keypad_platform_data *plat; - - if (!np) - return ERR_PTR(-ENODEV); - - plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); - if (!plat) - return ERR_PTR(-ENOMEM); - - of_property_read_u32(np, "debounce-interval", &plat->debounce_ms); - of_property_read_u32(np, "st,scan-count", &plat->scan_count); - - plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); - - return plat; -} -#else -static inline const struct stmpe_keypad_platform_data * -stmpe_keypad_of_probe(struct device *dev) -{ - return ERR_PTR(-EINVAL); -} -#endif - -static int stmpe_keypad_probe(struct platform_device *pdev) +static int __devinit stmpe_keypad_probe(struct platform_device *pdev) { struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); - const struct stmpe_keypad_platform_data *plat; + struct stmpe_keypad_platform_data *plat; struct stmpe_keypad *keypad; struct input_dev *input; - int error; + int ret; int irq; + int i; plat = stmpe->pdata->keypad; - if (!plat) { - plat = stmpe_keypad_of_probe(&pdev->dev); - if (IS_ERR(plat)) - return PTR_ERR(plat); - } + if (!plat) + return -ENODEV; irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; - keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad), - GFP_KERNEL); + keypad = kzalloc(sizeof(struct stmpe_keypad), GFP_KERNEL); if (!keypad) return -ENOMEM; - input = devm_input_allocate_device(&pdev->dev); - if (!input) - return -ENOMEM; + input = input_allocate_device(); + if (!input) { + ret = -ENOMEM; + goto out_freekeypad; + } input->name = "STMPE keypad"; input->id.bustype = BUS_I2C; input->dev.parent = &pdev->dev; - error = matrix_keypad_build_keymap(plat->keymap_data, NULL, - STMPE_KEYPAD_MAX_ROWS, - STMPE_KEYPAD_MAX_COLS, - keypad->keymap, input); - if (error) - return error; + ret = matrix_keypad_build_keymap(plat->keymap_data, NULL, + STMPE_KEYPAD_MAX_ROWS, + STMPE_KEYPAD_MAX_COLS, + keypad->keymap, input); + if (ret) + goto out_freeinput; input_set_capability(input, EV_MSC, MSC_SCAN); if (!plat->no_autorepeat) __set_bit(EV_REP, input->evbit); - stmpe_keypad_fill_used_pins(keypad); + for (i = 0; i < plat->keymap_data->keymap_size; i++) { + unsigned int key = plat->keymap_data->keymap[i]; + + keypad->cols |= 1 << KEY_COL(key); + keypad->rows |= 1 << KEY_ROW(key); + } keypad->stmpe = stmpe; keypad->plat = plat; keypad->input = input; keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; - error = stmpe_keypad_chip_init(keypad); - if (error < 0) - return error; + ret = stmpe_keypad_chip_init(keypad); + if (ret < 0) + goto out_freeinput; - error = devm_request_threaded_irq(&pdev->dev, irq, - NULL, stmpe_keypad_irq, - IRQF_ONESHOT, "stmpe-keypad", keypad); - if (error) { - dev_err(&pdev->dev, "unable to get irq: %d\n", error); - return error; + ret = input_register_device(input); + if (ret) { + dev_err(&pdev->dev, + "unable to register input device: %d\n", ret); + goto out_freeinput; } - error = input_register_device(input); - if (error) { - dev_err(&pdev->dev, - "unable to register input device: %d\n", error); - return error; + ret = request_threaded_irq(irq, NULL, stmpe_keypad_irq, IRQF_ONESHOT, + "stmpe-keypad", keypad); + if (ret) { + dev_err(&pdev->dev, "unable to get irq: %d\n", ret); + goto out_unregisterinput; } platform_set_drvdata(pdev, keypad); return 0; + +out_unregisterinput: + input_unregister_device(input); + input = NULL; +out_freeinput: + input_free_device(input); +out_freekeypad: + kfree(keypad); + return ret; } -static int stmpe_keypad_remove(struct platform_device *pdev) +static int __devexit stmpe_keypad_remove(struct platform_device *pdev) { struct stmpe_keypad *keypad = platform_get_drvdata(pdev); + struct stmpe *stmpe = keypad->stmpe; + int irq = platform_get_irq(pdev, 0); + + stmpe_disable(stmpe, STMPE_BLOCK_KEYPAD); - stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD); + free_irq(irq, keypad); + input_unregister_device(keypad->input); + platform_set_drvdata(pdev, NULL); + kfree(keypad); return 0; } @@ -390,7 +364,7 @@ static struct platform_driver stmpe_keypad_driver = { .driver.name = "stmpe-keypad", .driver.owner = THIS_MODULE, .probe = stmpe_keypad_probe, - .remove = stmpe_keypad_remove, + .remove = __devexit_p(stmpe_keypad_remove), }; module_platform_driver(stmpe_keypad_driver); diff --git a/trunk/drivers/input/keyboard/tc3589x-keypad.c b/trunk/drivers/input/keyboard/tc3589x-keypad.c index 2fb0d76a04c4..7d498e698508 100644 --- a/trunk/drivers/input/keyboard/tc3589x-keypad.c +++ b/trunk/drivers/input/keyboard/tc3589x-keypad.c @@ -299,7 +299,7 @@ static void tc3589x_keypad_close(struct input_dev *input) tc3589x_keypad_disable(keypad); } -static int tc3589x_keypad_probe(struct platform_device *pdev) +static int __devinit tc3589x_keypad_probe(struct platform_device *pdev) { struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent); struct tc_keypad *keypad; @@ -382,7 +382,7 @@ static int tc3589x_keypad_probe(struct platform_device *pdev) return error; } -static int tc3589x_keypad_remove(struct platform_device *pdev) +static int __devexit tc3589x_keypad_remove(struct platform_device *pdev) { struct tc_keypad *keypad = platform_get_drvdata(pdev); int irq = platform_get_irq(pdev, 0); @@ -448,7 +448,7 @@ static struct platform_driver tc3589x_keypad_driver = { .pm = &tc3589x_keypad_dev_pm_ops, }, .probe = tc3589x_keypad_probe, - .remove = tc3589x_keypad_remove, + .remove = __devexit_p(tc3589x_keypad_remove), }; module_platform_driver(tc3589x_keypad_driver); diff --git a/trunk/drivers/input/keyboard/tca6416-keypad.c b/trunk/drivers/input/keyboard/tca6416-keypad.c index bfc832c35a7c..c355cdde8d22 100644 --- a/trunk/drivers/input/keyboard/tca6416-keypad.c +++ b/trunk/drivers/input/keyboard/tca6416-keypad.c @@ -166,7 +166,7 @@ static void tca6416_keys_close(struct input_dev *dev) disable_irq(chip->irqnum); } -static int tca6416_setup_registers(struct tca6416_keypad_chip *chip) +static int __devinit tca6416_setup_registers(struct tca6416_keypad_chip *chip) { int error; @@ -197,7 +197,7 @@ static int tca6416_setup_registers(struct tca6416_keypad_chip *chip) return 0; } -static int tca6416_keypad_probe(struct i2c_client *client, +static int __devinit tca6416_keypad_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct tca6416_keys_platform_data *pdata; @@ -313,7 +313,7 @@ static int tca6416_keypad_probe(struct i2c_client *client, return error; } -static int tca6416_keypad_remove(struct i2c_client *client) +static int __devexit tca6416_keypad_remove(struct i2c_client *client) { struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); @@ -361,7 +361,7 @@ static struct i2c_driver tca6416_keypad_driver = { .pm = &tca6416_keypad_dev_pm_ops, }, .probe = tca6416_keypad_probe, - .remove = tca6416_keypad_remove, + .remove = __devexit_p(tca6416_keypad_remove), .id_table = tca6416_id, }; diff --git a/trunk/drivers/input/keyboard/tca8418_keypad.c b/trunk/drivers/input/keyboard/tca8418_keypad.c index 50e9c5e195e1..893869b29ed9 100644 --- a/trunk/drivers/input/keyboard/tca8418_keypad.c +++ b/trunk/drivers/input/keyboard/tca8418_keypad.c @@ -35,7 +35,6 @@ #include #include #include -#include /* TCA8418 hardware limits */ #define TCA8418_MAX_ROWS 8 @@ -110,11 +109,25 @@ #define KEY_EVENT_CODE 0x7f #define KEY_EVENT_VALUE 0x80 + +static const struct i2c_device_id tca8418_id[] = { + { TCA8418_NAME, 8418, }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tca8418_id); + struct tca8418_keypad { + unsigned int rows; + unsigned int cols; + unsigned int keypad_mask; /* Mask for keypad col/rol regs */ + unsigned int irq; + unsigned int row_shift; + struct i2c_client *client; struct input_dev *input; - unsigned int row_shift; + /* Flexible array member, must be at end of struct */ + unsigned short keymap[]; }; /* @@ -159,8 +172,6 @@ static int tca8418_read_byte(struct tca8418_keypad *keypad_data, static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) { - struct input_dev *input = keypad_data->input; - unsigned short *keymap = input->keycode; int error, col, row; u8 reg, state, code; @@ -179,8 +190,9 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) col = (col) ? col - 1 : TCA8418_MAX_COLS - 1; code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); - input_event(input, EV_MSC, MSC_SCAN, code); - input_report_key(input, keymap[code], state); + input_event(keypad_data->input, EV_MSC, MSC_SCAN, code); + input_report_key(keypad_data->input, + keypad_data->keymap[code], state); /* Read for next loop */ error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); @@ -190,7 +202,7 @@ static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) dev_err(&keypad_data->client->dev, "unable to read REG_KEY_EVENT_A\n"); - input_sync(input); + input_sync(keypad_data->input); } /* @@ -206,18 +218,16 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id) if (error) { dev_err(&keypad_data->client->dev, "unable to read REG_INT_STAT\n"); - return IRQ_NONE; + goto exit; } - if (!reg) - return IRQ_NONE; - if (reg & INT_STAT_OVR_FLOW_INT) dev_warn(&keypad_data->client->dev, "overflow occurred\n"); if (reg & INT_STAT_K_INT) tca8418_read_keypad(keypad_data); +exit: /* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */ reg = 0xff; error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg); @@ -231,8 +241,7 @@ static irqreturn_t tca8418_irq_handler(int irq, void *dev_id) /* * Configure the TCA8418 for keypad operation */ -static int tca8418_configure(struct tca8418_keypad *keypad_data, - u32 rows, u32 cols) +static int __devinit tca8418_configure(struct tca8418_keypad *keypad_data) { int reg, error; @@ -244,8 +253,9 @@ static int tca8418_configure(struct tca8418_keypad *keypad_data, /* Assemble a mask for row and column registers */ - reg = ~(~0 << rows); - reg += (~(~0 << cols)) << 8; + reg = ~(~0 << keypad_data->rows); + reg += (~(~0 << keypad_data->cols)) << 8; + keypad_data->keypad_mask = reg; /* Set registers to keypad mode */ error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg); @@ -260,144 +270,145 @@ static int tca8418_configure(struct tca8418_keypad *keypad_data, return error; } -static int tca8418_keypad_probe(struct i2c_client *client, +static int __devinit tca8418_keypad_probe(struct i2c_client *client, const struct i2c_device_id *id) { - struct device *dev = &client->dev; const struct tca8418_keypad_platform_data *pdata = - dev_get_platdata(dev); + client->dev.platform_data; struct tca8418_keypad *keypad_data; struct input_dev *input; - const struct matrix_keymap_data *keymap_data = NULL; - u32 rows = 0, cols = 0; - bool rep = false; - bool irq_is_gpio = false; - int irq; int error, row_shift, max_keys; /* Copy the platform data */ - if (pdata) { - if (!pdata->keymap_data) { - dev_err(dev, "no keymap data defined\n"); - return -EINVAL; - } - keymap_data = pdata->keymap_data; - rows = pdata->rows; - cols = pdata->cols; - rep = pdata->rep; - irq_is_gpio = pdata->irq_is_gpio; - } else { - struct device_node *np = dev->of_node; - of_property_read_u32(np, "keypad,num-rows", &rows); - of_property_read_u32(np, "keypad,num-columns", &cols); - rep = of_property_read_bool(np, "keypad,autorepeat"); + if (!pdata) { + dev_dbg(&client->dev, "no platform data\n"); + return -EINVAL; + } + + if (!pdata->keymap_data) { + dev_err(&client->dev, "no keymap data defined\n"); + return -EINVAL; } - if (!rows || rows > TCA8418_MAX_ROWS) { - dev_err(dev, "invalid rows\n"); + if (!pdata->rows || pdata->rows > TCA8418_MAX_ROWS) { + dev_err(&client->dev, "invalid rows\n"); return -EINVAL; } - if (!cols || cols > TCA8418_MAX_COLS) { - dev_err(dev, "invalid columns\n"); + if (!pdata->cols || pdata->cols > TCA8418_MAX_COLS) { + dev_err(&client->dev, "invalid columns\n"); return -EINVAL; } /* Check i2c driver capabilities */ if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { - dev_err(dev, "%s adapter not supported\n", + dev_err(&client->dev, "%s adapter not supported\n", dev_driver_string(&client->adapter->dev)); return -ENODEV; } - row_shift = get_count_order(cols); - max_keys = rows << row_shift; + row_shift = get_count_order(pdata->cols); + max_keys = pdata->rows << row_shift; - /* Allocate memory for keypad_data and input device */ - keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL); + /* Allocate memory for keypad_data, keymap and input device */ + keypad_data = kzalloc(sizeof(*keypad_data) + + max_keys * sizeof(keypad_data->keymap[0]), GFP_KERNEL); if (!keypad_data) return -ENOMEM; + keypad_data->rows = pdata->rows; + keypad_data->cols = pdata->cols; keypad_data->client = client; keypad_data->row_shift = row_shift; /* Initialize the chip or fail if chip isn't present */ - error = tca8418_configure(keypad_data, rows, cols); + error = tca8418_configure(keypad_data); if (error < 0) - return error; + goto fail1; /* Configure input device */ - input = devm_input_allocate_device(dev); - if (!input) - return -ENOMEM; - + input = input_allocate_device(); + if (!input) { + error = -ENOMEM; + goto fail1; + } keypad_data->input = input; input->name = client->name; + input->dev.parent = &client->dev; + input->id.bustype = BUS_I2C; input->id.vendor = 0x0001; input->id.product = 0x001; input->id.version = 0x0001; - error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols, - NULL, input); + error = matrix_keypad_build_keymap(pdata->keymap_data, NULL, + pdata->rows, pdata->cols, + keypad_data->keymap, input); if (error) { - dev_err(dev, "Failed to build keymap\n"); - return error; + dev_dbg(&client->dev, "Failed to build keymap\n"); + goto fail2; } - if (rep) + if (pdata->rep) __set_bit(EV_REP, input->evbit); input_set_capability(input, EV_MSC, MSC_SCAN); input_set_drvdata(input, keypad_data); - irq = client->irq; - if (irq_is_gpio) - irq = gpio_to_irq(irq); + if (pdata->irq_is_gpio) + client->irq = gpio_to_irq(client->irq); - error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler, - IRQF_TRIGGER_FALLING | - IRQF_SHARED | - IRQF_ONESHOT, - client->name, keypad_data); + error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->name, keypad_data); if (error) { - dev_err(dev, "Unable to claim irq %d; error %d\n", + dev_dbg(&client->dev, + "Unable to claim irq %d; error %d\n", client->irq, error); - return error; + goto fail2; } error = input_register_device(input); if (error) { - dev_err(dev, "Unable to register input device, error: %d\n", - error); - return error; + dev_dbg(&client->dev, + "Unable to register input device, error: %d\n", error); + goto fail3; } + i2c_set_clientdata(client, keypad_data); return 0; + +fail3: + free_irq(client->irq, keypad_data); +fail2: + input_free_device(input); +fail1: + kfree(keypad_data); + return error; } -static const struct i2c_device_id tca8418_id[] = { - { TCA8418_NAME, 8418, }, - { } -}; -MODULE_DEVICE_TABLE(i2c, tca8418_id); +static int __devexit tca8418_keypad_remove(struct i2c_client *client) +{ + struct tca8418_keypad *keypad_data = i2c_get_clientdata(client); + + free_irq(keypad_data->client->irq, keypad_data); + + input_unregister_device(keypad_data->input); + + kfree(keypad_data); + + return 0; +} -#ifdef CONFIG_OF -static const struct of_device_id tca8418_dt_ids[] __devinitconst = { - { .compatible = "ti,tca8418", }, - { } -}; -MODULE_DEVICE_TABLE(of, tca8418_dt_ids); -#endif static struct i2c_driver tca8418_keypad_driver = { .driver = { .name = TCA8418_NAME, .owner = THIS_MODULE, - .of_match_table = of_match_ptr(tca8418_dt_ids), }, .probe = tca8418_keypad_probe, + .remove = __devexit_p(tca8418_keypad_remove), .id_table = tca8418_id, }; diff --git a/trunk/drivers/input/keyboard/tegra-kbc.c b/trunk/drivers/input/keyboard/tegra-kbc.c index c76f96872d31..5faaf2553e33 100644 --- a/trunk/drivers/input/keyboard/tegra-kbc.c +++ b/trunk/drivers/input/keyboard/tegra-kbc.c @@ -87,7 +87,7 @@ struct tegra_kbc { struct clk *clk; }; -static const u32 tegra_kbc_default_keymap[] = { +static const u32 tegra_kbc_default_keymap[] __devinitdata = { KEY(0, 2, KEY_W), KEY(0, 3, KEY_S), KEY(0, 4, KEY_A), @@ -223,7 +223,7 @@ static const u32 tegra_kbc_default_keymap[] = { }; static const -struct matrix_keymap_data tegra_kbc_default_keymap_data = { +struct matrix_keymap_data tegra_kbc_default_keymap_data __devinitdata = { .keymap = tegra_kbc_default_keymap, .keymap_size = ARRAY_SIZE(tegra_kbc_default_keymap), }; @@ -573,7 +573,7 @@ static void tegra_kbc_close(struct input_dev *dev) return tegra_kbc_stop(kbc); } -static bool +static bool __devinit tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, struct device *dev, unsigned int *num_rows) { @@ -619,7 +619,7 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata, } #ifdef CONFIG_OF -static struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata( +static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata( struct platform_device *pdev) { struct tegra_kbc_platform_data *pdata; @@ -670,7 +670,7 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata( } #endif -static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc) +static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc) { const struct tegra_kbc_platform_data *pdata = kbc->pdata; const struct matrix_keymap_data *keymap_data = pdata->keymap_data; @@ -697,7 +697,7 @@ static int tegra_kbd_setup_keymap(struct tegra_kbc *kbc) return retval; } -static int tegra_kbc_probe(struct platform_device *pdev) +static int __devinit tegra_kbc_probe(struct platform_device *pdev) { const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data; struct tegra_kbc *kbc; @@ -838,7 +838,7 @@ static int tegra_kbc_probe(struct platform_device *pdev) return err; } -static int tegra_kbc_remove(struct platform_device *pdev) +static int __devexit tegra_kbc_remove(struct platform_device *pdev) { struct tegra_kbc *kbc = platform_get_drvdata(pdev); struct resource *res; @@ -954,7 +954,7 @@ MODULE_DEVICE_TABLE(of, tegra_kbc_of_match); static struct platform_driver tegra_kbc_driver = { .probe = tegra_kbc_probe, - .remove = tegra_kbc_remove, + .remove = __devexit_p(tegra_kbc_remove), .driver = { .name = "tegra-kbc", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/tnetv107x-keypad.c b/trunk/drivers/input/keyboard/tnetv107x-keypad.c index ee1635011292..4c34f21fbe2d 100644 --- a/trunk/drivers/input/keyboard/tnetv107x-keypad.c +++ b/trunk/drivers/input/keyboard/tnetv107x-keypad.c @@ -153,7 +153,7 @@ static void keypad_stop(struct input_dev *dev) clk_disable(kp->clk); } -static int keypad_probe(struct platform_device *pdev) +static int __devinit keypad_probe(struct platform_device *pdev) { const struct matrix_keypad_platform_data *pdata; const struct matrix_keymap_data *keymap_data; @@ -301,7 +301,7 @@ static int keypad_probe(struct platform_device *pdev) return error; } -static int keypad_remove(struct platform_device *pdev) +static int __devexit keypad_remove(struct platform_device *pdev) { struct keypad_data *kp = platform_get_drvdata(pdev); @@ -319,7 +319,7 @@ static int keypad_remove(struct platform_device *pdev) static struct platform_driver keypad_driver = { .probe = keypad_probe, - .remove = keypad_remove, + .remove = __devexit_p(keypad_remove), .driver.name = "tnetv107x-keypad", .driver.owner = THIS_MODULE, }; diff --git a/trunk/drivers/input/keyboard/twl4030_keypad.c b/trunk/drivers/input/keyboard/twl4030_keypad.c index 04f84fd57173..a2c6f79aa101 100644 --- a/trunk/drivers/input/keyboard/twl4030_keypad.c +++ b/trunk/drivers/input/keyboard/twl4030_keypad.c @@ -271,7 +271,7 @@ static irqreturn_t do_kp_irq(int irq, void *_kp) return IRQ_HANDLED; } -static int twl4030_kp_program(struct twl4030_keypad *kp) +static int __devinit twl4030_kp_program(struct twl4030_keypad *kp) { u8 reg; int i; @@ -328,7 +328,7 @@ static int twl4030_kp_program(struct twl4030_keypad *kp) * Registers keypad device with input subsystem * and configures TWL4030 keypad registers */ -static int twl4030_kp_probe(struct platform_device *pdev) +static int __devinit twl4030_kp_probe(struct platform_device *pdev) { struct twl4030_keypad_data *pdata = pdev->dev.platform_data; const struct matrix_keymap_data *keymap_data; @@ -432,7 +432,7 @@ static int twl4030_kp_probe(struct platform_device *pdev) return error; } -static int twl4030_kp_remove(struct platform_device *pdev) +static int __devexit twl4030_kp_remove(struct platform_device *pdev) { struct twl4030_keypad *kp = platform_get_drvdata(pdev); @@ -452,7 +452,7 @@ static int twl4030_kp_remove(struct platform_device *pdev) static struct platform_driver twl4030_kp_driver = { .probe = twl4030_kp_probe, - .remove = twl4030_kp_remove, + .remove = __devexit_p(twl4030_kp_remove), .driver = { .name = "twl4030_keypad", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/keyboard/w90p910_keypad.c b/trunk/drivers/input/keyboard/w90p910_keypad.c index ee163bee8cce..e0f6cd1ad0fd 100644 --- a/trunk/drivers/input/keyboard/w90p910_keypad.c +++ b/trunk/drivers/input/keyboard/w90p910_keypad.c @@ -118,7 +118,7 @@ static void w90p910_keypad_close(struct input_dev *dev) clk_disable(keypad->clk); } -static int w90p910_keypad_probe(struct platform_device *pdev) +static int __devinit w90p910_keypad_probe(struct platform_device *pdev) { const struct w90p910_keypad_platform_data *pdata = pdev->dev.platform_data; @@ -234,7 +234,7 @@ static int w90p910_keypad_probe(struct platform_device *pdev) return error; } -static int w90p910_keypad_remove(struct platform_device *pdev) +static int __devexit w90p910_keypad_remove(struct platform_device *pdev) { struct w90p910_keypad *keypad = platform_get_drvdata(pdev); struct resource *res; @@ -257,7 +257,7 @@ static int w90p910_keypad_remove(struct platform_device *pdev) static struct platform_driver w90p910_keypad_driver = { .probe = w90p910_keypad_probe, - .remove = w90p910_keypad_remove, + .remove = __devexit_p(w90p910_keypad_remove), .driver = { .name = "nuc900-kpi", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/matrix-keymap.c b/trunk/drivers/input/matrix-keymap.c index 3ae496ea5fe6..d88d9be1d1b7 100644 --- a/trunk/drivers/input/matrix-keymap.c +++ b/trunk/drivers/input/matrix-keymap.c @@ -18,7 +18,6 @@ */ #include -#include #include #include #include @@ -124,11 +123,6 @@ static int matrix_keypad_parse_of_keymap(const char *propname, * it will attempt load the keymap from property specified by @keymap_name * argument (or "linux,keymap" if @keymap_name is %NULL). * - * If @keymap is %NULL the function will automatically allocate managed - * block of memory to store the keymap. This memory will be associated with - * the parent device and automatically freed when device unbinds from the - * driver. - * * Callers are expected to set up input_dev->dev.parent before calling this * function. */ @@ -139,27 +133,12 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, struct input_dev *input_dev) { unsigned int row_shift = get_count_order(cols); - size_t max_keys = rows << row_shift; int i; int error; - if (WARN_ON(!input_dev->dev.parent)) - return -EINVAL; - - if (!keymap) { - keymap = devm_kzalloc(input_dev->dev.parent, - max_keys * sizeof(*keymap), - GFP_KERNEL); - if (!keymap) { - dev_err(input_dev->dev.parent, - "Unable to allocate memory for keymap"); - return -ENOMEM; - } - } - input_dev->keycode = keymap; input_dev->keycodesize = sizeof(*keymap); - input_dev->keycodemax = max_keys; + input_dev->keycodemax = rows << row_shift; __set_bit(EV_KEY, input_dev->evbit); diff --git a/trunk/drivers/input/misc/88pm80x_onkey.c b/trunk/drivers/input/misc/88pm80x_onkey.c index ee43e5b7c881..7f26e7b6c228 100644 --- a/trunk/drivers/input/misc/88pm80x_onkey.c +++ b/trunk/drivers/input/misc/88pm80x_onkey.c @@ -62,7 +62,7 @@ static irqreturn_t pm80x_onkey_handler(int irq, void *data) static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend, pm80x_dev_resume); -static int pm80x_onkey_probe(struct platform_device *pdev) +static int __devinit pm80x_onkey_probe(struct platform_device *pdev) { struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); @@ -139,7 +139,7 @@ static int pm80x_onkey_probe(struct platform_device *pdev) return err; } -static int pm80x_onkey_remove(struct platform_device *pdev) +static int __devexit pm80x_onkey_remove(struct platform_device *pdev) { struct pm80x_onkey_info *info = platform_get_drvdata(pdev); @@ -157,7 +157,7 @@ static struct platform_driver pm80x_onkey_driver = { .pm = &pm80x_onkey_pm_ops, }, .probe = pm80x_onkey_probe, - .remove = pm80x_onkey_remove, + .remove = __devexit_p(pm80x_onkey_remove), }; module_platform_driver(pm80x_onkey_driver); diff --git a/trunk/drivers/input/misc/88pm860x_onkey.c b/trunk/drivers/input/misc/88pm860x_onkey.c index abd8453e5212..f9ce1835e4d7 100644 --- a/trunk/drivers/input/misc/88pm860x_onkey.c +++ b/trunk/drivers/input/misc/88pm860x_onkey.c @@ -56,7 +56,7 @@ static irqreturn_t pm860x_onkey_handler(int irq, void *data) return IRQ_HANDLED; } -static int pm860x_onkey_probe(struct platform_device *pdev) +static int __devinit pm860x_onkey_probe(struct platform_device *pdev) { struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm860x_onkey_info *info; @@ -121,7 +121,7 @@ static int pm860x_onkey_probe(struct platform_device *pdev) return ret; } -static int pm860x_onkey_remove(struct platform_device *pdev) +static int __devexit pm860x_onkey_remove(struct platform_device *pdev) { struct pm860x_onkey_info *info = platform_get_drvdata(pdev); @@ -161,7 +161,7 @@ static struct platform_driver pm860x_onkey_driver = { .pm = &pm860x_onkey_pm_ops, }, .probe = pm860x_onkey_probe, - .remove = pm860x_onkey_remove, + .remove = __devexit_p(pm860x_onkey_remove), }; module_platform_driver(pm860x_onkey_driver); diff --git a/trunk/drivers/input/misc/Kconfig b/trunk/drivers/input/misc/Kconfig index 259ef31abb18..104a7c3153c0 100644 --- a/trunk/drivers/input/misc/Kconfig +++ b/trunk/drivers/input/misc/Kconfig @@ -300,7 +300,8 @@ config INPUT_ATI_REMOTE2 called ati_remote2. config INPUT_KEYSPAN_REMOTE - tristate "Keyspan DMR USB remote control" + tristate "Keyspan DMR USB remote control (EXPERIMENTAL)" + depends on EXPERIMENTAL depends on USB_ARCH_HAS_HCD select USB help @@ -349,6 +350,7 @@ config INPUT_POWERMATE config INPUT_YEALINK tristate "Yealink usb-p1k voip phone" + depends on EXPERIMENTAL depends on USB_ARCH_HAS_HCD select USB help @@ -364,6 +366,7 @@ config INPUT_YEALINK config INPUT_CM109 tristate "C-Media CM109 USB I/O Controller" + depends on EXPERIMENTAL depends on USB_ARCH_HAS_HCD select USB help @@ -374,16 +377,6 @@ config INPUT_CM109 To compile this driver as a module, choose M here: the module will be called cm109. -config INPUT_RETU_PWRBUTTON - tristate "Retu Power button Driver" - depends on MFD_RETU - help - Say Y here if you want to enable power key reporting via the - Retu chips found in Nokia Internet Tablets (770, N800, N810). - - To compile this driver as a module, choose M here. The module will - be called retu-pwrbutton. - config INPUT_TWL4030_PWRBUTTON tristate "TWL4030 Power button Driver" depends on TWL4030_CORE @@ -451,7 +444,7 @@ config INPUT_PCF50633_PMU config INPUT_PCF8574 tristate "PCF8574 Keypad input device" - depends on I2C + depends on I2C && EXPERIMENTAL help Say Y here if you want to support a keypad connected via I2C with a PCF8574. @@ -461,7 +454,7 @@ config INPUT_PCF8574 config INPUT_PWM_BEEPER tristate "PWM beeper support" - depends on HAVE_PWM || PWM + depends on HAVE_PWM help Say Y here to get support for PWM based beeper devices. @@ -503,16 +496,6 @@ config INPUT_DA9052_ONKEY To compile this driver as a module, choose M here: the module will be called da9052_onkey. -config INPUT_DA9055_ONKEY - tristate "Dialog Semiconductor DA9055 ONKEY" - depends on MFD_DA9055 - help - Support the ONKEY of DA9055 PMICs as an input device - reporting power button status. - - To compile this driver as a module, choose M here: the module - will be called da9055_onkey. - config INPUT_DM355EVM tristate "TI DaVinci DM355 EVM Keypad and IR Remote" depends on MFD_DM355EVM_MSP diff --git a/trunk/drivers/input/misc/Makefile b/trunk/drivers/input/misc/Makefile index 1f1e1b109d9d..5ea769eda999 100644 --- a/trunk/drivers/input/misc/Makefile +++ b/trunk/drivers/input/misc/Makefile @@ -24,7 +24,6 @@ obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o -obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o @@ -47,7 +46,6 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o obj-$(CONFIG_INPUT_POWERMATE) += powermate.o obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o -obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o diff --git a/trunk/drivers/input/misc/ab8500-ponkey.c b/trunk/drivers/input/misc/ab8500-ponkey.c index 2f090b46e716..84ec691c05aa 100644 --- a/trunk/drivers/input/misc/ab8500-ponkey.c +++ b/trunk/drivers/input/misc/ab8500-ponkey.c @@ -45,7 +45,7 @@ static irqreturn_t ab8500_ponkey_handler(int irq, void *data) return IRQ_HANDLED; } -static int ab8500_ponkey_probe(struct platform_device *pdev) +static int __devinit ab8500_ponkey_probe(struct platform_device *pdev) { struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent); struct ab8500_ponkey *ponkey; @@ -118,7 +118,7 @@ static int ab8500_ponkey_probe(struct platform_device *pdev) return error; } -static int ab8500_ponkey_remove(struct platform_device *pdev) +static int __devexit ab8500_ponkey_remove(struct platform_device *pdev) { struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev); @@ -146,7 +146,7 @@ static struct platform_driver ab8500_ponkey_driver = { .of_match_table = of_match_ptr(ab8500_ponkey_match), }, .probe = ab8500_ponkey_probe, - .remove = ab8500_ponkey_remove, + .remove = __devexit_p(ab8500_ponkey_remove), }; module_platform_driver(ab8500_ponkey_driver); diff --git a/trunk/drivers/input/misc/ad714x-i2c.c b/trunk/drivers/input/misc/ad714x-i2c.c index 29d2064c26f2..c8a79015472a 100644 --- a/trunk/drivers/input/misc/ad714x-i2c.c +++ b/trunk/drivers/input/misc/ad714x-i2c.c @@ -72,7 +72,7 @@ static int ad714x_i2c_read(struct ad714x_chip *chip, return 0; } -static int ad714x_i2c_probe(struct i2c_client *client, +static int __devinit ad714x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ad714x_chip *chip; @@ -87,7 +87,7 @@ static int ad714x_i2c_probe(struct i2c_client *client, return 0; } -static int ad714x_i2c_remove(struct i2c_client *client) +static int __devexit ad714x_i2c_remove(struct i2c_client *client) { struct ad714x_chip *chip = i2c_get_clientdata(client); @@ -112,7 +112,7 @@ static struct i2c_driver ad714x_i2c_driver = { .pm = &ad714x_i2c_pm, }, .probe = ad714x_i2c_probe, - .remove = ad714x_i2c_remove, + .remove = __devexit_p(ad714x_i2c_remove), .id_table = ad714x_id, }; diff --git a/trunk/drivers/input/misc/ad714x-spi.c b/trunk/drivers/input/misc/ad714x-spi.c index bdccca42d138..75f6136d608e 100644 --- a/trunk/drivers/input/misc/ad714x-spi.c +++ b/trunk/drivers/input/misc/ad714x-spi.c @@ -83,7 +83,7 @@ static int ad714x_spi_write(struct ad714x_chip *chip, return 0; } -static int ad714x_spi_probe(struct spi_device *spi) +static int __devinit ad714x_spi_probe(struct spi_device *spi) { struct ad714x_chip *chip; int err; @@ -103,7 +103,7 @@ static int ad714x_spi_probe(struct spi_device *spi) return 0; } -static int ad714x_spi_remove(struct spi_device *spi) +static int __devexit ad714x_spi_remove(struct spi_device *spi) { struct ad714x_chip *chip = spi_get_drvdata(spi); @@ -120,7 +120,7 @@ static struct spi_driver ad714x_spi_driver = { .pm = &ad714x_spi_pm, }, .probe = ad714x_spi_probe, - .remove = ad714x_spi_remove, + .remove = __devexit_p(ad714x_spi_remove), }; module_spi_driver(ad714x_spi_driver); diff --git a/trunk/drivers/input/misc/adxl34x-i2c.c b/trunk/drivers/input/misc/adxl34x-i2c.c index 535dda48cace..dd1d1c145a7f 100644 --- a/trunk/drivers/input/misc/adxl34x-i2c.c +++ b/trunk/drivers/input/misc/adxl34x-i2c.c @@ -73,7 +73,7 @@ static const struct adxl34x_bus_ops adxl34x_i2c_bops = { .read_block = adxl34x_i2c_read_block, }; -static int adxl34x_i2c_probe(struct i2c_client *client, +static int __devinit adxl34x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct adxl34x *ac; @@ -98,7 +98,7 @@ static int adxl34x_i2c_probe(struct i2c_client *client, return 0; } -static int adxl34x_i2c_remove(struct i2c_client *client) +static int __devexit adxl34x_i2c_remove(struct i2c_client *client) { struct adxl34x *ac = i2c_get_clientdata(client); @@ -144,7 +144,7 @@ static struct i2c_driver adxl34x_driver = { .pm = &adxl34x_i2c_pm, }, .probe = adxl34x_i2c_probe, - .remove = adxl34x_i2c_remove, + .remove = __devexit_p(adxl34x_i2c_remove), .id_table = adxl34x_id, }; diff --git a/trunk/drivers/input/misc/adxl34x-spi.c b/trunk/drivers/input/misc/adxl34x-spi.c index ad5f40d37e48..820a802a1e6e 100644 --- a/trunk/drivers/input/misc/adxl34x-spi.c +++ b/trunk/drivers/input/misc/adxl34x-spi.c @@ -65,7 +65,7 @@ static const struct adxl34x_bus_ops adxl34x_spi_bops = { .read_block = adxl34x_spi_read_block, }; -static int adxl34x_spi_probe(struct spi_device *spi) +static int __devinit adxl34x_spi_probe(struct spi_device *spi) { struct adxl34x *ac; @@ -87,7 +87,7 @@ static int adxl34x_spi_probe(struct spi_device *spi) return 0; } -static int adxl34x_spi_remove(struct spi_device *spi) +static int __devexit adxl34x_spi_remove(struct spi_device *spi) { struct adxl34x *ac = dev_get_drvdata(&spi->dev); @@ -126,7 +126,7 @@ static struct spi_driver adxl34x_driver = { .pm = &adxl34x_spi_pm, }, .probe = adxl34x_spi_probe, - .remove = adxl34x_spi_remove, + .remove = __devexit_p(adxl34x_spi_remove), }; module_spi_driver(adxl34x_driver); diff --git a/trunk/drivers/input/misc/bfin_rotary.c b/trunk/drivers/input/misc/bfin_rotary.c index a6666e142a91..1c4146fccfdf 100644 --- a/trunk/drivers/input/misc/bfin_rotary.c +++ b/trunk/drivers/input/misc/bfin_rotary.c @@ -90,7 +90,7 @@ static irqreturn_t bfin_rotary_isr(int irq, void *dev_id) return IRQ_HANDLED; } -static int bfin_rotary_probe(struct platform_device *pdev) +static int __devinit bfin_rotary_probe(struct platform_device *pdev) { struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data; struct bfin_rot *rotary; @@ -196,7 +196,7 @@ static int bfin_rotary_probe(struct platform_device *pdev) return error; } -static int bfin_rotary_remove(struct platform_device *pdev) +static int __devexit bfin_rotary_remove(struct platform_device *pdev) { struct bfin_rot *rotary = platform_get_drvdata(pdev); @@ -255,7 +255,7 @@ static const struct dev_pm_ops bfin_rotary_pm_ops = { static struct platform_driver bfin_rotary_device_driver = { .probe = bfin_rotary_probe, - .remove = bfin_rotary_remove, + .remove = __devexit_p(bfin_rotary_remove), .driver = { .name = "bfin-rotary", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/bma150.c b/trunk/drivers/input/misc/bma150.c index 08ffcabd7220..e2f1e9f952b1 100644 --- a/trunk/drivers/input/misc/bma150.c +++ b/trunk/drivers/input/misc/bma150.c @@ -158,7 +158,7 @@ struct bma150_data { * are stated and verified by Bosch Sensortec where they are configured * to provide a generic sensitivity performance. */ -static struct bma150_cfg default_cfg = { +static struct bma150_cfg default_cfg __devinitdata = { .any_motion_int = 1, .hg_int = 1, .lg_int = 1, @@ -224,7 +224,7 @@ static int bma150_set_mode(struct bma150_data *bma150, u8 mode) return 0; } -static int bma150_soft_reset(struct bma150_data *bma150) +static int __devinit bma150_soft_reset(struct bma150_data *bma150) { int error; @@ -237,19 +237,19 @@ static int bma150_soft_reset(struct bma150_data *bma150) return 0; } -static int bma150_set_range(struct bma150_data *bma150, u8 range) +static int __devinit bma150_set_range(struct bma150_data *bma150, u8 range) { return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS, BMA150_RANGE_MSK, BMA150_RANGE_REG); } -static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw) +static int __devinit bma150_set_bandwidth(struct bma150_data *bma150, u8 bw) { return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS, BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG); } -static int bma150_set_low_g_interrupt(struct bma150_data *bma150, +static int __devinit bma150_set_low_g_interrupt(struct bma150_data *bma150, u8 enable, u8 hyst, u8 dur, u8 thres) { int error; @@ -273,7 +273,7 @@ static int bma150_set_low_g_interrupt(struct bma150_data *bma150, BMA150_LOW_G_EN_REG); } -static int bma150_set_high_g_interrupt(struct bma150_data *bma150, +static int __devinit bma150_set_high_g_interrupt(struct bma150_data *bma150, u8 enable, u8 hyst, u8 dur, u8 thres) { int error; @@ -300,7 +300,7 @@ static int bma150_set_high_g_interrupt(struct bma150_data *bma150, } -static int bma150_set_any_motion_interrupt(struct bma150_data *bma150, +static int __devinit bma150_set_any_motion_interrupt(struct bma150_data *bma150, u8 enable, u8 dur, u8 thres) { int error; @@ -424,7 +424,7 @@ static void bma150_poll_close(struct input_polled_dev *ipoll_dev) bma150_close(bma150); } -static int bma150_initialize(struct bma150_data *bma150, +static int __devinit bma150_initialize(struct bma150_data *bma150, const struct bma150_cfg *cfg) { int error; @@ -465,7 +465,7 @@ static int bma150_initialize(struct bma150_data *bma150, return bma150_set_mode(bma150, BMA150_MODE_SLEEP); } -static void bma150_init_input_device(struct bma150_data *bma150, +static void __devinit bma150_init_input_device(struct bma150_data *bma150, struct input_dev *idev) { idev->name = BMA150_DRIVER; @@ -479,7 +479,7 @@ static void bma150_init_input_device(struct bma150_data *bma150, input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0); } -static int bma150_register_input_device(struct bma150_data *bma150) +static int __devinit bma150_register_input_device(struct bma150_data *bma150) { struct input_dev *idev; int error; @@ -504,7 +504,7 @@ static int bma150_register_input_device(struct bma150_data *bma150) return 0; } -static int bma150_register_polled_device(struct bma150_data *bma150) +static int __devinit bma150_register_polled_device(struct bma150_data *bma150) { struct input_polled_dev *ipoll_dev; int error; @@ -535,7 +535,7 @@ static int bma150_register_polled_device(struct bma150_data *bma150) return 0; } -static int bma150_probe(struct i2c_client *client, +static int __devinit bma150_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct bma150_platform_data *pdata = client->dev.platform_data; @@ -613,7 +613,7 @@ static int bma150_probe(struct i2c_client *client, return error; } -static int bma150_remove(struct i2c_client *client) +static int __devexit bma150_remove(struct i2c_client *client) { struct bma150_data *bma150 = i2c_get_clientdata(client); @@ -670,7 +670,7 @@ static struct i2c_driver bma150_driver = { .class = I2C_CLASS_HWMON, .id_table = bma150_id, .probe = bma150_probe, - .remove = bma150_remove, + .remove = __devexit_p(bma150_remove), }; module_i2c_driver(bma150_driver); diff --git a/trunk/drivers/input/misc/cma3000_d0x_i2c.c b/trunk/drivers/input/misc/cma3000_d0x_i2c.c index 4fdef98ceb56..fe9b85f07792 100644 --- a/trunk/drivers/input/misc/cma3000_d0x_i2c.c +++ b/trunk/drivers/input/misc/cma3000_d0x_i2c.c @@ -55,7 +55,7 @@ static const struct cma3000_bus_ops cma3000_i2c_bops = { .write = cma3000_i2c_set, }; -static int cma3000_i2c_probe(struct i2c_client *client, +static int __devinit cma3000_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct cma3000_accl_data *data; @@ -69,7 +69,7 @@ static int cma3000_i2c_probe(struct i2c_client *client, return 0; } -static int cma3000_i2c_remove(struct i2c_client *client) +static int __devexit cma3000_i2c_remove(struct i2c_client *client) { struct cma3000_accl_data *data = i2c_get_clientdata(client); @@ -114,7 +114,7 @@ MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id); static struct i2c_driver cma3000_i2c_driver = { .probe = cma3000_i2c_probe, - .remove = cma3000_i2c_remove, + .remove = __devexit_p(cma3000_i2c_remove), .id_table = cma3000_i2c_id, .driver = { .name = "cma3000_i2c_accl", diff --git a/trunk/drivers/input/misc/cobalt_btns.c b/trunk/drivers/input/misc/cobalt_btns.c index 4f77f87847e8..53e43d295148 100644 --- a/trunk/drivers/input/misc/cobalt_btns.c +++ b/trunk/drivers/input/misc/cobalt_btns.c @@ -73,7 +73,7 @@ static void handle_buttons(struct input_polled_dev *dev) } } -static int cobalt_buttons_probe(struct platform_device *pdev) +static int __devinit cobalt_buttons_probe(struct platform_device *pdev) { struct buttons_dev *bdev; struct input_polled_dev *poll_dev; @@ -135,7 +135,7 @@ static int cobalt_buttons_probe(struct platform_device *pdev) return error; } -static int cobalt_buttons_remove(struct platform_device *pdev) +static int __devexit cobalt_buttons_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct buttons_dev *bdev = dev_get_drvdata(dev); @@ -157,7 +157,7 @@ MODULE_ALIAS("platform:Cobalt buttons"); static struct platform_driver cobalt_buttons_driver = { .probe = cobalt_buttons_probe, - .remove = cobalt_buttons_remove, + .remove = __devexit_p(cobalt_buttons_remove), .driver = { .name = "Cobalt buttons", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/da9052_onkey.c b/trunk/drivers/input/misc/da9052_onkey.c index 020569a499f2..3be3acc3a6eb 100644 --- a/trunk/drivers/input/misc/da9052_onkey.c +++ b/trunk/drivers/input/misc/da9052_onkey.c @@ -70,7 +70,7 @@ static irqreturn_t da9052_onkey_irq(int irq, void *data) return IRQ_HANDLED; } -static int da9052_onkey_probe(struct platform_device *pdev) +static int __devinit da9052_onkey_probe(struct platform_device *pdev) { struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent); struct da9052_onkey *onkey; @@ -129,7 +129,7 @@ static int da9052_onkey_probe(struct platform_device *pdev) return error; } -static int da9052_onkey_remove(struct platform_device *pdev) +static int __devexit da9052_onkey_remove(struct platform_device *pdev) { struct da9052_onkey *onkey = platform_get_drvdata(pdev); @@ -144,7 +144,7 @@ static int da9052_onkey_remove(struct platform_device *pdev) static struct platform_driver da9052_onkey_driver = { .probe = da9052_onkey_probe, - .remove = da9052_onkey_remove, + .remove = __devexit_p(da9052_onkey_remove), .driver = { .name = "da9052-onkey", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/da9055_onkey.c b/trunk/drivers/input/misc/da9055_onkey.c deleted file mode 100644 index ee6ae3a00174..000000000000 --- a/trunk/drivers/input/misc/da9055_onkey.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * ON pin driver for Dialog DA9055 PMICs - * - * Copyright(c) 2012 Dialog Semiconductor Ltd. - * - * Author: David Dajun Chen - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include -#include -#include -#include - -#include -#include - -struct da9055_onkey { - struct da9055 *da9055; - struct input_dev *input; - struct delayed_work work; -}; - -static void da9055_onkey_query(struct da9055_onkey *onkey) -{ - int key_stat; - - key_stat = da9055_reg_read(onkey->da9055, DA9055_REG_STATUS_A); - if (key_stat < 0) { - dev_err(onkey->da9055->dev, - "Failed to read onkey event %d\n", key_stat); - } else { - key_stat &= DA9055_NOKEY_STS; - /* - * Onkey status bit is cleared when onkey button is relased. - */ - if (!key_stat) { - input_report_key(onkey->input, KEY_POWER, 0); - input_sync(onkey->input); - } - } - - /* - * Interrupt is generated only when the ONKEY pin is asserted. - * Hence the deassertion of the pin is simulated through work queue. - */ - if (key_stat) - schedule_delayed_work(&onkey->work, msecs_to_jiffies(10)); - -} - -static void da9055_onkey_work(struct work_struct *work) -{ - struct da9055_onkey *onkey = container_of(work, struct da9055_onkey, - work.work); - - da9055_onkey_query(onkey); -} - -static irqreturn_t da9055_onkey_irq(int irq, void *data) -{ - struct da9055_onkey *onkey = data; - - input_report_key(onkey->input, KEY_POWER, 1); - input_sync(onkey->input); - - da9055_onkey_query(onkey); - - return IRQ_HANDLED; -} - -static int da9055_onkey_probe(struct platform_device *pdev) -{ - struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent); - struct da9055_onkey *onkey; - struct input_dev *input_dev; - int irq, err; - - irq = platform_get_irq_byname(pdev, "ONKEY"); - if (irq < 0) { - dev_err(&pdev->dev, - "Failed to get an IRQ for input device, %d\n", irq); - return -EINVAL; - } - - onkey = devm_kzalloc(&pdev->dev, sizeof(*onkey), GFP_KERNEL); - if (!onkey) { - dev_err(&pdev->dev, "Failed to allocate memory\n"); - return -ENOMEM; - } - - input_dev = input_allocate_device(); - if (!input_dev) { - dev_err(&pdev->dev, "Failed to allocate memory\n"); - return -ENOMEM; - } - - onkey->input = input_dev; - onkey->da9055 = da9055; - input_dev->name = "da9055-onkey"; - input_dev->phys = "da9055-onkey/input0"; - input_dev->dev.parent = &pdev->dev; - - input_dev->evbit[0] = BIT_MASK(EV_KEY); - __set_bit(KEY_POWER, input_dev->keybit); - - INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work); - - irq = regmap_irq_get_virq(da9055->irq_data, irq); - err = request_threaded_irq(irq, NULL, da9055_onkey_irq, - IRQF_TRIGGER_HIGH | IRQF_ONESHOT, - "ONKEY", onkey); - if (err < 0) { - dev_err(&pdev->dev, - "Failed to register ONKEY IRQ %d, error = %d\n", - irq, err); - goto err_free_input; - } - - err = input_register_device(input_dev); - if (err) { - dev_err(&pdev->dev, "Unable to register input device, %d\n", - err); - goto err_free_irq; - } - - platform_set_drvdata(pdev, onkey); - - return 0; - -err_free_irq: - free_irq(irq, onkey); - cancel_delayed_work_sync(&onkey->work); -err_free_input: - input_free_device(input_dev); - - return err; -} - -static int da9055_onkey_remove(struct platform_device *pdev) -{ - struct da9055_onkey *onkey = platform_get_drvdata(pdev); - int irq = platform_get_irq_byname(pdev, "ONKEY"); - - irq = regmap_irq_get_virq(onkey->da9055->irq_data, irq); - free_irq(irq, onkey); - cancel_delayed_work_sync(&onkey->work); - input_unregister_device(onkey->input); - - return 0; -} - -static struct platform_driver da9055_onkey_driver = { - .probe = da9055_onkey_probe, - .remove = da9055_onkey_remove, - .driver = { - .name = "da9055-onkey", - .owner = THIS_MODULE, - }, -}; - -module_platform_driver(da9055_onkey_driver); - -MODULE_AUTHOR("David Dajun Chen "); -MODULE_DESCRIPTION("Onkey driver for DA9055"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:da9055-onkey"); diff --git a/trunk/drivers/input/misc/dm355evm_keys.c b/trunk/drivers/input/misc/dm355evm_keys.c index a309a5c0899e..c1313d8535c3 100644 --- a/trunk/drivers/input/misc/dm355evm_keys.c +++ b/trunk/drivers/input/misc/dm355evm_keys.c @@ -173,7 +173,7 @@ static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) /*----------------------------------------------------------------------*/ -static int dm355evm_keys_probe(struct platform_device *pdev) +static int __devinit dm355evm_keys_probe(struct platform_device *pdev) { struct dm355evm_keys *keys; struct input_dev *input; @@ -239,7 +239,7 @@ static int dm355evm_keys_probe(struct platform_device *pdev) return status; } -static int dm355evm_keys_remove(struct platform_device *pdev) +static int __devexit dm355evm_keys_remove(struct platform_device *pdev) { struct dm355evm_keys *keys = platform_get_drvdata(pdev); @@ -262,7 +262,7 @@ static int dm355evm_keys_remove(struct platform_device *pdev) */ static struct platform_driver dm355evm_keys_driver = { .probe = dm355evm_keys_probe, - .remove = dm355evm_keys_remove, + .remove = __devexit_p(dm355evm_keys_remove), .driver = { .owner = THIS_MODULE, .name = "dm355evm_keys", diff --git a/trunk/drivers/input/misc/gp2ap002a00f.c b/trunk/drivers/input/misc/gp2ap002a00f.c index fe30bd0fe4bd..b6664cfa340a 100644 --- a/trunk/drivers/input/misc/gp2ap002a00f.c +++ b/trunk/drivers/input/misc/gp2ap002a00f.c @@ -98,7 +98,7 @@ static void gp2a_device_close(struct input_dev *dev) "unable to deactivate, err %d\n", error); } -static int gp2a_initialize(struct gp2a_data *dt) +static int __devinit gp2a_initialize(struct gp2a_data *dt) { int error; @@ -122,7 +122,7 @@ static int gp2a_initialize(struct gp2a_data *dt) return error; } -static int gp2a_probe(struct i2c_client *client, +static int __devinit gp2a_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct gp2a_platform_data *pdata = client->dev.platform_data; @@ -205,7 +205,7 @@ static int gp2a_probe(struct i2c_client *client, return error; } -static int gp2a_remove(struct i2c_client *client) +static int __devexit gp2a_remove(struct i2c_client *client) { struct gp2a_data *dt = i2c_get_clientdata(client); const struct gp2a_platform_data *pdata = dt->pdata; @@ -277,7 +277,7 @@ static struct i2c_driver gp2a_i2c_driver = { .pm = &gp2a_pm, }, .probe = gp2a_probe, - .remove = gp2a_remove, + .remove = __devexit_p(gp2a_remove), .id_table = gp2a_i2c_id, }; diff --git a/trunk/drivers/input/misc/gpio_tilt_polled.c b/trunk/drivers/input/misc/gpio_tilt_polled.c index da05cca8b562..277a0574c199 100644 --- a/trunk/drivers/input/misc/gpio_tilt_polled.c +++ b/trunk/drivers/input/misc/gpio_tilt_polled.c @@ -96,7 +96,7 @@ static void gpio_tilt_polled_close(struct input_polled_dev *dev) pdata->disable(tdev->dev); } -static int gpio_tilt_polled_probe(struct platform_device *pdev) +static int __devinit gpio_tilt_polled_probe(struct platform_device *pdev) { const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data; struct device *dev = &pdev->dev; @@ -179,7 +179,7 @@ static int gpio_tilt_polled_probe(struct platform_device *pdev) return error; } -static int gpio_tilt_polled_remove(struct platform_device *pdev) +static int __devexit gpio_tilt_polled_remove(struct platform_device *pdev) { struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev); const struct gpio_tilt_platform_data *pdata = tdev->pdata; @@ -198,7 +198,7 @@ static int gpio_tilt_polled_remove(struct platform_device *pdev) static struct platform_driver gpio_tilt_polled_driver = { .probe = gpio_tilt_polled_probe, - .remove = gpio_tilt_polled_remove, + .remove = __devexit_p(gpio_tilt_polled_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/ixp4xx-beeper.c b/trunk/drivers/input/misc/ixp4xx-beeper.c index 6ab3decc86e6..50e283068301 100644 --- a/trunk/drivers/input/misc/ixp4xx-beeper.c +++ b/trunk/drivers/input/misc/ixp4xx-beeper.c @@ -87,7 +87,7 @@ static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int ixp4xx_spkr_probe(struct platform_device *dev) +static int __devinit ixp4xx_spkr_probe(struct platform_device *dev) { struct input_dev *input_dev; int err; @@ -132,7 +132,7 @@ static int ixp4xx_spkr_probe(struct platform_device *dev) return err; } -static int ixp4xx_spkr_remove(struct platform_device *dev) +static int __devexit ixp4xx_spkr_remove(struct platform_device *dev) { struct input_dev *input_dev = platform_get_drvdata(dev); unsigned int pin = (unsigned int) input_get_drvdata(input_dev); @@ -165,7 +165,7 @@ static struct platform_driver ixp4xx_spkr_platform_driver = { .owner = THIS_MODULE, }, .probe = ixp4xx_spkr_probe, - .remove = ixp4xx_spkr_remove, + .remove = __devexit_p(ixp4xx_spkr_remove), .shutdown = ixp4xx_spkr_shutdown, }; module_platform_driver(ixp4xx_spkr_platform_driver); diff --git a/trunk/drivers/input/misc/kxtj9.c b/trunk/drivers/input/misc/kxtj9.c index a993b67a8a5b..f46139f19ff1 100644 --- a/trunk/drivers/input/misc/kxtj9.c +++ b/trunk/drivers/input/misc/kxtj9.c @@ -295,7 +295,7 @@ static void kxtj9_input_close(struct input_dev *dev) kxtj9_disable(tj9); } -static void kxtj9_init_input_device(struct kxtj9_data *tj9, +static void __devinit kxtj9_init_input_device(struct kxtj9_data *tj9, struct input_dev *input_dev) { __set_bit(EV_ABS, input_dev->evbit); @@ -308,7 +308,7 @@ static void kxtj9_init_input_device(struct kxtj9_data *tj9, input_dev->dev.parent = &tj9->client->dev; } -static int kxtj9_setup_input_device(struct kxtj9_data *tj9) +static int __devinit kxtj9_setup_input_device(struct kxtj9_data *tj9) { struct input_dev *input_dev; int err; @@ -433,7 +433,7 @@ static void kxtj9_polled_input_close(struct input_polled_dev *dev) kxtj9_disable(tj9); } -static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) +static int __devinit kxtj9_setup_polled_device(struct kxtj9_data *tj9) { int err; struct input_polled_dev *poll_dev; @@ -466,7 +466,7 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) return 0; } -static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) +static void __devexit kxtj9_teardown_polled_device(struct kxtj9_data *tj9) { input_unregister_polled_device(tj9->poll_dev); input_free_polled_device(tj9->poll_dev); @@ -485,7 +485,7 @@ static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) #endif -static int kxtj9_verify(struct kxtj9_data *tj9) +static int __devinit kxtj9_verify(struct kxtj9_data *tj9) { int retval; @@ -506,7 +506,7 @@ static int kxtj9_verify(struct kxtj9_data *tj9) return retval; } -static int kxtj9_probe(struct i2c_client *client, +static int __devinit kxtj9_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct kxtj9_platform_data *pdata = client->dev.platform_data; @@ -594,7 +594,7 @@ static int kxtj9_probe(struct i2c_client *client, return err; } -static int kxtj9_remove(struct i2c_client *client) +static int __devexit kxtj9_remove(struct i2c_client *client) { struct kxtj9_data *tj9 = i2c_get_clientdata(client); @@ -663,7 +663,7 @@ static struct i2c_driver kxtj9_driver = { .pm = &kxtj9_pm_ops, }, .probe = kxtj9_probe, - .remove = kxtj9_remove, + .remove = __devexit_p(kxtj9_remove), .id_table = kxtj9_id, }; diff --git a/trunk/drivers/input/misc/m68kspkr.c b/trunk/drivers/input/misc/m68kspkr.c index b40ee4b47f4f..0c64d9bb718e 100644 --- a/trunk/drivers/input/misc/m68kspkr.c +++ b/trunk/drivers/input/misc/m68kspkr.c @@ -48,7 +48,7 @@ static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int return 0; } -static int m68kspkr_probe(struct platform_device *dev) +static int __devinit m68kspkr_probe(struct platform_device *dev) { struct input_dev *input_dev; int err; @@ -80,7 +80,7 @@ static int m68kspkr_probe(struct platform_device *dev) return 0; } -static int m68kspkr_remove(struct platform_device *dev) +static int __devexit m68kspkr_remove(struct platform_device *dev) { struct input_dev *input_dev = platform_get_drvdata(dev); @@ -104,7 +104,7 @@ static struct platform_driver m68kspkr_platform_driver = { .owner = THIS_MODULE, }, .probe = m68kspkr_probe, - .remove = m68kspkr_remove, + .remove = __devexit_p(m68kspkr_remove), .shutdown = m68kspkr_shutdown, }; diff --git a/trunk/drivers/input/misc/max8925_onkey.c b/trunk/drivers/input/misc/max8925_onkey.c index 369a39de4ff3..0a12b74140d3 100644 --- a/trunk/drivers/input/misc/max8925_onkey.c +++ b/trunk/drivers/input/misc/max8925_onkey.c @@ -62,7 +62,7 @@ static irqreturn_t max8925_onkey_handler(int irq, void *data) return IRQ_HANDLED; } -static int max8925_onkey_probe(struct platform_device *pdev) +static int __devinit max8925_onkey_probe(struct platform_device *pdev) { struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); struct max8925_onkey_info *info; @@ -141,7 +141,7 @@ static int max8925_onkey_probe(struct platform_device *pdev) return error; } -static int max8925_onkey_remove(struct platform_device *pdev) +static int __devexit max8925_onkey_remove(struct platform_device *pdev) { struct max8925_onkey_info *info = platform_get_drvdata(pdev); struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); @@ -195,7 +195,7 @@ static struct platform_driver max8925_onkey_driver = { .pm = &max8925_onkey_pm_ops, }, .probe = max8925_onkey_probe, - .remove = max8925_onkey_remove, + .remove = __devexit_p(max8925_onkey_remove), }; module_platform_driver(max8925_onkey_driver); diff --git a/trunk/drivers/input/misc/max8997_haptic.c b/trunk/drivers/input/misc/max8997_haptic.c index e973133212a5..05b7b8bfaf0a 100644 --- a/trunk/drivers/input/misc/max8997_haptic.c +++ b/trunk/drivers/input/misc/max8997_haptic.c @@ -241,7 +241,7 @@ static void max8997_haptic_close(struct input_dev *dev) max8997_haptic_disable(chip); } -static int max8997_haptic_probe(struct platform_device *pdev) +static int __devinit max8997_haptic_probe(struct platform_device *pdev) { struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); const struct max8997_platform_data *pdata = @@ -354,7 +354,7 @@ static int max8997_haptic_probe(struct platform_device *pdev) return error; } -static int max8997_haptic_remove(struct platform_device *pdev) +static int __devexit max8997_haptic_remove(struct platform_device *pdev) { struct max8997_haptic *chip = platform_get_drvdata(pdev); @@ -396,7 +396,7 @@ static struct platform_driver max8997_haptic_driver = { .pm = &max8997_haptic_pm_ops, }, .probe = max8997_haptic_probe, - .remove = max8997_haptic_remove, + .remove = __devexit_p(max8997_haptic_remove), .id_table = max8997_haptic_id, }; module_platform_driver(max8997_haptic_driver); diff --git a/trunk/drivers/input/misc/mc13783-pwrbutton.c b/trunk/drivers/input/misc/mc13783-pwrbutton.c index 0906ca593d5f..8428f1e8e83e 100644 --- a/trunk/drivers/input/misc/mc13783-pwrbutton.c +++ b/trunk/drivers/input/misc/mc13783-pwrbutton.c @@ -89,7 +89,7 @@ static irqreturn_t button_irq(int irq, void *_priv) return IRQ_HANDLED; } -static int mc13783_pwrbutton_probe(struct platform_device *pdev) +static int __devinit mc13783_pwrbutton_probe(struct platform_device *pdev) { const struct mc13xxx_buttons_platform_data *pdata; struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent); @@ -230,7 +230,7 @@ static int mc13783_pwrbutton_probe(struct platform_device *pdev) return err; } -static int mc13783_pwrbutton_remove(struct platform_device *pdev) +static int __devexit mc13783_pwrbutton_remove(struct platform_device *pdev) { struct mc13783_pwrb *priv = platform_get_drvdata(pdev); const struct mc13xxx_buttons_platform_data *pdata; @@ -257,7 +257,7 @@ static int mc13783_pwrbutton_remove(struct platform_device *pdev) static struct platform_driver mc13783_pwrbutton_driver = { .probe = mc13783_pwrbutton_probe, - .remove = mc13783_pwrbutton_remove, + .remove = __devexit_p(mc13783_pwrbutton_remove), .driver = { .name = "mc13783-pwrbutton", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/mma8450.c b/trunk/drivers/input/misc/mma8450.c index 480557f14f23..873ebced544e 100644 --- a/trunk/drivers/input/misc/mma8450.c +++ b/trunk/drivers/input/misc/mma8450.c @@ -167,7 +167,7 @@ static void mma8450_close(struct input_polled_dev *dev) /* * I2C init/probing/exit functions */ -static int mma8450_probe(struct i2c_client *c, +static int __devinit mma8450_probe(struct i2c_client *c, const struct i2c_device_id *id) { struct input_polled_dev *idev; @@ -212,7 +212,7 @@ static int mma8450_probe(struct i2c_client *c, return err; } -static int mma8450_remove(struct i2c_client *c) +static int __devexit mma8450_remove(struct i2c_client *c) { struct mma8450 *m = i2c_get_clientdata(c); struct input_polled_dev *idev = m->idev; @@ -243,7 +243,7 @@ static struct i2c_driver mma8450_driver = { .of_match_table = mma8450_dt_ids, }, .probe = mma8450_probe, - .remove = mma8450_remove, + .remove = __devexit_p(mma8450_remove), .id_table = mma8450_id, }; diff --git a/trunk/drivers/input/misc/mpu3050.c b/trunk/drivers/input/misc/mpu3050.c index dce0d95943c5..306f84c2d8fb 100644 --- a/trunk/drivers/input/misc/mpu3050.c +++ b/trunk/drivers/input/misc/mpu3050.c @@ -257,7 +257,7 @@ static irqreturn_t mpu3050_interrupt_thread(int irq, void *data) * * Called during device probe; configures the sampling method. */ -static int mpu3050_hw_init(struct mpu3050_sensor *sensor) +static int __devinit mpu3050_hw_init(struct mpu3050_sensor *sensor) { struct i2c_client *client = sensor->client; int ret; @@ -306,7 +306,7 @@ static int mpu3050_hw_init(struct mpu3050_sensor *sensor) * * If present install the relevant sysfs interfaces and input device. */ -static int mpu3050_probe(struct i2c_client *client, +static int __devinit mpu3050_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mpu3050_sensor *sensor; @@ -402,7 +402,7 @@ static int mpu3050_probe(struct i2c_client *client, * * Our sensor is going away, clean up the resources. */ -static int mpu3050_remove(struct i2c_client *client) +static int __devexit mpu3050_remove(struct i2c_client *client) { struct mpu3050_sensor *sensor = i2c_get_clientdata(client); @@ -471,7 +471,7 @@ static struct i2c_driver mpu3050_i2c_driver = { .of_match_table = mpu3050_of_match, }, .probe = mpu3050_probe, - .remove = mpu3050_remove, + .remove = __devexit_p(mpu3050_remove), .id_table = mpu3050_ids, }; diff --git a/trunk/drivers/input/misc/pcap_keys.c b/trunk/drivers/input/misc/pcap_keys.c index 40ac9a5adf89..e09b4fe81913 100644 --- a/trunk/drivers/input/misc/pcap_keys.c +++ b/trunk/drivers/input/misc/pcap_keys.c @@ -48,7 +48,7 @@ static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys) return IRQ_HANDLED; } -static int pcap_keys_probe(struct platform_device *pdev) +static int __devinit pcap_keys_probe(struct platform_device *pdev) { int err = -ENOMEM; struct pcap_keys *pcap_keys; @@ -104,7 +104,7 @@ static int pcap_keys_probe(struct platform_device *pdev) return err; } -static int pcap_keys_remove(struct platform_device *pdev) +static int __devexit pcap_keys_remove(struct platform_device *pdev) { struct pcap_keys *pcap_keys = platform_get_drvdata(pdev); @@ -119,7 +119,7 @@ static int pcap_keys_remove(struct platform_device *pdev) static struct platform_driver pcap_keys_device_driver = { .probe = pcap_keys_probe, - .remove = pcap_keys_remove, + .remove = __devexit_p(pcap_keys_remove), .driver = { .name = "pcap-keys", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/pcf50633-input.c b/trunk/drivers/input/misc/pcf50633-input.c index 73b13ebabe56..53891de80b0e 100644 --- a/trunk/drivers/input/misc/pcf50633-input.c +++ b/trunk/drivers/input/misc/pcf50633-input.c @@ -53,7 +53,7 @@ pcf50633_input_irq(int irq, void *data) input_sync(input->input_dev); } -static int pcf50633_input_probe(struct platform_device *pdev) +static int __devinit pcf50633_input_probe(struct platform_device *pdev) { struct pcf50633_input *input; struct input_dev *input_dev; @@ -93,7 +93,7 @@ static int pcf50633_input_probe(struct platform_device *pdev) return 0; } -static int pcf50633_input_remove(struct platform_device *pdev) +static int __devexit pcf50633_input_remove(struct platform_device *pdev) { struct pcf50633_input *input = platform_get_drvdata(pdev); @@ -111,7 +111,7 @@ static struct platform_driver pcf50633_input_driver = { .name = "pcf50633-input", }, .probe = pcf50633_input_probe, - .remove = pcf50633_input_remove, + .remove = __devexit_p(pcf50633_input_remove), }; module_platform_driver(pcf50633_input_driver); diff --git a/trunk/drivers/input/misc/pcf8574_keypad.c b/trunk/drivers/input/misc/pcf8574_keypad.c index e37392976fdd..544c6635abe9 100644 --- a/trunk/drivers/input/misc/pcf8574_keypad.c +++ b/trunk/drivers/input/misc/pcf8574_keypad.c @@ -82,7 +82,7 @@ static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id) +static int __devinit pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id) { int i, ret; struct input_dev *idev; @@ -156,7 +156,7 @@ static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_i return ret; } -static int pcf8574_kp_remove(struct i2c_client *client) +static int __devexit pcf8574_kp_remove(struct i2c_client *client) { struct kp_data *lp = i2c_get_clientdata(client); @@ -212,7 +212,7 @@ static struct i2c_driver pcf8574_kp_driver = { #endif }, .probe = pcf8574_kp_probe, - .remove = pcf8574_kp_remove, + .remove = __devexit_p(pcf8574_kp_remove), .id_table = pcf8574_kp_id, }; diff --git a/trunk/drivers/input/misc/pcspkr.c b/trunk/drivers/input/misc/pcspkr.c index 199db78acc4f..b2484aa07f32 100644 --- a/trunk/drivers/input/misc/pcspkr.c +++ b/trunk/drivers/input/misc/pcspkr.c @@ -63,7 +63,7 @@ static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int c return 0; } -static int pcspkr_probe(struct platform_device *dev) +static int __devinit pcspkr_probe(struct platform_device *dev) { struct input_dev *pcspkr_dev; int err; @@ -95,7 +95,7 @@ static int pcspkr_probe(struct platform_device *dev) return 0; } -static int pcspkr_remove(struct platform_device *dev) +static int __devexit pcspkr_remove(struct platform_device *dev) { struct input_dev *pcspkr_dev = platform_get_drvdata(dev); @@ -131,7 +131,7 @@ static struct platform_driver pcspkr_platform_driver = { .pm = &pcspkr_pm_ops, }, .probe = pcspkr_probe, - .remove = pcspkr_remove, + .remove = __devexit_p(pcspkr_remove), .shutdown = pcspkr_shutdown, }; module_platform_driver(pcspkr_platform_driver); diff --git a/trunk/drivers/input/misc/pm8xxx-vibrator.c b/trunk/drivers/input/misc/pm8xxx-vibrator.c index a9da65e41c5b..dfbfb463ea5d 100644 --- a/trunk/drivers/input/misc/pm8xxx-vibrator.c +++ b/trunk/drivers/input/misc/pm8xxx-vibrator.c @@ -178,7 +178,7 @@ static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data, return 0; } -static int pm8xxx_vib_probe(struct platform_device *pdev) +static int __devinit pm8xxx_vib_probe(struct platform_device *pdev) { struct pm8xxx_vib *vib; @@ -242,7 +242,7 @@ static int pm8xxx_vib_probe(struct platform_device *pdev) return error; } -static int pm8xxx_vib_remove(struct platform_device *pdev) +static int __devexit pm8xxx_vib_remove(struct platform_device *pdev) { struct pm8xxx_vib *vib = platform_get_drvdata(pdev); @@ -270,7 +270,7 @@ static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL); static struct platform_driver pm8xxx_vib_driver = { .probe = pm8xxx_vib_probe, - .remove = pm8xxx_vib_remove, + .remove = __devexit_p(pm8xxx_vib_remove), .driver = { .name = "pm8xxx-vib", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/pmic8xxx-pwrkey.c b/trunk/drivers/input/misc/pmic8xxx-pwrkey.c index 4b811be73974..0f83d0f1d015 100644 --- a/trunk/drivers/input/misc/pmic8xxx-pwrkey.c +++ b/trunk/drivers/input/misc/pmic8xxx-pwrkey.c @@ -81,7 +81,7 @@ static int pmic8xxx_pwrkey_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops, pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume); -static int pmic8xxx_pwrkey_probe(struct platform_device *pdev) +static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) { struct input_dev *pwr; int key_release_irq = platform_get_irq(pdev, 0); @@ -187,7 +187,7 @@ static int pmic8xxx_pwrkey_probe(struct platform_device *pdev) return err; } -static int pmic8xxx_pwrkey_remove(struct platform_device *pdev) +static int __devexit pmic8xxx_pwrkey_remove(struct platform_device *pdev) { struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev); int key_release_irq = platform_get_irq(pdev, 0); @@ -206,7 +206,7 @@ static int pmic8xxx_pwrkey_remove(struct platform_device *pdev) static struct platform_driver pmic8xxx_pwrkey_driver = { .probe = pmic8xxx_pwrkey_probe, - .remove = pmic8xxx_pwrkey_remove, + .remove = __devexit_p(pmic8xxx_pwrkey_remove), .driver = { .name = PM8XXX_PWRKEY_DEV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/pwm-beeper.c b/trunk/drivers/input/misc/pwm-beeper.c index 0808868461de..fc84c8a51147 100644 --- a/trunk/drivers/input/misc/pwm-beeper.c +++ b/trunk/drivers/input/misc/pwm-beeper.c @@ -65,7 +65,7 @@ static int pwm_beeper_event(struct input_dev *input, return 0; } -static int pwm_beeper_probe(struct platform_device *pdev) +static int __devinit pwm_beeper_probe(struct platform_device *pdev) { unsigned long pwm_id = (unsigned long)pdev->dev.platform_data; struct pwm_beeper *beeper; @@ -75,11 +75,7 @@ static int pwm_beeper_probe(struct platform_device *pdev) if (!beeper) return -ENOMEM; - beeper->pwm = pwm_get(&pdev->dev, NULL); - if (IS_ERR(beeper->pwm)) { - dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n"); - beeper->pwm = pwm_request(pwm_id, "pwm beeper"); - } + beeper->pwm = pwm_request(pwm_id, "pwm beeper"); if (IS_ERR(beeper->pwm)) { error = PTR_ERR(beeper->pwm); @@ -129,7 +125,7 @@ static int pwm_beeper_probe(struct platform_device *pdev) return error; } -static int pwm_beeper_remove(struct platform_device *pdev) +static int __devexit pwm_beeper_remove(struct platform_device *pdev) { struct pwm_beeper *beeper = platform_get_drvdata(pdev); @@ -175,21 +171,13 @@ static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops, #define PWM_BEEPER_PM_OPS NULL #endif -#ifdef CONFIG_OF -static const struct of_device_id pwm_beeper_match[] = { - { .compatible = "pwm-beeper", }, - { }, -}; -#endif - static struct platform_driver pwm_beeper_driver = { .probe = pwm_beeper_probe, - .remove = pwm_beeper_remove, + .remove = __devexit_p(pwm_beeper_remove), .driver = { .name = "pwm-beeper", .owner = THIS_MODULE, .pm = PWM_BEEPER_PM_OPS, - .of_match_table = of_match_ptr(pwm_beeper_match), }, }; module_platform_driver(pwm_beeper_driver); diff --git a/trunk/drivers/input/misc/rb532_button.c b/trunk/drivers/input/misc/rb532_button.c index fb4f8ac3343b..aeb02bcf7233 100644 --- a/trunk/drivers/input/misc/rb532_button.c +++ b/trunk/drivers/input/misc/rb532_button.c @@ -51,7 +51,7 @@ static void rb532_button_poll(struct input_polled_dev *poll_dev) input_sync(poll_dev->input); } -static int rb532_button_probe(struct platform_device *pdev) +static int __devinit rb532_button_probe(struct platform_device *pdev) { struct input_polled_dev *poll_dev; int error; @@ -81,7 +81,7 @@ static int rb532_button_probe(struct platform_device *pdev) return 0; } -static int rb532_button_remove(struct platform_device *pdev) +static int __devexit rb532_button_remove(struct platform_device *pdev) { struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev); @@ -94,7 +94,7 @@ static int rb532_button_remove(struct platform_device *pdev) static struct platform_driver rb532_button_driver = { .probe = rb532_button_probe, - .remove = rb532_button_remove, + .remove = __devexit_p(rb532_button_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/retu-pwrbutton.c b/trunk/drivers/input/misc/retu-pwrbutton.c deleted file mode 100644 index 7ca09baa0016..000000000000 --- a/trunk/drivers/input/misc/retu-pwrbutton.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Retu power button driver. - * - * Copyright (C) 2004-2010 Nokia Corporation - * - * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi. - * Rewritten by Aaro Koskinen. - * - * This file is subject to the terms and conditions of the GNU General - * Public License. See the file "COPYING" in the main directory of this - * archive for more details. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define RETU_STATUS_PWRONX (1 << 5) - -static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr) -{ - struct input_dev *idev = _pwr; - struct retu_dev *rdev = input_get_drvdata(idev); - bool state; - - state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX); - input_report_key(idev, KEY_POWER, state); - input_sync(idev); - - return IRQ_HANDLED; -} - -static int retu_pwrbutton_probe(struct platform_device *pdev) -{ - struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); - struct input_dev *idev; - int irq; - int error; - - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; - - idev = devm_input_allocate_device(&pdev->dev); - if (!idev) - return -ENOMEM; - - idev->name = "retu-pwrbutton"; - idev->dev.parent = &pdev->dev; - - input_set_capability(idev, EV_KEY, KEY_POWER); - input_set_drvdata(idev, rdev); - - error = devm_request_threaded_irq(&pdev->dev, irq, - NULL, retu_pwrbutton_irq, 0, - "retu-pwrbutton", idev); - if (error) - return error; - - error = input_register_device(idev); - if (error) - return error; - - return 0; -} - -static int retu_pwrbutton_remove(struct platform_device *pdev) -{ - return 0; -} - -static struct platform_driver retu_pwrbutton_driver = { - .probe = retu_pwrbutton_probe, - .remove = retu_pwrbutton_remove, - .driver = { - .name = "retu-pwrbutton", - .owner = THIS_MODULE, - }, -}; -module_platform_driver(retu_pwrbutton_driver); - -MODULE_ALIAS("platform:retu-pwrbutton"); -MODULE_DESCRIPTION("Retu Power Button"); -MODULE_AUTHOR("Ari Saastamoinen"); -MODULE_AUTHOR("Felipe Balbi"); -MODULE_AUTHOR("Aaro Koskinen "); -MODULE_LICENSE("GPL"); diff --git a/trunk/drivers/input/misc/rotary_encoder.c b/trunk/drivers/input/misc/rotary_encoder.c index aff47b2c38ff..99a49e4968d2 100644 --- a/trunk/drivers/input/misc/rotary_encoder.c +++ b/trunk/drivers/input/misc/rotary_encoder.c @@ -149,7 +149,8 @@ static struct of_device_id rotary_encoder_of_match[] = { }; MODULE_DEVICE_TABLE(of, rotary_encoder_of_match); -static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev) +static struct rotary_encoder_platform_data * __devinit +rotary_encoder_parse_dt(struct device *dev) { const struct of_device_id *of_id = of_match_device(rotary_encoder_of_match, dev); @@ -191,7 +192,7 @@ rotary_encoder_parse_dt(struct device *dev) } #endif -static int rotary_encoder_probe(struct platform_device *pdev) +static int __devinit rotary_encoder_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev); @@ -301,7 +302,7 @@ static int rotary_encoder_probe(struct platform_device *pdev) return err; } -static int rotary_encoder_remove(struct platform_device *pdev) +static int __devexit rotary_encoder_remove(struct platform_device *pdev) { struct rotary_encoder *encoder = platform_get_drvdata(pdev); const struct rotary_encoder_platform_data *pdata = encoder->pdata; @@ -324,7 +325,7 @@ static int rotary_encoder_remove(struct platform_device *pdev) static struct platform_driver rotary_encoder_driver = { .probe = rotary_encoder_probe, - .remove = rotary_encoder_remove, + .remove = __devexit_p(rotary_encoder_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/sgi_btns.c b/trunk/drivers/input/misc/sgi_btns.c index ad6415ceaf5f..5d9fd5571199 100644 --- a/trunk/drivers/input/misc/sgi_btns.c +++ b/trunk/drivers/input/misc/sgi_btns.c @@ -91,7 +91,7 @@ static void handle_buttons(struct input_polled_dev *dev) } } -static int sgi_buttons_probe(struct platform_device *pdev) +static int __devinit sgi_buttons_probe(struct platform_device *pdev) { struct buttons_dev *bdev; struct input_polled_dev *poll_dev; @@ -143,7 +143,7 @@ static int sgi_buttons_probe(struct platform_device *pdev) return error; } -static int sgi_buttons_remove(struct platform_device *pdev) +static int __devexit sgi_buttons_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct buttons_dev *bdev = dev_get_drvdata(dev); @@ -158,7 +158,7 @@ static int sgi_buttons_remove(struct platform_device *pdev) static struct platform_driver sgi_buttons_driver = { .probe = sgi_buttons_probe, - .remove = sgi_buttons_remove, + .remove = __devexit_p(sgi_buttons_remove), .driver = { .name = "sgibtns", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/sparcspkr.c b/trunk/drivers/input/misc/sparcspkr.c index a53586a7fbdb..0122f5351577 100644 --- a/trunk/drivers/input/misc/sparcspkr.c +++ b/trunk/drivers/input/misc/sparcspkr.c @@ -139,7 +139,7 @@ static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned return 0; } -static int sparcspkr_probe(struct device *dev) +static int __devinit sparcspkr_probe(struct device *dev) { struct sparcspkr_state *state = dev_get_drvdata(dev); struct input_dev *input_dev; @@ -182,7 +182,7 @@ static void sparcspkr_shutdown(struct platform_device *dev) state->event(input_dev, EV_SND, SND_BELL, 0); } -static int bbc_beep_probe(struct platform_device *op) +static int __devinit bbc_beep_probe(struct platform_device *op) { struct sparcspkr_state *state; struct bbc_beep_info *info; @@ -229,7 +229,7 @@ static int bbc_beep_probe(struct platform_device *op) return err; } -static int bbc_remove(struct platform_device *op) +static int __devexit bbc_remove(struct platform_device *op) { struct sparcspkr_state *state = dev_get_drvdata(&op->dev); struct input_dev *input_dev = state->input_dev; @@ -263,11 +263,11 @@ static struct platform_driver bbc_beep_driver = { .of_match_table = bbc_beep_match, }, .probe = bbc_beep_probe, - .remove = bbc_remove, + .remove = __devexit_p(bbc_remove), .shutdown = sparcspkr_shutdown, }; -static int grover_beep_probe(struct platform_device *op) +static int __devinit grover_beep_probe(struct platform_device *op) { struct sparcspkr_state *state; struct grover_beep_info *info; @@ -310,7 +310,7 @@ static int grover_beep_probe(struct platform_device *op) return err; } -static int grover_remove(struct platform_device *op) +static int __devexit grover_remove(struct platform_device *op) { struct sparcspkr_state *state = dev_get_drvdata(&op->dev); struct grover_beep_info *info = &state->u.grover; @@ -345,7 +345,7 @@ static struct platform_driver grover_beep_driver = { .of_match_table = grover_beep_match, }, .probe = grover_beep_probe, - .remove = grover_remove, + .remove = __devexit_p(grover_remove), .shutdown = sparcspkr_shutdown, }; diff --git a/trunk/drivers/input/misc/twl4030-pwrbutton.c b/trunk/drivers/input/misc/twl4030-pwrbutton.c index 27c2bc8aa890..b3dd96d6448b 100644 --- a/trunk/drivers/input/misc/twl4030-pwrbutton.c +++ b/trunk/drivers/input/misc/twl4030-pwrbutton.c @@ -39,7 +39,8 @@ static irqreturn_t powerbutton_irq(int irq, void *_pwr) int err; u8 value; - err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS); + err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &value, + STS_HW_CONDITIONS); if (!err) { pm_wakeup_event(pwr->dev.parent, 0); input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); diff --git a/trunk/drivers/input/misc/twl4030-vibra.c b/trunk/drivers/input/misc/twl4030-vibra.c index 78eb6b30580a..2194a3c7236a 100644 --- a/trunk/drivers/input/misc/twl4030-vibra.c +++ b/trunk/drivers/input/misc/twl4030-vibra.c @@ -207,7 +207,7 @@ static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata, return false; } -static int twl4030_vibra_probe(struct platform_device *pdev) +static int __devinit twl4030_vibra_probe(struct platform_device *pdev) { struct twl4030_vibra_data *pdata = pdev->dev.platform_data; struct device_node *twl4030_core_node = pdev->dev.parent->of_node; @@ -269,7 +269,7 @@ static int twl4030_vibra_probe(struct platform_device *pdev) return ret; } -static int twl4030_vibra_remove(struct platform_device *pdev) +static int __devexit twl4030_vibra_remove(struct platform_device *pdev) { struct vibra_info *info = platform_get_drvdata(pdev); @@ -283,7 +283,7 @@ static int twl4030_vibra_remove(struct platform_device *pdev) static struct platform_driver twl4030_vibra_driver = { .probe = twl4030_vibra_probe, - .remove = twl4030_vibra_remove, + .remove = __devexit_p(twl4030_vibra_remove), .driver = { .name = "twl4030-vibra", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/twl6040-vibra.c b/trunk/drivers/input/misc/twl6040-vibra.c index 71a28ee699f3..c8a288ae1d5b 100644 --- a/trunk/drivers/input/misc/twl6040-vibra.c +++ b/trunk/drivers/input/misc/twl6040-vibra.c @@ -255,7 +255,7 @@ static int twl6040_vibra_suspend(struct device *dev) static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL); -static int twl6040_vibra_probe(struct platform_device *pdev) +static int __devinit twl6040_vibra_probe(struct platform_device *pdev) { struct twl6040_vibra_data *pdata = pdev->dev.platform_data; struct device *twl6040_core_dev = pdev->dev.parent; @@ -418,7 +418,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev) return ret; } -static int twl6040_vibra_remove(struct platform_device *pdev) +static int __devexit twl6040_vibra_remove(struct platform_device *pdev) { struct vibra_info *info = platform_get_drvdata(pdev); @@ -433,7 +433,7 @@ static int twl6040_vibra_remove(struct platform_device *pdev) static struct platform_driver twl6040_vibra_driver = { .probe = twl6040_vibra_probe, - .remove = twl6040_vibra_remove, + .remove = __devexit_p(twl6040_vibra_remove), .driver = { .name = "twl6040-vibra", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/wistron_btns.c b/trunk/drivers/input/misc/wistron_btns.c index 56536f4b9572..e2bdfd4bea70 100644 --- a/trunk/drivers/input/misc/wistron_btns.c +++ b/trunk/drivers/input/misc/wistron_btns.c @@ -170,7 +170,7 @@ static u16 bios_pop_queue(void) return regs.eax; } -static void bios_attach(void) +static void __devinit bios_attach(void) { struct regs regs; @@ -190,7 +190,7 @@ static void bios_detach(void) call_bios(®s); } -static u8 bios_get_cmos_address(void) +static u8 __devinit bios_get_cmos_address(void) { struct regs regs; @@ -202,7 +202,7 @@ static u8 bios_get_cmos_address(void) return regs.ecx; } -static u16 bios_get_default_setting(u8 subsys) +static u16 __devinit bios_get_default_setting(u8 subsys) { struct regs regs; @@ -1052,7 +1052,7 @@ static struct led_classdev wistron_wifi_led = { .brightness_set = wistron_wifi_led_set, }; -static void wistron_led_init(struct device *parent) +static void __devinit wistron_led_init(struct device *parent) { if (leds_present & FE_WIFI_LED) { u16 wifi = bios_get_default_setting(WIFI); @@ -1077,7 +1077,7 @@ static void wistron_led_init(struct device *parent) } } -static void wistron_led_remove(void) +static void __devexit wistron_led_remove(void) { if (leds_present & FE_MAIL_LED) led_classdev_unregister(&wistron_mail_led); @@ -1168,7 +1168,7 @@ static void wistron_poll(struct input_polled_dev *dev) dev->poll_interval = POLL_INTERVAL_DEFAULT; } -static int wistron_setup_keymap(struct input_dev *dev, +static int __devinit wistron_setup_keymap(struct input_dev *dev, struct key_entry *entry) { switch (entry->type) { @@ -1199,7 +1199,7 @@ static int wistron_setup_keymap(struct input_dev *dev, return 0; } -static int setup_input_dev(void) +static int __devinit setup_input_dev(void) { struct input_dev *input_dev; int error; @@ -1237,7 +1237,7 @@ static int setup_input_dev(void) /* Driver core */ -static int wistron_probe(struct platform_device *dev) +static int __devinit wistron_probe(struct platform_device *dev) { int err; @@ -1277,7 +1277,7 @@ static int wistron_probe(struct platform_device *dev) return 0; } -static int wistron_remove(struct platform_device *dev) +static int __devexit wistron_remove(struct platform_device *dev) { wistron_led_remove(); input_unregister_polled_device(wistron_idev); @@ -1334,7 +1334,7 @@ static struct platform_driver wistron_driver = { #endif }, .probe = wistron_probe, - .remove = wistron_remove, + .remove = __devexit_p(wistron_remove), }; static int __init wb_module_init(void) diff --git a/trunk/drivers/input/misc/wm831x-on.c b/trunk/drivers/input/misc/wm831x-on.c index 558767d8ebf4..6790a812a1db 100644 --- a/trunk/drivers/input/misc/wm831x-on.c +++ b/trunk/drivers/input/misc/wm831x-on.c @@ -69,15 +69,14 @@ static irqreturn_t wm831x_on_irq(int irq, void *data) return IRQ_HANDLED; } -static int wm831x_on_probe(struct platform_device *pdev) +static int __devinit wm831x_on_probe(struct platform_device *pdev) { struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); struct wm831x_on *wm831x_on; int irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0)); int ret; - wm831x_on = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_on), - GFP_KERNEL); + wm831x_on = kzalloc(sizeof(struct wm831x_on), GFP_KERNEL); if (!wm831x_on) { dev_err(&pdev->dev, "Can't allocate data\n"); return -ENOMEM; @@ -121,10 +120,11 @@ static int wm831x_on_probe(struct platform_device *pdev) err_input_dev: input_free_device(wm831x_on->dev); err: + kfree(wm831x_on); return ret; } -static int wm831x_on_remove(struct platform_device *pdev) +static int __devexit wm831x_on_remove(struct platform_device *pdev) { struct wm831x_on *wm831x_on = platform_get_drvdata(pdev); int irq = platform_get_irq(pdev, 0); @@ -132,13 +132,14 @@ static int wm831x_on_remove(struct platform_device *pdev) free_irq(irq, wm831x_on); cancel_delayed_work_sync(&wm831x_on->work); input_unregister_device(wm831x_on->dev); + kfree(wm831x_on); return 0; } static struct platform_driver wm831x_on_driver = { .probe = wm831x_on_probe, - .remove = wm831x_on_remove, + .remove = __devexit_p(wm831x_on_remove), .driver = { .name = "wm831x-on", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/misc/xen-kbdfront.c b/trunk/drivers/input/misc/xen-kbdfront.c index e21c1816a8f9..6f7d99013031 100644 --- a/trunk/drivers/input/misc/xen-kbdfront.c +++ b/trunk/drivers/input/misc/xen-kbdfront.c @@ -104,7 +104,7 @@ static irqreturn_t input_handler(int rq, void *dev_id) return IRQ_HANDLED; } -static int xenkbd_probe(struct xenbus_device *dev, +static int __devinit xenkbd_probe(struct xenbus_device *dev, const struct xenbus_device_id *id) { int ret, i, abs; diff --git a/trunk/drivers/input/mouse/alps.c b/trunk/drivers/input/mouse/alps.c index e229fa3cad96..cf5af1f495ec 100644 --- a/trunk/drivers/input/mouse/alps.c +++ b/trunk/drivers/input/mouse/alps.c @@ -767,8 +767,9 @@ static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse) psmouse->packet[5]) & 0x80) || (!alps_is_valid_first_byte(priv->i, psmouse->packet[6]))) { psmouse_dbg(psmouse, - "refusing packet %4ph (suspected interleaved ps/2)\n", - psmouse->packet + 3); + "refusing packet %x %x %x %x (suspected interleaved ps/2)\n", + psmouse->packet[3], psmouse->packet[4], + psmouse->packet[5], psmouse->packet[6]); return PSMOUSE_BAD_DATA; } @@ -830,8 +831,9 @@ static void alps_flush_packet(unsigned long data) psmouse->packet[4] | psmouse->packet[5]) & 0x80) { psmouse_dbg(psmouse, - "refusing packet %3ph (suspected interleaved ps/2)\n", - psmouse->packet + 3); + "refusing packet %x %x %x (suspected interleaved ps/2)\n", + psmouse->packet[3], psmouse->packet[4], + psmouse->packet[5]); } else { alps_process_packet(psmouse); } diff --git a/trunk/drivers/input/mouse/gpio_mouse.c b/trunk/drivers/input/mouse/gpio_mouse.c index 532eaca4cc56..39fe9b737cae 100644 --- a/trunk/drivers/input/mouse/gpio_mouse.c +++ b/trunk/drivers/input/mouse/gpio_mouse.c @@ -46,7 +46,7 @@ static void gpio_mouse_scan(struct input_polled_dev *dev) input_sync(input); } -static int gpio_mouse_probe(struct platform_device *pdev) +static int __devinit gpio_mouse_probe(struct platform_device *pdev) { struct gpio_mouse_platform_data *pdata = pdev->dev.platform_data; struct input_polled_dev *input_poll; @@ -150,7 +150,7 @@ static int gpio_mouse_probe(struct platform_device *pdev) return error; } -static int gpio_mouse_remove(struct platform_device *pdev) +static int __devexit gpio_mouse_remove(struct platform_device *pdev) { struct input_polled_dev *input = platform_get_drvdata(pdev); struct gpio_mouse_platform_data *pdata = input->private; @@ -172,7 +172,7 @@ static int gpio_mouse_remove(struct platform_device *pdev) static struct platform_driver gpio_mouse_device_driver = { .probe = gpio_mouse_probe, - .remove = gpio_mouse_remove, + .remove = __devexit_p(gpio_mouse_remove), .driver = { .name = "gpio_mouse", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/mouse/maplemouse.c b/trunk/drivers/input/mouse/maplemouse.c index 0a60717b91c6..5f278176eb9b 100644 --- a/trunk/drivers/input/mouse/maplemouse.c +++ b/trunk/drivers/input/mouse/maplemouse.c @@ -64,7 +64,7 @@ static void dc_mouse_close(struct input_dev *dev) } /* allow the mouse to be used */ -static int probe_maple_mouse(struct device *dev) +static int __devinit probe_maple_mouse(struct device *dev) { struct maple_device *mdev = to_maple_dev(dev); struct maple_driver *mdrv = to_maple_driver(dev->driver); @@ -114,7 +114,7 @@ static int probe_maple_mouse(struct device *dev) return error; } -static int remove_maple_mouse(struct device *dev) +static int __devexit remove_maple_mouse(struct device *dev) { struct maple_device *mdev = to_maple_dev(dev); struct dc_mouse *mse = maple_get_drvdata(mdev); @@ -132,7 +132,7 @@ static struct maple_driver dc_mouse_driver = { .drv = { .name = "Dreamcast_mouse", .probe = probe_maple_mouse, - .remove = remove_maple_mouse, + .remove = __devexit_p(remove_maple_mouse), }, }; diff --git a/trunk/drivers/input/mouse/navpoint.c b/trunk/drivers/input/mouse/navpoint.c index 8e1b98ea5648..c29ae7654d5e 100644 --- a/trunk/drivers/input/mouse/navpoint.c +++ b/trunk/drivers/input/mouse/navpoint.c @@ -206,7 +206,7 @@ static void navpoint_close(struct input_dev *input) navpoint_down(navpoint); } -static int navpoint_probe(struct platform_device *pdev) +static int __devinit navpoint_probe(struct platform_device *pdev) { const struct navpoint_platform_data *pdata = dev_get_platdata(&pdev->dev); @@ -299,7 +299,7 @@ static int navpoint_probe(struct platform_device *pdev) return error; } -static int navpoint_remove(struct platform_device *pdev) +static int __devexit navpoint_remove(struct platform_device *pdev) { const struct navpoint_platform_data *pdata = dev_get_platdata(&pdev->dev); @@ -353,7 +353,7 @@ static SIMPLE_DEV_PM_OPS(navpoint_pm_ops, navpoint_suspend, navpoint_resume); static struct platform_driver navpoint_driver = { .probe = navpoint_probe, - .remove = navpoint_remove, + .remove = __devexit_p(navpoint_remove), .driver = { .name = "navpoint", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/mouse/pxa930_trkball.c b/trunk/drivers/input/mouse/pxa930_trkball.c index 0ecb9e7945eb..4fe055f2c536 100644 --- a/trunk/drivers/input/mouse/pxa930_trkball.c +++ b/trunk/drivers/input/mouse/pxa930_trkball.c @@ -143,7 +143,7 @@ static void pxa930_trkball_close(struct input_dev *dev) pxa930_trkball_disable(trkball); } -static int pxa930_trkball_probe(struct platform_device *pdev) +static int __devinit pxa930_trkball_probe(struct platform_device *pdev) { struct pxa930_trkball *trkball; struct input_dev *input; @@ -230,7 +230,7 @@ static int pxa930_trkball_probe(struct platform_device *pdev) return error; } -static int pxa930_trkball_remove(struct platform_device *pdev) +static int __devexit pxa930_trkball_remove(struct platform_device *pdev) { struct pxa930_trkball *trkball = platform_get_drvdata(pdev); int irq = platform_get_irq(pdev, 0); @@ -248,7 +248,7 @@ static struct platform_driver pxa930_trkball_driver = { .name = "pxa930-trkball", }, .probe = pxa930_trkball_probe, - .remove = pxa930_trkball_remove, + .remove = __devexit_p(pxa930_trkball_remove), }; module_platform_driver(pxa930_trkball_driver); diff --git a/trunk/drivers/input/mouse/synaptics_i2c.c b/trunk/drivers/input/mouse/synaptics_i2c.c index ad822608f6ee..063a174d3a88 100644 --- a/trunk/drivers/input/mouse/synaptics_i2c.c +++ b/trunk/drivers/input/mouse/synaptics_i2c.c @@ -535,7 +535,7 @@ static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *clien return touch; } -static int synaptics_i2c_probe(struct i2c_client *client, +static int __devinit synaptics_i2c_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) { int ret; @@ -601,7 +601,7 @@ static int synaptics_i2c_probe(struct i2c_client *client, return ret; } -static int synaptics_i2c_remove(struct i2c_client *client) +static int __devexit synaptics_i2c_remove(struct i2c_client *client) { struct synaptics_i2c *touch = i2c_get_clientdata(client); @@ -662,7 +662,7 @@ static struct i2c_driver synaptics_i2c_driver = { }, .probe = synaptics_i2c_probe, - .remove = synaptics_i2c_remove, + .remove = __devexit_p(synaptics_i2c_remove), .id_table = synaptics_i2c_id_table, }; diff --git a/trunk/drivers/input/serio/Kconfig b/trunk/drivers/input/serio/Kconfig index 4a4e182c33e7..55f2c2293ec6 100644 --- a/trunk/drivers/input/serio/Kconfig +++ b/trunk/drivers/input/serio/Kconfig @@ -234,13 +234,4 @@ config SERIO_PS2MULT To compile this driver as a module, choose M here: the module will be called ps2mult. -config SERIO_ARC_PS2 - tristate "ARC PS/2 support" - help - Say Y here if you have an ARC FPGA platform with a PS/2 - controller in it. - - To compile this driver as a module, choose M here; the module - will be called arc_ps2. - endif diff --git a/trunk/drivers/input/serio/Makefile b/trunk/drivers/input/serio/Makefile index 4b0c8f84f1c1..dbbe37616c92 100644 --- a/trunk/drivers/input/serio/Makefile +++ b/trunk/drivers/input/serio/Makefile @@ -25,4 +25,3 @@ obj-$(CONFIG_SERIO_RAW) += serio_raw.o obj-$(CONFIG_SERIO_AMS_DELTA) += ams_delta_serio.o obj-$(CONFIG_SERIO_XILINX_XPS_PS2) += xilinx_ps2.o obj-$(CONFIG_SERIO_ALTERA_PS2) += altera_ps2.o -obj-$(CONFIG_SERIO_ARC_PS2) += arc_ps2.o diff --git a/trunk/drivers/input/serio/altera_ps2.c b/trunk/drivers/input/serio/altera_ps2.c index 479ce5fe8955..cc11f4efe119 100644 --- a/trunk/drivers/input/serio/altera_ps2.c +++ b/trunk/drivers/input/serio/altera_ps2.c @@ -81,7 +81,7 @@ static void altera_ps2_close(struct serio *io) /* * Add one device to this driver. */ -static int altera_ps2_probe(struct platform_device *pdev) +static int __devinit altera_ps2_probe(struct platform_device *pdev) { struct ps2if *ps2if; struct serio *serio; @@ -159,7 +159,7 @@ static int altera_ps2_probe(struct platform_device *pdev) /* * Remove one device from this driver. */ -static int altera_ps2_remove(struct platform_device *pdev) +static int __devexit altera_ps2_remove(struct platform_device *pdev) { struct ps2if *ps2if = platform_get_drvdata(pdev); @@ -187,7 +187,7 @@ MODULE_DEVICE_TABLE(of, altera_ps2_match); */ static struct platform_driver altera_ps2_driver = { .probe = altera_ps2_probe, - .remove = altera_ps2_remove, + .remove = __devexit_p(altera_ps2_remove), .driver = { .name = DRV_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/serio/ambakmi.c b/trunk/drivers/input/serio/ambakmi.c index 4e2fd44865e1..2e77246c2e5a 100644 --- a/trunk/drivers/input/serio/ambakmi.c +++ b/trunk/drivers/input/serio/ambakmi.c @@ -107,7 +107,7 @@ static void amba_kmi_close(struct serio *io) clk_disable_unprepare(kmi->clk); } -static int amba_kmi_probe(struct amba_device *dev, +static int __devinit amba_kmi_probe(struct amba_device *dev, const struct amba_id *id) { struct amba_kmi_port *kmi; @@ -163,7 +163,7 @@ static int amba_kmi_probe(struct amba_device *dev, return ret; } -static int amba_kmi_remove(struct amba_device *dev) +static int __devexit amba_kmi_remove(struct amba_device *dev) { struct amba_kmi_port *kmi = amba_get_drvdata(dev); @@ -204,7 +204,7 @@ static struct amba_driver ambakmi_driver = { }, .id_table = amba_kmi_idtable, .probe = amba_kmi_probe, - .remove = amba_kmi_remove, + .remove = __devexit_p(amba_kmi_remove), .resume = amba_kmi_resume, }; diff --git a/trunk/drivers/input/serio/arc_ps2.c b/trunk/drivers/input/serio/arc_ps2.c deleted file mode 100644 index b571eb3e4efc..000000000000 --- a/trunk/drivers/input/serio/arc_ps2.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Driver is originally developed by Pavel Sokolov - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define ARC_PS2_PORTS 2 - -#define ARC_ARC_PS2_ID 0x0001f609 - -#define STAT_TIMEOUT 128 - -#define PS2_STAT_RX_FRM_ERR (1) -#define PS2_STAT_RX_BUF_OVER (1 << 1) -#define PS2_STAT_RX_INT_EN (1 << 2) -#define PS2_STAT_RX_VAL (1 << 3) -#define PS2_STAT_TX_ISNOT_FUL (1 << 4) -#define PS2_STAT_TX_INT_EN (1 << 5) - -struct arc_ps2_port { - void __iomem *data_addr; - void __iomem *status_addr; - struct serio *io; -}; - -struct arc_ps2_data { - struct arc_ps2_port port[ARC_PS2_PORTS]; - void __iomem *addr; - unsigned int frame_error; - unsigned int buf_overflow; - unsigned int total_int; -}; - -static void arc_ps2_check_rx(struct arc_ps2_data *arc_ps2, - struct arc_ps2_port *port) -{ - unsigned int timeout = 1000; - unsigned int flag, status; - unsigned char data; - - do { - status = ioread32(port->status_addr); - if (!(status & PS2_STAT_RX_VAL)) - return; - - data = ioread32(port->data_addr) & 0xff; - - flag = 0; - arc_ps2->total_int++; - if (status & PS2_STAT_RX_FRM_ERR) { - arc_ps2->frame_error++; - flag |= SERIO_PARITY; - } else if (status & PS2_STAT_RX_BUF_OVER) { - arc_ps2->buf_overflow++; - flag |= SERIO_FRAME; - } - - serio_interrupt(port->io, data, flag); - } while (--timeout); - - dev_err(&port->io->dev, "PS/2 hardware stuck\n"); -} - -static irqreturn_t arc_ps2_interrupt(int irq, void *dev) -{ - struct arc_ps2_data *arc_ps2 = dev; - int i; - - for (i = 0; i < ARC_PS2_PORTS; i++) - arc_ps2_check_rx(arc_ps2, &arc_ps2->port[i]); - - return IRQ_HANDLED; -} - -static int arc_ps2_write(struct serio *io, unsigned char val) -{ - unsigned status; - struct arc_ps2_port *port = io->port_data; - int timeout = STAT_TIMEOUT; - - do { - status = ioread32(port->status_addr); - cpu_relax(); - - if (status & PS2_STAT_TX_ISNOT_FUL) { - iowrite32(val & 0xff, port->data_addr); - return 0; - } - - } while (--timeout); - - dev_err(&io->dev, "write timeout\n"); - return -ETIMEDOUT; -} - -static int arc_ps2_open(struct serio *io) -{ - struct arc_ps2_port *port = io->port_data; - - iowrite32(PS2_STAT_RX_INT_EN, port->status_addr); - - return 0; -} - -static void arc_ps2_close(struct serio *io) -{ - struct arc_ps2_port *port = io->port_data; - - iowrite32(ioread32(port->status_addr) & ~PS2_STAT_RX_INT_EN, - port->status_addr); -} - -static void __iomem *arc_ps2_calc_addr(struct arc_ps2_data *arc_ps2, - int index, bool status) -{ - void __iomem *addr; - - addr = arc_ps2->addr + 4 + 4 * index; - if (status) - addr += ARC_PS2_PORTS * 4; - - return addr; -} - -static void arc_ps2_inhibit_ports(struct arc_ps2_data *arc_ps2) -{ - void __iomem *addr; - u32 val; - int i; - - for (i = 0; i < ARC_PS2_PORTS; i++) { - addr = arc_ps2_calc_addr(arc_ps2, i, true); - val = ioread32(addr); - val &= ~(PS2_STAT_RX_INT_EN | PS2_STAT_TX_INT_EN); - iowrite32(val, addr); - } -} - -static int arc_ps2_create_port(struct platform_device *pdev, - struct arc_ps2_data *arc_ps2, - int index) -{ - struct arc_ps2_port *port = &arc_ps2->port[index]; - struct serio *io; - - io = kzalloc(sizeof(struct serio), GFP_KERNEL); - if (!io) - return -ENOMEM; - - io->id.type = SERIO_8042; - io->write = arc_ps2_write; - io->open = arc_ps2_open; - io->close = arc_ps2_close; - snprintf(io->name, sizeof(io->name), "ARC PS/2 port%d", index); - snprintf(io->phys, sizeof(io->phys), "arc/serio%d", index); - io->port_data = port; - - port->io = io; - - port->data_addr = arc_ps2_calc_addr(arc_ps2, index, false); - port->status_addr = arc_ps2_calc_addr(arc_ps2, index, true); - - dev_dbg(&pdev->dev, "port%d is allocated (data = 0x%p, status = 0x%p)\n", - index, port->data_addr, port->status_addr); - - serio_register_port(port->io); - return 0; -} - -static int arc_ps2_probe(struct platform_device *pdev) -{ - struct arc_ps2_data *arc_ps2; - struct resource *res; - int irq; - int error, id, i; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "no IO memory defined\n"); - return -EINVAL; - } - - irq = platform_get_irq_byname(pdev, "arc_ps2_irq"); - if (irq < 0) { - dev_err(&pdev->dev, "no IRQ defined\n"); - return -EINVAL; - } - - arc_ps2 = devm_kzalloc(&pdev->dev, sizeof(struct arc_ps2_data), - GFP_KERNEL); - if (!arc_ps2) { - dev_err(&pdev->dev, "out of memory\n"); - return -ENOMEM; - } - - arc_ps2->addr = devm_request_and_ioremap(&pdev->dev, res); - if (!arc_ps2->addr) - return -EBUSY; - - dev_info(&pdev->dev, "irq = %d, address = 0x%p, ports = %i\n", - irq, arc_ps2->addr, ARC_PS2_PORTS); - - id = ioread32(arc_ps2->addr); - if (id != ARC_ARC_PS2_ID) { - dev_err(&pdev->dev, "device id does not match\n"); - return -ENXIO; - } - - arc_ps2_inhibit_ports(arc_ps2); - - error = devm_request_irq(&pdev->dev, irq, arc_ps2_interrupt, - 0, "arc_ps2", arc_ps2); - if (error) { - dev_err(&pdev->dev, "Could not allocate IRQ\n"); - return error; - } - - for (i = 0; i < ARC_PS2_PORTS; i++) { - error = arc_ps2_create_port(pdev, arc_ps2, i); - if (error) { - while (--i >= 0) - serio_unregister_port(arc_ps2->port[i].io); - return error; - } - } - - platform_set_drvdata(pdev, arc_ps2); - - return 0; -} - -static int arc_ps2_remove(struct platform_device *pdev) -{ - struct arc_ps2_data *arc_ps2 = platform_get_drvdata(pdev); - int i; - - for (i = 0; i < ARC_PS2_PORTS; i++) - serio_unregister_port(arc_ps2->port[i].io); - - dev_dbg(&pdev->dev, "interrupt count = %i\n", arc_ps2->total_int); - dev_dbg(&pdev->dev, "frame error count = %i\n", arc_ps2->frame_error); - dev_dbg(&pdev->dev, "buffer overflow count = %i\n", - arc_ps2->buf_overflow); - - return 0; -} - -static struct platform_driver arc_ps2_driver = { - .driver = { - .name = "arc_ps2", - .owner = THIS_MODULE, - }, - .probe = arc_ps2_probe, - .remove = arc_ps2_remove, -}; - -module_platform_driver(arc_ps2_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Pavel Sokolov "); -MODULE_DESCRIPTION("ARC PS/2 Driver"); diff --git a/trunk/drivers/input/serio/ct82c710.c b/trunk/drivers/input/serio/ct82c710.c index cfe549d4eaa5..852816567241 100644 --- a/trunk/drivers/input/serio/ct82c710.c +++ b/trunk/drivers/input/serio/ct82c710.c @@ -175,7 +175,7 @@ static int __init ct82c710_detect(void) return 0; } -static int ct82c710_probe(struct platform_device *dev) +static int __devinit ct82c710_probe(struct platform_device *dev) { ct82c710_port = kzalloc(sizeof(struct serio), GFP_KERNEL); if (!ct82c710_port) @@ -199,7 +199,7 @@ static int ct82c710_probe(struct platform_device *dev) return 0; } -static int ct82c710_remove(struct platform_device *dev) +static int __devexit ct82c710_remove(struct platform_device *dev) { serio_unregister_port(ct82c710_port); @@ -212,7 +212,7 @@ static struct platform_driver ct82c710_driver = { .owner = THIS_MODULE, }, .probe = ct82c710_probe, - .remove = ct82c710_remove, + .remove = __devexit_p(ct82c710_remove), }; diff --git a/trunk/drivers/input/serio/gscps2.c b/trunk/drivers/input/serio/gscps2.c index 8d9ba0c3827c..4225f5d6b15f 100644 --- a/trunk/drivers/input/serio/gscps2.c +++ b/trunk/drivers/input/serio/gscps2.c @@ -327,7 +327,7 @@ static void gscps2_close(struct serio *port) * @return: success/error report */ -static int gscps2_probe(struct parisc_device *dev) +static int __devinit gscps2_probe(struct parisc_device *dev) { struct gscps2port *ps2port; struct serio *serio; @@ -414,7 +414,7 @@ static int gscps2_probe(struct parisc_device *dev) * @return: success/error report */ -static int gscps2_remove(struct parisc_device *dev) +static int __devexit gscps2_remove(struct parisc_device *dev) { struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); @@ -444,7 +444,7 @@ static struct parisc_driver parisc_ps2_driver = { .name = "gsc_ps2", .id_table = gscps2_device_tbl, .probe = gscps2_probe, - .remove = gscps2_remove, + .remove = __devexit_p(gscps2_remove), }; static int __init gscps2_init(void) diff --git a/trunk/drivers/input/serio/hil_mlc.c b/trunk/drivers/input/serio/hil_mlc.c index 65605e4ef3cf..bfd3865d886b 100644 --- a/trunk/drivers/input/serio/hil_mlc.c +++ b/trunk/drivers/input/serio/hil_mlc.c @@ -686,12 +686,13 @@ static int hilse_donode(hil_mlc *mlc) write_lock_irqsave(&mlc->lock, flags); pack = node->object.packet; out: - if (!mlc->istarted) { - /* Prepare to receive input */ - if ((node + 1)->act & HILSE_IN) - hilse_setup_input(mlc, node + 1); - } + if (mlc->istarted) + goto out2; + /* Prepare to receive input */ + if ((node + 1)->act & HILSE_IN) + hilse_setup_input(mlc, node + 1); + out2: write_unlock_irqrestore(&mlc->lock, flags); if (down_trylock(&mlc->osem)) { @@ -1009,6 +1010,8 @@ static int __init hil_mlc_init(void) static void __exit hil_mlc_exit(void) { del_timer_sync(&hil_mlcs_kicker); + + tasklet_disable(&hil_mlcs_tasklet); tasklet_kill(&hil_mlcs_tasklet); } diff --git a/trunk/drivers/input/serio/i8042-io.h b/trunk/drivers/input/serio/i8042-io.h index a5eed2ade53d..5d48bb66aa73 100644 --- a/trunk/drivers/input/serio/i8042-io.h +++ b/trunk/drivers/input/serio/i8042-io.h @@ -76,7 +76,7 @@ static inline int i8042_platform_init(void) if (check_legacy_ioport(I8042_DATA_REG)) return -ENODEV; #endif -#if !defined(__sh__) && !defined(__alpha__) +#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) if (!request_region(I8042_DATA_REG, 16, "i8042")) return -EBUSY; #endif diff --git a/trunk/drivers/input/serio/i8042-sparcio.h b/trunk/drivers/input/serio/i8042-sparcio.h index d6aa4c67dbb6..395a9af3adcd 100644 --- a/trunk/drivers/input/serio/i8042-sparcio.h +++ b/trunk/drivers/input/serio/i8042-sparcio.h @@ -49,7 +49,7 @@ static inline void i8042_write_command(int val) #define OBP_PS2MS_NAME1 "kdmouse" #define OBP_PS2MS_NAME2 "mouse" -static int sparc_i8042_probe(struct platform_device *op) +static int __devinit sparc_i8042_probe(struct platform_device *op) { struct device_node *dp = op->dev.of_node; @@ -80,7 +80,7 @@ static int sparc_i8042_probe(struct platform_device *op) return 0; } -static int sparc_i8042_remove(struct platform_device *op) +static int __devexit sparc_i8042_remove(struct platform_device *op) { of_iounmap(kbd_res, kbd_iobase, 8); @@ -102,7 +102,7 @@ static struct platform_driver sparc_i8042_driver = { .of_match_table = sparc_i8042_match, }, .probe = sparc_i8042_probe, - .remove = sparc_i8042_remove, + .remove = __devexit_p(sparc_i8042_remove), }; static int __init i8042_platform_init(void) diff --git a/trunk/drivers/input/serio/i8042.c b/trunk/drivers/input/serio/i8042.c index 78e4de42efaa..86564414b75a 100644 --- a/trunk/drivers/input/serio/i8042.c +++ b/trunk/drivers/input/serio/i8042.c @@ -1284,7 +1284,7 @@ static void __init i8042_register_ports(void) } } -static void i8042_unregister_ports(void) +static void __devexit i8042_unregister_ports(void) { int i; @@ -1437,7 +1437,7 @@ static int __init i8042_probe(struct platform_device *dev) return error; } -static int i8042_remove(struct platform_device *dev) +static int __devexit i8042_remove(struct platform_device *dev) { i8042_unregister_ports(); i8042_free_irqs(); @@ -1455,7 +1455,7 @@ static struct platform_driver i8042_driver = { .pm = &i8042_pm_ops, #endif }, - .remove = i8042_remove, + .remove = __devexit_p(i8042_remove), .shutdown = i8042_shutdown, }; diff --git a/trunk/drivers/input/serio/maceps2.c b/trunk/drivers/input/serio/maceps2.c index bc85e1cc66d8..61da763b1209 100644 --- a/trunk/drivers/input/serio/maceps2.c +++ b/trunk/drivers/input/serio/maceps2.c @@ -116,7 +116,7 @@ static void maceps2_close(struct serio *dev) } -static struct serio *maceps2_allocate_port(int idx) +static struct serio * __devinit maceps2_allocate_port(int idx) { struct serio *serio; @@ -135,7 +135,7 @@ static struct serio *maceps2_allocate_port(int idx) return serio; } -static int maceps2_probe(struct platform_device *dev) +static int __devinit maceps2_probe(struct platform_device *dev) { maceps2_port[0] = maceps2_allocate_port(0); maceps2_port[1] = maceps2_allocate_port(1); @@ -151,7 +151,7 @@ static int maceps2_probe(struct platform_device *dev) return 0; } -static int maceps2_remove(struct platform_device *dev) +static int __devexit maceps2_remove(struct platform_device *dev) { serio_unregister_port(maceps2_port[0]); serio_unregister_port(maceps2_port[1]); @@ -165,7 +165,7 @@ static struct platform_driver maceps2_driver = { .owner = THIS_MODULE, }, .probe = maceps2_probe, - .remove = maceps2_remove, + .remove = __devexit_p(maceps2_remove), }; static int __init maceps2_init(void) diff --git a/trunk/drivers/input/serio/pcips2.c b/trunk/drivers/input/serio/pcips2.c index 76f83836fd5a..0c42497aaaf4 100644 --- a/trunk/drivers/input/serio/pcips2.c +++ b/trunk/drivers/input/serio/pcips2.c @@ -127,7 +127,7 @@ static void pcips2_close(struct serio *io) free_irq(ps2if->dev->irq, ps2if); } -static int pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id) +static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id) { struct pcips2_data *ps2if; struct serio *serio; @@ -176,7 +176,7 @@ static int pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id) return ret; } -static void pcips2_remove(struct pci_dev *dev) +static void __devexit pcips2_remove(struct pci_dev *dev) { struct pcips2_data *ps2if = pci_get_drvdata(dev); @@ -212,7 +212,7 @@ static struct pci_driver pcips2_driver = { .name = "pcips2", .id_table = pcips2_ids, .probe = pcips2_probe, - .remove = pcips2_remove, + .remove = __devexit_p(pcips2_remove), }; module_pci_driver(pcips2_driver); diff --git a/trunk/drivers/input/serio/q40kbd.c b/trunk/drivers/input/serio/q40kbd.c index 70fe542839fb..0c0df7f73802 100644 --- a/trunk/drivers/input/serio/q40kbd.c +++ b/trunk/drivers/input/serio/q40kbd.c @@ -122,7 +122,7 @@ static void q40kbd_close(struct serio *port) q40kbd_flush(q40kbd); } -static int q40kbd_probe(struct platform_device *pdev) +static int __devinit q40kbd_probe(struct platform_device *pdev) { struct q40kbd *q40kbd; struct serio *port; @@ -168,7 +168,7 @@ static int q40kbd_probe(struct platform_device *pdev) return error; } -static int q40kbd_remove(struct platform_device *pdev) +static int __devexit q40kbd_remove(struct platform_device *pdev) { struct q40kbd *q40kbd = platform_get_drvdata(pdev); @@ -190,7 +190,7 @@ static struct platform_driver q40kbd_driver = { .name = "q40kbd", .owner = THIS_MODULE, }, - .remove = q40kbd_remove, + .remove = __devexit_p(q40kbd_remove), }; static int __init q40kbd_init(void) diff --git a/trunk/drivers/input/serio/rpckbd.c b/trunk/drivers/input/serio/rpckbd.c index 567566ae0dae..2af5df6a8fba 100644 --- a/trunk/drivers/input/serio/rpckbd.c +++ b/trunk/drivers/input/serio/rpckbd.c @@ -114,7 +114,7 @@ static void rpckbd_close(struct serio *port) * Allocate and initialize serio structure for subsequent registration * with serio core. */ -static int rpckbd_probe(struct platform_device *dev) +static int __devinit rpckbd_probe(struct platform_device *dev) { struct rpckbd_data *rpckbd; struct serio *serio; @@ -153,7 +153,7 @@ static int rpckbd_probe(struct platform_device *dev) return 0; } -static int rpckbd_remove(struct platform_device *dev) +static int __devexit rpckbd_remove(struct platform_device *dev) { struct serio *serio = platform_get_drvdata(dev); struct rpckbd_data *rpckbd = serio->port_data; @@ -166,7 +166,7 @@ static int rpckbd_remove(struct platform_device *dev) static struct platform_driver rpckbd_driver = { .probe = rpckbd_probe, - .remove = rpckbd_remove, + .remove = __devexit_p(rpckbd_remove), .driver = { .name = "kart", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/serio/sa1111ps2.c b/trunk/drivers/input/serio/sa1111ps2.c index b3e688911fd9..389766707534 100644 --- a/trunk/drivers/input/serio/sa1111ps2.c +++ b/trunk/drivers/input/serio/sa1111ps2.c @@ -193,7 +193,7 @@ static void ps2_close(struct serio *io) /* * Clear the input buffer. */ -static void ps2_clear_input(struct ps2if *ps2if) +static void __devinit ps2_clear_input(struct ps2if *ps2if) { int maxread = 100; @@ -203,7 +203,7 @@ static void ps2_clear_input(struct ps2if *ps2if) } } -static unsigned int ps2_test_one(struct ps2if *ps2if, +static unsigned int __devinit ps2_test_one(struct ps2if *ps2if, unsigned int mask) { unsigned int val; @@ -220,7 +220,7 @@ static unsigned int ps2_test_one(struct ps2if *ps2if, * Test the keyboard interface. We basically check to make sure that * we can drive each line to the keyboard independently of each other. */ -static int ps2_test(struct ps2if *ps2if) +static int __devinit ps2_test(struct ps2if *ps2if) { unsigned int stat; int ret = 0; @@ -251,7 +251,7 @@ static int ps2_test(struct ps2if *ps2if) /* * Add one device to this driver. */ -static int ps2_probe(struct sa1111_dev *dev) +static int __devinit ps2_probe(struct sa1111_dev *dev) { struct ps2if *ps2if; struct serio *serio; @@ -334,7 +334,7 @@ static int ps2_probe(struct sa1111_dev *dev) /* * Remove one device from this driver. */ -static int ps2_remove(struct sa1111_dev *dev) +static int __devexit ps2_remove(struct sa1111_dev *dev) { struct ps2if *ps2if = sa1111_get_drvdata(dev); @@ -357,7 +357,7 @@ static struct sa1111_driver ps2_driver = { }, .devid = SA1111_DEVID_PS2, .probe = ps2_probe, - .remove = ps2_remove, + .remove = __devexit_p(ps2_remove), }; static int __init ps2_init(void) diff --git a/trunk/drivers/input/serio/serio.c b/trunk/drivers/input/serio/serio.c index 25fc5971f426..d0f7533dbf88 100644 --- a/trunk/drivers/input/serio/serio.c +++ b/trunk/drivers/input/serio/serio.c @@ -891,6 +891,8 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv) return serio_match_port(serio_drv->id_table, serio); } +#ifdef CONFIG_HOTPLUG + #define SERIO_ADD_UEVENT_VAR(fmt, val...) \ do { \ int err = add_uevent_var(env, fmt, val); \ @@ -918,6 +920,15 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) } #undef SERIO_ADD_UEVENT_VAR +#else + +static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) +{ + return -ENODEV; +} + +#endif /* CONFIG_HOTPLUG */ + #ifdef CONFIG_PM static int serio_suspend(struct device *dev) { diff --git a/trunk/drivers/input/serio/xilinx_ps2.c b/trunk/drivers/input/serio/xilinx_ps2.c index 17be85948ffd..1e983bec7d86 100644 --- a/trunk/drivers/input/serio/xilinx_ps2.c +++ b/trunk/drivers/input/serio/xilinx_ps2.c @@ -233,7 +233,7 @@ static void sxps2_close(struct serio *pserio) * It returns 0, if the driver is bound to the PS/2 device, or a negative * value if there is an error. */ -static int xps2_of_probe(struct platform_device *ofdev) +static int __devinit xps2_of_probe(struct platform_device *ofdev) { struct resource r_irq; /* Interrupt resources */ struct resource r_mem; /* IO mem resources */ @@ -333,7 +333,7 @@ static int xps2_of_probe(struct platform_device *ofdev) * if the driver module is being unloaded. It frees any resources allocated to * the device. */ -static int xps2_of_remove(struct platform_device *of_dev) +static int __devexit xps2_of_remove(struct platform_device *of_dev) { struct xps2data *drvdata = platform_get_drvdata(of_dev); struct resource r_mem; /* IO mem resources */ @@ -355,7 +355,7 @@ static int xps2_of_remove(struct platform_device *of_dev) } /* Match table for of_platform binding */ -static const struct of_device_id xps2_of_match[] = { +static const struct of_device_id xps2_of_match[] __devinitconst = { { .compatible = "xlnx,xps-ps2-1.00.a", }, { /* end of list */ }, }; @@ -368,7 +368,7 @@ static struct platform_driver xps2_of_driver = { .of_match_table = xps2_of_match, }, .probe = xps2_of_probe, - .remove = xps2_of_remove, + .remove = __devexit_p(xps2_of_remove), }; module_platform_driver(xps2_of_driver); diff --git a/trunk/drivers/input/tablet/wacom_sys.c b/trunk/drivers/input/tablet/wacom_sys.c index f92d34f45a1c..858ad446de91 100644 --- a/trunk/drivers/input/tablet/wacom_sys.c +++ b/trunk/drivers/input/tablet/wacom_sys.c @@ -386,40 +386,23 @@ static int wacom_parse_hid(struct usb_interface *intf, if (usage == WCM_DESKTOP) { if (finger) { features->device_type = BTN_TOOL_FINGER; - - switch (features->type) { - case TABLETPC2FG: + if (features->type == TABLETPC2FG) { + /* need to reset back */ features->pktlen = WACOM_PKGLEN_TPC2FG; - break; + } - case MTSCREEN: - case WACOM_24HDT: + if (features->type == MTSCREEN || features->type == WACOM_24HDT) features->pktlen = WACOM_PKGLEN_MTOUCH; - break; - case MTTPC: - features->pktlen = WACOM_PKGLEN_MTTPC; - break; - - case BAMBOO_PT: + if (features->type == BAMBOO_PT) { + /* need to reset back */ features->pktlen = WACOM_PKGLEN_BBTOUCH; - break; - - default: - features->pktlen = WACOM_PKGLEN_GRAPHIRE; - break; - } - - switch (features->type) { - case BAMBOO_PT: features->x_phy = get_unaligned_le16(&report[i + 5]); features->x_max = get_unaligned_le16(&report[i + 8]); i += 15; - break; - - case WACOM_24HDT: + } else if (features->type == WACOM_24HDT) { features->x_max = get_unaligned_le16(&report[i + 3]); features->x_phy = @@ -427,9 +410,7 @@ static int wacom_parse_hid(struct usb_interface *intf, features->unit = report[i - 1]; features->unitExpo = report[i - 3]; i += 12; - break; - - default: + } else { features->x_max = get_unaligned_le16(&report[i + 3]); features->x_phy = @@ -437,11 +418,10 @@ static int wacom_parse_hid(struct usb_interface *intf, features->unit = report[i + 9]; features->unitExpo = report[i + 11]; i += 12; - break; } } else if (pen) { /* penabled only accepts exact bytes of data */ - if (features->type >= TABLETPC) + if (features->type == TABLETPC2FG) features->pktlen = WACOM_PKGLEN_GRAPHIRE; features->device_type = BTN_TOOL_PEN; features->x_max = @@ -454,40 +434,32 @@ static int wacom_parse_hid(struct usb_interface *intf, case HID_USAGE_Y: if (usage == WCM_DESKTOP) { if (finger) { - switch (features->type) { - case TABLETPC2FG: - case MTSCREEN: - case MTTPC: + int type = features->type; + + if (type == TABLETPC2FG || type == MTSCREEN) { features->y_max = get_unaligned_le16(&report[i + 3]); features->y_phy = get_unaligned_le16(&report[i + 6]); i += 7; - break; - - case WACOM_24HDT: + } else if (type == WACOM_24HDT) { features->y_max = get_unaligned_le16(&report[i + 3]); features->y_phy = get_unaligned_le16(&report[i - 2]); i += 7; - break; - - case BAMBOO_PT: + } else if (type == BAMBOO_PT) { features->y_phy = get_unaligned_le16(&report[i + 3]); features->y_max = get_unaligned_le16(&report[i + 6]); i += 12; - break; - - default: + } else { features->y_max = features->x_max; features->y_phy = get_unaligned_le16(&report[i + 3]); i += 4; - break; } } else if (pen) { features->y_max = diff --git a/trunk/drivers/input/tablet/wacom_wac.c b/trunk/drivers/input/tablet/wacom_wac.c index 264138f3217e..0a67031ffc13 100644 --- a/trunk/drivers/input/tablet/wacom_wac.c +++ b/trunk/drivers/input/tablet/wacom_wac.c @@ -467,7 +467,9 @@ static void wacom_intuos_general(struct wacom_wac *wacom) /* general pen packet */ if ((data[1] & 0xb8) == 0xa0) { t = (data[6] << 2) | ((data[7] >> 6) & 3); - if (features->type >= INTUOS4S && features->type <= WACOM_24HD) { + if ((features->type >= INTUOS4S && features->type <= INTUOS4L) || + (features->type >= INTUOS5S && features->type <= INTUOS5L) || + (features->type >= WACOM_21UX2 && features->type <= WACOM_24HD)) { t = (t << 1) | (data[1] & 1); } input_report_abs(input, ABS_PRESSURE, t); @@ -875,11 +877,6 @@ static int wacom_mt_touch(struct wacom_wac *wacom) int i; int current_num_contacts = data[2]; int contacts_to_send = 0; - int x_offset = 0; - - /* MTTPC does not support Height and Width */ - if (wacom->features.type == MTTPC) - x_offset = -4; /* * First packet resets the counter since only the first @@ -892,7 +889,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom) contacts_to_send = min(5, wacom->num_contacts_left); for (i = 0; i < contacts_to_send; i++) { - int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3; + int offset = (WACOM_BYTES_PER_MT_PACKET * i) + 3; bool touch = data[offset] & 0x1; int id = le16_to_cpup((__le16 *)&data[offset + 1]); int slot = find_slot_from_contactid(wacom, id); @@ -903,8 +900,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom) input_mt_slot(input, slot); input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); if (touch) { - int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]); - int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]); + int x = le16_to_cpup((__le16 *)&data[offset + 7]); + int y = le16_to_cpup((__le16 *)&data[offset + 9]); input_report_abs(input, ABS_MT_POSITION_X, x); input_report_abs(input, ABS_MT_POSITION_Y, y); } @@ -1339,7 +1336,6 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) case TABLETPCE: case TABLETPC2FG: case MTSCREEN: - case MTTPC: sync = wacom_tpc_irq(wacom_wac, len); break; @@ -1661,7 +1657,6 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, /* fall through */ case MTSCREEN: - case MTTPC: if (features->device_type == BTN_TOOL_FINGER) { wacom_wac->slots = kmalloc(features->touch_max * sizeof(int), @@ -2023,15 +2018,6 @@ static const struct wacom_features wacom_features_0xED = static const struct wacom_features wacom_features_0xEF = { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; -static const struct wacom_features wacom_features_0x100 = - { "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; -static const struct wacom_features wacom_features_0x101 = - { "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; -static const struct wacom_features wacom_features_0x4001 = - { "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, - 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; static const struct wacom_features wacom_features_0x47 = { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; @@ -2048,8 +2034,7 @@ static const struct wacom_features wacom_features_0xD1 = .touch_max = 2 }; static const struct wacom_features wacom_features_0xD2 = { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, - 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, - .touch_max = 2 }; + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; static const struct wacom_features wacom_features_0xD3 = { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, @@ -2209,9 +2194,6 @@ const struct usb_device_id wacom_ids[] = { { USB_DEVICE_WACOM(0xEC) }, { USB_DEVICE_WACOM(0xED) }, { USB_DEVICE_WACOM(0xEF) }, - { USB_DEVICE_WACOM(0x100) }, - { USB_DEVICE_WACOM(0x101) }, - { USB_DEVICE_WACOM(0x4001) }, { USB_DEVICE_WACOM(0x47) }, { USB_DEVICE_WACOM(0xF4) }, { USB_DEVICE_WACOM(0xF8) }, diff --git a/trunk/drivers/input/tablet/wacom_wac.h b/trunk/drivers/input/tablet/wacom_wac.h index 9396d7769f86..345f1e76975e 100644 --- a/trunk/drivers/input/tablet/wacom_wac.h +++ b/trunk/drivers/input/tablet/wacom_wac.h @@ -26,7 +26,6 @@ #define WACOM_PKGLEN_BBPEN 10 #define WACOM_PKGLEN_WIRELESS 32 #define WACOM_PKGLEN_MTOUCH 62 -#define WACOM_PKGLEN_MTTPC 40 /* wacom data size per MT contact */ #define WACOM_BYTES_PER_MT_PACKET 11 @@ -89,7 +88,6 @@ enum { TABLETPCE, TABLETPC2FG, MTSCREEN, - MTTPC, MAX_TYPE }; diff --git a/trunk/drivers/input/touchscreen/88pm860x-ts.c b/trunk/drivers/input/touchscreen/88pm860x-ts.c index c7068942ebe8..326218dbd6e6 100644 --- a/trunk/drivers/input/touchscreen/88pm860x-ts.c +++ b/trunk/drivers/input/touchscreen/88pm860x-ts.c @@ -115,7 +115,7 @@ static void pm860x_touch_close(struct input_dev *dev) } #ifdef CONFIG_OF -static int pm860x_touch_dt_init(struct platform_device *pdev, +static int __devinit pm860x_touch_dt_init(struct platform_device *pdev, struct pm860x_chip *chip, int *res_x) { @@ -169,7 +169,7 @@ static int pm860x_touch_dt_init(struct platform_device *pdev, #define pm860x_touch_dt_init(x, y, z) (-1) #endif -static int pm860x_touch_probe(struct platform_device *pdev) +static int __devinit pm860x_touch_probe(struct platform_device *pdev) { struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); struct pm860x_touch_pdata *pdata = pdev->dev.platform_data; @@ -293,7 +293,7 @@ static int pm860x_touch_probe(struct platform_device *pdev) return ret; } -static int pm860x_touch_remove(struct platform_device *pdev) +static int __devexit pm860x_touch_remove(struct platform_device *pdev) { struct pm860x_touch *touch = platform_get_drvdata(pdev); @@ -310,7 +310,7 @@ static struct platform_driver pm860x_touch_driver = { .owner = THIS_MODULE, }, .probe = pm860x_touch_probe, - .remove = pm860x_touch_remove, + .remove = __devexit_p(pm860x_touch_remove), }; module_platform_driver(pm860x_touch_driver); diff --git a/trunk/drivers/input/touchscreen/Kconfig b/trunk/drivers/input/touchscreen/Kconfig index 515cfe790543..0c45caddd41c 100644 --- a/trunk/drivers/input/touchscreen/Kconfig +++ b/trunk/drivers/input/touchscreen/Kconfig @@ -111,6 +111,18 @@ config TOUCHSCREEN_AUO_PIXCIR To compile this driver as a module, choose M here: the module will be called auo-pixcir-ts. +config TOUCHSCREEN_BITSY + tristate "Compaq iPAQ H3600 (Bitsy) touchscreen" + depends on SA1100_BITSY + select SERIO + help + Say Y here if you have the h3600 (Bitsy) touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called h3600_ts_input. + config TOUCHSCREEN_BU21013 tristate "BU21013 based touch panel controllers" depends on I2C diff --git a/trunk/drivers/input/touchscreen/Makefile b/trunk/drivers/input/touchscreen/Makefile index 6bfbeab67c9f..7c4c78ebe49e 100644 --- a/trunk/drivers/input/touchscreen/Makefile +++ b/trunk/drivers/input/touchscreen/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o +obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o obj-$(CONFIG_TOUCHSCREEN_CYTTSP_CORE) += cyttsp_core.o diff --git a/trunk/drivers/input/touchscreen/ad7877.c b/trunk/drivers/input/touchscreen/ad7877.c index 23fa829b869d..2c7692108e6c 100644 --- a/trunk/drivers/input/touchscreen/ad7877.c +++ b/trunk/drivers/input/touchscreen/ad7877.c @@ -682,7 +682,7 @@ static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts) } } -static int ad7877_probe(struct spi_device *spi) +static int __devinit ad7877_probe(struct spi_device *spi) { struct ad7877 *ts; struct input_dev *input_dev; @@ -810,7 +810,7 @@ static int ad7877_probe(struct spi_device *spi) return err; } -static int ad7877_remove(struct spi_device *spi) +static int __devexit ad7877_remove(struct spi_device *spi) { struct ad7877 *ts = dev_get_drvdata(&spi->dev); @@ -857,7 +857,7 @@ static struct spi_driver ad7877_driver = { .pm = &ad7877_pm, }, .probe = ad7877_probe, - .remove = ad7877_remove, + .remove = __devexit_p(ad7877_remove), }; module_spi_driver(ad7877_driver); diff --git a/trunk/drivers/input/touchscreen/ad7879-i2c.c b/trunk/drivers/input/touchscreen/ad7879-i2c.c index dcf390771549..3054354d0dd3 100644 --- a/trunk/drivers/input/touchscreen/ad7879-i2c.c +++ b/trunk/drivers/input/touchscreen/ad7879-i2c.c @@ -54,7 +54,7 @@ static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { .write = ad7879_i2c_write, }; -static int ad7879_i2c_probe(struct i2c_client *client, +static int __devinit ad7879_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ad7879 *ts; @@ -75,7 +75,7 @@ static int ad7879_i2c_probe(struct i2c_client *client, return 0; } -static int ad7879_i2c_remove(struct i2c_client *client) +static int __devexit ad7879_i2c_remove(struct i2c_client *client) { struct ad7879 *ts = i2c_get_clientdata(client); @@ -98,7 +98,7 @@ static struct i2c_driver ad7879_i2c_driver = { .pm = &ad7879_pm_ops, }, .probe = ad7879_i2c_probe, - .remove = ad7879_i2c_remove, + .remove = __devexit_p(ad7879_i2c_remove), .id_table = ad7879_id, }; diff --git a/trunk/drivers/input/touchscreen/ad7879-spi.c b/trunk/drivers/input/touchscreen/ad7879-spi.c index 606da5bd6115..db49abf056ba 100644 --- a/trunk/drivers/input/touchscreen/ad7879-spi.c +++ b/trunk/drivers/input/touchscreen/ad7879-spi.c @@ -110,7 +110,7 @@ static const struct ad7879_bus_ops ad7879_spi_bus_ops = { .write = ad7879_spi_write, }; -static int ad7879_spi_probe(struct spi_device *spi) +static int __devinit ad7879_spi_probe(struct spi_device *spi) { struct ad7879 *ts; int err; @@ -137,7 +137,7 @@ static int ad7879_spi_probe(struct spi_device *spi) return 0; } -static int ad7879_spi_remove(struct spi_device *spi) +static int __devexit ad7879_spi_remove(struct spi_device *spi) { struct ad7879 *ts = spi_get_drvdata(spi); @@ -154,7 +154,7 @@ static struct spi_driver ad7879_spi_driver = { .pm = &ad7879_pm_ops, }, .probe = ad7879_spi_probe, - .remove = ad7879_spi_remove, + .remove = __devexit_p(ad7879_spi_remove), }; module_spi_driver(ad7879_spi_driver); diff --git a/trunk/drivers/input/touchscreen/ads7846.c b/trunk/drivers/input/touchscreen/ads7846.c index 4f702b3ec1a3..78e5d9ab0ba7 100644 --- a/trunk/drivers/input/touchscreen/ads7846.c +++ b/trunk/drivers/input/touchscreen/ads7846.c @@ -955,7 +955,7 @@ static int ads7846_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume); -static int ads7846_setup_pendown(struct spi_device *spi, +static int __devinit ads7846_setup_pendown(struct spi_device *spi, struct ads7846 *ts) { struct ads7846_platform_data *pdata = spi->dev.platform_data; @@ -997,7 +997,7 @@ static int ads7846_setup_pendown(struct spi_device *spi, * Set up the transfers to read touchscreen state; this assumes we * use formula #2 for pressure, not #3. */ -static void ads7846_setup_spi_msg(struct ads7846 *ts, +static void __devinit ads7846_setup_spi_msg(struct ads7846 *ts, const struct ads7846_platform_data *pdata) { struct spi_message *m = &ts->msg[0]; @@ -1196,7 +1196,7 @@ static void ads7846_setup_spi_msg(struct ads7846 *ts, spi_message_add_tail(x, m); } -static int ads7846_probe(struct spi_device *spi) +static int __devinit ads7846_probe(struct spi_device *spi) { struct ads7846 *ts; struct ads7846_packet *packet; @@ -1390,7 +1390,7 @@ static int ads7846_probe(struct spi_device *spi) return err; } -static int ads7846_remove(struct spi_device *spi) +static int __devexit ads7846_remove(struct spi_device *spi) { struct ads7846 *ts = dev_get_drvdata(&spi->dev); @@ -1434,7 +1434,7 @@ static struct spi_driver ads7846_driver = { .pm = &ads7846_pm, }, .probe = ads7846_probe, - .remove = ads7846_remove, + .remove = __devexit_p(ads7846_remove), }; module_spi_driver(ads7846_driver); diff --git a/trunk/drivers/input/touchscreen/atmel_mxt_ts.c b/trunk/drivers/input/touchscreen/atmel_mxt_ts.c index d04f810cb1dd..1df2396af008 100644 --- a/trunk/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/trunk/drivers/input/touchscreen/atmel_mxt_ts.c @@ -1095,7 +1095,7 @@ static void mxt_input_close(struct input_dev *dev) mxt_stop(data); } -static int mxt_probe(struct i2c_client *client, +static int __devinit mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct mxt_platform_data *pdata = client->dev.platform_data; @@ -1200,7 +1200,7 @@ static int mxt_probe(struct i2c_client *client, return error; } -static int mxt_remove(struct i2c_client *client) +static int __devexit mxt_remove(struct i2c_client *client) { struct mxt_data *data = i2c_get_clientdata(client); @@ -1270,7 +1270,7 @@ static struct i2c_driver mxt_driver = { .pm = &mxt_pm_ops, }, .probe = mxt_probe, - .remove = mxt_remove, + .remove = __devexit_p(mxt_remove), .id_table = mxt_id, }; diff --git a/trunk/drivers/input/touchscreen/atmel_tsadcc.c b/trunk/drivers/input/touchscreen/atmel_tsadcc.c index 95f6785a94b0..ea392ee138ed 100644 --- a/trunk/drivers/input/touchscreen/atmel_tsadcc.c +++ b/trunk/drivers/input/touchscreen/atmel_tsadcc.c @@ -177,7 +177,7 @@ static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) * The functions for inserting/removing us as a module. */ -static int atmel_tsadcc_probe(struct platform_device *pdev) +static int __devinit atmel_tsadcc_probe(struct platform_device *pdev) { struct atmel_tsadcc *ts_dev; struct input_dev *input_dev; @@ -323,7 +323,7 @@ static int atmel_tsadcc_probe(struct platform_device *pdev) return err; } -static int atmel_tsadcc_remove(struct platform_device *pdev) +static int __devexit atmel_tsadcc_remove(struct platform_device *pdev) { struct atmel_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev); struct resource *res; @@ -346,7 +346,7 @@ static int atmel_tsadcc_remove(struct platform_device *pdev) static struct platform_driver atmel_tsadcc_driver = { .probe = atmel_tsadcc_probe, - .remove = atmel_tsadcc_remove, + .remove = __devexit_p(atmel_tsadcc_remove), .driver = { .name = "atmel_tsadcc", }, diff --git a/trunk/drivers/input/touchscreen/auo-pixcir-ts.c b/trunk/drivers/input/touchscreen/auo-pixcir-ts.c index c6e19a96348e..c7047b6bb020 100644 --- a/trunk/drivers/input/touchscreen/auo-pixcir-ts.c +++ b/trunk/drivers/input/touchscreen/auo-pixcir-ts.c @@ -286,7 +286,7 @@ static int auo_pixcir_power_mode(struct auo_pixcir_ts *ts, int mode) return 0; } -static int auo_pixcir_int_config(struct auo_pixcir_ts *ts, +static __devinit int auo_pixcir_int_config(struct auo_pixcir_ts *ts, int int_setting) { struct i2c_client *client = ts->client; @@ -482,7 +482,7 @@ static int auo_pixcir_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops, auo_pixcir_suspend, auo_pixcir_resume); -static int auo_pixcir_probe(struct i2c_client *client, +static int __devinit auo_pixcir_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data; @@ -599,7 +599,7 @@ static int auo_pixcir_probe(struct i2c_client *client, return ret; } -static int auo_pixcir_remove(struct i2c_client *client) +static int __devexit auo_pixcir_remove(struct i2c_client *client) { struct auo_pixcir_ts *ts = i2c_get_clientdata(client); const struct auo_pixcir_ts_platdata *pdata = client->dev.platform_data; @@ -631,7 +631,7 @@ static struct i2c_driver auo_pixcir_driver = { .pm = &auo_pixcir_pm_ops, }, .probe = auo_pixcir_probe, - .remove = auo_pixcir_remove, + .remove = __devexit_p(auo_pixcir_remove), .id_table = auo_pixcir_idtable, }; diff --git a/trunk/drivers/input/touchscreen/bu21013_ts.c b/trunk/drivers/input/touchscreen/bu21013_ts.c index b9b5ddad6658..5c487d23f11c 100644 --- a/trunk/drivers/input/touchscreen/bu21013_ts.c +++ b/trunk/drivers/input/touchscreen/bu21013_ts.c @@ -14,9 +14,6 @@ #include #include #include -#include -#include -#include #define PEN_DOWN_INTR 0 #define MAX_FINGERS 2 @@ -151,12 +148,11 @@ struct bu21013_ts_data { struct i2c_client *client; wait_queue_head_t wait; + bool touch_stopped; const struct bu21013_platform_device *chip; struct input_dev *in_dev; - struct regulator *regulator; - unsigned int irq; unsigned int intr_pin; - bool touch_stopped; + struct regulator *regulator; }; /** @@ -266,7 +262,7 @@ static irqreturn_t bu21013_gpio_irq(int irq, void *device_data) return IRQ_NONE; } - data->intr_pin = gpio_get_value(data->chip->touch_pin); + data->intr_pin = data->chip->irq_read_val(); if (data->intr_pin == PEN_DOWN_INTR) wait_event_timeout(data->wait, data->touch_stopped, msecs_to_jiffies(2)); @@ -422,70 +418,8 @@ static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data) { bu21013_data->touch_stopped = true; wake_up(&bu21013_data->wait); - free_irq(bu21013_data->irq, bu21013_data); -} - -/** - * bu21013_cs_disable() - deconfigures the touch panel controller - * @bu21013_data: device structure pointer - * - * This function is used to deconfigure the chip selection - * for touch panel controller. - */ -static void bu21013_cs_disable(struct bu21013_ts_data *bu21013_data) -{ - int error; - - error = gpio_direction_output(bu21013_data->chip->cs_pin, 0); - if (error < 0) - dev_warn(&bu21013_data->client->dev, - "%s: gpio direction failed, error: %d\n", - __func__, error); - else - gpio_set_value(bu21013_data->chip->cs_pin, 0); - - gpio_free(bu21013_data->chip->cs_pin); -} - -#ifdef CONFIG_OF -static const struct bu21013_platform_device * -bu21013_parse_dt(struct device *dev) -{ - struct device_node *np = dev->of_node; - struct bu21013_platform_device *pdata; - - if (!np) { - dev_err(dev, "no device tree or platform data\n"); - return ERR_PTR(-EINVAL); - } - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return ERR_PTR(-ENOMEM); - - pdata->y_flip = pdata->x_flip = false; - - pdata->x_flip = of_property_read_bool(np, "rohm,flip-x"); - pdata->y_flip = of_property_read_bool(np, "rohm,flip-y"); - - of_property_read_u32(np, "rohm,touch-max-x", &pdata->touch_x_max); - of_property_read_u32(np, "rohm,touch-max-y", &pdata->touch_y_max); - - pdata->touch_pin = of_get_named_gpio(np, "touch-gpio", 0); - pdata->cs_pin = of_get_named_gpio(np, "reset-gpio", 0); - - pdata->ext_clk = false; - - return pdata; + free_irq(bu21013_data->chip->irq, bu21013_data); } -#else -static inline const struct bu21013_platform_device * -bu21013_parse_dt(struct device *dev) -{ - dev_err(dev, "no platform data available\n"); - return ERR_PTR(-EINVAL); -} -#endif /** * bu21013_probe() - initializes the i2c-client touchscreen driver @@ -495,13 +429,13 @@ bu21013_parse_dt(struct device *dev) * This function used to initializes the i2c-client touchscreen * driver and returns integer. */ -static int bu21013_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static int __devinit bu21013_probe(struct i2c_client *client, + const struct i2c_device_id *id) { - const struct bu21013_platform_device *pdata = - dev_get_platdata(&client->dev); struct bu21013_ts_data *bu21013_data; struct input_dev *in_dev; + const struct bu21013_platform_device *pdata = + client->dev.platform_data; int error; if (!i2c_check_functionality(client->adapter, @@ -511,13 +445,7 @@ static int bu21013_probe(struct i2c_client *client, } if (!pdata) { - pdata = bu21013_parse_dt(&client->dev); - if (IS_ERR(pdata)) - return PTR_ERR(pdata); - } - - if (!gpio_is_valid(pdata->touch_pin)) { - dev_err(&client->dev, "invalid touch_pin supplied\n"); + dev_err(&client->dev, "platform data not defined\n"); return -EINVAL; } @@ -532,9 +460,8 @@ static int bu21013_probe(struct i2c_client *client, bu21013_data->in_dev = in_dev; bu21013_data->chip = pdata; bu21013_data->client = client; - bu21013_data->irq = gpio_to_irq(pdata->touch_pin); - bu21013_data->regulator = regulator_get(&client->dev, "avdd"); + bu21013_data->regulator = regulator_get(&client->dev, "V-TOUCH"); if (IS_ERR(bu21013_data->regulator)) { dev_err(&client->dev, "regulator_get failed\n"); error = PTR_ERR(bu21013_data->regulator); @@ -551,11 +478,12 @@ static int bu21013_probe(struct i2c_client *client, init_waitqueue_head(&bu21013_data->wait); /* configure the gpio pins */ - error = gpio_request_one(pdata->cs_pin, GPIOF_OUT_INIT_HIGH, - "touchp_reset"); - if (error < 0) { - dev_err(&client->dev, "Unable to request gpio reset_pin\n"); - goto err_disable_regulator; + if (pdata->cs_en) { + error = pdata->cs_en(pdata->cs_pin); + if (error < 0) { + dev_err(&client->dev, "chip init failed\n"); + goto err_disable_regulator; + } } /* configure the touch panel controller */ @@ -580,13 +508,12 @@ static int bu21013_probe(struct i2c_client *client, pdata->touch_y_max, 0, 0); input_set_drvdata(in_dev, bu21013_data); - error = request_threaded_irq(bu21013_data->irq, NULL, bu21013_gpio_irq, + error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq, IRQF_TRIGGER_FALLING | IRQF_SHARED | IRQF_ONESHOT, DRIVER_TP, bu21013_data); if (error) { - dev_err(&client->dev, "request irq %d failed\n", - bu21013_data->irq); + dev_err(&client->dev, "request irq %d failed\n", pdata->irq); goto err_cs_disable; } @@ -604,7 +531,7 @@ static int bu21013_probe(struct i2c_client *client, err_free_irq: bu21013_free_irq(bu21013_data); err_cs_disable: - bu21013_cs_disable(bu21013_data); + pdata->cs_dis(pdata->cs_pin); err_disable_regulator: regulator_disable(bu21013_data->regulator); err_put_regulator: @@ -622,13 +549,13 @@ static int bu21013_probe(struct i2c_client *client, * This function uses to remove the i2c-client * touchscreen driver and returns integer. */ -static int bu21013_remove(struct i2c_client *client) +static int __devexit bu21013_remove(struct i2c_client *client) { struct bu21013_ts_data *bu21013_data = i2c_get_clientdata(client); bu21013_free_irq(bu21013_data); - bu21013_cs_disable(bu21013_data); + bu21013_data->chip->cs_dis(bu21013_data->chip->cs_pin); input_unregister_device(bu21013_data->in_dev); @@ -657,9 +584,9 @@ static int bu21013_suspend(struct device *dev) bu21013_data->touch_stopped = true; if (device_may_wakeup(&client->dev)) - enable_irq_wake(bu21013_data->irq); + enable_irq_wake(bu21013_data->chip->irq); else - disable_irq(bu21013_data->irq); + disable_irq(bu21013_data->chip->irq); regulator_disable(bu21013_data->regulator); @@ -694,9 +621,9 @@ static int bu21013_resume(struct device *dev) bu21013_data->touch_stopped = false; if (device_may_wakeup(&client->dev)) - disable_irq_wake(bu21013_data->irq); + disable_irq_wake(bu21013_data->chip->irq); else - enable_irq(bu21013_data->irq); + enable_irq(bu21013_data->chip->irq); return 0; } @@ -722,7 +649,7 @@ static struct i2c_driver bu21013_driver = { #endif }, .probe = bu21013_probe, - .remove = bu21013_remove, + .remove = __devexit_p(bu21013_remove), .id_table = bu21013_id, }; diff --git a/trunk/drivers/input/touchscreen/cy8ctmg110_ts.c b/trunk/drivers/input/touchscreen/cy8ctmg110_ts.c index 96e0eedcc7e5..464f1bf4b61d 100644 --- a/trunk/drivers/input/touchscreen/cy8ctmg110_ts.c +++ b/trunk/drivers/input/touchscreen/cy8ctmg110_ts.c @@ -99,18 +99,9 @@ static int cy8ctmg110_read_regs(struct cy8ctmg110 *tsc, int ret; struct i2c_msg msg[2] = { /* first write slave position to i2c devices */ - { - .addr = client->addr, - .len = 1, - .buf = &cmd - }, + { client->addr, 0, 1, &cmd }, /* Second read data from position */ - { - .addr = client->addr, - .flags = I2C_M_RD, - .len = len, - .buf = data - } + { client->addr, I2C_M_RD, len, data } }; ret = i2c_transfer(client->adapter, msg, 2); @@ -175,7 +166,7 @@ static irqreturn_t cy8ctmg110_irq_thread(int irq, void *dev_id) return IRQ_HANDLED; } -static int cy8ctmg110_probe(struct i2c_client *client, +static int __devinit cy8ctmg110_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct cy8ctmg110_pdata *pdata = client->dev.platform_data; @@ -323,7 +314,7 @@ static int cy8ctmg110_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(cy8ctmg110_pm, cy8ctmg110_suspend, cy8ctmg110_resume); #endif -static int cy8ctmg110_remove(struct i2c_client *client) +static int __devexit cy8ctmg110_remove(struct i2c_client *client) { struct cy8ctmg110 *ts = i2c_get_clientdata(client); @@ -357,7 +348,7 @@ static struct i2c_driver cy8ctmg110_driver = { }, .id_table = cy8ctmg110_idtable, .probe = cy8ctmg110_probe, - .remove = cy8ctmg110_remove, + .remove = __devexit_p(cy8ctmg110_remove), }; module_i2c_driver(cy8ctmg110_driver); diff --git a/trunk/drivers/input/touchscreen/cyttsp_i2c.c b/trunk/drivers/input/touchscreen/cyttsp_i2c.c index 4dbdf44b8fc5..2af1d0c52bcd 100644 --- a/trunk/drivers/input/touchscreen/cyttsp_i2c.c +++ b/trunk/drivers/input/touchscreen/cyttsp_i2c.c @@ -81,7 +81,7 @@ static const struct cyttsp_bus_ops cyttsp_i2c_bus_ops = { .read = cyttsp_i2c_read_block_data, }; -static int cyttsp_i2c_probe(struct i2c_client *client, +static int __devinit cyttsp_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct cyttsp *ts; @@ -102,7 +102,7 @@ static int cyttsp_i2c_probe(struct i2c_client *client, return 0; } -static int cyttsp_i2c_remove(struct i2c_client *client) +static int __devexit cyttsp_i2c_remove(struct i2c_client *client) { struct cyttsp *ts = i2c_get_clientdata(client); @@ -124,7 +124,7 @@ static struct i2c_driver cyttsp_i2c_driver = { .pm = &cyttsp_pm_ops, }, .probe = cyttsp_i2c_probe, - .remove = cyttsp_i2c_remove, + .remove = __devexit_p(cyttsp_i2c_remove), .id_table = cyttsp_i2c_id, }; diff --git a/trunk/drivers/input/touchscreen/cyttsp_spi.c b/trunk/drivers/input/touchscreen/cyttsp_spi.c index 638e20310f12..9f263410407b 100644 --- a/trunk/drivers/input/touchscreen/cyttsp_spi.c +++ b/trunk/drivers/input/touchscreen/cyttsp_spi.c @@ -147,7 +147,7 @@ static const struct cyttsp_bus_ops cyttsp_spi_bus_ops = { .read = cyttsp_spi_read_block_data, }; -static int cyttsp_spi_probe(struct spi_device *spi) +static int __devinit cyttsp_spi_probe(struct spi_device *spi) { struct cyttsp *ts; int error; @@ -172,7 +172,7 @@ static int cyttsp_spi_probe(struct spi_device *spi) return 0; } -static int cyttsp_spi_remove(struct spi_device *spi) +static int __devexit cyttsp_spi_remove(struct spi_device *spi) { struct cyttsp *ts = spi_get_drvdata(spi); @@ -188,7 +188,7 @@ static struct spi_driver cyttsp_spi_driver = { .pm = &cyttsp_pm_ops, }, .probe = cyttsp_spi_probe, - .remove = cyttsp_spi_remove, + .remove = __devexit_p(cyttsp_spi_remove), }; module_spi_driver(cyttsp_spi_driver); diff --git a/trunk/drivers/input/touchscreen/da9034-ts.c b/trunk/drivers/input/touchscreen/da9034-ts.c index 34ad84105e6e..36b65cf10d7f 100644 --- a/trunk/drivers/input/touchscreen/da9034-ts.c +++ b/trunk/drivers/input/touchscreen/da9034-ts.c @@ -297,7 +297,7 @@ static void da9034_touch_close(struct input_dev *dev) } -static int da9034_touch_probe(struct platform_device *pdev) +static int __devinit da9034_touch_probe(struct platform_device *pdev) { struct da9034_touch_pdata *pdata = pdev->dev.platform_data; struct da9034_touch *touch; @@ -361,7 +361,7 @@ static int da9034_touch_probe(struct platform_device *pdev) return ret; } -static int da9034_touch_remove(struct platform_device *pdev) +static int __devexit da9034_touch_remove(struct platform_device *pdev) { struct da9034_touch *touch = platform_get_drvdata(pdev); @@ -377,7 +377,7 @@ static struct platform_driver da9034_touch_driver = { .owner = THIS_MODULE, }, .probe = da9034_touch_probe, - .remove = da9034_touch_remove, + .remove = __devexit_p(da9034_touch_remove), }; module_platform_driver(da9034_touch_driver); diff --git a/trunk/drivers/input/touchscreen/da9052_tsi.c b/trunk/drivers/input/touchscreen/da9052_tsi.c index 8f561e22bdd4..53133efe0418 100644 --- a/trunk/drivers/input/touchscreen/da9052_tsi.c +++ b/trunk/drivers/input/touchscreen/da9052_tsi.c @@ -141,7 +141,7 @@ static void da9052_ts_pen_work(struct work_struct *work) } } -static int da9052_ts_configure_gpio(struct da9052 *da9052) +static int __devinit da9052_ts_configure_gpio(struct da9052 *da9052) { int error; @@ -160,7 +160,7 @@ static int da9052_ts_configure_gpio(struct da9052 *da9052) return 0; } -static int da9052_configure_tsi(struct da9052_tsi *tsi) +static int __devinit da9052_configure_tsi(struct da9052_tsi *tsi) { int error; @@ -227,7 +227,7 @@ static void da9052_ts_input_close(struct input_dev *input_dev) da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 1, 0); } -static int da9052_ts_probe(struct platform_device *pdev) +static int __devinit da9052_ts_probe(struct platform_device *pdev) { struct da9052 *da9052; struct da9052_tsi *tsi; @@ -317,7 +317,7 @@ static int da9052_ts_probe(struct platform_device *pdev) return error; } -static int da9052_ts_remove(struct platform_device *pdev) +static int __devexit da9052_ts_remove(struct platform_device *pdev) { struct da9052_tsi *tsi = platform_get_drvdata(pdev); @@ -336,7 +336,7 @@ static int da9052_ts_remove(struct platform_device *pdev) static struct platform_driver da9052_tsi_driver = { .probe = da9052_ts_probe, - .remove = da9052_ts_remove, + .remove = __devexit_p(da9052_ts_remove), .driver = { .name = "da9052-tsi", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/edt-ft5x06.c b/trunk/drivers/input/touchscreen/edt-ft5x06.c index a9170157b442..099d144ab7c9 100644 --- a/trunk/drivers/input/touchscreen/edt-ft5x06.c +++ b/trunk/drivers/input/touchscreen/edt-ft5x06.c @@ -491,6 +491,14 @@ static int edt_ft5x06_debugfs_mode_set(void *data, u64 mode) DEFINE_SIMPLE_ATTRIBUTE(debugfs_mode_fops, edt_ft5x06_debugfs_mode_get, edt_ft5x06_debugfs_mode_set, "%llu\n"); +static int edt_ft5x06_debugfs_raw_data_open(struct inode *inode, + struct file *file) +{ + file->private_data = inode->i_private; + + return 0; +} + static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file, char __user *buf, size_t count, loff_t *off) { @@ -571,11 +579,11 @@ static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file, static const struct file_operations debugfs_raw_data_fops = { - .open = simple_open, + .open = edt_ft5x06_debugfs_raw_data_open, .read = edt_ft5x06_debugfs_raw_data_read, }; -static void +static void __devinit edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, const char *debugfs_name) { @@ -592,7 +600,7 @@ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); } -static void +static void __devexit edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) { if (tsdata->debug_dir) @@ -617,7 +625,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) -static int edt_ft5x06_ts_reset(struct i2c_client *client, +static int __devinit edt_ft5x06_ts_reset(struct i2c_client *client, int reset_pin) { int error; @@ -641,7 +649,7 @@ static int edt_ft5x06_ts_reset(struct i2c_client *client, return 0; } -static int edt_ft5x06_ts_identify(struct i2c_client *client, +static int __devinit edt_ft5x06_ts_identify(struct i2c_client *client, char *model_name, char *fw_version) { @@ -675,7 +683,7 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client, pdata->name <= edt_ft5x06_attr_##name.limit_high) \ edt_ft5x06_register_write(tsdata, reg, pdata->name) -static void +static void __devinit edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata, const struct edt_ft5x06_platform_data *pdata) { @@ -689,7 +697,7 @@ edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata, EDT_ATTR_CHECKSET(report_rate, WORK_REGISTER_REPORT_RATE); } -static void +static void __devinit edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) { tsdata->threshold = edt_ft5x06_register_read(tsdata, @@ -702,7 +710,7 @@ edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) tsdata->num_y = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_Y); } -static int edt_ft5x06_ts_probe(struct i2c_client *client, +static int __devinit edt_ft5x06_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct edt_ft5x06_platform_data *pdata = @@ -822,7 +830,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, return error; } -static int edt_ft5x06_ts_remove(struct i2c_client *client) +static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client) { const struct edt_ft5x06_platform_data *pdata = dev_get_platdata(&client->dev); @@ -883,7 +891,7 @@ static struct i2c_driver edt_ft5x06_ts_driver = { }, .id_table = edt_ft5x06_ts_id, .probe = edt_ft5x06_ts_probe, - .remove = edt_ft5x06_ts_remove, + .remove = __devexit_p(edt_ft5x06_ts_remove), }; module_i2c_driver(edt_ft5x06_ts_driver); diff --git a/trunk/drivers/input/touchscreen/eeti_ts.c b/trunk/drivers/input/touchscreen/eeti_ts.c index 55255a940072..908407efc672 100644 --- a/trunk/drivers/input/touchscreen/eeti_ts.c +++ b/trunk/drivers/input/touchscreen/eeti_ts.c @@ -154,7 +154,7 @@ static void eeti_ts_close(struct input_dev *dev) eeti_ts_stop(priv); } -static int eeti_ts_probe(struct i2c_client *client, +static int __devinit eeti_ts_probe(struct i2c_client *client, const struct i2c_device_id *idp) { struct eeti_ts_platform_data *pdata = client->dev.platform_data; @@ -248,7 +248,7 @@ static int eeti_ts_probe(struct i2c_client *client, return err; } -static int eeti_ts_remove(struct i2c_client *client) +static int __devexit eeti_ts_remove(struct i2c_client *client) { struct eeti_ts_priv *priv = i2c_get_clientdata(client); @@ -321,7 +321,7 @@ static struct i2c_driver eeti_ts_driver = { #endif }, .probe = eeti_ts_probe, - .remove = eeti_ts_remove, + .remove = __devexit_p(eeti_ts_remove), .id_table = eeti_ts_id, }; diff --git a/trunk/drivers/input/touchscreen/egalax_ts.c b/trunk/drivers/input/touchscreen/egalax_ts.c index 17c9097f3b5d..13fa62fdfb0b 100644 --- a/trunk/drivers/input/touchscreen/egalax_ts.c +++ b/trunk/drivers/input/touchscreen/egalax_ts.c @@ -153,7 +153,7 @@ static int egalax_wake_up_device(struct i2c_client *client) return 0; } -static int egalax_firmware_version(struct i2c_client *client) +static int __devinit egalax_firmware_version(struct i2c_client *client) { static const u8 cmd[MAX_I2C_DATA_LEN] = { 0x03, 0x03, 0xa, 0x01, 0x41 }; int ret; @@ -165,7 +165,7 @@ static int egalax_firmware_version(struct i2c_client *client) return 0; } -static int egalax_ts_probe(struct i2c_client *client, +static int __devinit egalax_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct egalax_ts *ts; @@ -246,7 +246,7 @@ static int egalax_ts_probe(struct i2c_client *client, return error; } -static int egalax_ts_remove(struct i2c_client *client) +static __devexit int egalax_ts_remove(struct i2c_client *client) { struct egalax_ts *ts = i2c_get_clientdata(client); @@ -301,7 +301,7 @@ static struct i2c_driver egalax_ts_driver = { }, .id_table = egalax_ts_id, .probe = egalax_ts_probe, - .remove = egalax_ts_remove, + .remove = __devexit_p(egalax_ts_remove), }; module_i2c_driver(egalax_ts_driver); diff --git a/trunk/drivers/input/touchscreen/h3600_ts_input.c b/trunk/drivers/input/touchscreen/h3600_ts_input.c new file mode 100644 index 000000000000..b9e8686a6f1c --- /dev/null +++ b/trunk/drivers/input/touchscreen/h3600_ts_input.c @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com + * + * Sponsored by Transvirtual Technology. + * + * Derived from the code in h3600_ts.[ch] by Charles Flynn + */ + +/* + * Driver for the h3600 Touch Screen and other Atmel controlled devices. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so by + * e-mail - mail your message to . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* SA1100 serial defines */ +#include +#include + +#define DRIVER_DESC "H3600 touchscreen driver" + +MODULE_AUTHOR("James Simmons "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +/* The start and end of frame characters SOF and EOF */ +#define CHAR_SOF 0x02 +#define CHAR_EOF 0x03 +#define FRAME_OVERHEAD 3 /* CHAR_SOF,CHAR_EOF,LENGTH = 3 */ + +/* + Atmel events and response IDs contained in frame. + Programmer has no control over these numbers. + TODO there are holes - specifically 1,7,0x0a +*/ +#define VERSION_ID 0 /* Get Version (request/response) */ +#define KEYBD_ID 2 /* Keyboard (event) */ +#define TOUCHS_ID 3 /* Touch Screen (event)*/ +#define EEPROM_READ_ID 4 /* (request/response) */ +#define EEPROM_WRITE_ID 5 /* (request/response) */ +#define THERMAL_ID 6 /* (request/response) */ +#define NOTIFY_LED_ID 8 /* (request/response) */ +#define BATTERY_ID 9 /* (request/response) */ +#define SPI_READ_ID 0x0b /* ( request/response) */ +#define SPI_WRITE_ID 0x0c /* ( request/response) */ +#define FLITE_ID 0x0d /* backlight ( request/response) */ +#define STX_ID 0xa1 /* extension pack status (req/resp) */ + +#define MAX_ID 14 + +#define H3600_MAX_LENGTH 16 +#define H3600_KEY 0xf + +#define H3600_SCANCODE_RECORD 1 /* 1 -> record button */ +#define H3600_SCANCODE_CALENDAR 2 /* 2 -> calendar */ +#define H3600_SCANCODE_CONTACTS 3 /* 3 -> contact */ +#define H3600_SCANCODE_Q 4 /* 4 -> Q button */ +#define H3600_SCANCODE_START 5 /* 5 -> start menu */ +#define H3600_SCANCODE_UP 6 /* 6 -> up */ +#define H3600_SCANCODE_RIGHT 7 /* 7 -> right */ +#define H3600_SCANCODE_LEFT 8 /* 8 -> left */ +#define H3600_SCANCODE_DOWN 9 /* 9 -> down */ + +/* + * Per-touchscreen data. + */ +struct h3600_dev { + struct input_dev *dev; + struct serio *serio; + unsigned char event; /* event ID from packet */ + unsigned char chksum; + unsigned char len; + unsigned char idx; + unsigned char buf[H3600_MAX_LENGTH]; + char phys[32]; +}; + +static irqreturn_t action_button_handler(int irq, void *dev_id) +{ + int down = (GPLR & GPIO_BITSY_ACTION_BUTTON) ? 0 : 1; + struct input_dev *dev = dev_id; + + input_report_key(dev, KEY_ENTER, down); + input_sync(dev); + + return IRQ_HANDLED; +} + +static irqreturn_t npower_button_handler(int irq, void *dev_id) +{ + int down = (GPLR & GPIO_BITSY_NPOWER_BUTTON) ? 0 : 1; + struct input_dev *dev = dev_id; + + /* + * This interrupt is only called when we release the key. So we have + * to fake a key press. + */ + input_report_key(dev, KEY_SUSPEND, 1); + input_report_key(dev, KEY_SUSPEND, down); + input_sync(dev); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM + +static int flite_brightness = 25; + +enum flite_pwr { + FLITE_PWR_OFF = 0, + FLITE_PWR_ON = 1 +}; + +/* + * h3600_flite_power: enables or disables power to frontlight, using last bright */ +unsigned int h3600_flite_power(struct input_dev *dev, enum flite_pwr pwr) +{ + unsigned char brightness = (pwr == FLITE_PWR_OFF) ? 0 : flite_brightness; + struct h3600_dev *ts = input_get_drvdata(dev); + + /* Must be in this order */ + serio_write(ts->serio, 1); + serio_write(ts->serio, pwr); + serio_write(ts->serio, brightness); + + return 0; +} + +#endif + +/* + * This function translates the native event packets to linux input event + * packets. Some packets coming from serial are not touchscreen related. In + * this case we send them off to be processed elsewhere. + */ +static void h3600ts_process_packet(struct h3600_dev *ts) +{ + struct input_dev *dev = ts->dev; + static int touched = 0; + int key, down = 0; + + switch (ts->event) { + /* + Buttons - returned as a single byte + 7 6 5 4 3 2 1 0 + S x x x N N N N + + S switch state ( 0=pressed 1=released) + x Unused. + NNNN switch number 0-15 + + Note: This is true for non interrupt generated key events. + */ + case KEYBD_ID: + down = (ts->buf[0] & 0x80) ? 0 : 1; + + switch (ts->buf[0] & 0x7f) { + case H3600_SCANCODE_RECORD: + key = KEY_RECORD; + break; + case H3600_SCANCODE_CALENDAR: + key = KEY_PROG1; + break; + case H3600_SCANCODE_CONTACTS: + key = KEY_PROG2; + break; + case H3600_SCANCODE_Q: + key = KEY_Q; + break; + case H3600_SCANCODE_START: + key = KEY_PROG3; + break; + case H3600_SCANCODE_UP: + key = KEY_UP; + break; + case H3600_SCANCODE_RIGHT: + key = KEY_RIGHT; + break; + case H3600_SCANCODE_LEFT: + key = KEY_LEFT; + break; + case H3600_SCANCODE_DOWN: + key = KEY_DOWN; + break; + default: + key = 0; + } + if (key) + input_report_key(dev, key, down); + break; + /* + * Native touchscreen event data is formatted as shown below:- + * + * +-------+-------+-------+-------+ + * | Xmsb | Xlsb | Ymsb | Ylsb | + * +-------+-------+-------+-------+ + * byte 0 1 2 3 + */ + case TOUCHS_ID: + if (!touched) { + input_report_key(dev, BTN_TOUCH, 1); + touched = 1; + } + + if (ts->len) { + unsigned short x, y; + + x = ts->buf[0]; x <<= 8; x += ts->buf[1]; + y = ts->buf[2]; y <<= 8; y += ts->buf[3]; + + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + } else { + input_report_key(dev, BTN_TOUCH, 0); + touched = 0; + } + break; + default: + /* Send a non input event elsewhere */ + break; + } + + input_sync(dev); +} + +/* + * h3600ts_event() handles events from the input module. + */ +static int h3600ts_event(struct input_dev *dev, unsigned int type, + unsigned int code, int value) +{ +#if 0 + struct h3600_dev *ts = input_get_drvdata(dev); + + switch (type) { + case EV_LED: { + // serio_write(ts->serio, SOME_CMD); + return 0; + } + } + return -1; +#endif + return 0; +} + +/* + Frame format + byte 1 2 3 len + 4 + +-------+---------------+---------------+--=------------+ + |SOF |id |len | len bytes | Chksum | + +-------+---------------+---------------+--=------------+ + bit 0 7 8 11 12 15 16 + + +-------+---------------+-------+ + |SOF |id |0 |Chksum | - Note Chksum does not include SOF + +-------+---------------+-------+ + bit 0 7 8 11 12 15 16 + +*/ + +static int state; + +/* decode States */ +#define STATE_SOF 0 /* start of FRAME */ +#define STATE_ID 1 /* state where we decode the ID & len */ +#define STATE_DATA 2 /* state where we decode data */ +#define STATE_EOF 3 /* state where we decode checksum or EOF */ + +static irqreturn_t h3600ts_interrupt(struct serio *serio, unsigned char data, + unsigned int flags) +{ + struct h3600_dev *ts = serio_get_drvdata(serio); + + /* + * We have a new frame coming in. + */ + switch (state) { + case STATE_SOF: + if (data == CHAR_SOF) + state = STATE_ID; + break; + case STATE_ID: + ts->event = (data & 0xf0) >> 4; + ts->len = (data & 0xf); + ts->idx = 0; + if (ts->event >= MAX_ID) { + state = STATE_SOF; + break; + } + ts->chksum = data; + state = (ts->len > 0) ? STATE_DATA : STATE_EOF; + break; + case STATE_DATA: + ts->chksum += data; + ts->buf[ts->idx]= data; + if (++ts->idx == ts->len) + state = STATE_EOF; + break; + case STATE_EOF: + state = STATE_SOF; + if (data == CHAR_EOF || data == ts->chksum) + h3600ts_process_packet(ts); + break; + default: + printk("Error3\n"); + break; + } + + return IRQ_HANDLED; +} + +/* + * h3600ts_connect() is the routine that is called when someone adds a + * new serio device that supports H3600 protocol and registers it as + * an input device. + */ +static int h3600ts_connect(struct serio *serio, struct serio_driver *drv) +{ + struct h3600_dev *ts; + struct input_dev *input_dev; + int err; + + ts = kzalloc(sizeof(struct h3600_dev), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + ts->serio = serio; + ts->dev = input_dev; + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", serio->phys); + + input_dev->name = "H3600 TouchScreen"; + input_dev->phys = ts->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_H3600; + input_dev->id.product = 0x0666; /* FIXME !!! We can ask the hardware */ + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_set_drvdata(input_dev, ts); + + input_dev->event = h3600ts_event; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | + BIT_MASK(EV_LED) | BIT_MASK(EV_PWR); + input_dev->ledbit[0] = BIT_MASK(LED_SLEEP); + input_set_abs_params(input_dev, ABS_X, 60, 985, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 35, 1024, 0, 0); + + set_bit(KEY_RECORD, input_dev->keybit); + set_bit(KEY_Q, input_dev->keybit); + set_bit(KEY_PROG1, input_dev->keybit); + set_bit(KEY_PROG2, input_dev->keybit); + set_bit(KEY_PROG3, input_dev->keybit); + set_bit(KEY_UP, input_dev->keybit); + set_bit(KEY_RIGHT, input_dev->keybit); + set_bit(KEY_LEFT, input_dev->keybit); + set_bit(KEY_DOWN, input_dev->keybit); + set_bit(KEY_ENTER, input_dev->keybit); + set_bit(KEY_SUSPEND, input_dev->keybit); + set_bit(BTN_TOUCH, input_dev->keybit); + + /* Device specific stuff */ + set_GPIO_IRQ_edge(GPIO_BITSY_ACTION_BUTTON, GPIO_BOTH_EDGES); + set_GPIO_IRQ_edge(GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE); + + if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler, + IRQF_SHARED, "h3600_action", ts->dev)) { + printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n"); + err = -EBUSY; + goto fail1; + } + + if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler, + IRQF_SHARED, "h3600_suspend", ts->dev)) { + printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n"); + err = -EBUSY; + goto fail2; + } + + serio_set_drvdata(serio, ts); + + err = serio_open(serio, drv); + if (err) + goto fail3; + + //h3600_flite_control(1, 25); /* default brightness */ + err = input_register_device(ts->dev); + if (err) + goto fail4; + + return 0; + +fail4: serio_close(serio); +fail3: serio_set_drvdata(serio, NULL); + free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev); +fail2: free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev); +fail1: input_free_device(input_dev); + kfree(ts); + return err; +} + +/* + * h3600ts_disconnect() is the opposite of h3600ts_connect() + */ + +static void h3600ts_disconnect(struct serio *serio) +{ + struct h3600_dev *ts = serio_get_drvdata(serio); + + free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev); + free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev); + input_get_device(ts->dev); + input_unregister_device(ts->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(ts->dev); + kfree(ts); +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id h3600ts_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_H3600, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, h3600ts_serio_ids); + +static struct serio_driver h3600ts_drv = { + .driver = { + .name = "h3600ts", + }, + .description = DRIVER_DESC, + .id_table = h3600ts_serio_ids, + .interrupt = h3600ts_interrupt, + .connect = h3600ts_connect, + .disconnect = h3600ts_disconnect, +}; + +module_serio_driver(h3600ts_drv); diff --git a/trunk/drivers/input/touchscreen/htcpen.c b/trunk/drivers/input/touchscreen/htcpen.c index 6c4fb8436957..d13143b68b3e 100644 --- a/trunk/drivers/input/touchscreen/htcpen.c +++ b/trunk/drivers/input/touchscreen/htcpen.c @@ -102,7 +102,7 @@ static void htcpen_close(struct input_dev *dev) synchronize_irq(HTCPEN_IRQ); } -static int htcpen_isa_probe(struct device *dev, unsigned int id) +static int __devinit htcpen_isa_probe(struct device *dev, unsigned int id) { struct input_dev *htcpen_dev; int err = -EBUSY; @@ -174,7 +174,7 @@ static int htcpen_isa_probe(struct device *dev, unsigned int id) return err; } -static int htcpen_isa_remove(struct device *dev, unsigned int id) +static int __devexit htcpen_isa_remove(struct device *dev, unsigned int id) { struct input_dev *htcpen_dev = dev_get_drvdata(dev); @@ -210,7 +210,7 @@ static int htcpen_isa_resume(struct device *dev, unsigned int n) static struct isa_driver htcpen_isa_driver = { .probe = htcpen_isa_probe, - .remove = htcpen_isa_remove, + .remove = __devexit_p(htcpen_isa_remove), #ifdef CONFIG_PM .suspend = htcpen_isa_suspend, .resume = htcpen_isa_resume, diff --git a/trunk/drivers/input/touchscreen/ili210x.c b/trunk/drivers/input/touchscreen/ili210x.c index 1418bdda61bb..4ac69760ec08 100644 --- a/trunk/drivers/input/touchscreen/ili210x.c +++ b/trunk/drivers/input/touchscreen/ili210x.c @@ -180,7 +180,7 @@ static const struct attribute_group ili210x_attr_group = { .attrs = ili210x_attributes, }; -static int ili210x_i2c_probe(struct i2c_client *client, +static int __devinit ili210x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; @@ -298,7 +298,7 @@ static int ili210x_i2c_probe(struct i2c_client *client, return error; } -static int ili210x_i2c_remove(struct i2c_client *client) +static int __devexit ili210x_i2c_remove(struct i2c_client *client) { struct ili210x *priv = i2c_get_clientdata(client); @@ -350,7 +350,7 @@ static struct i2c_driver ili210x_ts_driver = { }, .id_table = ili210x_i2c_id, .probe = ili210x_i2c_probe, - .remove = ili210x_i2c_remove, + .remove = __devexit_p(ili210x_i2c_remove), }; module_i2c_driver(ili210x_ts_driver); diff --git a/trunk/drivers/input/touchscreen/intel-mid-touch.c b/trunk/drivers/input/touchscreen/intel-mid-touch.c index 465db5dba8b4..cf299377fc49 100644 --- a/trunk/drivers/input/touchscreen/intel-mid-touch.c +++ b/trunk/drivers/input/touchscreen/intel-mid-touch.c @@ -427,7 +427,7 @@ static irqreturn_t mrstouch_pendet_irq(int irq, void *dev_id) } /* Utility to read PMIC ID */ -static int mrstouch_read_pmic_id(uint *vendor, uint *rev) +static int __devinit mrstouch_read_pmic_id(uint *vendor, uint *rev) { int err; u8 r; @@ -446,7 +446,7 @@ static int mrstouch_read_pmic_id(uint *vendor, uint *rev) * Parse ADC channels to find end of the channel configured by other ADC user * NEC and MAXIM requires 4 channels and FreeScale needs 18 channels */ -static int mrstouch_chan_parse(struct mrstouch_dev *tsdev) +static int __devinit mrstouch_chan_parse(struct mrstouch_dev *tsdev) { int found = 0; int err, i; @@ -478,7 +478,7 @@ static int mrstouch_chan_parse(struct mrstouch_dev *tsdev) /* * Writes touch screen channels to ADC address selection registers */ -static int mrstouch_ts_chan_set(uint offset) +static int __devinit mrstouch_ts_chan_set(uint offset) { u16 chan; @@ -494,7 +494,7 @@ static int mrstouch_ts_chan_set(uint offset) } /* Initialize ADC */ -static int mrstouch_adc_init(struct mrstouch_dev *tsdev) +static int __devinit mrstouch_adc_init(struct mrstouch_dev *tsdev) { int err, start; u8 ra, rm; @@ -568,7 +568,7 @@ static int mrstouch_adc_init(struct mrstouch_dev *tsdev) /* Probe function for touch screen driver */ -static int mrstouch_probe(struct platform_device *pdev) +static int __devinit mrstouch_probe(struct platform_device *pdev) { struct mrstouch_dev *tsdev; struct input_dev *input; @@ -643,7 +643,7 @@ static int mrstouch_probe(struct platform_device *pdev) return err; } -static int mrstouch_remove(struct platform_device *pdev) +static int __devexit mrstouch_remove(struct platform_device *pdev) { struct mrstouch_dev *tsdev = platform_get_drvdata(pdev); @@ -662,7 +662,7 @@ static struct platform_driver mrstouch_driver = { .owner = THIS_MODULE, }, .probe = mrstouch_probe, - .remove = mrstouch_remove, + .remove = __devexit_p(mrstouch_remove), }; module_platform_driver(mrstouch_driver); diff --git a/trunk/drivers/input/touchscreen/jornada720_ts.c b/trunk/drivers/input/touchscreen/jornada720_ts.c index 282d7c7ad2fc..7f03d1bd916e 100644 --- a/trunk/drivers/input/touchscreen/jornada720_ts.c +++ b/trunk/drivers/input/touchscreen/jornada720_ts.c @@ -99,7 +99,7 @@ static irqreturn_t jornada720_ts_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static int jornada720_ts_probe(struct platform_device *pdev) +static int __devinit jornada720_ts_probe(struct platform_device *pdev) { struct jornada_ts *jornada_ts; struct input_dev *input_dev; @@ -151,7 +151,7 @@ static int jornada720_ts_probe(struct platform_device *pdev) return error; } -static int jornada720_ts_remove(struct platform_device *pdev) +static int __devexit jornada720_ts_remove(struct platform_device *pdev) { struct jornada_ts *jornada_ts = platform_get_drvdata(pdev); @@ -168,7 +168,7 @@ MODULE_ALIAS("platform:jornada_ts"); static struct platform_driver jornada720_ts_driver = { .probe = jornada720_ts_probe, - .remove = jornada720_ts_remove, + .remove = __devexit_p(jornada720_ts_remove), .driver = { .name = "jornada_ts", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/lpc32xx_ts.c b/trunk/drivers/input/touchscreen/lpc32xx_ts.c index 9101ee529c92..4c2b8ed3bf16 100644 --- a/trunk/drivers/input/touchscreen/lpc32xx_ts.c +++ b/trunk/drivers/input/touchscreen/lpc32xx_ts.c @@ -203,7 +203,7 @@ static void lpc32xx_ts_close(struct input_dev *dev) lpc32xx_stop_tsc(tsc); } -static int lpc32xx_ts_probe(struct platform_device *pdev) +static int __devinit lpc32xx_ts_probe(struct platform_device *pdev) { struct lpc32xx_tsc *tsc; struct input_dev *input; @@ -309,7 +309,7 @@ static int lpc32xx_ts_probe(struct platform_device *pdev) return error; } -static int lpc32xx_ts_remove(struct platform_device *pdev) +static int __devexit lpc32xx_ts_remove(struct platform_device *pdev) { struct lpc32xx_tsc *tsc = platform_get_drvdata(pdev); struct resource *res; @@ -394,7 +394,7 @@ MODULE_DEVICE_TABLE(of, lpc32xx_tsc_of_match); static struct platform_driver lpc32xx_ts_driver = { .probe = lpc32xx_ts_probe, - .remove = lpc32xx_ts_remove, + .remove = __devexit_p(lpc32xx_ts_remove), .driver = { .name = MOD_NAME, .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/max11801_ts.c b/trunk/drivers/input/touchscreen/max11801_ts.c index 00bc6caa27f5..4eab50b856d7 100644 --- a/trunk/drivers/input/touchscreen/max11801_ts.c +++ b/trunk/drivers/input/touchscreen/max11801_ts.c @@ -156,7 +156,7 @@ static irqreturn_t max11801_ts_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static void max11801_ts_phy_init(struct max11801_data *data) +static void __devinit max11801_ts_phy_init(struct max11801_data *data) { struct i2c_client *client = data->client; @@ -174,7 +174,7 @@ static void max11801_ts_phy_init(struct max11801_data *data) max11801_write_reg(client, OP_MODE_CONF_REG, 0x36); } -static int max11801_ts_probe(struct i2c_client *client, +static int __devinit max11801_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max11801_data *data; @@ -228,7 +228,7 @@ static int max11801_ts_probe(struct i2c_client *client, return error; } -static int max11801_ts_remove(struct i2c_client *client) +static __devexit int max11801_ts_remove(struct i2c_client *client) { struct max11801_data *data = i2c_get_clientdata(client); @@ -252,7 +252,7 @@ static struct i2c_driver max11801_ts_driver = { }, .id_table = max11801_ts_id, .probe = max11801_ts_probe, - .remove = max11801_ts_remove, + .remove = __devexit_p(max11801_ts_remove), }; module_i2c_driver(max11801_ts_driver); diff --git a/trunk/drivers/input/touchscreen/mc13783_ts.c b/trunk/drivers/input/touchscreen/mc13783_ts.c index 02103b6abb39..48dc5b0d26f1 100644 --- a/trunk/drivers/input/touchscreen/mc13783_ts.c +++ b/trunk/drivers/input/touchscreen/mc13783_ts.c @@ -229,7 +229,7 @@ static int __init mc13783_ts_probe(struct platform_device *pdev) return ret; } -static int mc13783_ts_remove(struct platform_device *pdev) +static int __devexit mc13783_ts_remove(struct platform_device *pdev) { struct mc13783_ts_priv *priv = platform_get_drvdata(pdev); @@ -243,7 +243,7 @@ static int mc13783_ts_remove(struct platform_device *pdev) } static struct platform_driver mc13783_ts_driver = { - .remove = mc13783_ts_remove, + .remove = __devexit_p(mc13783_ts_remove), .driver = { .owner = THIS_MODULE, .name = MC13783_TS_NAME, diff --git a/trunk/drivers/input/touchscreen/mcs5000_ts.c b/trunk/drivers/input/touchscreen/mcs5000_ts.c index f9f4e0c56eda..b528511861ce 100644 --- a/trunk/drivers/input/touchscreen/mcs5000_ts.c +++ b/trunk/drivers/input/touchscreen/mcs5000_ts.c @@ -187,7 +187,7 @@ static void mcs5000_ts_phys_init(struct mcs5000_ts_data *data) OP_MODE_ACTIVE | REPORT_RATE_80); } -static int mcs5000_ts_probe(struct i2c_client *client, +static int __devinit mcs5000_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mcs5000_ts_data *data; @@ -249,7 +249,7 @@ static int mcs5000_ts_probe(struct i2c_client *client, return ret; } -static int mcs5000_ts_remove(struct i2c_client *client) +static int __devexit mcs5000_ts_remove(struct i2c_client *client) { struct mcs5000_ts_data *data = i2c_get_clientdata(client); @@ -292,7 +292,7 @@ MODULE_DEVICE_TABLE(i2c, mcs5000_ts_id); static struct i2c_driver mcs5000_ts_driver = { .probe = mcs5000_ts_probe, - .remove = mcs5000_ts_remove, + .remove = __devexit_p(mcs5000_ts_remove), .driver = { .name = "mcs5000_ts", #ifdef CONFIG_PM diff --git a/trunk/drivers/input/touchscreen/mms114.c b/trunk/drivers/input/touchscreen/mms114.c index 98841d8aa635..560cf09d1c5a 100644 --- a/trunk/drivers/input/touchscreen/mms114.c +++ b/trunk/drivers/input/touchscreen/mms114.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -361,63 +360,14 @@ static void mms114_input_close(struct input_dev *dev) mms114_stop(data); } -#ifdef CONFIG_OF -static struct mms114_platform_data *mms114_parse_dt(struct device *dev) -{ - struct mms114_platform_data *pdata; - struct device_node *np = dev->of_node; - - if (!np) - return NULL; - - pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) { - dev_err(dev, "failed to allocate platform data\n"); - return NULL; - } - - if (of_property_read_u32(np, "x-size", &pdata->x_size)) { - dev_err(dev, "failed to get x-size property\n"); - return NULL; - }; - - if (of_property_read_u32(np, "y-size", &pdata->y_size)) { - dev_err(dev, "failed to get y-size property\n"); - return NULL; - }; - - of_property_read_u32(np, "contact-threshold", - &pdata->contact_threshold); - of_property_read_u32(np, "moving-threshold", - &pdata->moving_threshold); - - if (of_find_property(np, "x-invert", NULL)) - pdata->x_invert = true; - if (of_find_property(np, "y-invert", NULL)) - pdata->y_invert = true; - - return pdata; -} -#else -static inline struct mms114_platform_data *mms114_parse_dt(struct device *dev) -{ - return NULL; -} -#endif - -static int mms114_probe(struct i2c_client *client, +static int __devinit mms114_probe(struct i2c_client *client, const struct i2c_device_id *id) { - const struct mms114_platform_data *pdata; struct mms114_data *data; struct input_dev *input_dev; int error; - pdata = dev_get_platdata(&client->dev); - if (!pdata) - pdata = mms114_parse_dt(&client->dev); - - if (!pdata) { + if (!client->dev.platform_data) { dev_err(&client->dev, "Need platform data\n"); return -EINVAL; } @@ -439,7 +389,7 @@ static int mms114_probe(struct i2c_client *client, data->client = client; data->input_dev = input_dev; - data->pdata = pdata; + data->pdata = client->dev.platform_data; input_dev->name = "MELPAS MMS114 Touchscreen"; input_dev->id.bustype = BUS_I2C; @@ -508,7 +458,7 @@ static int mms114_probe(struct i2c_client *client, return error; } -static int mms114_remove(struct i2c_client *client) +static int __devexit mms114_remove(struct i2c_client *client) { struct mms114_data *data = i2c_get_clientdata(client); @@ -575,22 +525,14 @@ static const struct i2c_device_id mms114_id[] = { }; MODULE_DEVICE_TABLE(i2c, mms114_id); -#ifdef CONFIG_OF -static struct of_device_id mms114_dt_match[] = { - { .compatible = "melfas,mms114" }, - { } -}; -#endif - static struct i2c_driver mms114_driver = { .driver = { .name = "mms114", .owner = THIS_MODULE, .pm = &mms114_pm_ops, - .of_match_table = of_match_ptr(mms114_dt_match), }, .probe = mms114_probe, - .remove = mms114_remove, + .remove = __devexit_p(mms114_remove), .id_table = mms114_id, }; diff --git a/trunk/drivers/input/touchscreen/pcap_ts.c b/trunk/drivers/input/touchscreen/pcap_ts.c index f22e04dd4e16..f57aeb80f7e3 100644 --- a/trunk/drivers/input/touchscreen/pcap_ts.c +++ b/trunk/drivers/input/touchscreen/pcap_ts.c @@ -137,7 +137,7 @@ static void pcap_ts_close(struct input_dev *dev) pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT); } -static int pcap_ts_probe(struct platform_device *pdev) +static int __devinit pcap_ts_probe(struct platform_device *pdev) { struct input_dev *input_dev; struct pcap_ts *pcap_ts; @@ -202,7 +202,7 @@ static int pcap_ts_probe(struct platform_device *pdev) return err; } -static int pcap_ts_remove(struct platform_device *pdev) +static int __devexit pcap_ts_remove(struct platform_device *pdev) { struct pcap_ts *pcap_ts = platform_get_drvdata(pdev); @@ -245,7 +245,7 @@ static const struct dev_pm_ops pcap_ts_pm_ops = { static struct platform_driver pcap_ts_driver = { .probe = pcap_ts_probe, - .remove = pcap_ts_remove, + .remove = __devexit_p(pcap_ts_remove), .driver = { .name = "pcap-ts", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/pixcir_i2c_ts.c b/trunk/drivers/input/touchscreen/pixcir_i2c_ts.c index 6cc6b36663ff..953b4c105cad 100644 --- a/trunk/drivers/input/touchscreen/pixcir_i2c_ts.c +++ b/trunk/drivers/input/touchscreen/pixcir_i2c_ts.c @@ -125,7 +125,7 @@ static int pixcir_i2c_ts_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); -static int pixcir_i2c_ts_probe(struct i2c_client *client, +static int __devinit pixcir_i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { const struct pixcir_ts_platform_data *pdata = client->dev.platform_data; @@ -189,7 +189,7 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client, return error; } -static int pixcir_i2c_ts_remove(struct i2c_client *client) +static int __devexit pixcir_i2c_ts_remove(struct i2c_client *client) { struct pixcir_i2c_ts_data *tsdata = i2c_get_clientdata(client); @@ -218,7 +218,7 @@ static struct i2c_driver pixcir_i2c_ts_driver = { .pm = &pixcir_dev_pm_ops, }, .probe = pixcir_i2c_ts_probe, - .remove = pixcir_i2c_ts_remove, + .remove = __devexit_p(pixcir_i2c_ts_remove), .id_table = pixcir_i2c_ts_id, }; diff --git a/trunk/drivers/input/touchscreen/s3c2410_ts.c b/trunk/drivers/input/touchscreen/s3c2410_ts.c index b061af2c8376..549fa29548f8 100644 --- a/trunk/drivers/input/touchscreen/s3c2410_ts.c +++ b/trunk/drivers/input/touchscreen/s3c2410_ts.c @@ -238,7 +238,7 @@ static void s3c24xx_ts_select(struct s3c_adc_client *client, unsigned select) * Initialise, find and allocate any resources we need to run and then * register with the ADC and input systems. */ -static int s3c2410ts_probe(struct platform_device *pdev) +static int __devinit s3c2410ts_probe(struct platform_device *pdev) { struct s3c2410_ts_mach_info *info; struct device *dev = &pdev->dev; @@ -365,7 +365,7 @@ static int s3c2410ts_probe(struct platform_device *pdev) * * Free up our state ready to be removed. */ -static int s3c2410ts_remove(struct platform_device *pdev) +static int __devexit s3c2410ts_remove(struct platform_device *pdev) { free_irq(ts.irq_tc, ts.input); del_timer_sync(&touch_timer); @@ -430,7 +430,7 @@ static struct platform_driver s3c_ts_driver = { }, .id_table = s3cts_driver_ids, .probe = s3c2410ts_probe, - .remove = s3c2410ts_remove, + .remove = __devexit_p(s3c2410ts_remove), }; module_platform_driver(s3c_ts_driver); diff --git a/trunk/drivers/input/touchscreen/st1232.c b/trunk/drivers/input/touchscreen/st1232.c index d9d05e222428..6cb68a1981bf 100644 --- a/trunk/drivers/input/touchscreen/st1232.c +++ b/trunk/drivers/input/touchscreen/st1232.c @@ -139,7 +139,7 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static int st1232_ts_probe(struct i2c_client *client, +static int __devinit st1232_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct st1232_ts_data *ts; @@ -206,7 +206,7 @@ static int st1232_ts_probe(struct i2c_client *client, return error; } -static int st1232_ts_remove(struct i2c_client *client) +static int __devexit st1232_ts_remove(struct i2c_client *client) { struct st1232_ts_data *ts = i2c_get_clientdata(client); @@ -255,7 +255,7 @@ static const struct i2c_device_id st1232_ts_id[] = { MODULE_DEVICE_TABLE(i2c, st1232_ts_id); #ifdef CONFIG_OF -static const struct of_device_id st1232_ts_dt_ids[] = { +static const struct of_device_id st1232_ts_dt_ids[] __devinitconst = { { .compatible = "sitronix,st1232", }, { } }; @@ -264,7 +264,7 @@ MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); static struct i2c_driver st1232_ts_driver = { .probe = st1232_ts_probe, - .remove = st1232_ts_remove, + .remove = __devexit_p(st1232_ts_remove), .id_table = st1232_ts_id, .driver = { .name = ST1232_TS_NAME, diff --git a/trunk/drivers/input/touchscreen/stmpe-ts.c b/trunk/drivers/input/touchscreen/stmpe-ts.c index 84d884b4ec3e..692b685720ce 100644 --- a/trunk/drivers/input/touchscreen/stmpe-ts.c +++ b/trunk/drivers/input/touchscreen/stmpe-ts.c @@ -1,5 +1,4 @@ -/* - * STMicroelectronics STMPE811 Touchscreen Driver +/* STMicroelectronics STMPE811 Touchscreen Driver * * (C) 2010 Luotao Fu * All rights reserved. @@ -17,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -168,7 +166,7 @@ static irqreturn_t stmpe_ts_handler(int irq, void *data) return IRQ_HANDLED; } -static int stmpe_init_hw(struct stmpe_touch *ts) +static int __devinit stmpe_init_hw(struct stmpe_touch *ts) { int ret; u8 adc_ctrl1, adc_ctrl1_mask, tsc_cfg, tsc_cfg_mask; @@ -263,18 +261,41 @@ static void stmpe_ts_close(struct input_dev *dev) STMPE_TSC_CTRL_TSC_EN, 0); } -static void stmpe_ts_get_platform_info(struct platform_device *pdev, - struct stmpe_touch *ts) +static int __devinit stmpe_input_probe(struct platform_device *pdev) { struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); - struct device_node *np = pdev->dev.of_node; + struct stmpe_platform_data *pdata = stmpe->pdata; + struct stmpe_touch *ts; + struct input_dev *idev; struct stmpe_ts_platform_data *ts_pdata = NULL; + int ret; + int ts_irq; + + ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); + if (ts_irq < 0) + return ts_irq; + + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (!ts) { + ret = -ENOMEM; + goto err_out; + } + idev = input_allocate_device(); + if (!idev) { + ret = -ENOMEM; + goto err_free_ts; + } + + platform_set_drvdata(pdev, ts); ts->stmpe = stmpe; + ts->idev = idev; + ts->dev = &pdev->dev; - if (stmpe->pdata && stmpe->pdata->ts) { - ts_pdata = stmpe->pdata->ts; + if (pdata) + ts_pdata = pdata->ts; + if (ts_pdata) { ts->sample_time = ts_pdata->sample_time; ts->mod_12b = ts_pdata->mod_12b; ts->ref_sel = ts_pdata->ref_sel; @@ -284,71 +305,22 @@ static void stmpe_ts_get_platform_info(struct platform_device *pdev, ts->settling = ts_pdata->settling; ts->fraction_z = ts_pdata->fraction_z; ts->i_drive = ts_pdata->i_drive; - } else if (np) { - u32 val; - - if (!of_property_read_u32(np, "st,sample-time", &val)) - ts->sample_time = val; - if (!of_property_read_u32(np, "st,mod-12b", &val)) - ts->mod_12b = val; - if (!of_property_read_u32(np, "st,ref-sel", &val)) - ts->ref_sel = val; - if (!of_property_read_u32(np, "st,adc-freq", &val)) - ts->adc_freq = val; - if (!of_property_read_u32(np, "st,ave-ctrl", &val)) - ts->ave_ctrl = val; - if (!of_property_read_u32(np, "st,touch-det-delay", &val)) - ts->touch_det_delay = val; - if (!of_property_read_u32(np, "st,settling", &val)) - ts->settling = val; - if (!of_property_read_u32(np, "st,fraction-z", &val)) - ts->fraction_z = val; - if (!of_property_read_u32(np, "st,i-drive", &val)) - ts->i_drive = val; } -} - -static int stmpe_input_probe(struct platform_device *pdev) -{ - struct stmpe_touch *ts; - struct input_dev *idev; - int error; - int ts_irq; - - ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); - if (ts_irq < 0) - return ts_irq; - - ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL); - if (!ts) - return -ENOMEM; - - idev = devm_input_allocate_device(&pdev->dev); - if (!idev) - return -ENOMEM; - - platform_set_drvdata(pdev, ts); - ts->idev = idev; - ts->dev = &pdev->dev; - - stmpe_ts_get_platform_info(pdev, ts); INIT_DELAYED_WORK(&ts->work, stmpe_work); - error = devm_request_threaded_irq(&pdev->dev, ts_irq, - NULL, stmpe_ts_handler, - IRQF_ONESHOT, STMPE_TS_NAME, ts); - if (error) { + ret = request_threaded_irq(ts_irq, NULL, stmpe_ts_handler, + IRQF_ONESHOT, STMPE_TS_NAME, ts); + if (ret) { dev_err(&pdev->dev, "Failed to request IRQ %d\n", ts_irq); - return error; + goto err_free_input; } - error = stmpe_init_hw(ts); - if (error) - return error; + ret = stmpe_init_hw(ts); + if (ret) + goto err_free_irq; idev->name = STMPE_TS_NAME; - idev->phys = STMPE_TS_NAME"/input0"; idev->id.bustype = BUS_I2C; idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); @@ -362,21 +334,40 @@ static int stmpe_input_probe(struct platform_device *pdev) input_set_abs_params(idev, ABS_Y, 0, XY_MASK, 0, 0); input_set_abs_params(idev, ABS_PRESSURE, 0x0, 0xff, 0, 0); - error = input_register_device(idev); - if (error) { + ret = input_register_device(idev); + if (ret) { dev_err(&pdev->dev, "Could not register input device\n"); - return error; + goto err_free_irq; } - return 0; + return ret; + +err_free_irq: + free_irq(ts_irq, ts); +err_free_input: + input_free_device(idev); + platform_set_drvdata(pdev, NULL); +err_free_ts: + kfree(ts); +err_out: + return ret; } -static int stmpe_ts_remove(struct platform_device *pdev) +static int __devexit stmpe_ts_remove(struct platform_device *pdev) { struct stmpe_touch *ts = platform_get_drvdata(pdev); + unsigned int ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); stmpe_disable(ts->stmpe, STMPE_BLOCK_TOUCHSCREEN); + free_irq(ts_irq, ts); + + platform_set_drvdata(pdev, NULL); + + input_unregister_device(ts->idev); + + kfree(ts); + return 0; } @@ -386,7 +377,7 @@ static struct platform_driver stmpe_ts_driver = { .owner = THIS_MODULE, }, .probe = stmpe_input_probe, - .remove = stmpe_ts_remove, + .remove = __devexit_p(stmpe_ts_remove), }; module_platform_driver(stmpe_ts_driver); diff --git a/trunk/drivers/input/touchscreen/ti_am335x_tsc.c b/trunk/drivers/input/touchscreen/ti_am335x_tsc.c index 51e7b87827a4..7a18a8a15228 100644 --- a/trunk/drivers/input/touchscreen/ti_am335x_tsc.c +++ b/trunk/drivers/input/touchscreen/ti_am335x_tsc.c @@ -258,7 +258,7 @@ static irqreturn_t titsc_irq(int irq, void *dev) * The functions for inserting/removing driver as a module. */ -static int titsc_probe(struct platform_device *pdev) +static int __devinit titsc_probe(struct platform_device *pdev) { struct titsc *ts_dev; struct input_dev *input_dev; @@ -327,7 +327,7 @@ static int titsc_probe(struct platform_device *pdev) return err; } -static int titsc_remove(struct platform_device *pdev) +static int __devexit titsc_remove(struct platform_device *pdev) { struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data; struct titsc *ts_dev = tscadc_dev->tsc; @@ -384,7 +384,7 @@ static const struct dev_pm_ops titsc_pm_ops = { static struct platform_driver ti_tsc_driver = { .probe = titsc_probe, - .remove = titsc_remove, + .remove = __devexit_p(titsc_remove), .driver = { .name = "tsc", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/tnetv107x-ts.c b/trunk/drivers/input/touchscreen/tnetv107x-ts.c index acfb87607b87..368d2c6cf780 100644 --- a/trunk/drivers/input/touchscreen/tnetv107x-ts.c +++ b/trunk/drivers/input/touchscreen/tnetv107x-ts.c @@ -243,7 +243,7 @@ static void tsc_stop(struct input_dev *dev) clk_disable(ts->clk); } -static int tsc_probe(struct platform_device *pdev) +static int __devinit tsc_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct tsc_data *ts; @@ -357,7 +357,7 @@ static int tsc_probe(struct platform_device *pdev) return error; } -static int tsc_remove(struct platform_device *pdev) +static int __devexit tsc_remove(struct platform_device *pdev) { struct tsc_data *ts = platform_get_drvdata(pdev); @@ -374,7 +374,7 @@ static int tsc_remove(struct platform_device *pdev) static struct platform_driver tsc_driver = { .probe = tsc_probe, - .remove = tsc_remove, + .remove = __devexit_p(tsc_remove), .driver.name = "tnetv107x-ts", .driver.owner = THIS_MODULE, }; diff --git a/trunk/drivers/input/touchscreen/tps6507x-ts.c b/trunk/drivers/input/touchscreen/tps6507x-ts.c index 820a066c3b8a..f7eda3d00fad 100644 --- a/trunk/drivers/input/touchscreen/tps6507x-ts.c +++ b/trunk/drivers/input/touchscreen/tps6507x-ts.c @@ -345,7 +345,7 @@ static int tps6507x_ts_probe(struct platform_device *pdev) return error; } -static int tps6507x_ts_remove(struct platform_device *pdev) +static int __devexit tps6507x_ts_remove(struct platform_device *pdev) { struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev); struct tps6507x_ts *tsc = tps6507x_dev->ts; @@ -367,7 +367,7 @@ static struct platform_driver tps6507x_ts_driver = { .owner = THIS_MODULE, }, .probe = tps6507x_ts_probe, - .remove = tps6507x_ts_remove, + .remove = __devexit_p(tps6507x_ts_remove), }; module_platform_driver(tps6507x_ts_driver); diff --git a/trunk/drivers/input/touchscreen/tsc2005.c b/trunk/drivers/input/touchscreen/tsc2005.c index 9c0cdc7ea449..5ce3fa8ce646 100644 --- a/trunk/drivers/input/touchscreen/tsc2005.c +++ b/trunk/drivers/input/touchscreen/tsc2005.c @@ -555,7 +555,7 @@ static void tsc2005_close(struct input_dev *input) mutex_unlock(&ts->mutex); } -static void tsc2005_setup_spi_xfer(struct tsc2005 *ts) +static void __devinit tsc2005_setup_spi_xfer(struct tsc2005 *ts) { tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, false); tsc2005_setup_read(&ts->spi_y, TSC2005_REG_Y, false); @@ -569,7 +569,7 @@ static void tsc2005_setup_spi_xfer(struct tsc2005 *ts) spi_message_add_tail(&ts->spi_z2.spi_xfer, &ts->spi_read_msg); } -static int tsc2005_probe(struct spi_device *spi) +static int __devinit tsc2005_probe(struct spi_device *spi) { const struct tsc2005_platform_data *pdata = spi->dev.platform_data; struct tsc2005 *ts; @@ -686,7 +686,7 @@ static int tsc2005_probe(struct spi_device *spi) return error; } -static int tsc2005_remove(struct spi_device *spi) +static int __devexit tsc2005_remove(struct spi_device *spi) { struct tsc2005 *ts = spi_get_drvdata(spi); @@ -745,7 +745,7 @@ static struct spi_driver tsc2005_driver = { .pm = &tsc2005_pm_ops, }, .probe = tsc2005_probe, - .remove = tsc2005_remove, + .remove = __devexit_p(tsc2005_remove), }; module_spi_driver(tsc2005_driver); diff --git a/trunk/drivers/input/touchscreen/tsc2007.c b/trunk/drivers/input/touchscreen/tsc2007.c index 0b67ba476b4c..1473d2382afd 100644 --- a/trunk/drivers/input/touchscreen/tsc2007.c +++ b/trunk/drivers/input/touchscreen/tsc2007.c @@ -273,7 +273,7 @@ static void tsc2007_close(struct input_dev *input_dev) tsc2007_stop(ts); } -static int tsc2007_probe(struct i2c_client *client, +static int __devinit tsc2007_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct tsc2007 *ts; @@ -366,7 +366,7 @@ static int tsc2007_probe(struct i2c_client *client, return err; } -static int tsc2007_remove(struct i2c_client *client) +static int __devexit tsc2007_remove(struct i2c_client *client) { struct tsc2007 *ts = i2c_get_clientdata(client); struct tsc2007_platform_data *pdata = client->dev.platform_data; @@ -396,7 +396,7 @@ static struct i2c_driver tsc2007_driver = { }, .id_table = tsc2007_idtable, .probe = tsc2007_probe, - .remove = tsc2007_remove, + .remove = __devexit_p(tsc2007_remove), }; module_i2c_driver(tsc2007_driver); diff --git a/trunk/drivers/input/touchscreen/ucb1400_ts.c b/trunk/drivers/input/touchscreen/ucb1400_ts.c index 1271f97b4079..46e83ad53f43 100644 --- a/trunk/drivers/input/touchscreen/ucb1400_ts.c +++ b/trunk/drivers/input/touchscreen/ucb1400_ts.c @@ -274,7 +274,7 @@ static void ucb1400_ts_close(struct input_dev *idev) * Try to probe our interrupt, rather than relying on lots of * hard-coded machine dependencies. */ -static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, +static int __devinit ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, struct platform_device *pdev) { unsigned long mask, timeout; @@ -318,7 +318,7 @@ static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, return 0; } -static int ucb1400_ts_probe(struct platform_device *pdev) +static int __devinit ucb1400_ts_probe(struct platform_device *pdev) { struct ucb1400_ts *ucb = pdev->dev.platform_data; int error, x_res, y_res; @@ -397,7 +397,7 @@ static int ucb1400_ts_probe(struct platform_device *pdev) return error; } -static int ucb1400_ts_remove(struct platform_device *pdev) +static int __devexit ucb1400_ts_remove(struct platform_device *pdev) { struct ucb1400_ts *ucb = pdev->dev.platform_data; @@ -442,7 +442,7 @@ static SIMPLE_DEV_PM_OPS(ucb1400_ts_pm_ops, static struct platform_driver ucb1400_ts_driver = { .probe = ucb1400_ts_probe, - .remove = ucb1400_ts_remove, + .remove = __devexit_p(ucb1400_ts_remove), .driver = { .name = "ucb1400_ts", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/w90p910_ts.c b/trunk/drivers/input/touchscreen/w90p910_ts.c index d2ef8f05c66e..9396b21d0e8f 100644 --- a/trunk/drivers/input/touchscreen/w90p910_ts.c +++ b/trunk/drivers/input/touchscreen/w90p910_ts.c @@ -215,7 +215,7 @@ static void w90p910_close(struct input_dev *dev) clk_disable(w90p910_ts->clk); } -static int w90x900ts_probe(struct platform_device *pdev) +static int __devinit w90x900ts_probe(struct platform_device *pdev) { struct w90p910_ts *w90p910_ts; struct input_dev *input_dev; @@ -301,7 +301,7 @@ fail1: input_free_device(input_dev); return err; } -static int w90x900ts_remove(struct platform_device *pdev) +static int __devexit w90x900ts_remove(struct platform_device *pdev) { struct w90p910_ts *w90p910_ts = platform_get_drvdata(pdev); struct resource *res; @@ -325,7 +325,7 @@ static int w90x900ts_remove(struct platform_device *pdev) static struct platform_driver w90x900ts_driver = { .probe = w90x900ts_probe, - .remove = w90x900ts_remove, + .remove = __devexit_p(w90x900ts_remove), .driver = { .name = "nuc900-ts", .owner = THIS_MODULE, diff --git a/trunk/drivers/input/touchscreen/wacom_i2c.c b/trunk/drivers/input/touchscreen/wacom_i2c.c index bf0d07620bac..0c01657132fd 100644 --- a/trunk/drivers/input/touchscreen/wacom_i2c.c +++ b/trunk/drivers/input/touchscreen/wacom_i2c.c @@ -144,7 +144,7 @@ static void wacom_i2c_close(struct input_dev *dev) disable_irq(client->irq); } -static int wacom_i2c_probe(struct i2c_client *client, +static int __devinit wacom_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct wacom_i2c *wac_i2c; @@ -225,7 +225,7 @@ static int wacom_i2c_probe(struct i2c_client *client, return error; } -static int wacom_i2c_remove(struct i2c_client *client) +static int __devexit wacom_i2c_remove(struct i2c_client *client) { struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); @@ -272,7 +272,7 @@ static struct i2c_driver wacom_i2c_driver = { }, .probe = wacom_i2c_probe, - .remove = wacom_i2c_remove, + .remove = __devexit_p(wacom_i2c_remove), .id_table = wacom_i2c_id, }; module_i2c_driver(wacom_i2c_driver); diff --git a/trunk/drivers/input/touchscreen/wm831x-ts.c b/trunk/drivers/input/touchscreen/wm831x-ts.c index f88fab56178c..52abb98a8ae5 100644 --- a/trunk/drivers/input/touchscreen/wm831x-ts.c +++ b/trunk/drivers/input/touchscreen/wm831x-ts.c @@ -233,7 +233,7 @@ static void wm831x_ts_input_close(struct input_dev *idev) } } -static int wm831x_ts_probe(struct platform_device *pdev) +static __devinit int wm831x_ts_probe(struct platform_device *pdev) { struct wm831x_ts *wm831x_ts; struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); @@ -245,8 +245,7 @@ static int wm831x_ts_probe(struct platform_device *pdev) if (core_pdata) pdata = core_pdata->touch; - wm831x_ts = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ts), - GFP_KERNEL); + wm831x_ts = kzalloc(sizeof(struct wm831x_ts), GFP_KERNEL); input_dev = input_allocate_device(); if (!wm831x_ts || !input_dev) { error = -ENOMEM; @@ -377,18 +376,21 @@ static int wm831x_ts_probe(struct platform_device *pdev) free_irq(wm831x_ts->data_irq, wm831x_ts); err_alloc: input_free_device(input_dev); + kfree(wm831x_ts); return error; } -static int wm831x_ts_remove(struct platform_device *pdev) +static __devexit int wm831x_ts_remove(struct platform_device *pdev) { struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev); free_irq(wm831x_ts->pd_irq, wm831x_ts); free_irq(wm831x_ts->data_irq, wm831x_ts); input_unregister_device(wm831x_ts->input_dev); + kfree(wm831x_ts); + platform_set_drvdata(pdev, NULL); return 0; } @@ -398,7 +400,7 @@ static struct platform_driver wm831x_ts_driver = { .owner = THIS_MODULE, }, .probe = wm831x_ts_probe, - .remove = wm831x_ts_remove, + .remove = __devexit_p(wm831x_ts_remove), }; module_platform_driver(wm831x_ts_driver); diff --git a/trunk/drivers/mfd/stmpe.c b/trunk/drivers/mfd/stmpe.c index 5e8e6927cfcd..19636199d7a5 100644 --- a/trunk/drivers/mfd/stmpe.c +++ b/trunk/drivers/mfd/stmpe.c @@ -326,7 +326,6 @@ static struct resource stmpe_keypad_resources[] = { static struct mfd_cell stmpe_keypad_cell = { .name = "stmpe-keypad", - .of_compatible = "st,stmpe-keypad", .resources = stmpe_keypad_resources, .num_resources = ARRAY_SIZE(stmpe_keypad_resources), }; @@ -410,7 +409,6 @@ static struct resource stmpe_ts_resources[] = { static struct mfd_cell stmpe_ts_cell = { .name = "stmpe-ts", - .of_compatible = "st,stmpe-ts", .resources = stmpe_ts_resources, .num_resources = ARRAY_SIZE(stmpe_ts_resources), }; diff --git a/trunk/drivers/video/backlight/locomolcd.c b/trunk/drivers/video/backlight/locomolcd.c index 3a6d5419e3e3..146fea8aa431 100644 --- a/trunk/drivers/video/backlight/locomolcd.c +++ b/trunk/drivers/video/backlight/locomolcd.c @@ -107,7 +107,6 @@ void locomolcd_power(int on) } EXPORT_SYMBOL(locomolcd_power); - static int current_intensity; static int locomolcd_set_intensity(struct backlight_device *bd) @@ -122,13 +121,25 @@ static int locomolcd_set_intensity(struct backlight_device *bd) intensity = 0; switch (intensity) { - /* AC and non-AC are handled differently, but produce same results in sharp code? */ - case 0: locomo_frontlight_set(locomolcd_dev, 0, 0, 161); break; - case 1: locomo_frontlight_set(locomolcd_dev, 117, 0, 161); break; - case 2: locomo_frontlight_set(locomolcd_dev, 163, 0, 148); break; - case 3: locomo_frontlight_set(locomolcd_dev, 194, 0, 161); break; - case 4: locomo_frontlight_set(locomolcd_dev, 194, 1, 161); break; - + /* + * AC and non-AC are handled differently, + * but produce same results in sharp code? + */ + case 0: + locomo_frontlight_set(locomolcd_dev, 0, 0, 161); + break; + case 1: + locomo_frontlight_set(locomolcd_dev, 117, 0, 161); + break; + case 2: + locomo_frontlight_set(locomolcd_dev, 163, 0, 148); + break; + case 3: + locomo_frontlight_set(locomolcd_dev, 194, 0, 161); + break; + case 4: + locomo_frontlight_set(locomolcd_dev, 194, 1, 161); + break; default: return -ENODEV; } @@ -175,9 +186,11 @@ static int locomolcd_probe(struct locomo_dev *ldev) locomo_gpio_set_dir(ldev->dev.parent, LOCOMO_GPIO_FL_VR, 0); - /* the poodle_lcd_power function is called for the first time + /* + * the poodle_lcd_power function is called for the first time * from fs_initcall, which is before locomo is activated. - * We need to recall poodle_lcd_power here*/ + * We need to recall poodle_lcd_power here + */ if (machine_is_poodle()) locomolcd_power(1); @@ -190,8 +203,8 @@ static int locomolcd_probe(struct locomo_dev *ldev) &ldev->dev, NULL, &locomobl_data, &props); - if (IS_ERR (locomolcd_bl_device)) - return PTR_ERR (locomolcd_bl_device); + if (IS_ERR(locomolcd_bl_device)) + return PTR_ERR(locomolcd_bl_device); /* Set up frontlight so that screen is readable */ locomolcd_bl_device->props.brightness = 2; @@ -226,7 +239,6 @@ static struct locomo_driver poodle_lcd_driver = { .resume = locomolcd_resume, }; - static int __init locomolcd_init(void) { return locomo_driver_register(&poodle_lcd_driver); diff --git a/trunk/include/linux/input.h b/trunk/include/linux/input.h index 82ce323b9986..cab994ba6d91 100644 --- a/trunk/include/linux/input.h +++ b/trunk/include/linux/input.h @@ -112,11 +112,6 @@ struct input_value { * @h_list: list of input handles associated with the device. When * accessing the list dev->mutex must be held * @node: used to place the device onto input_dev_list - * @num_vals: number of values queued in the current frame - * @max_vals: maximum number of values queued in a frame - * @vals: array of values queued in the current frame - * @devres_managed: indicates that devices is managed with devres framework - * and needs not be explicitly unregistered or freed. */ struct input_dev { const char *name; @@ -185,8 +180,6 @@ struct input_dev { unsigned int num_vals; unsigned int max_vals; struct input_value *vals; - - bool devres_managed; }; #define to_input_dev(d) container_of(d, struct input_dev, dev) @@ -330,8 +323,7 @@ struct input_handle { struct list_head h_node; }; -struct input_dev __must_check *input_allocate_device(void); -struct input_dev __must_check *devm_input_allocate_device(struct device *); +struct input_dev *input_allocate_device(void); void input_free_device(struct input_dev *dev); static inline struct input_dev *input_get_device(struct input_dev *dev) diff --git a/trunk/include/linux/input/bu21013.h b/trunk/include/linux/input/bu21013.h index 6230d76bde5d..05e03284b92a 100644 --- a/trunk/include/linux/input/bu21013.h +++ b/trunk/include/linux/input/bu21013.h @@ -9,10 +9,13 @@ /** * struct bu21013_platform_device - Handle the platform data + * @cs_en: pointer to the cs enable function + * @cs_dis: pointer to the cs disable function + * @irq_read_val: pointer to read the pen irq value function * @touch_x_max: touch x max * @touch_y_max: touch y max * @cs_pin: chip select pin - * @touch_pin: touch gpio pin + * @irq: irq pin * @ext_clk: external clock flag * @x_flip: x flip flag * @y_flip: y flip flag @@ -21,10 +24,13 @@ * This is used to handle the platform data */ struct bu21013_platform_device { + int (*cs_en)(int reset_pin); + int (*cs_dis)(int reset_pin); + int (*irq_read_val)(void); int touch_x_max; int touch_y_max; unsigned int cs_pin; - unsigned int touch_pin; + unsigned int irq; bool ext_clk; bool x_flip; bool y_flip; diff --git a/trunk/include/xen/interface/event_channel.h b/trunk/include/xen/interface/event_channel.h index f4942921e202..2090881c3650 100644 --- a/trunk/include/xen/interface/event_channel.h +++ b/trunk/include/xen/interface/event_channel.h @@ -177,19 +177,6 @@ struct evtchn_unmask { evtchn_port_t port; }; -/* - * EVTCHNOP_reset: Close all event channels associated with specified domain. - * NOTES: - * 1. may be specified as DOMID_SELF. - * 2. Only a sufficiently-privileged domain may specify other than DOMID_SELF. - */ -#define EVTCHNOP_reset 10 -struct evtchn_reset { - /* IN parameters. */ - domid_t dom; -}; -typedef struct evtchn_reset evtchn_reset_t; - struct evtchn_op { uint32_t cmd; /* EVTCHNOP_* */ union { diff --git a/trunk/kernel/trace/trace.c b/trunk/kernel/trace/trace.c index e5125677efa0..61e081b4ba11 100644 --- a/trunk/kernel/trace/trace.c +++ b/trunk/kernel/trace/trace.c @@ -3034,31 +3034,6 @@ static void set_buffer_entries(struct trace_array *tr, unsigned long val) tr->data[cpu]->entries = val; } -/* resize @tr's buffer to the size of @size_tr's entries */ -static int resize_buffer_duplicate_size(struct trace_array *tr, - struct trace_array *size_tr, int cpu_id) -{ - int cpu, ret = 0; - - if (cpu_id == RING_BUFFER_ALL_CPUS) { - for_each_tracing_cpu(cpu) { - ret = ring_buffer_resize(tr->buffer, - size_tr->data[cpu]->entries, cpu); - if (ret < 0) - break; - tr->data[cpu]->entries = size_tr->data[cpu]->entries; - } - } else { - ret = ring_buffer_resize(tr->buffer, - size_tr->data[cpu_id]->entries, cpu_id); - if (ret == 0) - tr->data[cpu_id]->entries = - size_tr->data[cpu_id]->entries; - } - - return ret; -} - static int __tracing_resize_ring_buffer(unsigned long size, int cpu) { int ret; @@ -3083,8 +3058,23 @@ static int __tracing_resize_ring_buffer(unsigned long size, int cpu) ret = ring_buffer_resize(max_tr.buffer, size, cpu); if (ret < 0) { - int r = resize_buffer_duplicate_size(&global_trace, - &global_trace, cpu); + int r = 0; + + if (cpu == RING_BUFFER_ALL_CPUS) { + int i; + for_each_tracing_cpu(i) { + r = ring_buffer_resize(global_trace.buffer, + global_trace.data[i]->entries, + i); + if (r < 0) + break; + } + } else { + r = ring_buffer_resize(global_trace.buffer, + global_trace.data[cpu]->entries, + cpu); + } + if (r < 0) { /* * AARGH! We are left with different @@ -3222,11 +3212,17 @@ static int tracing_set_tracer(const char *buf) topts = create_trace_option_files(t); if (t->use_max_tr) { + int cpu; /* we need to make per cpu buffer sizes equivalent */ - ret = resize_buffer_duplicate_size(&max_tr, &global_trace, - RING_BUFFER_ALL_CPUS); - if (ret < 0) - goto out; + for_each_tracing_cpu(cpu) { + ret = ring_buffer_resize(max_tr.buffer, + global_trace.data[cpu]->entries, + cpu); + if (ret < 0) + goto out; + max_tr.data[cpu]->entries = + global_trace.data[cpu]->entries; + } } if (t->init) { @@ -4275,11 +4271,13 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, return -ENOMEM; if (*ppos & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: previous read must page-align\n"); ret = -EINVAL; goto out; } if (len & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: splice_read should page-align\n"); if (len < PAGE_SIZE) { ret = -EINVAL; goto out; diff --git a/trunk/kernel/trace/trace_stack.c b/trunk/kernel/trace/trace_stack.c index 42ca822fc701..0c1b165778e5 100644 --- a/trunk/kernel/trace/trace_stack.c +++ b/trunk/kernel/trace/trace_stack.c @@ -33,6 +33,7 @@ static unsigned long max_stack_size; static arch_spinlock_t max_stack_lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; +static int stack_trace_disabled __read_mostly; static DEFINE_PER_CPU(int, trace_active); static DEFINE_MUTEX(stack_sysctl_mutex); @@ -115,6 +116,9 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip, { int cpu; + if (unlikely(!ftrace_enabled || stack_trace_disabled)) + return; + preempt_disable_notrace(); cpu = raw_smp_processor_id(); diff --git a/trunk/tools/power/x86/turbostat/Makefile b/trunk/tools/power/x86/turbostat/Makefile index f09641da40d4..f85649554191 100644 --- a/trunk/tools/power/x86/turbostat/Makefile +++ b/trunk/tools/power/x86/turbostat/Makefile @@ -1,22 +1,9 @@ -CC = $(CROSS_COMPILE)gcc -BUILD_OUTPUT := $(PWD) -PREFIX := /usr -DESTDIR := - turbostat : turbostat.c CFLAGS += -Wall -CFLAGS += -I../../../../arch/x86/include/uapi/ - -%: %.c - @mkdir -p $(BUILD_OUTPUT) - $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ -.PHONY : clean clean : - @rm -f $(BUILD_OUTPUT)/turbostat + rm -f turbostat -install : turbostat - install -d $(DESTDIR)$(PREFIX)/bin - install $(BUILD_OUTPUT)/turbostat $(DESTDIR)$(PREFIX)/bin/turbostat - install -d $(DESTDIR)$(PREFIX)/share/man/man8 - install turbostat.8 $(DESTDIR)$(PREFIX)/share/man/man8 +install : + install turbostat /usr/bin/turbostat + install turbostat.8 /usr/share/man/man8 diff --git a/trunk/tools/power/x86/turbostat/turbostat.8 b/trunk/tools/power/x86/turbostat/turbostat.8 index 0d7dc2cfefb5..e4d0690cccf9 100644 --- a/trunk/tools/power/x86/turbostat/turbostat.8 +++ b/trunk/tools/power/x86/turbostat/turbostat.8 @@ -11,16 +11,16 @@ turbostat \- Report processor frequency and idle statistics .RB [ Options ] .RB [ "\-i interval_sec" ] .SH DESCRIPTION -\fBturbostat \fP reports processor topology, frequency, -idle power-state statistics, temperature and power on modern X86 processors. +\fBturbostat \fP reports processor topology, frequency +and idle power state statistics on modern X86 processors. Either \fBcommand\fP is forked and statistics are printed upon its completion, or statistics are printed periodically. \fBturbostat \fP -must be run on root, and -minimally requires that the processor +requires that the processor supports an "invariant" TSC, plus the APERF and MPERF MSRs. -Additional information is reported depending on hardware counter support. +\fBturbostat \fP will report idle cpu power state residency +on processors that additionally support C-state residency counters. .SS Options The \fB-p\fP option limits output to the 1st thread in 1st core of each package. @@ -57,15 +57,7 @@ Note that multiple CPUs per core indicate support for Intel(R) Hyper-Threading T \fBGHz\fP average clock rate while the CPU was in c0 state. \fBTSC\fP average GHz that the TSC ran during the entire interval. \fB%c1, %c3, %c6, %c7\fP show the percentage residency in hardware core idle states. -\fBCTMP\fP Degrees Celsius reported by the per-core Digital Thermal Sensor. -\fBPTMP\fP Degrees Celsius reported by the per-package Package Thermal Monitor. \fB%pc2, %pc3, %pc6, %pc7\fP percentage residency in hardware package idle states. -\fBPkg_W\fP Watts consumed by the whole package. -\fBCor_W\fP Watts consumed by the core part of the package. -\fBGFX_W\fP Watts consumed by the Graphics part of the package -- available only on client processors. -\fBRAM_W\fP Watts consumed by the DRAM DIMMS -- available only on server processors. -\fBPKG_%\fP percent of the interval that RAPL throttling was active on the Package. -\fBRAM_%\fP percent of the interval that RAPL throttling was active on DRAM. .fi .PP .SH EXAMPLE @@ -74,73 +66,50 @@ Without any parameters, turbostat prints out counters ever 5 seconds. for turbostat to fork). The first row of statistics is a summary for the entire system. -For residency % columns, the summary is a weighted average. -For Temperature columns, the summary is the column maximum. -For Watts columns, the summary is a system total. +Note that the summary is a weighted average. Subsequent rows show per-CPU statistics. .nf -[root@sandy]# ./turbostat -cor CPU %c0 GHz TSC %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W Cor_W GFX_W - 0.06 0.80 2.29 0.11 0.00 0.00 99.83 47 40 0.26 0.01 0.44 98.78 3.49 0.12 0.14 - 0 0 0.07 0.80 2.29 0.07 0.00 0.00 99.86 40 40 0.26 0.01 0.44 98.78 3.49 0.12 0.14 - 0 4 0.03 0.80 2.29 0.12 - 1 1 0.04 0.80 2.29 0.25 0.01 0.00 99.71 40 - 1 5 0.16 0.80 2.29 0.13 - 2 2 0.05 0.80 2.29 0.06 0.01 0.00 99.88 40 - 2 6 0.03 0.80 2.29 0.08 - 3 3 0.05 0.80 2.29 0.08 0.00 0.00 99.87 47 - 3 7 0.04 0.84 2.29 0.09 +[root@x980]# ./turbostat +cor CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 + 0.09 1.62 3.38 1.83 0.32 97.76 1.26 83.61 + 0 0 0.15 1.62 3.38 10.23 0.05 89.56 1.26 83.61 + 0 6 0.05 1.62 3.38 10.34 + 1 2 0.03 1.62 3.38 0.07 0.05 99.86 + 1 8 0.03 1.62 3.38 0.06 + 2 4 0.21 1.62 3.38 0.10 1.49 98.21 + 2 10 0.02 1.62 3.38 0.29 + 8 1 0.04 1.62 3.38 0.04 0.08 99.84 + 8 7 0.01 1.62 3.38 0.06 + 9 3 0.53 1.62 3.38 0.10 0.20 99.17 + 9 9 0.02 1.62 3.38 0.60 + 10 5 0.01 1.62 3.38 0.02 0.04 99.92 + 10 11 0.02 1.62 3.38 0.02 .fi .SH SUMMARY EXAMPLE The "-s" option prints the column headers just once, and then the one line system summary for each sample interval. .nf -[root@wsm]# turbostat -S - %c0 GHz TSC %c1 %c3 %c6 CTMP %pc3 %pc6 - 1.40 2.81 3.38 10.78 43.47 44.35 42 13.67 2.09 - 1.34 2.90 3.38 11.48 58.96 28.23 41 19.89 0.15 - 1.55 2.72 3.38 26.73 37.66 34.07 42 2.53 2.80 - 1.37 2.83 3.38 16.95 60.05 21.63 42 5.76 0.20 +[root@x980]# ./turbostat -s + %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 + 0.23 1.67 3.38 2.00 0.30 97.47 1.07 82.12 + 0.10 1.62 3.38 1.87 2.25 95.77 12.02 72.60 + 0.20 1.64 3.38 1.98 0.11 97.72 0.30 83.36 + 0.11 1.70 3.38 1.86 1.81 96.22 9.71 74.90 .fi .SH VERBOSE EXAMPLE The "-v" option adds verbosity to the output: .nf -[root@ivy]# turbostat -v -turbostat v3.0 November 23, 2012 - Len Brown -CPUID(0): GenuineIntel 13 CPUID levels; family:model:stepping 0x6:3a:9 (6:58:9) -CPUID(6): APERF, DTS, PTM, EPB -RAPL: 851 sec. Joule Counter Range -cpu0: MSR_NHM_PLATFORM_INFO: 0x81010f0012300 -16 * 100 = 1600 MHz max efficiency -35 * 100 = 3500 MHz TSC frequency -cpu0: MSR_NHM_SNB_PKG_CST_CFG_CTL: 0x1e008402 (UNdemote-C3, UNdemote-C1, demote-C3, demote-C1, locked: pkg-cstate-limit=2: pc6-noret) -cpu0: MSR_NHM_TURBO_RATIO_LIMIT: 0x25262727 -37 * 100 = 3700 MHz max turbo 4 active cores -38 * 100 = 3800 MHz max turbo 3 active cores -39 * 100 = 3900 MHz max turbo 2 active cores -39 * 100 = 3900 MHz max turbo 1 active cores -cpu0: MSR_IA32_ENERGY_PERF_BIAS: 0x00000006 (balanced) -cpu0: MSR_RAPL_POWER_UNIT: 0x000a1003 (0.125000 Watts, 0.000015 Joules, 0.000977 sec.) -cpu0: MSR_PKG_POWER_INFO: 0x01e00268 (77 W TDP, RAPL 60 - 0 W, 0.000000 sec.) -cpu0: MSR_PKG_POWER_LIMIT: 0x830000148268 (UNlocked) -cpu0: PKG Limit #1: ENabled (77.000000 Watts, 1.000000 sec, clamp DISabled) -cpu0: PKG Limit #2: ENabled (96.000000 Watts, 0.000977* sec, clamp DISabled) -cpu0: MSR_PP0_POLICY: 0 -cpu0: MSR_PP0_POWER_LIMIT: 0x00000000 (UNlocked) -cpu0: Cores Limit: DISabled (0.000000 Watts, 0.000977 sec, clamp DISabled) -cpu0: MSR_PP1_POLICY: 0 -cpu0: MSR_PP1_POWER_LIMIT: 0x00000000 (UNlocked) -cpu0: GFX Limit: DISabled (0.000000 Watts, 0.000977 sec, clamp DISabled) -cpu0: MSR_IA32_TEMPERATURE_TARGET: 0x00691400 (105 C) -cpu0: MSR_IA32_PACKAGE_THERM_STATUS: 0x884e0000 (27 C) -cpu0: MSR_IA32_THERM_STATUS: 0x88560000 (19 C +/- 1) -cpu1: MSR_IA32_THERM_STATUS: 0x88560000 (19 C +/- 1) -cpu2: MSR_IA32_THERM_STATUS: 0x88540000 (21 C +/- 1) -cpu3: MSR_IA32_THERM_STATUS: 0x884e0000 (27 C +/- 1) - ... +GenuineIntel 11 CPUID levels; family:model:stepping 0x6:2c:2 (6:44:2) +12 * 133 = 1600 MHz max efficiency +25 * 133 = 3333 MHz TSC frequency +26 * 133 = 3467 MHz max turbo 4 active cores +26 * 133 = 3467 MHz max turbo 3 active cores +27 * 133 = 3600 MHz max turbo 2 active cores +27 * 133 = 3600 MHz max turbo 1 active cores + .fi The \fBmax efficiency\fP frequency, a.k.a. Low Frequency Mode, is the frequency available at the minimum package voltage. The \fBTSC frequency\fP is the nominal @@ -173,7 +142,7 @@ cor CPU %c0 GHz TSC %c1 %c3 %c6 %pc3 %pc6 10 5 1.42 3.43 3.38 2.14 30.99 65.44 10 11 0.16 2.88 3.38 3.40 .fi -Above the cycle soaker drives cpu7 up its 3.6 GHz turbo limit +Above the cycle soaker drives cpu7 up its 3.6 Ghz turbo limit while the other processors are generally in various states of idle. Note that cpu1 and cpu7 are HT siblings within core8. diff --git a/trunk/tools/power/x86/turbostat/turbostat.c b/trunk/tools/power/x86/turbostat/turbostat.c index ce6d46038f74..ea095abbe97e 100644 --- a/trunk/tools/power/x86/turbostat/turbostat.c +++ b/trunk/tools/power/x86/turbostat/turbostat.c @@ -20,7 +20,6 @@ */ #define _GNU_SOURCE -#include #include #include #include @@ -36,18 +35,28 @@ #include #include +#define MSR_NEHALEM_PLATFORM_INFO 0xCE +#define MSR_NEHALEM_TURBO_RATIO_LIMIT 0x1AD +#define MSR_IVT_TURBO_RATIO_LIMIT 0x1AE +#define MSR_APERF 0xE8 +#define MSR_MPERF 0xE7 +#define MSR_PKG_C2_RESIDENCY 0x60D /* SNB only */ +#define MSR_PKG_C3_RESIDENCY 0x3F8 +#define MSR_PKG_C6_RESIDENCY 0x3F9 +#define MSR_PKG_C7_RESIDENCY 0x3FA /* SNB only */ +#define MSR_CORE_C3_RESIDENCY 0x3FC +#define MSR_CORE_C6_RESIDENCY 0x3FD +#define MSR_CORE_C7_RESIDENCY 0x3FE /* SNB only */ + char *proc_stat = "/proc/stat"; unsigned int interval_sec = 5; /* set with -i interval_sec */ unsigned int verbose; /* set with -v */ -unsigned int rapl_verbose; /* set with -R */ -unsigned int thermal_verbose; /* set with -T */ unsigned int summary_only; /* set with -s */ unsigned int skip_c0; unsigned int skip_c1; unsigned int do_nhm_cstates; unsigned int do_snb_cstates; unsigned int has_aperf; -unsigned int has_epb; unsigned int units = 1000000000; /* Ghz etc */ unsigned int genuine_intel; unsigned int has_invariant_tsc; @@ -65,23 +74,6 @@ unsigned int show_cpu; unsigned int show_pkg_only; unsigned int show_core_only; char *output_buffer, *outp; -unsigned int do_rapl; -unsigned int do_dts; -unsigned int do_ptm; -unsigned int tcc_activation_temp; -unsigned int tcc_activation_temp_override; -double rapl_power_units, rapl_energy_units, rapl_time_units; -double rapl_joule_counter_range; - -#define RAPL_PKG (1 << 0) -#define RAPL_CORES (1 << 1) -#define RAPL_GFX (1 << 2) -#define RAPL_DRAM (1 << 3) -#define RAPL_PKG_PERF_STATUS (1 << 4) -#define RAPL_DRAM_PERF_STATUS (1 << 5) -#define TJMAX_DEFAULT 100 - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) int aperf_mperf_unstable; int backwards_count; @@ -109,7 +101,6 @@ struct core_data { unsigned long long c3; unsigned long long c6; unsigned long long c7; - unsigned int core_temp_c; unsigned int core_id; } *core_even, *core_odd; @@ -119,14 +110,6 @@ struct pkg_data { unsigned long long pc6; unsigned long long pc7; unsigned int package_id; - unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ - unsigned int energy_dram; /* MSR_DRAM_ENERGY_STATUS */ - unsigned int energy_cores; /* MSR_PP0_ENERGY_STATUS */ - unsigned int energy_gfx; /* MSR_PP1_ENERGY_STATUS */ - unsigned int rapl_pkg_perf_status; /* MSR_PKG_PERF_STATUS */ - unsigned int rapl_dram_perf_status; /* MSR_DRAM_PERF_STATUS */ - unsigned int pkg_temp_c; - } *package_even, *package_odd; #define ODD_COUNTERS thread_odd, core_odd, package_odd @@ -264,12 +247,6 @@ void print_header(void) outp += sprintf(outp, " %%c6"); if (do_snb_cstates) outp += sprintf(outp, " %%c7"); - - if (do_dts) - outp += sprintf(outp, " CTMP"); - if (do_ptm) - outp += sprintf(outp, " PTMP"); - if (do_snb_cstates) outp += sprintf(outp, " %%pc2"); if (do_nhm_cstates) @@ -279,19 +256,6 @@ void print_header(void) if (do_snb_cstates) outp += sprintf(outp, " %%pc7"); - if (do_rapl & RAPL_PKG) - outp += sprintf(outp, " Pkg_W"); - if (do_rapl & RAPL_CORES) - outp += sprintf(outp, " Cor_W"); - if (do_rapl & RAPL_GFX) - outp += sprintf(outp, " GFX_W"); - if (do_rapl & RAPL_DRAM) - outp += sprintf(outp, " RAM_W"); - if (do_rapl & RAPL_PKG_PERF_STATUS) - outp += sprintf(outp, " PKG_%%"); - if (do_rapl & RAPL_DRAM_PERF_STATUS) - outp += sprintf(outp, " RAM_%%"); - outp += sprintf(outp, "\n"); } @@ -321,7 +285,6 @@ int dump_counters(struct thread_data *t, struct core_data *c, fprintf(stderr, "c3: %016llX\n", c->c3); fprintf(stderr, "c6: %016llX\n", c->c6); fprintf(stderr, "c7: %016llX\n", c->c7); - fprintf(stderr, "DTS: %dC\n", c->core_temp_c); } if (p) { @@ -330,13 +293,6 @@ int dump_counters(struct thread_data *t, struct core_data *c, fprintf(stderr, "pc3: %016llX\n", p->pc3); fprintf(stderr, "pc6: %016llX\n", p->pc6); fprintf(stderr, "pc7: %016llX\n", p->pc7); - fprintf(stderr, "Joules PKG: %0X\n", p->energy_pkg); - fprintf(stderr, "Joules COR: %0X\n", p->energy_cores); - fprintf(stderr, "Joules GFX: %0X\n", p->energy_gfx); - fprintf(stderr, "Joules RAM: %0X\n", p->energy_dram); - fprintf(stderr, "Throttle PKG: %0X\n", p->rapl_pkg_perf_status); - fprintf(stderr, "Throttle RAM: %0X\n", p->rapl_dram_perf_status); - fprintf(stderr, "PTM: %dC\n", p->pkg_temp_c); } return 0; } @@ -346,21 +302,14 @@ int dump_counters(struct thread_data *t, struct core_data *c, * package: "pk" 2 columns %2d * core: "cor" 3 columns %3d * CPU: "CPU" 3 columns %3d - * Pkg_W: %6.2 - * Cor_W: %6.2 - * GFX_W: %5.2 - * RAM_W: %5.2 * GHz: "GHz" 3 columns %3.2 * TSC: "TSC" 3 columns %3.2 * percentage " %pc3" %6.2 - * Perf Status percentage: %5.2 - * "CTMP" 4 columns %4d */ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) { double interval_float; - char *fmt5, *fmt6; /* if showing only 1st thread in core and this isn't one, bail out */ if (show_core_only && !(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) @@ -400,6 +349,7 @@ int format_counters(struct thread_data *t, struct core_data *c, if (show_cpu) outp += sprintf(outp, " %3d", t->cpu_id); } + /* %c0 */ if (do_nhm_cstates) { if (show_pkg || show_core || show_cpu) @@ -464,16 +414,10 @@ int format_counters(struct thread_data *t, struct core_data *c, if (do_snb_cstates) outp += sprintf(outp, " %6.2f", 100.0 * c->c7/t->tsc); - if (do_dts) - outp += sprintf(outp, " %4d", c->core_temp_c); - /* print per-package data only for 1st core in package */ if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) goto done; - if (do_ptm) - outp += sprintf(outp, " %4d", p->pkg_temp_c); - if (do_snb_cstates) outp += sprintf(outp, " %6.2f", 100.0 * p->pc2/t->tsc); if (do_nhm_cstates) @@ -482,32 +426,6 @@ int format_counters(struct thread_data *t, struct core_data *c, outp += sprintf(outp, " %6.2f", 100.0 * p->pc6/t->tsc); if (do_snb_cstates) outp += sprintf(outp, " %6.2f", 100.0 * p->pc7/t->tsc); - - /* - * If measurement interval exceeds minimum RAPL Joule Counter range, - * indicate that results are suspect by printing "**" in fraction place. - */ - if (interval_float < rapl_joule_counter_range) { - fmt5 = " %5.2f"; - fmt6 = " %6.2f"; - } else { - fmt5 = " %3.0f**"; - fmt6 = " %4.0f**"; - } - - if (do_rapl & RAPL_PKG) - outp += sprintf(outp, fmt6, p->energy_pkg * rapl_energy_units / interval_float); - if (do_rapl & RAPL_CORES) - outp += sprintf(outp, fmt6, p->energy_cores * rapl_energy_units / interval_float); - if (do_rapl & RAPL_GFX) - outp += sprintf(outp, fmt5, p->energy_gfx * rapl_energy_units / interval_float); - if (do_rapl & RAPL_DRAM) - outp += sprintf(outp, fmt5, p->energy_dram * rapl_energy_units / interval_float); - if (do_rapl & RAPL_PKG_PERF_STATUS ) - outp += sprintf(outp, fmt5, 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); - if (do_rapl & RAPL_DRAM_PERF_STATUS ) - outp += sprintf(outp, fmt5, 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); - done: outp += sprintf(outp, "\n"); @@ -517,7 +435,6 @@ int format_counters(struct thread_data *t, struct core_data *c, void flush_stdout() { fputs(output_buffer, stdout); - fflush(stdout); outp = output_buffer; } void flush_stderr() @@ -544,13 +461,6 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_ for_all_cpus(format_counters, t, c, p); } -#define DELTA_WRAP32(new, old) \ - if (new > old) { \ - old = new - old; \ - } else { \ - old = 0x100000000 + new - old; \ - } - void delta_package(struct pkg_data *new, struct pkg_data *old) { @@ -558,14 +468,6 @@ delta_package(struct pkg_data *new, struct pkg_data *old) old->pc3 = new->pc3 - old->pc3; old->pc6 = new->pc6 - old->pc6; old->pc7 = new->pc7 - old->pc7; - old->pkg_temp_c = new->pkg_temp_c; - - DELTA_WRAP32(new->energy_pkg, old->energy_pkg); - DELTA_WRAP32(new->energy_cores, old->energy_cores); - DELTA_WRAP32(new->energy_gfx, old->energy_gfx); - DELTA_WRAP32(new->energy_dram, old->energy_dram); - DELTA_WRAP32(new->rapl_pkg_perf_status, old->rapl_pkg_perf_status); - DELTA_WRAP32(new->rapl_dram_perf_status, old->rapl_dram_perf_status); } void @@ -574,7 +476,6 @@ delta_core(struct core_data *new, struct core_data *old) old->c3 = new->c3 - old->c3; old->c6 = new->c6 - old->c6; old->c7 = new->c7 - old->c7; - old->core_temp_c = new->core_temp_c; } /* @@ -681,20 +582,11 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data c->c3 = 0; c->c6 = 0; c->c7 = 0; - c->core_temp_c = 0; p->pc2 = 0; p->pc3 = 0; p->pc6 = 0; p->pc7 = 0; - - p->energy_pkg = 0; - p->energy_dram = 0; - p->energy_cores = 0; - p->energy_gfx = 0; - p->rapl_pkg_perf_status = 0; - p->rapl_dram_perf_status = 0; - p->pkg_temp_c = 0; } int sum_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) @@ -715,8 +607,6 @@ int sum_counters(struct thread_data *t, struct core_data *c, average.cores.c6 += c->c6; average.cores.c7 += c->c7; - average.cores.core_temp_c = MAX(average.cores.core_temp_c, c->core_temp_c); - /* sum per-pkg values only for 1st core in pkg */ if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) return 0; @@ -726,15 +616,6 @@ int sum_counters(struct thread_data *t, struct core_data *c, average.packages.pc6 += p->pc6; average.packages.pc7 += p->pc7; - average.packages.energy_pkg += p->energy_pkg; - average.packages.energy_dram += p->energy_dram; - average.packages.energy_cores += p->energy_cores; - average.packages.energy_gfx += p->energy_gfx; - - average.packages.pkg_temp_c = MAX(average.packages.pkg_temp_c, p->pkg_temp_c); - - average.packages.rapl_pkg_perf_status += p->rapl_pkg_perf_status; - average.packages.rapl_dram_perf_status += p->rapl_dram_perf_status; return 0; } /* @@ -786,26 +667,23 @@ static unsigned long long rdtsc(void) int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) { int cpu = t->cpu_id; - unsigned long long msr; - if (cpu_migrate(cpu)) { - fprintf(stderr, "Could not migrate to CPU %d\n", cpu); + if (cpu_migrate(cpu)) return -1; - } t->tsc = rdtsc(); /* we are running on local CPU of interest */ if (has_aperf) { - if (get_msr(cpu, MSR_IA32_APERF, &t->aperf)) + if (get_msr(cpu, MSR_APERF, &t->aperf)) return -3; - if (get_msr(cpu, MSR_IA32_MPERF, &t->mperf)) + if (get_msr(cpu, MSR_MPERF, &t->mperf)) return -4; } if (extra_delta_offset32) { - if (get_msr(cpu, extra_delta_offset32, &msr)) + if (get_msr(cpu, extra_delta_offset32, &t->extra_delta32)) return -5; - t->extra_delta32 = msr & 0xFFFFFFFF; + t->extra_delta32 &= 0xFFFFFFFF; } if (extra_delta_offset64) @@ -813,9 +691,9 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) return -5; if (extra_msr_offset32) { - if (get_msr(cpu, extra_msr_offset32, &msr)) + if (get_msr(cpu, extra_msr_offset32, &t->extra_msr32)) return -5; - t->extra_msr32 = msr & 0xFFFFFFFF; + t->extra_msr32 &= 0xFFFFFFFF; } if (extra_msr_offset64) @@ -837,13 +715,6 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) if (get_msr(cpu, MSR_CORE_C7_RESIDENCY, &c->c7)) return -8; - if (do_dts) { - if (get_msr(cpu, MSR_IA32_THERM_STATUS, &msr)) - return -9; - c->core_temp_c = tcc_activation_temp - ((msr >> 16) & 0x7F); - } - - /* collect package counters only for 1st core in package */ if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) return 0; @@ -860,41 +731,6 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) if (get_msr(cpu, MSR_PKG_C7_RESIDENCY, &p->pc7)) return -12; } - if (do_rapl & RAPL_PKG) { - if (get_msr(cpu, MSR_PKG_ENERGY_STATUS, &msr)) - return -13; - p->energy_pkg = msr & 0xFFFFFFFF; - } - if (do_rapl & RAPL_CORES) { - if (get_msr(cpu, MSR_PP0_ENERGY_STATUS, &msr)) - return -14; - p->energy_cores = msr & 0xFFFFFFFF; - } - if (do_rapl & RAPL_DRAM) { - if (get_msr(cpu, MSR_DRAM_ENERGY_STATUS, &msr)) - return -15; - p->energy_dram = msr & 0xFFFFFFFF; - } - if (do_rapl & RAPL_GFX) { - if (get_msr(cpu, MSR_PP1_ENERGY_STATUS, &msr)) - return -16; - p->energy_gfx = msr & 0xFFFFFFFF; - } - if (do_rapl & RAPL_PKG_PERF_STATUS) { - if (get_msr(cpu, MSR_PKG_PERF_STATUS, &msr)) - return -16; - p->rapl_pkg_perf_status = msr & 0xFFFFFFFF; - } - if (do_rapl & RAPL_DRAM_PERF_STATUS) { - if (get_msr(cpu, MSR_DRAM_PERF_STATUS, &msr)) - return -16; - p->rapl_dram_perf_status = msr & 0xFFFFFFFF; - } - if (do_ptm) { - if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_STATUS, &msr)) - return -17; - p->pkg_temp_c = tcc_activation_temp - ((msr >> 16) & 0x7F); - } return 0; } @@ -906,10 +742,10 @@ void print_verbose_header(void) if (!do_nehalem_platform_info) return; - get_msr(0, MSR_NHM_PLATFORM_INFO, &msr); + get_msr(0, MSR_NEHALEM_PLATFORM_INFO, &msr); - if (verbose) - fprintf(stderr, "cpu0: MSR_NHM_PLATFORM_INFO: 0x%08llx\n", msr); + if (verbose > 1) + fprintf(stderr, "MSR_NEHALEM_PLATFORM_INFO: 0x%llx\n", msr); ratio = (msr >> 40) & 0xFF; fprintf(stderr, "%d * %.0f = %.0f MHz max efficiency\n", @@ -924,8 +760,8 @@ void print_verbose_header(void) get_msr(0, MSR_IVT_TURBO_RATIO_LIMIT, &msr); - if (verbose) - fprintf(stderr, "cpu0: MSR_IVT_TURBO_RATIO_LIMIT: 0x%08llx\n", msr); + if (verbose > 1) + fprintf(stderr, "MSR_IVT_TURBO_RATIO_LIMIT: 0x%llx\n", msr); ratio = (msr >> 56) & 0xFF; if (ratio) @@ -968,56 +804,14 @@ void print_verbose_header(void) ratio, bclk, ratio * bclk); print_nhm_turbo_ratio_limits: - get_msr(0, MSR_NHM_SNB_PKG_CST_CFG_CTL, &msr); - -#define SNB_C1_AUTO_UNDEMOTE (1UL << 27) -#define SNB_C3_AUTO_UNDEMOTE (1UL << 28) - - fprintf(stderr, "cpu0: MSR_NHM_SNB_PKG_CST_CFG_CTL: 0x%08llx", msr); - - fprintf(stderr, " (%s%s%s%s%slocked: pkg-cstate-limit=%d: ", - (msr & SNB_C3_AUTO_UNDEMOTE) ? "UNdemote-C3, " : "", - (msr & SNB_C1_AUTO_UNDEMOTE) ? "UNdemote-C1, " : "", - (msr & NHM_C3_AUTO_DEMOTE) ? "demote-C3, " : "", - (msr & NHM_C1_AUTO_DEMOTE) ? "demote-C1, " : "", - (msr & (1 << 15)) ? "" : "UN", - (unsigned int)msr & 7); - - - switch(msr & 0x7) { - case 0: - fprintf(stderr, "pc0"); - break; - case 1: - fprintf(stderr, do_snb_cstates ? "pc2" : "pc0"); - break; - case 2: - fprintf(stderr, do_snb_cstates ? "pc6-noret" : "pc3"); - break; - case 3: - fprintf(stderr, "pc6"); - break; - case 4: - fprintf(stderr, "pc7"); - break; - case 5: - fprintf(stderr, do_snb_cstates ? "pc7s" : "invalid"); - break; - case 7: - fprintf(stderr, "unlimited"); - break; - default: - fprintf(stderr, "invalid"); - } - fprintf(stderr, ")\n"); if (!do_nehalem_turbo_ratio_limit) return; - get_msr(0, MSR_NHM_TURBO_RATIO_LIMIT, &msr); + get_msr(0, MSR_NEHALEM_TURBO_RATIO_LIMIT, &msr); - if (verbose) - fprintf(stderr, "cpu0: MSR_NHM_TURBO_RATIO_LIMIT: 0x%08llx\n", msr); + if (verbose > 1) + fprintf(stderr, "MSR_NEHALEM_TURBO_RATIO_LIMIT: 0x%llx\n", msr); ratio = (msr >> 56) & 0xFF; if (ratio) @@ -1306,22 +1100,15 @@ int mark_cpu_present(int cpu) void turbostat_loop() { int retval; - int restarted = 0; restart: - restarted++; - retval = for_all_cpus(get_counters, EVEN_COUNTERS); if (retval < -1) { exit(retval); } else if (retval == -1) { - if (restarted > 1) { - exit(retval); - } re_initialize(); goto restart; } - restarted = 0; gettimeofday(&tv_even, (struct timezone *)NULL); while (1) { @@ -1420,299 +1207,6 @@ int has_ivt_turbo_ratio_limit(unsigned int family, unsigned int model) } } -/* - * print_epb() - * Decode the ENERGY_PERF_BIAS MSR - */ -int print_epb(struct thread_data *t, struct core_data *c, struct pkg_data *p) -{ - unsigned long long msr; - char *epb_string; - int cpu; - - if (!has_epb) - return 0; - - cpu = t->cpu_id; - - /* EPB is per-package */ - if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE) || !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) - return 0; - - if (cpu_migrate(cpu)) { - fprintf(stderr, "Could not migrate to CPU %d\n", cpu); - return -1; - } - - if (get_msr(cpu, MSR_IA32_ENERGY_PERF_BIAS, &msr)) - return 0; - - switch (msr & 0x7) { - case ENERGY_PERF_BIAS_PERFORMANCE: - epb_string = "performance"; - break; - case ENERGY_PERF_BIAS_NORMAL: - epb_string = "balanced"; - break; - case ENERGY_PERF_BIAS_POWERSAVE: - epb_string = "powersave"; - break; - default: - epb_string = "custom"; - break; - } - fprintf(stderr, "cpu%d: MSR_IA32_ENERGY_PERF_BIAS: 0x%08llx (%s)\n", cpu, msr, epb_string); - - return 0; -} - -#define RAPL_POWER_GRANULARITY 0x7FFF /* 15 bit power granularity */ -#define RAPL_TIME_GRANULARITY 0x3F /* 6 bit time granularity */ - -/* - * rapl_probe() - * - * sets do_rapl - */ -void rapl_probe(unsigned int family, unsigned int model) -{ - unsigned long long msr; - double tdp; - - if (!genuine_intel) - return; - - if (family != 6) - return; - - switch (model) { - case 0x2A: - case 0x3A: - do_rapl = RAPL_PKG | RAPL_CORES | RAPL_GFX; - break; - case 0x2D: - case 0x3E: - do_rapl = RAPL_PKG | RAPL_CORES | RAPL_DRAM | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS; - break; - default: - return; - } - - /* units on package 0, verify later other packages match */ - if (get_msr(0, MSR_RAPL_POWER_UNIT, &msr)) - return; - - rapl_power_units = 1.0 / (1 << (msr & 0xF)); - rapl_energy_units = 1.0 / (1 << (msr >> 8 & 0x1F)); - rapl_time_units = 1.0 / (1 << (msr >> 16 & 0xF)); - - /* get TDP to determine energy counter range */ - if (get_msr(0, MSR_PKG_POWER_INFO, &msr)) - return; - - tdp = ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units; - - rapl_joule_counter_range = 0xFFFFFFFF * rapl_energy_units / tdp; - - if (verbose) - fprintf(stderr, "RAPL: %.0f sec. Joule Counter Range\n", rapl_joule_counter_range); - - return; -} - -int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p) -{ - unsigned long long msr; - unsigned int dts; - int cpu; - - if (!(do_dts || do_ptm)) - return 0; - - cpu = t->cpu_id; - - /* DTS is per-core, no need to print for each thread */ - if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) - return 0; - - if (cpu_migrate(cpu)) { - fprintf(stderr, "Could not migrate to CPU %d\n", cpu); - return -1; - } - - if (do_ptm && (t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) { - if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_STATUS, &msr)) - return 0; - - dts = (msr >> 16) & 0x7F; - fprintf(stderr, "cpu%d: MSR_IA32_PACKAGE_THERM_STATUS: 0x%08llx (%d C)\n", - cpu, msr, tcc_activation_temp - dts); - -#ifdef THERM_DEBUG - if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT, &msr)) - return 0; - - dts = (msr >> 16) & 0x7F; - dts2 = (msr >> 8) & 0x7F; - fprintf(stderr, "cpu%d: MSR_IA32_PACKAGE_THERM_INTERRUPT: 0x%08llx (%d C, %d C)\n", - cpu, msr, tcc_activation_temp - dts, tcc_activation_temp - dts2); -#endif - } - - - if (do_dts) { - unsigned int resolution; - - if (get_msr(cpu, MSR_IA32_THERM_STATUS, &msr)) - return 0; - - dts = (msr >> 16) & 0x7F; - resolution = (msr >> 27) & 0xF; - fprintf(stderr, "cpu%d: MSR_IA32_THERM_STATUS: 0x%08llx (%d C +/- %d)\n", - cpu, msr, tcc_activation_temp - dts, resolution); - -#ifdef THERM_DEBUG - if (get_msr(cpu, MSR_IA32_THERM_INTERRUPT, &msr)) - return 0; - - dts = (msr >> 16) & 0x7F; - dts2 = (msr >> 8) & 0x7F; - fprintf(stderr, "cpu%d: MSR_IA32_THERM_INTERRUPT: 0x%08llx (%d C, %d C)\n", - cpu, msr, tcc_activation_temp - dts, tcc_activation_temp - dts2); -#endif - } - - return 0; -} - -void print_power_limit_msr(int cpu, unsigned long long msr, char *label) -{ - fprintf(stderr, "cpu%d: %s: %sabled (%f Watts, %f sec, clamp %sabled)\n", - cpu, label, - ((msr >> 15) & 1) ? "EN" : "DIS", - ((msr >> 0) & 0x7FFF) * rapl_power_units, - (1.0 + (((msr >> 22) & 0x3)/4.0)) * (1 << ((msr >> 17) & 0x1F)) * rapl_time_units, - (((msr >> 16) & 1) ? "EN" : "DIS")); - - return; -} - -int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) -{ - unsigned long long msr; - int cpu; - double local_rapl_power_units, local_rapl_energy_units, local_rapl_time_units; - - if (!do_rapl) - return 0; - - /* RAPL counters are per package, so print only for 1st thread/package */ - if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE) || !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) - return 0; - - cpu = t->cpu_id; - if (cpu_migrate(cpu)) { - fprintf(stderr, "Could not migrate to CPU %d\n", cpu); - return -1; - } - - if (get_msr(cpu, MSR_RAPL_POWER_UNIT, &msr)) - return -1; - - local_rapl_power_units = 1.0 / (1 << (msr & 0xF)); - local_rapl_energy_units = 1.0 / (1 << (msr >> 8 & 0x1F)); - local_rapl_time_units = 1.0 / (1 << (msr >> 16 & 0xF)); - - if (local_rapl_power_units != rapl_power_units) - fprintf(stderr, "cpu%d, ERROR: Power units mis-match\n", cpu); - if (local_rapl_energy_units != rapl_energy_units) - fprintf(stderr, "cpu%d, ERROR: Energy units mis-match\n", cpu); - if (local_rapl_time_units != rapl_time_units) - fprintf(stderr, "cpu%d, ERROR: Time units mis-match\n", cpu); - - if (verbose) { - fprintf(stderr, "cpu%d: MSR_RAPL_POWER_UNIT: 0x%08llx " - "(%f Watts, %f Joules, %f sec.)\n", cpu, msr, - local_rapl_power_units, local_rapl_energy_units, local_rapl_time_units); - } - if (do_rapl & RAPL_PKG) { - if (get_msr(cpu, MSR_PKG_POWER_INFO, &msr)) - return -5; - - - fprintf(stderr, "cpu%d: MSR_PKG_POWER_INFO: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", - cpu, msr, - ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); - - if (get_msr(cpu, MSR_PKG_POWER_LIMIT, &msr)) - return -9; - - fprintf(stderr, "cpu%d: MSR_PKG_POWER_LIMIT: 0x%08llx (%slocked)\n", - cpu, msr, (msr >> 63) & 1 ? "": "UN"); - - print_power_limit_msr(cpu, msr, "PKG Limit #1"); - fprintf(stderr, "cpu%d: PKG Limit #2: %sabled (%f Watts, %f* sec, clamp %sabled)\n", - cpu, - ((msr >> 47) & 1) ? "EN" : "DIS", - ((msr >> 32) & 0x7FFF) * rapl_power_units, - (1.0 + (((msr >> 54) & 0x3)/4.0)) * (1 << ((msr >> 49) & 0x1F)) * rapl_time_units, - ((msr >> 48) & 1) ? "EN" : "DIS"); - } - - if (do_rapl & RAPL_DRAM) { - if (get_msr(cpu, MSR_DRAM_POWER_INFO, &msr)) - return -6; - - - fprintf(stderr, "cpu%d: MSR_DRAM_POWER_INFO,: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", - cpu, msr, - ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, - ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); - - - if (get_msr(cpu, MSR_DRAM_POWER_LIMIT, &msr)) - return -9; - fprintf(stderr, "cpu%d: MSR_DRAM_POWER_LIMIT: 0x%08llx (%slocked)\n", - cpu, msr, (msr >> 31) & 1 ? "": "UN"); - - print_power_limit_msr(cpu, msr, "DRAM Limit"); - } - if (do_rapl & RAPL_CORES) { - if (verbose) { - if (get_msr(cpu, MSR_PP0_POLICY, &msr)) - return -7; - - fprintf(stderr, "cpu%d: MSR_PP0_POLICY: %lld\n", cpu, msr & 0xF); - - if (get_msr(cpu, MSR_PP0_POWER_LIMIT, &msr)) - return -9; - fprintf(stderr, "cpu%d: MSR_PP0_POWER_LIMIT: 0x%08llx (%slocked)\n", - cpu, msr, (msr >> 31) & 1 ? "": "UN"); - print_power_limit_msr(cpu, msr, "Cores Limit"); - } - } - if (do_rapl & RAPL_GFX) { - if (verbose) { - if (get_msr(cpu, MSR_PP1_POLICY, &msr)) - return -8; - - fprintf(stderr, "cpu%d: MSR_PP1_POLICY: %lld\n", cpu, msr & 0xF); - - if (get_msr(cpu, MSR_PP1_POWER_LIMIT, &msr)) - return -9; - fprintf(stderr, "cpu%d: MSR_PP1_POWER_LIMIT: 0x%08llx (%slocked)\n", - cpu, msr, (msr >> 31) & 1 ? "": "UN"); - print_power_limit_msr(cpu, msr, "GFX Limit"); - } - } - return 0; -} - int is_snb(unsigned int family, unsigned int model) { @@ -1737,72 +1231,6 @@ double discover_bclk(unsigned int family, unsigned int model) return 133.33; } -/* - * MSR_IA32_TEMPERATURE_TARGET indicates the temperature where - * the Thermal Control Circuit (TCC) activates. - * This is usually equal to tjMax. - * - * Older processors do not have this MSR, so there we guess, - * but also allow cmdline over-ride with -T. - * - * Several MSR temperature values are in units of degrees-C - * below this value, including the Digital Thermal Sensor (DTS), - * Package Thermal Management Sensor (PTM), and thermal event thresholds. - */ -int set_temperature_target(struct thread_data *t, struct core_data *c, struct pkg_data *p) -{ - unsigned long long msr; - unsigned int target_c_local; - int cpu; - - /* tcc_activation_temp is used only for dts or ptm */ - if (!(do_dts || do_ptm)) - return 0; - - /* this is a per-package concept */ - if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE) || !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) - return 0; - - cpu = t->cpu_id; - if (cpu_migrate(cpu)) { - fprintf(stderr, "Could not migrate to CPU %d\n", cpu); - return -1; - } - - if (tcc_activation_temp_override != 0) { - tcc_activation_temp = tcc_activation_temp_override; - fprintf(stderr, "cpu%d: Using cmdline TCC Target (%d C)\n", - cpu, tcc_activation_temp); - return 0; - } - - /* Temperature Target MSR is Nehalem and newer only */ - if (!do_nehalem_platform_info) - goto guess; - - if (get_msr(0, MSR_IA32_TEMPERATURE_TARGET, &msr)) - goto guess; - - target_c_local = (msr >> 16) & 0x7F; - - if (verbose) - fprintf(stderr, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C)\n", - cpu, msr, target_c_local); - - if (target_c_local < 85 || target_c_local > 120) - goto guess; - - tcc_activation_temp = target_c_local; - - return 0; - -guess: - tcc_activation_temp = TJMAX_DEFAULT; - fprintf(stderr, "cpu%d: Guessing tjMax %d C, Please use -T to specify\n", - cpu, tcc_activation_temp); - - return 0; -} void check_cpuid() { unsigned int eax, ebx, ecx, edx, max_level; @@ -1816,7 +1244,7 @@ void check_cpuid() genuine_intel = 1; if (verbose) - fprintf(stderr, "CPUID(0): %.4s%.4s%.4s ", + fprintf(stderr, "%.4s%.4s%.4s ", (char *)&ebx, (char *)&edx, (char *)&ecx); asm("cpuid" : "=a" (fms), "=c" (ecx), "=d" (edx) : "a" (1) : "ebx"); @@ -1867,19 +1295,10 @@ void check_cpuid() asm("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (0x6)); has_aperf = ecx & (1 << 0); - do_dts = eax & (1 << 0); - do_ptm = eax & (1 << 6); - has_epb = ecx & (1 << 3); - - if (verbose) - fprintf(stderr, "CPUID(6): %s%s%s%s\n", - has_aperf ? "APERF" : "No APERF!", - do_dts ? ", DTS" : "", - do_ptm ? ", PTM": "", - has_epb ? ", EPB": ""); - - if (!has_aperf) - exit(-1); + if (!has_aperf) { + fprintf(stderr, "No APERF MSR\n"); + exit(1); + } do_nehalem_platform_info = genuine_intel && has_invariant_tsc; do_nhm_cstates = genuine_intel; /* all Intel w/ non-stop TSC have NHM counters */ @@ -1888,15 +1307,12 @@ void check_cpuid() do_nehalem_turbo_ratio_limit = has_nehalem_turbo_ratio_limit(family, model); do_ivt_turbo_ratio_limit = has_ivt_turbo_ratio_limit(family, model); - rapl_probe(family, model); - - return; } void usage() { - fprintf(stderr, "%s: [-v][-R][-T][-p|-P|-S][-c MSR# | -s]][-C MSR#][-m MSR#][-M MSR#][-i interval_sec | command ...]\n", + fprintf(stderr, "%s: [-v][-p|-P|-S][-c MSR# | -s]][-C MSR#][-m MSR#][-M MSR#][-i interval_sec | command ...]\n", progname); exit(1); } @@ -2132,17 +1548,6 @@ void turbostat_init() if (verbose) print_verbose_header(); - - if (verbose) - for_all_cpus(print_epb, ODD_COUNTERS); - - if (verbose) - for_all_cpus(print_rapl, ODD_COUNTERS); - - for_all_cpus(set_temperature_target, ODD_COUNTERS); - - if (verbose) - for_all_cpus(print_thermal, ODD_COUNTERS); } int fork_it(char **argv) @@ -2199,7 +1604,7 @@ void cmdline(int argc, char **argv) progname = argv[0]; - while ((opt = getopt(argc, argv, "+pPSvi:sc:sC:m:M:RT:")) != -1) { + while ((opt = getopt(argc, argv, "+pPSvi:sc:sC:m:M:")) != -1) { switch (opt) { case 'p': show_core_only++; @@ -2231,12 +1636,6 @@ void cmdline(int argc, char **argv) case 'M': sscanf(optarg, "%x", &extra_msr_offset64); break; - case 'R': - rapl_verbose++; - break; - case 'T': - tcc_activation_temp_override = atoi(optarg); - break; default: usage(); } @@ -2247,8 +1646,8 @@ int main(int argc, char **argv) { cmdline(argc, argv); - if (verbose) - fprintf(stderr, "turbostat v3.0 November 23, 2012" + if (verbose > 1) + fprintf(stderr, "turbostat v2.1 October 6, 2012" " - Len Brown \n"); turbostat_init(); diff --git a/trunk/tools/power/x86/x86_energy_perf_policy/Makefile b/trunk/tools/power/x86/x86_energy_perf_policy/Makefile index 971c9ffdcb50..f458237fdd79 100644 --- a/trunk/tools/power/x86/x86_energy_perf_policy/Makefile +++ b/trunk/tools/power/x86/x86_energy_perf_policy/Makefile @@ -1,10 +1,8 @@ -DESTDIR ?= - x86_energy_perf_policy : x86_energy_perf_policy.c clean : rm -f x86_energy_perf_policy install : - install x86_energy_perf_policy ${DESTDIR}/usr/bin/ - install x86_energy_perf_policy.8 ${DESTDIR}/usr/share/man/man8/ + install x86_energy_perf_policy /usr/bin/ + install x86_energy_perf_policy.8 /usr/share/man/man8/ diff --git a/trunk/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c b/trunk/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c index 40b3e5482f8a..33c5c7ee148f 100644 --- a/trunk/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +++ b/trunk/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c @@ -289,7 +289,7 @@ void for_every_cpu(void (func)(int)) "cpu%u %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d\n", &cpu); if (retval != 1) - break; + return; func(cpu); }