ark1668e_vin.c 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954
  1. /*
  2. * Arkmicro v4l2 driver
  3. *
  4. * Licensed under GPLv2 or later.
  5. */
  6. #include <linux/clk.h>
  7. #include <linux/clkdev.h>
  8. #include <linux/clk-provider.h>
  9. #include <linux/delay.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/math64.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/of_graph.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/pm_runtime.h>
  17. #include <linux/regmap.h>
  18. #include <linux/videodev2.h>
  19. #include <linux/kernel.h>
  20. #include <linux/init.h>
  21. #include <linux/mm.h>
  22. #include <linux/slab.h>
  23. #include <linux/fs.h>
  24. #include <linux/errno.h>
  25. #include <asm/uaccess.h>
  26. #include <linux/list.h>
  27. #include <linux/sched.h>
  28. #include <linux/poll.h>
  29. #include <linux/gpio.h>
  30. #include <asm/setup.h>
  31. #include <linux/dma-mapping.h>
  32. #include <media/v4l2-ctrls.h>
  33. #include <media/v4l2-device.h>
  34. #include <media/v4l2-event.h>
  35. #include <media/v4l2-image-sizes.h>
  36. #include <media/v4l2-ioctl.h>
  37. #include <media/v4l2-fwnode.h>
  38. #include <media/v4l2-subdev.h>
  39. #include <media/videobuf2-dma-contig.h>
  40. #include "ark1668e_vin.h"
  41. extern int ark_vin_display_init(int layer,int src_width, int src_height,int out_posx, int out_posy);
  42. extern int ark_vin_display_addr(unsigned int addr);
  43. extern int ark_vin_get_display_addr(void);
  44. extern int ark1668e_lcdc_wait_for_vsync(void);
  45. extern int ark_vin_get_screen_info(int* width,int* height);
  46. extern int ark_disp_set_layer_en(int layer_id, int enable);
  47. extern int ark_scale_start(struct ark_scale_context *context, struct ark_scale_param *param);
  48. int dvr_enter_carback(void);
  49. int dvr_exit_carback(void);
  50. static int vin_start(struct dvr_dev *dvr_dev);
  51. static void vin_init(struct ark1668e_vin_device *vin, struct vin_para *para);
  52. static int vin_exit(void);
  53. static inline void vin_reset(void);
  54. static int vin_aux_config(struct vin_para* para);
  55. static int vin_aux_start(struct dvr_dev *dvr_dev);
  56. static void vin_aux_exit(void);
  57. static inline void ark_vin_disable_write(void);
  58. static inline void ark_vin_enable_write(void);
  59. extern unsigned int g_screen_width;
  60. extern unsigned int g_screen_height;
  61. struct ark1668e_vin_device* g_ark1668e_vin = NULL;
  62. struct ark_scale_param scale_param;
  63. extern struct ark_scale_context *scale_context;
  64. static int vin_queue_setup(struct vb2_queue *vq,
  65. unsigned int *nbuffers, unsigned int *nplanes,
  66. unsigned int sizes[], struct device *alloc_devs[])
  67. {
  68. struct ark1668e_vin_device* ark_vin = vb2_get_drv_priv(vq);
  69. unsigned int size = ark_vin->fmt.fmt.pix.sizeimage;
  70. if (*nplanes)
  71. return sizes[0] < size ? -EINVAL : 0;
  72. *nplanes = 1;
  73. sizes[0] = size;
  74. return 0;
  75. }
  76. static int vin_buffer_init(struct vb2_buffer *vb)
  77. {
  78. return 0;
  79. }
  80. static int vin_buffer_prepare(struct vb2_buffer *vb)
  81. {
  82. struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
  83. struct ark1668e_vin_device* ark_vin = vb2_get_drv_priv(vb->vb2_queue);
  84. unsigned long size = ark_vin->fmt.fmt.pix.sizeimage;
  85. if (vb2_plane_size(vb, 0) < size) {
  86. v4l2_err(&ark_vin->v4l2_dev, "buffer too small (%lu < %lu)\n",
  87. vb2_plane_size(vb, 0), size);
  88. return -EINVAL;
  89. }
  90. vb2_set_plane_payload(vb, 0, size);
  91. vbuf->field = ark_vin->fmt.fmt.pix.field;
  92. return 0;
  93. }
  94. static int vin_config(void)
  95. {
  96. struct ark1668e_vin_device* vin = NULL;
  97. int ret;
  98. vin = g_ark1668e_vin;
  99. memset(&vin->dvr_dev->itu656in,0,sizeof(struct vin_para));
  100. vin->dvr_dev->itu656in.source = DVR_SOURCE_CAMERA;
  101. if(!vin->sd_init){
  102. ret = v4l2_subdev_call(vin->current_subdev->sd,core,init,0);
  103. if(ret < 0){
  104. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  105. return ret;
  106. }
  107. vin->sd_init = 1;
  108. }
  109. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  110. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_ENTER_CARBACK,0);
  111. if(ret < 0){
  112. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  113. return ret;
  114. }
  115. }
  116. spin_lock(&vin->dvr_dev->spin_lock);
  117. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_ITU601_ENABLE,&vin->dvr_dev->itu656in.itu601en);
  118. if(ret < 0){
  119. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  120. return ret;
  121. }
  122. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_PROGRESSIVE,&vin->dvr_dev->itu656in.progressive);
  123. if(ret < 0){
  124. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  125. return ret;
  126. }
  127. memcpy(&vin->dvr_dev->itu656in_back, &vin->dvr_dev->itu656in, sizeof(struct vin_para));
  128. vin_reset();
  129. vin_init(vin, &vin->dvr_dev->itu656in);
  130. vin->dvr_dev->channel = g_ark1668e_vin->app_channel_set;
  131. vin_start(vin->dvr_dev);
  132. spin_unlock(&vin->dvr_dev->spin_lock);
  133. return 0;
  134. }
  135. static int vin_aux_config(struct vin_para* para)
  136. {
  137. struct ark1668e_vin_device* vin = NULL;
  138. int ret = 0;
  139. vin = g_ark1668e_vin;
  140. memset(&vin->dvr_dev->itu656in,0,sizeof(struct vin_para));
  141. vin->vin_status = vin->stream_flag;
  142. vin->stream_flag = false;
  143. vin->aux_flag = 1;
  144. if(!vin->sd_init){
  145. ret = v4l2_subdev_call(vin->current_subdev->sd,core,init,0);
  146. if(ret < 0){
  147. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  148. return ret;
  149. }
  150. vin->sd_init = 1;
  151. }
  152. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  153. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_ENTER_CARBACK,0);
  154. if(ret < 0){
  155. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  156. return ret;
  157. }
  158. }
  159. spin_lock(&vin->dvr_dev->spin_lock);
  160. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_ITU601_ENABLE,&vin->dvr_dev->itu656in.itu601en);
  161. if(ret < 0){
  162. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  163. return ret;
  164. }
  165. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_PROGRESSIVE,&vin->dvr_dev->itu656in.progressive);
  166. if(ret < 0){
  167. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  168. return ret;
  169. }
  170. para->itu601en = vin->dvr_dev->itu656in.itu601en;
  171. para->progressive = vin->dvr_dev->itu656in.progressive;
  172. vin->dvr_dev->itu601en = para->itu601en;
  173. vin->dvr_dev->interlace = !para->progressive;
  174. memcpy(&vin->dvr_dev->itu656in_back, para, sizeof(struct vin_para));
  175. vin_reset();
  176. vin->dvr_dev->scale_framebuf_index = 0;
  177. vin->dvr_dev->carback_exit_status = 0;
  178. spin_unlock(&vin->dvr_dev->spin_lock);
  179. return 0;
  180. }
  181. static void vin_setaddr(struct ark1668e_vin_device *vin)
  182. {
  183. dma_addr_t addr_dma;
  184. /* Get the physical address of the assigned BUF */
  185. addr_dma = vb2_dma_contig_plane_dma_addr(&vin->cur_frm->vb.vb2_buf, 0);
  186. //printk("vin_setaddr addr_dma : 0x%x\n",addr_dma);
  187. vin_writel(ARK1668E_ITU656_DRAM_DEST1, addr_dma);
  188. vin_writel(ARK1668E_ITU656_DRAM_DEST1,addr_dma + vin->dvr_dev->src_width*vin->dvr_dev->src_height);
  189. }
  190. static inline void vin_reset(void)
  191. {
  192. //soft reset
  193. vin_writel_sys(ARK1668E_SYS_SOFT_RSTNA, vin_readl_sys(ARK1668E_SYS_SOFT_RSTNA)& ~(1 << 9));
  194. msleep(1);
  195. vin_writel_sys(ARK1668E_SYS_SOFT_RSTNA, vin_readl_sys(ARK1668E_SYS_SOFT_RSTNA)| (1 << 9));
  196. //addr reset
  197. vin_writel(ARK1668E_ITU656_RESET,vin_readl(ARK1668E_ITU656_RESET) | (1 << 1));
  198. msleep(1);
  199. vin_writel(ARK1668E_ITU656_RESET,vin_readl(ARK1668E_ITU656_RESET) & ~(1 << 1));
  200. }
  201. static int vin_start_streaming(struct vb2_queue *vq, unsigned int count)
  202. {
  203. struct ark1668e_vin_device *vin = vb2_get_drv_priv(vq);
  204. vin->stream_flag = true;
  205. vin_config();
  206. //spin_lock_irqsave(&vin->ark_queue_lock, flags);
  207. vin->sequence = 0;
  208. vin->stop = false;
  209. reinit_completion(&vin->comp);
  210. vin->cur_frm = list_first_entry(&vin->ark_queue,struct vin_buffer, list);
  211. //printk(KERN_DEBUG "start_streaming->get out buf: %p\n",vin->cur_frm->vb.vb2_buf.planes[0].mem_priv);
  212. list_del(&vin->cur_frm->list);
  213. vin_setaddr(vin);
  214. //spin_unlock_irqrestore(&vin->ark_queue_lock, flags);
  215. return 0;
  216. }
  217. static void vin_stop_streaming(struct vb2_queue *vq)
  218. {
  219. struct ark1668e_vin_device* ark_vin = vb2_get_drv_priv(vq);
  220. struct vin_buffer *buf;
  221. ark_vin->stop = true;
  222. ark_vin->stream_flag = false;
  223. vin_exit();
  224. /* Release all active buffers */
  225. //spin_lock_irqsave(&ark_vin->ark_queue_lock, flags);
  226. if (unlikely(ark_vin->cur_frm)) {
  227. vb2_buffer_done(&ark_vin->cur_frm->vb.vb2_buf,
  228. VB2_BUF_STATE_ERROR);
  229. ark_vin->cur_frm = NULL;
  230. }
  231. list_for_each_entry(buf, &ark_vin->ark_queue, list)
  232. vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
  233. INIT_LIST_HEAD(&ark_vin->ark_queue);
  234. //spin_unlock_irqrestore(&ark_vin->ark_queue_lock, flags);
  235. }
  236. static void vin_buffer_queue(struct vb2_buffer *vb)
  237. {
  238. struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
  239. struct vin_buffer *buf = container_of(vbuf, struct vin_buffer, vb);
  240. struct ark1668e_vin_device *vin = vb2_get_drv_priv(vb->vb2_queue);
  241. dma_addr_t addr_dma;
  242. addr_dma = vb2_dma_contig_plane_dma_addr(vb, 0);
  243. /*app buf physical address can be obtained directly from this variable */
  244. vb->planes[0].m.offset = addr_dma;
  245. //printk(KERN_DEBUG "!vin->cur_frm = %d,list_empty(&vin->ark_queue)= %d,vb2_is_streaming(vb->vb2_queue) = %d\n",!vin->cur_frm,list_empty(&vin->ark_queue),vb2_is_streaming(vb->vb2_queue));
  246. if (!vin->cur_frm && list_empty(&vin->ark_queue) && vb2_is_streaming(vb->vb2_queue)){
  247. vin->cur_frm = buf;
  248. vin_setaddr(vin);
  249. }
  250. else{
  251. /* add buf to list */
  252. list_add_tail(&buf->list, &vin->ark_queue);
  253. if(!vb2_is_streaming(vb->vb2_queue)){
  254. printk(KERN_DEBUG "init buff.\n");
  255. vin->cur_frm = buf;
  256. vin_setaddr(vin);
  257. }
  258. }
  259. }
  260. static const struct vb2_ops vin_vb2_ops = {
  261. .queue_setup = vin_queue_setup,
  262. .buf_init = vin_buffer_init,
  263. .wait_prepare = vb2_ops_wait_prepare,
  264. .wait_finish = vb2_ops_wait_finish,
  265. .buf_prepare = vin_buffer_prepare,
  266. .start_streaming = vin_start_streaming,
  267. .stop_streaming = vin_stop_streaming,
  268. .buf_queue = vin_buffer_queue,
  269. };
  270. static int vin_querycap(struct file *file, void *priv,struct v4l2_capability *cap)
  271. {
  272. strcpy(cap->driver, ARK_VIN_NAME);
  273. strcpy(cap->card, "Ark videoin driver");
  274. cap->capabilities = V4L2_CAP_VIDEO_CAPTURE;
  275. return 0;
  276. }
  277. static int vin_enum_fmt_vid_cap(struct file *file, void *priv,struct v4l2_fmtdesc *f)
  278. {
  279. u32 index = f->index;
  280. if (index >= 1)
  281. return -EINVAL;
  282. f->pixelformat = V4L2_PIX_FMT_VYUY;
  283. return 0;
  284. }
  285. static int vin_g_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *fmt)
  286. {
  287. struct ark1668e_vin_device *vin = video_drvdata(file);
  288. *fmt = vin->fmt;
  289. return 0;
  290. }
  291. static int vin_try_fmt(struct ark1668e_vin_device *vin, struct v4l2_format *f)
  292. {
  293. struct v4l2_pix_format *pixfmt = &f->fmt.pix;
  294. if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  295. return -EINVAL;
  296. if(pixfmt->width == 0 || pixfmt->height == 0){
  297. printk(KERN_ALERT "pixfmt width is null\n");
  298. return -EINVAL;
  299. }
  300. pixfmt->field = V4L2_FIELD_ANY;
  301. pixfmt->bytesperline = (pixfmt->width * 16) >> 3;
  302. pixfmt->sizeimage = pixfmt->width * pixfmt->height * 3 / 2;
  303. printk(KERN_DEBUG "pixfmt->width = %d.\n",pixfmt->width);
  304. printk(KERN_DEBUG "pixfmt->height = %d.\n",pixfmt->height);
  305. printk(KERN_DEBUG "pixfmt->bytesperline = %d.\n",pixfmt->bytesperline);
  306. printk(KERN_DEBUG "pixfmt->sizeimage = %d.\n",pixfmt->sizeimage);
  307. return 0;
  308. }
  309. static int vin_set_fmt(struct ark1668e_vin_device *vin, struct v4l2_format *f)
  310. {
  311. int ret;
  312. ret = vin_try_fmt(vin, f);
  313. if (ret)
  314. return ret;
  315. vin_reset();
  316. vin->fmt = *f;
  317. return 0;
  318. }
  319. static int vin_try_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *f)
  320. {
  321. struct ark1668e_vin_device *ark_vin = video_drvdata(file);
  322. return vin_try_fmt(ark_vin, f);
  323. }
  324. static int vin_s_fmt_vid_cap(struct file *file, void *priv,struct v4l2_format *f)
  325. {
  326. struct ark1668e_vin_device *ark_vin = video_drvdata(file);
  327. if (vb2_is_streaming(&ark_vin->vb2_vidq))
  328. return -EBUSY;
  329. return vin_set_fmt(ark_vin, f);
  330. }
  331. static int vin_enum_input(struct file *file, void *priv,struct v4l2_input *inp)
  332. {
  333. if (inp->index != 0)
  334. return -EINVAL;
  335. inp->type = V4L2_INPUT_TYPE_CAMERA;
  336. inp->std = 0;
  337. strcpy(inp->name, "Camera");
  338. return 0;
  339. }
  340. static int vin_g_input(struct file *file, void *priv, unsigned int *i)
  341. {
  342. struct ark1668e_vin_device* vin = NULL;
  343. vin = g_ark1668e_vin;
  344. *i = vin->dvr_dev->carback_signal;
  345. return vin->dvr_dev->carback_signal;
  346. }
  347. static int vin_s_input(struct file *file, void *priv, unsigned int i)
  348. {
  349. g_ark1668e_vin->app_channel_set = i;
  350. if (i > 0)
  351. return -EINVAL;
  352. return 0;
  353. }
  354. static long vin_ioctl_default(struct file *file, void *priv,
  355. bool valid_prio, unsigned int cmd, void *param)
  356. {
  357. struct dvr_dev *dvr_dev =g_ark1668e_vin->dvr_dev;
  358. unsigned long error = 0;
  359. if(!dvr_dev){
  360. printk(KERN_ERR"%s error null device", __func__);
  361. return -ENXIO;
  362. }
  363. //spin_lock_irqsave(&dvr_dev->spin_lock, flags);
  364. switch (cmd)
  365. {
  366. case VIN_UPDATE_WINDOW:
  367. {
  368. struct vin_screen *vout_para = (struct vin_screen *)param;
  369. if(!dvr_dev->carback_exit_status){
  370. dvr_dev->work_status = 0;
  371. ark_vin_disable_write();
  372. //flush_workqueue(dvr_dev->scale_queue);
  373. mdelay(20);
  374. dvr_dev->screen_xpos = vout_para->disp_x;
  375. dvr_dev->screen_ypos = vout_para->disp_y;
  376. dvr_dev->screen_width = vout_para->disp_width;
  377. dvr_dev->screen_height = vout_para->disp_height;
  378. printk(KERN_INFO "set carback win-->w:%d,h%d,x:%d,y%d\n",dvr_dev->screen_width,dvr_dev->screen_height,vout_para->disp_x,vout_para->disp_y);
  379. error = ark_vin_display_init(DISPLAY_LAYER,dvr_dev->screen_width,dvr_dev->screen_height,dvr_dev->screen_xpos,dvr_dev->screen_ypos);
  380. dvr_dev->work_status = 1;
  381. ark_vin_enable_write();
  382. if( error < 0 )
  383. return error;
  384. }
  385. else{
  386. dvr_dev->screen_xpos = vout_para->disp_x;
  387. dvr_dev->screen_ypos = vout_para->disp_y;
  388. dvr_dev->screen_width = vout_para->disp_width;
  389. dvr_dev->screen_height = vout_para->disp_height;
  390. printk(KERN_INFO "set carback win-->w:%d,h%d,x:%d,y%d\n",dvr_dev->screen_width,dvr_dev->screen_height,vout_para->disp_x,vout_para->disp_y);
  391. error = ark_vin_display_init(DISPLAY_LAYER,dvr_dev->screen_width,dvr_dev->screen_height,dvr_dev->screen_xpos,dvr_dev->screen_ypos);
  392. if( error < 0 )
  393. return error;
  394. }
  395. break;
  396. }
  397. case VIN_START:
  398. {
  399. g_ark1668e_vin->aux_status = 1;
  400. vin_aux_start(dvr_dev);
  401. break;
  402. }
  403. case VIN_STOP:
  404. {
  405. vin_aux_exit();
  406. g_ark1668e_vin->aux_flag = 0;
  407. g_ark1668e_vin->aux_status = 0;
  408. break;
  409. }
  410. case VIN_SWITCH_CHANNEL:
  411. {
  412. int source = *((int *)param);
  413. if (source == DVR_SOURCE_AUX)
  414. dvr_dev->channel = ARK7116_AV1;
  415. else if (source == DVR_SOURCE_CAMERA)
  416. dvr_dev->channel = ARK7116_AV0;
  417. else if (source == DVR_SOURCE_DVD)
  418. dvr_dev->channel = ARK7116_AV2;
  419. else {
  420. dvr_dev->channel = source;
  421. }
  422. g_ark1668e_vin->app_channel_set = source;
  423. break;
  424. }
  425. case VIN_CONFIG:
  426. {
  427. struct vin_para *para = (struct vin_para *)param;
  428. vin_aux_config(para);
  429. break;
  430. }
  431. default:
  432. printk("%s: error cmd 0x%x\n", __func__, cmd);
  433. error = -EFAULT;
  434. goto end;
  435. }
  436. return 0;
  437. end:
  438. //spin_unlock_irqrestore(&dvr_dev->spin_lock, flags);
  439. return error;
  440. }
  441. static const struct v4l2_ioctl_ops vin_ioctl_ops = {
  442. .vidioc_querycap = vin_querycap,
  443. .vidioc_enum_fmt_vid_cap = vin_enum_fmt_vid_cap,
  444. .vidioc_g_fmt_vid_cap = vin_g_fmt_vid_cap,
  445. .vidioc_s_fmt_vid_cap = vin_s_fmt_vid_cap,
  446. .vidioc_try_fmt_vid_cap = vin_try_fmt_vid_cap,
  447. .vidioc_enum_input = vin_enum_input,
  448. .vidioc_g_input = vin_g_input,
  449. .vidioc_s_input = vin_s_input,
  450. .vidioc_reqbufs = vb2_ioctl_reqbufs,
  451. .vidioc_querybuf = vb2_ioctl_querybuf,
  452. .vidioc_qbuf = vb2_ioctl_qbuf,
  453. .vidioc_dqbuf = vb2_ioctl_dqbuf,
  454. .vidioc_streamon = vb2_ioctl_streamon,
  455. .vidioc_streamoff = vb2_ioctl_streamoff,
  456. .vidioc_default = vin_ioctl_default,
  457. };
  458. static int vin_open(struct file *file)
  459. {
  460. struct ark1668e_vin_device* ark_vin = video_drvdata(file);
  461. int ret;
  462. if (mutex_lock_interruptible(&ark_vin->lock))
  463. return -ERESTARTSYS;
  464. ret = v4l2_fh_open(file);
  465. if (ret < 0)
  466. goto unlock;
  467. if (!v4l2_fh_is_singular_file(file))
  468. goto unlock;
  469. unlock:
  470. mutex_unlock(&ark_vin->lock);
  471. return ret;
  472. }
  473. static int vin_release(struct file *file)
  474. {
  475. struct ark1668e_vin_device* ark_vin = video_drvdata(file);
  476. bool fh_singular;
  477. int ret;
  478. mutex_lock(&ark_vin->lock);
  479. fh_singular = v4l2_fh_is_singular_file(file);
  480. ret = _vb2_fop_release(file, NULL);
  481. mutex_unlock(&ark_vin->lock);
  482. return 0;
  483. }
  484. static const struct v4l2_file_operations vin_fops = {
  485. .owner = THIS_MODULE,
  486. .open = vin_open,
  487. .release = vin_release,
  488. .unlocked_ioctl = video_ioctl2,
  489. .read = vb2_fop_read,
  490. .mmap = vb2_fop_mmap,
  491. .poll = vb2_fop_poll,
  492. };
  493. #if 0
  494. static int deinterlace_process (unsigned int deinterlace_size, unsigned int data_mode, unsigned int deinterlace_type,
  495. unsigned int deinterlace_field, unsigned int src_field_addr_0, unsigned int src_field_addr_1,unsigned int src_field_addr_2,
  496. unsigned int dst_y_addr, unsigned int dst_u_addr, unsigned int dst_v_addr)
  497. {
  498. }
  499. #endif
  500. static inline void ark_vin_disable_write(void)
  501. {
  502. vin_writel(ARK1668E_ITU656_MODULE_EN,vin_readl(ARK1668E_ITU656_MODULE_EN) | (1 << 2));
  503. }
  504. static inline void ark_vin_enable_write(void)
  505. {
  506. vin_writel(ARK1668E_ITU656_MODULE_EN,vin_readl(ARK1668E_ITU656_MODULE_EN) & ~(1 << 2));
  507. }
  508. void ark_vin_disable(void)
  509. {
  510. vin_writel(ARK1668E_ITU656_IMR, 0);
  511. vin_writel(ARK1668E_ITU656_ENABLE_REG,vin_readl(ARK1668E_ITU656_ENABLE_REG) & ~(1 << 0));
  512. }
  513. void vin_alloc_buf(int type)
  514. {
  515. struct ark1668e_vin_device* vin = NULL;
  516. int i;
  517. vin = g_ark1668e_vin;
  518. printk("vin_alloc_buf buffer_size = %d\n",vin->dvr_dev->buffer_size);
  519. #if 0
  520. vin->dvr_dev->buffer_virtaddr = (void *)__get_free_pages(GFP_KERNEL, get_order(vin->dvr_dev->buffer_size));
  521. if (!vin->dvr_dev->buffer_virtaddr) {
  522. printk(KERN_ALERT "%s get. buffer_virtaddr fail\n", __func__);
  523. }
  524. vin->dvr_dev->buffer_phyaddr = virt_to_phys(vin->dvr_dev->buffer_virtaddr);
  525. for(i = 0; i < vin->dvr_dev->framebuf_num; i++){
  526. if(type == TYPE_1080P){
  527. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_PROGRESSIVE_FRAME_SIZE_1080P*i;
  528. }
  529. else if(type == TYPE_720P){
  530. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_PROGRESSIVE_FRAME_SIZE*i;
  531. }
  532. else{
  533. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_FRAME_SIZE*i;
  534. }
  535. }
  536. vin->dvr_dev->scale_out_yaddr = (void *)__get_free_pages(GFP_KERNEL, get_order(vin->dvr_dev->scale_alloc_width*vin->dvr_dev->scale_alloc_height*2));
  537. if (!vin->dvr_dev->scale_out_yaddr) {
  538. printk(KERN_ALERT "%s get. scale_out_yaddr fail\n", __func__);
  539. }
  540. vin->dvr_dev->scale_out_yphyaddr = virt_to_phys(vin->dvr_dev->scale_out_yaddr);
  541. #else
  542. vin->dvr_dev->buffer_virtaddr = dma_alloc_wc(vin->dev, vin->dvr_dev->buffer_size,
  543. (dma_addr_t *)&vin->dvr_dev->buffer_phyaddr,
  544. GFP_KERNEL);
  545. if (!vin->dvr_dev->buffer_virtaddr){
  546. printk(KERN_ALERT "%s dma_alloc_wc fail\n", __func__);
  547. }
  548. for(i = 0; i < vin->dvr_dev->framebuf_num; i++){
  549. if(type == TYPE_1080P){
  550. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_PROGRESSIVE_FRAME_SIZE_1080P*i;
  551. }
  552. else if(type == TYPE_720P){
  553. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_PROGRESSIVE_FRAME_SIZE*i;
  554. }
  555. else{
  556. vin->dvr_dev->framebuf_phyaddr[i] = vin->dvr_dev->buffer_phyaddr + ITU656_FRAME_SIZE*i;
  557. }
  558. }
  559. vin->dvr_dev->scale_out_yaddr = dma_alloc_wc(vin->dev, vin->dvr_dev->scale_buffer_size,
  560. (dma_addr_t *)&vin->dvr_dev->scale_out_yphyaddr,
  561. GFP_KERNEL);
  562. if (!vin->dvr_dev->scale_out_yaddr){
  563. printk(KERN_ALERT "%s dma_alloc_wc fail\n", __func__);
  564. }
  565. for(i = 0; i < vin->dvr_dev->scale_framebuf_num; i++){
  566. vin->dvr_dev->scalebuf_phyaddr[i] = vin->dvr_dev->scale_out_yphyaddr + vin->dvr_dev->scale_alloc_width*vin->dvr_dev->scale_alloc_height*2*i;
  567. }
  568. #endif
  569. }
  570. void dvr_restart(void)
  571. {
  572. struct ark1668e_vin_device* vin = NULL;
  573. int ret;
  574. vin = g_ark1668e_vin;
  575. if(!vin->dvr_dev->carback_exit_status)
  576. {
  577. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_PROGRESSIVE,&vin->dvr_dev->itu656in.progressive);
  578. if(ret < 0)
  579. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  580. vin->dvr_dev->interlace = !vin->dvr_dev->itu656in.progressive;
  581. ark_vin_disable_write();
  582. mod_timer(&vin->dvr_dev->timer, jiffies + msecs_to_jiffies(50));
  583. }
  584. }
  585. EXPORT_SYMBOL(dvr_restart);
  586. int dvr_enter_carback(void)
  587. {
  588. struct ark1668e_vin_device* vin = NULL;
  589. int ret;
  590. vin = g_ark1668e_vin;
  591. memset(&vin->dvr_dev->itu656in,0,sizeof(struct vin_para));
  592. if(vin->aux_flag){
  593. vin->aux_status = vin->aux_flag;
  594. vin_aux_exit();
  595. }
  596. vin->dvr_dev->itu656in.source = DVR_SOURCE_CAMERA;
  597. vin->vin_status = vin->stream_flag;
  598. //vin->dvr_dev->itu656in.itu601en = 1;
  599. vin->stream_flag = false;
  600. if(!vin->sd_init){
  601. ret = v4l2_subdev_call(vin->current_subdev->sd,core,init,0);
  602. if(ret < 0){
  603. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  604. return ret;
  605. }
  606. vin->sd_init = 1;
  607. }
  608. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  609. if(vin->aux_status){
  610. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_SET_AVIN_MODE,0);
  611. if(ret < 0){
  612. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  613. return ret;
  614. }
  615. }
  616. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_ENTER_CARBACK,0);
  617. if(ret < 0){
  618. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  619. return ret;
  620. }
  621. }
  622. spin_lock(&vin->dvr_dev->spin_lock);
  623. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_ITU601_ENABLE,&vin->dvr_dev->itu656in.itu601en);
  624. if(ret < 0){
  625. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  626. return ret;
  627. }
  628. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_GET_PROGRESSIVE,&vin->dvr_dev->itu656in.progressive);
  629. if(ret < 0){
  630. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  631. return ret;
  632. }
  633. //memcpy(&vin->dvr_dev->itu656in_back, &vin->dvr_dev->itu656in, sizeof(struct vin_para));
  634. vin_reset();
  635. vin_init(vin, &vin->dvr_dev->itu656in);
  636. vin_start(vin->dvr_dev);
  637. vin->dvr_dev->carback_exit_status = 0;
  638. vin->dvr_dev->scale_framebuf_index = 0;
  639. spin_unlock(&vin->dvr_dev->spin_lock);
  640. return 0;
  641. }
  642. EXPORT_SYMBOL(dvr_enter_carback);
  643. int dvr_exit_carback(void)
  644. {
  645. struct ark1668e_vin_device* vin = NULL;
  646. int ret;
  647. vin = g_ark1668e_vin;
  648. if(!vin->aux_status){
  649. vin->dvr_dev->carback_exit_status = 1;
  650. }
  651. if(vin->aux_status){
  652. //The track layer is closed here to solve the abnormal display problem of only one track layer when carback and AVIN switch
  653. ark_disp_set_layer_en(2, 0);
  654. }
  655. vin->stream_flag = vin->vin_status;
  656. ark_disp_set_layer_en(DISPLAY_LAYER, 0);
  657. spin_lock(&vin->dvr_dev->spin_lock);
  658. vin->dvr_dev->vin_mirror_config = MIRROR_NO;
  659. vin->dvr_dev->work_status = 0;
  660. vin->dvr_dev->scale_framebuf_index = 0;
  661. vin->dvr_dev->show_video = 0;
  662. vin->dvr_dev->carback_signal = 0;
  663. vin->dvr_dev->layer_status = 0;
  664. msleep(20);
  665. ark_vin_disable_write(); /*stop write data back*/
  666. ark_vin_disable();
  667. spin_unlock(&vin->dvr_dev->spin_lock);
  668. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  669. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_EXIT_CARBACK,0);
  670. if(ret < 0){
  671. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  672. return ret;
  673. }
  674. if(vin->aux_status){
  675. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_SET_AVIN_MODE,0);
  676. if(ret < 0){
  677. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  678. return ret;
  679. }
  680. }
  681. }
  682. if(vin->aux_status){
  683. vin_aux_config(&vin->dvr_dev->itu656in_back);
  684. vin_aux_start(vin->dvr_dev);
  685. }
  686. return 0;
  687. }
  688. EXPORT_SYMBOL(dvr_exit_carback);
  689. int dvr_set_mirror(int value)
  690. {
  691. g_ark1668e_vin->dvr_dev->vin_mirror_config = value;
  692. return 0;
  693. }
  694. EXPORT_SYMBOL(dvr_set_mirror);
  695. int dvr_get_pragressive(void)
  696. {
  697. int pragressive;
  698. //spin_lock(&g_ark1668e_vin->dvr_dev->spin_lock);
  699. pragressive = !g_ark1668e_vin->dvr_dev->interlace;
  700. //spin_unlock(&g_ark1668e_vin->dvr_dev->spin_lock);
  701. return pragressive;
  702. }
  703. EXPORT_SYMBOL(dvr_get_pragressive);
  704. static void vin_get_signal_work(struct work_struct *work)
  705. {
  706. struct ark1668e_vin_device* vin = NULL;
  707. int signal = 0,ret;
  708. vin = g_ark1668e_vin;
  709. if(!vin->dvr_dev->carback_exit_status){
  710. ret = v4l2_subdev_call(vin->current_subdev->sd,video,g_input_status,&signal);
  711. if(ret < 0)
  712. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  713. if(!signal){
  714. vin->dvr_dev->carback_signal = 1;
  715. }else{
  716. vin->dvr_dev->carback_signal = 0; //no signal
  717. }
  718. if (vin->dvr_dev->show_video && vin->dvr_dev->vin_buffer_status) {
  719. if(vin->dvr_dev->carback_signal)
  720. {
  721. if(vin->dvr_dev->first_show_flag){
  722. if(vin->dvr_dev->signal_flag == 20){
  723. printk(KERN_ALERT "ark_vin_display_int_handler-->show_video\n");
  724. ark_vin_display_init(DISPLAY_LAYER,vin->dvr_dev->screen_width,vin->dvr_dev->screen_height,vin->dvr_dev->screen_xpos,vin->dvr_dev->screen_ypos);
  725. ark_disp_set_layer_en(DISPLAY_LAYER, 1);
  726. vin->dvr_dev->layer_status = 1;
  727. vin->dvr_dev->show_video = 0;
  728. vin->dvr_dev->signal_flag = 0;
  729. vin->dvr_dev->first_show_flag = 0;
  730. }else{
  731. vin->dvr_dev->layer_status = 0;
  732. vin->dvr_dev->signal_flag++;
  733. }
  734. }else{
  735. if(vin->dvr_dev->signal_flag == 10){
  736. printk(KERN_ALERT "ark_vin_display_int_handler-->show_video\n");
  737. ark_vin_display_init(DISPLAY_LAYER,vin->dvr_dev->screen_width,vin->dvr_dev->screen_height,vin->dvr_dev->screen_xpos,vin->dvr_dev->screen_ypos);
  738. ark_disp_set_layer_en(DISPLAY_LAYER, 1);
  739. vin->dvr_dev->layer_status = 1;
  740. vin->dvr_dev->show_video = 0;
  741. vin->dvr_dev->signal_flag = 0;
  742. }else{
  743. vin->dvr_dev->layer_status = 0;
  744. vin->dvr_dev->signal_flag++;
  745. }
  746. }
  747. }
  748. else
  749. {
  750. vin->dvr_dev->layer_status = 0;
  751. printk(" No signal detect.\n");
  752. }
  753. }
  754. }
  755. }
  756. static void vin_get_signal_time(struct timer_list *t)
  757. {
  758. struct ark1668e_vin_device* vin = NULL;
  759. vin = g_ark1668e_vin;
  760. queue_work(vin->dvr_dev->detect_queue, &vin->dvr_dev->detect_work);
  761. mod_timer(&vin->dvr_dev->signal_timer, jiffies + msecs_to_jiffies(30));
  762. }
  763. int dvr_detect_carback_signal(void)
  764. {
  765. struct ark1668e_vin_device* vin = NULL;
  766. vin = g_ark1668e_vin;
  767. return vin->dvr_dev->carback_signal;
  768. }
  769. EXPORT_SYMBOL(dvr_detect_carback_signal);
  770. int dvr_get_layer_status(void)
  771. {
  772. struct ark1668e_vin_device* vin = NULL;
  773. vin = g_ark1668e_vin;
  774. return vin->dvr_dev->layer_status;
  775. }
  776. EXPORT_SYMBOL(dvr_get_layer_status);
  777. void ark_vin_scale_work(struct work_struct *work)
  778. {
  779. struct ark1668e_vin_device* vin = NULL;
  780. int format,oformat,dstaddr;
  781. vin = g_ark1668e_vin;
  782. if (vin->dvr_dev->work_status){
  783. memset(&scale_param,0,sizeof(struct ark_scale_param));
  784. format = ARK_SCALE_FORMAT_Y_UV420;
  785. oformat = ARK_SCALE_OUT_FORMAT_YUYV;
  786. dstaddr = vin->dvr_dev->scalebuf_phyaddr[vin->dvr_dev->scale_framebuf_index];
  787. vin->dvr_dev->scale_framebuf_index = (vin->dvr_dev->scale_framebuf_index + 1) % ITU656_SCALE_FRAME_NUM;
  788. //int readaddr;
  789. //readaddr = ark_vin_get_display_addr();
  790. //if(readaddr == dstaddr){
  791. // ark1668e_lcdc_wait_for_vsync();
  792. //}
  793. scale_param.iyaddr = vin->dvr_dev->scale_in_yphyaddr;
  794. scale_param.iuaddr = vin->dvr_dev->scale_in_yphyaddr + vin->dvr_dev->src_width * vin->dvr_dev->src_height;
  795. scale_param.ivaddr = 0;
  796. scale_param.ix = 0;
  797. scale_param.iy = 0;
  798. scale_param.iwinwidth = vin->dvr_dev->src_width;
  799. scale_param.iwinheight = vin->dvr_dev->src_height;
  800. scale_param.iwidth = vin->dvr_dev->src_width;
  801. scale_param.iheight = vin->dvr_dev->src_height;
  802. scale_param.iformat = format;
  803. scale_param.left_cut = 0;
  804. scale_param.right_cut = 25;
  805. scale_param.up_cut = 0;
  806. scale_param.bottom_cut = 15;
  807. scale_param.owidth = vin->dvr_dev->screen_width;
  808. scale_param.oheight = vin->dvr_dev->screen_height;
  809. scale_param.oyaddr = dstaddr;
  810. scale_param.ouaddr = 0;
  811. scale_param.ovaddr = 0;
  812. scale_param.oformat = oformat;
  813. scale_param.rotate = 0;
  814. ark_scale_start(scale_context,&scale_param);
  815. ark_vin_display_addr(dstaddr);
  816. vin->dvr_dev->vin_buffer_status = 1;
  817. }
  818. }
  819. int ark_vin_display_int_handler(void)
  820. {
  821. struct ark1668e_vin_device* vin = NULL;
  822. unsigned int count = 0;
  823. int i,frame_id;
  824. vin = g_ark1668e_vin;
  825. if(!vin || !vin->dvr_dev || !vin->dvr_dev->work_status)
  826. return -1;
  827. if(!vin->stream_flag){
  828. wait_event_interruptible(vin->dvr_dev->frame_finish_waitq, vin->dvr_dev->frame_finish_count > 0);
  829. if(!vin->dvr_dev->carback_exit_status){
  830. count = min((size_t)1, (size_t)vin->dvr_dev->frame_finish_count);
  831. if(vin->dvr_dev->framebuf_status[vin->dvr_dev->frame_finish[0]] == FRAMEBUF_STATUS_READY)
  832. {
  833. vin->dvr_dev->framebuf_status[vin->dvr_dev->frame_finish[0]] = FRAMEBUF_STATUS_BUSY;
  834. }
  835. else
  836. {
  837. printk(KERN_ALERT "### ark1668e vin read error state:%hhd\n", vin->dvr_dev->framebuf_status[vin->dvr_dev->frame_finish[0]]);
  838. goto exit;
  839. }
  840. for(i=0; i<count; i++)
  841. {
  842. frame_id = vin->dvr_dev->frame_finish[i];
  843. vin->dvr_dev->scale_in_yphyaddr = vin->dvr_dev->framebuf_phyaddr[frame_id];
  844. queue_work(vin->dvr_dev->scale_queue, &vin->dvr_dev->scale_work);
  845. if (vin->dvr_dev->framebuf_status[frame_id] == FRAMEBUF_STATUS_BUSY) {
  846. vin->dvr_dev->framebuf_status[frame_id] = FRAMEBUF_STATUS_FREE;
  847. } else {
  848. printk(KERN_ALERT "ark1668e vin free no-ready buf %d. status:%d\n", i, vin->dvr_dev->framebuf_status[i]);
  849. }
  850. break;
  851. }
  852. exit:
  853. vin->dvr_dev->frame_finish_count -= count;
  854. if (vin->dvr_dev->frame_finish_count > 0) {
  855. int i;
  856. char tmp;
  857. for (i = 0; i < vin->dvr_dev->frame_finish_count; i++) {
  858. tmp = vin->dvr_dev->frame_finish[count + i];
  859. vin->dvr_dev->frame_finish[i] = tmp;
  860. }
  861. }
  862. }
  863. }
  864. return 0;
  865. }
  866. EXPORT_SYMBOL(ark_vin_display_int_handler);
  867. static void vin_push_frame_buffer(struct dvr_dev *dvr_dev, int frame_id)
  868. {
  869. unsigned int val;
  870. //printk("dvr_push_frame_buffer %d.\n", frame_id);
  871. if (frame_id >= 0 && frame_id < dvr_dev->framebuf_num) {
  872. vin_writel(ARK1668E_ITU656_DRAM_DEST1,dvr_dev->framebuf_phyaddr[frame_id]);
  873. val = dvr_dev->framebuf_phyaddr[frame_id] + dvr_dev->src_width*dvr_dev->src_height;
  874. vin_writel(ARK1668E_ITU656_DRAM_DEST1,val);
  875. }
  876. }
  877. static int arkvin_frame_test_and_push(struct dvr_dev *dvr_dev, int frame_id)
  878. {
  879. int i;
  880. int tmp;
  881. tmp = frame_id;
  882. for(i=0; i<dvr_dev->framebuf_num; i++){
  883. tmp ++;
  884. tmp %= 4;
  885. if (dvr_dev->framebuf_status[tmp] == FRAMEBUF_STATUS_FREE){
  886. vin_push_frame_buffer(dvr_dev, tmp);
  887. break;
  888. }
  889. }
  890. if (i == dvr_dev->framebuf_num) {
  891. tmp = frame_id;
  892. for(i=0; i<dvr_dev->framebuf_num; i++){
  893. tmp ++;
  894. tmp %= 4;
  895. if (dvr_dev->framebuf_status[tmp] == FRAMEBUF_STATUS_READY){
  896. dvr_dev->framebuf_status[tmp] = FRAMEBUF_STATUS_FREE;
  897. vin_push_frame_buffer(dvr_dev, tmp);
  898. printk(KERN_ALERT "### reuse ready framebuf:%d.\n", tmp);
  899. break;
  900. }
  901. }
  902. if (i == dvr_dev->framebuf_num) {
  903. printk(KERN_ALERT "### err: no free and ready framebuf, reuse default frame_id:%d framebuf.\n", frame_id);
  904. dvr_dev->framebuf_status[frame_id] = FRAMEBUF_STATUS_FREE;
  905. vin_push_frame_buffer(dvr_dev, frame_id);
  906. }
  907. }
  908. return 0;
  909. }
  910. static irqreturn_t ark_vin_int_handler(int irq, void *dev_id)
  911. {
  912. u32 intr_stat;
  913. struct dvr_dev* dvr_dev = (struct dvr_dev *)dev_id;
  914. struct ark1668e_vin_device* vin = NULL;
  915. struct vb2_buffer *vb = NULL;
  916. int push_frame_state = 0;
  917. static int frame_id = 0;
  918. vin = g_ark1668e_vin;
  919. intr_stat = vin_readl(ARK1668E_ITU656_ISR);
  920. vin_writel(ARK1668E_ITU656_ICR, 0x1fff);
  921. //spin_lock_irqsave(&dvr_dev->spin_lock, flags);
  922. if(intr_stat & (1<<10))
  923. {
  924. printk(KERN_ALERT "pop error.\n");
  925. arkvin_frame_test_and_push(dvr_dev, frame_id);
  926. push_frame_state = 1;
  927. }
  928. if(intr_stat & TOTAL_LINE_CHANGED_INTERRUPT)
  929. {
  930. dvr_dev->show_video = 0;
  931. if(!vin->stream_flag)
  932. ark_vin_display_init(DISPLAY_LAYER,0,0,0,0);
  933. if (dvr_dev->itu656in.tvout)
  934. ark_disp_set_layer_en(TVOUT_LAYER, 0);
  935. ark_vin_disable_write();
  936. if(vin->dvr_dev->chip_info == TYPE_RN6752)
  937. mod_timer(&dvr_dev->timer, jiffies + msecs_to_jiffies(150));
  938. else
  939. mod_timer(&dvr_dev->timer, jiffies + msecs_to_jiffies(50));
  940. }
  941. if (!dvr_dev->work_status) goto end;
  942. //printk(KERN_ALERT "ark_vin_int_handler--intr_stat=0x%0x\n",intr_stat);
  943. if (intr_stat & (FIELD_INTERRUPT | FRAME_INTERRUPT_INTERRUPT)) {
  944. if(vin->stream_flag){
  945. spin_lock(&vin->ark_queue_lock);
  946. if (vin->cur_frm) {
  947. //printk(KERN_DEBUG "v4l2 streaming vb2_buffer_done...\n");
  948. vb = &vin->cur_frm->vb.vb2_buf;
  949. vb->timestamp = ktime_get_ns();
  950. vin->cur_frm->vb.sequence = vin->sequence++;
  951. vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
  952. vin->cur_frm = NULL;
  953. }
  954. if (!list_empty(&vin->ark_queue) && !vin->stop) {
  955. vin->cur_frm = list_first_entry(&vin->ark_queue,
  956. struct vin_buffer, list);
  957. //printk(KERN_DEBUG "INT->get out buf: %p\n",vin->cur_frm->vb.vb2_buf.planes[0].mem_priv);
  958. list_del(&vin->cur_frm->list);
  959. vin_setaddr(vin);
  960. }
  961. if (vin->stop)
  962. complete(&vin->comp);
  963. spin_unlock(&vin->ark_queue_lock);
  964. }
  965. if(!vin->stream_flag){
  966. unsigned int yaddr = vin_readl(ARK1668E_ITU656_DRAM_DEST1);
  967. for (frame_id = 0; frame_id < vin->dvr_dev->framebuf_num; frame_id++) {
  968. if (yaddr == vin->dvr_dev->framebuf_phyaddr[frame_id])
  969. break;
  970. }
  971. if(frame_id >= vin->dvr_dev->framebuf_num){
  972. goto end;
  973. }
  974. if(vin->dvr_dev->framebuf_status[frame_id] != FRAMEBUF_STATUS_FREE) {
  975. //printk(KERN_INFO "### frame_id:%d != free, status:%d, all(%d,%d,%d,%d)\n", frame_id, g_ark1668e_vin->dvr_dev->framebuf_status[frame_id], g_ark1668e_vin->dvr_dev->framebuf_status[0],g_ark1668e_vin->dvr_dev->framebuf_status[1],g_ark1668e_vin->dvr_dev->framebuf_status[2],g_ark1668e_vin->dvr_dev->framebuf_status[3]);
  976. if(!push_frame_state){
  977. arkvin_frame_test_and_push(dvr_dev, frame_id);
  978. goto end;
  979. }
  980. }
  981. if (dvr_dev->discard_frame > 0) {
  982. dvr_dev->discard_frame--;
  983. goto end;
  984. }
  985. vin->dvr_dev->framebuf_status[frame_id] = FRAMEBUF_STATUS_READY;
  986. if(!push_frame_state)
  987. arkvin_frame_test_and_push(dvr_dev, frame_id);
  988. dvr_dev->cur_frame = frame_id;
  989. if (dvr_dev->frame_finish_count >= dvr_dev->framebuf_num)
  990. dvr_dev->frame_finish_count = dvr_dev->framebuf_num - 1;
  991. dvr_dev->frame_finish[dvr_dev->frame_finish_count++] = dvr_dev->cur_frame;
  992. wake_up_interruptible(&dvr_dev->frame_finish_waitq);
  993. }
  994. //spin_unlock_irqrestore(&dvr_dev->spin_lock, flags);
  995. }
  996. end:
  997. return IRQ_HANDLED;
  998. }
  999. static void ark_vin_pad_select(struct dvr_dev *dvr_dev)
  1000. {
  1001. unsigned int val;
  1002. if (dvr_dev->itu601en) {
  1003. //hsync, vsync
  1004. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL04);
  1005. val &= ~(0x3f<<24);
  1006. val |=(1<<24)|(1<<27);
  1007. vin_writel_sys(ARK1668E_SYS_PAD_CTRL04, vin_readl_sys(ARK1668E_SYS_PAD_CTRL04)|val);
  1008. }
  1009. if (dvr_dev->itu_channel== ITU656_CH0) {
  1010. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL02);
  1011. val &= ~(0x7ffffff<<3);
  1012. val |= (0x1<<3)|(0x1<<6)|(0x1<<9)|(0x1<<12)|(0x1<<15)|(0x1<<18)|(0x1<<21)|(0x1<<24)|(0x1<<27); //choose one pad of the channel 0
  1013. vin_writel_sys(ARK1668E_SYS_PAD_CTRL02, val);
  1014. } else if (dvr_dev->itu_channel == ITU656_CH1) {
  1015. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL03);
  1016. val |= 0x01249249; //choose one pad of the channel 1
  1017. vin_writel_sys(ARK1668E_SYS_PAD_CTRL03, val);
  1018. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL0F);
  1019. val |= (1<<24)|(1<<26);
  1020. vin_writel_sys(ARK1668E_SYS_PAD_CTRL0F, val);
  1021. } else if(dvr_dev->itu_channel == ITU656_CH2){
  1022. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL03);
  1023. val |= 0x08000000; //choose one pad of the channel 2
  1024. vin_writel_sys(ARK1668E_SYS_PAD_CTRL03, val);
  1025. val = vin_readl_sys(ARK1668E_SYS_PAD_CTRL04);
  1026. val |= 0x249249;
  1027. vin_writel_sys(ARK1668E_SYS_PAD_CTRL04, val);
  1028. }
  1029. }
  1030. static void ark_vin_reg_init(struct dvr_dev *dvr_dev)
  1031. {
  1032. unsigned int val;
  1033. val = vin_readl(ARK1668E_ITU656_MODULE_EN);
  1034. val |= (1 << 2);
  1035. vin_writel(ARK1668E_ITU656_MODULE_EN, val);
  1036. if (dvr_dev->itu601en) {
  1037. vin_writel(ARK1668E_ITU656_MODULE_EN, vin_readl(ARK1668E_ITU656_MODULE_EN) | 1);
  1038. val = vin_readl(ARK1668E_ITU656_INPUT_SEL);
  1039. val = 0;
  1040. vin_writel(ARK1668E_ITU656_INPUT_SEL, val);
  1041. //polarity
  1042. //val = (1 << 13) | (1 << 12);
  1043. //vin_writel(ARK1668E_ITU656_SEP_MODE_SEL, val);
  1044. }else{
  1045. val = vin_readl(ARK1668E_ITU656_INPUT_SEL);
  1046. val = 0x00000001;
  1047. vin_writel(ARK1668E_ITU656_INPUT_SEL, val);
  1048. }
  1049. val = vin_readl(ARK1668E_ITU656_IMR);
  1050. val = 0;
  1051. vin_writel(ARK1668E_ITU656_IMR, val);
  1052. val = vin_readl(ARK1668E_ITU656_YUV_TYPESEL);
  1053. val = 0;
  1054. vin_writel(ARK1668E_ITU656_YUV_TYPESEL, val);
  1055. val = vin_readl(ARK1668E_ITU656_SEP_MODE_SEL);
  1056. val |= 1<<3;
  1057. vin_writel(ARK1668E_ITU656_SEP_MODE_SEL, val);
  1058. val = vin_readl(ARK1668E_ITU656_ENABLE_REG);
  1059. if(g_ark1668e_vin->dvr_dev->chip_info == TYPE_ARK7116H)
  1060. val = 0x0000000a;//0x0000600a;
  1061. else
  1062. val = 0x0000200a;//0x0000600a;
  1063. vin_writel(ARK1668E_ITU656_ENABLE_REG, val);
  1064. val = vin_readl(ARK1668E_ITU656_MIRR_SET);
  1065. val = g_ark1668e_vin->dvr_dev->vin_mirror_config;
  1066. vin_writel(ARK1668E_ITU656_MIRR_SET, val);
  1067. val = vin_readl(ARK1668E_ITU656_OUTPUT_TYPE);
  1068. val = 0;
  1069. vin_writel(ARK1668E_ITU656_OUTPUT_TYPE, val);
  1070. /********************************************************/
  1071. #if 0
  1072. val = 0x4c01;
  1073. vin_writel(ARK1668E_ITU656_YUV_TYPESEL11, val);
  1074. val = vin_readl(ARK1668E_ITU656_MODULE_EN);
  1075. val |= 1;
  1076. vin_writel(ARK1668E_ITU656_MODULE_EN, val);
  1077. #endif
  1078. /********************************************************/
  1079. val = vin_readl(ARK1668E_ITU656_IMR);
  1080. val |= (FIFO_POP_ERROR) | (TOTAL_LINE_CHANGED_INTERRUPT) | (ACTIVE_LINE_CHANGED_INTERRUPT) | (1<<3) | (1<<0);
  1081. vin_writel(ARK1668E_ITU656_IMR, val);
  1082. }
  1083. static void ark_vin_enable(struct dvr_dev *dvr_dev)
  1084. {
  1085. vin_writel(ARK1668E_ITU656_ENABLE_REG, vin_readl(ARK1668E_ITU656_ENABLE_REG)| (1 << 0));
  1086. }
  1087. static void deinterlace_reset(void)
  1088. {
  1089. }
  1090. static void deinterlace_init(void)
  1091. {
  1092. deinterlace_reset();
  1093. }
  1094. static void dither_timeout_timer(struct timer_list *t)
  1095. {
  1096. struct dvr_dev *dvr_dev = from_timer(dvr_dev, t, timer);
  1097. struct ark1668e_vin_device* vin = NULL;
  1098. int line,pixel,activeLine, activePix,i;
  1099. vin = g_ark1668e_vin;
  1100. //spin_lock_irqsave(&dvr_dev->spin_lock, flags);
  1101. if (!dvr_dev->work_status) {
  1102. //spin_unlock_irqrestore(&dvr_dev->spin_lock, flags);
  1103. return;
  1104. }
  1105. line = vin_readl(ARK1668E_ITU656_LINE_NUM_PER_FIELD) & 0x7FF;
  1106. if (dvr_dev->itu601en)
  1107. pixel = vin_readl(ARK1668E_ITU656_PIX_NUM_PER_LINE) & 0xFFF;
  1108. else
  1109. pixel = (vin_readl(ARK1668E_ITU656_PIX_NUM_PER_LINE) & 0xFFE) >> 1;
  1110. printk(KERN_ALERT "[ITU] line = %d, pixel=%d\r\n", line, pixel);
  1111. dvr_dev->src_width = activePix = pixel;
  1112. dvr_dev->src_height = activeLine = line;
  1113. if (dvr_dev->interlace) {
  1114. if (line >= 230 && line <= 250)
  1115. dvr_dev->system = NTSC;
  1116. else if (line >= 278 && line < 298)
  1117. dvr_dev->system = PAL;
  1118. else
  1119. dvr_dev->system = NTSC;
  1120. if(dvr_dev->system == NTSC)
  1121. {
  1122. activeLine = 240;
  1123. activePix = 720;
  1124. }
  1125. else
  1126. {
  1127. activeLine = 288;
  1128. activePix = 720;
  1129. }
  1130. }
  1131. vin_writel(ARK1668E_ITU656_OUTLINE_NUM_PER_FIELD, activeLine);
  1132. vin_writel(ARK1668E_ITU656_TOTAL_PIX_OUT, activeLine*activePix);
  1133. vin_writel(ARK1668E_ITU656_TOTAL_PIX, activeLine*activePix);
  1134. vin_writel(ARK1668E_ITU656_SIZE, activePix<<16);
  1135. dvr_dev->src_width = activePix;
  1136. dvr_dev->src_height = activeLine;
  1137. dvr_dev->discard_frame = START_DISCARD_FRAME;
  1138. dvr_dev->cur_frame = 0;
  1139. dvr_dev->show_video = 1;
  1140. for (i = 0; i < vin->dvr_dev->framebuf_num; i++){
  1141. vin_push_frame_buffer(dvr_dev,i);
  1142. vin->dvr_dev->framebuf_status[i] = FRAMEBUF_STATUS_FREE;
  1143. }
  1144. ark_vin_enable_write();
  1145. //spin_unlock_irqrestore(&dvr_dev->spin_lock, flags);
  1146. }
  1147. static int vin_start(struct dvr_dev *dvr_dev)
  1148. {
  1149. struct ark1668e_vin_device* vin = NULL;
  1150. int ret = 0;
  1151. vin = g_ark1668e_vin;
  1152. if(!dvr_dev->work_status){
  1153. dvr_dev->work_status = 1;
  1154. dvr_dev->discard_frame = START_DISCARD_FRAME;
  1155. dvr_dev->cur_frame = 0;
  1156. dvr_dev->vin_buffer_status = 0;
  1157. deinterlace_init();
  1158. ret = v4l2_subdev_call(vin->current_subdev->sd,video,s_routing,dvr_dev->channel,0,0);
  1159. if(ret < 0){
  1160. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1161. return ret;
  1162. }
  1163. ark_vin_pad_select(dvr_dev);
  1164. ark_vin_reg_init(dvr_dev);
  1165. ark_vin_enable(dvr_dev);
  1166. }
  1167. return ret;
  1168. }
  1169. static int vin_exit(void)
  1170. {
  1171. struct ark1668e_vin_device* vin = NULL;
  1172. int ret;
  1173. vin = g_ark1668e_vin;
  1174. vin->dvr_dev->carback_exit_status = 1;
  1175. vin->stream_flag = vin->vin_status;
  1176. ark_disp_set_layer_en(DISPLAY_LAYER, 0);
  1177. spin_lock(&vin->dvr_dev->spin_lock);
  1178. vin->dvr_dev->vin_mirror_config = MIRROR_NO;
  1179. vin->dvr_dev->work_status = 0;
  1180. vin->dvr_dev->scale_framebuf_index = 0;
  1181. vin->dvr_dev->show_video = 0;
  1182. vin->dvr_dev->carback_signal = 0;
  1183. vin->dvr_dev->layer_status = 0;
  1184. msleep(20);
  1185. ark_vin_disable_write(); /*stop write data back*/
  1186. ark_vin_disable();
  1187. spin_unlock(&vin->dvr_dev->spin_lock);
  1188. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  1189. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_EXIT_CARBACK,0);
  1190. if(ret < 0){
  1191. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1192. return ret;
  1193. }
  1194. }
  1195. return 0;
  1196. }
  1197. static void vin_init(struct ark1668e_vin_device *vin, struct vin_para *para)
  1198. {
  1199. struct dvr_dev* dvr_dev = vin->dvr_dev;
  1200. memcpy(&dvr_dev->itu656in, para, sizeof(struct vin_para));
  1201. dvr_dev->interlace = !dvr_dev->itu656in.progressive;
  1202. dvr_dev->itu601en = dvr_dev->itu656in.itu601en;
  1203. switch (para->source) {
  1204. case DVR_SOURCE_DVD:
  1205. dvr_dev->channel = ARK7116_AV2;
  1206. break;
  1207. case DVR_SOURCE_AUX:
  1208. dvr_dev->channel = ARK7116_AV1;
  1209. break;
  1210. case DVR_SOURCE_CAMERA:
  1211. default:
  1212. dvr_dev->channel = ARK7116_AV0;
  1213. break;
  1214. }
  1215. }
  1216. static int vin_aux_start(struct dvr_dev *dvr_dev)
  1217. {
  1218. struct ark1668e_vin_device* vin = NULL;
  1219. int ret = 0;
  1220. vin = g_ark1668e_vin;
  1221. if(!dvr_dev->work_status){
  1222. dvr_dev->work_status = 1;
  1223. dvr_dev->discard_frame = START_DISCARD_FRAME;
  1224. dvr_dev->cur_frame = 0;
  1225. dvr_dev->vin_buffer_status = 0;
  1226. ret = v4l2_subdev_call(vin->current_subdev->sd,video,s_routing,vin->app_channel_set,0,0);
  1227. if(ret < 0){
  1228. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1229. return ret;
  1230. }
  1231. deinterlace_init();
  1232. ark_vin_pad_select(dvr_dev);
  1233. ark_vin_reg_init(dvr_dev);
  1234. ark_vin_enable(dvr_dev);
  1235. }
  1236. return ret;
  1237. }
  1238. static void vin_aux_exit(void)
  1239. {
  1240. struct ark1668e_vin_device* vin = NULL;
  1241. int ret;
  1242. vin = g_ark1668e_vin;
  1243. spin_lock(&vin->dvr_dev->spin_lock);
  1244. vin->dvr_dev->carback_exit_status = 1;
  1245. vin->stream_flag = vin->vin_status;
  1246. vin->dvr_dev->show_video = 0;
  1247. vin->dvr_dev->carback_signal = 0;
  1248. vin->dvr_dev->work_status = 0;
  1249. vin->dvr_dev->layer_status = 0;
  1250. ark_disp_set_layer_en(DISPLAY_LAYER, 0);
  1251. vin->dvr_dev->scale_framebuf_index = 0;
  1252. spin_unlock(&vin->dvr_dev->spin_lock);
  1253. msleep(20);
  1254. ark_vin_disable_write(); /*stop write data back*/
  1255. ark_vin_disable();
  1256. if(vin->dvr_dev->chip_info == TYPE_RN6752){
  1257. ret = v4l2_subdev_call(vin->current_subdev->sd,core,ioctl,VIDIOC_EXIT_CARBACK,0);
  1258. if(ret < 0)
  1259. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1260. }
  1261. }
  1262. static irqreturn_t ark_deinterlace_int_handler(int irq, void *dev_id)
  1263. {
  1264. return IRQ_HANDLED;
  1265. }
  1266. static int vin_async_bound(struct v4l2_async_notifier *notifier,
  1267. struct v4l2_subdev *subdev,
  1268. struct v4l2_async_subdev *asd)
  1269. {
  1270. struct vin_subdev_entity *subdev_entity = NULL;
  1271. struct ark1668e_vin_device *ark_vin = NULL;
  1272. subdev_entity = container_of(notifier, struct vin_subdev_entity, notifier);
  1273. ark_vin = container_of(notifier->v4l2_dev,struct ark1668e_vin_device, v4l2_dev);
  1274. if (video_is_registered(&ark_vin->video_dev)) {
  1275. v4l2_err(&ark_vin->v4l2_dev, "only supports one sub-device.\n");
  1276. return -EBUSY;
  1277. }
  1278. subdev_entity->sd = subdev;
  1279. return 0;
  1280. }
  1281. static void vin_async_unbind(struct v4l2_async_notifier *notifier,
  1282. struct v4l2_subdev *subdev,
  1283. struct v4l2_async_subdev *asd)
  1284. {
  1285. struct ark1668e_vin_device *ark_vin = NULL;
  1286. ark_vin = container_of(notifier->v4l2_dev,struct ark1668e_vin_device, v4l2_dev);
  1287. cancel_work_sync(&ark_vin->awb_work);
  1288. video_unregister_device(&ark_vin->video_dev);
  1289. }
  1290. static int vin_set_default_fmt(struct ark1668e_vin_device *vin)
  1291. {
  1292. struct v4l2_format f = {
  1293. .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
  1294. .fmt.pix = {
  1295. .width = DISPLAY_WIDTH,
  1296. .height = DISPLAY_HEIGHT,
  1297. .field = V4L2_FIELD_ANY,
  1298. .pixelformat = V4L2_PIX_FMT_YUYV,
  1299. },
  1300. };
  1301. vin->fmt = f;
  1302. return 0;
  1303. }
  1304. static int vin_async_complete(struct v4l2_async_notifier *notifier)
  1305. {
  1306. int ret,support_max_resolution,chipinfo;
  1307. struct i2c_client *sd_client = NULL;
  1308. struct ark1668e_vin_device *ark_vin = container_of(notifier->v4l2_dev,struct ark1668e_vin_device, v4l2_dev);
  1309. ark_vin->current_subdev = container_of(notifier,struct vin_subdev_entity, notifier);
  1310. sd_client = v4l2_get_subdevdata(ark_vin->current_subdev->sd);
  1311. if(!sd_client){
  1312. printk(KERN_ALERT "get subdev data error .\n");
  1313. return -EINVAL;
  1314. }
  1315. printk("subdev addr is %p, name is %s.\n",ark_vin->current_subdev->sd,sd_client->name);
  1316. /* Register subdev device node */
  1317. ret = v4l2_device_register_subdev_nodes(&ark_vin->v4l2_dev);
  1318. if (ret < 0) {
  1319. printk(KERN_ALERT "v4l2_device_register_subdev_nodes error\n");
  1320. return ret;
  1321. }
  1322. ret = v4l2_subdev_call(ark_vin->current_subdev->sd,core,ioctl,VIDIOC_GET_CHIPINFO,&chipinfo);
  1323. if(ret < 0){
  1324. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1325. return ret;
  1326. }
  1327. if(chipinfo == TYPE_RN6752){
  1328. printk(KERN_ALERT "decoder chip is rn6752\n");
  1329. ark_vin->dvr_dev->chip_info = TYPE_RN6752;
  1330. ark_vin->dvr_dev->framebuf_num = 8;
  1331. ret = v4l2_subdev_call(ark_vin->current_subdev->sd,core,ioctl,VIDIOC_ENABLE_TIME,0);
  1332. if(ret < 0){
  1333. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1334. return ret;
  1335. }
  1336. }else if(chipinfo == TYPE_ARK7116){
  1337. printk(KERN_ALERT "decoder chip is ark7116\n");
  1338. ark_vin->dvr_dev->chip_info = TYPE_ARK7116;
  1339. }else if(chipinfo == TYPE_ARK7116H){
  1340. printk(KERN_ALERT "decoder chip is ark7116h\n");
  1341. ark_vin->dvr_dev->chip_info = TYPE_ARK7116H;
  1342. }else if(chipinfo == TYPE_PR2000){
  1343. printk(KERN_ALERT "decoder chip is pr2000\n");
  1344. ark_vin->dvr_dev->chip_info = TYPE_PR2000;
  1345. }else{
  1346. printk(KERN_ALERT "no find decoder chip info\n");
  1347. }
  1348. ret = v4l2_subdev_call(ark_vin->current_subdev->sd,core,ioctl,VIDIOC_GET_RESOLUTION,&support_max_resolution);
  1349. if(ret < 0){
  1350. printk(KERN_ALERT "%s %d: v4l2_subdev_call error \n",__FUNCTION__, __LINE__);
  1351. return ret;
  1352. }
  1353. if(support_max_resolution == TYPE_1080P){
  1354. if(ark_vin->dvr_dev->chip_info == TYPE_RN6752)
  1355. ark_vin->dvr_dev->buffer_size = ITU656_PROGRESSIVE_FRAME_SIZE_1080P*ark_vin->dvr_dev->framebuf_num;
  1356. else
  1357. ark_vin->dvr_dev->buffer_size = ITU656_PROGRESSIVE_FRAME_SIZE_1080P*ITU656_FRAME_NUM;
  1358. }
  1359. else if(support_max_resolution == TYPE_720P){
  1360. if(ark_vin->dvr_dev->chip_info == TYPE_RN6752)
  1361. ark_vin->dvr_dev->buffer_size = ITU656_PROGRESSIVE_FRAME_SIZE*ark_vin->dvr_dev->framebuf_num;
  1362. else
  1363. ark_vin->dvr_dev->buffer_size = ITU656_PROGRESSIVE_FRAME_SIZE*ITU656_FRAME_NUM;
  1364. }
  1365. else{
  1366. if(ark_vin->dvr_dev->chip_info == TYPE_RN6752)
  1367. ark_vin->dvr_dev->buffer_size = ITU656_FRAME_SIZE*ark_vin->dvr_dev->framebuf_num;
  1368. else
  1369. ark_vin->dvr_dev->buffer_size = ITU656_FRAME_SIZE*ITU656_FRAME_NUM;
  1370. }
  1371. ark_vin->dvr_dev->scale_buffer_size = ark_vin->dvr_dev->scale_alloc_width*ark_vin->dvr_dev->scale_alloc_height*2*ark_vin->dvr_dev->scale_framebuf_num;
  1372. vin_alloc_buf(support_max_resolution);
  1373. mutex_init(&ark_vin->lock);
  1374. init_completion(&ark_vin->comp);
  1375. /* Initialize videobuf2 queue */
  1376. ark_vin->vb2_vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1377. ark_vin->vb2_vidq.io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ;
  1378. ark_vin->vb2_vidq.drv_priv = ark_vin;
  1379. ark_vin->vb2_vidq.buf_struct_size = sizeof(struct vin_buffer);
  1380. ark_vin->vb2_vidq.ops = &vin_vb2_ops;
  1381. ark_vin->vb2_vidq.mem_ops = &vb2_dma_contig_memops;
  1382. ark_vin->vb2_vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
  1383. ark_vin->vb2_vidq.lock = &ark_vin->lock;
  1384. ark_vin->vb2_vidq.min_buffers_needed = 1;
  1385. ark_vin->vb2_vidq.dev = ark_vin->dev;
  1386. ret = vb2_queue_init(&ark_vin->vb2_vidq);
  1387. if (ret < 0) {
  1388. v4l2_err(&ark_vin->v4l2_dev,
  1389. "vb2_queue_init() failed: %d\n", ret);
  1390. return ret;
  1391. }
  1392. /* Init video dma queues */
  1393. INIT_LIST_HEAD(&ark_vin->ark_queue);
  1394. spin_lock_init(&ark_vin->ark_queue_lock);
  1395. ret = vin_set_default_fmt(ark_vin);
  1396. if (ret) {
  1397. v4l2_err(&ark_vin->v4l2_dev, "Could not set default format\n");
  1398. return ret;
  1399. }
  1400. /* Register video device */
  1401. strlcpy(ark_vin->video_dev.name, ARK_VIN_NAME, sizeof(ark_vin->video_dev.name));
  1402. ark_vin->video_dev.release = video_device_release_empty;
  1403. ark_vin->video_dev.fops = &vin_fops;
  1404. ark_vin->video_dev.ioctl_ops = &vin_ioctl_ops;
  1405. ark_vin->video_dev.v4l2_dev = &ark_vin->v4l2_dev;
  1406. ark_vin->video_dev.vfl_dir = VFL_DIR_RX;
  1407. ark_vin->video_dev.queue = &ark_vin->vb2_vidq;
  1408. ark_vin->video_dev.lock = &ark_vin->lock;
  1409. ark_vin->video_dev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE;
  1410. video_set_drvdata(&ark_vin->video_dev, ark_vin);
  1411. ret = video_register_device(&ark_vin->video_dev, VFL_TYPE_GRABBER, -1);
  1412. if (ret < 0) {
  1413. v4l2_err(&ark_vin->v4l2_dev,
  1414. "video_register_device failed: %d\n", ret);
  1415. return ret;
  1416. }
  1417. return 0;
  1418. }
  1419. static const struct v4l2_async_notifier_operations vin_graph_notify_ops = {
  1420. .bound = vin_async_bound,
  1421. .unbind = vin_async_unbind,
  1422. .complete = vin_async_complete,
  1423. };
  1424. static int vin_driver_init(struct device *dev)
  1425. {
  1426. int value;
  1427. struct ark1668e_vin_device* vin = NULL;
  1428. vin = g_ark1668e_vin;
  1429. vin->dvr_dev = devm_kzalloc(dev, sizeof(struct dvr_dev), GFP_KERNEL);
  1430. if (vin->dvr_dev == NULL) {
  1431. dev_err(dev, "%s %d: failed to allocate memory\n",
  1432. __FUNCTION__, __LINE__);
  1433. return -ENOMEM;
  1434. }
  1435. vin->dvr_dev->work_status = 0;
  1436. vin->dvr_dev->layer_status = 0;
  1437. vin->dvr_dev->signal_flag = 0;
  1438. vin->dvr_dev->first_show_flag = 1;
  1439. vin->dvr_dev->system = NTSC;
  1440. vin->dvr_dev->cur_buffer = 0;
  1441. vin->dvr_dev->carback_signal = 0;
  1442. vin->dvr_dev->frame_finish_count = 0;
  1443. vin->dvr_dev->scale_framebuf_index = 0;
  1444. vin->dvr_dev->vin_buffer_status = 0;
  1445. vin->dvr_dev->vin_mirror_config = MIRROR_NO;
  1446. vin->dvr_dev->framebuf_num = ITU656_FRAME_NUM;
  1447. vin->dvr_dev->scale_framebuf_num = ITU656_SCALE_FRAME_NUM;
  1448. vin->dvr_dev->carback_exit_status = 1;
  1449. vin->aux_flag = 0;
  1450. vin->aux_status = 0;
  1451. vin->stream_flag = false;
  1452. vin->sd_init = 0;
  1453. if(!of_property_read_u32(dev->of_node, "width", &value)) {
  1454. if(value > 0){
  1455. of_property_read_u32(dev->of_node, "x_pos", &value);
  1456. vin->dvr_dev->screen_xpos = value;
  1457. of_property_read_u32(dev->of_node, "y_pos", &value);
  1458. vin->dvr_dev->screen_ypos = value;
  1459. of_property_read_u32(dev->of_node, "width", &value);
  1460. vin->dvr_dev->screen_width = value;
  1461. of_property_read_u32(dev->of_node, "height", &value);
  1462. vin->dvr_dev->screen_height = value;
  1463. printk("++++++ x_pos = %d,y_pos = %d,width = %d,height = %d",vin->dvr_dev->screen_xpos,vin->dvr_dev->screen_ypos,vin->dvr_dev->screen_width,vin->dvr_dev->screen_height);
  1464. }
  1465. }else{
  1466. vin->dvr_dev->screen_xpos = 0;
  1467. vin->dvr_dev->screen_ypos = 0;
  1468. ark_vin_get_screen_info(&vin->dvr_dev->screen_width,&vin->dvr_dev->screen_height);
  1469. }
  1470. vin->dvr_dev->scale_alloc_width = vin->dvr_dev->screen_width;
  1471. vin->dvr_dev->scale_alloc_height = vin->dvr_dev->screen_height;
  1472. init_waitqueue_head(&vin->dvr_dev->frame_finish_waitq);
  1473. spin_lock_init(&vin->dvr_dev->spin_lock);
  1474. return 0;
  1475. }
  1476. static int vin_parse_dt(struct device *dev, struct ark1668e_vin_device *ark_vin)
  1477. {
  1478. struct device_node *np = dev->of_node;
  1479. struct device_node *epn = NULL, *rem;
  1480. struct v4l2_fwnode_endpoint v4l2_epn;
  1481. struct vin_subdev_entity *subdev_entity;
  1482. unsigned int flags;
  1483. int ret;
  1484. INIT_LIST_HEAD(&ark_vin->subdev_entities);
  1485. while (1) {
  1486. epn = of_graph_get_next_endpoint(np, epn);
  1487. if (!epn)
  1488. return 0;
  1489. rem = of_graph_get_remote_port_parent(epn);
  1490. if (!rem) {
  1491. dev_notice(dev, "Remote device at %pOF not found\n",
  1492. epn);
  1493. continue;
  1494. }
  1495. ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(epn),
  1496. &v4l2_epn);
  1497. if (ret) {
  1498. of_node_put(rem);
  1499. ret = -EINVAL;
  1500. dev_err(dev, "Could not parse the endpoint\n");
  1501. break;
  1502. }
  1503. subdev_entity = devm_kzalloc(dev,
  1504. sizeof(*subdev_entity), GFP_KERNEL);
  1505. if (!subdev_entity) {
  1506. of_node_put(rem);
  1507. ret = -ENOMEM;
  1508. break;
  1509. }
  1510. subdev_entity->asd = devm_kzalloc(dev,
  1511. sizeof(*subdev_entity->asd), GFP_KERNEL);
  1512. if (!subdev_entity->asd) {
  1513. of_node_put(rem);
  1514. ret = -ENOMEM;
  1515. break;
  1516. }
  1517. flags = v4l2_epn.bus.parallel.flags;
  1518. subdev_entity->asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
  1519. subdev_entity->asd->match.fwnode = of_fwnode_handle(rem);
  1520. /* Adds an instance to the linked list*/
  1521. list_add_tail(&subdev_entity->list, &ark_vin->subdev_entities);
  1522. }
  1523. of_node_put(epn);
  1524. return ret;
  1525. }
  1526. static void vin_subdev_cleanup(struct ark1668e_vin_device *vin)
  1527. {
  1528. struct vin_subdev_entity *subdev_entity;
  1529. list_for_each_entry(subdev_entity, &vin->subdev_entities, list)
  1530. v4l2_async_notifier_unregister(&subdev_entity->notifier);
  1531. INIT_LIST_HEAD(&vin->subdev_entities);
  1532. }
  1533. static int ark1668e_vin_probe(struct platform_device *pdev)
  1534. {
  1535. struct device *dev = &pdev->dev;
  1536. struct vin_subdev_entity *subdev_entity;
  1537. struct ark1668e_vin_device* ark_vin;
  1538. struct resource *res;
  1539. void __iomem *regs;
  1540. int ret,value;
  1541. ark_vin = devm_kzalloc(dev, sizeof(*ark_vin), GFP_KERNEL);
  1542. if (!ark_vin)
  1543. return -ENOMEM;
  1544. g_ark1668e_vin = ark_vin;
  1545. platform_set_drvdata(pdev, ark_vin);
  1546. ark_vin->dev = dev;
  1547. ret = v4l2_device_register(dev,&ark_vin->v4l2_dev);
  1548. if (ret) {
  1549. printk(KERN_ALERT "unable to register v4l2 device.\n");
  1550. }
  1551. ret = vin_parse_dt(dev, ark_vin);
  1552. if (ret)
  1553. printk(KERN_ALERT "fail to parse device tree\n");
  1554. vin_driver_init(dev);
  1555. if (list_empty(&ark_vin->subdev_entities)) {
  1556. printk(KERN_ALERT "no subdev found \n");
  1557. ret = -ENODEV;
  1558. }
  1559. /*find and prepare the async subdev notifier and register it */
  1560. list_for_each_entry(subdev_entity, &ark_vin->subdev_entities, list) {
  1561. subdev_entity->notifier.subdevs = &subdev_entity->asd;
  1562. subdev_entity->notifier.num_subdevs = 1;
  1563. subdev_entity->notifier.ops = &vin_graph_notify_ops;
  1564. ret = v4l2_async_notifier_register(&ark_vin->v4l2_dev,
  1565. &subdev_entity->notifier);
  1566. if (ret) {
  1567. printk(KERN_ALERT "fail to register async notifier\n");
  1568. }
  1569. if (video_is_registered(&ark_vin->video_dev))
  1570. break;
  1571. }
  1572. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1573. if (IS_ERR(res)) {
  1574. ret = PTR_ERR(res);
  1575. }
  1576. regs = devm_ioremap_resource(&pdev->dev, res);
  1577. if (IS_ERR(regs)) {
  1578. ret = PTR_ERR(regs);
  1579. }
  1580. ark_vin->dvr_dev->context.itu656_base = regs;
  1581. res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
  1582. if (IS_ERR(res)) {
  1583. ret = PTR_ERR(res);
  1584. }
  1585. regs = ioremap(res->start, resource_size(res)); /* baseaddr conflict */
  1586. if (IS_ERR(regs)) {
  1587. ret = PTR_ERR(regs);
  1588. }
  1589. ark_vin->dvr_dev->context.sys_base = regs;
  1590. res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
  1591. if (IS_ERR(res)) {
  1592. ret = PTR_ERR(res);
  1593. }
  1594. regs = ioremap(res->start, resource_size(res)); /* baseaddr conflict */
  1595. if (IS_ERR(regs)) {
  1596. ret = PTR_ERR(regs);
  1597. }
  1598. ark_vin->dvr_dev->context.deinterlace_base = regs;
  1599. res = platform_get_resource(pdev, IORESOURCE_MEM, 3);
  1600. if (IS_ERR(res)) {
  1601. ret = PTR_ERR(res);
  1602. }
  1603. regs = ioremap(res->start, resource_size(res)); /* baseaddr conflict */
  1604. if (IS_ERR(regs)) {
  1605. ret = PTR_ERR(regs);
  1606. }
  1607. ark_vin->dvr_dev->context.lcd_base = regs;
  1608. ark_vin->dvr_dev->context.itu656_irq = platform_get_irq(pdev, 0);
  1609. if (ark_vin->dvr_dev->context.itu656_irq < 0) {
  1610. dev_err(&pdev->dev, "%s %d: can't get itu656_irq resource.\n", __FUNCTION__, __LINE__);
  1611. }
  1612. ret = devm_request_irq(
  1613. &pdev->dev,
  1614. ark_vin->dvr_dev->context.itu656_irq,
  1615. ark_vin_int_handler,
  1616. IRQF_SHARED,
  1617. "ark1668e_vin",
  1618. ark_vin->dvr_dev
  1619. );
  1620. if(ret){
  1621. dev_err(&pdev->dev, "%s %d: can't get assigned vin %d, error %d\n",
  1622. __FUNCTION__, __LINE__, ark_vin->dvr_dev->context.itu656_irq, ret);
  1623. }
  1624. ark_vin->dvr_dev->context.deinterlace_irq = platform_get_irq(pdev, 1);
  1625. if (ark_vin->dvr_dev->context.deinterlace_irq < 0) {
  1626. dev_err(&pdev->dev, "%s %d: can't get deinterlace_irq resource.\n", __FUNCTION__, __LINE__);
  1627. }
  1628. ret = devm_request_irq(
  1629. &pdev->dev,
  1630. ark_vin->dvr_dev->context.deinterlace_irq,
  1631. ark_deinterlace_int_handler,
  1632. IRQF_SHARED,
  1633. "vin_deinterlace",
  1634. ark_vin->dvr_dev
  1635. );
  1636. if(ret){
  1637. dev_err(&pdev->dev, "%s %d: can't get assigned deinterlace_irq %d, error %d\n",
  1638. __FUNCTION__, __LINE__, ark_vin->dvr_dev->context.deinterlace_irq, ret);
  1639. }
  1640. timer_setup(&ark_vin->dvr_dev->timer, dither_timeout_timer, 0);
  1641. timer_setup(&ark_vin->dvr_dev->signal_timer, vin_get_signal_time, 0);
  1642. ark_vin->dvr_dev->detect_queue = create_singlethread_workqueue("detect_queue");
  1643. if(!ark_vin->dvr_dev->detect_queue) {
  1644. printk(KERN_ERR "%s %d: , create_singlethread_workqueue fail.\n",__FUNCTION__, __LINE__);
  1645. return -1;
  1646. }
  1647. INIT_WORK(&ark_vin->dvr_dev->detect_work, vin_get_signal_work);
  1648. mod_timer(&ark_vin->dvr_dev->signal_timer, jiffies + msecs_to_jiffies(10));
  1649. ark_vin->dvr_dev->scale_queue = create_singlethread_workqueue("scale_queue");
  1650. if(!ark_vin->dvr_dev->scale_queue) {
  1651. printk(KERN_ERR "%s %d: , create_singlethread_workqueue fail.\n",__FUNCTION__, __LINE__);
  1652. return -1;
  1653. }
  1654. INIT_WORK(&ark_vin->dvr_dev->scale_work, ark_vin_scale_work);
  1655. ark_vin->dvr_dev->itu_channel = ITU656_CH1;
  1656. if(!of_property_read_u32(pdev->dev.of_node, "channel", &value)) {
  1657. if(value >= ITU656_CH0 && value <= ITU656_CH2)
  1658. ark_vin->dvr_dev->itu_channel = value;
  1659. }
  1660. return 0;
  1661. }
  1662. static int ark1668e_vin_remove(struct platform_device *pdev)
  1663. {
  1664. struct ark1668e_vin_device *vin = platform_get_drvdata(pdev);
  1665. struct dvr_dev *dvr_dev = vin->dvr_dev;
  1666. #if 0
  1667. free_pages((unsigned long)dvr_dev->buffer_virtaddr, get_order(dvr_dev->buffer_size));
  1668. free_pages((unsigned long)dvr_dev->scale_out_yaddr, get_order(dvr_dev->scale_alloc_width*dvr_dev->scale_alloc_height*2));
  1669. #else
  1670. if(vin->dvr_dev->buffer_virtaddr)
  1671. dma_free_wc(vin->dev, vin->dvr_dev->buffer_size, vin->dvr_dev->buffer_virtaddr,vin->dvr_dev->buffer_phyaddr);
  1672. if(vin->dvr_dev->scale_out_yaddr)
  1673. dma_free_wc(vin->dev, vin->dvr_dev->scale_buffer_size,vin->dvr_dev->scale_out_yaddr,vin->dvr_dev->scale_out_yphyaddr);
  1674. #endif
  1675. iounmap(dvr_dev->context.lcd_base);
  1676. iounmap(dvr_dev->context.deinterlace_base);
  1677. iounmap(dvr_dev->context.sys_base);
  1678. del_timer(&vin->dvr_dev->timer);
  1679. del_timer(&vin->dvr_dev->signal_timer);
  1680. unregister_chrdev_region(MKDEV(dvr_dev->dev_major, dvr_dev->dev_minor), 1);
  1681. g_ark1668e_vin = NULL;
  1682. vin_subdev_cleanup(vin);
  1683. v4l2_device_unregister(&vin->v4l2_dev);
  1684. return 0;
  1685. }
  1686. static const struct of_device_id ark1668e_vin_of_match[] = {
  1687. { .compatible = "arkmicro,ark1668e-vin", },
  1688. { }
  1689. };
  1690. MODULE_DEVICE_TABLE(of, ark1668e_vin_of_match);
  1691. static struct platform_driver ark1668e_vin_driver = {
  1692. .driver = {
  1693. .name = "ark1668e-vin",
  1694. .of_match_table = of_match_ptr(ark1668e_vin_of_match),
  1695. },
  1696. .probe = ark1668e_vin_probe,
  1697. .remove = ark1668e_vin_remove,
  1698. };
  1699. static int __init ark_vin_init(void)
  1700. {
  1701. return platform_driver_register(&ark1668e_vin_driver);
  1702. }
  1703. device_initcall(ark_vin_init);
  1704. MODULE_AUTHOR("arkmicro");
  1705. MODULE_DESCRIPTION("The V4L2 driver for arkmicro");
  1706. MODULE_LICENSE("GPL v2");