1*fe91c24aSHector Martin // SPDX-License-Identifier: GPL-2.0-only OR MIT
2*fe91c24aSHector Martin /*
3*fe91c24aSHector Martin * Apple SPMI NVMEM driver
4*fe91c24aSHector Martin *
5*fe91c24aSHector Martin * Copyright The Asahi Linux Contributors
6*fe91c24aSHector Martin */
7*fe91c24aSHector Martin
8*fe91c24aSHector Martin #include <linux/kernel.h>
9*fe91c24aSHector Martin #include <linux/module.h>
10*fe91c24aSHector Martin #include <linux/nvmem-provider.h>
11*fe91c24aSHector Martin #include <linux/of.h>
12*fe91c24aSHector Martin #include <linux/spmi.h>
13*fe91c24aSHector Martin #include <linux/regmap.h>
14*fe91c24aSHector Martin
15*fe91c24aSHector Martin static const struct regmap_config apple_spmi_regmap_config = {
16*fe91c24aSHector Martin .reg_bits = 16,
17*fe91c24aSHector Martin .val_bits = 8,
18*fe91c24aSHector Martin .max_register = 0xffff,
19*fe91c24aSHector Martin };
20*fe91c24aSHector Martin
apple_spmi_nvmem_probe(struct spmi_device * sdev)21*fe91c24aSHector Martin static int apple_spmi_nvmem_probe(struct spmi_device *sdev)
22*fe91c24aSHector Martin {
23*fe91c24aSHector Martin struct regmap *regmap;
24*fe91c24aSHector Martin struct nvmem_config nvmem_cfg = {
25*fe91c24aSHector Martin .dev = &sdev->dev,
26*fe91c24aSHector Martin .name = "spmi_nvmem",
27*fe91c24aSHector Martin .id = NVMEM_DEVID_AUTO,
28*fe91c24aSHector Martin .word_size = 1,
29*fe91c24aSHector Martin .stride = 1,
30*fe91c24aSHector Martin .size = 0xffff,
31*fe91c24aSHector Martin .reg_read = (void *)regmap_bulk_read,
32*fe91c24aSHector Martin .reg_write = (void *)regmap_bulk_write,
33*fe91c24aSHector Martin };
34*fe91c24aSHector Martin
35*fe91c24aSHector Martin regmap = devm_regmap_init_spmi_ext(sdev, &apple_spmi_regmap_config);
36*fe91c24aSHector Martin if (IS_ERR(regmap))
37*fe91c24aSHector Martin return PTR_ERR(regmap);
38*fe91c24aSHector Martin
39*fe91c24aSHector Martin nvmem_cfg.priv = regmap;
40*fe91c24aSHector Martin
41*fe91c24aSHector Martin return PTR_ERR_OR_ZERO(devm_nvmem_register(&sdev->dev, &nvmem_cfg));
42*fe91c24aSHector Martin }
43*fe91c24aSHector Martin
44*fe91c24aSHector Martin static const struct of_device_id apple_spmi_nvmem_id_table[] = {
45*fe91c24aSHector Martin { .compatible = "apple,spmi-nvmem" },
46*fe91c24aSHector Martin { },
47*fe91c24aSHector Martin };
48*fe91c24aSHector Martin MODULE_DEVICE_TABLE(of, apple_spmi_nvmem_id_table);
49*fe91c24aSHector Martin
50*fe91c24aSHector Martin static struct spmi_driver apple_spmi_nvmem_driver = {
51*fe91c24aSHector Martin .probe = apple_spmi_nvmem_probe,
52*fe91c24aSHector Martin .driver = {
53*fe91c24aSHector Martin .name = "apple-spmi-nvmem",
54*fe91c24aSHector Martin .of_match_table = apple_spmi_nvmem_id_table,
55*fe91c24aSHector Martin },
56*fe91c24aSHector Martin };
57*fe91c24aSHector Martin
58*fe91c24aSHector Martin module_spmi_driver(apple_spmi_nvmem_driver);
59*fe91c24aSHector Martin
60*fe91c24aSHector Martin MODULE_LICENSE("Dual MIT/GPL");
61*fe91c24aSHector Martin MODULE_AUTHOR("Hector Martin <marcan@marcan.st>");
62*fe91c24aSHector Martin MODULE_DESCRIPTION("Apple SPMI NVMEM driver");
63