sn9c102_core.c 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744
  1. /***************************************************************************
  2. * V4L2 driver for SN9C10x PC Camera Controllers *
  3. * *
  4. * Copyright (C) 2004-2005 by Luca Risolia <luca.risolia@studio.unibo.it> *
  5. * *
  6. * This program is free software; you can redistribute it and/or modify *
  7. * it under the terms of the GNU General Public License as published by *
  8. * the Free Software Foundation; either version 2 of the License, or *
  9. * (at your option) any later version. *
  10. * *
  11. * This program is distributed in the hope that it will be useful, *
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  14. * GNU General Public License for more details. *
  15. * *
  16. * You should have received a copy of the GNU General Public License *
  17. * along with this program; if not, write to the Free Software *
  18. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
  19. ***************************************************************************/
  20. #include <linux/module.h>
  21. #include <linux/init.h>
  22. #include <linux/kernel.h>
  23. #include <linux/param.h>
  24. #include <linux/moduleparam.h>
  25. #include <linux/errno.h>
  26. #include <linux/slab.h>
  27. #include <linux/string.h>
  28. #include <linux/device.h>
  29. #include <linux/fs.h>
  30. #include <linux/delay.h>
  31. #include <linux/stddef.h>
  32. #include <linux/compiler.h>
  33. #include <linux/ioctl.h>
  34. #include <linux/poll.h>
  35. #include <linux/stat.h>
  36. #include <linux/mm.h>
  37. #include <linux/vmalloc.h>
  38. #include <linux/page-flags.h>
  39. #include <linux/byteorder/generic.h>
  40. #include <asm/page.h>
  41. #include <asm/uaccess.h>
  42. #include "sn9c102.h"
  43. /*****************************************************************************/
  44. MODULE_DEVICE_TABLE(usb, sn9c102_id_table);
  45. MODULE_AUTHOR(SN9C102_MODULE_AUTHOR " " SN9C102_AUTHOR_EMAIL);
  46. MODULE_DESCRIPTION(SN9C102_MODULE_NAME);
  47. MODULE_VERSION(SN9C102_MODULE_VERSION);
  48. MODULE_LICENSE(SN9C102_MODULE_LICENSE);
  49. static short video_nr[] = {[0 ... SN9C102_MAX_DEVICES-1] = -1};
  50. module_param_array(video_nr, short, NULL, 0444);
  51. MODULE_PARM_DESC(video_nr,
  52. "\n<-1|n[,...]> Specify V4L2 minor mode number."
  53. "\n -1 = use next available (default)"
  54. "\n n = use minor number n (integer >= 0)"
  55. "\nYou can specify up to "__MODULE_STRING(SN9C102_MAX_DEVICES)
  56. " cameras this way."
  57. "\nFor example:"
  58. "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
  59. "\nthe second camera and use auto for the first"
  60. "\none and for every other camera."
  61. "\n");
  62. static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
  63. SN9C102_FORCE_MUNMAP};
  64. module_param_array(force_munmap, bool, NULL, 0444);
  65. MODULE_PARM_DESC(force_munmap,
  66. "\n<0|1[,...]> Force the application to unmap previously "
  67. "\nmapped buffer memory before calling any VIDIOC_S_CROP or "
  68. "\nVIDIOC_S_FMT ioctl's. Not all the applications support "
  69. "\nthis feature. This parameter is specific for each "
  70. "\ndetected camera."
  71. "\n 0 = do not force memory unmapping"
  72. "\n 1 = force memory unmapping (save memory)"
  73. "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"."
  74. "\n");
  75. #ifdef SN9C102_DEBUG
  76. static unsigned short debug = SN9C102_DEBUG_LEVEL;
  77. module_param(debug, ushort, 0644);
  78. MODULE_PARM_DESC(debug,
  79. "\n<n> Debugging information level, from 0 to 3:"
  80. "\n0 = none (use carefully)"
  81. "\n1 = critical errors"
  82. "\n2 = significant informations"
  83. "\n3 = more verbose messages"
  84. "\nLevel 3 is useful for testing only, when only "
  85. "one device is used."
  86. "\nDefault value is "__MODULE_STRING(SN9C102_DEBUG_LEVEL)"."
  87. "\n");
  88. #endif
  89. /*****************************************************************************/
  90. static sn9c102_sof_header_t sn9c102_sof_header[] = {
  91. {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x00},
  92. {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x01},
  93. };
  94. static sn9c102_eof_header_t sn9c102_eof_header[] = {
  95. {0x00, 0x00, 0x00, 0x00},
  96. {0x40, 0x00, 0x00, 0x00},
  97. {0x80, 0x00, 0x00, 0x00},
  98. {0xc0, 0x00, 0x00, 0x00},
  99. };
  100. /*****************************************************************************/
  101. static void* rvmalloc(size_t size)
  102. {
  103. void* mem;
  104. unsigned long adr;
  105. size = PAGE_ALIGN(size);
  106. mem = vmalloc_32((unsigned long)size);
  107. if (!mem)
  108. return NULL;
  109. memset(mem, 0, size);
  110. adr = (unsigned long)mem;
  111. while (size > 0) {
  112. SetPageReserved(vmalloc_to_page((void *)adr));
  113. adr += PAGE_SIZE;
  114. size -= PAGE_SIZE;
  115. }
  116. return mem;
  117. }
  118. static void rvfree(void* mem, size_t size)
  119. {
  120. unsigned long adr;
  121. if (!mem)
  122. return;
  123. size = PAGE_ALIGN(size);
  124. adr = (unsigned long)mem;
  125. while (size > 0) {
  126. ClearPageReserved(vmalloc_to_page((void *)adr));
  127. adr += PAGE_SIZE;
  128. size -= PAGE_SIZE;
  129. }
  130. vfree(mem);
  131. }
  132. static u32
  133. sn9c102_request_buffers(struct sn9c102_device* cam, u32 count,
  134. enum sn9c102_io_method io)
  135. {
  136. struct v4l2_pix_format* p = &(cam->sensor->pix_format);
  137. struct v4l2_rect* r = &(cam->sensor->cropcap.bounds);
  138. const size_t imagesize = cam->module_param.force_munmap ||
  139. io == IO_READ ?
  140. (p->width * p->height * p->priv) / 8 :
  141. (r->width * r->height * p->priv) / 8;
  142. void* buff = NULL;
  143. u32 i;
  144. if (count > SN9C102_MAX_FRAMES)
  145. count = SN9C102_MAX_FRAMES;
  146. cam->nbuffers = count;
  147. while (cam->nbuffers > 0) {
  148. if ((buff = rvmalloc(cam->nbuffers * PAGE_ALIGN(imagesize))))
  149. break;
  150. cam->nbuffers--;
  151. }
  152. for (i = 0; i < cam->nbuffers; i++) {
  153. cam->frame[i].bufmem = buff + i*PAGE_ALIGN(imagesize);
  154. cam->frame[i].buf.index = i;
  155. cam->frame[i].buf.m.offset = i*PAGE_ALIGN(imagesize);
  156. cam->frame[i].buf.length = imagesize;
  157. cam->frame[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  158. cam->frame[i].buf.sequence = 0;
  159. cam->frame[i].buf.field = V4L2_FIELD_NONE;
  160. cam->frame[i].buf.memory = V4L2_MEMORY_MMAP;
  161. cam->frame[i].buf.flags = 0;
  162. }
  163. return cam->nbuffers;
  164. }
  165. static void sn9c102_release_buffers(struct sn9c102_device* cam)
  166. {
  167. if (cam->nbuffers) {
  168. rvfree(cam->frame[0].bufmem,
  169. cam->nbuffers * cam->frame[0].buf.length);
  170. cam->nbuffers = 0;
  171. }
  172. }
  173. static void sn9c102_empty_framequeues(struct sn9c102_device* cam)
  174. {
  175. u32 i;
  176. INIT_LIST_HEAD(&cam->inqueue);
  177. INIT_LIST_HEAD(&cam->outqueue);
  178. for (i = 0; i < SN9C102_MAX_FRAMES; i++) {
  179. cam->frame[i].state = F_UNUSED;
  180. cam->frame[i].buf.bytesused = 0;
  181. }
  182. }
  183. static void sn9c102_queue_unusedframes(struct sn9c102_device* cam)
  184. {
  185. unsigned long lock_flags;
  186. u32 i;
  187. for (i = 0; i < cam->nbuffers; i++)
  188. if (cam->frame[i].state == F_UNUSED) {
  189. cam->frame[i].state = F_QUEUED;
  190. spin_lock_irqsave(&cam->queue_lock, lock_flags);
  191. list_add_tail(&cam->frame[i].frame, &cam->inqueue);
  192. spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
  193. }
  194. }
  195. /*****************************************************************************/
  196. int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index)
  197. {
  198. struct usb_device* udev = cam->usbdev;
  199. u8* buff = cam->control_buffer;
  200. int res;
  201. *buff = value;
  202. res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
  203. index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
  204. if (res < 0) {
  205. DBG(3, "Failed to write a register (value 0x%02X, index "
  206. "0x%02X, error %d)", value, index, res)
  207. return -1;
  208. }
  209. cam->reg[index] = value;
  210. return 0;
  211. }
  212. /* NOTE: reading some registers always returns 0 */
  213. static int sn9c102_read_reg(struct sn9c102_device* cam, u16 index)
  214. {
  215. struct usb_device* udev = cam->usbdev;
  216. u8* buff = cam->control_buffer;
  217. int res;
  218. res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
  219. index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
  220. if (res < 0)
  221. DBG(3, "Failed to read a register (index 0x%02X, error %d)",
  222. index, res)
  223. return (res >= 0) ? (int)(*buff) : -1;
  224. }
  225. int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index)
  226. {
  227. if (index > 0x1f)
  228. return -EINVAL;
  229. return cam->reg[index];
  230. }
  231. static int
  232. sn9c102_i2c_wait(struct sn9c102_device* cam, struct sn9c102_sensor* sensor)
  233. {
  234. int i, r;
  235. for (i = 1; i <= 5; i++) {
  236. r = sn9c102_read_reg(cam, 0x08);
  237. if (r < 0)
  238. return -EIO;
  239. if (r & 0x04)
  240. return 0;
  241. if (sensor->frequency & SN9C102_I2C_400KHZ)
  242. udelay(5*16);
  243. else
  244. udelay(16*16);
  245. }
  246. return -EBUSY;
  247. }
  248. static int
  249. sn9c102_i2c_detect_read_error(struct sn9c102_device* cam,
  250. struct sn9c102_sensor* sensor)
  251. {
  252. int r;
  253. r = sn9c102_read_reg(cam, 0x08);
  254. return (r < 0 || (r >= 0 && !(r & 0x08))) ? -EIO : 0;
  255. }
  256. static int
  257. sn9c102_i2c_detect_write_error(struct sn9c102_device* cam,
  258. struct sn9c102_sensor* sensor)
  259. {
  260. int r;
  261. r = sn9c102_read_reg(cam, 0x08);
  262. return (r < 0 || (r >= 0 && (r & 0x08))) ? -EIO : 0;
  263. }
  264. int
  265. sn9c102_i2c_try_raw_read(struct sn9c102_device* cam,
  266. struct sn9c102_sensor* sensor, u8 data0, u8 data1,
  267. u8 n, u8 buffer[])
  268. {
  269. struct usb_device* udev = cam->usbdev;
  270. u8* data = cam->control_buffer;
  271. int err = 0, res;
  272. /* Write cycle */
  273. data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
  274. ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) | 0x10;
  275. data[1] = data0; /* I2C slave id */
  276. data[2] = data1; /* address */
  277. data[7] = 0x10;
  278. res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
  279. 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
  280. if (res < 0)
  281. err += res;
  282. err += sn9c102_i2c_wait(cam, sensor);
  283. /* Read cycle - n bytes */
  284. data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
  285. ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) |
  286. (n << 4) | 0x02;
  287. data[1] = data0;
  288. data[7] = 0x10;
  289. res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
  290. 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
  291. if (res < 0)
  292. err += res;
  293. err += sn9c102_i2c_wait(cam, sensor);
  294. /* The first read byte will be placed in data[4] */
  295. res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
  296. 0x0a, 0, data, 5, SN9C102_CTRL_TIMEOUT);
  297. if (res < 0)
  298. err += res;
  299. err += sn9c102_i2c_detect_read_error(cam, sensor);
  300. PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1,
  301. data[4])
  302. if (err) {
  303. DBG(3, "I2C read failed for %s image sensor", sensor->name)
  304. return -1;
  305. }
  306. if (buffer)
  307. memcpy(buffer, data, sizeof(buffer));
  308. return (int)data[4];
  309. }
  310. int
  311. sn9c102_i2c_try_raw_write(struct sn9c102_device* cam,
  312. struct sn9c102_sensor* sensor, u8 n, u8 data0,
  313. u8 data1, u8 data2, u8 data3, u8 data4, u8 data5)
  314. {
  315. struct usb_device* udev = cam->usbdev;
  316. u8* data = cam->control_buffer;
  317. int err = 0, res;
  318. /* Write cycle. It usually is address + value */
  319. data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
  320. ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0)
  321. | ((n - 1) << 4);
  322. data[1] = data0;
  323. data[2] = data1;
  324. data[3] = data2;
  325. data[4] = data3;
  326. data[5] = data4;
  327. data[6] = data5;
  328. data[7] = 0x14;
  329. res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
  330. 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
  331. if (res < 0)
  332. err += res;
  333. err += sn9c102_i2c_wait(cam, sensor);
  334. err += sn9c102_i2c_detect_write_error(cam, sensor);
  335. if (err)
  336. DBG(3, "I2C write failed for %s image sensor", sensor->name)
  337. PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
  338. "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
  339. n, data0, data1, data2, data3, data4, data5)
  340. return err ? -1 : 0;
  341. }
  342. int
  343. sn9c102_i2c_try_read(struct sn9c102_device* cam,
  344. struct sn9c102_sensor* sensor, u8 address)
  345. {
  346. return sn9c102_i2c_try_raw_read(cam, sensor, sensor->i2c_slave_id,
  347. address, 1, NULL);
  348. }
  349. int
  350. sn9c102_i2c_try_write(struct sn9c102_device* cam,
  351. struct sn9c102_sensor* sensor, u8 address, u8 value)
  352. {
  353. return sn9c102_i2c_try_raw_write(cam, sensor, 3,
  354. sensor->i2c_slave_id, address,
  355. value, 0, 0, 0);
  356. }
  357. int sn9c102_i2c_read(struct sn9c102_device* cam, u8 address)
  358. {
  359. if (!cam->sensor)
  360. return -1;
  361. return sn9c102_i2c_try_read(cam, cam->sensor, address);
  362. }
  363. int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value)
  364. {
  365. if (!cam->sensor)
  366. return -1;
  367. return sn9c102_i2c_try_write(cam, cam->sensor, address, value);
  368. }
  369. /*****************************************************************************/
  370. static void*
  371. sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len)
  372. {
  373. size_t soflen = sizeof(sn9c102_sof_header_t), i;
  374. u8 j, n = sizeof(sn9c102_sof_header) / soflen;
  375. for (i = 0; (len >= soflen) && (i <= len - soflen); i++)
  376. for (j = 0; j < n; j++)
  377. /* It's enough to compare 7 bytes */
  378. if (!memcmp(mem + i, sn9c102_sof_header[j], 7)) {
  379. memcpy(cam->sof_header, mem + i, soflen);
  380. /* Skip the header */
  381. return mem + i + soflen;
  382. }
  383. return NULL;
  384. }
  385. static void*
  386. sn9c102_find_eof_header(struct sn9c102_device* cam, void* mem, size_t len)
  387. {
  388. size_t eoflen = sizeof(sn9c102_eof_header_t), i;
  389. unsigned j, n = sizeof(sn9c102_eof_header) / eoflen;
  390. if (cam->sensor->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
  391. return NULL; /* EOF header does not exist in compressed data */
  392. for (i = 0; (len >= eoflen) && (i <= len - eoflen); i++)
  393. for (j = 0; j < n; j++)
  394. if (!memcmp(mem + i, sn9c102_eof_header[j], eoflen))
  395. return mem + i;
  396. return NULL;
  397. }
  398. static void sn9c102_urb_complete(struct urb *urb, struct pt_regs* regs)
  399. {
  400. struct sn9c102_device* cam = urb->context;
  401. struct sn9c102_frame_t** f;
  402. size_t imagesize;
  403. unsigned long lock_flags;
  404. u8 i;
  405. int err = 0;
  406. if (urb->status == -ENOENT)
  407. return;
  408. f = &cam->frame_current;
  409. if (cam->stream == STREAM_INTERRUPT) {
  410. cam->stream = STREAM_OFF;
  411. if ((*f))
  412. (*f)->state = F_QUEUED;
  413. DBG(3, "Stream interrupted")
  414. wake_up_interruptible(&cam->wait_stream);
  415. }
  416. if (cam->state & DEV_DISCONNECTED)
  417. return;
  418. if (cam->state & DEV_MISCONFIGURED) {
  419. wake_up_interruptible(&cam->wait_frame);
  420. return;
  421. }
  422. if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
  423. goto resubmit_urb;
  424. if (!(*f))
  425. (*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
  426. frame);
  427. imagesize = (cam->sensor->pix_format.width *
  428. cam->sensor->pix_format.height *
  429. cam->sensor->pix_format.priv) / 8;
  430. for (i = 0; i < urb->number_of_packets; i++) {
  431. unsigned int img, len, status;
  432. void *pos, *sof, *eof;
  433. len = urb->iso_frame_desc[i].actual_length;
  434. status = urb->iso_frame_desc[i].status;
  435. pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
  436. if (status) {
  437. DBG(3, "Error in isochronous frame")
  438. (*f)->state = F_ERROR;
  439. continue;
  440. }
  441. PDBGG("Isochrnous frame: length %u, #%u i", len, i)
  442. /*
  443. NOTE: It is probably correct to assume that SOF and EOF
  444. headers do not occur between two consecutive packets,
  445. but who knows..Whatever is the truth, this assumption
  446. doesn't introduce bugs.
  447. */
  448. redo:
  449. sof = sn9c102_find_sof_header(cam, pos, len);
  450. if (!sof) {
  451. eof = sn9c102_find_eof_header(cam, pos, len);
  452. if ((*f)->state == F_GRABBING) {
  453. end_of_frame:
  454. img = len;
  455. if (eof)
  456. img = (eof > pos) ? eof - pos - 1 : 0;
  457. if ((*f)->buf.bytesused+img > imagesize) {
  458. u32 b = (*f)->buf.bytesused + img -
  459. imagesize;
  460. img = imagesize - (*f)->buf.bytesused;
  461. DBG(3, "Expected EOF not found: "
  462. "video frame cut")
  463. if (eof)
  464. DBG(3, "Exceeded limit: +%u "
  465. "bytes", (unsigned)(b))
  466. }
  467. memcpy((*f)->bufmem + (*f)->buf.bytesused, pos,
  468. img);
  469. if ((*f)->buf.bytesused == 0)
  470. do_gettimeofday(&(*f)->buf.timestamp);
  471. (*f)->buf.bytesused += img;
  472. if ((*f)->buf.bytesused == imagesize ||
  473. (cam->sensor->pix_format.pixelformat ==
  474. V4L2_PIX_FMT_SN9C10X && eof)) {
  475. u32 b = (*f)->buf.bytesused;
  476. (*f)->state = F_DONE;
  477. (*f)->buf.sequence= ++cam->frame_count;
  478. spin_lock_irqsave(&cam->queue_lock,
  479. lock_flags);
  480. list_move_tail(&(*f)->frame,
  481. &cam->outqueue);
  482. if (!list_empty(&cam->inqueue))
  483. (*f) = list_entry(
  484. cam->inqueue.next,
  485. struct sn9c102_frame_t,
  486. frame );
  487. else
  488. (*f) = NULL;
  489. spin_unlock_irqrestore(&cam->queue_lock
  490. , lock_flags);
  491. memcpy(cam->sysfs.frame_header,
  492. cam->sof_header,
  493. sizeof(sn9c102_sof_header_t));
  494. DBG(3, "Video frame captured: "
  495. "%lu bytes", (unsigned long)(b))
  496. if (!(*f))
  497. goto resubmit_urb;
  498. } else if (eof) {
  499. (*f)->state = F_ERROR;
  500. DBG(3, "Not expected EOF after %lu "
  501. "bytes of image data",
  502. (unsigned long)((*f)->buf.bytesused))
  503. }
  504. if (sof) /* (1) */
  505. goto start_of_frame;
  506. } else if (eof) {
  507. DBG(3, "EOF without SOF")
  508. continue;
  509. } else {
  510. PDBGG("Ignoring pointless isochronous frame")
  511. continue;
  512. }
  513. } else if ((*f)->state == F_QUEUED || (*f)->state == F_ERROR) {
  514. start_of_frame:
  515. (*f)->state = F_GRABBING;
  516. (*f)->buf.bytesused = 0;
  517. len -= (sof - pos);
  518. pos = sof;
  519. DBG(3, "SOF detected: new video frame")
  520. if (len)
  521. goto redo;
  522. } else if ((*f)->state == F_GRABBING) {
  523. eof = sn9c102_find_eof_header(cam, pos, len);
  524. if (eof && eof < sof)
  525. goto end_of_frame; /* (1) */
  526. else {
  527. if (cam->sensor->pix_format.pixelformat ==
  528. V4L2_PIX_FMT_SN9C10X) {
  529. eof = sof-sizeof(sn9c102_sof_header_t);
  530. goto end_of_frame;
  531. } else {
  532. DBG(3, "SOF before expected EOF after "
  533. "%lu bytes of image data",
  534. (unsigned long)((*f)->buf.bytesused))
  535. goto start_of_frame;
  536. }
  537. }
  538. }
  539. }
  540. resubmit_urb:
  541. urb->dev = cam->usbdev;
  542. err = usb_submit_urb(urb, GFP_ATOMIC);
  543. if (err < 0 && err != -EPERM) {
  544. cam->state |= DEV_MISCONFIGURED;
  545. DBG(1, "usb_submit_urb() failed")
  546. }
  547. wake_up_interruptible(&cam->wait_frame);
  548. }
  549. static int sn9c102_start_transfer(struct sn9c102_device* cam)
  550. {
  551. struct usb_device *udev = cam->usbdev;
  552. struct urb* urb;
  553. const unsigned int wMaxPacketSize[] = {0, 128, 256, 384, 512,
  554. 680, 800, 900, 1023};
  555. const unsigned int psz = wMaxPacketSize[SN9C102_ALTERNATE_SETTING];
  556. s8 i, j;
  557. int err = 0;
  558. for (i = 0; i < SN9C102_URBS; i++) {
  559. cam->transfer_buffer[i] = kmalloc(SN9C102_ISO_PACKETS * psz,
  560. GFP_KERNEL);
  561. if (!cam->transfer_buffer[i]) {
  562. err = -ENOMEM;
  563. DBG(1, "Not enough memory")
  564. goto free_buffers;
  565. }
  566. }
  567. for (i = 0; i < SN9C102_URBS; i++) {
  568. urb = usb_alloc_urb(SN9C102_ISO_PACKETS, GFP_KERNEL);
  569. cam->urb[i] = urb;
  570. if (!urb) {
  571. err = -ENOMEM;
  572. DBG(1, "usb_alloc_urb() failed")
  573. goto free_urbs;
  574. }
  575. urb->dev = udev;
  576. urb->context = cam;
  577. urb->pipe = usb_rcvisocpipe(udev, 1);
  578. urb->transfer_flags = URB_ISO_ASAP;
  579. urb->number_of_packets = SN9C102_ISO_PACKETS;
  580. urb->complete = sn9c102_urb_complete;
  581. urb->transfer_buffer = cam->transfer_buffer[i];
  582. urb->transfer_buffer_length = psz * SN9C102_ISO_PACKETS;
  583. urb->interval = 1;
  584. for (j = 0; j < SN9C102_ISO_PACKETS; j++) {
  585. urb->iso_frame_desc[j].offset = psz * j;
  586. urb->iso_frame_desc[j].length = psz;
  587. }
  588. }
  589. /* Enable video */
  590. if (!(cam->reg[0x01] & 0x04)) {
  591. err = sn9c102_write_reg(cam, cam->reg[0x01] | 0x04, 0x01);
  592. if (err) {
  593. err = -EIO;
  594. DBG(1, "I/O hardware error")
  595. goto free_urbs;
  596. }
  597. }
  598. err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING);
  599. if (err) {
  600. DBG(1, "usb_set_interface() failed")
  601. goto free_urbs;
  602. }
  603. cam->frame_current = NULL;
  604. for (i = 0; i < SN9C102_URBS; i++) {
  605. err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
  606. if (err) {
  607. for (j = i-1; j >= 0; j--)
  608. usb_kill_urb(cam->urb[j]);
  609. DBG(1, "usb_submit_urb() failed, error %d", err)
  610. goto free_urbs;
  611. }
  612. }
  613. return 0;
  614. free_urbs:
  615. for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++)
  616. usb_free_urb(cam->urb[i]);
  617. free_buffers:
  618. for (i = 0; (i < SN9C102_URBS) && cam->transfer_buffer[i]; i++)
  619. kfree(cam->transfer_buffer[i]);
  620. return err;
  621. }
  622. static int sn9c102_stop_transfer(struct sn9c102_device* cam)
  623. {
  624. struct usb_device *udev = cam->usbdev;
  625. s8 i;
  626. int err = 0;
  627. if (cam->state & DEV_DISCONNECTED)
  628. return 0;
  629. for (i = SN9C102_URBS-1; i >= 0; i--) {
  630. usb_kill_urb(cam->urb[i]);
  631. usb_free_urb(cam->urb[i]);
  632. kfree(cam->transfer_buffer[i]);
  633. }
  634. err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */
  635. if (err)
  636. DBG(3, "usb_set_interface() failed")
  637. return err;
  638. }
  639. static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
  640. {
  641. int err = 0;
  642. cam->stream = STREAM_INTERRUPT;
  643. err = wait_event_timeout(cam->wait_stream,
  644. (cam->stream == STREAM_OFF) ||
  645. (cam->state & DEV_DISCONNECTED),
  646. SN9C102_URB_TIMEOUT);
  647. if (cam->state & DEV_DISCONNECTED)
  648. return -ENODEV;
  649. else if (err) {
  650. cam->state |= DEV_MISCONFIGURED;
  651. DBG(1, "The camera is misconfigured. To use it, close and "
  652. "open /dev/video%d again.", cam->v4ldev->minor)
  653. return err;
  654. }
  655. return 0;
  656. }
  657. /*****************************************************************************/
  658. static u8 sn9c102_strtou8(const char* buff, size_t len, ssize_t* count)
  659. {
  660. char str[5];
  661. char* endp;
  662. unsigned long val;
  663. if (len < 4) {
  664. strncpy(str, buff, len);
  665. str[len+1] = '\0';
  666. } else {
  667. strncpy(str, buff, 4);
  668. str[4] = '\0';
  669. }
  670. val = simple_strtoul(str, &endp, 0);
  671. *count = 0;
  672. if (val <= 0xff)
  673. *count = (ssize_t)(endp - str);
  674. if ((*count) && (len == *count+1) && (buff[*count] == '\n'))
  675. *count += 1;
  676. return (u8)val;
  677. }
  678. /*
  679. NOTE 1: being inside one of the following methods implies that the v4l
  680. device exists for sure (see kobjects and reference counters)
  681. NOTE 2: buffers are PAGE_SIZE long
  682. */
  683. static ssize_t sn9c102_show_reg(struct class_device* cd, char* buf)
  684. {
  685. struct sn9c102_device* cam;
  686. ssize_t count;
  687. if (down_interruptible(&sn9c102_sysfs_lock))
  688. return -ERESTARTSYS;
  689. cam = video_get_drvdata(to_video_device(cd));
  690. if (!cam) {
  691. up(&sn9c102_sysfs_lock);
  692. return -ENODEV;
  693. }
  694. count = sprintf(buf, "%u\n", cam->sysfs.reg);
  695. up(&sn9c102_sysfs_lock);
  696. return count;
  697. }
  698. static ssize_t
  699. sn9c102_store_reg(struct class_device* cd, const char* buf, size_t len)
  700. {
  701. struct sn9c102_device* cam;
  702. u8 index;
  703. ssize_t count;
  704. if (down_interruptible(&sn9c102_sysfs_lock))
  705. return -ERESTARTSYS;
  706. cam = video_get_drvdata(to_video_device(cd));
  707. if (!cam) {
  708. up(&sn9c102_sysfs_lock);
  709. return -ENODEV;
  710. }
  711. index = sn9c102_strtou8(buf, len, &count);
  712. if (index > 0x1f || !count) {
  713. up(&sn9c102_sysfs_lock);
  714. return -EINVAL;
  715. }
  716. cam->sysfs.reg = index;
  717. DBG(2, "Moved SN9C10X register index to 0x%02X", cam->sysfs.reg)
  718. DBG(3, "Written bytes: %zd", count)
  719. up(&sn9c102_sysfs_lock);
  720. return count;
  721. }
  722. static ssize_t sn9c102_show_val(struct class_device* cd, char* buf)
  723. {
  724. struct sn9c102_device* cam;
  725. ssize_t count;
  726. int val;
  727. if (down_interruptible(&sn9c102_sysfs_lock))
  728. return -ERESTARTSYS;
  729. cam = video_get_drvdata(to_video_device(cd));
  730. if (!cam) {
  731. up(&sn9c102_sysfs_lock);
  732. return -ENODEV;
  733. }
  734. if ((val = sn9c102_read_reg(cam, cam->sysfs.reg)) < 0) {
  735. up(&sn9c102_sysfs_lock);
  736. return -EIO;
  737. }
  738. count = sprintf(buf, "%d\n", val);
  739. DBG(3, "Read bytes: %zd", count)
  740. up(&sn9c102_sysfs_lock);
  741. return count;
  742. }
  743. static ssize_t
  744. sn9c102_store_val(struct class_device* cd, const char* buf, size_t len)
  745. {
  746. struct sn9c102_device* cam;
  747. u8 value;
  748. ssize_t count;
  749. int err;
  750. if (down_interruptible(&sn9c102_sysfs_lock))
  751. return -ERESTARTSYS;
  752. cam = video_get_drvdata(to_video_device(cd));
  753. if (!cam) {
  754. up(&sn9c102_sysfs_lock);
  755. return -ENODEV;
  756. }
  757. value = sn9c102_strtou8(buf, len, &count);
  758. if (!count) {
  759. up(&sn9c102_sysfs_lock);
  760. return -EINVAL;
  761. }
  762. err = sn9c102_write_reg(cam, value, cam->sysfs.reg);
  763. if (err) {
  764. up(&sn9c102_sysfs_lock);
  765. return -EIO;
  766. }
  767. DBG(2, "Written SN9C10X reg. 0x%02X, val. 0x%02X",
  768. cam->sysfs.reg, value)
  769. DBG(3, "Written bytes: %zd", count)
  770. up(&sn9c102_sysfs_lock);
  771. return count;
  772. }
  773. static ssize_t sn9c102_show_i2c_reg(struct class_device* cd, char* buf)
  774. {
  775. struct sn9c102_device* cam;
  776. ssize_t count;
  777. if (down_interruptible(&sn9c102_sysfs_lock))
  778. return -ERESTARTSYS;
  779. cam = video_get_drvdata(to_video_device(cd));
  780. if (!cam) {
  781. up(&sn9c102_sysfs_lock);
  782. return -ENODEV;
  783. }
  784. count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg);
  785. DBG(3, "Read bytes: %zd", count)
  786. up(&sn9c102_sysfs_lock);
  787. return count;
  788. }
  789. static ssize_t
  790. sn9c102_store_i2c_reg(struct class_device* cd, const char* buf, size_t len)
  791. {
  792. struct sn9c102_device* cam;
  793. u8 index;
  794. ssize_t count;
  795. if (down_interruptible(&sn9c102_sysfs_lock))
  796. return -ERESTARTSYS;
  797. cam = video_get_drvdata(to_video_device(cd));
  798. if (!cam) {
  799. up(&sn9c102_sysfs_lock);
  800. return -ENODEV;
  801. }
  802. index = sn9c102_strtou8(buf, len, &count);
  803. if (!count) {
  804. up(&sn9c102_sysfs_lock);
  805. return -EINVAL;
  806. }
  807. cam->sysfs.i2c_reg = index;
  808. DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg)
  809. DBG(3, "Written bytes: %zd", count)
  810. up(&sn9c102_sysfs_lock);
  811. return count;
  812. }
  813. static ssize_t sn9c102_show_i2c_val(struct class_device* cd, char* buf)
  814. {
  815. struct sn9c102_device* cam;
  816. ssize_t count;
  817. int val;
  818. if (down_interruptible(&sn9c102_sysfs_lock))
  819. return -ERESTARTSYS;
  820. cam = video_get_drvdata(to_video_device(cd));
  821. if (!cam) {
  822. up(&sn9c102_sysfs_lock);
  823. return -ENODEV;
  824. }
  825. if (!(cam->sensor->sysfs_ops & SN9C102_I2C_READ)) {
  826. up(&sn9c102_sysfs_lock);
  827. return -ENOSYS;
  828. }
  829. if ((val = sn9c102_i2c_read(cam, cam->sysfs.i2c_reg)) < 0) {
  830. up(&sn9c102_sysfs_lock);
  831. return -EIO;
  832. }
  833. count = sprintf(buf, "%d\n", val);
  834. DBG(3, "Read bytes: %zd", count)
  835. up(&sn9c102_sysfs_lock);
  836. return count;
  837. }
  838. static ssize_t
  839. sn9c102_store_i2c_val(struct class_device* cd, const char* buf, size_t len)
  840. {
  841. struct sn9c102_device* cam;
  842. u8 value;
  843. ssize_t count;
  844. int err;
  845. if (down_interruptible(&sn9c102_sysfs_lock))
  846. return -ERESTARTSYS;
  847. cam = video_get_drvdata(to_video_device(cd));
  848. if (!cam) {
  849. up(&sn9c102_sysfs_lock);
  850. return -ENODEV;
  851. }
  852. if (!(cam->sensor->sysfs_ops & SN9C102_I2C_WRITE)) {
  853. up(&sn9c102_sysfs_lock);
  854. return -ENOSYS;
  855. }
  856. value = sn9c102_strtou8(buf, len, &count);
  857. if (!count) {
  858. up(&sn9c102_sysfs_lock);
  859. return -EINVAL;
  860. }
  861. err = sn9c102_i2c_write(cam, cam->sysfs.i2c_reg, value);
  862. if (err) {
  863. up(&sn9c102_sysfs_lock);
  864. return -EIO;
  865. }
  866. DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
  867. cam->sysfs.i2c_reg, value)
  868. DBG(3, "Written bytes: %zd", count)
  869. up(&sn9c102_sysfs_lock);
  870. return count;
  871. }
  872. static ssize_t
  873. sn9c102_store_green(struct class_device* cd, const char* buf, size_t len)
  874. {
  875. struct sn9c102_device* cam;
  876. enum sn9c102_bridge bridge;
  877. ssize_t res = 0;
  878. u8 value;
  879. ssize_t count;
  880. if (down_interruptible(&sn9c102_sysfs_lock))
  881. return -ERESTARTSYS;
  882. cam = video_get_drvdata(to_video_device(cd));
  883. if (!cam) {
  884. up(&sn9c102_sysfs_lock);
  885. return -ENODEV;
  886. }
  887. bridge = cam->bridge;
  888. up(&sn9c102_sysfs_lock);
  889. value = sn9c102_strtou8(buf, len, &count);
  890. if (!count)
  891. return -EINVAL;
  892. switch (bridge) {
  893. case BRIDGE_SN9C101:
  894. case BRIDGE_SN9C102:
  895. if (value > 0x0f)
  896. return -EINVAL;
  897. if ((res = sn9c102_store_reg(cd, "0x11", 4)) >= 0)
  898. res = sn9c102_store_val(cd, buf, len);
  899. break;
  900. case BRIDGE_SN9C103:
  901. if (value > 0x7f)
  902. return -EINVAL;
  903. if ((res = sn9c102_store_reg(cd, "0x04", 4)) >= 0)
  904. res = sn9c102_store_val(cd, buf, len);
  905. break;
  906. }
  907. return res;
  908. }
  909. static ssize_t
  910. sn9c102_store_blue(struct class_device* cd, const char* buf, size_t len)
  911. {
  912. ssize_t res = 0;
  913. u8 value;
  914. ssize_t count;
  915. value = sn9c102_strtou8(buf, len, &count);
  916. if (!count || value > 0x7f)
  917. return -EINVAL;
  918. if ((res = sn9c102_store_reg(cd, "0x06", 4)) >= 0)
  919. res = sn9c102_store_val(cd, buf, len);
  920. return res;
  921. }
  922. static ssize_t
  923. sn9c102_store_red(struct class_device* cd, const char* buf, size_t len)
  924. {
  925. ssize_t res = 0;
  926. u8 value;
  927. ssize_t count;
  928. value = sn9c102_strtou8(buf, len, &count);
  929. if (!count || value > 0x7f)
  930. return -EINVAL;
  931. if ((res = sn9c102_store_reg(cd, "0x05", 4)) >= 0)
  932. res = sn9c102_store_val(cd, buf, len);
  933. return res;
  934. }
  935. static ssize_t sn9c102_show_frame_header(struct class_device* cd, char* buf)
  936. {
  937. struct sn9c102_device* cam;
  938. ssize_t count;
  939. cam = video_get_drvdata(to_video_device(cd));
  940. if (!cam)
  941. return -ENODEV;
  942. count = sizeof(cam->sysfs.frame_header);
  943. memcpy(buf, cam->sysfs.frame_header, count);
  944. DBG(3, "Frame header, read bytes: %zd", count)
  945. return count;
  946. }
  947. static CLASS_DEVICE_ATTR(reg, S_IRUGO | S_IWUSR,
  948. sn9c102_show_reg, sn9c102_store_reg);
  949. static CLASS_DEVICE_ATTR(val, S_IRUGO | S_IWUSR,
  950. sn9c102_show_val, sn9c102_store_val);
  951. static CLASS_DEVICE_ATTR(i2c_reg, S_IRUGO | S_IWUSR,
  952. sn9c102_show_i2c_reg, sn9c102_store_i2c_reg);
  953. static CLASS_DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR,
  954. sn9c102_show_i2c_val, sn9c102_store_i2c_val);
  955. static CLASS_DEVICE_ATTR(green, S_IWUGO, NULL, sn9c102_store_green);
  956. static CLASS_DEVICE_ATTR(blue, S_IWUGO, NULL, sn9c102_store_blue);
  957. static CLASS_DEVICE_ATTR(red, S_IWUGO, NULL, sn9c102_store_red);
  958. static CLASS_DEVICE_ATTR(frame_header, S_IRUGO,
  959. sn9c102_show_frame_header, NULL);
  960. static void sn9c102_create_sysfs(struct sn9c102_device* cam)
  961. {
  962. struct video_device *v4ldev = cam->v4ldev;
  963. video_device_create_file(v4ldev, &class_device_attr_reg);
  964. video_device_create_file(v4ldev, &class_device_attr_val);
  965. video_device_create_file(v4ldev, &class_device_attr_frame_header);
  966. if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
  967. video_device_create_file(v4ldev, &class_device_attr_green);
  968. else if (cam->bridge == BRIDGE_SN9C103) {
  969. video_device_create_file(v4ldev, &class_device_attr_blue);
  970. video_device_create_file(v4ldev, &class_device_attr_red);
  971. }
  972. if (cam->sensor->sysfs_ops) {
  973. video_device_create_file(v4ldev, &class_device_attr_i2c_reg);
  974. video_device_create_file(v4ldev, &class_device_attr_i2c_val);
  975. }
  976. }
  977. /*****************************************************************************/
  978. static int
  979. sn9c102_set_pix_format(struct sn9c102_device* cam, struct v4l2_pix_format* pix)
  980. {
  981. int err = 0;
  982. if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X)
  983. err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80, 0x18);
  984. else
  985. err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f, 0x18);
  986. return err ? -EIO : 0;
  987. }
  988. static int
  989. sn9c102_set_compression(struct sn9c102_device* cam,
  990. struct v4l2_jpegcompression* compression)
  991. {
  992. int err = 0;
  993. if (compression->quality == 0)
  994. err += sn9c102_write_reg(cam, cam->reg[0x17] | 0x01, 0x17);
  995. else if (compression->quality == 1)
  996. err += sn9c102_write_reg(cam, cam->reg[0x17] & 0xfe, 0x17);
  997. return err ? -EIO : 0;
  998. }
  999. static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale)
  1000. {
  1001. u8 r = 0;
  1002. int err = 0;
  1003. if (scale == 1)
  1004. r = cam->reg[0x18] & 0xcf;
  1005. else if (scale == 2) {
  1006. r = cam->reg[0x18] & 0xcf;
  1007. r |= 0x10;
  1008. } else if (scale == 4)
  1009. r = cam->reg[0x18] | 0x20;
  1010. err += sn9c102_write_reg(cam, r, 0x18);
  1011. if (err)
  1012. return -EIO;
  1013. PDBGG("Scaling factor: %u", scale)
  1014. return 0;
  1015. }
  1016. static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect)
  1017. {
  1018. struct sn9c102_sensor* s = cam->sensor;
  1019. u8 h_start = (u8)(rect->left - s->cropcap.bounds.left),
  1020. v_start = (u8)(rect->top - s->cropcap.bounds.top),
  1021. h_size = (u8)(rect->width / 16),
  1022. v_size = (u8)(rect->height / 16);
  1023. int err = 0;
  1024. err += sn9c102_write_reg(cam, h_start, 0x12);
  1025. err += sn9c102_write_reg(cam, v_start, 0x13);
  1026. err += sn9c102_write_reg(cam, h_size, 0x15);
  1027. err += sn9c102_write_reg(cam, v_size, 0x16);
  1028. if (err)
  1029. return -EIO;
  1030. PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
  1031. "%u %u %u %u", h_start, v_start, h_size, v_size)
  1032. return 0;
  1033. }
  1034. static int sn9c102_init(struct sn9c102_device* cam)
  1035. {
  1036. struct sn9c102_sensor* s = cam->sensor;
  1037. struct v4l2_control ctrl;
  1038. struct v4l2_queryctrl *qctrl;
  1039. struct v4l2_rect* rect;
  1040. u8 i = 0, n = 0;
  1041. int err = 0;
  1042. if (!(cam->state & DEV_INITIALIZED)) {
  1043. init_waitqueue_head(&cam->open);
  1044. qctrl = s->qctrl;
  1045. rect = &(s->cropcap.defrect);
  1046. } else { /* use current values */
  1047. qctrl = s->_qctrl;
  1048. rect = &(s->_rect);
  1049. }
  1050. err += sn9c102_set_scale(cam, rect->width / s->pix_format.width);
  1051. err += sn9c102_set_crop(cam, rect);
  1052. if (err)
  1053. return err;
  1054. if (s->init) {
  1055. err = s->init(cam);
  1056. if (err) {
  1057. DBG(3, "Sensor initialization failed")
  1058. return err;
  1059. }
  1060. }
  1061. if (!(cam->state & DEV_INITIALIZED))
  1062. cam->compression.quality = cam->reg[0x17] & 0x01 ? 0 : 1;
  1063. else
  1064. err += sn9c102_set_compression(cam, &cam->compression);
  1065. err += sn9c102_set_pix_format(cam, &s->pix_format);
  1066. if (s->set_pix_format)
  1067. err += s->set_pix_format(cam, &s->pix_format);
  1068. if (err)
  1069. return err;
  1070. if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
  1071. DBG(3, "Compressed video format is active, quality %d",
  1072. cam->compression.quality)
  1073. else
  1074. DBG(3, "Uncompressed video format is active")
  1075. if (s->set_crop)
  1076. if ((err = s->set_crop(cam, rect))) {
  1077. DBG(3, "set_crop() failed")
  1078. return err;
  1079. }
  1080. if (s->set_ctrl) {
  1081. n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
  1082. for (i = 0; i < n; i++)
  1083. if (s->qctrl[i].id != 0 &&
  1084. !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
  1085. ctrl.id = s->qctrl[i].id;
  1086. ctrl.value = qctrl[i].default_value;
  1087. err = s->set_ctrl(cam, &ctrl);
  1088. if (err) {
  1089. DBG(3, "Set %s control failed",
  1090. s->qctrl[i].name)
  1091. return err;
  1092. }
  1093. DBG(3, "Image sensor supports '%s' control",
  1094. s->qctrl[i].name)
  1095. }
  1096. }
  1097. if (!(cam->state & DEV_INITIALIZED)) {
  1098. init_MUTEX(&cam->fileop_sem);
  1099. spin_lock_init(&cam->queue_lock);
  1100. init_waitqueue_head(&cam->wait_frame);
  1101. init_waitqueue_head(&cam->wait_stream);
  1102. cam->nreadbuffers = 2;
  1103. memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
  1104. memcpy(&(s->_rect), &(s->cropcap.defrect),
  1105. sizeof(struct v4l2_rect));
  1106. cam->state |= DEV_INITIALIZED;
  1107. }
  1108. DBG(2, "Initialization succeeded")
  1109. return 0;
  1110. }
  1111. static void sn9c102_release_resources(struct sn9c102_device* cam)
  1112. {
  1113. down(&sn9c102_sysfs_lock);
  1114. DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor)
  1115. video_set_drvdata(cam->v4ldev, NULL);
  1116. video_unregister_device(cam->v4ldev);
  1117. up(&sn9c102_sysfs_lock);
  1118. kfree(cam->control_buffer);
  1119. }
  1120. /*****************************************************************************/
  1121. static int sn9c102_open(struct inode* inode, struct file* filp)
  1122. {
  1123. struct sn9c102_device* cam;
  1124. int err = 0;
  1125. /*
  1126. This is the only safe way to prevent race conditions with
  1127. disconnect
  1128. */
  1129. if (!down_read_trylock(&sn9c102_disconnect))
  1130. return -ERESTARTSYS;
  1131. cam = video_get_drvdata(video_devdata(filp));
  1132. if (down_interruptible(&cam->dev_sem)) {
  1133. up_read(&sn9c102_disconnect);
  1134. return -ERESTARTSYS;
  1135. }
  1136. if (cam->users) {
  1137. DBG(2, "Device /dev/video%d is busy...", cam->v4ldev->minor)
  1138. if ((filp->f_flags & O_NONBLOCK) ||
  1139. (filp->f_flags & O_NDELAY)) {
  1140. err = -EWOULDBLOCK;
  1141. goto out;
  1142. }
  1143. up(&cam->dev_sem);
  1144. err = wait_event_interruptible_exclusive(cam->open,
  1145. cam->state & DEV_DISCONNECTED
  1146. || !cam->users);
  1147. if (err) {
  1148. up_read(&sn9c102_disconnect);
  1149. return err;
  1150. }
  1151. if (cam->state & DEV_DISCONNECTED) {
  1152. up_read(&sn9c102_disconnect);
  1153. return -ENODEV;
  1154. }
  1155. down(&cam->dev_sem);
  1156. }
  1157. if (cam->state & DEV_MISCONFIGURED) {
  1158. err = sn9c102_init(cam);
  1159. if (err) {
  1160. DBG(1, "Initialization failed again. "
  1161. "I will retry on next open().")
  1162. goto out;
  1163. }
  1164. cam->state &= ~DEV_MISCONFIGURED;
  1165. }
  1166. if ((err = sn9c102_start_transfer(cam)))
  1167. goto out;
  1168. filp->private_data = cam;
  1169. cam->users++;
  1170. cam->io = IO_NONE;
  1171. cam->stream = STREAM_OFF;
  1172. cam->nbuffers = 0;
  1173. cam->frame_count = 0;
  1174. sn9c102_empty_framequeues(cam);
  1175. DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor)
  1176. out:
  1177. up(&cam->dev_sem);
  1178. up_read(&sn9c102_disconnect);
  1179. return err;
  1180. }
  1181. static int sn9c102_release(struct inode* inode, struct file* filp)
  1182. {
  1183. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1184. down(&cam->dev_sem); /* prevent disconnect() to be called */
  1185. sn9c102_stop_transfer(cam);
  1186. sn9c102_release_buffers(cam);
  1187. if (cam->state & DEV_DISCONNECTED) {
  1188. sn9c102_release_resources(cam);
  1189. up(&cam->dev_sem);
  1190. kfree(cam);
  1191. return 0;
  1192. }
  1193. cam->users--;
  1194. wake_up_interruptible_nr(&cam->open, 1);
  1195. DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor)
  1196. up(&cam->dev_sem);
  1197. return 0;
  1198. }
  1199. static ssize_t
  1200. sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
  1201. {
  1202. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1203. struct sn9c102_frame_t* f, * i;
  1204. unsigned long lock_flags;
  1205. int err = 0;
  1206. if (down_interruptible(&cam->fileop_sem))
  1207. return -ERESTARTSYS;
  1208. if (cam->state & DEV_DISCONNECTED) {
  1209. DBG(1, "Device not present")
  1210. up(&cam->fileop_sem);
  1211. return -ENODEV;
  1212. }
  1213. if (cam->state & DEV_MISCONFIGURED) {
  1214. DBG(1, "The camera is misconfigured. Close and open it again.")
  1215. up(&cam->fileop_sem);
  1216. return -EIO;
  1217. }
  1218. if (cam->io == IO_MMAP) {
  1219. DBG(3, "Close and open the device again to choose "
  1220. "the read method")
  1221. up(&cam->fileop_sem);
  1222. return -EINVAL;
  1223. }
  1224. if (cam->io == IO_NONE) {
  1225. if (!sn9c102_request_buffers(cam,cam->nreadbuffers, IO_READ)) {
  1226. DBG(1, "read() failed, not enough memory")
  1227. up(&cam->fileop_sem);
  1228. return -ENOMEM;
  1229. }
  1230. cam->io = IO_READ;
  1231. cam->stream = STREAM_ON;
  1232. sn9c102_queue_unusedframes(cam);
  1233. }
  1234. if (!count) {
  1235. up(&cam->fileop_sem);
  1236. return 0;
  1237. }
  1238. if (list_empty(&cam->outqueue)) {
  1239. if (filp->f_flags & O_NONBLOCK) {
  1240. up(&cam->fileop_sem);
  1241. return -EAGAIN;
  1242. }
  1243. err = wait_event_interruptible
  1244. ( cam->wait_frame,
  1245. (!list_empty(&cam->outqueue)) ||
  1246. (cam->state & DEV_DISCONNECTED) ||
  1247. (cam->state & DEV_MISCONFIGURED) );
  1248. if (err) {
  1249. up(&cam->fileop_sem);
  1250. return err;
  1251. }
  1252. if (cam->state & DEV_DISCONNECTED) {
  1253. up(&cam->fileop_sem);
  1254. return -ENODEV;
  1255. }
  1256. if (cam->state & DEV_MISCONFIGURED) {
  1257. up(&cam->fileop_sem);
  1258. return -EIO;
  1259. }
  1260. }
  1261. f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
  1262. spin_lock_irqsave(&cam->queue_lock, lock_flags);
  1263. list_for_each_entry(i, &cam->outqueue, frame)
  1264. i->state = F_UNUSED;
  1265. INIT_LIST_HEAD(&cam->outqueue);
  1266. spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
  1267. sn9c102_queue_unusedframes(cam);
  1268. if (count > f->buf.bytesused)
  1269. count = f->buf.bytesused;
  1270. if (copy_to_user(buf, f->bufmem, count)) {
  1271. up(&cam->fileop_sem);
  1272. return -EFAULT;
  1273. }
  1274. *f_pos += count;
  1275. PDBGG("Frame #%lu, bytes read: %zu", (unsigned long)f->buf.index,count)
  1276. up(&cam->fileop_sem);
  1277. return count;
  1278. }
  1279. static unsigned int sn9c102_poll(struct file *filp, poll_table *wait)
  1280. {
  1281. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1282. unsigned int mask = 0;
  1283. if (down_interruptible(&cam->fileop_sem))
  1284. return POLLERR;
  1285. if (cam->state & DEV_DISCONNECTED) {
  1286. DBG(1, "Device not present")
  1287. goto error;
  1288. }
  1289. if (cam->state & DEV_MISCONFIGURED) {
  1290. DBG(1, "The camera is misconfigured. Close and open it again.")
  1291. goto error;
  1292. }
  1293. if (cam->io == IO_NONE) {
  1294. if (!sn9c102_request_buffers(cam, cam->nreadbuffers,
  1295. IO_READ)) {
  1296. DBG(1, "poll() failed, not enough memory")
  1297. goto error;
  1298. }
  1299. cam->io = IO_READ;
  1300. cam->stream = STREAM_ON;
  1301. }
  1302. if (cam->io == IO_READ)
  1303. sn9c102_queue_unusedframes(cam);
  1304. poll_wait(filp, &cam->wait_frame, wait);
  1305. if (!list_empty(&cam->outqueue))
  1306. mask |= POLLIN | POLLRDNORM;
  1307. up(&cam->fileop_sem);
  1308. return mask;
  1309. error:
  1310. up(&cam->fileop_sem);
  1311. return POLLERR;
  1312. }
  1313. static void sn9c102_vm_open(struct vm_area_struct* vma)
  1314. {
  1315. struct sn9c102_frame_t* f = vma->vm_private_data;
  1316. f->vma_use_count++;
  1317. }
  1318. static void sn9c102_vm_close(struct vm_area_struct* vma)
  1319. {
  1320. /* NOTE: buffers are not freed here */
  1321. struct sn9c102_frame_t* f = vma->vm_private_data;
  1322. f->vma_use_count--;
  1323. }
  1324. static struct vm_operations_struct sn9c102_vm_ops = {
  1325. .open = sn9c102_vm_open,
  1326. .close = sn9c102_vm_close,
  1327. };
  1328. static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
  1329. {
  1330. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1331. unsigned long size = vma->vm_end - vma->vm_start,
  1332. start = vma->vm_start,
  1333. pos,
  1334. page;
  1335. u32 i;
  1336. if (down_interruptible(&cam->fileop_sem))
  1337. return -ERESTARTSYS;
  1338. if (cam->state & DEV_DISCONNECTED) {
  1339. DBG(1, "Device not present")
  1340. up(&cam->fileop_sem);
  1341. return -ENODEV;
  1342. }
  1343. if (cam->state & DEV_MISCONFIGURED) {
  1344. DBG(1, "The camera is misconfigured. Close and open it again.")
  1345. up(&cam->fileop_sem);
  1346. return -EIO;
  1347. }
  1348. if (cam->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
  1349. size != PAGE_ALIGN(cam->frame[0].buf.length)) {
  1350. up(&cam->fileop_sem);
  1351. return -EINVAL;
  1352. }
  1353. for (i = 0; i < cam->nbuffers; i++) {
  1354. if ((cam->frame[i].buf.m.offset>>PAGE_SHIFT) == vma->vm_pgoff)
  1355. break;
  1356. }
  1357. if (i == cam->nbuffers) {
  1358. up(&cam->fileop_sem);
  1359. return -EINVAL;
  1360. }
  1361. /* VM_IO is eventually going to replace PageReserved altogether */
  1362. vma->vm_flags |= VM_IO;
  1363. vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
  1364. pos = (unsigned long)cam->frame[i].bufmem;
  1365. while (size > 0) { /* size is page-aligned */
  1366. page = vmalloc_to_pfn((void *)pos);
  1367. if (remap_pfn_range(vma, start, page, PAGE_SIZE,
  1368. vma->vm_page_prot)) {
  1369. up(&cam->fileop_sem);
  1370. return -EAGAIN;
  1371. }
  1372. start += PAGE_SIZE;
  1373. pos += PAGE_SIZE;
  1374. size -= PAGE_SIZE;
  1375. }
  1376. vma->vm_ops = &sn9c102_vm_ops;
  1377. vma->vm_private_data = &cam->frame[i];
  1378. sn9c102_vm_open(vma);
  1379. up(&cam->fileop_sem);
  1380. return 0;
  1381. }
  1382. static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
  1383. unsigned int cmd, void __user * arg)
  1384. {
  1385. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1386. switch (cmd) {
  1387. case VIDIOC_QUERYCAP:
  1388. {
  1389. struct v4l2_capability cap = {
  1390. .driver = "sn9c102",
  1391. .version = SN9C102_MODULE_VERSION_CODE,
  1392. .capabilities = V4L2_CAP_VIDEO_CAPTURE |
  1393. V4L2_CAP_READWRITE |
  1394. V4L2_CAP_STREAMING,
  1395. };
  1396. strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card));
  1397. if (usb_make_path(cam->usbdev, cap.bus_info,
  1398. sizeof(cap.bus_info)) < 0)
  1399. strlcpy(cap.bus_info, cam->dev.bus_id,
  1400. sizeof(cap.bus_info));
  1401. if (copy_to_user(arg, &cap, sizeof(cap)))
  1402. return -EFAULT;
  1403. return 0;
  1404. }
  1405. case VIDIOC_ENUMINPUT:
  1406. {
  1407. struct v4l2_input i;
  1408. if (copy_from_user(&i, arg, sizeof(i)))
  1409. return -EFAULT;
  1410. if (i.index)
  1411. return -EINVAL;
  1412. memset(&i, 0, sizeof(i));
  1413. strcpy(i.name, "USB");
  1414. if (copy_to_user(arg, &i, sizeof(i)))
  1415. return -EFAULT;
  1416. return 0;
  1417. }
  1418. case VIDIOC_G_INPUT:
  1419. case VIDIOC_S_INPUT:
  1420. {
  1421. int index;
  1422. if (copy_from_user(&index, arg, sizeof(index)))
  1423. return -EFAULT;
  1424. if (index != 0)
  1425. return -EINVAL;
  1426. return 0;
  1427. }
  1428. case VIDIOC_QUERYCTRL:
  1429. {
  1430. struct sn9c102_sensor* s = cam->sensor;
  1431. struct v4l2_queryctrl qc;
  1432. u8 i, n;
  1433. if (copy_from_user(&qc, arg, sizeof(qc)))
  1434. return -EFAULT;
  1435. n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
  1436. for (i = 0; i < n; i++)
  1437. if (qc.id && qc.id == s->qctrl[i].id) {
  1438. memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
  1439. if (copy_to_user(arg, &qc, sizeof(qc)))
  1440. return -EFAULT;
  1441. return 0;
  1442. }
  1443. return -EINVAL;
  1444. }
  1445. case VIDIOC_G_CTRL:
  1446. {
  1447. struct sn9c102_sensor* s = cam->sensor;
  1448. struct v4l2_control ctrl;
  1449. int err = 0;
  1450. if (!s->get_ctrl)
  1451. return -EINVAL;
  1452. if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
  1453. return -EFAULT;
  1454. err = s->get_ctrl(cam, &ctrl);
  1455. if (copy_to_user(arg, &ctrl, sizeof(ctrl)))
  1456. return -EFAULT;
  1457. return err;
  1458. }
  1459. case VIDIOC_S_CTRL_OLD:
  1460. case VIDIOC_S_CTRL:
  1461. {
  1462. struct sn9c102_sensor* s = cam->sensor;
  1463. struct v4l2_control ctrl;
  1464. u8 i, n;
  1465. int err = 0;
  1466. if (!s->set_ctrl)
  1467. return -EINVAL;
  1468. if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
  1469. return -EFAULT;
  1470. n = sizeof(s->qctrl) / sizeof(s->qctrl[0]);
  1471. for (i = 0; i < n; i++)
  1472. if (ctrl.id == s->qctrl[i].id) {
  1473. if (ctrl.value < s->qctrl[i].minimum ||
  1474. ctrl.value > s->qctrl[i].maximum)
  1475. return -ERANGE;
  1476. ctrl.value -= ctrl.value % s->qctrl[i].step;
  1477. break;
  1478. }
  1479. if ((err = s->set_ctrl(cam, &ctrl)))
  1480. return err;
  1481. s->_qctrl[i].default_value = ctrl.value;
  1482. PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
  1483. (unsigned long)ctrl.id, (unsigned long)ctrl.value)
  1484. return 0;
  1485. }
  1486. case VIDIOC_CROPCAP:
  1487. {
  1488. struct v4l2_cropcap* cc = &(cam->sensor->cropcap);
  1489. cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1490. cc->pixelaspect.numerator = 1;
  1491. cc->pixelaspect.denominator = 1;
  1492. if (copy_to_user(arg, cc, sizeof(*cc)))
  1493. return -EFAULT;
  1494. return 0;
  1495. }
  1496. case VIDIOC_G_CROP:
  1497. {
  1498. struct sn9c102_sensor* s = cam->sensor;
  1499. struct v4l2_crop crop = {
  1500. .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
  1501. };
  1502. memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect));
  1503. if (copy_to_user(arg, &crop, sizeof(crop)))
  1504. return -EFAULT;
  1505. return 0;
  1506. }
  1507. case VIDIOC_S_CROP:
  1508. {
  1509. struct sn9c102_sensor* s = cam->sensor;
  1510. struct v4l2_crop crop;
  1511. struct v4l2_rect* rect;
  1512. struct v4l2_rect* bounds = &(s->cropcap.bounds);
  1513. struct v4l2_pix_format* pix_format = &(s->pix_format);
  1514. u8 scale;
  1515. const enum sn9c102_stream_state stream = cam->stream;
  1516. const u32 nbuffers = cam->nbuffers;
  1517. u32 i;
  1518. int err = 0;
  1519. if (copy_from_user(&crop, arg, sizeof(crop)))
  1520. return -EFAULT;
  1521. rect = &(crop.c);
  1522. if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1523. return -EINVAL;
  1524. if (cam->module_param.force_munmap)
  1525. for (i = 0; i < cam->nbuffers; i++)
  1526. if (cam->frame[i].vma_use_count) {
  1527. DBG(3, "VIDIOC_S_CROP failed. "
  1528. "Unmap the buffers first.")
  1529. return -EINVAL;
  1530. }
  1531. /* Preserve R,G or B origin */
  1532. rect->left = (s->_rect.left & 1L) ?
  1533. rect->left | 1L : rect->left & ~1L;
  1534. rect->top = (s->_rect.top & 1L) ?
  1535. rect->top | 1L : rect->top & ~1L;
  1536. if (rect->width < 16)
  1537. rect->width = 16;
  1538. if (rect->height < 16)
  1539. rect->height = 16;
  1540. if (rect->width > bounds->width)
  1541. rect->width = bounds->width;
  1542. if (rect->height > bounds->height)
  1543. rect->height = bounds->height;
  1544. if (rect->left < bounds->left)
  1545. rect->left = bounds->left;
  1546. if (rect->top < bounds->top)
  1547. rect->top = bounds->top;
  1548. if (rect->left + rect->width > bounds->left + bounds->width)
  1549. rect->left = bounds->left+bounds->width - rect->width;
  1550. if (rect->top + rect->height > bounds->top + bounds->height)
  1551. rect->top = bounds->top+bounds->height - rect->height;
  1552. rect->width &= ~15L;
  1553. rect->height &= ~15L;
  1554. if (SN9C102_PRESERVE_IMGSCALE) {
  1555. /* Calculate the actual scaling factor */
  1556. u32 a, b;
  1557. a = rect->width * rect->height;
  1558. b = pix_format->width * pix_format->height;
  1559. scale = b ? (u8)((a / b) < 4 ? 1 :
  1560. ((a / b) < 16 ? 2 : 4)) : 1;
  1561. } else
  1562. scale = 1;
  1563. if (cam->stream == STREAM_ON)
  1564. if ((err = sn9c102_stream_interrupt(cam)))
  1565. return err;
  1566. if (copy_to_user(arg, &crop, sizeof(crop))) {
  1567. cam->stream = stream;
  1568. return -EFAULT;
  1569. }
  1570. if (cam->module_param.force_munmap || cam->io == IO_READ)
  1571. sn9c102_release_buffers(cam);
  1572. err = sn9c102_set_crop(cam, rect);
  1573. if (s->set_crop)
  1574. err += s->set_crop(cam, rect);
  1575. err += sn9c102_set_scale(cam, scale);
  1576. if (err) { /* atomic, no rollback in ioctl() */
  1577. cam->state |= DEV_MISCONFIGURED;
  1578. DBG(1, "VIDIOC_S_CROP failed because of hardware "
  1579. "problems. To use the camera, close and open "
  1580. "/dev/video%d again.", cam->v4ldev->minor)
  1581. return -EIO;
  1582. }
  1583. s->pix_format.width = rect->width/scale;
  1584. s->pix_format.height = rect->height/scale;
  1585. memcpy(&(s->_rect), rect, sizeof(*rect));
  1586. if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
  1587. nbuffers != sn9c102_request_buffers(cam, nbuffers,
  1588. cam->io)) {
  1589. cam->state |= DEV_MISCONFIGURED;
  1590. DBG(1, "VIDIOC_S_CROP failed because of not enough "
  1591. "memory. To use the camera, close and open "
  1592. "/dev/video%d again.", cam->v4ldev->minor)
  1593. return -ENOMEM;
  1594. }
  1595. cam->stream = stream;
  1596. return 0;
  1597. }
  1598. case VIDIOC_ENUM_FMT:
  1599. {
  1600. struct v4l2_fmtdesc fmtd;
  1601. if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
  1602. return -EFAULT;
  1603. if (fmtd.index == 0) {
  1604. strcpy(fmtd.description, "bayer rgb");
  1605. fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8;
  1606. } else if (fmtd.index == 1) {
  1607. strcpy(fmtd.description, "compressed");
  1608. fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X;
  1609. fmtd.flags = V4L2_FMT_FLAG_COMPRESSED;
  1610. } else
  1611. return -EINVAL;
  1612. fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  1613. memset(&fmtd.reserved, 0, sizeof(fmtd.reserved));
  1614. if (copy_to_user(arg, &fmtd, sizeof(fmtd)))
  1615. return -EFAULT;
  1616. return 0;
  1617. }
  1618. case VIDIOC_G_FMT:
  1619. {
  1620. struct v4l2_format format;
  1621. struct v4l2_pix_format* pfmt = &(cam->sensor->pix_format);
  1622. if (copy_from_user(&format, arg, sizeof(format)))
  1623. return -EFAULT;
  1624. if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1625. return -EINVAL;
  1626. pfmt->bytesperline = (pfmt->pixelformat==V4L2_PIX_FMT_SN9C10X)
  1627. ? 0 : (pfmt->width * pfmt->priv) / 8;
  1628. pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8);
  1629. pfmt->field = V4L2_FIELD_NONE;
  1630. memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt));
  1631. if (copy_to_user(arg, &format, sizeof(format)))
  1632. return -EFAULT;
  1633. return 0;
  1634. }
  1635. case VIDIOC_TRY_FMT:
  1636. case VIDIOC_S_FMT:
  1637. {
  1638. struct sn9c102_sensor* s = cam->sensor;
  1639. struct v4l2_format format;
  1640. struct v4l2_pix_format* pix;
  1641. struct v4l2_pix_format* pfmt = &(s->pix_format);
  1642. struct v4l2_rect* bounds = &(s->cropcap.bounds);
  1643. struct v4l2_rect rect;
  1644. u8 scale;
  1645. const enum sn9c102_stream_state stream = cam->stream;
  1646. const u32 nbuffers = cam->nbuffers;
  1647. u32 i;
  1648. int err = 0;
  1649. if (copy_from_user(&format, arg, sizeof(format)))
  1650. return -EFAULT;
  1651. pix = &(format.fmt.pix);
  1652. if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1653. return -EINVAL;
  1654. memcpy(&rect, &(s->_rect), sizeof(rect));
  1655. { /* calculate the actual scaling factor */
  1656. u32 a, b;
  1657. a = rect.width * rect.height;
  1658. b = pix->width * pix->height;
  1659. scale = b ? (u8)((a / b) < 4 ? 1 :
  1660. ((a / b) < 16 ? 2 : 4)) : 1;
  1661. }
  1662. rect.width = scale * pix->width;
  1663. rect.height = scale * pix->height;
  1664. if (rect.width < 16)
  1665. rect.width = 16;
  1666. if (rect.height < 16)
  1667. rect.height = 16;
  1668. if (rect.width > bounds->left + bounds->width - rect.left)
  1669. rect.width = bounds->left + bounds->width - rect.left;
  1670. if (rect.height > bounds->top + bounds->height - rect.top)
  1671. rect.height = bounds->top + bounds->height - rect.top;
  1672. rect.width &= ~15L;
  1673. rect.height &= ~15L;
  1674. { /* adjust the scaling factor */
  1675. u32 a, b;
  1676. a = rect.width * rect.height;
  1677. b = pix->width * pix->height;
  1678. scale = b ? (u8)((a / b) < 4 ? 1 :
  1679. ((a / b) < 16 ? 2 : 4)) : 1;
  1680. }
  1681. pix->width = rect.width / scale;
  1682. pix->height = rect.height / scale;
  1683. if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X &&
  1684. pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
  1685. pix->pixelformat = pfmt->pixelformat;
  1686. pix->priv = pfmt->priv; /* bpp */
  1687. pix->colorspace = pfmt->colorspace;
  1688. pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X)
  1689. ? 0 : (pix->width * pix->priv) / 8;
  1690. pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8);
  1691. pix->field = V4L2_FIELD_NONE;
  1692. if (cmd == VIDIOC_TRY_FMT) {
  1693. if (copy_to_user(arg, &format, sizeof(format)))
  1694. return -EFAULT;
  1695. return 0;
  1696. }
  1697. if (cam->module_param.force_munmap)
  1698. for (i = 0; i < cam->nbuffers; i++)
  1699. if (cam->frame[i].vma_use_count) {
  1700. DBG(3, "VIDIOC_S_FMT failed. "
  1701. "Unmap the buffers first.")
  1702. return -EINVAL;
  1703. }
  1704. if (cam->stream == STREAM_ON)
  1705. if ((err = sn9c102_stream_interrupt(cam)))
  1706. return err;
  1707. if (copy_to_user(arg, &format, sizeof(format))) {
  1708. cam->stream = stream;
  1709. return -EFAULT;
  1710. }
  1711. if (cam->module_param.force_munmap || cam->io == IO_READ)
  1712. sn9c102_release_buffers(cam);
  1713. err += sn9c102_set_pix_format(cam, pix);
  1714. err += sn9c102_set_crop(cam, &rect);
  1715. if (s->set_pix_format)
  1716. err += s->set_pix_format(cam, pix);
  1717. if (s->set_crop)
  1718. err += s->set_crop(cam, &rect);
  1719. err += sn9c102_set_scale(cam, scale);
  1720. if (err) { /* atomic, no rollback in ioctl() */
  1721. cam->state |= DEV_MISCONFIGURED;
  1722. DBG(1, "VIDIOC_S_FMT failed because of hardware "
  1723. "problems. To use the camera, close and open "
  1724. "/dev/video%d again.", cam->v4ldev->minor)
  1725. return -EIO;
  1726. }
  1727. memcpy(pfmt, pix, sizeof(*pix));
  1728. memcpy(&(s->_rect), &rect, sizeof(rect));
  1729. if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
  1730. nbuffers != sn9c102_request_buffers(cam, nbuffers,
  1731. cam->io)) {
  1732. cam->state |= DEV_MISCONFIGURED;
  1733. DBG(1, "VIDIOC_S_FMT failed because of not enough "
  1734. "memory. To use the camera, close and open "
  1735. "/dev/video%d again.", cam->v4ldev->minor)
  1736. return -ENOMEM;
  1737. }
  1738. cam->stream = stream;
  1739. return 0;
  1740. }
  1741. case VIDIOC_G_JPEGCOMP:
  1742. {
  1743. if (copy_to_user(arg, &cam->compression,
  1744. sizeof(cam->compression)))
  1745. return -EFAULT;
  1746. return 0;
  1747. }
  1748. case VIDIOC_S_JPEGCOMP:
  1749. {
  1750. struct v4l2_jpegcompression jc;
  1751. const enum sn9c102_stream_state stream = cam->stream;
  1752. int err = 0;
  1753. if (copy_from_user(&jc, arg, sizeof(jc)))
  1754. return -EFAULT;
  1755. if (jc.quality != 0 && jc.quality != 1)
  1756. return -EINVAL;
  1757. if (cam->stream == STREAM_ON)
  1758. if ((err = sn9c102_stream_interrupt(cam)))
  1759. return err;
  1760. err += sn9c102_set_compression(cam, &jc);
  1761. if (err) { /* atomic, no rollback in ioctl() */
  1762. cam->state |= DEV_MISCONFIGURED;
  1763. DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
  1764. "problems. To use the camera, close and open "
  1765. "/dev/video%d again.", cam->v4ldev->minor)
  1766. return -EIO;
  1767. }
  1768. cam->compression.quality = jc.quality;
  1769. cam->stream = stream;
  1770. return 0;
  1771. }
  1772. case VIDIOC_REQBUFS:
  1773. {
  1774. struct v4l2_requestbuffers rb;
  1775. u32 i;
  1776. int err;
  1777. if (copy_from_user(&rb, arg, sizeof(rb)))
  1778. return -EFAULT;
  1779. if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
  1780. rb.memory != V4L2_MEMORY_MMAP)
  1781. return -EINVAL;
  1782. if (cam->io == IO_READ) {
  1783. DBG(3, "Close and open the device again to choose "
  1784. "the mmap I/O method")
  1785. return -EINVAL;
  1786. }
  1787. for (i = 0; i < cam->nbuffers; i++)
  1788. if (cam->frame[i].vma_use_count) {
  1789. DBG(3, "VIDIOC_REQBUFS failed. "
  1790. "Previous buffers are still mapped.")
  1791. return -EINVAL;
  1792. }
  1793. if (cam->stream == STREAM_ON)
  1794. if ((err = sn9c102_stream_interrupt(cam)))
  1795. return err;
  1796. sn9c102_empty_framequeues(cam);
  1797. sn9c102_release_buffers(cam);
  1798. if (rb.count)
  1799. rb.count = sn9c102_request_buffers(cam, rb.count,
  1800. IO_MMAP);
  1801. if (copy_to_user(arg, &rb, sizeof(rb))) {
  1802. sn9c102_release_buffers(cam);
  1803. cam->io = IO_NONE;
  1804. return -EFAULT;
  1805. }
  1806. cam->io = rb.count ? IO_MMAP : IO_NONE;
  1807. return 0;
  1808. }
  1809. case VIDIOC_QUERYBUF:
  1810. {
  1811. struct v4l2_buffer b;
  1812. if (copy_from_user(&b, arg, sizeof(b)))
  1813. return -EFAULT;
  1814. if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
  1815. b.index >= cam->nbuffers || cam->io != IO_MMAP)
  1816. return -EINVAL;
  1817. memcpy(&b, &cam->frame[b.index].buf, sizeof(b));
  1818. if (cam->frame[b.index].vma_use_count)
  1819. b.flags |= V4L2_BUF_FLAG_MAPPED;
  1820. if (cam->frame[b.index].state == F_DONE)
  1821. b.flags |= V4L2_BUF_FLAG_DONE;
  1822. else if (cam->frame[b.index].state != F_UNUSED)
  1823. b.flags |= V4L2_BUF_FLAG_QUEUED;
  1824. if (copy_to_user(arg, &b, sizeof(b)))
  1825. return -EFAULT;
  1826. return 0;
  1827. }
  1828. case VIDIOC_QBUF:
  1829. {
  1830. struct v4l2_buffer b;
  1831. unsigned long lock_flags;
  1832. if (copy_from_user(&b, arg, sizeof(b)))
  1833. return -EFAULT;
  1834. if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
  1835. b.index >= cam->nbuffers || cam->io != IO_MMAP)
  1836. return -EINVAL;
  1837. if (cam->frame[b.index].state != F_UNUSED)
  1838. return -EINVAL;
  1839. cam->frame[b.index].state = F_QUEUED;
  1840. spin_lock_irqsave(&cam->queue_lock, lock_flags);
  1841. list_add_tail(&cam->frame[b.index].frame, &cam->inqueue);
  1842. spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
  1843. PDBGG("Frame #%lu queued", (unsigned long)b.index)
  1844. return 0;
  1845. }
  1846. case VIDIOC_DQBUF:
  1847. {
  1848. struct v4l2_buffer b;
  1849. struct sn9c102_frame_t *f;
  1850. unsigned long lock_flags;
  1851. int err = 0;
  1852. if (copy_from_user(&b, arg, sizeof(b)))
  1853. return -EFAULT;
  1854. if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io!= IO_MMAP)
  1855. return -EINVAL;
  1856. if (list_empty(&cam->outqueue)) {
  1857. if (cam->stream == STREAM_OFF)
  1858. return -EINVAL;
  1859. if (filp->f_flags & O_NONBLOCK)
  1860. return -EAGAIN;
  1861. err = wait_event_interruptible
  1862. ( cam->wait_frame,
  1863. (!list_empty(&cam->outqueue)) ||
  1864. (cam->state & DEV_DISCONNECTED) ||
  1865. (cam->state & DEV_MISCONFIGURED) );
  1866. if (err)
  1867. return err;
  1868. if (cam->state & DEV_DISCONNECTED)
  1869. return -ENODEV;
  1870. if (cam->state & DEV_MISCONFIGURED)
  1871. return -EIO;
  1872. }
  1873. spin_lock_irqsave(&cam->queue_lock, lock_flags);
  1874. f = list_entry(cam->outqueue.next, struct sn9c102_frame_t,
  1875. frame);
  1876. list_del(cam->outqueue.next);
  1877. spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
  1878. f->state = F_UNUSED;
  1879. memcpy(&b, &f->buf, sizeof(b));
  1880. if (f->vma_use_count)
  1881. b.flags |= V4L2_BUF_FLAG_MAPPED;
  1882. if (copy_to_user(arg, &b, sizeof(b)))
  1883. return -EFAULT;
  1884. PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index)
  1885. return 0;
  1886. }
  1887. case VIDIOC_STREAMON:
  1888. {
  1889. int type;
  1890. if (copy_from_user(&type, arg, sizeof(type)))
  1891. return -EFAULT;
  1892. if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
  1893. return -EINVAL;
  1894. if (list_empty(&cam->inqueue))
  1895. return -EINVAL;
  1896. cam->stream = STREAM_ON;
  1897. DBG(3, "Stream on")
  1898. return 0;
  1899. }
  1900. case VIDIOC_STREAMOFF:
  1901. {
  1902. int type, err;
  1903. if (copy_from_user(&type, arg, sizeof(type)))
  1904. return -EFAULT;
  1905. if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
  1906. return -EINVAL;
  1907. if (cam->stream == STREAM_ON)
  1908. if ((err = sn9c102_stream_interrupt(cam)))
  1909. return err;
  1910. sn9c102_empty_framequeues(cam);
  1911. DBG(3, "Stream off")
  1912. return 0;
  1913. }
  1914. case VIDIOC_G_PARM:
  1915. {
  1916. struct v4l2_streamparm sp;
  1917. if (copy_from_user(&sp, arg, sizeof(sp)))
  1918. return -EFAULT;
  1919. if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1920. return -EINVAL;
  1921. sp.parm.capture.extendedmode = 0;
  1922. sp.parm.capture.readbuffers = cam->nreadbuffers;
  1923. if (copy_to_user(arg, &sp, sizeof(sp)))
  1924. return -EFAULT;
  1925. return 0;
  1926. }
  1927. case VIDIOC_S_PARM_OLD:
  1928. case VIDIOC_S_PARM:
  1929. {
  1930. struct v4l2_streamparm sp;
  1931. if (copy_from_user(&sp, arg, sizeof(sp)))
  1932. return -EFAULT;
  1933. if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
  1934. return -EINVAL;
  1935. sp.parm.capture.extendedmode = 0;
  1936. if (sp.parm.capture.readbuffers == 0)
  1937. sp.parm.capture.readbuffers = cam->nreadbuffers;
  1938. if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES)
  1939. sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES;
  1940. if (copy_to_user(arg, &sp, sizeof(sp)))
  1941. return -EFAULT;
  1942. cam->nreadbuffers = sp.parm.capture.readbuffers;
  1943. return 0;
  1944. }
  1945. case VIDIOC_G_STD:
  1946. case VIDIOC_S_STD:
  1947. case VIDIOC_QUERYSTD:
  1948. case VIDIOC_ENUMSTD:
  1949. case VIDIOC_QUERYMENU:
  1950. return -EINVAL;
  1951. default:
  1952. return -EINVAL;
  1953. }
  1954. }
  1955. static int sn9c102_ioctl(struct inode* inode, struct file* filp,
  1956. unsigned int cmd, unsigned long arg)
  1957. {
  1958. struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
  1959. int err = 0;
  1960. if (down_interruptible(&cam->fileop_sem))
  1961. return -ERESTARTSYS;
  1962. if (cam->state & DEV_DISCONNECTED) {
  1963. DBG(1, "Device not present")
  1964. up(&cam->fileop_sem);
  1965. return -ENODEV;
  1966. }
  1967. if (cam->state & DEV_MISCONFIGURED) {
  1968. DBG(1, "The camera is misconfigured. Close and open it again.")
  1969. up(&cam->fileop_sem);
  1970. return -EIO;
  1971. }
  1972. err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
  1973. up(&cam->fileop_sem);
  1974. return err;
  1975. }
  1976. static struct file_operations sn9c102_fops = {
  1977. .owner = THIS_MODULE,
  1978. .open = sn9c102_open,
  1979. .release = sn9c102_release,
  1980. .ioctl = sn9c102_ioctl,
  1981. .read = sn9c102_read,
  1982. .poll = sn9c102_poll,
  1983. .mmap = sn9c102_mmap,
  1984. .llseek = no_llseek,
  1985. };
  1986. /*****************************************************************************/
  1987. /* It exists a single interface only. We do not need to validate anything. */
  1988. static int
  1989. sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
  1990. {
  1991. struct usb_device *udev = interface_to_usbdev(intf);
  1992. struct sn9c102_device* cam;
  1993. static unsigned int dev_nr = 0;
  1994. unsigned int i, n;
  1995. int err = 0, r;
  1996. n = sizeof(sn9c102_id_table)/sizeof(sn9c102_id_table[0]);
  1997. for (i = 0; i < n-1; i++)
  1998. if (le16_to_cpu(udev->descriptor.idVendor) ==
  1999. sn9c102_id_table[i].idVendor &&
  2000. le16_to_cpu(udev->descriptor.idProduct) ==
  2001. sn9c102_id_table[i].idProduct)
  2002. break;
  2003. if (i == n-1)
  2004. return -ENODEV;
  2005. if (!(cam = kmalloc(sizeof(struct sn9c102_device), GFP_KERNEL)))
  2006. return -ENOMEM;
  2007. memset(cam, 0, sizeof(*cam));
  2008. cam->usbdev = udev;
  2009. memcpy(&cam->dev, &udev->dev, sizeof(struct device));
  2010. if (!(cam->control_buffer = kmalloc(8, GFP_KERNEL))) {
  2011. DBG(1, "kmalloc() failed")
  2012. err = -ENOMEM;
  2013. goto fail;
  2014. }
  2015. memset(cam->control_buffer, 0, 8);
  2016. if (!(cam->v4ldev = video_device_alloc())) {
  2017. DBG(1, "video_device_alloc() failed")
  2018. err = -ENOMEM;
  2019. goto fail;
  2020. }
  2021. init_MUTEX(&cam->dev_sem);
  2022. r = sn9c102_read_reg(cam, 0x00);
  2023. if (r < 0 || r != 0x10) {
  2024. DBG(1, "Sorry, this is not a SN9C10x based camera "
  2025. "(vid/pid 0x%04X/0x%04X)",
  2026. sn9c102_id_table[i].idVendor,sn9c102_id_table[i].idProduct)
  2027. err = -ENODEV;
  2028. goto fail;
  2029. }
  2030. cam->bridge = (sn9c102_id_table[i].idProduct & 0xffc0) == 0x6080 ?
  2031. BRIDGE_SN9C103 : BRIDGE_SN9C102;
  2032. switch (cam->bridge) {
  2033. case BRIDGE_SN9C101:
  2034. case BRIDGE_SN9C102:
  2035. DBG(2, "SN9C10[12] PC Camera Controller detected "
  2036. "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor,
  2037. sn9c102_id_table[i].idProduct)
  2038. break;
  2039. case BRIDGE_SN9C103:
  2040. DBG(2, "SN9C103 PC Camera Controller detected "
  2041. "(vid/pid 0x%04X/0x%04X)", sn9c102_id_table[i].idVendor,
  2042. sn9c102_id_table[i].idProduct)
  2043. break;
  2044. }
  2045. for (i = 0; sn9c102_sensor_table[i]; i++) {
  2046. err = sn9c102_sensor_table[i](cam);
  2047. if (!err)
  2048. break;
  2049. }
  2050. if (!err && cam->sensor) {
  2051. DBG(2, "%s image sensor detected", cam->sensor->name)
  2052. DBG(3, "Support for %s maintained by %s",
  2053. cam->sensor->name, cam->sensor->maintainer)
  2054. } else {
  2055. DBG(1, "No supported image sensor detected")
  2056. err = -ENODEV;
  2057. goto fail;
  2058. }
  2059. if (sn9c102_init(cam)) {
  2060. DBG(1, "Initialization failed. I will retry on open().")
  2061. cam->state |= DEV_MISCONFIGURED;
  2062. }
  2063. strcpy(cam->v4ldev->name, "SN9C10x PC Camera");
  2064. cam->v4ldev->owner = THIS_MODULE;
  2065. cam->v4ldev->type = VID_TYPE_CAPTURE | VID_TYPE_SCALES;
  2066. cam->v4ldev->hardware = VID_HARDWARE_SN9C102;
  2067. cam->v4ldev->fops = &sn9c102_fops;
  2068. cam->v4ldev->minor = video_nr[dev_nr];
  2069. cam->v4ldev->release = video_device_release;
  2070. video_set_drvdata(cam->v4ldev, cam);
  2071. down(&cam->dev_sem);
  2072. err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
  2073. video_nr[dev_nr]);
  2074. if (err) {
  2075. DBG(1, "V4L2 device registration failed")
  2076. if (err == -ENFILE && video_nr[dev_nr] == -1)
  2077. DBG(1, "Free /dev/videoX node not found")
  2078. video_nr[dev_nr] = -1;
  2079. dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
  2080. up(&cam->dev_sem);
  2081. goto fail;
  2082. }
  2083. DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor)
  2084. cam->module_param.force_munmap = force_munmap[dev_nr];
  2085. dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
  2086. sn9c102_create_sysfs(cam);
  2087. DBG(2, "Optional device control through 'sysfs' interface ready")
  2088. usb_set_intfdata(intf, cam);
  2089. up(&cam->dev_sem);
  2090. return 0;
  2091. fail:
  2092. if (cam) {
  2093. kfree(cam->control_buffer);
  2094. if (cam->v4ldev)
  2095. video_device_release(cam->v4ldev);
  2096. kfree(cam);
  2097. }
  2098. return err;
  2099. }
  2100. static void sn9c102_usb_disconnect(struct usb_interface* intf)
  2101. {
  2102. struct sn9c102_device* cam = usb_get_intfdata(intf);
  2103. if (!cam)
  2104. return;
  2105. down_write(&sn9c102_disconnect);
  2106. down(&cam->dev_sem);
  2107. DBG(2, "Disconnecting %s...", cam->v4ldev->name)
  2108. wake_up_interruptible_all(&cam->open);
  2109. if (cam->users) {
  2110. DBG(2, "Device /dev/video%d is open! Deregistration and "
  2111. "memory deallocation are deferred on close.",
  2112. cam->v4ldev->minor)
  2113. cam->state |= DEV_MISCONFIGURED;
  2114. sn9c102_stop_transfer(cam);
  2115. cam->state |= DEV_DISCONNECTED;
  2116. wake_up_interruptible(&cam->wait_frame);
  2117. wake_up_interruptible(&cam->wait_stream);
  2118. } else {
  2119. cam->state |= DEV_DISCONNECTED;
  2120. sn9c102_release_resources(cam);
  2121. }
  2122. up(&cam->dev_sem);
  2123. if (!cam->users)
  2124. kfree(cam);
  2125. up_write(&sn9c102_disconnect);
  2126. }
  2127. static struct usb_driver sn9c102_usb_driver = {
  2128. .owner = THIS_MODULE,
  2129. .name = "sn9c102",
  2130. .id_table = sn9c102_id_table,
  2131. .probe = sn9c102_usb_probe,
  2132. .disconnect = sn9c102_usb_disconnect,
  2133. };
  2134. /*****************************************************************************/
  2135. static int __init sn9c102_module_init(void)
  2136. {
  2137. int err = 0;
  2138. KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION)
  2139. KDBG(3, SN9C102_MODULE_AUTHOR)
  2140. if ((err = usb_register(&sn9c102_usb_driver)))
  2141. KDBG(1, "usb_register() failed")
  2142. return err;
  2143. }
  2144. static void __exit sn9c102_module_exit(void)
  2145. {
  2146. usb_deregister(&sn9c102_usb_driver);
  2147. }
  2148. module_init(sn9c102_module_init);
  2149. module_exit(sn9c102_module_exit);