From 648cd9e8198c235ca8d123856877a673522a80f3 Mon Sep 17 00:00:00 2001 From: radek Date: Wed, 16 Sep 2009 10:28:20 +0000 Subject: [PATCH] - release 44: -2.6.30.patch, source: http://dev.exine.eu.org/2009/08/24/acerhk-dla-jadra-systemu-2-6-30/ Changed files: acerhk-2.6.30.patch -> 1.1 acerhk.spec -> 1.59 --- acerhk-2.6.30.patch | 510 ++++++++++++++++++++++++++++++++++++++++++++ acerhk.spec | 4 +- 2 files changed, 513 insertions(+), 1 deletion(-) create mode 100644 acerhk-2.6.30.patch diff --git a/acerhk-2.6.30.patch b/acerhk-2.6.30.patch new file mode 100644 index 0000000..5195913 --- /dev/null +++ b/acerhk-2.6.30.patch @@ -0,0 +1,510 @@ +--- acerhk-0.5.35/acerhk.c 2007-02-10 16:46:23.000000000 +0100 ++++ acerhk/acerhk.c 2009-07-02 23:48:23.000000000 +0200 +@@ -2,14 +2,14 @@ + * Filename: acerhk.c + * Version: 0.5 + * +- * Copyright (C) 2002-2006, Olaf Tauber (olaf-tauber@versanet.de) ++ * Copyright (C) 2002-2007, Olaf Tauber (olaf-tauber@versanet.de) + * + * Description: kernel driver for Acer Travelmate and similar + * laptops special keys + * Author: Olaf Tauber + * Created at: Mon Apr 29 22:16:42 2002 +- * Modified at: Mon Oct 16 21:36:44 2006 +- * Modified by: Olaf Tauber ++ * Modified at: Mon Nov 12 20:53:56 2007 ++ * Modified by: Olaf Tauber + * Modified at: Thu Nov 24 13:03:01 2005 + * Modified by: Antonio Cuni + * Modified at: Wed Oct 27 19:47:11 CEST 2004 +@@ -63,6 +63,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -550,6 +551,7 @@ + */ + static asmlinkage void call_bios_6xx(struct register_buffer *buf) + { ++#ifndef __x86_64__ + if (bios_routine) { + local_irq_disable(); + __asm__ __volatile__( +@@ -578,10 +580,12 @@ + ); + local_irq_enable(); + } ++#endif + } + + static asmlinkage void call_bios_52x(struct register_buffer *buf) + { ++#ifndef __x86_64__ + if (bios_routine) { + local_irq_disable(); + __asm__ __volatile__( +@@ -611,6 +615,7 @@ + ); + local_irq_enable(); + } ++#endif + } + + #define PRINT_BUFFER(x) \ +@@ -783,7 +788,8 @@ + unsigned char c = 0; + + spin_lock_irqsave (&rtc_lock, flags); +-#ifndef DUMMYHW ++/* #ifndef DUMMYHW */ ++#if !(defined(DUMMYHW) || defined(__x86_64__)) + if (cmos_index) + c = CMOS_READ(cmos_index); + else if (verbose > 3) +@@ -867,9 +873,9 @@ + + static struct proc_dir_entry *proc_acer_dir; + +-static unsigned int __init find_hk_area(void) ++static unsigned long __init find_hk_area(void) + { +- int offset, sig; ++ long offset, sig; + unsigned int fkt; + fkt = 0; + sig = -1; /* offset to signature in io area */ +@@ -887,9 +893,9 @@ + fkt = readl(reg1 + sig + 5); + /* adjust fkt to address of mapped IO area */ + if (fkt >= 0xf0000) +- fkt = (unsigned int)reg1 + fkt - 0xf0000; ++ fkt = (unsigned long)reg1 + fkt - 0xf0000; + else if (fkt >= 0xe0000) +- fkt = (unsigned int)reg1 + fkt - 0xe0000; ++ fkt = (unsigned long)reg1 + fkt - 0xe0000; + else + fkt = 0; + } +@@ -1144,6 +1150,7 @@ + case 2000: + case 2010: + case 2020: ++ case 5100: + /* Aspire 13xx series laptops use dritek hardware, no + acerhk-mapping needed + VolUp and VolDown are managed as normal keys +@@ -1231,6 +1238,17 @@ + acerhk_key2name[5] = k_display; /* FN+F3 (Display switch) */ + acerhk_key2name[6] = k_res; /* FN+F4 (Display ein/ausschalten) */ + break; ++ case 97600: ++ /* Medion MD97600, 7 keys, no setup */ ++ acerhk_key2name[1] = k_help; /* FN+F1 (Help) */ ++ acerhk_key2name[2] = k_none; ++ acerhk_key2name[5] = k_display; /* FN+F3 (Display switch) */ ++ acerhk_key2name[6] = k_res; /* FN+F4 (Display ein/ausschalten) */ ++ acerhk_key2name[17] = k_p1; ++ acerhk_key2name[18] = k_p2; ++ acerhk_key2name[19] = k_p3; ++ acerhk_key2name[48] = k_wireless; ++ break; + case 42200: + /* Medion MD42200, 7 keys, no setup */ + acerhk_key2name[2] = k_none; +@@ -1288,6 +1306,22 @@ + acerhk_key2name[19] = k_p3; + acerhk_key2name[8] = k_mute; + break; ++ case 6805: /* Added by damagedspline@aim.com */ ++ /* Amilo A1xxx does not have Setup key nor a mail key */ ++ acerhk_key2name[2] = k_none; ++ acerhk_key2name[54] = k_www; ++ acerhk_key2name[5] = k_display; ++ acerhk_key2name[110] = k_setup; //This is the Fancy Fan (cool-n'-quiet) key on A1650g ++ acerhk_key2name[48] = k_wireless; ++ break; ++ case 98200: ++ /* Medion MD98200, 4 keys, no setup */ ++ acerhk_key2name[2] = k_none; ++ acerhk_key2name[48] = k_wireless; ++ acerhk_key2name[0x79] = k_play; ++ acerhk_key2name[17] = k_p1; ++ acerhk_key2name[18] = k_p2; ++ break; + } + } + +@@ -1313,11 +1347,24 @@ + acerhk_model_features = 0x00f00000; + acerhk_type = TM_new; + break; ++ case 97600: ++ /* has WLAN button */ ++ /* The MD97600 seems to require TM_F_CONNECT at least ++ once after cold boot, otherwise enabling the WLAN ++ radio does not work */ ++ acerhk_model_features = TM_F_WBUTTON | TM_F_CONNECT; ++ acerhk_type = TM_new; ++ break; + case 42200: /* Medion MD42200 */ + /* has WLAN button, should call connect() */ + acerhk_model_features = TM_F_WBUTTON | TM_F_CONNECT; + acerhk_type = TM_old; + break; ++ case 98200: /* Medion MD98200 */ ++ /* has WLAN button, should call connect() */ ++ acerhk_model_features = TM_F_WBUTTON; ++ acerhk_type = TM_old; ++ break; + case 9783: /* Medion MD9783 */ + /* only email led */ + acerhk_model_features = TM_F_MAIL_LED; +@@ -1363,6 +1410,11 @@ + acerhk_model_features = TM_F_MAIL_LED | 0x00f00000; + acerhk_type = TM_new; + break; ++ case 6805: /* Added by damagedspline@aim.com */ ++ /* Amilo A1xxx does not have a mail led */ ++ acerhk_model_features = 0x00f00000; ++ acerhk_type = TM_new; ++ break; + case 2350: + case 4050: + acerhk_wlan_state = 1; // Default state is on +@@ -1458,6 +1510,7 @@ + case 1800: + case 2010: + case 2020: ++ case 5100: + /* Dritek EC, bluetooth, wifi, mail */ + acerhk_type = TM_dritek; + acerhk_model_features = TM_F_MAIL_LED_EC2 | TM_F_WLAN_EC2 | TM_F_BLUE_EC2; +@@ -1792,6 +1845,8 @@ + break; + case '2': series = 5020; break; + } ++ } else if (str[8] == '1' && str[9] == '0') { ++ series = 5100; + } else { + if (verbose > 1) + printk(KERN_INFO"acerhk: model string indicates unknown Aspire 5xxx series\n"); +@@ -1854,6 +1909,15 @@ + printk(KERN_INFO"acerhk: model string indicates FS AMILO Pro (V2000) series\n"); + series = 7400; + break; ++ case 'A': /* AMILO Axxxx - added by damagedspline@aim.com */ ++ switch (str[7]) { ++ case '1': /* AMILO A1xxx */ ++ if (verbose > 1) ++ printk(KERN_INFO"acerhk: model string indicates FS AMILO A1xxx series\n"); ++ series = 6805; ++ break; ++ }; ++ break; + default: + if (verbose > 1) + printk(KERN_INFO"acerhk: model string indicates unknown FS AMILO XX series\n"); +@@ -1862,7 +1926,11 @@ + } + else if (strncmp(str, "MEDIONPC", 8) == 0) { + uint medionmodel; +- if ((medionmodel = COLUSSI("WIM 2040", 4, reg1, AREA_SIZE)) >= 0) { ++ if ((medionmodel = COLUSSI("WIM 2090", 8, reg1, AREA_SIZE)) >= 0) { ++ printk(KERN_INFO"acerhk: found Medion model string:'%s'\n", (char*)reg1+medionmodel); ++ series = 97600; ++ } ++ else if ((medionmodel = COLUSSI("WIM 2040", 4, reg1, AREA_SIZE)) >= 0) { + printk(KERN_INFO"acerhk: found Medion model string:'%s'\n", (char*)reg1+medionmodel); + series = 96500; + } else { +@@ -1893,6 +1961,12 @@ + printk(KERN_INFO"acerhk: model string indicates a medion MD40100\n"); + series = 40100; + } ++ } else if (strncmp(str, "MEDION", 6) == 0) { ++ if (COLUSSI("WIM2120", 7, reg1, AREA_SIZE) >= 0) { ++ if (verbose>1) ++ printk(KERN_INFO"acerhk: model string indicates a Medion MD 98200\n"); ++ series = 98200; ++ } + } else if (strncmp(str, "AOpen", 5) == 0) { + if (strncmp(str, "AOpen*EzRestore", 15) == 0) { + if (verbose > 1) +@@ -2117,7 +2191,8 @@ + /* polling timer handler */ + static void acerhk_poll_event(unsigned long save_size) + { +-#ifndef DUMMYHW ++/* #ifndef DUMMYHW */ ++#if !(defined(DUMMYHW) || defined(__x86_64__)) + unsigned int max = MAX_POLLING_LOOPS; + /* make sure not to loop more then 32 times */ + if (!max || max > 32) +@@ -2139,7 +2214,8 @@ + { + if (acerhk_blueled_blinking != -1) { + acerhk_blueled_blinking = !acerhk_blueled_blinking; +-#ifndef DUMMYHW ++/* #ifndef DUMMYHW */ ++#if !(defined(DUMMYHW) || defined(__x86_64__)) + wbutton_fct_1(acerhk_blueled_blinking); + #endif + acerhk_timer_blinking.expires = jiffies + acerhk_blueled_blinking_delay; +@@ -2626,7 +2702,9 @@ + printk(KERN_INFO"acerhk: could not create /proc/driver/acerhk\n"); + } + else { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + proc_acer_dir->owner = THIS_MODULE; ++#endif + /* now create several files, first general info ... */ + entry = create_proc_read_entry("info", + 0444, proc_acer_dir, acerhk_proc_info, NULL); +@@ -2635,7 +2713,9 @@ + remove_proc_entry("driver/acerhk", NULL); + retval = 0; + } else { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + /* ... last pressed key ... */ + entry = create_proc_read_entry("key", + 0444, proc_acer_dir, acerhk_proc_key, NULL); +@@ -2645,7 +2725,9 @@ + remove_proc_entry("driver/acerhk", NULL); + retval = 0; + } else { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + /* ... and led control file */ + entry = create_proc_entry("led", 0222, proc_acer_dir); + if (entry == NULL) { +@@ -2657,7 +2739,9 @@ + } + else { + entry->write_proc = acerhk_proc_led; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + /* ... and wireless led controll file */ + entry = create_proc_entry("wirelessled", 0222, proc_acer_dir); + if (entry == NULL) { +@@ -2670,7 +2754,9 @@ + } + else { + entry->write_proc = acerhk_proc_wirelessled; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + /* ... and bluetooth led controll file */ + entry = create_proc_entry("blueled", 0222, proc_acer_dir); + if (entry == NULL) { +@@ -2683,7 +2769,9 @@ + retval = 0; + } else { + entry->write_proc = acerhk_proc_blueled; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + retval = 1; + #ifdef ACERDEBUG + /* add extra file for debugging purposes */ +@@ -2700,7 +2788,9 @@ + } + else { + entry->write_proc = acerhk_proc_debug; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + entry->owner = THIS_MODULE; ++#endif + retval = 1; + } + #endif +@@ -2832,6 +2922,20 @@ + return 0; + } + ++#ifdef CONFIG_PM ++static int acerhk_resume(struct platform_device *dev) ++{ ++ printk(KERN_INFO"acerhk: Resuming. Setting wlan_state to: %d\n", acerhk_wlan_state); ++ ++ if (acerhk_wlan_state) ++ wbutton_fct_2(1); ++ else ++ wbutton_fct_2(0); ++ ++ return 0; ++} ++#endif ++ + static struct file_operations acerhk_fops = { + owner: THIS_MODULE, + ioctl: acerhk_ioctl, +@@ -2842,15 +2946,15 @@ + release: acerhk_release, + }; + +-static struct miscdevice acerhk_dev = { +- MISC_DYNAMIC_MINOR, +- "acerhk", +- &acerhk_fops ++static struct miscdevice acerhk_misc_dev = { ++ .minor = MISC_DYNAMIC_MINOR, ++ .name = "acerhk", ++ .fops = &acerhk_fops, + }; + + /* }}} */ + +-static void __init model_init(void) ++static void __devinit model_init(void) + { + /* set callroutine, features and keymap for model */ + setup_model_features(acerhk_series); +@@ -2875,12 +2979,13 @@ + } + + +-static void __exit acerhk_cleanup_module (void); +-static int __init acerhk_init(void) ++static int __devexit acerhk_remove(struct platform_device *dev); ++ ++static int __devinit acerhk_probe(struct platform_device *dev) + { + int ret; + +- ret = misc_register( &acerhk_dev ); ++ ret = misc_register(&acerhk_misc_dev); + if (ret) { + printk(KERN_ERR "acerhk: can't misc_register on minor=%d\n", ACERHK_MINOR); + ret = -EAGAIN; +@@ -2888,7 +2993,7 @@ + else if (!acerhk_proc_init()) { + printk(KERN_ERR "acerhk: can't create procfs entries\n"); + ret = -ENOMEM; +- misc_deregister( &acerhk_dev ); ++ misc_deregister( &acerhk_misc_dev ); + } + else { + reg1 = ioremap(0xf0000, 0xffff); +@@ -2904,7 +3009,8 @@ + /* attach to input system */ + init_input(); + memset(acerhk_model_string, 0x00, ACERHK_MODEL_STRLEN); +-#ifdef DUMMYHW ++/* #ifdef DUMMYHW */ ++#if (defined(DUMMYHW) || defined(__x86_64__)) + acerhk_model_addr = (void*)0x12345678; + /* copy the string, but not more than 15 characters */ + strncpy(acerhk_model_string, "TravelmateDummy", ACERHK_MODEL_STRLEN-1); +@@ -2950,14 +3056,14 @@ + } else { + printk(KERN_ERR "acerhk: can't find bios routine, cannot do anything for you, sorry!\n"); + ret = -ENOMEM; +- acerhk_cleanup_module(); ++ return acerhk_remove(dev); + } + #endif + } + return ret; + } + +-static void __exit acerhk_cleanup_module (void) ++static int __devexit acerhk_remove(struct platform_device *dev) + { + acerhk_proc_cleanup(); + stop_blinking(); +@@ -2968,16 +3074,68 @@ + if (preg400) + iounmap(preg400); + release_input(); +- misc_deregister( &acerhk_dev ); ++ misc_deregister(&acerhk_misc_dev); + if ( acerhk_type == TM_dritek ) { + disable_dritek_keyboard(); + } + if (verbose > 2) + printk(KERN_INFO "acerhk: unloaded\n"); ++ ++ return 0; ++} ++ ++static struct platform_driver acerhk_driver = { ++ .driver = { ++ .name = "acerhk", ++ .owner = THIS_MODULE, ++ }, ++ .probe = acerhk_probe, ++ .remove = __devexit_p(acerhk_remove), ++#ifdef CONFIG_PM ++ .resume = acerhk_resume, ++#endif ++}; ++ ++static struct platform_device *acerhk_platform_device; ++ ++static int __init acerhk_init(void) ++{ ++ int error; ++ ++ error = platform_driver_register(&acerhk_driver); ++ if (error) ++ return error; ++ ++ acerhk_platform_device = platform_device_alloc("acerhk", -1); ++ if (!acerhk_platform_device) { ++ error = -ENOMEM; ++ goto err_driver_unregister; ++ } ++ ++ error = platform_device_add(acerhk_platform_device); ++ if (error) ++ goto err_free_device; ++ ++ ++ return 0; ++ ++ err_free_device: ++ platform_device_put(acerhk_platform_device); ++ err_driver_unregister: ++ platform_driver_unregister(&acerhk_driver); ++ return error; + } + ++static void __exit acerhk_exit(void) ++{ ++ platform_device_unregister(acerhk_platform_device); ++ platform_driver_unregister(&acerhk_driver); ++ printk(KERN_INFO "acerhk: removed.\n"); ++} ++ ++ + module_init(acerhk_init); +-module_exit(acerhk_cleanup_module); ++module_exit(acerhk_exit); + + MODULE_AUTHOR("Olaf Tauber"); + MODULE_DESCRIPTION("AcerHotkeys extra buttons keyboard driver"); +--- acerhk-0.5.35/doc/FAQ 2005-11-10 18:45:33.000000000 +0100 ++++ acerhk/doc/FAQ 2007-09-21 21:58:40.000000000 +0200 +@@ -1,5 +1,15 @@ + ****************************************************************************** + ++Q: The driver works perfectly when using force_series, what is needed to add ++autodetection? ++ ++A: I need the model name of the laptop, if you do not see a usable name in ++/proc/driver/acerhk/info please try the tools dmidecode/biosdecode/vpddecode ++to find this name. You can also load the driver and then look into the bios ++directly by scanning the memory which is mapped by the driver. ++ ++****************************************************************************** ++ + Q: I have a (non Acer) notebook which is not recognized by your driver but I + think it should. What information do you need? + diff --git a/acerhk.spec b/acerhk.spec index 07941d8..e1c2492 100644 --- a/acerhk.spec +++ b/acerhk.spec @@ -2,7 +2,7 @@ # Conditional build: %bcond_without dist_kernel # without distribution kernel # -%define rel 43 +%define rel 44 Summary: Linux driver for Acer notebook special Hot Keys Summary(pl.UTF-8): Sterownik dla Linuksa obsługujący specjalne klawisze w notebookach Acer Name: acerhk @@ -13,6 +13,7 @@ Group: Base/Kernel Source0: http://www.cakey.de/acerhk/archives/%{name}-%{version}.tar.bz2 # Source0-md5: 551285657c8ba338f23595af257d21df Patch0: %{name}-2.6.24.patch +Patch1: %{name}-2.6.30.patch URL: http://www.cakey.de/acerhk/ BuildRequires: %{kgcc_package} %{?with_dist_kernel:BuildRequires: kernel-module-build >= 3:2.6.20.2} @@ -48,6 +49,7 @@ notebookach Acer. %prep %setup -q %patch0 -p1 +%patch1 -p1 %build %build_kernel_modules -m %{modules} -- 2.44.0