diff options
| -rw-r--r-- | fs/pstore/ram.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 8e9309101..e5cc1094b 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -34,6 +34,7 @@ #include <linux/slab.h> #include <linux/compiler.h> #include <linux/pstore_ram.h> +#include <linux/of.h> #define RAMOOPS_KERNMSG_HDR "====" #define MIN_MEM_SIZE 4096UL @@ -419,15 +420,74 @@ void notrace ramoops_console_write_buf(const char *buf, size_t size) persistent_ram_write(cxt->cprz, buf, size); } +#ifdef CONFIG_OF +static struct of_device_id ramoops_of_match[] = { + { .compatible = "ramoops", }, + { }, +}; + +MODULE_DEVICE_TABLE(of, ramoops_of_match); +static void ramoops_of_init(struct platform_device *pdev) +{ + const struct device *dev = &pdev->dev; + struct ramoops_platform_data *pdata; + struct device_node *np = pdev->dev.of_node; + u32 start, size, console; + int ret; + + pdata = dev_get_drvdata(dev); + if (!pdata) { + pr_err("private data is empty!\n"); + return; + } + ret = of_property_read_u32(np, "android,ramoops-buffer-start", + &start); + if (ret) + return; + + ret = of_property_read_u32(np, "android,ramoops-buffer-size", + &size); + if (ret) + return; + + ret = of_property_read_u32(np, "android,ramoops-console-size", + &console); + if (ret) + return; + + pdata->mem_address = start; + pdata->mem_size = size; + pdata->console_size = console; +} +#else +static inline void ramoops_of_init(struct platform_device *pdev) +{ + return; +} +#endif + static int ramoops_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct ramoops_platform_data *pdata = pdev->dev.platform_data; + struct ramoops_platform_data *pdata; struct ramoops_context *cxt = &oops_cxt; size_t dump_mem_sz; phys_addr_t paddr; int err = -EINVAL; + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + pr_err("could not allocate ramoops_platform_data\n"); + return -ENOMEM; + } + + err = dev_set_drvdata(dev, pdata); + if (err) + goto fail_out; + + if (pdev->dev.of_node) + ramoops_of_init(pdev); + /* Only a single ramoops area allowed at a time, so fail extra * probes. */ @@ -566,6 +626,7 @@ static struct platform_driver ramoops_driver = { .remove = __exit_p(ramoops_remove), .driver = { .name = "ramoops", + .of_match_table = of_match_ptr(ramoops_of_match), .owner = THIS_MODULE, }, }; |
