Lines Matching +full:revision +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
13 #include "rz-sysc.h"
15 #define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
18 * struct rz_sysc - RZ SYSC private data structure
29 const struct rz_sysc_init_data *sysc_data = match->data; in rz_sysc_soc_init()
30 const struct rz_sysc_soc_id_init_data *soc_data = sysc_data->soc_id_init_data; in rz_sysc_soc_init()
33 u32 val, revision, specific_id; in rz_sysc_soc_init() local
38 soc_id_start = strchr(match->compatible, ',') + 1; in rz_sysc_soc_init()
39 soc_id_end = strchr(match->compatible, '-'); in rz_sysc_soc_init()
40 size = soc_id_end - soc_id_start + 1; in rz_sysc_soc_init()
45 soc_dev_attr = devm_kzalloc(sysc->dev, sizeof(*soc_dev_attr), GFP_KERNEL); in rz_sysc_soc_init()
47 return -ENOMEM; in rz_sysc_soc_init()
49 soc_dev_attr->family = devm_kstrdup(sysc->dev, soc_data->family, GFP_KERNEL); in rz_sysc_soc_init()
50 if (!soc_dev_attr->family) in rz_sysc_soc_init()
51 return -ENOMEM; in rz_sysc_soc_init()
53 soc_dev_attr->soc_id = devm_kstrdup(sysc->dev, soc_id, GFP_KERNEL); in rz_sysc_soc_init()
54 if (!soc_dev_attr->soc_id) in rz_sysc_soc_init()
55 return -ENOMEM; in rz_sysc_soc_init()
57 val = readl(sysc->base + soc_data->devid_offset); in rz_sysc_soc_init()
58 revision = field_get(soc_data->revision_mask, val); in rz_sysc_soc_init()
59 specific_id = field_get(soc_data->specific_id_mask, val); in rz_sysc_soc_init()
60 soc_dev_attr->revision = devm_kasprintf(sysc->dev, GFP_KERNEL, "%u", revision); in rz_sysc_soc_init()
61 if (!soc_dev_attr->revision) in rz_sysc_soc_init()
62 return -ENOMEM; in rz_sysc_soc_init()
64 if (soc_data->id && specific_id != soc_data->id) { in rz_sysc_soc_init()
65 dev_warn(sysc->dev, "SoC mismatch (product = 0x%x)\n", specific_id); in rz_sysc_soc_init()
66 return -ENODEV; in rz_sysc_soc_init()
69 /* Try to call SoC-specific device identification */ in rz_sysc_soc_init()
70 if (soc_data->print_id) { in rz_sysc_soc_init()
71 soc_data->print_id(sysc->dev, sysc->base, soc_dev_attr); in rz_sysc_soc_init()
73 dev_info(sysc->dev, "Detected Renesas %s %s Rev %s\n", in rz_sysc_soc_init()
74 soc_dev_attr->family, soc_dev_attr->soc_id, soc_dev_attr->revision); in rz_sysc_soc_init()
86 { .compatible = "renesas,r9a08g045-sysc", .data = &rzg3s_sysc_init_data },
89 { .compatible = "renesas,r9a09g047-sys", .data = &rzg3e_sys_init_data },
92 { .compatible = "renesas,r9a09g057-sys", .data = &rzv2h_sys_init_data },
101 struct device *dev = &pdev->dev; in rz_sysc_probe()
104 match = of_match_node(rz_sysc_match, dev->of_node); in rz_sysc_probe()
106 return -ENODEV; in rz_sysc_probe()
110 return -ENOMEM; in rz_sysc_probe()
112 sysc->base = devm_platform_ioremap_resource(pdev, 0); in rz_sysc_probe()
113 if (IS_ERR(sysc->base)) in rz_sysc_probe()
114 return PTR_ERR(sysc->base); in rz_sysc_probe()
116 sysc->dev = dev; in rz_sysc_probe()
122 .name = "renesas-rz-sysc",