ispcsi2.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305
  1. /*
  2. * ispcsi2.c
  3. *
  4. * TI OMAP3 ISP - CSI2 module
  5. *
  6. * Copyright (C) 2010 Nokia Corporation
  7. * Copyright (C) 2009 Texas Instruments, Inc.
  8. *
  9. * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  10. * Sakari Ailus <sakari.ailus@iki.fi>
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License version 2 as
  14. * published by the Free Software Foundation.
  15. *
  16. * This program is distributed in the hope that it will be useful, but
  17. * WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. * General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  24. * 02110-1301 USA
  25. */
  26. #include <linux/delay.h>
  27. #include <media/v4l2-common.h>
  28. #include <linux/v4l2-mediabus.h>
  29. #include <linux/mm.h>
  30. #include "isp.h"
  31. #include "ispreg.h"
  32. #include "ispcsi2.h"
  33. /*
  34. * csi2_if_enable - Enable CSI2 Receiver interface.
  35. * @enable: enable flag
  36. *
  37. */
  38. static void csi2_if_enable(struct isp_device *isp,
  39. struct isp_csi2_device *csi2, u8 enable)
  40. {
  41. struct isp_csi2_ctrl_cfg *currctrl = &csi2->ctrl;
  42. isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_CTRL, ISPCSI2_CTRL_IF_EN,
  43. enable ? ISPCSI2_CTRL_IF_EN : 0);
  44. currctrl->if_enable = enable;
  45. }
  46. /*
  47. * csi2_recv_config - CSI2 receiver module configuration.
  48. * @currctrl: isp_csi2_ctrl_cfg structure
  49. *
  50. */
  51. static void csi2_recv_config(struct isp_device *isp,
  52. struct isp_csi2_device *csi2,
  53. struct isp_csi2_ctrl_cfg *currctrl)
  54. {
  55. u32 reg;
  56. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTRL);
  57. if (currctrl->frame_mode)
  58. reg |= ISPCSI2_CTRL_FRAME;
  59. else
  60. reg &= ~ISPCSI2_CTRL_FRAME;
  61. if (currctrl->vp_clk_enable)
  62. reg |= ISPCSI2_CTRL_VP_CLK_EN;
  63. else
  64. reg &= ~ISPCSI2_CTRL_VP_CLK_EN;
  65. if (currctrl->vp_only_enable)
  66. reg |= ISPCSI2_CTRL_VP_ONLY_EN;
  67. else
  68. reg &= ~ISPCSI2_CTRL_VP_ONLY_EN;
  69. reg &= ~ISPCSI2_CTRL_VP_OUT_CTRL_MASK;
  70. reg |= currctrl->vp_out_ctrl << ISPCSI2_CTRL_VP_OUT_CTRL_SHIFT;
  71. if (currctrl->ecc_enable)
  72. reg |= ISPCSI2_CTRL_ECC_EN;
  73. else
  74. reg &= ~ISPCSI2_CTRL_ECC_EN;
  75. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTRL);
  76. }
  77. static const unsigned int csi2_input_fmts[] = {
  78. V4L2_MBUS_FMT_SGRBG10_1X10,
  79. V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8,
  80. V4L2_MBUS_FMT_SRGGB10_1X10,
  81. V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8,
  82. V4L2_MBUS_FMT_SBGGR10_1X10,
  83. V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8,
  84. V4L2_MBUS_FMT_SGBRG10_1X10,
  85. V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8,
  86. };
  87. /* To set the format on the CSI2 requires a mapping function that takes
  88. * the following inputs:
  89. * - 2 different formats (at this time)
  90. * - 2 destinations (mem, vp+mem) (vp only handled separately)
  91. * - 2 decompression options (on, off)
  92. * - 2 isp revisions (certain format must be handled differently on OMAP3630)
  93. * Output should be CSI2 frame format code
  94. * Array indices as follows: [format][dest][decompr][is_3630]
  95. * Not all combinations are valid. 0 means invalid.
  96. */
  97. static const u16 __csi2_fmt_map[2][2][2][2] = {
  98. /* RAW10 formats */
  99. {
  100. /* Output to memory */
  101. {
  102. /* No DPCM decompression */
  103. { CSI2_PIX_FMT_RAW10_EXP16, CSI2_PIX_FMT_RAW10_EXP16 },
  104. /* DPCM decompression */
  105. { 0, 0 },
  106. },
  107. /* Output to both */
  108. {
  109. /* No DPCM decompression */
  110. { CSI2_PIX_FMT_RAW10_EXP16_VP,
  111. CSI2_PIX_FMT_RAW10_EXP16_VP },
  112. /* DPCM decompression */
  113. { 0, 0 },
  114. },
  115. },
  116. /* RAW10 DPCM8 formats */
  117. {
  118. /* Output to memory */
  119. {
  120. /* No DPCM decompression */
  121. { CSI2_PIX_FMT_RAW8, CSI2_USERDEF_8BIT_DATA1 },
  122. /* DPCM decompression */
  123. { CSI2_PIX_FMT_RAW8_DPCM10_EXP16,
  124. CSI2_USERDEF_8BIT_DATA1_DPCM10 },
  125. },
  126. /* Output to both */
  127. {
  128. /* No DPCM decompression */
  129. { CSI2_PIX_FMT_RAW8_VP,
  130. CSI2_PIX_FMT_RAW8_VP },
  131. /* DPCM decompression */
  132. { CSI2_PIX_FMT_RAW8_DPCM10_VP,
  133. CSI2_USERDEF_8BIT_DATA1_DPCM10_VP },
  134. },
  135. },
  136. };
  137. /*
  138. * csi2_ctx_map_format - Map CSI2 sink media bus format to CSI2 format ID
  139. * @csi2: ISP CSI2 device
  140. *
  141. * Returns CSI2 physical format id
  142. */
  143. static u16 csi2_ctx_map_format(struct isp_csi2_device *csi2)
  144. {
  145. const struct v4l2_mbus_framefmt *fmt = &csi2->formats[CSI2_PAD_SINK];
  146. int fmtidx, destidx, is_3630;
  147. switch (fmt->code) {
  148. case V4L2_MBUS_FMT_SGRBG10_1X10:
  149. case V4L2_MBUS_FMT_SRGGB10_1X10:
  150. case V4L2_MBUS_FMT_SBGGR10_1X10:
  151. case V4L2_MBUS_FMT_SGBRG10_1X10:
  152. fmtidx = 0;
  153. break;
  154. case V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8:
  155. case V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8:
  156. case V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8:
  157. case V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8:
  158. fmtidx = 1;
  159. break;
  160. default:
  161. WARN(1, KERN_ERR "CSI2: pixel format %08x unsupported!\n",
  162. fmt->code);
  163. return 0;
  164. }
  165. if (!(csi2->output & CSI2_OUTPUT_CCDC) &&
  166. !(csi2->output & CSI2_OUTPUT_MEMORY)) {
  167. /* Neither output enabled is a valid combination */
  168. return CSI2_PIX_FMT_OTHERS;
  169. }
  170. /* If we need to skip frames at the beginning of the stream disable the
  171. * video port to avoid sending the skipped frames to the CCDC.
  172. */
  173. destidx = csi2->frame_skip ? 0 : !!(csi2->output & CSI2_OUTPUT_CCDC);
  174. is_3630 = csi2->isp->revision == ISP_REVISION_15_0;
  175. return __csi2_fmt_map[fmtidx][destidx][csi2->dpcm_decompress][is_3630];
  176. }
  177. /*
  178. * csi2_set_outaddr - Set memory address to save output image
  179. * @csi2: Pointer to ISP CSI2a device.
  180. * @addr: ISP MMU Mapped 32-bit memory address aligned on 32 byte boundary.
  181. *
  182. * Sets the memory address where the output will be saved.
  183. *
  184. * Returns 0 if successful, or -EINVAL if the address is not in the 32 byte
  185. * boundary.
  186. */
  187. static void csi2_set_outaddr(struct isp_csi2_device *csi2, u32 addr)
  188. {
  189. struct isp_device *isp = csi2->isp;
  190. struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[0];
  191. ctx->ping_addr = addr;
  192. ctx->pong_addr = addr;
  193. isp_reg_writel(isp, ctx->ping_addr,
  194. csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
  195. isp_reg_writel(isp, ctx->pong_addr,
  196. csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
  197. }
  198. /*
  199. * is_usr_def_mapping - Checks whether USER_DEF_MAPPING should
  200. * be enabled by CSI2.
  201. * @format_id: mapped format id
  202. *
  203. */
  204. static inline int is_usr_def_mapping(u32 format_id)
  205. {
  206. return (format_id & 0x40) ? 1 : 0;
  207. }
  208. /*
  209. * csi2_ctx_enable - Enable specified CSI2 context
  210. * @ctxnum: Context number, valid between 0 and 7 values.
  211. * @enable: enable
  212. *
  213. */
  214. static void csi2_ctx_enable(struct isp_device *isp,
  215. struct isp_csi2_device *csi2, u8 ctxnum, u8 enable)
  216. {
  217. struct isp_csi2_ctx_cfg *ctx = &csi2->contexts[ctxnum];
  218. unsigned int skip = 0;
  219. u32 reg;
  220. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
  221. if (enable) {
  222. if (csi2->frame_skip)
  223. skip = csi2->frame_skip;
  224. else if (csi2->output & CSI2_OUTPUT_MEMORY)
  225. skip = 1;
  226. reg &= ~ISPCSI2_CTX_CTRL1_COUNT_MASK;
  227. reg |= ISPCSI2_CTX_CTRL1_COUNT_UNLOCK
  228. | (skip << ISPCSI2_CTX_CTRL1_COUNT_SHIFT)
  229. | ISPCSI2_CTX_CTRL1_CTX_EN;
  230. } else {
  231. reg &= ~ISPCSI2_CTX_CTRL1_CTX_EN;
  232. }
  233. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctxnum));
  234. ctx->enabled = enable;
  235. }
  236. /*
  237. * csi2_ctx_config - CSI2 context configuration.
  238. * @ctx: context configuration
  239. *
  240. */
  241. static void csi2_ctx_config(struct isp_device *isp,
  242. struct isp_csi2_device *csi2,
  243. struct isp_csi2_ctx_cfg *ctx)
  244. {
  245. u32 reg;
  246. /* Set up CSI2_CTx_CTRL1 */
  247. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
  248. if (ctx->eof_enabled)
  249. reg |= ISPCSI2_CTX_CTRL1_EOF_EN;
  250. else
  251. reg &= ~ISPCSI2_CTX_CTRL1_EOF_EN;
  252. if (ctx->eol_enabled)
  253. reg |= ISPCSI2_CTX_CTRL1_EOL_EN;
  254. else
  255. reg &= ~ISPCSI2_CTX_CTRL1_EOL_EN;
  256. if (ctx->checksum_enabled)
  257. reg |= ISPCSI2_CTX_CTRL1_CS_EN;
  258. else
  259. reg &= ~ISPCSI2_CTX_CTRL1_CS_EN;
  260. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL1(ctx->ctxnum));
  261. /* Set up CSI2_CTx_CTRL2 */
  262. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
  263. reg &= ~(ISPCSI2_CTX_CTRL2_VIRTUAL_ID_MASK);
  264. reg |= ctx->virtual_id << ISPCSI2_CTX_CTRL2_VIRTUAL_ID_SHIFT;
  265. reg &= ~(ISPCSI2_CTX_CTRL2_FORMAT_MASK);
  266. reg |= ctx->format_id << ISPCSI2_CTX_CTRL2_FORMAT_SHIFT;
  267. if (ctx->dpcm_decompress) {
  268. if (ctx->dpcm_predictor)
  269. reg |= ISPCSI2_CTX_CTRL2_DPCM_PRED;
  270. else
  271. reg &= ~ISPCSI2_CTX_CTRL2_DPCM_PRED;
  272. }
  273. if (is_usr_def_mapping(ctx->format_id)) {
  274. reg &= ~ISPCSI2_CTX_CTRL2_USER_DEF_MAP_MASK;
  275. reg |= 2 << ISPCSI2_CTX_CTRL2_USER_DEF_MAP_SHIFT;
  276. }
  277. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL2(ctx->ctxnum));
  278. /* Set up CSI2_CTx_CTRL3 */
  279. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
  280. reg &= ~(ISPCSI2_CTX_CTRL3_ALPHA_MASK);
  281. reg |= (ctx->alpha << ISPCSI2_CTX_CTRL3_ALPHA_SHIFT);
  282. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_CTX_CTRL3(ctx->ctxnum));
  283. /* Set up CSI2_CTx_DAT_OFST */
  284. reg = isp_reg_readl(isp, csi2->regs1,
  285. ISPCSI2_CTX_DAT_OFST(ctx->ctxnum));
  286. reg &= ~ISPCSI2_CTX_DAT_OFST_OFST_MASK;
  287. reg |= ctx->data_offset << ISPCSI2_CTX_DAT_OFST_OFST_SHIFT;
  288. isp_reg_writel(isp, reg, csi2->regs1,
  289. ISPCSI2_CTX_DAT_OFST(ctx->ctxnum));
  290. isp_reg_writel(isp, ctx->ping_addr,
  291. csi2->regs1, ISPCSI2_CTX_DAT_PING_ADDR(ctx->ctxnum));
  292. isp_reg_writel(isp, ctx->pong_addr,
  293. csi2->regs1, ISPCSI2_CTX_DAT_PONG_ADDR(ctx->ctxnum));
  294. }
  295. /*
  296. * csi2_timing_config - CSI2 timing configuration.
  297. * @timing: csi2_timing_cfg structure
  298. */
  299. static void csi2_timing_config(struct isp_device *isp,
  300. struct isp_csi2_device *csi2,
  301. struct isp_csi2_timing_cfg *timing)
  302. {
  303. u32 reg;
  304. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_TIMING);
  305. if (timing->force_rx_mode)
  306. reg |= ISPCSI2_TIMING_FORCE_RX_MODE_IO(timing->ionum);
  307. else
  308. reg &= ~ISPCSI2_TIMING_FORCE_RX_MODE_IO(timing->ionum);
  309. if (timing->stop_state_16x)
  310. reg |= ISPCSI2_TIMING_STOP_STATE_X16_IO(timing->ionum);
  311. else
  312. reg &= ~ISPCSI2_TIMING_STOP_STATE_X16_IO(timing->ionum);
  313. if (timing->stop_state_4x)
  314. reg |= ISPCSI2_TIMING_STOP_STATE_X4_IO(timing->ionum);
  315. else
  316. reg &= ~ISPCSI2_TIMING_STOP_STATE_X4_IO(timing->ionum);
  317. reg &= ~ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_MASK(timing->ionum);
  318. reg |= timing->stop_state_counter <<
  319. ISPCSI2_TIMING_STOP_STATE_COUNTER_IO_SHIFT(timing->ionum);
  320. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_TIMING);
  321. }
  322. /*
  323. * csi2_irq_ctx_set - Enables CSI2 Context IRQs.
  324. * @enable: Enable/disable CSI2 Context interrupts
  325. */
  326. static void csi2_irq_ctx_set(struct isp_device *isp,
  327. struct isp_csi2_device *csi2, int enable)
  328. {
  329. int i;
  330. for (i = 0; i < 8; i++) {
  331. isp_reg_writel(isp, ISPCSI2_CTX_IRQSTATUS_FE_IRQ, csi2->regs1,
  332. ISPCSI2_CTX_IRQSTATUS(i));
  333. if (enable)
  334. isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
  335. ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
  336. else
  337. isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
  338. ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
  339. }
  340. }
  341. /*
  342. * csi2_irq_complexio1_set - Enables CSI2 ComplexIO IRQs.
  343. * @enable: Enable/disable CSI2 ComplexIO #1 interrupts
  344. */
  345. static void csi2_irq_complexio1_set(struct isp_device *isp,
  346. struct isp_csi2_device *csi2, int enable)
  347. {
  348. u32 reg;
  349. reg = ISPCSI2_PHY_IRQENABLE_STATEALLULPMEXIT |
  350. ISPCSI2_PHY_IRQENABLE_STATEALLULPMENTER |
  351. ISPCSI2_PHY_IRQENABLE_STATEULPM5 |
  352. ISPCSI2_PHY_IRQENABLE_ERRCONTROL5 |
  353. ISPCSI2_PHY_IRQENABLE_ERRESC5 |
  354. ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS5 |
  355. ISPCSI2_PHY_IRQENABLE_ERRSOTHS5 |
  356. ISPCSI2_PHY_IRQENABLE_STATEULPM4 |
  357. ISPCSI2_PHY_IRQENABLE_ERRCONTROL4 |
  358. ISPCSI2_PHY_IRQENABLE_ERRESC4 |
  359. ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS4 |
  360. ISPCSI2_PHY_IRQENABLE_ERRSOTHS4 |
  361. ISPCSI2_PHY_IRQENABLE_STATEULPM3 |
  362. ISPCSI2_PHY_IRQENABLE_ERRCONTROL3 |
  363. ISPCSI2_PHY_IRQENABLE_ERRESC3 |
  364. ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS3 |
  365. ISPCSI2_PHY_IRQENABLE_ERRSOTHS3 |
  366. ISPCSI2_PHY_IRQENABLE_STATEULPM2 |
  367. ISPCSI2_PHY_IRQENABLE_ERRCONTROL2 |
  368. ISPCSI2_PHY_IRQENABLE_ERRESC2 |
  369. ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS2 |
  370. ISPCSI2_PHY_IRQENABLE_ERRSOTHS2 |
  371. ISPCSI2_PHY_IRQENABLE_STATEULPM1 |
  372. ISPCSI2_PHY_IRQENABLE_ERRCONTROL1 |
  373. ISPCSI2_PHY_IRQENABLE_ERRESC1 |
  374. ISPCSI2_PHY_IRQENABLE_ERRSOTSYNCHS1 |
  375. ISPCSI2_PHY_IRQENABLE_ERRSOTHS1;
  376. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
  377. if (enable)
  378. reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
  379. else
  380. reg = 0;
  381. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_PHY_IRQENABLE);
  382. }
  383. /*
  384. * csi2_irq_status_set - Enables CSI2 Status IRQs.
  385. * @enable: Enable/disable CSI2 Status interrupts
  386. */
  387. static void csi2_irq_status_set(struct isp_device *isp,
  388. struct isp_csi2_device *csi2, int enable)
  389. {
  390. u32 reg;
  391. reg = ISPCSI2_IRQSTATUS_OCP_ERR_IRQ |
  392. ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ |
  393. ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ |
  394. ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ |
  395. ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ |
  396. ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ |
  397. ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ |
  398. ISPCSI2_IRQSTATUS_CONTEXT(0);
  399. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQSTATUS);
  400. if (enable)
  401. reg |= isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQENABLE);
  402. else
  403. reg = 0;
  404. isp_reg_writel(isp, reg, csi2->regs1, ISPCSI2_IRQENABLE);
  405. }
  406. /*
  407. * omap3isp_csi2_reset - Resets the CSI2 module.
  408. *
  409. * Must be called with the phy lock held.
  410. *
  411. * Returns 0 if successful, or -EBUSY if power command didn't respond.
  412. */
  413. int omap3isp_csi2_reset(struct isp_csi2_device *csi2)
  414. {
  415. struct isp_device *isp = csi2->isp;
  416. u8 soft_reset_retries = 0;
  417. u32 reg;
  418. int i;
  419. if (!csi2->available)
  420. return -ENODEV;
  421. if (csi2->phy->phy_in_use)
  422. return -EBUSY;
  423. isp_reg_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
  424. ISPCSI2_SYSCONFIG_SOFT_RESET);
  425. do {
  426. reg = isp_reg_readl(isp, csi2->regs1, ISPCSI2_SYSSTATUS) &
  427. ISPCSI2_SYSSTATUS_RESET_DONE;
  428. if (reg == ISPCSI2_SYSSTATUS_RESET_DONE)
  429. break;
  430. soft_reset_retries++;
  431. if (soft_reset_retries < 5)
  432. udelay(100);
  433. } while (soft_reset_retries < 5);
  434. if (soft_reset_retries == 5) {
  435. printk(KERN_ERR "CSI2: Soft reset try count exceeded!\n");
  436. return -EBUSY;
  437. }
  438. if (isp->revision == ISP_REVISION_15_0)
  439. isp_reg_set(isp, csi2->regs1, ISPCSI2_PHY_CFG,
  440. ISPCSI2_PHY_CFG_RESET_CTRL);
  441. i = 100;
  442. do {
  443. reg = isp_reg_readl(isp, csi2->phy->phy_regs, ISPCSIPHY_REG1)
  444. & ISPCSIPHY_REG1_RESET_DONE_CTRLCLK;
  445. if (reg == ISPCSIPHY_REG1_RESET_DONE_CTRLCLK)
  446. break;
  447. udelay(100);
  448. } while (--i > 0);
  449. if (i == 0) {
  450. printk(KERN_ERR
  451. "CSI2: Reset for CSI2_96M_FCLK domain Failed!\n");
  452. return -EBUSY;
  453. }
  454. if (isp->autoidle)
  455. isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
  456. ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK |
  457. ISPCSI2_SYSCONFIG_AUTO_IDLE,
  458. ISPCSI2_SYSCONFIG_MSTANDBY_MODE_SMART |
  459. ((isp->revision == ISP_REVISION_15_0) ?
  460. ISPCSI2_SYSCONFIG_AUTO_IDLE : 0));
  461. else
  462. isp_reg_clr_set(isp, csi2->regs1, ISPCSI2_SYSCONFIG,
  463. ISPCSI2_SYSCONFIG_MSTANDBY_MODE_MASK |
  464. ISPCSI2_SYSCONFIG_AUTO_IDLE,
  465. ISPCSI2_SYSCONFIG_MSTANDBY_MODE_NO);
  466. return 0;
  467. }
  468. static int csi2_configure(struct isp_csi2_device *csi2)
  469. {
  470. const struct isp_v4l2_subdevs_group *pdata;
  471. struct isp_device *isp = csi2->isp;
  472. struct isp_csi2_timing_cfg *timing = &csi2->timing[0];
  473. struct v4l2_subdev *sensor;
  474. struct media_pad *pad;
  475. /*
  476. * CSI2 fields that can be updated while the context has
  477. * been enabled or the interface has been enabled are not
  478. * updated dynamically currently. So we do not allow to
  479. * reconfigure if either has been enabled
  480. */
  481. if (csi2->contexts[0].enabled || csi2->ctrl.if_enable)
  482. return -EBUSY;
  483. pad = media_entity_remote_source(&csi2->pads[CSI2_PAD_SINK]);
  484. sensor = media_entity_to_v4l2_subdev(pad->entity);
  485. pdata = sensor->host_priv;
  486. csi2->frame_skip = 0;
  487. v4l2_subdev_call(sensor, sensor, g_skip_frames, &csi2->frame_skip);
  488. csi2->ctrl.vp_out_ctrl = pdata->bus.csi2.vpclk_div;
  489. csi2->ctrl.frame_mode = ISP_CSI2_FRAME_IMMEDIATE;
  490. csi2->ctrl.ecc_enable = pdata->bus.csi2.crc;
  491. timing->ionum = 1;
  492. timing->force_rx_mode = 1;
  493. timing->stop_state_16x = 1;
  494. timing->stop_state_4x = 1;
  495. timing->stop_state_counter = 0x1FF;
  496. /*
  497. * The CSI2 receiver can't do any format conversion except DPCM
  498. * decompression, so every set_format call configures both pads
  499. * and enables DPCM decompression as a special case:
  500. */
  501. if (csi2->formats[CSI2_PAD_SINK].code !=
  502. csi2->formats[CSI2_PAD_SOURCE].code)
  503. csi2->dpcm_decompress = true;
  504. else
  505. csi2->dpcm_decompress = false;
  506. csi2->contexts[0].format_id = csi2_ctx_map_format(csi2);
  507. if (csi2->video_out.bpl_padding == 0)
  508. csi2->contexts[0].data_offset = 0;
  509. else
  510. csi2->contexts[0].data_offset = csi2->video_out.bpl_value;
  511. /*
  512. * Enable end of frame and end of line signals generation for
  513. * context 0. These signals are generated from CSI2 receiver to
  514. * qualify the last pixel of a frame and the last pixel of a line.
  515. * Without enabling the signals CSI2 receiver writes data to memory
  516. * beyond buffer size and/or data line offset is not handled correctly.
  517. */
  518. csi2->contexts[0].eof_enabled = 1;
  519. csi2->contexts[0].eol_enabled = 1;
  520. csi2_irq_complexio1_set(isp, csi2, 1);
  521. csi2_irq_ctx_set(isp, csi2, 1);
  522. csi2_irq_status_set(isp, csi2, 1);
  523. /* Set configuration (timings, format and links) */
  524. csi2_timing_config(isp, csi2, timing);
  525. csi2_recv_config(isp, csi2, &csi2->ctrl);
  526. csi2_ctx_config(isp, csi2, &csi2->contexts[0]);
  527. return 0;
  528. }
  529. /*
  530. * csi2_print_status - Prints CSI2 debug information.
  531. */
  532. #define CSI2_PRINT_REGISTER(isp, regs, name)\
  533. dev_dbg(isp->dev, "###CSI2 " #name "=0x%08x\n", \
  534. isp_reg_readl(isp, regs, ISPCSI2_##name))
  535. static void csi2_print_status(struct isp_csi2_device *csi2)
  536. {
  537. struct isp_device *isp = csi2->isp;
  538. if (!csi2->available)
  539. return;
  540. dev_dbg(isp->dev, "-------------CSI2 Register dump-------------\n");
  541. CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSCONFIG);
  542. CSI2_PRINT_REGISTER(isp, csi2->regs1, SYSSTATUS);
  543. CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQENABLE);
  544. CSI2_PRINT_REGISTER(isp, csi2->regs1, IRQSTATUS);
  545. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTRL);
  546. CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_H);
  547. CSI2_PRINT_REGISTER(isp, csi2->regs1, GNQ);
  548. CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_CFG);
  549. CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQSTATUS);
  550. CSI2_PRINT_REGISTER(isp, csi2->regs1, SHORT_PACKET);
  551. CSI2_PRINT_REGISTER(isp, csi2->regs1, PHY_IRQENABLE);
  552. CSI2_PRINT_REGISTER(isp, csi2->regs1, DBG_P);
  553. CSI2_PRINT_REGISTER(isp, csi2->regs1, TIMING);
  554. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL1(0));
  555. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL2(0));
  556. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_OFST(0));
  557. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PING_ADDR(0));
  558. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_DAT_PONG_ADDR(0));
  559. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQENABLE(0));
  560. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_IRQSTATUS(0));
  561. CSI2_PRINT_REGISTER(isp, csi2->regs1, CTX_CTRL3(0));
  562. dev_dbg(isp->dev, "--------------------------------------------\n");
  563. }
  564. /* -----------------------------------------------------------------------------
  565. * Interrupt handling
  566. */
  567. /*
  568. * csi2_isr_buffer - Does buffer handling at end-of-frame
  569. * when writing to memory.
  570. */
  571. static void csi2_isr_buffer(struct isp_csi2_device *csi2)
  572. {
  573. struct isp_device *isp = csi2->isp;
  574. struct isp_buffer *buffer;
  575. csi2_ctx_enable(isp, csi2, 0, 0);
  576. buffer = omap3isp_video_buffer_next(&csi2->video_out);
  577. /*
  578. * Let video queue operation restart engine if there is an underrun
  579. * condition.
  580. */
  581. if (buffer == NULL)
  582. return;
  583. csi2_set_outaddr(csi2, buffer->isp_addr);
  584. csi2_ctx_enable(isp, csi2, 0, 1);
  585. }
  586. static void csi2_isr_ctx(struct isp_csi2_device *csi2,
  587. struct isp_csi2_ctx_cfg *ctx)
  588. {
  589. struct isp_device *isp = csi2->isp;
  590. unsigned int n = ctx->ctxnum;
  591. u32 status;
  592. status = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
  593. isp_reg_writel(isp, status, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
  594. if (!(status & ISPCSI2_CTX_IRQSTATUS_FE_IRQ))
  595. return;
  596. /* Skip interrupts until we reach the frame skip count. The CSI2 will be
  597. * automatically disabled, as the frame skip count has been programmed
  598. * in the CSI2_CTx_CTRL1::COUNT field, so reenable it.
  599. *
  600. * It would have been nice to rely on the FRAME_NUMBER interrupt instead
  601. * but it turned out that the interrupt is only generated when the CSI2
  602. * writes to memory (the CSI2_CTx_CTRL1::COUNT field is decreased
  603. * correctly and reaches 0 when data is forwarded to the video port only
  604. * but no interrupt arrives). Maybe a CSI2 hardware bug.
  605. */
  606. if (csi2->frame_skip) {
  607. csi2->frame_skip--;
  608. if (csi2->frame_skip == 0) {
  609. ctx->format_id = csi2_ctx_map_format(csi2);
  610. csi2_ctx_config(isp, csi2, ctx);
  611. csi2_ctx_enable(isp, csi2, n, 1);
  612. }
  613. return;
  614. }
  615. if (csi2->output & CSI2_OUTPUT_MEMORY)
  616. csi2_isr_buffer(csi2);
  617. }
  618. /*
  619. * omap3isp_csi2_isr - CSI2 interrupt handling.
  620. */
  621. void omap3isp_csi2_isr(struct isp_csi2_device *csi2)
  622. {
  623. struct isp_pipeline *pipe = to_isp_pipeline(&csi2->subdev.entity);
  624. u32 csi2_irqstatus, cpxio1_irqstatus;
  625. struct isp_device *isp = csi2->isp;
  626. if (!csi2->available)
  627. return;
  628. csi2_irqstatus = isp_reg_readl(isp, csi2->regs1, ISPCSI2_IRQSTATUS);
  629. isp_reg_writel(isp, csi2_irqstatus, csi2->regs1, ISPCSI2_IRQSTATUS);
  630. /* Failure Cases */
  631. if (csi2_irqstatus & ISPCSI2_IRQSTATUS_COMPLEXIO1_ERR_IRQ) {
  632. cpxio1_irqstatus = isp_reg_readl(isp, csi2->regs1,
  633. ISPCSI2_PHY_IRQSTATUS);
  634. isp_reg_writel(isp, cpxio1_irqstatus,
  635. csi2->regs1, ISPCSI2_PHY_IRQSTATUS);
  636. dev_dbg(isp->dev, "CSI2: ComplexIO Error IRQ "
  637. "%x\n", cpxio1_irqstatus);
  638. pipe->error = true;
  639. }
  640. if (csi2_irqstatus & (ISPCSI2_IRQSTATUS_OCP_ERR_IRQ |
  641. ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ |
  642. ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ |
  643. ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ |
  644. ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ)) {
  645. dev_dbg(isp->dev, "CSI2 Err:"
  646. " OCP:%d,"
  647. " Short_pack:%d,"
  648. " ECC:%d,"
  649. " CPXIO2:%d,"
  650. " FIFO_OVF:%d,"
  651. "\n",
  652. (csi2_irqstatus &
  653. ISPCSI2_IRQSTATUS_OCP_ERR_IRQ) ? 1 : 0,
  654. (csi2_irqstatus &
  655. ISPCSI2_IRQSTATUS_SHORT_PACKET_IRQ) ? 1 : 0,
  656. (csi2_irqstatus &
  657. ISPCSI2_IRQSTATUS_ECC_NO_CORRECTION_IRQ) ? 1 : 0,
  658. (csi2_irqstatus &
  659. ISPCSI2_IRQSTATUS_COMPLEXIO2_ERR_IRQ) ? 1 : 0,
  660. (csi2_irqstatus &
  661. ISPCSI2_IRQSTATUS_FIFO_OVF_IRQ) ? 1 : 0);
  662. pipe->error = true;
  663. }
  664. if (omap3isp_module_sync_is_stopping(&csi2->wait, &csi2->stopping))
  665. return;
  666. /* Successful cases */
  667. if (csi2_irqstatus & ISPCSI2_IRQSTATUS_CONTEXT(0))
  668. csi2_isr_ctx(csi2, &csi2->contexts[0]);
  669. if (csi2_irqstatus & ISPCSI2_IRQSTATUS_ECC_CORRECTION_IRQ)
  670. dev_dbg(isp->dev, "CSI2: ECC correction done\n");
  671. }
  672. /* -----------------------------------------------------------------------------
  673. * ISP video operations
  674. */
  675. /*
  676. * csi2_queue - Queues the first buffer when using memory output
  677. * @video: The video node
  678. * @buffer: buffer to queue
  679. */
  680. static int csi2_queue(struct isp_video *video, struct isp_buffer *buffer)
  681. {
  682. struct isp_device *isp = video->isp;
  683. struct isp_csi2_device *csi2 = &isp->isp_csi2a;
  684. csi2_set_outaddr(csi2, buffer->isp_addr);
  685. /*
  686. * If streaming was enabled before there was a buffer queued
  687. * or underrun happened in the ISR, the hardware was not enabled
  688. * and DMA queue flag ISP_VIDEO_DMAQUEUE_UNDERRUN is still set.
  689. * Enable it now.
  690. */
  691. if (csi2->video_out.dmaqueue_flags & ISP_VIDEO_DMAQUEUE_UNDERRUN) {
  692. /* Enable / disable context 0 and IRQs */
  693. csi2_if_enable(isp, csi2, 1);
  694. csi2_ctx_enable(isp, csi2, 0, 1);
  695. isp_video_dmaqueue_flags_clr(&csi2->video_out);
  696. }
  697. return 0;
  698. }
  699. static const struct isp_video_operations csi2_ispvideo_ops = {
  700. .queue = csi2_queue,
  701. };
  702. /* -----------------------------------------------------------------------------
  703. * V4L2 subdev operations
  704. */
  705. static struct v4l2_mbus_framefmt *
  706. __csi2_get_format(struct isp_csi2_device *csi2, struct v4l2_subdev_fh *fh,
  707. unsigned int pad, enum v4l2_subdev_format_whence which)
  708. {
  709. if (which == V4L2_SUBDEV_FORMAT_TRY)
  710. return v4l2_subdev_get_try_format(fh, pad);
  711. else
  712. return &csi2->formats[pad];
  713. }
  714. static void
  715. csi2_try_format(struct isp_csi2_device *csi2, struct v4l2_subdev_fh *fh,
  716. unsigned int pad, struct v4l2_mbus_framefmt *fmt,
  717. enum v4l2_subdev_format_whence which)
  718. {
  719. enum v4l2_mbus_pixelcode pixelcode;
  720. struct v4l2_mbus_framefmt *format;
  721. const struct isp_format_info *info;
  722. unsigned int i;
  723. switch (pad) {
  724. case CSI2_PAD_SINK:
  725. /* Clamp the width and height to valid range (1-8191). */
  726. for (i = 0; i < ARRAY_SIZE(csi2_input_fmts); i++) {
  727. if (fmt->code == csi2_input_fmts[i])
  728. break;
  729. }
  730. /* If not found, use SGRBG10 as default */
  731. if (i >= ARRAY_SIZE(csi2_input_fmts))
  732. fmt->code = V4L2_MBUS_FMT_SGRBG10_1X10;
  733. fmt->width = clamp_t(u32, fmt->width, 1, 8191);
  734. fmt->height = clamp_t(u32, fmt->height, 1, 8191);
  735. break;
  736. case CSI2_PAD_SOURCE:
  737. /* Source format same as sink format, except for DPCM
  738. * compression.
  739. */
  740. pixelcode = fmt->code;
  741. format = __csi2_get_format(csi2, fh, CSI2_PAD_SINK, which);
  742. memcpy(fmt, format, sizeof(*fmt));
  743. /*
  744. * Only Allow DPCM decompression, and check that the
  745. * pattern is preserved
  746. */
  747. info = omap3isp_video_format_info(fmt->code);
  748. if (info->uncompressed == pixelcode)
  749. fmt->code = pixelcode;
  750. break;
  751. }
  752. /* RGB, non-interlaced */
  753. fmt->colorspace = V4L2_COLORSPACE_SRGB;
  754. fmt->field = V4L2_FIELD_NONE;
  755. }
  756. /*
  757. * csi2_enum_mbus_code - Handle pixel format enumeration
  758. * @sd : pointer to v4l2 subdev structure
  759. * @fh : V4L2 subdev file handle
  760. * @code : pointer to v4l2_subdev_mbus_code_enum structure
  761. * return -EINVAL or zero on success
  762. */
  763. static int csi2_enum_mbus_code(struct v4l2_subdev *sd,
  764. struct v4l2_subdev_fh *fh,
  765. struct v4l2_subdev_mbus_code_enum *code)
  766. {
  767. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  768. struct v4l2_mbus_framefmt *format;
  769. const struct isp_format_info *info;
  770. if (code->pad == CSI2_PAD_SINK) {
  771. if (code->index >= ARRAY_SIZE(csi2_input_fmts))
  772. return -EINVAL;
  773. code->code = csi2_input_fmts[code->index];
  774. } else {
  775. format = __csi2_get_format(csi2, fh, CSI2_PAD_SINK,
  776. V4L2_SUBDEV_FORMAT_TRY);
  777. switch (code->index) {
  778. case 0:
  779. /* Passthrough sink pad code */
  780. code->code = format->code;
  781. break;
  782. case 1:
  783. /* Uncompressed code */
  784. info = omap3isp_video_format_info(format->code);
  785. if (info->uncompressed == format->code)
  786. return -EINVAL;
  787. code->code = info->uncompressed;
  788. break;
  789. default:
  790. return -EINVAL;
  791. }
  792. }
  793. return 0;
  794. }
  795. static int csi2_enum_frame_size(struct v4l2_subdev *sd,
  796. struct v4l2_subdev_fh *fh,
  797. struct v4l2_subdev_frame_size_enum *fse)
  798. {
  799. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  800. struct v4l2_mbus_framefmt format;
  801. if (fse->index != 0)
  802. return -EINVAL;
  803. format.code = fse->code;
  804. format.width = 1;
  805. format.height = 1;
  806. csi2_try_format(csi2, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
  807. fse->min_width = format.width;
  808. fse->min_height = format.height;
  809. if (format.code != fse->code)
  810. return -EINVAL;
  811. format.code = fse->code;
  812. format.width = -1;
  813. format.height = -1;
  814. csi2_try_format(csi2, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
  815. fse->max_width = format.width;
  816. fse->max_height = format.height;
  817. return 0;
  818. }
  819. /*
  820. * csi2_get_format - Handle get format by pads subdev method
  821. * @sd : pointer to v4l2 subdev structure
  822. * @fh : V4L2 subdev file handle
  823. * @fmt: pointer to v4l2 subdev format structure
  824. * return -EINVAL or zero on success
  825. */
  826. static int csi2_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
  827. struct v4l2_subdev_format *fmt)
  828. {
  829. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  830. struct v4l2_mbus_framefmt *format;
  831. format = __csi2_get_format(csi2, fh, fmt->pad, fmt->which);
  832. if (format == NULL)
  833. return -EINVAL;
  834. fmt->format = *format;
  835. return 0;
  836. }
  837. /*
  838. * csi2_set_format - Handle set format by pads subdev method
  839. * @sd : pointer to v4l2 subdev structure
  840. * @fh : V4L2 subdev file handle
  841. * @fmt: pointer to v4l2 subdev format structure
  842. * return -EINVAL or zero on success
  843. */
  844. static int csi2_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
  845. struct v4l2_subdev_format *fmt)
  846. {
  847. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  848. struct v4l2_mbus_framefmt *format;
  849. format = __csi2_get_format(csi2, fh, fmt->pad, fmt->which);
  850. if (format == NULL)
  851. return -EINVAL;
  852. csi2_try_format(csi2, fh, fmt->pad, &fmt->format, fmt->which);
  853. *format = fmt->format;
  854. /* Propagate the format from sink to source */
  855. if (fmt->pad == CSI2_PAD_SINK) {
  856. format = __csi2_get_format(csi2, fh, CSI2_PAD_SOURCE,
  857. fmt->which);
  858. *format = fmt->format;
  859. csi2_try_format(csi2, fh, CSI2_PAD_SOURCE, format, fmt->which);
  860. }
  861. return 0;
  862. }
  863. /*
  864. * csi2_init_formats - Initialize formats on all pads
  865. * @sd: ISP CSI2 V4L2 subdevice
  866. * @fh: V4L2 subdev file handle
  867. *
  868. * Initialize all pad formats with default values. If fh is not NULL, try
  869. * formats are initialized on the file handle. Otherwise active formats are
  870. * initialized on the device.
  871. */
  872. static int csi2_init_formats(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
  873. {
  874. struct v4l2_subdev_format format;
  875. memset(&format, 0, sizeof(format));
  876. format.pad = CSI2_PAD_SINK;
  877. format.which = fh ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE;
  878. format.format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
  879. format.format.width = 4096;
  880. format.format.height = 4096;
  881. csi2_set_format(sd, fh, &format);
  882. return 0;
  883. }
  884. /*
  885. * csi2_set_stream - Enable/Disable streaming on the CSI2 module
  886. * @sd: ISP CSI2 V4L2 subdevice
  887. * @enable: ISP pipeline stream state
  888. *
  889. * Return 0 on success or a negative error code otherwise.
  890. */
  891. static int csi2_set_stream(struct v4l2_subdev *sd, int enable)
  892. {
  893. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  894. struct isp_device *isp = csi2->isp;
  895. struct isp_video *video_out = &csi2->video_out;
  896. switch (enable) {
  897. case ISP_PIPELINE_STREAM_CONTINUOUS:
  898. if (omap3isp_csiphy_acquire(csi2->phy) < 0)
  899. return -ENODEV;
  900. if (csi2->output & CSI2_OUTPUT_MEMORY)
  901. omap3isp_sbl_enable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
  902. csi2_configure(csi2);
  903. csi2_print_status(csi2);
  904. /*
  905. * When outputting to memory with no buffer available, let the
  906. * buffer queue handler start the hardware. A DMA queue flag
  907. * ISP_VIDEO_DMAQUEUE_QUEUED will be set as soon as there is
  908. * a buffer available.
  909. */
  910. if (csi2->output & CSI2_OUTPUT_MEMORY &&
  911. !(video_out->dmaqueue_flags & ISP_VIDEO_DMAQUEUE_QUEUED))
  912. break;
  913. /* Enable context 0 and IRQs */
  914. atomic_set(&csi2->stopping, 0);
  915. csi2_ctx_enable(isp, csi2, 0, 1);
  916. csi2_if_enable(isp, csi2, 1);
  917. isp_video_dmaqueue_flags_clr(video_out);
  918. break;
  919. case ISP_PIPELINE_STREAM_STOPPED:
  920. if (csi2->state == ISP_PIPELINE_STREAM_STOPPED)
  921. return 0;
  922. if (omap3isp_module_sync_idle(&sd->entity, &csi2->wait,
  923. &csi2->stopping))
  924. dev_dbg(isp->dev, "%s: module stop timeout.\n",
  925. sd->name);
  926. csi2_ctx_enable(isp, csi2, 0, 0);
  927. csi2_if_enable(isp, csi2, 0);
  928. csi2_irq_ctx_set(isp, csi2, 0);
  929. omap3isp_csiphy_release(csi2->phy);
  930. isp_video_dmaqueue_flags_clr(video_out);
  931. omap3isp_sbl_disable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
  932. break;
  933. }
  934. csi2->state = enable;
  935. return 0;
  936. }
  937. /* subdev video operations */
  938. static const struct v4l2_subdev_video_ops csi2_video_ops = {
  939. .s_stream = csi2_set_stream,
  940. };
  941. /* subdev pad operations */
  942. static const struct v4l2_subdev_pad_ops csi2_pad_ops = {
  943. .enum_mbus_code = csi2_enum_mbus_code,
  944. .enum_frame_size = csi2_enum_frame_size,
  945. .get_fmt = csi2_get_format,
  946. .set_fmt = csi2_set_format,
  947. };
  948. /* subdev operations */
  949. static const struct v4l2_subdev_ops csi2_ops = {
  950. .video = &csi2_video_ops,
  951. .pad = &csi2_pad_ops,
  952. };
  953. /* subdev internal operations */
  954. static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
  955. .open = csi2_init_formats,
  956. };
  957. /* -----------------------------------------------------------------------------
  958. * Media entity operations
  959. */
  960. /*
  961. * csi2_link_setup - Setup CSI2 connections.
  962. * @entity : Pointer to media entity structure
  963. * @local : Pointer to local pad array
  964. * @remote : Pointer to remote pad array
  965. * @flags : Link flags
  966. * return -EINVAL or zero on success
  967. */
  968. static int csi2_link_setup(struct media_entity *entity,
  969. const struct media_pad *local,
  970. const struct media_pad *remote, u32 flags)
  971. {
  972. struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity);
  973. struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
  974. struct isp_csi2_ctrl_cfg *ctrl = &csi2->ctrl;
  975. /*
  976. * The ISP core doesn't support pipelines with multiple video outputs.
  977. * Revisit this when it will be implemented, and return -EBUSY for now.
  978. */
  979. switch (local->index | media_entity_type(remote->entity)) {
  980. case CSI2_PAD_SOURCE | MEDIA_ENT_T_DEVNODE:
  981. if (flags & MEDIA_LNK_FL_ENABLED) {
  982. if (csi2->output & ~CSI2_OUTPUT_MEMORY)
  983. return -EBUSY;
  984. csi2->output |= CSI2_OUTPUT_MEMORY;
  985. } else {
  986. csi2->output &= ~CSI2_OUTPUT_MEMORY;
  987. }
  988. break;
  989. case CSI2_PAD_SOURCE | MEDIA_ENT_T_V4L2_SUBDEV:
  990. if (flags & MEDIA_LNK_FL_ENABLED) {
  991. if (csi2->output & ~CSI2_OUTPUT_CCDC)
  992. return -EBUSY;
  993. csi2->output |= CSI2_OUTPUT_CCDC;
  994. } else {
  995. csi2->output &= ~CSI2_OUTPUT_CCDC;
  996. }
  997. break;
  998. default:
  999. /* Link from camera to CSI2 is fixed... */
  1000. return -EINVAL;
  1001. }
  1002. ctrl->vp_only_enable =
  1003. (csi2->output & CSI2_OUTPUT_MEMORY) ? false : true;
  1004. ctrl->vp_clk_enable = !!(csi2->output & CSI2_OUTPUT_CCDC);
  1005. return 0;
  1006. }
  1007. /* media operations */
  1008. static const struct media_entity_operations csi2_media_ops = {
  1009. .link_setup = csi2_link_setup,
  1010. .link_validate = v4l2_subdev_link_validate,
  1011. };
  1012. void omap3isp_csi2_unregister_entities(struct isp_csi2_device *csi2)
  1013. {
  1014. v4l2_device_unregister_subdev(&csi2->subdev);
  1015. omap3isp_video_unregister(&csi2->video_out);
  1016. }
  1017. int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2,
  1018. struct v4l2_device *vdev)
  1019. {
  1020. int ret;
  1021. /* Register the subdev and video nodes. */
  1022. ret = v4l2_device_register_subdev(vdev, &csi2->subdev);
  1023. if (ret < 0)
  1024. goto error;
  1025. ret = omap3isp_video_register(&csi2->video_out, vdev);
  1026. if (ret < 0)
  1027. goto error;
  1028. return 0;
  1029. error:
  1030. omap3isp_csi2_unregister_entities(csi2);
  1031. return ret;
  1032. }
  1033. /* -----------------------------------------------------------------------------
  1034. * ISP CSI2 initialisation and cleanup
  1035. */
  1036. /*
  1037. * csi2_init_entities - Initialize subdev and media entity.
  1038. * @csi2: Pointer to csi2 structure.
  1039. * return -ENOMEM or zero on success
  1040. */
  1041. static int csi2_init_entities(struct isp_csi2_device *csi2)
  1042. {
  1043. struct v4l2_subdev *sd = &csi2->subdev;
  1044. struct media_pad *pads = csi2->pads;
  1045. struct media_entity *me = &sd->entity;
  1046. int ret;
  1047. v4l2_subdev_init(sd, &csi2_ops);
  1048. sd->internal_ops = &csi2_internal_ops;
  1049. strlcpy(sd->name, "OMAP3 ISP CSI2a", sizeof(sd->name));
  1050. sd->grp_id = 1 << 16; /* group ID for isp subdevs */
  1051. v4l2_set_subdevdata(sd, csi2);
  1052. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  1053. pads[CSI2_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
  1054. pads[CSI2_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
  1055. me->ops = &csi2_media_ops;
  1056. ret = media_entity_init(me, CSI2_PADS_NUM, pads, 0);
  1057. if (ret < 0)
  1058. return ret;
  1059. csi2_init_formats(sd, NULL);
  1060. /* Video device node */
  1061. csi2->video_out.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1062. csi2->video_out.ops = &csi2_ispvideo_ops;
  1063. csi2->video_out.bpl_alignment = 32;
  1064. csi2->video_out.bpl_zero_padding = 1;
  1065. csi2->video_out.bpl_max = 0x1ffe0;
  1066. csi2->video_out.isp = csi2->isp;
  1067. csi2->video_out.capture_mem = PAGE_ALIGN(4096 * 4096) * 3;
  1068. ret = omap3isp_video_init(&csi2->video_out, "CSI2a");
  1069. if (ret < 0)
  1070. goto error_video;
  1071. /* Connect the CSI2 subdev to the video node. */
  1072. ret = media_entity_create_link(&csi2->subdev.entity, CSI2_PAD_SOURCE,
  1073. &csi2->video_out.video.entity, 0, 0);
  1074. if (ret < 0)
  1075. goto error_link;
  1076. return 0;
  1077. error_link:
  1078. omap3isp_video_cleanup(&csi2->video_out);
  1079. error_video:
  1080. media_entity_cleanup(&csi2->subdev.entity);
  1081. return ret;
  1082. }
  1083. /*
  1084. * omap3isp_csi2_init - Routine for module driver init
  1085. */
  1086. int omap3isp_csi2_init(struct isp_device *isp)
  1087. {
  1088. struct isp_csi2_device *csi2a = &isp->isp_csi2a;
  1089. struct isp_csi2_device *csi2c = &isp->isp_csi2c;
  1090. int ret;
  1091. csi2a->isp = isp;
  1092. csi2a->available = 1;
  1093. csi2a->regs1 = OMAP3_ISP_IOMEM_CSI2A_REGS1;
  1094. csi2a->regs2 = OMAP3_ISP_IOMEM_CSI2A_REGS2;
  1095. csi2a->phy = &isp->isp_csiphy2;
  1096. csi2a->state = ISP_PIPELINE_STREAM_STOPPED;
  1097. init_waitqueue_head(&csi2a->wait);
  1098. ret = csi2_init_entities(csi2a);
  1099. if (ret < 0)
  1100. return ret;
  1101. if (isp->revision == ISP_REVISION_15_0) {
  1102. csi2c->isp = isp;
  1103. csi2c->available = 1;
  1104. csi2c->regs1 = OMAP3_ISP_IOMEM_CSI2C_REGS1;
  1105. csi2c->regs2 = OMAP3_ISP_IOMEM_CSI2C_REGS2;
  1106. csi2c->phy = &isp->isp_csiphy1;
  1107. csi2c->state = ISP_PIPELINE_STREAM_STOPPED;
  1108. init_waitqueue_head(&csi2c->wait);
  1109. }
  1110. return 0;
  1111. }
  1112. /*
  1113. * omap3isp_csi2_cleanup - Routine for module driver cleanup
  1114. */
  1115. void omap3isp_csi2_cleanup(struct isp_device *isp)
  1116. {
  1117. struct isp_csi2_device *csi2a = &isp->isp_csi2a;
  1118. omap3isp_video_cleanup(&csi2a->video_out);
  1119. media_entity_cleanup(&csi2a->subdev.entity);
  1120. }