rcar_vin.c 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002
  1. /*
  2. * SoC-camera host driver for Renesas R-Car VIN unit
  3. *
  4. * Copyright (C) 2011-2013 Renesas Solutions Corp.
  5. * Copyright (C) 2013 Cogent Embedded, Inc., <source@cogentembedded.com>
  6. *
  7. * Based on V4L2 Driver for SuperH Mobile CEU interface "sh_mobile_ceu_camera.c"
  8. *
  9. * Copyright (C) 2008 Magnus Damm
  10. *
  11. * This program is free software; you can redistribute it and/or modify it
  12. * under the terms of the GNU General Public License as published by the
  13. * Free Software Foundation; either version 2 of the License, or (at your
  14. * option) any later version.
  15. */
  16. #include <linux/delay.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/io.h>
  19. #include <linux/kernel.h>
  20. #include <linux/module.h>
  21. #include <linux/of.h>
  22. #include <linux/of_device.h>
  23. #include <linux/platform_data/camera-rcar.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/pm_runtime.h>
  26. #include <linux/slab.h>
  27. #include <linux/videodev2.h>
  28. #include <media/soc_camera.h>
  29. #include <media/soc_mediabus.h>
  30. #include <media/v4l2-common.h>
  31. #include <media/v4l2-dev.h>
  32. #include <media/v4l2-device.h>
  33. #include <media/v4l2-mediabus.h>
  34. #include <media/v4l2-of.h>
  35. #include <media/v4l2-subdev.h>
  36. #include <media/videobuf2-dma-contig.h>
  37. #include "soc_scale_crop.h"
  38. #define DRV_NAME "rcar_vin"
  39. /* Register offsets for R-Car VIN */
  40. #define VNMC_REG 0x00 /* Video n Main Control Register */
  41. #define VNMS_REG 0x04 /* Video n Module Status Register */
  42. #define VNFC_REG 0x08 /* Video n Frame Capture Register */
  43. #define VNSLPRC_REG 0x0C /* Video n Start Line Pre-Clip Register */
  44. #define VNELPRC_REG 0x10 /* Video n End Line Pre-Clip Register */
  45. #define VNSPPRC_REG 0x14 /* Video n Start Pixel Pre-Clip Register */
  46. #define VNEPPRC_REG 0x18 /* Video n End Pixel Pre-Clip Register */
  47. #define VNSLPOC_REG 0x1C /* Video n Start Line Post-Clip Register */
  48. #define VNELPOC_REG 0x20 /* Video n End Line Post-Clip Register */
  49. #define VNSPPOC_REG 0x24 /* Video n Start Pixel Post-Clip Register */
  50. #define VNEPPOC_REG 0x28 /* Video n End Pixel Post-Clip Register */
  51. #define VNIS_REG 0x2C /* Video n Image Stride Register */
  52. #define VNMB_REG(m) (0x30 + ((m) << 2)) /* Video n Memory Base m Register */
  53. #define VNIE_REG 0x40 /* Video n Interrupt Enable Register */
  54. #define VNINTS_REG 0x44 /* Video n Interrupt Status Register */
  55. #define VNSI_REG 0x48 /* Video n Scanline Interrupt Register */
  56. #define VNMTC_REG 0x4C /* Video n Memory Transfer Control Register */
  57. #define VNYS_REG 0x50 /* Video n Y Scale Register */
  58. #define VNXS_REG 0x54 /* Video n X Scale Register */
  59. #define VNDMR_REG 0x58 /* Video n Data Mode Register */
  60. #define VNDMR2_REG 0x5C /* Video n Data Mode Register 2 */
  61. #define VNUVAOF_REG 0x60 /* Video n UV Address Offset Register */
  62. #define VNC1A_REG 0x80 /* Video n Coefficient Set C1A Register */
  63. #define VNC1B_REG 0x84 /* Video n Coefficient Set C1B Register */
  64. #define VNC1C_REG 0x88 /* Video n Coefficient Set C1C Register */
  65. #define VNC2A_REG 0x90 /* Video n Coefficient Set C2A Register */
  66. #define VNC2B_REG 0x94 /* Video n Coefficient Set C2B Register */
  67. #define VNC2C_REG 0x98 /* Video n Coefficient Set C2C Register */
  68. #define VNC3A_REG 0xA0 /* Video n Coefficient Set C3A Register */
  69. #define VNC3B_REG 0xA4 /* Video n Coefficient Set C3B Register */
  70. #define VNC3C_REG 0xA8 /* Video n Coefficient Set C3C Register */
  71. #define VNC4A_REG 0xB0 /* Video n Coefficient Set C4A Register */
  72. #define VNC4B_REG 0xB4 /* Video n Coefficient Set C4B Register */
  73. #define VNC4C_REG 0xB8 /* Video n Coefficient Set C4C Register */
  74. #define VNC5A_REG 0xC0 /* Video n Coefficient Set C5A Register */
  75. #define VNC5B_REG 0xC4 /* Video n Coefficient Set C5B Register */
  76. #define VNC5C_REG 0xC8 /* Video n Coefficient Set C5C Register */
  77. #define VNC6A_REG 0xD0 /* Video n Coefficient Set C6A Register */
  78. #define VNC6B_REG 0xD4 /* Video n Coefficient Set C6B Register */
  79. #define VNC6C_REG 0xD8 /* Video n Coefficient Set C6C Register */
  80. #define VNC7A_REG 0xE0 /* Video n Coefficient Set C7A Register */
  81. #define VNC7B_REG 0xE4 /* Video n Coefficient Set C7B Register */
  82. #define VNC7C_REG 0xE8 /* Video n Coefficient Set C7C Register */
  83. #define VNC8A_REG 0xF0 /* Video n Coefficient Set C8A Register */
  84. #define VNC8B_REG 0xF4 /* Video n Coefficient Set C8B Register */
  85. #define VNC8C_REG 0xF8 /* Video n Coefficient Set C8C Register */
  86. /* Register bit fields for R-Car VIN */
  87. /* Video n Main Control Register bits */
  88. #define VNMC_FOC (1 << 21)
  89. #define VNMC_YCAL (1 << 19)
  90. #define VNMC_INF_YUV8_BT656 (0 << 16)
  91. #define VNMC_INF_YUV8_BT601 (1 << 16)
  92. #define VNMC_INF_YUV10_BT656 (2 << 16)
  93. #define VNMC_INF_YUV10_BT601 (3 << 16)
  94. #define VNMC_INF_YUV16 (5 << 16)
  95. #define VNMC_INF_RGB888 (6 << 16)
  96. #define VNMC_VUP (1 << 10)
  97. #define VNMC_IM_ODD (0 << 3)
  98. #define VNMC_IM_ODD_EVEN (1 << 3)
  99. #define VNMC_IM_EVEN (2 << 3)
  100. #define VNMC_IM_FULL (3 << 3)
  101. #define VNMC_BPS (1 << 1)
  102. #define VNMC_ME (1 << 0)
  103. /* Video n Module Status Register bits */
  104. #define VNMS_FBS_MASK (3 << 3)
  105. #define VNMS_FBS_SHIFT 3
  106. #define VNMS_AV (1 << 1)
  107. #define VNMS_CA (1 << 0)
  108. /* Video n Frame Capture Register bits */
  109. #define VNFC_C_FRAME (1 << 1)
  110. #define VNFC_S_FRAME (1 << 0)
  111. /* Video n Interrupt Enable Register bits */
  112. #define VNIE_FIE (1 << 4)
  113. #define VNIE_EFE (1 << 1)
  114. /* Video n Data Mode Register bits */
  115. #define VNDMR_EXRGB (1 << 8)
  116. #define VNDMR_BPSM (1 << 4)
  117. #define VNDMR_DTMD_YCSEP (1 << 1)
  118. #define VNDMR_DTMD_ARGB1555 (1 << 0)
  119. /* Video n Data Mode Register 2 bits */
  120. #define VNDMR2_VPS (1 << 30)
  121. #define VNDMR2_HPS (1 << 29)
  122. #define VNDMR2_FTEV (1 << 17)
  123. #define VNDMR2_VLV(n) ((n & 0xf) << 12)
  124. #define VIN_MAX_WIDTH 2048
  125. #define VIN_MAX_HEIGHT 2048
  126. #define TIMEOUT_MS 100
  127. enum chip_id {
  128. RCAR_GEN2,
  129. RCAR_H1,
  130. RCAR_M1,
  131. RCAR_E1,
  132. };
  133. struct vin_coeff {
  134. unsigned short xs_value;
  135. u32 coeff_set[24];
  136. };
  137. static const struct vin_coeff vin_coeff_set[] = {
  138. { 0x0000, {
  139. 0x00000000, 0x00000000, 0x00000000,
  140. 0x00000000, 0x00000000, 0x00000000,
  141. 0x00000000, 0x00000000, 0x00000000,
  142. 0x00000000, 0x00000000, 0x00000000,
  143. 0x00000000, 0x00000000, 0x00000000,
  144. 0x00000000, 0x00000000, 0x00000000,
  145. 0x00000000, 0x00000000, 0x00000000,
  146. 0x00000000, 0x00000000, 0x00000000 },
  147. },
  148. { 0x1000, {
  149. 0x000fa400, 0x000fa400, 0x09625902,
  150. 0x000003f8, 0x00000403, 0x3de0d9f0,
  151. 0x001fffed, 0x00000804, 0x3cc1f9c3,
  152. 0x001003de, 0x00000c01, 0x3cb34d7f,
  153. 0x002003d2, 0x00000c00, 0x3d24a92d,
  154. 0x00200bca, 0x00000bff, 0x3df600d2,
  155. 0x002013cc, 0x000007ff, 0x3ed70c7e,
  156. 0x00100fde, 0x00000000, 0x3f87c036 },
  157. },
  158. { 0x1200, {
  159. 0x002ffff1, 0x002ffff1, 0x02a0a9c8,
  160. 0x002003e7, 0x001ffffa, 0x000185bc,
  161. 0x002007dc, 0x000003ff, 0x3e52859c,
  162. 0x00200bd4, 0x00000002, 0x3d53996b,
  163. 0x00100fd0, 0x00000403, 0x3d04ad2d,
  164. 0x00000bd5, 0x00000403, 0x3d35ace7,
  165. 0x3ff003e4, 0x00000801, 0x3dc674a1,
  166. 0x3fffe800, 0x00000800, 0x3e76f461 },
  167. },
  168. { 0x1400, {
  169. 0x00100be3, 0x00100be3, 0x04d1359a,
  170. 0x00000fdb, 0x002003ed, 0x0211fd93,
  171. 0x00000fd6, 0x002003f4, 0x0002d97b,
  172. 0x000007d6, 0x002ffffb, 0x3e93b956,
  173. 0x3ff003da, 0x001003ff, 0x3db49926,
  174. 0x3fffefe9, 0x00100001, 0x3d655cee,
  175. 0x3fffd400, 0x00000003, 0x3d65f4b6,
  176. 0x000fb421, 0x00000402, 0x3dc6547e },
  177. },
  178. { 0x1600, {
  179. 0x00000bdd, 0x00000bdd, 0x06519578,
  180. 0x3ff007da, 0x00000be3, 0x03c24973,
  181. 0x3ff003d9, 0x00000be9, 0x01b30d5f,
  182. 0x3ffff7df, 0x001003f1, 0x0003c542,
  183. 0x000fdfec, 0x001003f7, 0x3ec4711d,
  184. 0x000fc400, 0x002ffffd, 0x3df504f1,
  185. 0x001fa81a, 0x002ffc00, 0x3d957cc2,
  186. 0x002f8c3c, 0x00100000, 0x3db5c891 },
  187. },
  188. { 0x1800, {
  189. 0x3ff003dc, 0x3ff003dc, 0x0791e558,
  190. 0x000ff7dd, 0x3ff007de, 0x05328554,
  191. 0x000fe7e3, 0x3ff00be2, 0x03232546,
  192. 0x000fd7ee, 0x000007e9, 0x0143bd30,
  193. 0x001fb800, 0x000007ee, 0x00044511,
  194. 0x002fa015, 0x000007f4, 0x3ef4bcee,
  195. 0x002f8832, 0x001003f9, 0x3e4514c7,
  196. 0x001f7853, 0x001003fd, 0x3de54c9f },
  197. },
  198. { 0x1a00, {
  199. 0x000fefe0, 0x000fefe0, 0x08721d3c,
  200. 0x001fdbe7, 0x000ffbde, 0x0652a139,
  201. 0x001fcbf0, 0x000003df, 0x0463292e,
  202. 0x002fb3ff, 0x3ff007e3, 0x0293a91d,
  203. 0x002f9c12, 0x3ff00be7, 0x01241905,
  204. 0x001f8c29, 0x000007ed, 0x3fe470eb,
  205. 0x000f7c46, 0x000007f2, 0x3f04b8ca,
  206. 0x3fef7865, 0x000007f6, 0x3e74e4a8 },
  207. },
  208. { 0x1c00, {
  209. 0x001fd3e9, 0x001fd3e9, 0x08f23d26,
  210. 0x002fbff3, 0x001fe3e4, 0x0712ad23,
  211. 0x002fa800, 0x000ff3e0, 0x05631d1b,
  212. 0x001f9810, 0x000ffbe1, 0x03b3890d,
  213. 0x000f8c23, 0x000003e3, 0x0233e8fa,
  214. 0x3fef843b, 0x000003e7, 0x00f430e4,
  215. 0x3fbf8456, 0x3ff00bea, 0x00046cc8,
  216. 0x3f8f8c72, 0x3ff00bef, 0x3f3490ac },
  217. },
  218. { 0x1e00, {
  219. 0x001fbbf4, 0x001fbbf4, 0x09425112,
  220. 0x001fa800, 0x002fc7ed, 0x0792b110,
  221. 0x000f980e, 0x001fdbe6, 0x0613110a,
  222. 0x3fff8c20, 0x001fe7e3, 0x04a368fd,
  223. 0x3fcf8c33, 0x000ff7e2, 0x0343b8ed,
  224. 0x3f9f8c4a, 0x000fffe3, 0x0203f8da,
  225. 0x3f5f9c61, 0x000003e6, 0x00e428c5,
  226. 0x3f1fb07b, 0x000003eb, 0x3fe440af },
  227. },
  228. { 0x2000, {
  229. 0x000fa400, 0x000fa400, 0x09625902,
  230. 0x3fff980c, 0x001fb7f5, 0x0812b0ff,
  231. 0x3fdf901c, 0x001fc7ed, 0x06b2fcfa,
  232. 0x3faf902d, 0x001fd3e8, 0x055348f1,
  233. 0x3f7f983f, 0x001fe3e5, 0x04038ce3,
  234. 0x3f3fa454, 0x001fefe3, 0x02e3c8d1,
  235. 0x3f0fb86a, 0x001ff7e4, 0x01c3e8c0,
  236. 0x3ecfd880, 0x000fffe6, 0x00c404ac },
  237. },
  238. { 0x2200, {
  239. 0x3fdf9c0b, 0x3fdf9c0b, 0x09725cf4,
  240. 0x3fbf9818, 0x3fffa400, 0x0842a8f1,
  241. 0x3f8f9827, 0x000fb3f7, 0x0702f0ec,
  242. 0x3f5fa037, 0x000fc3ef, 0x05d330e4,
  243. 0x3f2fac49, 0x001fcfea, 0x04a364d9,
  244. 0x3effc05c, 0x001fdbe7, 0x038394ca,
  245. 0x3ecfdc6f, 0x001fe7e6, 0x0273b0bb,
  246. 0x3ea00083, 0x001fefe6, 0x0183c0a9 },
  247. },
  248. { 0x2400, {
  249. 0x3f9fa014, 0x3f9fa014, 0x098260e6,
  250. 0x3f7f9c23, 0x3fcf9c0a, 0x08629ce5,
  251. 0x3f4fa431, 0x3fefa400, 0x0742d8e1,
  252. 0x3f1fb440, 0x3fffb3f8, 0x062310d9,
  253. 0x3eefc850, 0x000fbbf2, 0x050340d0,
  254. 0x3ecfe062, 0x000fcbec, 0x041364c2,
  255. 0x3ea00073, 0x001fd3ea, 0x03037cb5,
  256. 0x3e902086, 0x001fdfe8, 0x022388a5 },
  257. },
  258. { 0x2600, {
  259. 0x3f5fa81e, 0x3f5fa81e, 0x096258da,
  260. 0x3f3fac2b, 0x3f8fa412, 0x088290d8,
  261. 0x3f0fbc38, 0x3fafa408, 0x0772c8d5,
  262. 0x3eefcc47, 0x3fcfa800, 0x0672f4ce,
  263. 0x3ecfe456, 0x3fefaffa, 0x05531cc6,
  264. 0x3eb00066, 0x3fffbbf3, 0x047334bb,
  265. 0x3ea01c77, 0x000fc7ee, 0x039348ae,
  266. 0x3ea04486, 0x000fd3eb, 0x02b350a1 },
  267. },
  268. { 0x2800, {
  269. 0x3f2fb426, 0x3f2fb426, 0x094250ce,
  270. 0x3f0fc032, 0x3f4fac1b, 0x086284cd,
  271. 0x3eefd040, 0x3f7fa811, 0x0782acc9,
  272. 0x3ecfe84c, 0x3f9fa807, 0x06a2d8c4,
  273. 0x3eb0005b, 0x3fbfac00, 0x05b2f4bc,
  274. 0x3eb0186a, 0x3fdfb3fa, 0x04c308b4,
  275. 0x3eb04077, 0x3fefbbf4, 0x03f31ca8,
  276. 0x3ec06884, 0x000fbff2, 0x03031c9e },
  277. },
  278. { 0x2a00, {
  279. 0x3f0fc42d, 0x3f0fc42d, 0x090240c4,
  280. 0x3eefd439, 0x3f2fb822, 0x08526cc2,
  281. 0x3edfe845, 0x3f4fb018, 0x078294bf,
  282. 0x3ec00051, 0x3f6fac0f, 0x06b2b4bb,
  283. 0x3ec0185f, 0x3f8fac07, 0x05e2ccb4,
  284. 0x3ec0386b, 0x3fafac00, 0x0502e8ac,
  285. 0x3ed05c77, 0x3fcfb3fb, 0x0432f0a3,
  286. 0x3ef08482, 0x3fdfbbf6, 0x0372f898 },
  287. },
  288. { 0x2c00, {
  289. 0x3eefdc31, 0x3eefdc31, 0x08e238b8,
  290. 0x3edfec3d, 0x3f0fc828, 0x082258b9,
  291. 0x3ed00049, 0x3f1fc01e, 0x077278b6,
  292. 0x3ed01455, 0x3f3fb815, 0x06c294b2,
  293. 0x3ed03460, 0x3f5fb40d, 0x0602acac,
  294. 0x3ef0506c, 0x3f7fb006, 0x0542c0a4,
  295. 0x3f107476, 0x3f9fb400, 0x0472c89d,
  296. 0x3f309c80, 0x3fbfb7fc, 0x03b2cc94 },
  297. },
  298. { 0x2e00, {
  299. 0x3eefec37, 0x3eefec37, 0x088220b0,
  300. 0x3ee00041, 0x3effdc2d, 0x07f244ae,
  301. 0x3ee0144c, 0x3f0fd023, 0x07625cad,
  302. 0x3ef02c57, 0x3f1fc81a, 0x06c274a9,
  303. 0x3f004861, 0x3f3fbc13, 0x060288a6,
  304. 0x3f20686b, 0x3f5fb80c, 0x05529c9e,
  305. 0x3f408c74, 0x3f6fb805, 0x04b2ac96,
  306. 0x3f80ac7e, 0x3f8fb800, 0x0402ac8e },
  307. },
  308. { 0x3000, {
  309. 0x3ef0003a, 0x3ef0003a, 0x084210a6,
  310. 0x3ef01045, 0x3effec32, 0x07b228a7,
  311. 0x3f00284e, 0x3f0fdc29, 0x073244a4,
  312. 0x3f104058, 0x3f0fd420, 0x06a258a2,
  313. 0x3f305c62, 0x3f2fc818, 0x0612689d,
  314. 0x3f508069, 0x3f3fc011, 0x05728496,
  315. 0x3f80a072, 0x3f4fc00a, 0x04d28c90,
  316. 0x3fc0c07b, 0x3f6fbc04, 0x04429088 },
  317. },
  318. { 0x3200, {
  319. 0x3f00103e, 0x3f00103e, 0x07f1fc9e,
  320. 0x3f102447, 0x3f000035, 0x0782149d,
  321. 0x3f203c4f, 0x3f0ff02c, 0x07122c9c,
  322. 0x3f405458, 0x3f0fe424, 0x06924099,
  323. 0x3f607061, 0x3f1fd41d, 0x06024c97,
  324. 0x3f909068, 0x3f2fcc16, 0x05726490,
  325. 0x3fc0b070, 0x3f3fc80f, 0x04f26c8a,
  326. 0x0000d077, 0x3f4fc409, 0x04627484 },
  327. },
  328. { 0x3400, {
  329. 0x3f202040, 0x3f202040, 0x07a1e898,
  330. 0x3f303449, 0x3f100c38, 0x0741fc98,
  331. 0x3f504c50, 0x3f10002f, 0x06e21495,
  332. 0x3f706459, 0x3f1ff028, 0x06722492,
  333. 0x3fa08060, 0x3f1fe421, 0x05f2348f,
  334. 0x3fd09c67, 0x3f1fdc19, 0x05824c89,
  335. 0x0000bc6e, 0x3f2fd014, 0x04f25086,
  336. 0x0040dc74, 0x3f3fcc0d, 0x04825c7f },
  337. },
  338. { 0x3600, {
  339. 0x3f403042, 0x3f403042, 0x0761d890,
  340. 0x3f504848, 0x3f301c3b, 0x0701f090,
  341. 0x3f805c50, 0x3f200c33, 0x06a2008f,
  342. 0x3fa07458, 0x3f10002b, 0x06520c8d,
  343. 0x3fd0905e, 0x3f1ff424, 0x05e22089,
  344. 0x0000ac65, 0x3f1fe81d, 0x05823483,
  345. 0x0030cc6a, 0x3f2fdc18, 0x04f23c81,
  346. 0x0080e871, 0x3f2fd412, 0x0482407c },
  347. },
  348. { 0x3800, {
  349. 0x3f604043, 0x3f604043, 0x0721c88a,
  350. 0x3f80544a, 0x3f502c3c, 0x06d1d88a,
  351. 0x3fb06851, 0x3f301c35, 0x0681e889,
  352. 0x3fd08456, 0x3f30082f, 0x0611fc88,
  353. 0x00009c5d, 0x3f200027, 0x05d20884,
  354. 0x0030b863, 0x3f2ff421, 0x05621880,
  355. 0x0070d468, 0x3f2fe81b, 0x0502247c,
  356. 0x00c0ec6f, 0x3f2fe015, 0x04a22877 },
  357. },
  358. { 0x3a00, {
  359. 0x3f904c44, 0x3f904c44, 0x06e1b884,
  360. 0x3fb0604a, 0x3f70383e, 0x0691c885,
  361. 0x3fe07451, 0x3f502c36, 0x0661d483,
  362. 0x00009055, 0x3f401831, 0x0601ec81,
  363. 0x0030a85b, 0x3f300c2a, 0x05b1f480,
  364. 0x0070c061, 0x3f300024, 0x0562047a,
  365. 0x00b0d867, 0x3f3ff41e, 0x05020c77,
  366. 0x00f0f46b, 0x3f2fec19, 0x04a21474 },
  367. },
  368. { 0x3c00, {
  369. 0x3fb05c43, 0x3fb05c43, 0x06c1b07e,
  370. 0x3fe06c4b, 0x3f902c3f, 0x0681c081,
  371. 0x0000844f, 0x3f703838, 0x0631cc7d,
  372. 0x00309855, 0x3f602433, 0x05d1d47e,
  373. 0x0060b459, 0x3f50142e, 0x0581e47b,
  374. 0x00a0c85f, 0x3f400828, 0x0531f078,
  375. 0x00e0e064, 0x3f300021, 0x0501fc73,
  376. 0x00b0fc6a, 0x3f3ff41d, 0x04a20873 },
  377. },
  378. { 0x3e00, {
  379. 0x3fe06444, 0x3fe06444, 0x0681a07a,
  380. 0x00007849, 0x3fc0503f, 0x0641b07a,
  381. 0x0020904d, 0x3fa0403a, 0x05f1c07a,
  382. 0x0060a453, 0x3f803034, 0x05c1c878,
  383. 0x0090b858, 0x3f70202f, 0x0571d477,
  384. 0x00d0d05d, 0x3f501829, 0x0531e073,
  385. 0x0110e462, 0x3f500825, 0x04e1e471,
  386. 0x01510065, 0x3f40001f, 0x04a1f06d },
  387. },
  388. { 0x4000, {
  389. 0x00007044, 0x00007044, 0x06519476,
  390. 0x00208448, 0x3fe05c3f, 0x0621a476,
  391. 0x0050984d, 0x3fc04c3a, 0x05e1b075,
  392. 0x0080ac52, 0x3fa03c35, 0x05a1b875,
  393. 0x00c0c056, 0x3f803030, 0x0561c473,
  394. 0x0100d45b, 0x3f70202b, 0x0521d46f,
  395. 0x0140e860, 0x3f601427, 0x04d1d46e,
  396. 0x01810064, 0x3f500822, 0x0491dc6b },
  397. },
  398. { 0x5000, {
  399. 0x0110a442, 0x0110a442, 0x0551545e,
  400. 0x0140b045, 0x00e0983f, 0x0531585f,
  401. 0x0160c047, 0x00c08c3c, 0x0511645e,
  402. 0x0190cc4a, 0x00908039, 0x04f1685f,
  403. 0x01c0dc4c, 0x00707436, 0x04d1705e,
  404. 0x0200e850, 0x00506833, 0x04b1785b,
  405. 0x0230f453, 0x00305c30, 0x0491805a,
  406. 0x02710056, 0x0010542d, 0x04718059 },
  407. },
  408. { 0x6000, {
  409. 0x01c0bc40, 0x01c0bc40, 0x04c13052,
  410. 0x01e0c841, 0x01a0b43d, 0x04c13851,
  411. 0x0210cc44, 0x0180a83c, 0x04a13453,
  412. 0x0230d845, 0x0160a03a, 0x04913c52,
  413. 0x0260e047, 0x01409838, 0x04714052,
  414. 0x0280ec49, 0x01208c37, 0x04514c50,
  415. 0x02b0f44b, 0x01008435, 0x04414c50,
  416. 0x02d1004c, 0x00e07c33, 0x0431544f },
  417. },
  418. { 0x7000, {
  419. 0x0230c83e, 0x0230c83e, 0x04711c4c,
  420. 0x0250d03f, 0x0210c43c, 0x0471204b,
  421. 0x0270d840, 0x0200b83c, 0x0451244b,
  422. 0x0290dc42, 0x01e0b43a, 0x0441244c,
  423. 0x02b0e443, 0x01c0b038, 0x0441284b,
  424. 0x02d0ec44, 0x01b0a438, 0x0421304a,
  425. 0x02f0f445, 0x0190a036, 0x04213449,
  426. 0x0310f847, 0x01709c34, 0x04213848 },
  427. },
  428. { 0x8000, {
  429. 0x0280d03d, 0x0280d03d, 0x04310c48,
  430. 0x02a0d43e, 0x0270c83c, 0x04311047,
  431. 0x02b0dc3e, 0x0250c83a, 0x04311447,
  432. 0x02d0e040, 0x0240c03a, 0x04211446,
  433. 0x02e0e840, 0x0220bc39, 0x04111847,
  434. 0x0300e842, 0x0210b438, 0x04012445,
  435. 0x0310f043, 0x0200b037, 0x04012045,
  436. 0x0330f444, 0x01e0ac36, 0x03f12445 },
  437. },
  438. { 0xefff, {
  439. 0x0340dc3a, 0x0340dc3a, 0x03b0ec40,
  440. 0x0340e03a, 0x0330e039, 0x03c0f03e,
  441. 0x0350e03b, 0x0330dc39, 0x03c0ec3e,
  442. 0x0350e43a, 0x0320dc38, 0x03c0f43e,
  443. 0x0360e43b, 0x0320d839, 0x03b0f03e,
  444. 0x0360e83b, 0x0310d838, 0x03c0fc3b,
  445. 0x0370e83b, 0x0310d439, 0x03a0f83d,
  446. 0x0370e83c, 0x0300d438, 0x03b0fc3c },
  447. }
  448. };
  449. enum rcar_vin_state {
  450. STOPPED = 0,
  451. RUNNING,
  452. STOPPING,
  453. };
  454. struct rcar_vin_priv {
  455. void __iomem *base;
  456. spinlock_t lock;
  457. int sequence;
  458. /* State of the VIN module in capturing mode */
  459. enum rcar_vin_state state;
  460. struct soc_camera_host ici;
  461. struct list_head capture;
  462. #define MAX_BUFFER_NUM 3
  463. struct vb2_v4l2_buffer *queue_buf[MAX_BUFFER_NUM];
  464. struct vb2_alloc_ctx *alloc_ctx;
  465. enum v4l2_field field;
  466. unsigned int pdata_flags;
  467. unsigned int vb_count;
  468. unsigned int nr_hw_slots;
  469. bool request_to_stop;
  470. struct completion capture_stop;
  471. enum chip_id chip;
  472. };
  473. #define is_continuous_transfer(priv) (priv->vb_count > MAX_BUFFER_NUM)
  474. struct rcar_vin_buffer {
  475. struct vb2_v4l2_buffer vb;
  476. struct list_head list;
  477. };
  478. #define to_buf_list(vb2_buffer) (&container_of(vb2_buffer, \
  479. struct rcar_vin_buffer, \
  480. vb)->list)
  481. struct rcar_vin_cam {
  482. /* VIN offsets within the camera output, before the VIN scaler */
  483. unsigned int vin_left;
  484. unsigned int vin_top;
  485. /* Client output, as seen by the VIN */
  486. unsigned int width;
  487. unsigned int height;
  488. /* User window from S_FMT */
  489. unsigned int out_width;
  490. unsigned int out_height;
  491. /*
  492. * User window from S_CROP / G_CROP, produced by client cropping and
  493. * scaling, VIN scaling and VIN cropping, mapped back onto the client
  494. * input window
  495. */
  496. struct v4l2_rect subrect;
  497. /* Camera cropping rectangle */
  498. struct v4l2_rect rect;
  499. const struct soc_mbus_pixelfmt *extra_fmt;
  500. };
  501. /*
  502. * .queue_setup() is called to check whether the driver can accept the requested
  503. * number of buffers and to fill in plane sizes for the current frame format if
  504. * required
  505. */
  506. static int rcar_vin_videobuf_setup(struct vb2_queue *vq,
  507. const void *parg,
  508. unsigned int *count,
  509. unsigned int *num_planes,
  510. unsigned int sizes[], void *alloc_ctxs[])
  511. {
  512. const struct v4l2_format *fmt = parg;
  513. struct soc_camera_device *icd = soc_camera_from_vb2q(vq);
  514. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  515. struct rcar_vin_priv *priv = ici->priv;
  516. if (fmt) {
  517. const struct soc_camera_format_xlate *xlate;
  518. unsigned int bytes_per_line;
  519. int ret;
  520. if (fmt->fmt.pix.sizeimage < icd->sizeimage)
  521. return -EINVAL;
  522. xlate = soc_camera_xlate_by_fourcc(icd,
  523. fmt->fmt.pix.pixelformat);
  524. if (!xlate)
  525. return -EINVAL;
  526. ret = soc_mbus_bytes_per_line(fmt->fmt.pix.width,
  527. xlate->host_fmt);
  528. if (ret < 0)
  529. return ret;
  530. bytes_per_line = max_t(u32, fmt->fmt.pix.bytesperline, ret);
  531. ret = soc_mbus_image_size(xlate->host_fmt, bytes_per_line,
  532. fmt->fmt.pix.height);
  533. if (ret < 0)
  534. return ret;
  535. sizes[0] = max_t(u32, fmt->fmt.pix.sizeimage, ret);
  536. } else {
  537. /* Called from VIDIOC_REQBUFS or in compatibility mode */
  538. sizes[0] = icd->sizeimage;
  539. }
  540. alloc_ctxs[0] = priv->alloc_ctx;
  541. if (!vq->num_buffers)
  542. priv->sequence = 0;
  543. if (!*count)
  544. *count = 2;
  545. priv->vb_count = *count;
  546. *num_planes = 1;
  547. /* Number of hardware slots */
  548. if (is_continuous_transfer(priv))
  549. priv->nr_hw_slots = MAX_BUFFER_NUM;
  550. else
  551. priv->nr_hw_slots = 1;
  552. dev_dbg(icd->parent, "count=%d, size=%u\n", *count, sizes[0]);
  553. return 0;
  554. }
  555. static int rcar_vin_setup(struct rcar_vin_priv *priv)
  556. {
  557. struct soc_camera_device *icd = priv->ici.icd;
  558. struct rcar_vin_cam *cam = icd->host_priv;
  559. u32 vnmc, dmr, interrupts;
  560. bool progressive = false, output_is_yuv = false, input_is_yuv = false;
  561. switch (priv->field) {
  562. case V4L2_FIELD_TOP:
  563. vnmc = VNMC_IM_ODD;
  564. break;
  565. case V4L2_FIELD_BOTTOM:
  566. vnmc = VNMC_IM_EVEN;
  567. break;
  568. case V4L2_FIELD_INTERLACED:
  569. case V4L2_FIELD_INTERLACED_TB:
  570. vnmc = VNMC_IM_FULL;
  571. break;
  572. case V4L2_FIELD_INTERLACED_BT:
  573. vnmc = VNMC_IM_FULL | VNMC_FOC;
  574. break;
  575. case V4L2_FIELD_NONE:
  576. if (is_continuous_transfer(priv)) {
  577. vnmc = VNMC_IM_ODD_EVEN;
  578. progressive = true;
  579. } else {
  580. vnmc = VNMC_IM_ODD;
  581. }
  582. break;
  583. default:
  584. vnmc = VNMC_IM_ODD;
  585. break;
  586. }
  587. /* input interface */
  588. switch (icd->current_fmt->code) {
  589. case MEDIA_BUS_FMT_YUYV8_1X16:
  590. /* BT.601/BT.1358 16bit YCbCr422 */
  591. vnmc |= VNMC_INF_YUV16;
  592. input_is_yuv = true;
  593. break;
  594. case MEDIA_BUS_FMT_YUYV8_2X8:
  595. /* BT.656 8bit YCbCr422 or BT.601 8bit YCbCr422 */
  596. vnmc |= priv->pdata_flags & RCAR_VIN_BT656 ?
  597. VNMC_INF_YUV8_BT656 : VNMC_INF_YUV8_BT601;
  598. input_is_yuv = true;
  599. break;
  600. case MEDIA_BUS_FMT_RGB888_1X24:
  601. vnmc |= VNMC_INF_RGB888;
  602. break;
  603. case MEDIA_BUS_FMT_YUYV10_2X10:
  604. /* BT.656 10bit YCbCr422 or BT.601 10bit YCbCr422 */
  605. vnmc |= priv->pdata_flags & RCAR_VIN_BT656 ?
  606. VNMC_INF_YUV10_BT656 : VNMC_INF_YUV10_BT601;
  607. input_is_yuv = true;
  608. break;
  609. default:
  610. break;
  611. }
  612. /* output format */
  613. switch (icd->current_fmt->host_fmt->fourcc) {
  614. case V4L2_PIX_FMT_NV16:
  615. iowrite32(ALIGN(cam->width * cam->height, 0x80),
  616. priv->base + VNUVAOF_REG);
  617. dmr = VNDMR_DTMD_YCSEP;
  618. output_is_yuv = true;
  619. break;
  620. case V4L2_PIX_FMT_YUYV:
  621. dmr = VNDMR_BPSM;
  622. output_is_yuv = true;
  623. break;
  624. case V4L2_PIX_FMT_UYVY:
  625. dmr = 0;
  626. output_is_yuv = true;
  627. break;
  628. case V4L2_PIX_FMT_RGB555X:
  629. dmr = VNDMR_DTMD_ARGB1555;
  630. break;
  631. case V4L2_PIX_FMT_RGB565:
  632. dmr = 0;
  633. break;
  634. case V4L2_PIX_FMT_RGB32:
  635. if (priv->chip == RCAR_GEN2 || priv->chip == RCAR_H1 ||
  636. priv->chip == RCAR_E1) {
  637. dmr = VNDMR_EXRGB;
  638. break;
  639. }
  640. default:
  641. dev_warn(icd->parent, "Invalid fourcc format (0x%x)\n",
  642. icd->current_fmt->host_fmt->fourcc);
  643. return -EINVAL;
  644. }
  645. /* Always update on field change */
  646. vnmc |= VNMC_VUP;
  647. /* If input and output use the same colorspace, use bypass mode */
  648. if (input_is_yuv == output_is_yuv)
  649. vnmc |= VNMC_BPS;
  650. /* progressive or interlaced mode */
  651. interrupts = progressive ? VNIE_FIE : VNIE_EFE;
  652. /* ack interrupts */
  653. iowrite32(interrupts, priv->base + VNINTS_REG);
  654. /* enable interrupts */
  655. iowrite32(interrupts, priv->base + VNIE_REG);
  656. /* start capturing */
  657. iowrite32(dmr, priv->base + VNDMR_REG);
  658. iowrite32(vnmc | VNMC_ME, priv->base + VNMC_REG);
  659. return 0;
  660. }
  661. static void rcar_vin_capture(struct rcar_vin_priv *priv)
  662. {
  663. if (is_continuous_transfer(priv))
  664. /* Continuous Frame Capture Mode */
  665. iowrite32(VNFC_C_FRAME, priv->base + VNFC_REG);
  666. else
  667. /* Single Frame Capture Mode */
  668. iowrite32(VNFC_S_FRAME, priv->base + VNFC_REG);
  669. }
  670. static void rcar_vin_request_capture_stop(struct rcar_vin_priv *priv)
  671. {
  672. priv->state = STOPPING;
  673. /* set continuous & single transfer off */
  674. iowrite32(0, priv->base + VNFC_REG);
  675. /* disable capture (release DMA buffer), reset */
  676. iowrite32(ioread32(priv->base + VNMC_REG) & ~VNMC_ME,
  677. priv->base + VNMC_REG);
  678. /* update the status if stopped already */
  679. if (!(ioread32(priv->base + VNMS_REG) & VNMS_CA))
  680. priv->state = STOPPED;
  681. }
  682. static int rcar_vin_get_free_hw_slot(struct rcar_vin_priv *priv)
  683. {
  684. int slot;
  685. for (slot = 0; slot < priv->nr_hw_slots; slot++)
  686. if (priv->queue_buf[slot] == NULL)
  687. return slot;
  688. return -1;
  689. }
  690. static int rcar_vin_hw_ready(struct rcar_vin_priv *priv)
  691. {
  692. /* Ensure all HW slots are filled */
  693. return rcar_vin_get_free_hw_slot(priv) < 0 ? 1 : 0;
  694. }
  695. /* Moves a buffer from the queue to the HW slots */
  696. static int rcar_vin_fill_hw_slot(struct rcar_vin_priv *priv)
  697. {
  698. struct vb2_v4l2_buffer *vbuf;
  699. dma_addr_t phys_addr_top;
  700. int slot;
  701. if (list_empty(&priv->capture))
  702. return 0;
  703. /* Find a free HW slot */
  704. slot = rcar_vin_get_free_hw_slot(priv);
  705. if (slot < 0)
  706. return 0;
  707. vbuf = &list_entry(priv->capture.next,
  708. struct rcar_vin_buffer, list)->vb;
  709. list_del_init(to_buf_list(vbuf));
  710. priv->queue_buf[slot] = vbuf;
  711. phys_addr_top = vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0);
  712. iowrite32(phys_addr_top, priv->base + VNMB_REG(slot));
  713. return 1;
  714. }
  715. static void rcar_vin_videobuf_queue(struct vb2_buffer *vb)
  716. {
  717. struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
  718. struct soc_camera_device *icd = soc_camera_from_vb2q(vb->vb2_queue);
  719. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  720. struct rcar_vin_priv *priv = ici->priv;
  721. unsigned long size;
  722. size = icd->sizeimage;
  723. if (vb2_plane_size(vb, 0) < size) {
  724. dev_err(icd->parent, "Buffer #%d too small (%lu < %lu)\n",
  725. vb->index, vb2_plane_size(vb, 0), size);
  726. goto error;
  727. }
  728. vb2_set_plane_payload(vb, 0, size);
  729. dev_dbg(icd->parent, "%s (vb=0x%p) 0x%p %lu\n", __func__,
  730. vb, vb2_plane_vaddr(vb, 0), vb2_get_plane_payload(vb, 0));
  731. spin_lock_irq(&priv->lock);
  732. list_add_tail(to_buf_list(vbuf), &priv->capture);
  733. rcar_vin_fill_hw_slot(priv);
  734. /* If we weren't running, and have enough buffers, start capturing! */
  735. if (priv->state != RUNNING && rcar_vin_hw_ready(priv)) {
  736. if (rcar_vin_setup(priv)) {
  737. /* Submit error */
  738. list_del_init(to_buf_list(vbuf));
  739. spin_unlock_irq(&priv->lock);
  740. goto error;
  741. }
  742. priv->request_to_stop = false;
  743. init_completion(&priv->capture_stop);
  744. priv->state = RUNNING;
  745. rcar_vin_capture(priv);
  746. }
  747. spin_unlock_irq(&priv->lock);
  748. return;
  749. error:
  750. vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
  751. }
  752. /*
  753. * Wait for capture to stop and all in-flight buffers to be finished with by
  754. * the video hardware. This must be called under &priv->lock
  755. *
  756. */
  757. static void rcar_vin_wait_stop_streaming(struct rcar_vin_priv *priv)
  758. {
  759. while (priv->state != STOPPED) {
  760. /* issue stop if running */
  761. if (priv->state == RUNNING)
  762. rcar_vin_request_capture_stop(priv);
  763. /* wait until capturing has been stopped */
  764. if (priv->state == STOPPING) {
  765. priv->request_to_stop = true;
  766. spin_unlock_irq(&priv->lock);
  767. if (!wait_for_completion_timeout(
  768. &priv->capture_stop,
  769. msecs_to_jiffies(TIMEOUT_MS)))
  770. priv->state = STOPPED;
  771. spin_lock_irq(&priv->lock);
  772. }
  773. }
  774. }
  775. static void rcar_vin_stop_streaming(struct vb2_queue *vq)
  776. {
  777. struct soc_camera_device *icd = soc_camera_from_vb2q(vq);
  778. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  779. struct rcar_vin_priv *priv = ici->priv;
  780. struct list_head *buf_head, *tmp;
  781. int i;
  782. spin_lock_irq(&priv->lock);
  783. rcar_vin_wait_stop_streaming(priv);
  784. for (i = 0; i < MAX_BUFFER_NUM; i++) {
  785. if (priv->queue_buf[i]) {
  786. vb2_buffer_done(&priv->queue_buf[i]->vb2_buf,
  787. VB2_BUF_STATE_ERROR);
  788. priv->queue_buf[i] = NULL;
  789. }
  790. }
  791. list_for_each_safe(buf_head, tmp, &priv->capture) {
  792. vb2_buffer_done(&list_entry(buf_head,
  793. struct rcar_vin_buffer, list)->vb.vb2_buf,
  794. VB2_BUF_STATE_ERROR);
  795. list_del_init(buf_head);
  796. }
  797. spin_unlock_irq(&priv->lock);
  798. }
  799. static struct vb2_ops rcar_vin_vb2_ops = {
  800. .queue_setup = rcar_vin_videobuf_setup,
  801. .buf_queue = rcar_vin_videobuf_queue,
  802. .stop_streaming = rcar_vin_stop_streaming,
  803. .wait_prepare = vb2_ops_wait_prepare,
  804. .wait_finish = vb2_ops_wait_finish,
  805. };
  806. static irqreturn_t rcar_vin_irq(int irq, void *data)
  807. {
  808. struct rcar_vin_priv *priv = data;
  809. u32 int_status;
  810. bool can_run = false, hw_stopped;
  811. int slot;
  812. unsigned int handled = 0;
  813. spin_lock(&priv->lock);
  814. int_status = ioread32(priv->base + VNINTS_REG);
  815. if (!int_status)
  816. goto done;
  817. /* ack interrupts */
  818. iowrite32(int_status, priv->base + VNINTS_REG);
  819. handled = 1;
  820. /* nothing to do if capture status is 'STOPPED' */
  821. if (priv->state == STOPPED)
  822. goto done;
  823. hw_stopped = !(ioread32(priv->base + VNMS_REG) & VNMS_CA);
  824. if (!priv->request_to_stop) {
  825. if (is_continuous_transfer(priv))
  826. slot = (ioread32(priv->base + VNMS_REG) &
  827. VNMS_FBS_MASK) >> VNMS_FBS_SHIFT;
  828. else
  829. slot = 0;
  830. priv->queue_buf[slot]->field = priv->field;
  831. priv->queue_buf[slot]->sequence = priv->sequence++;
  832. v4l2_get_timestamp(&priv->queue_buf[slot]->timestamp);
  833. vb2_buffer_done(&priv->queue_buf[slot]->vb2_buf,
  834. VB2_BUF_STATE_DONE);
  835. priv->queue_buf[slot] = NULL;
  836. if (priv->state != STOPPING)
  837. can_run = rcar_vin_fill_hw_slot(priv);
  838. if (hw_stopped || !can_run) {
  839. priv->state = STOPPED;
  840. } else if (is_continuous_transfer(priv) &&
  841. list_empty(&priv->capture) &&
  842. priv->state == RUNNING) {
  843. /*
  844. * The continuous capturing requires an explicit stop
  845. * operation when there is no buffer to be set into
  846. * the VnMBm registers.
  847. */
  848. rcar_vin_request_capture_stop(priv);
  849. } else {
  850. rcar_vin_capture(priv);
  851. }
  852. } else if (hw_stopped) {
  853. priv->state = STOPPED;
  854. priv->request_to_stop = false;
  855. complete(&priv->capture_stop);
  856. }
  857. done:
  858. spin_unlock(&priv->lock);
  859. return IRQ_RETVAL(handled);
  860. }
  861. static int rcar_vin_add_device(struct soc_camera_device *icd)
  862. {
  863. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  864. struct rcar_vin_priv *priv = ici->priv;
  865. int i;
  866. for (i = 0; i < MAX_BUFFER_NUM; i++)
  867. priv->queue_buf[i] = NULL;
  868. pm_runtime_get_sync(ici->v4l2_dev.dev);
  869. dev_dbg(icd->parent, "R-Car VIN driver attached to camera %d\n",
  870. icd->devnum);
  871. return 0;
  872. }
  873. static void rcar_vin_remove_device(struct soc_camera_device *icd)
  874. {
  875. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  876. struct rcar_vin_priv *priv = ici->priv;
  877. struct vb2_v4l2_buffer *vbuf;
  878. int i;
  879. /* disable capture, disable interrupts */
  880. iowrite32(ioread32(priv->base + VNMC_REG) & ~VNMC_ME,
  881. priv->base + VNMC_REG);
  882. iowrite32(0, priv->base + VNIE_REG);
  883. priv->state = STOPPED;
  884. priv->request_to_stop = false;
  885. /* make sure active buffer is cancelled */
  886. spin_lock_irq(&priv->lock);
  887. for (i = 0; i < MAX_BUFFER_NUM; i++) {
  888. vbuf = priv->queue_buf[i];
  889. if (vbuf) {
  890. list_del_init(to_buf_list(vbuf));
  891. vb2_buffer_done(&vbuf->vb2_buf, VB2_BUF_STATE_ERROR);
  892. }
  893. }
  894. spin_unlock_irq(&priv->lock);
  895. pm_runtime_put(ici->v4l2_dev.dev);
  896. dev_dbg(icd->parent, "R-Car VIN driver detached from camera %d\n",
  897. icd->devnum);
  898. }
  899. static void set_coeff(struct rcar_vin_priv *priv, unsigned short xs)
  900. {
  901. int i;
  902. const struct vin_coeff *p_prev_set = NULL;
  903. const struct vin_coeff *p_set = NULL;
  904. /* Look for suitable coefficient values */
  905. for (i = 0; i < ARRAY_SIZE(vin_coeff_set); i++) {
  906. p_prev_set = p_set;
  907. p_set = &vin_coeff_set[i];
  908. if (xs < p_set->xs_value)
  909. break;
  910. }
  911. /* Use previous value if its XS value is closer */
  912. if (p_prev_set && p_set &&
  913. xs - p_prev_set->xs_value < p_set->xs_value - xs)
  914. p_set = p_prev_set;
  915. /* Set coefficient registers */
  916. iowrite32(p_set->coeff_set[0], priv->base + VNC1A_REG);
  917. iowrite32(p_set->coeff_set[1], priv->base + VNC1B_REG);
  918. iowrite32(p_set->coeff_set[2], priv->base + VNC1C_REG);
  919. iowrite32(p_set->coeff_set[3], priv->base + VNC2A_REG);
  920. iowrite32(p_set->coeff_set[4], priv->base + VNC2B_REG);
  921. iowrite32(p_set->coeff_set[5], priv->base + VNC2C_REG);
  922. iowrite32(p_set->coeff_set[6], priv->base + VNC3A_REG);
  923. iowrite32(p_set->coeff_set[7], priv->base + VNC3B_REG);
  924. iowrite32(p_set->coeff_set[8], priv->base + VNC3C_REG);
  925. iowrite32(p_set->coeff_set[9], priv->base + VNC4A_REG);
  926. iowrite32(p_set->coeff_set[10], priv->base + VNC4B_REG);
  927. iowrite32(p_set->coeff_set[11], priv->base + VNC4C_REG);
  928. iowrite32(p_set->coeff_set[12], priv->base + VNC5A_REG);
  929. iowrite32(p_set->coeff_set[13], priv->base + VNC5B_REG);
  930. iowrite32(p_set->coeff_set[14], priv->base + VNC5C_REG);
  931. iowrite32(p_set->coeff_set[15], priv->base + VNC6A_REG);
  932. iowrite32(p_set->coeff_set[16], priv->base + VNC6B_REG);
  933. iowrite32(p_set->coeff_set[17], priv->base + VNC6C_REG);
  934. iowrite32(p_set->coeff_set[18], priv->base + VNC7A_REG);
  935. iowrite32(p_set->coeff_set[19], priv->base + VNC7B_REG);
  936. iowrite32(p_set->coeff_set[20], priv->base + VNC7C_REG);
  937. iowrite32(p_set->coeff_set[21], priv->base + VNC8A_REG);
  938. iowrite32(p_set->coeff_set[22], priv->base + VNC8B_REG);
  939. iowrite32(p_set->coeff_set[23], priv->base + VNC8C_REG);
  940. }
  941. /* rect is guaranteed to not exceed the scaled camera rectangle */
  942. static int rcar_vin_set_rect(struct soc_camera_device *icd)
  943. {
  944. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  945. struct rcar_vin_cam *cam = icd->host_priv;
  946. struct rcar_vin_priv *priv = ici->priv;
  947. unsigned int left_offset, top_offset;
  948. unsigned char dsize = 0;
  949. struct v4l2_rect *cam_subrect = &cam->subrect;
  950. u32 value;
  951. dev_dbg(icd->parent, "Crop %ux%u@%u:%u\n",
  952. icd->user_width, icd->user_height, cam->vin_left, cam->vin_top);
  953. left_offset = cam->vin_left;
  954. top_offset = cam->vin_top;
  955. if (icd->current_fmt->host_fmt->fourcc == V4L2_PIX_FMT_RGB32 &&
  956. priv->chip == RCAR_E1)
  957. dsize = 1;
  958. dev_dbg(icd->parent, "Cam %ux%u@%u:%u\n",
  959. cam->width, cam->height, cam->vin_left, cam->vin_top);
  960. dev_dbg(icd->parent, "Cam subrect %ux%u@%u:%u\n",
  961. cam_subrect->width, cam_subrect->height,
  962. cam_subrect->left, cam_subrect->top);
  963. /* Set Start/End Pixel/Line Pre-Clip */
  964. iowrite32(left_offset << dsize, priv->base + VNSPPRC_REG);
  965. iowrite32((left_offset + cam_subrect->width - 1) << dsize,
  966. priv->base + VNEPPRC_REG);
  967. switch (priv->field) {
  968. case V4L2_FIELD_INTERLACED:
  969. case V4L2_FIELD_INTERLACED_TB:
  970. case V4L2_FIELD_INTERLACED_BT:
  971. iowrite32(top_offset / 2, priv->base + VNSLPRC_REG);
  972. iowrite32((top_offset + cam_subrect->height) / 2 - 1,
  973. priv->base + VNELPRC_REG);
  974. break;
  975. default:
  976. iowrite32(top_offset, priv->base + VNSLPRC_REG);
  977. iowrite32(top_offset + cam_subrect->height - 1,
  978. priv->base + VNELPRC_REG);
  979. break;
  980. }
  981. /* Set scaling coefficient */
  982. value = 0;
  983. if (cam_subrect->height != cam->out_height)
  984. value = (4096 * cam_subrect->height) / cam->out_height;
  985. dev_dbg(icd->parent, "YS Value: %x\n", value);
  986. iowrite32(value, priv->base + VNYS_REG);
  987. value = 0;
  988. if (cam_subrect->width != cam->out_width)
  989. value = (4096 * cam_subrect->width) / cam->out_width;
  990. /* Horizontal upscaling is up to double size */
  991. if (0 < value && value < 2048)
  992. value = 2048;
  993. dev_dbg(icd->parent, "XS Value: %x\n", value);
  994. iowrite32(value, priv->base + VNXS_REG);
  995. /* Horizontal upscaling is carried out by scaling down from double size */
  996. if (value < 4096)
  997. value *= 2;
  998. set_coeff(priv, value);
  999. /* Set Start/End Pixel/Line Post-Clip */
  1000. iowrite32(0, priv->base + VNSPPOC_REG);
  1001. iowrite32(0, priv->base + VNSLPOC_REG);
  1002. iowrite32((cam->out_width - 1) << dsize, priv->base + VNEPPOC_REG);
  1003. switch (priv->field) {
  1004. case V4L2_FIELD_INTERLACED:
  1005. case V4L2_FIELD_INTERLACED_TB:
  1006. case V4L2_FIELD_INTERLACED_BT:
  1007. iowrite32(cam->out_height / 2 - 1,
  1008. priv->base + VNELPOC_REG);
  1009. break;
  1010. default:
  1011. iowrite32(cam->out_height - 1, priv->base + VNELPOC_REG);
  1012. break;
  1013. }
  1014. iowrite32(ALIGN(cam->out_width, 0x10), priv->base + VNIS_REG);
  1015. return 0;
  1016. }
  1017. static void capture_stop_preserve(struct rcar_vin_priv *priv, u32 *vnmc)
  1018. {
  1019. *vnmc = ioread32(priv->base + VNMC_REG);
  1020. /* module disable */
  1021. iowrite32(*vnmc & ~VNMC_ME, priv->base + VNMC_REG);
  1022. }
  1023. static void capture_restore(struct rcar_vin_priv *priv, u32 vnmc)
  1024. {
  1025. unsigned long timeout = jiffies + 10 * HZ;
  1026. /*
  1027. * Wait until the end of the current frame. It can take a long time,
  1028. * but if it has been aborted by a MRST1 reset, it should exit sooner.
  1029. */
  1030. while ((ioread32(priv->base + VNMS_REG) & VNMS_AV) &&
  1031. time_before(jiffies, timeout))
  1032. msleep(1);
  1033. if (time_after(jiffies, timeout)) {
  1034. dev_err(priv->ici.v4l2_dev.dev,
  1035. "Timeout waiting for frame end! Interface problem?\n");
  1036. return;
  1037. }
  1038. iowrite32(vnmc, priv->base + VNMC_REG);
  1039. }
  1040. #define VIN_MBUS_FLAGS (V4L2_MBUS_MASTER | \
  1041. V4L2_MBUS_PCLK_SAMPLE_RISING | \
  1042. V4L2_MBUS_HSYNC_ACTIVE_HIGH | \
  1043. V4L2_MBUS_HSYNC_ACTIVE_LOW | \
  1044. V4L2_MBUS_VSYNC_ACTIVE_HIGH | \
  1045. V4L2_MBUS_VSYNC_ACTIVE_LOW | \
  1046. V4L2_MBUS_DATA_ACTIVE_HIGH)
  1047. static int rcar_vin_set_bus_param(struct soc_camera_device *icd)
  1048. {
  1049. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  1050. struct rcar_vin_priv *priv = ici->priv;
  1051. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1052. struct v4l2_mbus_config cfg;
  1053. unsigned long common_flags;
  1054. u32 vnmc;
  1055. u32 val;
  1056. int ret;
  1057. capture_stop_preserve(priv, &vnmc);
  1058. ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
  1059. if (!ret) {
  1060. common_flags = soc_mbus_config_compatible(&cfg, VIN_MBUS_FLAGS);
  1061. if (!common_flags) {
  1062. dev_warn(icd->parent,
  1063. "MBUS flags incompatible: camera 0x%x, host 0x%x\n",
  1064. cfg.flags, VIN_MBUS_FLAGS);
  1065. return -EINVAL;
  1066. }
  1067. } else if (ret != -ENOIOCTLCMD) {
  1068. return ret;
  1069. } else {
  1070. common_flags = VIN_MBUS_FLAGS;
  1071. }
  1072. /* Make choises, based on platform preferences */
  1073. if ((common_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) &&
  1074. (common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)) {
  1075. if (priv->pdata_flags & RCAR_VIN_HSYNC_ACTIVE_LOW)
  1076. common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_HIGH;
  1077. else
  1078. common_flags &= ~V4L2_MBUS_HSYNC_ACTIVE_LOW;
  1079. }
  1080. if ((common_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) &&
  1081. (common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)) {
  1082. if (priv->pdata_flags & RCAR_VIN_VSYNC_ACTIVE_LOW)
  1083. common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_HIGH;
  1084. else
  1085. common_flags &= ~V4L2_MBUS_VSYNC_ACTIVE_LOW;
  1086. }
  1087. cfg.flags = common_flags;
  1088. ret = v4l2_subdev_call(sd, video, s_mbus_config, &cfg);
  1089. if (ret < 0 && ret != -ENOIOCTLCMD)
  1090. return ret;
  1091. val = VNDMR2_FTEV | VNDMR2_VLV(1);
  1092. if (!(common_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
  1093. val |= VNDMR2_VPS;
  1094. if (!(common_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
  1095. val |= VNDMR2_HPS;
  1096. iowrite32(val, priv->base + VNDMR2_REG);
  1097. ret = rcar_vin_set_rect(icd);
  1098. if (ret < 0)
  1099. return ret;
  1100. capture_restore(priv, vnmc);
  1101. return 0;
  1102. }
  1103. static int rcar_vin_try_bus_param(struct soc_camera_device *icd,
  1104. unsigned char buswidth)
  1105. {
  1106. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1107. struct v4l2_mbus_config cfg;
  1108. int ret;
  1109. ret = v4l2_subdev_call(sd, video, g_mbus_config, &cfg);
  1110. if (ret == -ENOIOCTLCMD)
  1111. return 0;
  1112. else if (ret)
  1113. return ret;
  1114. if (buswidth > 24)
  1115. return -EINVAL;
  1116. /* check is there common mbus flags */
  1117. ret = soc_mbus_config_compatible(&cfg, VIN_MBUS_FLAGS);
  1118. if (ret)
  1119. return 0;
  1120. dev_warn(icd->parent,
  1121. "MBUS flags incompatible: camera 0x%x, host 0x%x\n",
  1122. cfg.flags, VIN_MBUS_FLAGS);
  1123. return -EINVAL;
  1124. }
  1125. static bool rcar_vin_packing_supported(const struct soc_mbus_pixelfmt *fmt)
  1126. {
  1127. return fmt->packing == SOC_MBUS_PACKING_NONE ||
  1128. (fmt->bits_per_sample > 8 &&
  1129. fmt->packing == SOC_MBUS_PACKING_EXTEND16);
  1130. }
  1131. static const struct soc_mbus_pixelfmt rcar_vin_formats[] = {
  1132. {
  1133. .fourcc = V4L2_PIX_FMT_NV16,
  1134. .name = "NV16",
  1135. .bits_per_sample = 8,
  1136. .packing = SOC_MBUS_PACKING_2X8_PADHI,
  1137. .order = SOC_MBUS_ORDER_LE,
  1138. .layout = SOC_MBUS_LAYOUT_PLANAR_Y_C,
  1139. },
  1140. {
  1141. .fourcc = V4L2_PIX_FMT_YUYV,
  1142. .name = "YUYV",
  1143. .bits_per_sample = 16,
  1144. .packing = SOC_MBUS_PACKING_NONE,
  1145. .order = SOC_MBUS_ORDER_LE,
  1146. .layout = SOC_MBUS_LAYOUT_PACKED,
  1147. },
  1148. {
  1149. .fourcc = V4L2_PIX_FMT_UYVY,
  1150. .name = "UYVY",
  1151. .bits_per_sample = 16,
  1152. .packing = SOC_MBUS_PACKING_NONE,
  1153. .order = SOC_MBUS_ORDER_LE,
  1154. .layout = SOC_MBUS_LAYOUT_PACKED,
  1155. },
  1156. {
  1157. .fourcc = V4L2_PIX_FMT_RGB565,
  1158. .name = "RGB565",
  1159. .bits_per_sample = 16,
  1160. .packing = SOC_MBUS_PACKING_NONE,
  1161. .order = SOC_MBUS_ORDER_LE,
  1162. .layout = SOC_MBUS_LAYOUT_PACKED,
  1163. },
  1164. {
  1165. .fourcc = V4L2_PIX_FMT_RGB555X,
  1166. .name = "ARGB1555",
  1167. .bits_per_sample = 16,
  1168. .packing = SOC_MBUS_PACKING_NONE,
  1169. .order = SOC_MBUS_ORDER_LE,
  1170. .layout = SOC_MBUS_LAYOUT_PACKED,
  1171. },
  1172. {
  1173. .fourcc = V4L2_PIX_FMT_RGB32,
  1174. .name = "RGB888",
  1175. .bits_per_sample = 32,
  1176. .packing = SOC_MBUS_PACKING_NONE,
  1177. .order = SOC_MBUS_ORDER_LE,
  1178. .layout = SOC_MBUS_LAYOUT_PACKED,
  1179. },
  1180. };
  1181. static int rcar_vin_get_formats(struct soc_camera_device *icd, unsigned int idx,
  1182. struct soc_camera_format_xlate *xlate)
  1183. {
  1184. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1185. struct device *dev = icd->parent;
  1186. int ret, k, n;
  1187. int formats = 0;
  1188. struct rcar_vin_cam *cam;
  1189. struct v4l2_subdev_mbus_code_enum code = {
  1190. .which = V4L2_SUBDEV_FORMAT_ACTIVE,
  1191. .index = idx,
  1192. };
  1193. const struct soc_mbus_pixelfmt *fmt;
  1194. ret = v4l2_subdev_call(sd, pad, enum_mbus_code, NULL, &code);
  1195. if (ret < 0)
  1196. return 0;
  1197. fmt = soc_mbus_get_fmtdesc(code.code);
  1198. if (!fmt) {
  1199. dev_warn(dev, "unsupported format code #%u: %d\n", idx, code.code);
  1200. return 0;
  1201. }
  1202. ret = rcar_vin_try_bus_param(icd, fmt->bits_per_sample);
  1203. if (ret < 0)
  1204. return 0;
  1205. if (!icd->host_priv) {
  1206. struct v4l2_subdev_format fmt = {
  1207. .which = V4L2_SUBDEV_FORMAT_ACTIVE,
  1208. };
  1209. struct v4l2_mbus_framefmt *mf = &fmt.format;
  1210. struct v4l2_rect rect;
  1211. struct device *dev = icd->parent;
  1212. int shift;
  1213. ret = v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt);
  1214. if (ret < 0)
  1215. return ret;
  1216. /* Cache current client geometry */
  1217. ret = soc_camera_client_g_rect(sd, &rect);
  1218. if (ret == -ENOIOCTLCMD) {
  1219. /* Sensor driver doesn't support cropping */
  1220. rect.left = 0;
  1221. rect.top = 0;
  1222. rect.width = mf->width;
  1223. rect.height = mf->height;
  1224. } else if (ret < 0) {
  1225. return ret;
  1226. }
  1227. /*
  1228. * If sensor proposes too large format then try smaller ones:
  1229. * 1280x960, 640x480, 320x240
  1230. */
  1231. for (shift = 0; shift < 3; shift++) {
  1232. if (mf->width <= VIN_MAX_WIDTH &&
  1233. mf->height <= VIN_MAX_HEIGHT)
  1234. break;
  1235. mf->width = 1280 >> shift;
  1236. mf->height = 960 >> shift;
  1237. ret = v4l2_device_call_until_err(sd->v4l2_dev,
  1238. soc_camera_grp_id(icd),
  1239. pad, set_fmt, NULL,
  1240. &fmt);
  1241. if (ret < 0)
  1242. return ret;
  1243. }
  1244. if (shift == 3) {
  1245. dev_err(dev,
  1246. "Failed to configure the client below %ux%u\n",
  1247. mf->width, mf->height);
  1248. return -EIO;
  1249. }
  1250. dev_dbg(dev, "camera fmt %ux%u\n", mf->width, mf->height);
  1251. cam = kzalloc(sizeof(*cam), GFP_KERNEL);
  1252. if (!cam)
  1253. return -ENOMEM;
  1254. /*
  1255. * We are called with current camera crop,
  1256. * initialise subrect with it
  1257. */
  1258. cam->rect = rect;
  1259. cam->subrect = rect;
  1260. cam->width = mf->width;
  1261. cam->height = mf->height;
  1262. cam->out_width = mf->width;
  1263. cam->out_height = mf->height;
  1264. icd->host_priv = cam;
  1265. } else {
  1266. cam = icd->host_priv;
  1267. }
  1268. /* Beginning of a pass */
  1269. if (!idx)
  1270. cam->extra_fmt = NULL;
  1271. switch (code.code) {
  1272. case MEDIA_BUS_FMT_YUYV8_1X16:
  1273. case MEDIA_BUS_FMT_YUYV8_2X8:
  1274. case MEDIA_BUS_FMT_YUYV10_2X10:
  1275. case MEDIA_BUS_FMT_RGB888_1X24:
  1276. if (cam->extra_fmt)
  1277. break;
  1278. /* Add all our formats that can be generated by VIN */
  1279. cam->extra_fmt = rcar_vin_formats;
  1280. n = ARRAY_SIZE(rcar_vin_formats);
  1281. formats += n;
  1282. for (k = 0; xlate && k < n; k++, xlate++) {
  1283. xlate->host_fmt = &rcar_vin_formats[k];
  1284. xlate->code = code.code;
  1285. dev_dbg(dev, "Providing format %s using code %d\n",
  1286. rcar_vin_formats[k].name, code.code);
  1287. }
  1288. break;
  1289. default:
  1290. if (!rcar_vin_packing_supported(fmt))
  1291. return 0;
  1292. dev_dbg(dev, "Providing format %s in pass-through mode\n",
  1293. fmt->name);
  1294. break;
  1295. }
  1296. /* Generic pass-through */
  1297. formats++;
  1298. if (xlate) {
  1299. xlate->host_fmt = fmt;
  1300. xlate->code = code.code;
  1301. xlate++;
  1302. }
  1303. return formats;
  1304. }
  1305. static void rcar_vin_put_formats(struct soc_camera_device *icd)
  1306. {
  1307. kfree(icd->host_priv);
  1308. icd->host_priv = NULL;
  1309. }
  1310. static int rcar_vin_set_crop(struct soc_camera_device *icd,
  1311. const struct v4l2_crop *a)
  1312. {
  1313. struct v4l2_crop a_writable = *a;
  1314. const struct v4l2_rect *rect = &a_writable.c;
  1315. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  1316. struct rcar_vin_priv *priv = ici->priv;
  1317. struct v4l2_crop cam_crop;
  1318. struct rcar_vin_cam *cam = icd->host_priv;
  1319. struct v4l2_rect *cam_rect = &cam_crop.c;
  1320. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1321. struct device *dev = icd->parent;
  1322. struct v4l2_subdev_format fmt = {
  1323. .which = V4L2_SUBDEV_FORMAT_ACTIVE,
  1324. };
  1325. struct v4l2_mbus_framefmt *mf = &fmt.format;
  1326. u32 vnmc;
  1327. int ret, i;
  1328. dev_dbg(dev, "S_CROP(%ux%u@%u:%u)\n", rect->width, rect->height,
  1329. rect->left, rect->top);
  1330. /* During camera cropping its output window can change too, stop VIN */
  1331. capture_stop_preserve(priv, &vnmc);
  1332. dev_dbg(dev, "VNMC_REG 0x%x\n", vnmc);
  1333. /* Apply iterative camera S_CROP for new input window. */
  1334. ret = soc_camera_client_s_crop(sd, &a_writable, &cam_crop,
  1335. &cam->rect, &cam->subrect);
  1336. if (ret < 0)
  1337. return ret;
  1338. dev_dbg(dev, "camera cropped to %ux%u@%u:%u\n",
  1339. cam_rect->width, cam_rect->height,
  1340. cam_rect->left, cam_rect->top);
  1341. /* On success cam_crop contains current camera crop */
  1342. /* Retrieve camera output window */
  1343. ret = v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt);
  1344. if (ret < 0)
  1345. return ret;
  1346. if (mf->width > VIN_MAX_WIDTH || mf->height > VIN_MAX_HEIGHT)
  1347. return -EINVAL;
  1348. /* Cache camera output window */
  1349. cam->width = mf->width;
  1350. cam->height = mf->height;
  1351. icd->user_width = cam->width;
  1352. icd->user_height = cam->height;
  1353. cam->vin_left = rect->left & ~1;
  1354. cam->vin_top = rect->top & ~1;
  1355. /* Use VIN cropping to crop to the new window. */
  1356. ret = rcar_vin_set_rect(icd);
  1357. if (ret < 0)
  1358. return ret;
  1359. cam->subrect = *rect;
  1360. dev_dbg(dev, "VIN cropped to %ux%u@%u:%u\n",
  1361. icd->user_width, icd->user_height,
  1362. cam->vin_left, cam->vin_top);
  1363. /* Restore capture */
  1364. for (i = 0; i < MAX_BUFFER_NUM; i++) {
  1365. if (priv->queue_buf[i] && priv->state == STOPPED) {
  1366. vnmc |= VNMC_ME;
  1367. break;
  1368. }
  1369. }
  1370. capture_restore(priv, vnmc);
  1371. /* Even if only camera cropping succeeded */
  1372. return ret;
  1373. }
  1374. static int rcar_vin_get_crop(struct soc_camera_device *icd,
  1375. struct v4l2_crop *a)
  1376. {
  1377. struct rcar_vin_cam *cam = icd->host_priv;
  1378. a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1379. a->c = cam->subrect;
  1380. return 0;
  1381. }
  1382. /* Similar to set_crop multistage iterative algorithm */
  1383. static int rcar_vin_set_fmt(struct soc_camera_device *icd,
  1384. struct v4l2_format *f)
  1385. {
  1386. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  1387. struct rcar_vin_priv *priv = ici->priv;
  1388. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1389. struct rcar_vin_cam *cam = icd->host_priv;
  1390. struct v4l2_pix_format *pix = &f->fmt.pix;
  1391. struct v4l2_mbus_framefmt mf;
  1392. struct device *dev = icd->parent;
  1393. __u32 pixfmt = pix->pixelformat;
  1394. const struct soc_camera_format_xlate *xlate;
  1395. unsigned int vin_sub_width = 0, vin_sub_height = 0;
  1396. int ret;
  1397. bool can_scale;
  1398. enum v4l2_field field;
  1399. v4l2_std_id std;
  1400. dev_dbg(dev, "S_FMT(pix=0x%x, %ux%u)\n",
  1401. pixfmt, pix->width, pix->height);
  1402. switch (pix->field) {
  1403. default:
  1404. pix->field = V4L2_FIELD_NONE;
  1405. /* fall-through */
  1406. case V4L2_FIELD_NONE:
  1407. case V4L2_FIELD_TOP:
  1408. case V4L2_FIELD_BOTTOM:
  1409. case V4L2_FIELD_INTERLACED_TB:
  1410. case V4L2_FIELD_INTERLACED_BT:
  1411. field = pix->field;
  1412. break;
  1413. case V4L2_FIELD_INTERLACED:
  1414. /* Query for standard if not explicitly mentioned _TB/_BT */
  1415. ret = v4l2_subdev_call(sd, video, querystd, &std);
  1416. if (ret == -ENOIOCTLCMD) {
  1417. field = V4L2_FIELD_NONE;
  1418. } else if (ret < 0) {
  1419. return ret;
  1420. } else {
  1421. field = std & V4L2_STD_625_50 ?
  1422. V4L2_FIELD_INTERLACED_TB :
  1423. V4L2_FIELD_INTERLACED_BT;
  1424. }
  1425. break;
  1426. }
  1427. xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
  1428. if (!xlate) {
  1429. dev_warn(dev, "Format %x not found\n", pixfmt);
  1430. return -EINVAL;
  1431. }
  1432. /* Calculate client output geometry */
  1433. soc_camera_calc_client_output(icd, &cam->rect, &cam->subrect, pix, &mf,
  1434. 12);
  1435. mf.field = pix->field;
  1436. mf.colorspace = pix->colorspace;
  1437. mf.code = xlate->code;
  1438. switch (pixfmt) {
  1439. case V4L2_PIX_FMT_RGB32:
  1440. can_scale = priv->chip != RCAR_E1;
  1441. break;
  1442. case V4L2_PIX_FMT_UYVY:
  1443. case V4L2_PIX_FMT_YUYV:
  1444. case V4L2_PIX_FMT_RGB565:
  1445. case V4L2_PIX_FMT_RGB555X:
  1446. can_scale = true;
  1447. break;
  1448. default:
  1449. can_scale = false;
  1450. break;
  1451. }
  1452. dev_dbg(dev, "request camera output %ux%u\n", mf.width, mf.height);
  1453. ret = soc_camera_client_scale(icd, &cam->rect, &cam->subrect,
  1454. &mf, &vin_sub_width, &vin_sub_height,
  1455. can_scale, 12);
  1456. /* Done with the camera. Now see if we can improve the result */
  1457. dev_dbg(dev, "Camera %d fmt %ux%u, requested %ux%u\n",
  1458. ret, mf.width, mf.height, pix->width, pix->height);
  1459. if (ret == -ENOIOCTLCMD)
  1460. dev_dbg(dev, "Sensor doesn't support scaling\n");
  1461. else if (ret < 0)
  1462. return ret;
  1463. if (mf.code != xlate->code)
  1464. return -EINVAL;
  1465. /* Prepare VIN crop */
  1466. cam->width = mf.width;
  1467. cam->height = mf.height;
  1468. /* Use VIN scaling to scale to the requested user window. */
  1469. /* We cannot scale up */
  1470. if (pix->width > vin_sub_width)
  1471. vin_sub_width = pix->width;
  1472. if (pix->height > vin_sub_height)
  1473. vin_sub_height = pix->height;
  1474. pix->colorspace = mf.colorspace;
  1475. if (!can_scale) {
  1476. pix->width = vin_sub_width;
  1477. pix->height = vin_sub_height;
  1478. }
  1479. /*
  1480. * We have calculated CFLCR, the actual configuration will be performed
  1481. * in rcar_vin_set_bus_param()
  1482. */
  1483. dev_dbg(dev, "W: %u : %u, H: %u : %u\n",
  1484. vin_sub_width, pix->width, vin_sub_height, pix->height);
  1485. cam->out_width = pix->width;
  1486. cam->out_height = pix->height;
  1487. icd->current_fmt = xlate;
  1488. priv->field = field;
  1489. return 0;
  1490. }
  1491. static int rcar_vin_try_fmt(struct soc_camera_device *icd,
  1492. struct v4l2_format *f)
  1493. {
  1494. const struct soc_camera_format_xlate *xlate;
  1495. struct v4l2_pix_format *pix = &f->fmt.pix;
  1496. struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
  1497. struct v4l2_subdev_pad_config pad_cfg;
  1498. struct v4l2_subdev_format format = {
  1499. .which = V4L2_SUBDEV_FORMAT_TRY,
  1500. };
  1501. struct v4l2_mbus_framefmt *mf = &format.format;
  1502. __u32 pixfmt = pix->pixelformat;
  1503. int width, height;
  1504. int ret;
  1505. xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
  1506. if (!xlate) {
  1507. xlate = icd->current_fmt;
  1508. dev_dbg(icd->parent, "Format %x not found, keeping %x\n",
  1509. pixfmt, xlate->host_fmt->fourcc);
  1510. pixfmt = xlate->host_fmt->fourcc;
  1511. pix->pixelformat = pixfmt;
  1512. pix->colorspace = icd->colorspace;
  1513. }
  1514. /* FIXME: calculate using depth and bus width */
  1515. v4l_bound_align_image(&pix->width, 2, VIN_MAX_WIDTH, 1,
  1516. &pix->height, 4, VIN_MAX_HEIGHT, 2, 0);
  1517. width = pix->width;
  1518. height = pix->height;
  1519. /* let soc-camera calculate these values */
  1520. pix->bytesperline = 0;
  1521. pix->sizeimage = 0;
  1522. /* limit to sensor capabilities */
  1523. mf->width = pix->width;
  1524. mf->height = pix->height;
  1525. mf->field = pix->field;
  1526. mf->code = xlate->code;
  1527. mf->colorspace = pix->colorspace;
  1528. ret = v4l2_device_call_until_err(sd->v4l2_dev, soc_camera_grp_id(icd),
  1529. pad, set_fmt, &pad_cfg, &format);
  1530. if (ret < 0)
  1531. return ret;
  1532. /* Adjust only if VIN cannot scale */
  1533. if (pix->width > mf->width * 2)
  1534. pix->width = mf->width * 2;
  1535. if (pix->height > mf->height * 3)
  1536. pix->height = mf->height * 3;
  1537. pix->field = mf->field;
  1538. pix->colorspace = mf->colorspace;
  1539. if (pixfmt == V4L2_PIX_FMT_NV16) {
  1540. /* FIXME: check against rect_max after converting soc-camera */
  1541. /* We can scale precisely, need a bigger image from camera */
  1542. if (pix->width < width || pix->height < height) {
  1543. /*
  1544. * We presume, the sensor behaves sanely, i.e. if
  1545. * requested a bigger rectangle, it will not return a
  1546. * smaller one.
  1547. */
  1548. mf->width = VIN_MAX_WIDTH;
  1549. mf->height = VIN_MAX_HEIGHT;
  1550. ret = v4l2_device_call_until_err(sd->v4l2_dev,
  1551. soc_camera_grp_id(icd),
  1552. pad, set_fmt, &pad_cfg,
  1553. &format);
  1554. if (ret < 0) {
  1555. dev_err(icd->parent,
  1556. "client try_fmt() = %d\n", ret);
  1557. return ret;
  1558. }
  1559. }
  1560. /* We will scale exactly */
  1561. if (mf->width > width)
  1562. pix->width = width;
  1563. if (mf->height > height)
  1564. pix->height = height;
  1565. }
  1566. return ret;
  1567. }
  1568. static unsigned int rcar_vin_poll(struct file *file, poll_table *pt)
  1569. {
  1570. struct soc_camera_device *icd = file->private_data;
  1571. return vb2_poll(&icd->vb2_vidq, file, pt);
  1572. }
  1573. static int rcar_vin_querycap(struct soc_camera_host *ici,
  1574. struct v4l2_capability *cap)
  1575. {
  1576. strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card));
  1577. cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
  1578. cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
  1579. snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s%d", DRV_NAME, ici->nr);
  1580. return 0;
  1581. }
  1582. static int rcar_vin_init_videobuf2(struct vb2_queue *vq,
  1583. struct soc_camera_device *icd)
  1584. {
  1585. struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
  1586. vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1587. vq->io_modes = VB2_MMAP | VB2_USERPTR;
  1588. vq->drv_priv = icd;
  1589. vq->ops = &rcar_vin_vb2_ops;
  1590. vq->mem_ops = &vb2_dma_contig_memops;
  1591. vq->buf_struct_size = sizeof(struct rcar_vin_buffer);
  1592. vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
  1593. vq->lock = &ici->host_lock;
  1594. return vb2_queue_init(vq);
  1595. }
  1596. static struct soc_camera_host_ops rcar_vin_host_ops = {
  1597. .owner = THIS_MODULE,
  1598. .add = rcar_vin_add_device,
  1599. .remove = rcar_vin_remove_device,
  1600. .get_formats = rcar_vin_get_formats,
  1601. .put_formats = rcar_vin_put_formats,
  1602. .get_crop = rcar_vin_get_crop,
  1603. .set_crop = rcar_vin_set_crop,
  1604. .try_fmt = rcar_vin_try_fmt,
  1605. .set_fmt = rcar_vin_set_fmt,
  1606. .poll = rcar_vin_poll,
  1607. .querycap = rcar_vin_querycap,
  1608. .set_bus_param = rcar_vin_set_bus_param,
  1609. .init_videobuf2 = rcar_vin_init_videobuf2,
  1610. };
  1611. #ifdef CONFIG_OF
  1612. static const struct of_device_id rcar_vin_of_table[] = {
  1613. { .compatible = "renesas,vin-r8a7794", .data = (void *)RCAR_GEN2 },
  1614. { .compatible = "renesas,vin-r8a7793", .data = (void *)RCAR_GEN2 },
  1615. { .compatible = "renesas,vin-r8a7791", .data = (void *)RCAR_GEN2 },
  1616. { .compatible = "renesas,vin-r8a7790", .data = (void *)RCAR_GEN2 },
  1617. { .compatible = "renesas,vin-r8a7779", .data = (void *)RCAR_H1 },
  1618. { .compatible = "renesas,vin-r8a7778", .data = (void *)RCAR_M1 },
  1619. { },
  1620. };
  1621. MODULE_DEVICE_TABLE(of, rcar_vin_of_table);
  1622. #endif
  1623. static struct platform_device_id rcar_vin_id_table[] = {
  1624. { "r8a7779-vin", RCAR_H1 },
  1625. { "r8a7778-vin", RCAR_M1 },
  1626. { "uPD35004-vin", RCAR_E1 },
  1627. {},
  1628. };
  1629. MODULE_DEVICE_TABLE(platform, rcar_vin_id_table);
  1630. static int rcar_vin_probe(struct platform_device *pdev)
  1631. {
  1632. const struct of_device_id *match = NULL;
  1633. struct rcar_vin_priv *priv;
  1634. struct resource *mem;
  1635. struct rcar_vin_platform_data *pdata;
  1636. unsigned int pdata_flags;
  1637. int irq, ret;
  1638. if (pdev->dev.of_node) {
  1639. struct v4l2_of_endpoint ep;
  1640. struct device_node *np;
  1641. match = of_match_device(of_match_ptr(rcar_vin_of_table),
  1642. &pdev->dev);
  1643. np = of_graph_get_next_endpoint(pdev->dev.of_node, NULL);
  1644. if (!np) {
  1645. dev_err(&pdev->dev, "could not find endpoint\n");
  1646. return -EINVAL;
  1647. }
  1648. ret = v4l2_of_parse_endpoint(np, &ep);
  1649. if (ret) {
  1650. dev_err(&pdev->dev, "could not parse endpoint\n");
  1651. return ret;
  1652. }
  1653. if (ep.bus_type == V4L2_MBUS_BT656)
  1654. pdata_flags = RCAR_VIN_BT656;
  1655. else {
  1656. pdata_flags = 0;
  1657. if (ep.bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
  1658. pdata_flags |= RCAR_VIN_HSYNC_ACTIVE_LOW;
  1659. if (ep.bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
  1660. pdata_flags |= RCAR_VIN_VSYNC_ACTIVE_LOW;
  1661. }
  1662. of_node_put(np);
  1663. dev_dbg(&pdev->dev, "pdata_flags = %08x\n", pdata_flags);
  1664. } else {
  1665. pdata = pdev->dev.platform_data;
  1666. if (!pdata || !pdata->flags) {
  1667. dev_err(&pdev->dev, "platform data not set\n");
  1668. return -EINVAL;
  1669. }
  1670. pdata_flags = pdata->flags;
  1671. }
  1672. mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1673. if (mem == NULL)
  1674. return -EINVAL;
  1675. irq = platform_get_irq(pdev, 0);
  1676. if (irq <= 0)
  1677. return -EINVAL;
  1678. priv = devm_kzalloc(&pdev->dev, sizeof(struct rcar_vin_priv),
  1679. GFP_KERNEL);
  1680. if (!priv)
  1681. return -ENOMEM;
  1682. priv->base = devm_ioremap_resource(&pdev->dev, mem);
  1683. if (IS_ERR(priv->base))
  1684. return PTR_ERR(priv->base);
  1685. ret = devm_request_irq(&pdev->dev, irq, rcar_vin_irq, IRQF_SHARED,
  1686. dev_name(&pdev->dev), priv);
  1687. if (ret)
  1688. return ret;
  1689. priv->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
  1690. if (IS_ERR(priv->alloc_ctx))
  1691. return PTR_ERR(priv->alloc_ctx);
  1692. priv->ici.priv = priv;
  1693. priv->ici.v4l2_dev.dev = &pdev->dev;
  1694. priv->ici.drv_name = dev_name(&pdev->dev);
  1695. priv->ici.ops = &rcar_vin_host_ops;
  1696. priv->pdata_flags = pdata_flags;
  1697. if (!match) {
  1698. priv->ici.nr = pdev->id;
  1699. priv->chip = pdev->id_entry->driver_data;
  1700. } else {
  1701. priv->ici.nr = of_alias_get_id(pdev->dev.of_node, "vin");
  1702. priv->chip = (enum chip_id)match->data;
  1703. }
  1704. spin_lock_init(&priv->lock);
  1705. INIT_LIST_HEAD(&priv->capture);
  1706. priv->state = STOPPED;
  1707. pm_suspend_ignore_children(&pdev->dev, true);
  1708. pm_runtime_enable(&pdev->dev);
  1709. ret = soc_camera_host_register(&priv->ici);
  1710. if (ret)
  1711. goto cleanup;
  1712. return 0;
  1713. cleanup:
  1714. pm_runtime_disable(&pdev->dev);
  1715. vb2_dma_contig_cleanup_ctx(priv->alloc_ctx);
  1716. return ret;
  1717. }
  1718. static int rcar_vin_remove(struct platform_device *pdev)
  1719. {
  1720. struct soc_camera_host *soc_host = to_soc_camera_host(&pdev->dev);
  1721. struct rcar_vin_priv *priv = container_of(soc_host,
  1722. struct rcar_vin_priv, ici);
  1723. soc_camera_host_unregister(soc_host);
  1724. pm_runtime_disable(&pdev->dev);
  1725. vb2_dma_contig_cleanup_ctx(priv->alloc_ctx);
  1726. return 0;
  1727. }
  1728. static struct platform_driver rcar_vin_driver = {
  1729. .probe = rcar_vin_probe,
  1730. .remove = rcar_vin_remove,
  1731. .driver = {
  1732. .name = DRV_NAME,
  1733. .of_match_table = of_match_ptr(rcar_vin_of_table),
  1734. },
  1735. .id_table = rcar_vin_id_table,
  1736. };
  1737. module_platform_driver(rcar_vin_driver);
  1738. MODULE_LICENSE("GPL");
  1739. MODULE_ALIAS("platform:rcar_vin");
  1740. MODULE_DESCRIPTION("Renesas R-Car VIN camera host driver");