Merge branch 'i2c/for-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
[cascardo/linux.git] / drivers / hid / wacom.h
index 4681a65..b4800ea 100644 (file)
@@ -90,6 +90,8 @@
 #include <linux/module.h>
 #include <linux/mod_devicetable.h>
 #include <linux/hid.h>
+#include <linux/kfifo.h>
+#include <linux/leds.h>
 #include <linux/usb/input.h>
 #include <linux/power_supply.h>
 #include <asm/unaligned.h>
 #define USB_VENDOR_ID_WACOM    0x056a
 #define USB_VENDOR_ID_LENOVO   0x17ef
 
+enum wacom_worker {
+       WACOM_WORKER_WIRELESS,
+       WACOM_WORKER_BATTERY,
+       WACOM_WORKER_REMOTE,
+};
+
+struct wacom;
+
+struct wacom_led {
+       struct led_classdev cdev;
+       struct led_trigger trigger;
+       struct wacom *wacom;
+       unsigned int group;
+       unsigned int id;
+       u8 llv;
+       u8 hlv;
+       bool held;
+};
+
+struct wacom_group_leds {
+       u8 select; /* status led selector (0..3) */
+       struct wacom_led *leds;
+       unsigned int count;
+       struct device *dev;
+};
+
+struct wacom_battery {
+       struct wacom *wacom;
+       struct power_supply_desc bat_desc;
+       struct power_supply *battery;
+       char bat_name[WACOM_NAME_MAX];
+       int battery_capacity;
+       int bat_charging;
+       int bat_connected;
+       int ps_connected;
+};
+
+struct wacom_remote {
+       spinlock_t remote_lock;
+       struct kfifo remote_fifo;
+       struct kobject *remote_dir;
+       struct {
+               struct attribute_group group;
+               u32 serial;
+               struct input_dev *input;
+               bool registered;
+               struct wacom_battery battery;
+       } remotes[WACOM_MAX_REMOTES];
+};
+
 struct wacom {
        struct usb_device *usbdev;
        struct usb_interface *intf;
        struct wacom_wac wacom_wac;
        struct hid_device *hdev;
        struct mutex lock;
-       struct work_struct work;
-       struct wacom_led {
-               u8 select[5]; /* status led selector (0..3) */
+       struct work_struct wireless_work;
+       struct work_struct battery_work;
+       struct work_struct remote_work;
+       struct wacom_remote *remote;
+       struct wacom_leds {
+               struct wacom_group_leds *groups;
+               unsigned int count;
                u8 llv;       /* status led brightness no button (1..127) */
                u8 hlv;       /* status led brightness button pressed (1..127) */
                u8 img_lum;   /* OLED matrix display brightness */
+               u8 max_llv;   /* maximum brightness of LED (llv) */
+               u8 max_hlv;   /* maximum brightness of LED (hlv) */
        } led;
-       bool led_initialized;
-       struct power_supply *battery;
-       struct power_supply *ac;
-       struct power_supply_desc battery_desc;
-       struct power_supply_desc ac_desc;
-       struct kobject *remote_dir;
-       struct attribute_group remote_group[5];
+       struct wacom_battery battery;
+       bool resources;
 };
 
-static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)
+static inline void wacom_schedule_work(struct wacom_wac *wacom_wac,
+                                      enum wacom_worker which)
 {
        struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
-       schedule_work(&wacom->work);
+
+       switch (which) {
+       case WACOM_WORKER_WIRELESS:
+               schedule_work(&wacom->wireless_work);
+               break;
+       case WACOM_WORKER_BATTERY:
+               schedule_work(&wacom->battery_work);
+               break;
+       case WACOM_WORKER_REMOTE:
+               schedule_work(&wacom->remote_work);
+               break;
+       }
 }
 
 extern const struct hid_device_id wacom_ids[];
@@ -149,7 +214,8 @@ int wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
                struct hid_usage *usage, __s32 value);
 void wacom_wac_report(struct hid_device *hdev, struct hid_report *report);
 void wacom_battery_work(struct work_struct *work);
-int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
-                                  int index);
-void wacom_remote_destroy_attr_group(struct wacom *wacom, __u32 serial);
+enum led_brightness wacom_leds_brightness_get(struct wacom_led *led);
+struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
+                                unsigned int id);
+struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
 #endif