static int mnemosyne_parse_dt(struct device* dev) { struct device_node *node= NULL; u32 phys, base; int ret; pr_info("%s: init from device tree.\n", MNEMOSYNE_MODULE_NAME); node = dev->of_node; if (node == NULL) { pr_err("%s, Can't find device_node", MNEMOSYNE_MODULE_NAME); ret = -ENODEV; goto PARSE_DT_ERR_OUT; } ret = of_property_read_u32(node, OF_PROP_PHYS_NAME, &phys); if (ret) { pr_err("%s: could not get %s for %s\n", MNEMOSYNE_MODULE_NAME, OF_PROP_PHYS_NAME, node->full_name); goto PARSE_DT_ERR_OUT; } ret = of_property_read_u32(node, OF_PROP_BASE_NAME, &base); if (ret) { pr_err("%s: could not get %s for %s\n", MNEMOSYNE_MODULE_NAME, OF_PROP_BASE_NAME, node->full_name); goto PARSE_DT_ERR_OUT; } mnemosyne_setup(phys, base); PARSE_DT_ERR_OUT: return ret; }
static int mnemosyne_parse_pdata(struct device* dev) { int ret = 0; struct mnemosyne_platform_data *pdata = (struct mnemosyne_platform_data *)dev->platform_data; pr_info("%s: init from platform data.\n", MNEMOSYNE_MODULE_NAME); if (pdata == NULL) { pr_err("%s: No pdata\n", MNEMOSYNE_MODULE_NAME); ret = -ENODEV; goto PARSE_PDATA_ERR_OUT; } mnemosyne_setup(pdata->phys, pdata->base); PARSE_PDATA_ERR_OUT: return ret; }
static int mnemosyne_parse_dt(struct device_node *node) { phys_addr_t phys = 0, size = 0; struct device_node *pnode = NULL; int ret; pr_info("%s: init from device tree.\n", MNEMOSYNE_MODULE_NAME); if (node == NULL) { pr_err("%s: Can't find device_node", MNEMOSYNE_MODULE_NAME); ret = -ENODEV; goto PARSE_DT_ERR_OUT; } pnode = of_parse_phandle(node, "linux,contiguous-region", 0); if (!pnode) { pr_err("%s: mnemosyne memory is not reserved.\n", MNEMOSYNE_MODULE_NAME); } else { const __be32 *prop; int addr_cells, size_cells; prop = of_get_address(pnode, 0, NULL, NULL); if (!prop) { pr_err("%s: Can't find register property", MNEMOSYNE_MODULE_NAME); ret = -ENODEV; of_node_put(pnode); goto PARSE_DT_ERR_OUT; } of_node_put(pnode); addr_cells = of_n_addr_cells(pnode); size_cells = of_n_size_cells(pnode); phys = of_read_number(prop, addr_cells); size = of_read_number(prop + addr_cells, size_cells); } ret = mnemosyne_setup(phys, size); PARSE_DT_ERR_OUT: return ret; }
int mnemosyne_early_init(unsigned int phys, unsigned base) { pr_info("%s: init from early init.\n", MNEMOSYNE_MODULE_NAME); return mnemosyne_setup(phys, base); }