39 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
41 #include <linux/module.h>
42 #include <linux/kernel.h>
48 #include <linux/i2c.h>
52 #include <linux/rfkill.h>
57 #define DRIVER_NAME "intel_oaktrail"
58 #define DRIVER_VERSION "0.4ac1"
71 #define OT_EC_DEVICE_STATE_ADDRESS 0xD6
73 #define OT_EC_CAMERA_MASK (1 << 0)
74 #define OT_EC_BT_MASK (1 << 1)
75 #define OT_EC_GPS_MASK (1 << 2)
76 #define OT_EC_WIFI_MASK (1 << 3)
77 #define OT_EC_WWAN_MASK (1 << 4)
78 #define OT_EC_TS_MASK (1 << 5)
92 #define OT_EC_BL_BRIGHTNESS_ADDRESS 0x44
93 #define OT_EC_BL_BRIGHTNESS_MAX 100
94 #define OT_EC_BL_CONTROL_ADDRESS 0x3A
95 #define OT_EC_BL_CONTROL_ON_DATA 0x1A
104 static struct rfkill *bt_rfkill;
105 static struct rfkill *gps_rfkill;
106 static struct rfkill *wifi_rfkill;
107 static struct rfkill *wwan_rfkill;
111 static int oaktrail_rfkill_set(
void *
data,
bool blocked)
115 unsigned long radio = (
unsigned long) data;
120 value = (
u8) (result | radio);
122 value = (
u8) (result & ~radio);
129 static const struct rfkill_ops oaktrail_rfkill_ops = {
130 .set_block = oaktrail_rfkill_set,
136 struct rfkill *rfkill_dev;
141 &oaktrail_rfkill_ops, (
void *)mask);
157 static inline void __oaktrail_rfkill_cleanup(
struct rfkill *rf)
165 static void oaktrail_rfkill_cleanup(
void)
167 __oaktrail_rfkill_cleanup(wifi_rfkill);
168 __oaktrail_rfkill_cleanup(bt_rfkill);
169 __oaktrail_rfkill_cleanup(gps_rfkill);
170 __oaktrail_rfkill_cleanup(wwan_rfkill);
173 static int oaktrail_rfkill_init(
void)
177 wifi_rfkill = oaktrail_rfkill_new(
"oaktrail-wifi",
180 if (IS_ERR(wifi_rfkill)) {
181 ret = PTR_ERR(wifi_rfkill);
186 bt_rfkill = oaktrail_rfkill_new(
"oaktrail-bluetooth",
189 if (IS_ERR(bt_rfkill)) {
190 ret = PTR_ERR(bt_rfkill);
195 gps_rfkill = oaktrail_rfkill_new(
"oaktrail-gps",
198 if (IS_ERR(gps_rfkill)) {
199 ret = PTR_ERR(gps_rfkill);
204 wwan_rfkill = oaktrail_rfkill_new(
"oaktrail-wwan",
207 if (IS_ERR(wwan_rfkill)) {
208 ret = PTR_ERR(wwan_rfkill);
216 oaktrail_rfkill_cleanup();
243 .get_brightness = get_backlight_brightness,
244 .update_status = set_backlight_brightness,
247 static int oaktrail_backlight_init(
void)
261 oaktrail_bl_device =
NULL;
262 pr_warning(
"Unable to register backlight device\n");
266 oaktrail_bl_device = bd;
268 bd->
props.brightness = get_backlight_brightness(bd);
270 backlight_update_status(bd);
275 static void oaktrail_backlight_exit(
void)
277 if (oaktrail_bl_device)
296 .probe = oaktrail_probe,
308 .ident =
"OakTrail platform",
312 .callback = dmi_check_cb
318 static int __init oaktrail_init(
void)
323 pr_err(
"ACPI needs to be enabled for this driver to work!\n");
328 pr_err(
"Platform not recognized (You could try the module's force-parameter)");
334 pr_warning(
"Unable to register platform driver\n");
339 if (!oaktrail_device) {
340 pr_warning(
"Unable to allocate platform device\n");
342 goto err_device_alloc;
347 pr_warning(
"Unable to add platform device\n");
352 ret = oaktrail_backlight_init();
357 pr_info(
"Backlight controlled by ACPI video driver\n");
359 ret = oaktrail_rfkill_init();
369 oaktrail_backlight_exit();
381 static void __exit oaktrail_cleanup(
void)
383 oaktrail_backlight_exit();
384 oaktrail_rfkill_cleanup();