mfd: ab8500-core switch off status added

This patch adds a sysfs file with the ab8500 switch off status.
The switch off status contains information of what caused the ab8500
chip to power off. A print during boot is also added.

Signed-off-by: Mattias Wallin <mattias.wallin@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Mattias Wallin 2011-03-02 11:52:36 +01:00 committed by Samuel Ortiz
parent adceed6263
commit e5c238c3fd

View file

@ -90,6 +90,7 @@
#define AB8500_IT_MASK24_REG 0x57 #define AB8500_IT_MASK24_REG 0x57
#define AB8500_REV_REG 0x80 #define AB8500_REV_REG 0x80
#define AB8500_SWITCH_OFF_STATUS 0x00
/* /*
* Map interrupt numbers to the LATCH and MASK register offsets, Interrupt * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
@ -652,10 +653,38 @@ static ssize_t show_chip_id(struct device *dev,
return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
} }
/*
* ab8500 has switched off due to (SWITCH_OFF_STATUS):
* 0x01 Swoff bit programming
* 0x02 Thermal protection activation
* 0x04 Vbat lower then BattOk falling threshold
* 0x08 Watchdog expired
* 0x10 Non presence of 32kHz clock
* 0x20 Battery level lower than power on reset threshold
* 0x40 Power on key 1 pressed longer than 10 seconds
* 0x80 DB8500 thermal shutdown
*/
static ssize_t show_switch_off_status(struct device *dev,
struct device_attribute *attr, char *buf)
{
int ret;
u8 value;
struct ab8500 *ab8500;
ab8500 = dev_get_drvdata(dev);
ret = get_register_interruptible(ab8500, AB8500_RTC,
AB8500_SWITCH_OFF_STATUS, &value);
if (ret < 0)
return ret;
return sprintf(buf, "%#x\n", value);
}
static DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL); static DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
static DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
static struct attribute *ab8500_sysfs_entries[] = { static struct attribute *ab8500_sysfs_entries[] = {
&dev_attr_chip_id.attr, &dev_attr_chip_id.attr,
&dev_attr_switch_off_status.attr,
NULL, NULL,
}; };
@ -697,6 +726,24 @@ int __devinit ab8500_init(struct ab8500 *ab8500)
} }
ab8500->chip_id = value; ab8500->chip_id = value;
/*
* ab8500 has switched off due to (SWITCH_OFF_STATUS):
* 0x01 Swoff bit programming
* 0x02 Thermal protection activation
* 0x04 Vbat lower then BattOk falling threshold
* 0x08 Watchdog expired
* 0x10 Non presence of 32kHz clock
* 0x20 Battery level lower than power on reset threshold
* 0x40 Power on key 1 pressed longer than 10 seconds
* 0x80 DB8500 thermal shutdown
*/
ret = get_register_interruptible(ab8500, AB8500_RTC,
AB8500_SWITCH_OFF_STATUS, &value);
if (ret < 0)
return ret;
dev_info(ab8500->dev, "switch off status: %#x", value);
if (plat && plat->init) if (plat && plat->init)
plat->init(ab8500); plat->init(ab8500);