fdt_i2c_dw.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2022 starfivetech.com
  5. *
  6. * Authors:
  7. * Minda Chen <minda.chen@starfivetech.com>
  8. */
  9. #include <sbi/riscv_io.h>
  10. #include <sbi/sbi_error.h>
  11. #include <sbi/sbi_string.h>
  12. #include <sbi_utils/fdt/fdt_helper.h>
  13. #include <sbi_utils/i2c/dw_i2c.h>
  14. #include <sbi_utils/i2c/fdt_i2c.h>
  15. #define FDT_DW_I2C_ADAPTER_MAX 7
  16. static unsigned int fdt_dw_i2c_adapter_count;
  17. static struct dw_i2c_adapter
  18. fdt_dw_i2c_adapter_array[FDT_DW_I2C_ADAPTER_MAX];
  19. extern struct fdt_i2c_adapter fdt_i2c_adapter_dw;
  20. static int fdt_dw_i2c_init(void *fdt, int nodeoff,
  21. const struct fdt_match *match)
  22. {
  23. int rc;
  24. struct dw_i2c_adapter *adapter;
  25. u64 addr;
  26. if (fdt_dw_i2c_adapter_count >= FDT_DW_I2C_ADAPTER_MAX)
  27. return SBI_ENOSPC;
  28. adapter = &fdt_dw_i2c_adapter_array[fdt_dw_i2c_adapter_count];
  29. rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &addr, NULL);
  30. if (rc)
  31. return rc;
  32. adapter->addr = addr;
  33. adapter->adapter.driver = &fdt_i2c_adapter_dw;
  34. rc = dw_i2c_init(&adapter->adapter, nodeoff);
  35. if (rc)
  36. return rc;
  37. fdt_dw_i2c_adapter_count++;
  38. return 0;
  39. }
  40. static const struct fdt_match fdt_dw_i2c_match[] = {
  41. { .compatible = "snps,designware-i2c" },
  42. { .compatible = "starfive,jh7110-i2c" },
  43. { },
  44. };
  45. struct fdt_i2c_adapter fdt_i2c_adapter_dw = {
  46. .match_table = fdt_dw_i2c_match,
  47. .init = fdt_dw_i2c_init,
  48. };