Loading Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ Optional properties: - qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present - qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze automatically across suspend / resume path. - qcom,scandump-size : size of scan dump memory region. Example: Loading drivers/soc/qcom/watchdog_v2.c +43 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ struct msm_watchdog_data { bool timer_expired; bool user_pet_complete; unsigned int scandump_size; }; /* Loading Loading @@ -581,6 +582,41 @@ static void configure_bark_dump(struct msm_watchdog_data *wdog_dd) return; } static void register_scan_dump(struct msm_watchdog_data *wdog_dd) { static void *dump_addr; int ret; struct msm_dump_entry dump_entry; struct msm_dump_data *dump_data; if (!wdog_dd->scandump_size) return; dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL); if (!dump_data) return; dump_addr = kzalloc(wdog_dd->scandump_size, GFP_KERNEL); if (!dump_addr) goto err0; dump_data->addr = virt_to_phys(dump_addr); dump_data->len = wdog_dd->scandump_size; strlcpy(dump_data->name, "KSCANDUMP", sizeof(dump_data->name)); dump_entry.id = MSM_DUMP_DATA_SCANDUMP; dump_entry.addr = virt_to_phys(dump_data); ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry); if (ret) { pr_err("Registering scandump region failed\n"); goto err1; } return; err1: kfree(dump_addr); err0: kfree(dump_data); } static void configure_scandump(struct msm_watchdog_data *wdog_dd) { int ret; Loading Loading @@ -624,6 +660,8 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) devm_kfree(wdog_dd->dev, cpu_data); } } register_scan_dump(wdog_dd); } static int init_watchdog_sysfs(struct msm_watchdog_data *wdog_dd) Loading Loading @@ -805,6 +843,11 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, pdata->wakeup_irq_enable = of_property_read_bool(node, "qcom,wakeup-enable"); if (of_property_read_u32(node, "qcom,scandump-size", &pdata->scandump_size)) dev_info(&pdev->dev, "No need to allocate memory for scandumps\n"); pdata->irq_ppi = irq_is_percpu(pdata->bark_irq); dump_pdata(pdata); return 0; Loading Loading
Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ Optional properties: - qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present - qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze automatically across suspend / resume path. - qcom,scandump-size : size of scan dump memory region. Example: Loading
drivers/soc/qcom/watchdog_v2.c +43 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,7 @@ struct msm_watchdog_data { bool timer_expired; bool user_pet_complete; unsigned int scandump_size; }; /* Loading Loading @@ -581,6 +582,41 @@ static void configure_bark_dump(struct msm_watchdog_data *wdog_dd) return; } static void register_scan_dump(struct msm_watchdog_data *wdog_dd) { static void *dump_addr; int ret; struct msm_dump_entry dump_entry; struct msm_dump_data *dump_data; if (!wdog_dd->scandump_size) return; dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL); if (!dump_data) return; dump_addr = kzalloc(wdog_dd->scandump_size, GFP_KERNEL); if (!dump_addr) goto err0; dump_data->addr = virt_to_phys(dump_addr); dump_data->len = wdog_dd->scandump_size; strlcpy(dump_data->name, "KSCANDUMP", sizeof(dump_data->name)); dump_entry.id = MSM_DUMP_DATA_SCANDUMP; dump_entry.addr = virt_to_phys(dump_data); ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry); if (ret) { pr_err("Registering scandump region failed\n"); goto err1; } return; err1: kfree(dump_addr); err0: kfree(dump_data); } static void configure_scandump(struct msm_watchdog_data *wdog_dd) { int ret; Loading Loading @@ -624,6 +660,8 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) devm_kfree(wdog_dd->dev, cpu_data); } } register_scan_dump(wdog_dd); } static int init_watchdog_sysfs(struct msm_watchdog_data *wdog_dd) Loading Loading @@ -805,6 +843,11 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, pdata->wakeup_irq_enable = of_property_read_bool(node, "qcom,wakeup-enable"); if (of_property_read_u32(node, "qcom,scandump-size", &pdata->scandump_size)) dev_info(&pdev->dev, "No need to allocate memory for scandumps\n"); pdata->irq_ppi = irq_is_percpu(pdata->bark_irq); dump_pdata(pdata); return 0; Loading