soc_mediabus.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. * soc-camera media bus helper routines
  3. *
  4. * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <media/v4l2-device.h>
  13. #include <media/v4l2-mediabus.h>
  14. #include <media/soc_mediabus.h>
  15. #define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1)
  16. static const struct soc_mbus_pixelfmt mbus_fmt[] = {
  17. [MBUS_IDX(YUYV8_2X8_LE)] = {
  18. .fourcc = V4L2_PIX_FMT_YUYV,
  19. .name = "YUYV",
  20. .bits_per_sample = 8,
  21. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  22. .order = SOC_MBUS_ORDER_LE,
  23. }, [MBUS_IDX(YVYU8_2X8_LE)] = {
  24. .fourcc = V4L2_PIX_FMT_YVYU,
  25. .name = "YVYU",
  26. .bits_per_sample = 8,
  27. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  28. .order = SOC_MBUS_ORDER_LE,
  29. }, [MBUS_IDX(YUYV8_2X8_BE)] = {
  30. .fourcc = V4L2_PIX_FMT_UYVY,
  31. .name = "UYVY",
  32. .bits_per_sample = 8,
  33. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  34. .order = SOC_MBUS_ORDER_LE,
  35. }, [MBUS_IDX(YVYU8_2X8_BE)] = {
  36. .fourcc = V4L2_PIX_FMT_VYUY,
  37. .name = "VYUY",
  38. .bits_per_sample = 8,
  39. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  40. .order = SOC_MBUS_ORDER_LE,
  41. }, [MBUS_IDX(RGB555_2X8_PADHI_LE)] = {
  42. .fourcc = V4L2_PIX_FMT_RGB555,
  43. .name = "RGB555",
  44. .bits_per_sample = 8,
  45. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  46. .order = SOC_MBUS_ORDER_LE,
  47. }, [MBUS_IDX(RGB555_2X8_PADHI_BE)] = {
  48. .fourcc = V4L2_PIX_FMT_RGB555X,
  49. .name = "RGB555X",
  50. .bits_per_sample = 8,
  51. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  52. .order = SOC_MBUS_ORDER_LE,
  53. }, [MBUS_IDX(RGB565_2X8_LE)] = {
  54. .fourcc = V4L2_PIX_FMT_RGB565,
  55. .name = "RGB565",
  56. .bits_per_sample = 8,
  57. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  58. .order = SOC_MBUS_ORDER_LE,
  59. }, [MBUS_IDX(RGB565_2X8_BE)] = {
  60. .fourcc = V4L2_PIX_FMT_RGB565X,
  61. .name = "RGB565X",
  62. .bits_per_sample = 8,
  63. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  64. .order = SOC_MBUS_ORDER_LE,
  65. }, [MBUS_IDX(SBGGR8_1X8)] = {
  66. .fourcc = V4L2_PIX_FMT_SBGGR8,
  67. .name = "Bayer 8 BGGR",
  68. .bits_per_sample = 8,
  69. .packing = SOC_MBUS_PACKING_NONE,
  70. .order = SOC_MBUS_ORDER_LE,
  71. }, [MBUS_IDX(SBGGR10_1X10)] = {
  72. .fourcc = V4L2_PIX_FMT_SBGGR10,
  73. .name = "Bayer 10 BGGR",
  74. .bits_per_sample = 10,
  75. .packing = SOC_MBUS_PACKING_EXTEND16,
  76. .order = SOC_MBUS_ORDER_LE,
  77. }, [MBUS_IDX(GREY8_1X8)] = {
  78. .fourcc = V4L2_PIX_FMT_GREY,
  79. .name = "Grey",
  80. .bits_per_sample = 8,
  81. .packing = SOC_MBUS_PACKING_NONE,
  82. .order = SOC_MBUS_ORDER_LE,
  83. }, [MBUS_IDX(Y10_1X10)] = {
  84. .fourcc = V4L2_PIX_FMT_Y10,
  85. .name = "Grey 10bit",
  86. .bits_per_sample = 10,
  87. .packing = SOC_MBUS_PACKING_EXTEND16,
  88. .order = SOC_MBUS_ORDER_LE,
  89. }, [MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = {
  90. .fourcc = V4L2_PIX_FMT_SBGGR10,
  91. .name = "Bayer 10 BGGR",
  92. .bits_per_sample = 8,
  93. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  94. .order = SOC_MBUS_ORDER_LE,
  95. }, [MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = {
  96. .fourcc = V4L2_PIX_FMT_SBGGR10,
  97. .name = "Bayer 10 BGGR",
  98. .bits_per_sample = 8,
  99. .packing = SOC_MBUS_PACKING_2X8_PADLO,
  100. .order = SOC_MBUS_ORDER_LE,
  101. }, [MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = {
  102. .fourcc = V4L2_PIX_FMT_SBGGR10,
  103. .name = "Bayer 10 BGGR",
  104. .bits_per_sample = 8,
  105. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  106. .order = SOC_MBUS_ORDER_BE,
  107. }, [MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = {
  108. .fourcc = V4L2_PIX_FMT_SBGGR10,
  109. .name = "Bayer 10 BGGR",
  110. .bits_per_sample = 8,
  111. .packing = SOC_MBUS_PACKING_2X8_PADLO,
  112. .order = SOC_MBUS_ORDER_BE,
  113. },
  114. };
  115. s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
  116. {
  117. switch (mf->packing) {
  118. case SOC_MBUS_PACKING_NONE:
  119. return width * mf->bits_per_sample / 8;
  120. case SOC_MBUS_PACKING_2X8_PADHI:
  121. case SOC_MBUS_PACKING_2X8_PADLO:
  122. case SOC_MBUS_PACKING_EXTEND16:
  123. return width * 2;
  124. }
  125. return -EINVAL;
  126. }
  127. EXPORT_SYMBOL(soc_mbus_bytes_per_line);
  128. const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
  129. enum v4l2_mbus_pixelcode code)
  130. {
  131. if ((unsigned int)(code - V4L2_MBUS_FMT_FIXED) > ARRAY_SIZE(mbus_fmt))
  132. return NULL;
  133. return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
  134. }
  135. EXPORT_SYMBOL(soc_mbus_get_fmtdesc);
  136. static int __init soc_mbus_init(void)
  137. {
  138. return 0;
  139. }
  140. static void __exit soc_mbus_exit(void)
  141. {
  142. }
  143. module_init(soc_mbus_init);
  144. module_exit(soc_mbus_exit);
  145. MODULE_DESCRIPTION("soc-camera media bus interface");
  146. MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>");
  147. MODULE_LICENSE("GPL v2");