Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
matisse
android_kernel_samsung_matisse
Commits
fe7fa9c5
Commit
fe7fa9c5
authored
15 years ago
by
Len Brown
Browse files
Options
Download
Plain Diff
Merge branch 'sony' into release
parents
6d3bf681
528809c3
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
72 additions
and
23 deletions
+72
-23
drivers/platform/x86/sony-laptop.c
drivers/platform/x86/sony-laptop.c
+71
-23
include/linux/sonypi.h
include/linux/sonypi.h
+1
-0
No files found.
drivers/platform/x86/sony-laptop.c
View file @
fe7fa9c5
...
...
@@ -131,6 +131,7 @@ enum sony_nc_rfkill {
N_SONY_RFKILL
,
};
static
int
sony_rfkill_handle
;
static
struct
rfkill
*
sony_rfkill_devices
[
N_SONY_RFKILL
];
static
int
sony_rfkill_address
[
N_SONY_RFKILL
]
=
{
0x300
,
0x500
,
0x700
,
0x900
};
static
void
sony_nc_rfkill_update
(
void
);
...
...
@@ -232,6 +233,7 @@ static int sony_laptop_input_index[] = {
56
,
/* 69 SONYPI_EVENT_VOLUME_INC_PRESSED */
57
,
/* 70 SONYPI_EVENT_VOLUME_DEC_PRESSED */
-
1
,
/* 71 SONYPI_EVENT_BRIGHTNESS_PRESSED */
58
,
/* 72 SONYPI_EVENT_MEDIA_PRESSED */
};
static
int
sony_laptop_input_keycode_map
[]
=
{
...
...
@@ -293,6 +295,7 @@ static int sony_laptop_input_keycode_map[] = {
KEY_F15
,
/* 55 SONYPI_EVENT_SETTINGKEY_PRESSED */
KEY_VOLUMEUP
,
/* 56 SONYPI_EVENT_VOLUME_INC_PRESSED */
KEY_VOLUMEDOWN
,
/* 57 SONYPI_EVENT_VOLUME_DEC_PRESSED */
KEY_MEDIA
,
/* 58 SONYPI_EVENT_MEDIA_PRESSED */
};
/* release buttons after a short delay if pressed */
...
...
@@ -890,6 +893,8 @@ static struct sony_nc_event sony_100_events[] = {
{
0x0C
,
SONYPI_EVENT_FNKEY_RELEASED
},
{
0x9f
,
SONYPI_EVENT_CD_EJECT_PRESSED
},
{
0x1f
,
SONYPI_EVENT_ANYBUTTON_RELEASED
},
{
0xa1
,
SONYPI_EVENT_MEDIA_PRESSED
},
{
0x21
,
SONYPI_EVENT_ANYBUTTON_RELEASED
},
{
0
,
0
},
};
...
...
@@ -961,7 +966,7 @@ static void sony_nc_notify(struct acpi_device *device, u32 event)
else
sony_laptop_report_input_event
(
ev
);
}
}
else
if
(
sony_find_snc_handle
(
0x124
)
==
ev
)
{
}
else
if
(
sony_find_snc_handle
(
sony_rfkill_handle
)
==
ev
)
{
sony_nc_rfkill_update
();
return
;
}
...
...
@@ -1067,7 +1072,7 @@ static int sony_nc_rfkill_set(void *data, bool blocked)
if
(
!
blocked
)
argument
|=
0xff0000
;
return
sony_call_snc_handle
(
0x124
,
argument
,
&
result
);
return
sony_call_snc_handle
(
sony_rfkill_handle
,
argument
,
&
result
);
}
static
const
struct
rfkill_ops
sony_rfkill_ops
=
{
...
...
@@ -1110,7 +1115,7 @@ static int sony_nc_setup_rfkill(struct acpi_device *device,
if
(
!
rfk
)
return
-
ENOMEM
;
sony_call_snc_handle
(
0x124
,
0x200
,
&
result
);
sony_call_snc_handle
(
sony_rfkill_handle
,
0x200
,
&
result
);
hwblock
=
!
(
result
&
0x1
);
rfkill_set_hw_state
(
rfk
,
hwblock
);
...
...
@@ -1129,7 +1134,7 @@ static void sony_nc_rfkill_update()
int
result
;
bool
hwblock
;
sony_call_snc_handle
(
0x124
,
0x200
,
&
result
);
sony_call_snc_handle
(
sony_rfkill_handle
,
0x200
,
&
result
);
hwblock
=
!
(
result
&
0x1
);
for
(
i
=
0
;
i
<
N_SONY_RFKILL
;
i
++
)
{
...
...
@@ -1145,36 +1150,79 @@ static void sony_nc_rfkill_update()
continue
;
}
sony_call_snc_handle
(
0x124
,
argument
,
&
result
);
sony_call_snc_handle
(
sony_rfkill_handle
,
argument
,
&
result
);
rfkill_set_states
(
sony_rfkill_devices
[
i
],
!
(
result
&
0xf
),
false
);
}
}
static
int
sony_nc_rfkill_setup
(
struct
acpi_device
*
device
)
static
void
sony_nc_rfkill_setup
(
struct
acpi_device
*
device
)
{
int
result
,
ret
;
int
offset
;
u8
dev_code
,
i
;
acpi_status
status
;
struct
acpi_object_list
params
;
union
acpi_object
in_obj
;
union
acpi_object
*
device_enum
;
struct
acpi_buffer
buffer
=
{
ACPI_ALLOCATE_BUFFER
,
NULL
};
if
(
sony_find_snc_handle
(
0x124
)
==
-
1
)
return
-
1
;
offset
=
sony_find_snc_handle
(
0x124
);
if
(
offset
==
-
1
)
{
offset
=
sony_find_snc_handle
(
0x135
);
if
(
offset
==
-
1
)
return
;
else
sony_rfkill_handle
=
0x135
;
}
else
sony_rfkill_handle
=
0x124
;
dprintk
(
"Found rkfill handle: 0x%.4x
\n
"
,
sony_rfkill_handle
);
ret
=
sony_call_snc_handle
(
0x124
,
0xb00
,
&
result
);
if
(
ret
)
{
printk
(
KERN_INFO
DRV_PFX
"Unable to enumerate rfkill devices: %x
\n
"
,
ret
);
return
ret
;
/* need to read the whole buffer returned by the acpi call to SN06
* here otherwise we may miss some features
*/
params
.
count
=
1
;
params
.
pointer
=
&
in_obj
;
in_obj
.
type
=
ACPI_TYPE_INTEGER
;
in_obj
.
integer
.
value
=
offset
;
status
=
acpi_evaluate_object
(
sony_nc_acpi_handle
,
"SN06"
,
&
params
,
&
buffer
);
if
(
ACPI_FAILURE
(
status
))
{
dprintk
(
"Radio device enumeration failed
\n
"
);
return
;
}
device_enum
=
(
union
acpi_object
*
)
buffer
.
pointer
;
if
(
!
device_enum
||
device_enum
->
type
!=
ACPI_TYPE_BUFFER
)
{
printk
(
KERN_ERR
"Invalid SN06 return object 0x%.2x
\n
"
,
device_enum
->
type
);
goto
out_no_enum
;
}
if
(
result
&
0x1
)
sony_nc_setup_rfkill
(
device
,
SONY_WIFI
);
if
(
result
&
0x2
)
sony_nc_setup_rfkill
(
device
,
SONY_BLUETOOTH
);
if
(
result
&
0x1c
)
sony_nc_setup_rfkill
(
device
,
SONY_WWAN
);
if
(
result
&
0x20
)
sony_nc_setup_rfkill
(
device
,
SONY_WIMAX
);
/* the buffer is filled with magic numbers describing the devices
* available, 0xff terminates the enumeration
*/
while
((
dev_code
=
*
(
device_enum
->
buffer
.
pointer
+
i
))
!=
0xff
&&
i
<
device_enum
->
buffer
.
length
)
{
i
++
;
dprintk
(
"Radio devices, looking at 0x%.2x
\n
"
,
dev_code
);
return
0
;
if
(
dev_code
==
0
&&
!
sony_rfkill_devices
[
SONY_WIFI
])
sony_nc_setup_rfkill
(
device
,
SONY_WIFI
);
if
(
dev_code
==
0x10
&&
!
sony_rfkill_devices
[
SONY_BLUETOOTH
])
sony_nc_setup_rfkill
(
device
,
SONY_BLUETOOTH
);
if
((
0xf0
&
dev_code
)
==
0x20
&&
!
sony_rfkill_devices
[
SONY_WWAN
])
sony_nc_setup_rfkill
(
device
,
SONY_WWAN
);
if
(
dev_code
==
0x30
&&
!
sony_rfkill_devices
[
SONY_WIMAX
])
sony_nc_setup_rfkill
(
device
,
SONY_WIMAX
);
}
out_no_enum:
kfree
(
buffer
.
pointer
);
return
;
}
static
int
sony_nc_add
(
struct
acpi_device
*
device
)
...
...
This diff is collapsed.
Click to expand it.
include/linux/sonypi.h
View file @
fe7fa9c5
...
...
@@ -111,6 +111,7 @@
#define SONYPI_EVENT_VOLUME_INC_PRESSED 69
#define SONYPI_EVENT_VOLUME_DEC_PRESSED 70
#define SONYPI_EVENT_BRIGHTNESS_PRESSED 71
#define SONYPI_EVENT_MEDIA_PRESSED 72
/* get/set brightness */
#define SONYPI_IOCGBRT _IOR('v', 0, __u8)
...
...
This diff is collapsed.
Click to expand it.
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