示例#1
0
static int nvdumper_reboot_cb(struct notifier_block *nb,
		unsigned long event, void *unused)
{
	printk(KERN_INFO "nvdumper: rebooting cleanly.\n");
	set_dirty_state(0);
	return NOTIFY_DONE;
}
示例#2
0
static int __exit nvdumper_exit(void)
{
	unregister_reboot_notifier(&nvdumper_reboot_notifier);
	set_dirty_state(0);
	iounmap(nvdumper_ptr);
	iounmap(reboot_params);
	return 0;
}
示例#3
0
static void __exit nvdumper_exit(void)
{
	nvdumper_regdump_exit();
	nvdumper_dbg_footprint_exit();
	unregister_reboot_notifier(&nvdumper_reboot_notifier);
	set_dirty_state(0);
	iounmap(nvdumper_ptr);
}
示例#4
0
static int __init nvdumper_init(void)
{
	int ret, dirty;

	printk(KERN_INFO "nvdumper: nvdumper_reserved:0x%08lx\n", nvdumper_reserved);
	if (!nvdumper_reserved) {
		printk(KERN_INFO "nvdumper: not configured\n");
		return -ENOTSUPP;
	}
	nvdumper_ptr = ioremap_nocache(nvdumper_reserved,
			NVDUMPER_RESERVED_LEN);
	printk(KERN_INFO "nvdumper: nvdumper_ptr:0x%p\n", nvdumper_ptr);
	if (!nvdumper_ptr) {
		printk(KERN_INFO "nvdumper: failed to ioremap memory "
			"at 0x%08lx\n", nvdumper_reserved);
		return -EIO;
	}
	reboot_params = ioremap_nocache(nvdumper_reserved - NVDUMPER_RESERVED_LEN,
			NVDUMPER_RESERVED_LEN);
	printk(KERN_INFO "nvdumper: reboot_params:0x%p\n", reboot_params);
	if (!reboot_params) {
		printk(KERN_INFO "nvdumper: failed to ioremap memory "
			"at 0x%08lx\n", nvdumper_reserved - NVDUMPER_RESERVED_LEN);
		return -EIO;
	}
	reboot_battery_first_level = reboot_params->battery_level;
	memset(reboot_params, 0x0, sizeof(struct htc_reboot_params));
	ret = register_reboot_notifier(&nvdumper_reboot_notifier);
	printk(KERN_INFO "nvdumper: ret:%d\n", ret);
	if (ret)
		return ret;
	dirty = get_dirty_state();
	printk(KERN_INFO "nvdumper: dirty:%d\n", dirty);
	switch (dirty) {
	case 0:
		printk(KERN_INFO "nvdumper: last reboot was clean\n");
		break;
	case 1:
		printk(KERN_INFO "nvdumper: last reboot was dirty\n");
		break;
	default:
		printk(KERN_INFO "nvdumper: last reboot was unknown\n");
		break;
	}
	set_dirty_state(1);
	return 0;
}
示例#5
0
static int __init nvdumper_init(void)
{
	int ret, dirty;

#ifdef CONFIG_TEGRA_USE_NCT
	union nct_item_type *item;
#endif

	if (!nvdumper_reserved) {
		pr_info("nvdumper: not configured\n");
		return -ENOTSUPP;
	}
	nvdumper_ptr = ioremap_nocache(nvdumper_reserved,
			NVDUMPER_RESERVED_SIZE);
	if (!nvdumper_ptr) {
		pr_info("nvdumper: failed to ioremap memory at 0x%08lx\n",
				nvdumper_reserved);
		return -EIO;
	}
	ret = register_reboot_notifier(&nvdumper_reboot_notifier);
	if (ret)
		goto err_out1;

	ret = nvdumper_regdump_init();
	if (ret)
		goto err_out2;

	nvdumper_dbg_footprint_init();

	dirty = get_dirty_state();
	switch (dirty) {
	case 0:
		pr_info("nvdumper: last reboot was clean\n");
		break;
	case 1:
		pr_info("nvdumper: last reboot was dirty\n");
		break;
	default:
		pr_info("nvdumper: last reboot was unknown\n");
		break;
	}
#ifdef CONFIG_TEGRA_USE_NCT
	item = kzalloc(sizeof(*item), GFP_KERNEL);
	if (!item) {
		pr_err("failed to allocate memory\n");
		goto err_out3;
	}

	ret = tegra_nct_read_item(NCT_ID_RAMDUMP, item);
	if (ret < 0) {
		pr_err("%s: NCT read failure\n", __func__);
		kfree(item);
		goto err_out3;
	}

	pr_info("%s: RAMDUMP flag(%d) from NCT\n",
			__func__, item->ramdump.flag);
	if (item->ramdump.flag == 1)
		set_dirty_state(1);
	else
		set_dirty_state(0);

	kfree(item);

	return 0;

err_out3:

#else
	set_dirty_state(1);
	return 0;
#endif

err_out2:
	unregister_reboot_notifier(&nvdumper_reboot_notifier);
err_out1:
	iounmap(nvdumper_ptr);

	return ret;

}