Input: psmouse - do not carry DMI data around
Dmitry Torokhov [Fri, 4 Dec 2009 07:21:14 +0000 (23:21 -0800)]
DMI tables use considerable amount of memory. Mark them as __initconst
so they will be discarded once module is loaded.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

drivers/input/mouse/lifebook.c
drivers/input/mouse/lifebook.h
drivers/input/mouse/psmouse-base.c
drivers/input/mouse/synaptics.c
drivers/input/mouse/synaptics.h

index 54b7f64..cd81cef 100644 (file)
@@ -25,11 +25,13 @@ struct lifebook_data {
        char phys[32];
 };
 
+static bool lifebook_present;
+
 static const char *desired_serio_phys;
 
-static int lifebook_set_serio_phys(const struct dmi_system_id *d)
+static int lifebook_limit_serio3(const struct dmi_system_id *d)
 {
-       desired_serio_phys = d->driver_data;
+       desired_serio_phys = "isa0060/serio3";
        return 0;
 }
 
@@ -41,7 +43,8 @@ static int lifebook_set_6byte_proto(const struct dmi_system_id *d)
        return 0;
 }
 
-static const struct dmi_system_id lifebook_dmi_table[] = {
+static const struct dmi_system_id __initconst lifebook_dmi_table[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
        {
                .ident = "FLORA-ie 55mi",
                .matches = {
@@ -83,8 +86,7 @@ static const struct dmi_system_id lifebook_dmi_table[] = {
                .matches = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"),
                },
-               .callback = lifebook_set_serio_phys,
-               .driver_data = "isa0060/serio3",
+               .callback = lifebook_limit_serio3,
        },
        {
                .ident = "Panasonic CF-28",
@@ -116,8 +118,14 @@ static const struct dmi_system_id lifebook_dmi_table[] = {
                },
        },
        { }
+#endif
 };
 
+void __init lifebook_module_init(void)
+{
+       lifebook_present = dmi_check_system(lifebook_dmi_table);
+}
+
 static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse)
 {
        struct lifebook_data *priv = psmouse->private;
@@ -243,7 +251,7 @@ static void lifebook_disconnect(struct psmouse *psmouse)
 
 int lifebook_detect(struct psmouse *psmouse, bool set_properties)
 {
-        if (!dmi_check_system(lifebook_dmi_table))
+        if (!lifebook_present)
                 return -1;
 
        if (desired_serio_phys &&
index 407cb22..4c4326c 100644 (file)
 #define _LIFEBOOK_H
 
 #ifdef CONFIG_MOUSE_PS2_LIFEBOOK
+void lifebook_module_init(void);
 int lifebook_detect(struct psmouse *psmouse, bool set_properties);
 int lifebook_init(struct psmouse *psmouse);
 #else
+inline void lifebook_module_init(void)
+{
+}
 inline int lifebook_detect(struct psmouse *psmouse, bool set_properties)
 {
        return -ENOSYS;
index acd1670..fd0bc09 100644 (file)
@@ -1696,6 +1696,9 @@ static int __init psmouse_init(void)
 {
        int err;
 
+       lifebook_module_init();
+       synaptics_module_init();
+
        kpsmoused_wq = create_singlethread_workqueue("kpsmoused");
        if (!kpsmoused_wq) {
                printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n");
index f4a6125..36d6df4 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/dmi.h>
 #include <linux/input.h>
 #include <linux/serio.h>
 #include <linux/libps2.h>
@@ -629,9 +630,10 @@ static int synaptics_reconnect(struct psmouse *psmouse)
        return 0;
 }
 
-#if defined(__i386__)
-#include <linux/dmi.h>
-static const struct dmi_system_id toshiba_dmi_table[] = {
+static bool impaired_toshiba_kbc;
+
+static const struct dmi_system_id __initconst toshiba_dmi_table[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
        {
                .ident = "Toshiba Satellite",
                .matches = {
@@ -664,8 +666,13 @@ static const struct dmi_system_id toshiba_dmi_table[] = {
 
        },
        { }
-};
 #endif
+};
+
+void __init synaptics_module_init(void)
+{
+       impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table);
+}
 
 int synaptics_init(struct psmouse *psmouse)
 {
@@ -718,18 +725,16 @@ int synaptics_init(struct psmouse *psmouse)
        if (SYN_CAP_PASS_THROUGH(priv->capabilities))
                synaptics_pt_create(psmouse);
 
-#if defined(__i386__)
        /*
         * Toshiba's KBC seems to have trouble handling data from
         * Synaptics as full rate, switch to lower rate which is roughly
         * thye same as rate of standard PS/2 mouse.
         */
-       if (psmouse->rate >= 80 && dmi_check_system(toshiba_dmi_table)) {
+       if (psmouse->rate >= 80 && impaired_toshiba_kbc) {
                printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",
                        dmi_get_system_info(DMI_PRODUCT_NAME));
                psmouse->rate = 40;
        }
-#endif
 
        return 0;
 
@@ -740,6 +745,10 @@ int synaptics_init(struct psmouse *psmouse)
 
 #else /* CONFIG_MOUSE_PS2_SYNAPTICS */
 
+void __init synaptics_module_init(void)
+{
+}
+
 int synaptics_init(struct psmouse *psmouse)
 {
        return -ENOSYS;
index 871f6fe..838e7f2 100644 (file)
@@ -105,6 +105,7 @@ struct synaptics_data {
        int scroll;
 };
 
+void synaptics_module_init(void);
 int synaptics_detect(struct psmouse *psmouse, bool set_properties);
 int synaptics_init(struct psmouse *psmouse);
 void synaptics_reset(struct psmouse *psmouse);