setup-camif.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (C) 2012 Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
  4. //
  5. // Helper functions for S3C24XX/S3C64XX SoC series CAMIF driver
  6. #include <linux/gpio.h>
  7. #include <plat/gpio-cfg.h>
  8. #include <mach/gpio-samsung.h>
  9. /* Number of camera port pins, without FIELD */
  10. #define S3C_CAMIF_NUM_GPIOS 13
  11. /* Default camera port configuration helpers. */
  12. static void camif_get_gpios(int *gpio_start, int *gpio_reset)
  13. {
  14. #ifdef CONFIG_ARCH_S3C24XX
  15. *gpio_start = S3C2410_GPJ(0);
  16. *gpio_reset = S3C2410_GPJ(12);
  17. #else
  18. /* s3c64xx */
  19. *gpio_start = S3C64XX_GPF(0);
  20. *gpio_reset = S3C64XX_GPF(3);
  21. #endif
  22. }
  23. int s3c_camif_gpio_get(void)
  24. {
  25. int gpio_start, gpio_reset;
  26. int ret, i;
  27. camif_get_gpios(&gpio_start, &gpio_reset);
  28. for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) {
  29. int gpio = gpio_start + i;
  30. if (gpio == gpio_reset)
  31. continue;
  32. ret = gpio_request(gpio, "camif");
  33. if (!ret)
  34. ret = s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  35. if (ret) {
  36. pr_err("failed to configure GPIO %d\n", gpio);
  37. for (--i; i >= 0; i--)
  38. gpio_free(gpio--);
  39. return ret;
  40. }
  41. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
  42. }
  43. return 0;
  44. }
  45. void s3c_camif_gpio_put(void)
  46. {
  47. int i, gpio_start, gpio_reset;
  48. camif_get_gpios(&gpio_start, &gpio_reset);
  49. for (i = 0; i < S3C_CAMIF_NUM_GPIOS; i++) {
  50. int gpio = gpio_start + i;
  51. if (gpio != gpio_reset)
  52. gpio_free(gpio);
  53. }
  54. }