cam_common_util.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/string.h>
  6. #include <linux/types.h>
  7. #include <linux/slab.h>
  8. #include <linux/completion.h>
  9. #include <linux/module.h>
  10. #include <linux/iopoll.h>
  11. #include <linux/moduleparam.h>
  12. #include "cam_common_util.h"
  13. #include "cam_debug_util.h"
  14. static uint timeout_multiplier = 1;
  15. module_param(timeout_multiplier, uint, 0644);
  16. int cam_common_util_get_string_index(const char **strings,
  17. uint32_t num_strings, const char *matching_string, uint32_t *index)
  18. {
  19. int i;
  20. for (i = 0; i < num_strings; i++) {
  21. if (strnstr(strings[i], matching_string, strlen(strings[i]))) {
  22. CAM_DBG(CAM_UTIL, "matched %s : %d\n",
  23. matching_string, i);
  24. *index = i;
  25. return 0;
  26. }
  27. }
  28. return -EINVAL;
  29. }
  30. uint32_t cam_common_util_remove_duplicate_arr(int32_t *arr, uint32_t num)
  31. {
  32. int i, j;
  33. uint32_t wr_idx = 1;
  34. if (!arr) {
  35. CAM_ERR(CAM_UTIL, "Null input array");
  36. return 0;
  37. }
  38. for (i = 1; i < num; i++) {
  39. for (j = 0; j < wr_idx ; j++) {
  40. if (arr[i] == arr[j])
  41. break;
  42. }
  43. if (j == wr_idx)
  44. arr[wr_idx++] = arr[i];
  45. }
  46. return wr_idx;
  47. }
  48. unsigned long cam_common_wait_for_completion_timeout(
  49. struct completion *complete,
  50. unsigned long timeout_jiffies)
  51. {
  52. unsigned long wait_jiffies;
  53. unsigned long rem_jiffies;
  54. if (!complete) {
  55. CAM_ERR(CAM_UTIL, "Null complete pointer");
  56. return 0;
  57. }
  58. if (timeout_multiplier < 1)
  59. timeout_multiplier = 1;
  60. wait_jiffies = timeout_jiffies * timeout_multiplier;
  61. rem_jiffies = wait_for_completion_timeout(
  62. complete, wait_jiffies);
  63. return rem_jiffies;
  64. }
  65. int cam_common_read_poll_timeout(
  66. void __iomem *addr,
  67. unsigned long delay,
  68. unsigned long timeout,
  69. uint32_t mask,
  70. uint32_t check_val,
  71. uint32_t *status)
  72. {
  73. unsigned long wait_time_us;
  74. int rc = -EINVAL;
  75. if (!addr || !status) {
  76. CAM_ERR(CAM_UTIL, "Invalid param addr: %pK status: %pK",
  77. addr, status);
  78. return rc;
  79. }
  80. if (timeout_multiplier < 1)
  81. timeout_multiplier = 1;
  82. wait_time_us = timeout * timeout_multiplier;
  83. rc = readl_poll_timeout(addr,
  84. *status, (*status & mask) == check_val, delay, wait_time_us);
  85. return rc;
  86. }