msm_sdexpress.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef __MSM_SDEXPRESS_H
  6. #define __MSM_SDEXPRESS_H
  7. #include <linux/clk.h>
  8. #include <linux/slab.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/of.h>
  13. #include <linux/regulator/consumer.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/of_gpio.h>
  16. #include <linux/delay.h>
  17. #include <linux/gpio/consumer.h>
  18. #include <linux/errno.h>
  19. #include <linux/msm_pcie.h>
  20. #include <linux/kobject.h>
  21. #define DRIVER_NAME "msm_sdexpress"
  22. #define MAX_PROP_SIZE 32
  23. #define SDEXPRESS_VREG_VDD1_DEFAULT_UV 2960000 /* uV */
  24. #define SDEXPRESS_VREG_VDD2_DEFAULT_UV 1800000 /* uV */
  25. #define SDEXPRESS_VREG_DEFAULT_MIN_LOAD_UA 0 /* uA */
  26. #define SDEXPRESS_VREG_DEFAULT_MAX_LODA_UA 600000 /* uA */
  27. #define SDEXPRESS_PROBE_DELAYED_PERIOD 50000 /* msec */
  28. #define PCIE_ENUMERATE_RETRY 3 /* retries upon msm_pcie_enumerate() failure */
  29. /*
  30. * This structure keeps information per regulator
  31. */
  32. struct msm_sdexpress_reg_data {
  33. /* voltage regulator handle */
  34. struct regulator *reg;
  35. /* voltage level to be set */
  36. u32 low_vol_level;
  37. u32 high_vol_level;
  38. /* Load values for low power and high power mode */
  39. u32 lpm_uA;
  40. u32 hpm_uA;
  41. /* regulator name */
  42. const char *name;
  43. /* is this regulator enabled? */
  44. bool is_enabled;
  45. /* is this regulator needs to be always on? */
  46. bool is_always_on;
  47. /* is low power mode setting required for this regulator? */
  48. bool lpm_sup;
  49. bool set_voltage_sup;
  50. };
  51. /*
  52. * This structure keeps information for all the
  53. * regulators required for a SDX slot.
  54. */
  55. struct msm_sdexpress_vreg_data {
  56. /* keeps VDD1 regulator info */
  57. struct msm_sdexpress_reg_data *vdd1_data;
  58. /* keeps VDD2 regulator info */
  59. struct msm_sdexpress_reg_data *vdd2_data;
  60. };
  61. /*
  62. * Structure to hold sdexpress gpio information.
  63. */
  64. struct msm_sdexpress_gpio {
  65. /* gpio_desc */
  66. struct gpio_desc *gpio;
  67. /* gpio irq handler*/
  68. irqreturn_t (*cd_gpio_isr)(int irq, void *dev_id);
  69. /* debounce time value in ms */
  70. u16 cd_debounce_delay_ms;
  71. /* gpio label/name */
  72. char *label;
  73. };
  74. /*
  75. * This structure that defines sdexpress private data.
  76. */
  77. struct msm_sdexpress_info {
  78. /* to know card enumeration status */
  79. bool card_enumerated;
  80. /* sdexpress card detect irq */
  81. int cd_irq;
  82. /* nvme endpoint instance id from pcie */
  83. int pci_nvme_instance;
  84. /* to check the card trigger event */
  85. atomic_t trigger_card_event;
  86. /* struct device from platform device */
  87. struct device *dev;
  88. /* workqueue struct for sdexpress work */
  89. struct workqueue_struct *sdexpress_wq;
  90. /* structure to hold sdexpress voltage reg information */
  91. struct msm_sdexpress_vreg_data *vreg_data;
  92. /* structure to hold sdexpress card detect gpio information */
  93. struct msm_sdexpress_gpio *sdexpress_gpio;
  94. /* structure to hold pcie clkreq gpio information */
  95. struct msm_sdexpress_gpio *sdexpress_clkreq_gpio;
  96. /* sdexpress work item */
  97. struct delayed_work sdex_work;
  98. /* struct kobject for uevents */
  99. struct kobject kobj;
  100. /*
  101. * This lock must be acquired before doing the actual
  102. * card enumerate/deenumerate functionality.
  103. *
  104. * This is required to ensure that there is no race during
  105. * aggressive PIPO of sdexpress card on bootup and other
  106. * use-cases.
  107. */
  108. struct mutex detect_lock;
  109. };
  110. #endif /* MSM_SDEXPRESS_H */