Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
ead90393
Commit
ead90393
authored
Oct 22, 2008
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fujitsu' into test
parents
b815d7b3
0e6a66e9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
71 additions
and
52 deletions
+71
-52
drivers/misc/fujitsu-laptop.c
drivers/misc/fujitsu-laptop.c
+71
-52
No files found.
drivers/misc/fujitsu-laptop.c
View file @
ead90393
...
...
@@ -44,8 +44,9 @@
* Hotkeys present on certain Fujitsu laptops (eg: the S6xxx series) are
* also supported by this driver.
*
* This driver has been tested on a Fujitsu Lifebook S6410 and S7020. It
* should work on most P-series and S-series Lifebooks, but YMMV.
* This driver has been tested on a Fujitsu Lifebook S6410, S7020 and
* P8010. It should work on most P-series and S-series Lifebooks, but
* YMMV.
*
* The module parameter use_alt_lcd_levels switches between different ACPI
* brightness controls which are used by different Fujitsu laptops. In most
...
...
@@ -65,7 +66,7 @@
#include <linux/video_output.h>
#include <linux/platform_device.h>
#define FUJITSU_DRIVER_VERSION "0.4.
2
"
#define FUJITSU_DRIVER_VERSION "0.4.
3
"
#define FUJITSU_LCD_N_LEVELS 8
...
...
@@ -83,10 +84,10 @@
#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS 0x87
/* Hotkey details */
#define
LOCK_KEY
0x410
/* codes for the keys in the GIRB register */
#define
DISPLAY_KEY 0x411
/* keys are mapped to KEY_SCREENLOCK (the key with the key symbol) */
#define
ENERGY_KEY 0x412
/* KEY_MEDIA (the key with the laptop symbol, KEY_EMAIL (E key)) */
#define
REST_KEY 0x413
/* KEY_SUSPEND (R key) */
#define
KEY1_CODE
0x410
/* codes for the keys in the GIRB register */
#define
KEY2_CODE 0x411
#define
KEY3_CODE 0x412
#define
KEY4_CODE 0x413
#define MAX_HOTKEY_RINGBUFFER_SIZE 100
#define RINGBUFFERSIZE 40
...
...
@@ -123,6 +124,7 @@ struct fujitsu_t {
char
phys
[
32
];
struct
backlight_device
*
bl_device
;
struct
platform_device
*
pf_device
;
int
keycode1
,
keycode2
,
keycode3
,
keycode4
;
unsigned
int
max_brightness
;
unsigned
int
brightness_changed
;
...
...
@@ -430,7 +432,7 @@ static struct platform_driver fujitsupf_driver = {
}
};
static
int
dmi_check_cb_s6410
(
const
struct
dmi_system_id
*
id
)
static
void
dmi_check_cb_common
(
const
struct
dmi_system_id
*
id
)
{
acpi_handle
handle
;
int
have_blnf
;
...
...
@@ -452,24 +454,40 @@ static int dmi_check_cb_s6410(const struct dmi_system_id *id)
"auto-detecting disable_adjust
\n
"
);
disable_brightness_adjust
=
have_blnf
?
0
:
1
;
}
}
static
int
dmi_check_cb_s6410
(
const
struct
dmi_system_id
*
id
)
{
dmi_check_cb_common
(
id
);
fujitsu
->
keycode1
=
KEY_SCREENLOCK
;
/* "Lock" */
fujitsu
->
keycode2
=
KEY_HELP
;
/* "Mobility Center" */
return
0
;
}
static
int
dmi_check_cb_p8010
(
const
struct
dmi_system_id
*
id
)
{
dmi_check_cb_common
(
id
);
fujitsu
->
keycode1
=
KEY_HELP
;
/* "Support" */
fujitsu
->
keycode3
=
KEY_SWITCHVIDEOMODE
;
/* "Presentation" */
fujitsu
->
keycode4
=
KEY_WWW
;
/* "Internet" */
return
0
;
}
static
struct
dmi_system_id
__initdata
fujitsu_dmi_table
[]
=
{
{
.
ident
=
"Fujitsu Siemens"
,
.
ident
=
"Fujitsu Siemens
S6410
"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"FUJITSU SIEMENS"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"LIFEBOOK S6410"
),
},
.
callback
=
dmi_check_cb_s6410
},
{
.
ident
=
"F
UJITSU
LifeBook P8010"
,
.
ident
=
"F
ujitsu
LifeBook P8010"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"FUJITSU"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"LifeBook P8010"
),
},
.
callback
=
dmi_check_cb_
s64
10
},
},
.
callback
=
dmi_check_cb_
p80
10
},
{}
};
...
...
@@ -547,7 +565,6 @@ static int acpi_fujitsu_add(struct acpi_device *device)
}
/* do config (detect defaults) */
dmi_check_system
(
fujitsu_dmi_table
);
use_alt_lcd_levels
=
use_alt_lcd_levels
==
1
?
1
:
0
;
disable_brightness_keys
=
disable_brightness_keys
==
1
?
1
:
0
;
disable_brightness_adjust
=
disable_brightness_adjust
==
1
?
1
:
0
;
...
...
@@ -623,17 +640,17 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
keycode
=
0
;
if
(
disable_brightness_keys
!=
1
)
{
if
(
oldb
==
0
)
{
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS
,
0
);
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS
,
0
);
keycode
=
KEY_BRIGHTNESSDOWN
;
}
else
if
(
oldb
==
(
fujitsu
->
max_brightness
)
-
1
)
{
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS
,
0
);
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS
,
0
);
keycode
=
KEY_BRIGHTNESSUP
;
}
}
...
...
@@ -646,8 +663,7 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
}
if
(
disable_brightness_keys
!=
1
)
{
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS
,
0
);
ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS
,
0
);
keycode
=
KEY_BRIGHTNESSUP
;
}
}
else
if
(
oldb
>
newb
)
{
...
...
@@ -659,8 +675,7 @@ static void acpi_fujitsu_notify(acpi_handle handle, u32 event, void *data)
}
if
(
disable_brightness_keys
!=
1
)
{
acpi_bus_generate_proc_event
(
fujitsu
->
dev
,
ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS
,
0
);
ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS
,
0
);
keycode
=
KEY_BRIGHTNESSDOWN
;
}
}
else
{
...
...
@@ -742,10 +757,10 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device)
input
->
id
.
product
=
0x06
;
input
->
dev
.
parent
=
&
device
->
dev
;
input
->
evbit
[
0
]
=
BIT
(
EV_KEY
);
set_bit
(
KEY_SCREENLOCK
,
input
->
keybit
);
set_bit
(
KEY_MEDIA
,
input
->
keybit
);
set_bit
(
KEY_EMAIL
,
input
->
keybit
);
set_bit
(
KEY_SUSPEND
,
input
->
keybit
);
set_bit
(
fujitsu
->
keycode1
,
input
->
keybit
);
set_bit
(
fujitsu
->
keycode2
,
input
->
keybit
);
set_bit
(
fujitsu
->
keycode3
,
input
->
keybit
);
set_bit
(
fujitsu
->
keycode4
,
input
->
keybit
);
set_bit
(
KEY_UNKNOWN
,
input
->
keybit
);
error
=
input_register_device
(
input
);
...
...
@@ -833,24 +848,24 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event,
irb
);
switch
(
irb
&
0x4ff
)
{
case
LOCK_KEY
:
keycode
=
KEY_SCREENLOCK
;
case
KEY1_CODE
:
keycode
=
fujitsu
->
keycode1
;
break
;
case
DISPLAY_KEY
:
keycode
=
KEY_MEDIA
;
case
KEY2_CODE
:
keycode
=
fujitsu
->
keycode2
;
break
;
case
ENERGY_KEY
:
keycode
=
KEY_EMAIL
;
case
KEY3_CODE
:
keycode
=
fujitsu
->
keycode3
;
break
;
case
REST_KEY
:
keycode
=
KEY_SUSPEND
;
case
KEY4_CODE
:
keycode
=
fujitsu
->
keycode4
;
break
;
case
0
:
keycode
=
0
;
break
;
default:
vdbg_printk
(
FUJLAPTOP_DBG_WARN
,
"Unknown GIRB result [%x]
\n
"
,
irb
);
"Unknown GIRB result [%x]
\n
"
,
irb
);
keycode
=
-
1
;
break
;
}
...
...
@@ -859,12 +874,12 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event,
"Push keycode into ringbuffer [%d]
\n
"
,
keycode
);
status
=
kfifo_put
(
fujitsu_hotkey
->
fifo
,
(
unsigned
char
*
)
&
keycode
,
sizeof
(
keycode
));
(
unsigned
char
*
)
&
keycode
,
sizeof
(
keycode
));
if
(
status
!=
sizeof
(
keycode
))
{
vdbg_printk
(
FUJLAPTOP_DBG_WARN
,
"Could not push keycode [0x%x]
\n
"
,
keycode
);
"Could not push keycode [0x%x]
\n
"
,
keycode
);
}
else
{
input_report_key
(
input
,
keycode
,
1
);
input_sync
(
input
);
...
...
@@ -879,8 +894,8 @@ static void acpi_fujitsu_hotkey_notify(acpi_handle handle, u32 event,
input_report_key
(
input
,
keycode_r
,
0
);
input_sync
(
input
);
vdbg_printk
(
FUJLAPTOP_DBG_TRACE
,
"Pop keycode from ringbuffer [%d]
\n
"
,
keycode_r
);
"Pop keycode from ringbuffer [%d]
\n
"
,
keycode_r
);
}
}
}
...
...
@@ -943,6 +958,11 @@ static int __init fujitsu_init(void)
if
(
!
fujitsu
)
return
-
ENOMEM
;
memset
(
fujitsu
,
0
,
sizeof
(
struct
fujitsu_t
));
fujitsu
->
keycode1
=
KEY_PROG1
;
fujitsu
->
keycode2
=
KEY_PROG2
;
fujitsu
->
keycode3
=
KEY_PROG3
;
fujitsu
->
keycode4
=
KEY_PROG4
;
dmi_check_system
(
fujitsu_dmi_table
);
result
=
acpi_bus_register_driver
(
&
acpi_fujitsu_driver
);
if
(
result
<
0
)
{
...
...
@@ -1076,15 +1096,14 @@ MODULE_DESCRIPTION("Fujitsu laptop extras support");
MODULE_VERSION
(
FUJITSU_DRIVER_VERSION
);
MODULE_LICENSE
(
"GPL"
);
MODULE_ALIAS
(
"dmi:*:svnFUJITSUSIEMENS:*:pvr:rvnFUJITSU:rnFJNB1D3:*:cvrS6410:*"
);
MODULE_ALIAS
(
"dmi:*:svnFUJITSU:*:pvr:rvnFUJITSU:rnFJNB19C:*:cvrS7020:*"
);
MODULE_ALIAS
(
"dmi:*:svnFUJITSUSIEMENS:*:pvr:rvnFUJITSU:rnFJNB1D3:*:cvrS6410:*"
);
MODULE_ALIAS
(
"dmi:*:svnFUJITSU:*:pvr:rvnFUJITSU:rnFJNB19C:*:cvrS7020:*"
);
static
struct
pnp_device_id
pnp_ids
[]
=
{
{
.
id
=
"FUJ02bf"
},
{
.
id
=
"FUJ02B1"
},
{
.
id
=
"FUJ02E3"
},
{
.
id
=
""
}
{
.
id
=
"FUJ02bf"
},
{
.
id
=
"FUJ02B1"
},
{
.
id
=
"FUJ02E3"
},
{
.
id
=
""
}
};
MODULE_DEVICE_TABLE
(
pnp
,
pnp_ids
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment