Browse Source

Input: wacom - register an ac power supply for wireless devices

This is used by HID Bluetooth devices but also add some more information
to the USB Wireless Receiver.
We are just porting the bits from hid-wacom.c to the common driver here.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Acked-by: Przemo Firszt <przemo@firszt.eu>
Acked-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Benjamin Tissoires 11 years ago
parent
commit
7dbd229e10
3 changed files with 55 additions and 5 deletions
  1. 1 0
      drivers/hid/wacom.h
  2. 53 5
      drivers/hid/wacom_sys.c
  3. 1 0
      drivers/hid/wacom_wac.h

+ 1 - 0
drivers/hid/wacom.h

@@ -120,6 +120,7 @@ struct wacom {
 	} led;
 	} led;
 	bool led_initialized;
 	bool led_initialized;
 	struct power_supply battery;
 	struct power_supply battery;
+	struct power_supply ac;
 };
 };
 
 
 static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)
 static inline void wacom_schedule_work(struct wacom_wac *wacom_wac)

+ 53 - 5
drivers/hid/wacom_sys.c

@@ -774,6 +774,12 @@ static enum power_supply_property wacom_battery_props[] = {
 	POWER_SUPPLY_PROP_CAPACITY
 	POWER_SUPPLY_PROP_CAPACITY
 };
 };
 
 
+static enum power_supply_property wacom_ac_props[] = {
+	POWER_SUPPLY_PROP_PRESENT,
+	POWER_SUPPLY_PROP_ONLINE,
+	POWER_SUPPLY_PROP_SCOPE,
+};
+
 static int wacom_battery_get_property(struct power_supply *psy,
 static int wacom_battery_get_property(struct power_supply *psy,
 				      enum power_supply_property psp,
 				      enum power_supply_property psp,
 				      union power_supply_propval *val)
 				      union power_supply_propval *val)
@@ -806,14 +812,38 @@ static int wacom_battery_get_property(struct power_supply *psy,
 	return ret;
 	return ret;
 }
 }
 
 
+static int wacom_ac_get_property(struct power_supply *psy,
+				enum power_supply_property psp,
+				union power_supply_propval *val)
+{
+	struct wacom *wacom = container_of(psy, struct wacom, ac);
+	int ret = 0;
+
+	switch (psp) {
+	case POWER_SUPPLY_PROP_PRESENT:
+		/* fall through */
+	case POWER_SUPPLY_PROP_ONLINE:
+		val->intval = wacom->wacom_wac.ps_connected;
+		break;
+	case POWER_SUPPLY_PROP_SCOPE:
+		val->intval = POWER_SUPPLY_SCOPE_DEVICE;
+		break;
+	default:
+		ret = -EINVAL;
+		break;
+	}
+	return ret;
+}
+
 static int wacom_initialize_battery(struct wacom *wacom)
 static int wacom_initialize_battery(struct wacom *wacom)
 {
 {
-	int error = 0;
 	static atomic_t battery_no = ATOMIC_INIT(0);
 	static atomic_t battery_no = ATOMIC_INIT(0);
+	int error;
 	unsigned long n;
 	unsigned long n;
 
 
 	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) {
 	if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) {
 		n = atomic_inc_return(&battery_no) - 1;
 		n = atomic_inc_return(&battery_no) - 1;
+
 		wacom->battery.properties = wacom_battery_props;
 		wacom->battery.properties = wacom_battery_props;
 		wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
 		wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
 		wacom->battery.get_property = wacom_battery_get_property;
 		wacom->battery.get_property = wacom_battery_get_property;
@@ -822,15 +852,31 @@ static int wacom_initialize_battery(struct wacom *wacom)
 		wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY;
 		wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY;
 		wacom->battery.use_for_apm = 0;
 		wacom->battery.use_for_apm = 0;
 
 
+		wacom->ac.properties = wacom_ac_props;
+		wacom->ac.num_properties = ARRAY_SIZE(wacom_ac_props);
+		wacom->ac.get_property = wacom_ac_get_property;
+		sprintf(wacom->wacom_wac.ac_name, "wacom_ac_%ld", n);
+		wacom->ac.name = wacom->wacom_wac.ac_name;
+		wacom->ac.type = POWER_SUPPLY_TYPE_MAINS;
+		wacom->ac.use_for_apm = 0;
+
 		error = power_supply_register(&wacom->hdev->dev,
 		error = power_supply_register(&wacom->hdev->dev,
 					      &wacom->battery);
 					      &wacom->battery);
+		if (error)
+			return error;
+
+		power_supply_powers(&wacom->battery, &wacom->hdev->dev);
+
+		error = power_supply_register(&wacom->hdev->dev, &wacom->ac);
+		if (error) {
+			power_supply_unregister(&wacom->battery);
+			return error;
+		}
 
 
-		if (!error)
-			power_supply_powers(&wacom->battery,
-					    &wacom->hdev->dev);
+		power_supply_powers(&wacom->ac, &wacom->hdev->dev);
 	}
 	}
 
 
-	return error;
+	return 0;
 }
 }
 
 
 static void wacom_destroy_battery(struct wacom *wacom)
 static void wacom_destroy_battery(struct wacom *wacom)
@@ -839,6 +885,8 @@ static void wacom_destroy_battery(struct wacom *wacom)
 	     wacom->battery.dev) {
 	     wacom->battery.dev) {
 		power_supply_unregister(&wacom->battery);
 		power_supply_unregister(&wacom->battery);
 		wacom->battery.dev = NULL;
 		wacom->battery.dev = NULL;
+		power_supply_unregister(&wacom->ac);
+		wacom->ac.dev = NULL;
 	}
 	}
 }
 }
 
 

+ 1 - 0
drivers/hid/wacom_wac.h

@@ -155,6 +155,7 @@ struct wacom_wac {
 	char name[WACOM_NAME_MAX];
 	char name[WACOM_NAME_MAX];
 	char pad_name[WACOM_NAME_MAX];
 	char pad_name[WACOM_NAME_MAX];
 	char bat_name[WACOM_NAME_MAX];
 	char bat_name[WACOM_NAME_MAX];
+	char ac_name[WACOM_NAME_MAX];
 	unsigned char data[WACOM_PKGLEN_MAX];
 	unsigned char data[WACOM_PKGLEN_MAX];
 	int tool[2];
 	int tool[2];
 	int id[2];
 	int id[2];