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; }
static int __exit nvdumper_exit(void) { unregister_reboot_notifier(&nvdumper_reboot_notifier); set_dirty_state(0); iounmap(nvdumper_ptr); iounmap(reboot_params); return 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); }
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; }
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; }