According to my syslog, upowerd crash always follows a power_supply error, so I thought there must be some connection:
Mar 10 02:59:45 dev kernel: [ 160.051819] power_supply hid-00:12:a1:68:a3:1b-battery: driver failed to report `capacity' property: -5
Mar 10 02:59:45 dev kernel: [ 160.137237] do_trap: 66 callbacks suppressed
Mar 10 02:59:45 dev kernel: [ 160.137248] traps: upowerd[1502] trap int3 ip:7f2c0c1b92b5 sp:7fff26f6c440 error:0
If you look into linux-*/drivers/power/power_supply_sysfs.c, you can easily find the suspect:
ssize_t ret = 0;
...
if (off == POWER_SUPPLY_PROP_TYPE) value.intval = psy->type;
else
ret = psy->get_property(psy, off, &value);
if (ret < 0) {
if (ret == -ENODATA) dev_dbg(dev, "driver has no data for `%s' property\n", attr->attr.name); else if (ret != -ENODEV) dev_err(dev, "driver failed to report `%s' property: %zd\n", attr->attr.name, ret); return ret;
}
Here, "ret" is assigned only once, which means psy->get_property() returns -EIO (-5).
psy->get_property() is actually calls hidinput_get_battery_property() from linux-*/drivers/hid/hid-input.c:
According to my syslog, upowerd crash always follows a power_supply error, so I thought there must be some connection:
Mar 10 02:59:45 dev kernel: [ 160.051819] power_supply hid-00: 12:a1:68: a3:1b-battery: driver failed to report `capacity' property: -5
Mar 10 02:59:45 dev kernel: [ 160.137237] do_trap: 66 callbacks suppressed
Mar 10 02:59:45 dev kernel: [ 160.137248] traps: upowerd[1502] trap int3 ip:7f2c0c1b92b5 sp:7fff26f6c440 error:0
If you look into linux-* /drivers/ power/power_ supply_ sysfs.c, you can easily find the suspect:
ssize_t ret = 0;
...
if (off == POWER_SUPPLY_ PROP_TYPE)
value. intval = psy->type; property( psy, off, &value);
else
ret = psy->get_
if (ret < 0) {
dev_ dbg(dev, "driver has no data for `%s' property\n",
attr- >attr.name) ;
else if (ret != -ENODEV)
dev_ err(dev, "driver failed to report `%s' property: %zd\n",
attr- >attr.name, ret);
return ret;
if (ret == -ENODATA)
}
Here, "ret" is assigned only once, which means psy->get_property() returns -EIO (-5).
psy->get_property() is actually calls hidinput_ get_battery_ property( ) from linux-* /drivers/ hid/hid- input.c:
battery- >get_property = hidinput_ get_battery_ property;
And the only place in hidinput_ get_battery_ property where we can get -EIO is:
case POWER_SUPPLY_ PROP_CAPACITY: get_raw_ report( dev, dev->battery_ report_ id,
buf, sizeof(buf),
dev- >battery_ report_ type);
break;
ret = dev->hid_
...
... and my knowledge isn't enough to dig a little deeper ;)
So, as a temporary solution I've recompiled kernel with commented out CONFIG_ HID_BATTERY_ STRENGTH and it works perfectly.