k3_esm.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Texas Instruments' K3 Error Signalling Module driver
  4. *
  5. * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
  6. * Tero Kristo <t-kristo@ti.com>
  7. *
  8. */
  9. #include <common.h>
  10. #include <dm.h>
  11. #include <errno.h>
  12. #include <asm/io.h>
  13. #include <dm/device_compat.h>
  14. #include <linux/bitops.h>
  15. #define ESM_SFT_RST 0x0c
  16. #define ESM_SFT_RST_KEY 0x0f
  17. #define ESM_STS(i) (0x404 + (i) / 32 * 0x20)
  18. #define ESM_PIN_EN_SET_OFFSET(i) (0x414 + (i) / 32 * 0x20)
  19. #define ESM_PIN_MASK(i) BIT((i) & 0x1f)
  20. static void esm_pin_enable(void __iomem *base, int pin)
  21. {
  22. /* Enable event */
  23. writel(ESM_PIN_MASK(pin), base + ESM_PIN_EN_SET_OFFSET(pin));
  24. }
  25. /**
  26. * k3_esm_probe: configures ESM based on DT data
  27. *
  28. * Parses ESM info from device tree, and configures the module accordingly.
  29. */
  30. static int k3_esm_probe(struct udevice *dev)
  31. {
  32. int ret;
  33. void __iomem *base;
  34. int num_pins;
  35. u32 *pins;
  36. int i;
  37. base = dev_remap_addr_index(dev, 0);
  38. if (!base)
  39. return -ENODEV;
  40. num_pins = dev_read_size(dev, "ti,esm-pins");
  41. if (num_pins < 0) {
  42. dev_err(dev, "ti,esm-pins property missing or invalid: %d\n",
  43. num_pins);
  44. return num_pins;
  45. }
  46. num_pins /= sizeof(u32);
  47. pins = kmalloc(num_pins * sizeof(u32), __GFP_ZERO);
  48. if (!pins)
  49. return -ENOMEM;
  50. ret = dev_read_u32_array(dev, "ti,esm-pins", pins, num_pins);
  51. if (ret < 0) {
  52. dev_err(dev, "failed to read ti,esm-pins property: %d\n",
  53. ret);
  54. goto free_pins;
  55. }
  56. /* Clear any pending events */
  57. writel(ESM_SFT_RST_KEY, base + ESM_SFT_RST);
  58. for (i = 0; i < num_pins; i++)
  59. esm_pin_enable(base, pins[i]);
  60. free_pins:
  61. kfree(pins);
  62. return ret;
  63. }
  64. static const struct udevice_id k3_esm_ids[] = {
  65. { .compatible = "ti,j721e-esm" },
  66. {}
  67. };
  68. U_BOOT_DRIVER(k3_esm) = {
  69. .name = "k3_esm",
  70. .of_match = k3_esm_ids,
  71. .id = UCLASS_MISC,
  72. .probe = k3_esm_probe,
  73. };