These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / platform / x86 / compal-laptop.c
index b4e9447..e1c2b6d 100644 (file)
@@ -82,7 +82,7 @@
 #include <linux/hwmon-sysfs.h>
 #include <linux/power_supply.h>
 #include <linux/fb.h>
-
+#include <acpi/video.h>
 
 /* ======= */
 /* Defines */
 #define BAT_STATUS2                    0xF1
 #define BAT_STOP_CHARGE1               0xF2
 #define BAT_STOP_CHARGE2               0xF3
+#define BAT_CHARGE_LIMIT               0x03
+#define BAT_CHARGE_LIMIT_MAX           100
 
 #define BAT_S0_DISCHARGE               (1 << 0)
 #define BAT_S0_DISCHRG_CRITICAL                (1 << 2)
@@ -601,6 +603,12 @@ static int bat_get_property(struct power_supply *psy,
        case POWER_SUPPLY_PROP_CHARGE_NOW:
                val->intval = ec_read_u16(BAT_CHARGE_NOW) * 1000;
                break;
+       case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
+               val->intval = ec_read_u8(BAT_CHARGE_LIMIT);
+               break;
+       case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
+               val->intval = BAT_CHARGE_LIMIT_MAX;
+               break;
        case POWER_SUPPLY_PROP_CAPACITY:
                val->intval = ec_read_u8(BAT_CAPACITY);
                break;
@@ -634,6 +642,36 @@ static int bat_get_property(struct power_supply *psy,
        return 0;
 }
 
+static int bat_set_property(struct power_supply *psy,
+                               enum power_supply_property psp,
+                               const union power_supply_propval *val)
+{
+       int level;
+
+       switch (psp) {
+       case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
+               level = val->intval;
+               if (level < 0 || level > BAT_CHARGE_LIMIT_MAX)
+                       return -EINVAL;
+               if (ec_write(BAT_CHARGE_LIMIT, level) < 0)
+                       return -EIO;
+               break;
+       default:
+               break;
+       }
+       return 0;
+}
+
+static int bat_writeable_property(struct power_supply *psy,
+                               enum power_supply_property psp)
+{
+       switch (psp) {
+       case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
+               return 1;
+       default:
+               return 0;
+       }
+}
 
 
 
@@ -726,6 +764,8 @@ static enum power_supply_property compal_bat_properties[] = {
        POWER_SUPPLY_PROP_POWER_NOW,
        POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
        POWER_SUPPLY_PROP_CHARGE_NOW,
+       POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
+       POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
        POWER_SUPPLY_PROP_CAPACITY,
        POWER_SUPPLY_PROP_CAPACITY_LEVEL,
        POWER_SUPPLY_PROP_TEMP,
@@ -880,11 +920,12 @@ static const struct power_supply_desc psy_bat_desc = {
        .properties     = compal_bat_properties,
        .num_properties = ARRAY_SIZE(compal_bat_properties),
        .get_property   = bat_get_property,
+       .set_property   = bat_set_property,
+       .property_is_writeable = bat_writeable_property,
 };
 
 static void initialize_power_supply_data(struct compal_data *data)
 {
-
        ec_read_sequence(BAT_MANUFACTURER_NAME_ADDR,
                                        data->bat_manufacturer_name,
                                        BAT_MANUFACTURER_NAME_LEN);
@@ -959,7 +1000,7 @@ static int __init compal_init(void)
                return -ENODEV;
        }
 
-       if (!acpi_video_backlight_support()) {
+       if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
                struct backlight_properties props;
                memset(&props, 0, sizeof(struct backlight_properties));
                props.type = BACKLIGHT_PLATFORM;