cs35l41_hda.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0
  2. *
  3. * CS35L41 ALSA HDA audio driver
  4. *
  5. * Copyright 2021 Cirrus Logic, Inc.
  6. *
  7. * Author: Lucas Tanure <[email protected]>
  8. */
  9. #ifndef __CS35L41_HDA_H__
  10. #define __CS35L41_HDA_H__
  11. #include <linux/efi.h>
  12. #include <linux/regulator/consumer.h>
  13. #include <linux/gpio/consumer.h>
  14. #include <linux/device.h>
  15. #include <sound/cs35l41.h>
  16. #include <linux/firmware/cirrus/cs_dsp.h>
  17. #include <linux/firmware/cirrus/wmfw.h>
  18. struct cs35l41_amp_cal_data {
  19. u32 calTarget[2];
  20. u32 calTime[2];
  21. s8 calAmbient;
  22. u8 calStatus;
  23. u16 calR;
  24. } __packed;
  25. struct cs35l41_amp_efi_data {
  26. u32 size;
  27. u32 count;
  28. struct cs35l41_amp_cal_data data[];
  29. } __packed;
  30. enum cs35l41_hda_spk_pos {
  31. CS35l41_LEFT,
  32. CS35l41_RIGHT,
  33. };
  34. enum cs35l41_hda_gpio_function {
  35. CS35L41_NOT_USED,
  36. CS35l41_VSPK_SWITCH,
  37. CS35L41_INTERRUPT,
  38. CS35l41_SYNC,
  39. };
  40. struct cs35l41_hda {
  41. struct device *dev;
  42. struct regmap *regmap;
  43. struct gpio_desc *reset_gpio;
  44. struct cs35l41_hw_cfg hw_cfg;
  45. struct hda_codec *codec;
  46. int irq;
  47. int index;
  48. int channel_index;
  49. unsigned volatile long irq_errors;
  50. const char *amp_name;
  51. const char *acpi_subsystem_id;
  52. int firmware_type;
  53. int speaker_id;
  54. struct mutex fw_mutex;
  55. struct work_struct fw_load_work;
  56. struct regmap_irq_chip_data *irq_data;
  57. bool firmware_running;
  58. bool request_fw_load;
  59. bool fw_request_ongoing;
  60. bool halo_initialized;
  61. bool playback_started;
  62. struct cs_dsp cs_dsp;
  63. };
  64. enum halo_state {
  65. HALO_STATE_CODE_INIT_DOWNLOAD = 0,
  66. HALO_STATE_CODE_START,
  67. HALO_STATE_CODE_RUN
  68. };
  69. extern const struct dev_pm_ops cs35l41_hda_pm_ops;
  70. int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq,
  71. struct regmap *regmap);
  72. void cs35l41_hda_remove(struct device *dev);
  73. #endif /*__CS35L41_HDA_H__*/