apple-spmi-nvmem.c 1.5 KB

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