cs-amp-lib.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2024 Cirrus Logic, Inc. and
  4. * Cirrus Logic International Semiconductor Ltd.
  5. */
  6. #ifndef CS_AMP_LIB_H
  7. #define CS_AMP_LIB_H
  8. #include <linux/efi.h>
  9. #include <linux/types.h>
  10. struct cs_dsp;
  11. struct cirrus_amp_cal_data {
  12. u32 calTarget[2];
  13. u32 calTime[2];
  14. s8 calAmbient;
  15. u8 calStatus;
  16. u16 calR;
  17. } __packed;
  18. struct cirrus_amp_efi_data {
  19. u32 size;
  20. u32 count;
  21. struct cirrus_amp_cal_data data[] __counted_by(count);
  22. } __packed;
  23. /**
  24. * struct cirrus_amp_cal_controls - definition of firmware calibration controls
  25. * @alg_id: ID of algorithm containing the controls.
  26. * @mem_region: DSP memory region containing the controls.
  27. * @ambient: Name of control for calAmbient value.
  28. * @calr: Name of control for calR value.
  29. * @status: Name of control for calStatus value.
  30. * @checksum: Name of control for checksum value.
  31. */
  32. struct cirrus_amp_cal_controls {
  33. unsigned int alg_id;
  34. int mem_region;
  35. const char *ambient;
  36. const char *calr;
  37. const char *status;
  38. const char *checksum;
  39. };
  40. int cs_amp_write_cal_coeffs(struct cs_dsp *dsp,
  41. const struct cirrus_amp_cal_controls *controls,
  42. const struct cirrus_amp_cal_data *data);
  43. int cs_amp_read_cal_coeffs(struct cs_dsp *dsp,
  44. const struct cirrus_amp_cal_controls *controls,
  45. struct cirrus_amp_cal_data *data);
  46. int cs_amp_write_ambient_temp(struct cs_dsp *dsp,
  47. const struct cirrus_amp_cal_controls *controls,
  48. u32 temp);
  49. int cs_amp_get_efi_calibration_data(struct device *dev, u64 target_uid, int amp_index,
  50. struct cirrus_amp_cal_data *out_data);
  51. int cs_amp_set_efi_calibration_data(struct device *dev, int amp_index, int num_amps,
  52. const struct cirrus_amp_cal_data *in_data);
  53. int cs_amp_get_vendor_spkid(struct device *dev);
  54. const char *cs_amp_devm_get_vendor_specific_variant_id(struct device *dev,
  55. int ssid_vendor,
  56. int ssid_device);
  57. struct dentry *cs_amp_create_debugfs(struct device *dev);
  58. static inline u64 cs_amp_cal_target_u64(const struct cirrus_amp_cal_data *data)
  59. {
  60. return ((u64)data->calTarget[1] << 32) | data->calTarget[0];
  61. }
  62. struct cs_amp_test_hooks {
  63. efi_status_t (*get_efi_variable)(efi_char16_t *name,
  64. efi_guid_t *guid,
  65. u32 *returned_attr,
  66. unsigned long *size,
  67. void *buf);
  68. efi_status_t (*set_efi_variable)(efi_char16_t *name,
  69. efi_guid_t *guid,
  70. u32 attr,
  71. unsigned long size,
  72. void *buf);
  73. int (*write_cal_coeff)(struct cs_dsp *dsp,
  74. const struct cirrus_amp_cal_controls *controls,
  75. const char *ctl_name, u32 val);
  76. int (*read_cal_coeff)(struct cs_dsp *dsp,
  77. const struct cirrus_amp_cal_controls *controls,
  78. const char *ctl_name, u32 *val);
  79. };
  80. extern const struct cs_amp_test_hooks * const cs_amp_test_hooks;
  81. #endif /* CS_AMP_LIB_H */