hci_quirks.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * I3C HCI Quirks
  4. *
  5. * Copyright 2024 Advanced Micro Devices, Inc.
  6. *
  7. * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
  8. * Guruvendra Punugupati <Guruvendra.Punugupati@amd.com>
  9. */
  10. #include <linux/i3c/master.h>
  11. #include "hci.h"
  12. /* Timing registers */
  13. #define HCI_SCL_I3C_OD_TIMING 0x214
  14. #define HCI_SCL_I3C_PP_TIMING 0x218
  15. #define HCI_SDA_HOLD_SWITCH_DLY_TIMING 0x230
  16. /* Timing values to configure 9MHz frequency */
  17. #define AMD_SCL_I3C_OD_TIMING 0x00cf00cf
  18. #define AMD_SCL_I3C_PP_TIMING 0x00160016
  19. #define QUEUE_THLD_CTRL 0xD0
  20. void amd_set_od_pp_timing(struct i3c_hci *hci)
  21. {
  22. u32 data;
  23. reg_write(HCI_SCL_I3C_OD_TIMING, AMD_SCL_I3C_OD_TIMING);
  24. reg_write(HCI_SCL_I3C_PP_TIMING, AMD_SCL_I3C_PP_TIMING);
  25. data = reg_read(HCI_SDA_HOLD_SWITCH_DLY_TIMING);
  26. /* Configure maximum TX hold time */
  27. data |= W0_MASK(18, 16);
  28. reg_write(HCI_SDA_HOLD_SWITCH_DLY_TIMING, data);
  29. }
  30. void amd_set_resp_buf_thld(struct i3c_hci *hci)
  31. {
  32. u32 data;
  33. data = reg_read(QUEUE_THLD_CTRL);
  34. data = data & ~W0_MASK(15, 8);
  35. reg_write(QUEUE_THLD_CTRL, data);
  36. }