ccs-core.c 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * drivers/media/i2c/ccs/ccs-core.c
  4. *
  5. * Generic driver for MIPI CCS/SMIA/SMIA++ compliant camera sensors
  6. *
  7. * Copyright (C) 2020 Intel Corporation
  8. * Copyright (C) 2010--2012 Nokia Corporation
  9. * Contact: Sakari Ailus <sakari.ailus@linux.intel.com>
  10. *
  11. * Based on smiapp driver by Vimarsh Zutshi
  12. * Based on jt8ev1.c by Vimarsh Zutshi
  13. * Based on smia-sensor.c by Tuukka Toivonen <tuukkat76@gmail.com>
  14. */
  15. #include <linux/bits.h>
  16. #include <linux/clk.h>
  17. #include <linux/delay.h>
  18. #include <linux/device.h>
  19. #include <linux/firmware.h>
  20. #include <linux/gpio/consumer.h>
  21. #include <linux/module.h>
  22. #include <linux/pm_runtime.h>
  23. #include <linux/property.h>
  24. #include <linux/regulator/consumer.h>
  25. #include <linux/slab.h>
  26. #include <linux/smiapp.h>
  27. #include <linux/v4l2-mediabus.h>
  28. #include <media/mipi-csi2.h>
  29. #include <media/v4l2-cci.h>
  30. #include <media/v4l2-device.h>
  31. #include <media/v4l2-fwnode.h>
  32. #include <uapi/linux/ccs.h>
  33. #include "ccs.h"
  34. #define CCS_ALIGN_DIM(dim, flags) \
  35. ((flags) & V4L2_SEL_FLAG_GE \
  36. ? ALIGN((dim), 2) \
  37. : (dim) & ~1)
  38. static struct ccs_limit_offset {
  39. u16 lim;
  40. u16 info;
  41. } ccs_limit_offsets[CCS_L_LAST + 1];
  42. /*
  43. * ccs_module_idents - supported camera modules
  44. */
  45. static const struct ccs_module_ident ccs_module_idents[] = {
  46. CCS_IDENT_L(0x01, 0x022b, -1, "vs6555"),
  47. CCS_IDENT_L(0x01, 0x022e, -1, "vw6558"),
  48. CCS_IDENT_L(0x07, 0x7698, -1, "ovm7698"),
  49. CCS_IDENT_L(0x0b, 0x4242, -1, "smiapp-003"),
  50. CCS_IDENT_L(0x0c, 0x208a, -1, "tcm8330md"),
  51. CCS_IDENT_LQ(0x0c, 0x2134, -1, "tcm8500md", &smiapp_tcm8500md_quirk),
  52. CCS_IDENT_L(0x0c, 0x213e, -1, "et8en2"),
  53. CCS_IDENT_L(0x0c, 0x2184, -1, "tcm8580md"),
  54. CCS_IDENT_LQ(0x0c, 0x560f, -1, "jt8ew9", &smiapp_jt8ew9_quirk),
  55. CCS_IDENT_LQ(0x10, 0x4141, -1, "jt8ev1", &smiapp_jt8ev1_quirk),
  56. CCS_IDENT_LQ(0x10, 0x4241, -1, "imx125es", &smiapp_imx125es_quirk),
  57. };
  58. #define CCS_DEVICE_FLAG_IS_SMIA BIT(0)
  59. struct ccs_device {
  60. unsigned char flags;
  61. };
  62. static const char * const ccs_regulators[] = { "vcore", "vio", "vana" };
  63. /*
  64. *
  65. * Dynamic Capability Identification
  66. *
  67. */
  68. static void ccs_assign_limit(void *ptr, unsigned int width, u32 val)
  69. {
  70. switch (width) {
  71. case sizeof(u8):
  72. *(u8 *)ptr = val;
  73. break;
  74. case sizeof(u16):
  75. *(u16 *)ptr = val;
  76. break;
  77. case sizeof(u32):
  78. *(u32 *)ptr = val;
  79. break;
  80. }
  81. }
  82. static int ccs_limit_ptr(struct ccs_sensor *sensor, unsigned int limit,
  83. unsigned int offset, void **__ptr)
  84. {
  85. const struct ccs_limit *linfo;
  86. if (WARN_ON(limit >= CCS_L_LAST))
  87. return -EINVAL;
  88. linfo = &ccs_limits[ccs_limit_offsets[limit].info];
  89. if (WARN_ON(!sensor->ccs_limits) ||
  90. WARN_ON(offset + CCI_REG_WIDTH_BYTES(linfo->reg) >
  91. ccs_limit_offsets[limit + 1].lim))
  92. return -EINVAL;
  93. *__ptr = sensor->ccs_limits + ccs_limit_offsets[limit].lim + offset;
  94. return 0;
  95. }
  96. void ccs_replace_limit(struct ccs_sensor *sensor,
  97. unsigned int limit, unsigned int offset, u32 val)
  98. {
  99. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  100. const struct ccs_limit *linfo;
  101. void *ptr;
  102. int ret;
  103. ret = ccs_limit_ptr(sensor, limit, offset, &ptr);
  104. if (ret)
  105. return;
  106. linfo = &ccs_limits[ccs_limit_offsets[limit].info];
  107. dev_dbg(&client->dev, "quirk: 0x%8.8x \"%s\" %u = %u, 0x%x\n",
  108. linfo->reg, linfo->name, offset, val, val);
  109. ccs_assign_limit(ptr, CCI_REG_WIDTH_BYTES(linfo->reg), val);
  110. }
  111. u32 ccs_get_limit(struct ccs_sensor *sensor, unsigned int limit,
  112. unsigned int offset)
  113. {
  114. void *ptr;
  115. u32 val;
  116. int ret;
  117. ret = ccs_limit_ptr(sensor, limit, offset, &ptr);
  118. if (ret)
  119. return 0;
  120. switch (CCI_REG_WIDTH_BYTES(ccs_limits[ccs_limit_offsets[limit].info].reg)) {
  121. case sizeof(u8):
  122. val = *(u8 *)ptr;
  123. break;
  124. case sizeof(u16):
  125. val = *(u16 *)ptr;
  126. break;
  127. case sizeof(u32):
  128. val = *(u32 *)ptr;
  129. break;
  130. default:
  131. WARN_ON(1);
  132. return 0;
  133. }
  134. return ccs_reg_conv(sensor, ccs_limits[limit].reg, val);
  135. }
  136. static int ccs_read_all_limits(struct ccs_sensor *sensor)
  137. {
  138. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  139. void *ptr, *alloc, *end;
  140. unsigned int i, l;
  141. int ret;
  142. kfree(sensor->ccs_limits);
  143. sensor->ccs_limits = NULL;
  144. alloc = kzalloc(ccs_limit_offsets[CCS_L_LAST].lim, GFP_KERNEL);
  145. if (!alloc)
  146. return -ENOMEM;
  147. end = alloc + ccs_limit_offsets[CCS_L_LAST].lim;
  148. sensor->ccs_limits = alloc;
  149. for (i = 0, l = 0, ptr = alloc; ccs_limits[i].size; i++) {
  150. u32 reg = ccs_limits[i].reg;
  151. unsigned int width = CCI_REG_WIDTH_BYTES(reg);
  152. unsigned int j;
  153. if (l == CCS_L_LAST) {
  154. dev_err(&client->dev,
  155. "internal error --- end of limit array\n");
  156. ret = -EINVAL;
  157. goto out_err;
  158. }
  159. for (j = 0; j < ccs_limits[i].size / width;
  160. j++, reg += width, ptr += width) {
  161. char str[16] = "";
  162. u32 val;
  163. ret = ccs_read_addr_noconv(sensor, reg, &val);
  164. if (ret)
  165. goto out_err;
  166. if (ptr + width > end) {
  167. dev_err(&client->dev,
  168. "internal error --- no room for regs\n");
  169. ret = -EINVAL;
  170. goto out_err;
  171. }
  172. if (!val && j)
  173. break;
  174. ccs_assign_limit(ptr, width, val);
  175. #ifdef CONFIG_DYNAMIC_DEBUG
  176. if (reg & (CCS_FL_FLOAT_IREAL | CCS_FL_IREAL))
  177. snprintf(str, sizeof(str), ", %u",
  178. ccs_reg_conv(sensor, reg, val));
  179. #endif
  180. dev_dbg(&client->dev,
  181. "0x%8.8x \"%s\" = %u, 0x%x%s\n",
  182. reg, ccs_limits[i].name, val, val, str);
  183. }
  184. if (ccs_limits[i].flags & CCS_L_FL_SAME_REG)
  185. continue;
  186. l++;
  187. ptr = alloc + ccs_limit_offsets[l].lim;
  188. }
  189. if (l != CCS_L_LAST) {
  190. dev_err(&client->dev,
  191. "internal error --- insufficient limits\n");
  192. ret = -EINVAL;
  193. goto out_err;
  194. }
  195. if (CCS_LIM(sensor, SCALER_N_MIN) < 16)
  196. ccs_replace_limit(sensor, CCS_L_SCALER_N_MIN, 0, 16);
  197. return 0;
  198. out_err:
  199. sensor->ccs_limits = NULL;
  200. kfree(alloc);
  201. return ret;
  202. }
  203. static u8 ccs_mipi_csi2_data_type(unsigned int bpp)
  204. {
  205. switch (bpp) {
  206. case 6:
  207. return MIPI_CSI2_DT_RAW6;
  208. case 7:
  209. return MIPI_CSI2_DT_RAW7;
  210. case 8:
  211. return MIPI_CSI2_DT_RAW8;
  212. case 10:
  213. return MIPI_CSI2_DT_RAW10;
  214. case 12:
  215. return MIPI_CSI2_DT_RAW12;
  216. case 14:
  217. return MIPI_CSI2_DT_RAW14;
  218. case 16:
  219. return MIPI_CSI2_DT_RAW16;
  220. case 20:
  221. return MIPI_CSI2_DT_RAW20;
  222. case 24:
  223. return MIPI_CSI2_DT_RAW24;
  224. default:
  225. WARN_ON(1);
  226. return 0;
  227. }
  228. }
  229. static int ccs_read_frame_fmt(struct ccs_sensor *sensor)
  230. {
  231. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  232. u8 fmt_model_type, fmt_model_subtype, ncol_desc, nrow_desc;
  233. unsigned int i;
  234. int pixel_count = 0;
  235. int line_count = 0;
  236. fmt_model_type = CCS_LIM(sensor, FRAME_FORMAT_MODEL_TYPE);
  237. fmt_model_subtype = CCS_LIM(sensor, FRAME_FORMAT_MODEL_SUBTYPE);
  238. ncol_desc = (fmt_model_subtype
  239. & CCS_FRAME_FORMAT_MODEL_SUBTYPE_COLUMNS_MASK)
  240. >> CCS_FRAME_FORMAT_MODEL_SUBTYPE_COLUMNS_SHIFT;
  241. nrow_desc = fmt_model_subtype
  242. & CCS_FRAME_FORMAT_MODEL_SUBTYPE_ROWS_MASK;
  243. dev_dbg(&client->dev, "format_model_type %s\n",
  244. fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_2_BYTE
  245. ? "2 byte" :
  246. fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_4_BYTE
  247. ? "4 byte" : "is simply bad");
  248. dev_dbg(&client->dev, "%u column and %u row descriptors\n",
  249. ncol_desc, nrow_desc);
  250. for (i = 0; i < ncol_desc + nrow_desc; i++) {
  251. u32 desc;
  252. u32 pixelcode;
  253. u32 pixels;
  254. char *which;
  255. char *what;
  256. if (fmt_model_type == CCS_FRAME_FORMAT_MODEL_TYPE_2_BYTE) {
  257. desc = CCS_LIM_AT(sensor, FRAME_FORMAT_DESCRIPTOR, i);
  258. pixelcode =
  259. (desc
  260. & CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_MASK)
  261. >> CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_SHIFT;
  262. pixels = desc & CCS_FRAME_FORMAT_DESCRIPTOR_PIXELS_MASK;
  263. } else if (fmt_model_type
  264. == CCS_FRAME_FORMAT_MODEL_TYPE_4_BYTE) {
  265. desc = CCS_LIM_AT(sensor, FRAME_FORMAT_DESCRIPTOR_4, i);
  266. pixelcode =
  267. (desc
  268. & CCS_FRAME_FORMAT_DESCRIPTOR_4_PCODE_MASK)
  269. >> CCS_FRAME_FORMAT_DESCRIPTOR_4_PCODE_SHIFT;
  270. pixels = desc &
  271. CCS_FRAME_FORMAT_DESCRIPTOR_4_PIXELS_MASK;
  272. } else {
  273. dev_dbg(&client->dev,
  274. "invalid frame format model type %u\n",
  275. fmt_model_type);
  276. return -EINVAL;
  277. }
  278. if (i < ncol_desc)
  279. which = "columns";
  280. else
  281. which = "rows";
  282. switch (pixelcode) {
  283. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_EMBEDDED:
  284. what = "embedded";
  285. break;
  286. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_DUMMY_PIXEL:
  287. what = "dummy";
  288. break;
  289. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_BLACK_PIXEL:
  290. what = "black";
  291. break;
  292. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_DARK_PIXEL:
  293. what = "dark";
  294. break;
  295. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL:
  296. what = "visible";
  297. break;
  298. default:
  299. what = "invalid";
  300. break;
  301. }
  302. dev_dbg(&client->dev,
  303. "%s pixels: %u %s (pixelcode %u)\n",
  304. what, pixels, which, pixelcode);
  305. if (i < ncol_desc) {
  306. if (pixelcode ==
  307. CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL)
  308. sensor->visible_pixel_start = pixel_count;
  309. pixel_count += pixels;
  310. continue;
  311. }
  312. /* Handle row descriptors */
  313. switch (pixelcode) {
  314. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_EMBEDDED:
  315. if (sensor->embedded_end)
  316. break;
  317. sensor->embedded_start = line_count;
  318. sensor->embedded_end = line_count + pixels;
  319. break;
  320. case CCS_FRAME_FORMAT_DESCRIPTOR_PCODE_VISIBLE_PIXEL:
  321. sensor->image_start = line_count;
  322. break;
  323. }
  324. line_count += pixels;
  325. }
  326. if (sensor->embedded_end > sensor->image_start) {
  327. dev_dbg(&client->dev,
  328. "adjusting image start line to %u (was %u)\n",
  329. sensor->embedded_end, sensor->image_start);
  330. sensor->image_start = sensor->embedded_end;
  331. }
  332. dev_dbg(&client->dev, "embedded data from lines %u to %u\n",
  333. sensor->embedded_start, sensor->embedded_end);
  334. dev_dbg(&client->dev, "image data starts at line %u\n",
  335. sensor->image_start);
  336. return 0;
  337. }
  338. static int ccs_pll_configure(struct ccs_sensor *sensor)
  339. {
  340. struct ccs_pll *pll = &sensor->pll;
  341. int rval;
  342. rval = ccs_write(sensor, VT_PIX_CLK_DIV, pll->vt_bk.pix_clk_div);
  343. if (rval < 0)
  344. return rval;
  345. rval = ccs_write(sensor, VT_SYS_CLK_DIV, pll->vt_bk.sys_clk_div);
  346. if (rval < 0)
  347. return rval;
  348. rval = ccs_write(sensor, PRE_PLL_CLK_DIV, pll->vt_fr.pre_pll_clk_div);
  349. if (rval < 0)
  350. return rval;
  351. rval = ccs_write(sensor, PLL_MULTIPLIER, pll->vt_fr.pll_multiplier);
  352. if (rval < 0)
  353. return rval;
  354. if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
  355. CCS_PHY_CTRL_CAPABILITY_AUTO_PHY_CTL)) {
  356. /* Lane op clock ratio does not apply here. */
  357. rval = ccs_write(sensor, REQUESTED_LINK_RATE,
  358. DIV_ROUND_UP(pll->op_bk.sys_clk_freq_hz,
  359. 1000000 / 256 / 256) *
  360. (pll->flags & CCS_PLL_FLAG_LANE_SPEED_MODEL ?
  361. sensor->pll.csi2.lanes : 1) <<
  362. (pll->flags & CCS_PLL_FLAG_OP_SYS_DDR ?
  363. 1 : 0));
  364. if (rval < 0)
  365. return rval;
  366. }
  367. if (sensor->pll.flags & CCS_PLL_FLAG_NO_OP_CLOCKS)
  368. return 0;
  369. rval = ccs_write(sensor, OP_PIX_CLK_DIV, pll->op_bk.pix_clk_div);
  370. if (rval < 0)
  371. return rval;
  372. rval = ccs_write(sensor, OP_SYS_CLK_DIV, pll->op_bk.sys_clk_div);
  373. if (rval < 0)
  374. return rval;
  375. if (!(pll->flags & CCS_PLL_FLAG_DUAL_PLL))
  376. return 0;
  377. rval = ccs_write(sensor, PLL_MODE, CCS_PLL_MODE_DUAL);
  378. if (rval < 0)
  379. return rval;
  380. rval = ccs_write(sensor, OP_PRE_PLL_CLK_DIV,
  381. pll->op_fr.pre_pll_clk_div);
  382. if (rval < 0)
  383. return rval;
  384. return ccs_write(sensor, OP_PLL_MULTIPLIER, pll->op_fr.pll_multiplier);
  385. }
  386. static int ccs_pll_try(struct ccs_sensor *sensor, struct ccs_pll *pll)
  387. {
  388. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  389. struct ccs_pll_limits lim = {
  390. .vt_fr = {
  391. .min_pre_pll_clk_div = CCS_LIM(sensor, MIN_PRE_PLL_CLK_DIV),
  392. .max_pre_pll_clk_div = CCS_LIM(sensor, MAX_PRE_PLL_CLK_DIV),
  393. .min_pll_ip_clk_freq_hz = CCS_LIM(sensor, MIN_PLL_IP_CLK_FREQ_MHZ),
  394. .max_pll_ip_clk_freq_hz = CCS_LIM(sensor, MAX_PLL_IP_CLK_FREQ_MHZ),
  395. .min_pll_multiplier = CCS_LIM(sensor, MIN_PLL_MULTIPLIER),
  396. .max_pll_multiplier = CCS_LIM(sensor, MAX_PLL_MULTIPLIER),
  397. .min_pll_op_clk_freq_hz = CCS_LIM(sensor, MIN_PLL_OP_CLK_FREQ_MHZ),
  398. .max_pll_op_clk_freq_hz = CCS_LIM(sensor, MAX_PLL_OP_CLK_FREQ_MHZ),
  399. },
  400. .op_fr = {
  401. .min_pre_pll_clk_div = CCS_LIM(sensor, MIN_OP_PRE_PLL_CLK_DIV),
  402. .max_pre_pll_clk_div = CCS_LIM(sensor, MAX_OP_PRE_PLL_CLK_DIV),
  403. .min_pll_ip_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PLL_IP_CLK_FREQ_MHZ),
  404. .max_pll_ip_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PLL_IP_CLK_FREQ_MHZ),
  405. .min_pll_multiplier = CCS_LIM(sensor, MIN_OP_PLL_MULTIPLIER),
  406. .max_pll_multiplier = CCS_LIM(sensor, MAX_OP_PLL_MULTIPLIER),
  407. .min_pll_op_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PLL_OP_CLK_FREQ_MHZ),
  408. .max_pll_op_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PLL_OP_CLK_FREQ_MHZ),
  409. },
  410. .op_bk = {
  411. .min_sys_clk_div = CCS_LIM(sensor, MIN_OP_SYS_CLK_DIV),
  412. .max_sys_clk_div = CCS_LIM(sensor, MAX_OP_SYS_CLK_DIV),
  413. .min_pix_clk_div = CCS_LIM(sensor, MIN_OP_PIX_CLK_DIV),
  414. .max_pix_clk_div = CCS_LIM(sensor, MAX_OP_PIX_CLK_DIV),
  415. .min_sys_clk_freq_hz = CCS_LIM(sensor, MIN_OP_SYS_CLK_FREQ_MHZ),
  416. .max_sys_clk_freq_hz = CCS_LIM(sensor, MAX_OP_SYS_CLK_FREQ_MHZ),
  417. .min_pix_clk_freq_hz = CCS_LIM(sensor, MIN_OP_PIX_CLK_FREQ_MHZ),
  418. .max_pix_clk_freq_hz = CCS_LIM(sensor, MAX_OP_PIX_CLK_FREQ_MHZ),
  419. },
  420. .vt_bk = {
  421. .min_sys_clk_div = CCS_LIM(sensor, MIN_VT_SYS_CLK_DIV),
  422. .max_sys_clk_div = CCS_LIM(sensor, MAX_VT_SYS_CLK_DIV),
  423. .min_pix_clk_div = CCS_LIM(sensor, MIN_VT_PIX_CLK_DIV),
  424. .max_pix_clk_div = CCS_LIM(sensor, MAX_VT_PIX_CLK_DIV),
  425. .min_sys_clk_freq_hz = CCS_LIM(sensor, MIN_VT_SYS_CLK_FREQ_MHZ),
  426. .max_sys_clk_freq_hz = CCS_LIM(sensor, MAX_VT_SYS_CLK_FREQ_MHZ),
  427. .min_pix_clk_freq_hz = CCS_LIM(sensor, MIN_VT_PIX_CLK_FREQ_MHZ),
  428. .max_pix_clk_freq_hz = CCS_LIM(sensor, MAX_VT_PIX_CLK_FREQ_MHZ),
  429. },
  430. .min_line_length_pck_bin = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN),
  431. .min_line_length_pck = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK),
  432. };
  433. return ccs_pll_calculate(&client->dev, &lim, pll);
  434. }
  435. static void
  436. ccs_get_binning(struct ccs_sensor *sensor, u8 *binning_mode, u8 *binh, u8 *binv)
  437. {
  438. struct v4l2_subdev_state *state =
  439. v4l2_subdev_get_locked_active_state(&sensor->binner->sd);
  440. const struct v4l2_rect *sink_crop =
  441. v4l2_subdev_state_get_crop(state, CCS_PAD_SINK,
  442. CCS_STREAM_PIXEL);
  443. const struct v4l2_rect *sink_comp =
  444. v4l2_subdev_state_get_compose(state, CCS_PAD_SINK,
  445. CCS_STREAM_PIXEL);
  446. if (binning_mode)
  447. *binning_mode = sink_crop->width == sink_comp->width &&
  448. sink_crop->height == sink_comp->height ? 0 : 1;
  449. *binh = sink_crop->width / sink_comp->width;
  450. *binv = sink_crop->height / sink_comp->height;
  451. }
  452. static void ccs_get_scaling(struct ccs_sensor *sensor, u8 *scaling_mode,
  453. u8 *scale_m)
  454. {
  455. struct v4l2_subdev_state *state =
  456. v4l2_subdev_get_locked_active_state(&sensor->scaler->sd);
  457. const struct v4l2_rect *sink_crop =
  458. v4l2_subdev_state_get_crop(state, CCS_PAD_SINK,
  459. CCS_STREAM_PIXEL);
  460. const struct v4l2_rect *sink_comp =
  461. v4l2_subdev_state_get_compose(state, CCS_PAD_SINK,
  462. CCS_STREAM_PIXEL);
  463. *scale_m = sink_crop->width * CCS_LIM(sensor, SCALER_N_MIN) /
  464. sink_comp->width;
  465. if (!scaling_mode)
  466. return;
  467. if (sink_crop->width == sink_comp->width)
  468. *scaling_mode = CCS_SCALING_MODE_NO_SCALING;
  469. else if (sink_crop->height == sink_comp->height)
  470. *scaling_mode = CCS_SCALING_MODE_HORIZONTAL;
  471. else
  472. *scaling_mode = SMIAPP_SCALING_MODE_BOTH;
  473. }
  474. static int ccs_pll_update(struct ccs_sensor *sensor)
  475. {
  476. struct ccs_pll *pll = &sensor->pll;
  477. u8 binh, binv;
  478. u8 scale_m;
  479. int rval;
  480. ccs_get_binning(sensor, NULL, &binh, &binv);
  481. if (sensor->scaler)
  482. ccs_get_scaling(sensor, NULL, &scale_m);
  483. else
  484. scale_m = CCS_LIM(sensor, SCALER_N_MIN);
  485. pll->binning_horizontal = binh;
  486. pll->binning_vertical = binv;
  487. pll->link_freq =
  488. sensor->link_freq->qmenu_int[sensor->link_freq->val];
  489. pll->scale_m = scale_m;
  490. pll->bits_per_pixel = sensor->csi_format->compressed;
  491. rval = ccs_pll_try(sensor, pll);
  492. if (rval < 0)
  493. return rval;
  494. __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
  495. pll->pixel_rate_pixel_array);
  496. __v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
  497. return 0;
  498. }
  499. /*
  500. *
  501. * V4L2 Controls handling
  502. *
  503. */
  504. static void __ccs_update_exposure_limits(struct ccs_sensor *sensor,
  505. const struct v4l2_rect *pa_src)
  506. {
  507. struct v4l2_ctrl *ctrl = sensor->exposure;
  508. int max;
  509. max = pa_src->height + sensor->vblank->val -
  510. CCS_LIM(sensor, COARSE_INTEGRATION_TIME_MAX_MARGIN);
  511. __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max, ctrl->step, max);
  512. }
  513. /*
  514. * Order matters.
  515. *
  516. * 1. Bits-per-pixel, descending.
  517. * 2. Bits-per-pixel compressed, descending.
  518. * 3. Pixel order, same as in pixel_order_str. Formats for all four pixel
  519. * orders must be defined.
  520. */
  521. static const struct ccs_csi_data_format ccs_csi_data_formats[] = {
  522. { MEDIA_BUS_FMT_SGRBG16_1X16, 16, 16, CCS_PIXEL_ORDER_GRBG, },
  523. { MEDIA_BUS_FMT_SRGGB16_1X16, 16, 16, CCS_PIXEL_ORDER_RGGB, },
  524. { MEDIA_BUS_FMT_SBGGR16_1X16, 16, 16, CCS_PIXEL_ORDER_BGGR, },
  525. { MEDIA_BUS_FMT_SGBRG16_1X16, 16, 16, CCS_PIXEL_ORDER_GBRG, },
  526. { MEDIA_BUS_FMT_SGRBG14_1X14, 14, 14, CCS_PIXEL_ORDER_GRBG, },
  527. { MEDIA_BUS_FMT_SRGGB14_1X14, 14, 14, CCS_PIXEL_ORDER_RGGB, },
  528. { MEDIA_BUS_FMT_SBGGR14_1X14, 14, 14, CCS_PIXEL_ORDER_BGGR, },
  529. { MEDIA_BUS_FMT_SGBRG14_1X14, 14, 14, CCS_PIXEL_ORDER_GBRG, },
  530. { MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, CCS_PIXEL_ORDER_GRBG, },
  531. { MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, CCS_PIXEL_ORDER_RGGB, },
  532. { MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, CCS_PIXEL_ORDER_BGGR, },
  533. { MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, CCS_PIXEL_ORDER_GBRG, },
  534. { MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, CCS_PIXEL_ORDER_GRBG, },
  535. { MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, CCS_PIXEL_ORDER_RGGB, },
  536. { MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, CCS_PIXEL_ORDER_BGGR, },
  537. { MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, CCS_PIXEL_ORDER_GBRG, },
  538. { MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_GRBG, },
  539. { MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_RGGB, },
  540. { MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_BGGR, },
  541. { MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, CCS_PIXEL_ORDER_GBRG, },
  542. { MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, CCS_PIXEL_ORDER_GRBG, },
  543. { MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, CCS_PIXEL_ORDER_RGGB, },
  544. { MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, CCS_PIXEL_ORDER_BGGR, },
  545. { MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, CCS_PIXEL_ORDER_GBRG, },
  546. };
  547. static const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
  548. #define to_csi_format_idx(fmt) (((unsigned long)(fmt) \
  549. - (unsigned long)ccs_csi_data_formats) \
  550. / sizeof(*ccs_csi_data_formats))
  551. static u32 ccs_pixel_order(struct ccs_sensor *sensor)
  552. {
  553. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  554. int flip = 0;
  555. if (sensor->hflip) {
  556. if (sensor->hflip->val)
  557. flip |= CCS_IMAGE_ORIENTATION_HORIZONTAL_MIRROR;
  558. if (sensor->vflip->val)
  559. flip |= CCS_IMAGE_ORIENTATION_VERTICAL_FLIP;
  560. }
  561. dev_dbg(&client->dev, "flip %u\n", flip);
  562. return sensor->default_pixel_order ^ flip;
  563. }
  564. static void ccs_update_mbus_formats(struct ccs_sensor *sensor)
  565. {
  566. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  567. unsigned int csi_format_idx =
  568. to_csi_format_idx(sensor->csi_format) & ~3;
  569. unsigned int internal_csi_format_idx =
  570. to_csi_format_idx(sensor->internal_csi_format) & ~3;
  571. unsigned int pixel_order = ccs_pixel_order(sensor);
  572. if (WARN_ON_ONCE(max(internal_csi_format_idx, csi_format_idx) +
  573. pixel_order >= ARRAY_SIZE(ccs_csi_data_formats)))
  574. return;
  575. sensor->mbus_frame_fmts =
  576. sensor->default_mbus_frame_fmts << pixel_order;
  577. sensor->csi_format =
  578. &ccs_csi_data_formats[csi_format_idx + pixel_order];
  579. sensor->internal_csi_format =
  580. &ccs_csi_data_formats[internal_csi_format_idx
  581. + pixel_order];
  582. dev_dbg(&client->dev, "new pixel order %s\n",
  583. pixel_order_str[pixel_order]);
  584. }
  585. static const char * const ccs_test_patterns[] = {
  586. "Disabled",
  587. "Solid Colour",
  588. "Eight Vertical Colour Bars",
  589. "Colour Bars With Fade to Grey",
  590. "Pseudorandom Sequence (PN9)",
  591. };
  592. static int ccs_set_ctrl(struct v4l2_ctrl *ctrl)
  593. {
  594. struct ccs_sensor *sensor =
  595. container_of(ctrl->handler, struct ccs_subdev, ctrl_handler)
  596. ->sensor;
  597. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  598. struct v4l2_subdev_state *state;
  599. const struct v4l2_rect *pa_src = NULL;
  600. int pm_status;
  601. u32 orient = 0;
  602. unsigned int i;
  603. int exposure;
  604. int rval;
  605. if (ctrl->id == V4L2_CID_VBLANK || ctrl->id == V4L2_CID_HBLANK) {
  606. state = v4l2_subdev_get_locked_active_state(&sensor->pixel_array->sd);
  607. pa_src = v4l2_subdev_state_get_crop(state, CCS_PA_PAD_SRC,
  608. CCS_STREAM_PIXEL);
  609. }
  610. switch (ctrl->id) {
  611. case V4L2_CID_HFLIP:
  612. case V4L2_CID_VFLIP:
  613. if (sensor->streaming)
  614. return -EBUSY;
  615. if (sensor->hflip->val)
  616. orient |= CCS_IMAGE_ORIENTATION_HORIZONTAL_MIRROR;
  617. if (sensor->vflip->val)
  618. orient |= CCS_IMAGE_ORIENTATION_VERTICAL_FLIP;
  619. ccs_update_mbus_formats(sensor);
  620. break;
  621. case V4L2_CID_VBLANK:
  622. exposure = sensor->exposure->val;
  623. __ccs_update_exposure_limits(sensor, pa_src);
  624. if (exposure > sensor->exposure->maximum) {
  625. sensor->exposure->val = sensor->exposure->maximum;
  626. rval = ccs_set_ctrl(sensor->exposure);
  627. if (rval < 0)
  628. return rval;
  629. }
  630. break;
  631. case V4L2_CID_LINK_FREQ:
  632. if (sensor->streaming)
  633. return -EBUSY;
  634. rval = ccs_pll_update(sensor);
  635. if (rval)
  636. return rval;
  637. return 0;
  638. case V4L2_CID_TEST_PATTERN:
  639. for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
  640. v4l2_ctrl_activate(
  641. sensor->test_data[i],
  642. ctrl->val ==
  643. V4L2_SMIAPP_TEST_PATTERN_MODE_SOLID_COLOUR);
  644. break;
  645. }
  646. pm_status = pm_runtime_get_if_active(&client->dev);
  647. if (!pm_status)
  648. return 0;
  649. switch (ctrl->id) {
  650. case V4L2_CID_ANALOGUE_GAIN:
  651. rval = ccs_write(sensor, ANALOG_GAIN_CODE_GLOBAL, ctrl->val);
  652. break;
  653. case V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN:
  654. rval = ccs_write(sensor, ANALOG_LINEAR_GAIN_GLOBAL, ctrl->val);
  655. break;
  656. case V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN:
  657. rval = ccs_write(sensor, ANALOG_EXPONENTIAL_GAIN_GLOBAL,
  658. ctrl->val);
  659. break;
  660. case V4L2_CID_DIGITAL_GAIN:
  661. if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
  662. CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL) {
  663. rval = ccs_write(sensor, DIGITAL_GAIN_GLOBAL,
  664. ctrl->val);
  665. break;
  666. }
  667. rval = ccs_write_addr(sensor,
  668. SMIAPP_REG_U16_DIGITAL_GAIN_GREENR,
  669. ctrl->val);
  670. if (rval)
  671. break;
  672. rval = ccs_write_addr(sensor,
  673. SMIAPP_REG_U16_DIGITAL_GAIN_RED,
  674. ctrl->val);
  675. if (rval)
  676. break;
  677. rval = ccs_write_addr(sensor,
  678. SMIAPP_REG_U16_DIGITAL_GAIN_BLUE,
  679. ctrl->val);
  680. if (rval)
  681. break;
  682. rval = ccs_write_addr(sensor,
  683. SMIAPP_REG_U16_DIGITAL_GAIN_GREENB,
  684. ctrl->val);
  685. break;
  686. case V4L2_CID_EXPOSURE:
  687. rval = ccs_write(sensor, COARSE_INTEGRATION_TIME, ctrl->val);
  688. break;
  689. case V4L2_CID_HFLIP:
  690. case V4L2_CID_VFLIP:
  691. rval = ccs_write(sensor, IMAGE_ORIENTATION, orient);
  692. break;
  693. case V4L2_CID_VBLANK:
  694. rval = ccs_write(sensor, FRAME_LENGTH_LINES,
  695. pa_src->height + ctrl->val);
  696. break;
  697. case V4L2_CID_HBLANK:
  698. rval = ccs_write(sensor, LINE_LENGTH_PCK,
  699. pa_src->width + ctrl->val);
  700. break;
  701. case V4L2_CID_TEST_PATTERN:
  702. rval = ccs_write(sensor, TEST_PATTERN_MODE, ctrl->val);
  703. break;
  704. case V4L2_CID_TEST_PATTERN_RED:
  705. rval = ccs_write(sensor, TEST_DATA_RED, ctrl->val);
  706. break;
  707. case V4L2_CID_TEST_PATTERN_GREENR:
  708. rval = ccs_write(sensor, TEST_DATA_GREENR, ctrl->val);
  709. break;
  710. case V4L2_CID_TEST_PATTERN_BLUE:
  711. rval = ccs_write(sensor, TEST_DATA_BLUE, ctrl->val);
  712. break;
  713. case V4L2_CID_TEST_PATTERN_GREENB:
  714. rval = ccs_write(sensor, TEST_DATA_GREENB, ctrl->val);
  715. break;
  716. case V4L2_CID_CCS_SHADING_CORRECTION:
  717. rval = ccs_write(sensor, SHADING_CORRECTION_EN,
  718. ctrl->val ? CCS_SHADING_CORRECTION_EN_ENABLE :
  719. 0);
  720. if (!rval && sensor->luminance_level)
  721. v4l2_ctrl_activate(sensor->luminance_level, ctrl->val);
  722. break;
  723. case V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL:
  724. rval = ccs_write(sensor, LUMINANCE_CORRECTION_LEVEL, ctrl->val);
  725. break;
  726. case V4L2_CID_PIXEL_RATE:
  727. /* For v4l2_ctrl_s_ctrl_int64() used internally. */
  728. rval = 0;
  729. break;
  730. default:
  731. rval = -EINVAL;
  732. }
  733. if (pm_status > 0)
  734. pm_runtime_put_autosuspend(&client->dev);
  735. return rval;
  736. }
  737. static const struct v4l2_ctrl_ops ccs_ctrl_ops = {
  738. .s_ctrl = ccs_set_ctrl,
  739. };
  740. static int ccs_init_controls(struct ccs_sensor *sensor)
  741. {
  742. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  743. struct v4l2_fwnode_device_properties props;
  744. int rval;
  745. rval = v4l2_ctrl_handler_init(&sensor->pixel_array->ctrl_handler, 19);
  746. if (rval)
  747. return rval;
  748. sensor->pixel_array->ctrl_handler.lock = &sensor->mutex;
  749. rval = v4l2_fwnode_device_parse(&client->dev, &props);
  750. if (rval)
  751. return rval;
  752. rval = v4l2_ctrl_new_fwnode_properties(&sensor->pixel_array->ctrl_handler,
  753. &ccs_ctrl_ops, &props);
  754. if (rval)
  755. return rval;
  756. switch (CCS_LIM(sensor, ANALOG_GAIN_CAPABILITY)) {
  757. case CCS_ANALOG_GAIN_CAPABILITY_GLOBAL: {
  758. struct {
  759. const char *name;
  760. u32 id;
  761. s32 value;
  762. } const gain_ctrls[] = {
  763. { "Analogue Gain m0", V4L2_CID_CCS_ANALOGUE_GAIN_M0,
  764. CCS_LIM(sensor, ANALOG_GAIN_M0), },
  765. { "Analogue Gain c0", V4L2_CID_CCS_ANALOGUE_GAIN_C0,
  766. CCS_LIM(sensor, ANALOG_GAIN_C0), },
  767. { "Analogue Gain m1", V4L2_CID_CCS_ANALOGUE_GAIN_M1,
  768. CCS_LIM(sensor, ANALOG_GAIN_M1), },
  769. { "Analogue Gain c1", V4L2_CID_CCS_ANALOGUE_GAIN_C1,
  770. CCS_LIM(sensor, ANALOG_GAIN_C1), },
  771. };
  772. struct v4l2_ctrl_config ctrl_cfg = {
  773. .type = V4L2_CTRL_TYPE_INTEGER,
  774. .ops = &ccs_ctrl_ops,
  775. .flags = V4L2_CTRL_FLAG_READ_ONLY,
  776. .step = 1,
  777. };
  778. unsigned int i;
  779. for (i = 0; i < ARRAY_SIZE(gain_ctrls); i++) {
  780. ctrl_cfg.name = gain_ctrls[i].name;
  781. ctrl_cfg.id = gain_ctrls[i].id;
  782. ctrl_cfg.min = ctrl_cfg.max = ctrl_cfg.def =
  783. gain_ctrls[i].value;
  784. v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
  785. &ctrl_cfg, NULL);
  786. }
  787. v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
  788. &ccs_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
  789. CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN),
  790. CCS_LIM(sensor, ANALOG_GAIN_CODE_MAX),
  791. max(CCS_LIM(sensor, ANALOG_GAIN_CODE_STEP),
  792. 1U),
  793. CCS_LIM(sensor, ANALOG_GAIN_CODE_MIN));
  794. }
  795. break;
  796. case CCS_ANALOG_GAIN_CAPABILITY_ALTERNATE_GLOBAL: {
  797. struct {
  798. const char *name;
  799. u32 id;
  800. u16 min, max, step;
  801. } const gain_ctrls[] = {
  802. {
  803. "Analogue Linear Gain",
  804. V4L2_CID_CCS_ANALOGUE_LINEAR_GAIN,
  805. CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MIN),
  806. CCS_LIM(sensor, ANALOG_LINEAR_GAIN_MAX),
  807. max(CCS_LIM(sensor,
  808. ANALOG_LINEAR_GAIN_STEP_SIZE),
  809. 1U),
  810. },
  811. {
  812. "Analogue Exponential Gain",
  813. V4L2_CID_CCS_ANALOGUE_EXPONENTIAL_GAIN,
  814. CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MIN),
  815. CCS_LIM(sensor, ANALOG_EXPONENTIAL_GAIN_MAX),
  816. max(CCS_LIM(sensor,
  817. ANALOG_EXPONENTIAL_GAIN_STEP_SIZE),
  818. 1U),
  819. },
  820. };
  821. struct v4l2_ctrl_config ctrl_cfg = {
  822. .type = V4L2_CTRL_TYPE_INTEGER,
  823. .ops = &ccs_ctrl_ops,
  824. };
  825. unsigned int i;
  826. for (i = 0; i < ARRAY_SIZE(gain_ctrls); i++) {
  827. ctrl_cfg.name = gain_ctrls[i].name;
  828. ctrl_cfg.min = ctrl_cfg.def = gain_ctrls[i].min;
  829. ctrl_cfg.max = gain_ctrls[i].max;
  830. ctrl_cfg.step = gain_ctrls[i].step;
  831. ctrl_cfg.id = gain_ctrls[i].id;
  832. v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
  833. &ctrl_cfg, NULL);
  834. }
  835. }
  836. }
  837. if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
  838. (CCS_SHADING_CORRECTION_CAPABILITY_COLOR_SHADING |
  839. CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION)) {
  840. const struct v4l2_ctrl_config ctrl_cfg = {
  841. .name = "Shading Correction",
  842. .type = V4L2_CTRL_TYPE_BOOLEAN,
  843. .id = V4L2_CID_CCS_SHADING_CORRECTION,
  844. .ops = &ccs_ctrl_ops,
  845. .max = 1,
  846. .step = 1,
  847. };
  848. v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
  849. &ctrl_cfg, NULL);
  850. }
  851. if (CCS_LIM(sensor, SHADING_CORRECTION_CAPABILITY) &
  852. CCS_SHADING_CORRECTION_CAPABILITY_LUMINANCE_CORRECTION) {
  853. const struct v4l2_ctrl_config ctrl_cfg = {
  854. .name = "Luminance Correction Level",
  855. .type = V4L2_CTRL_TYPE_BOOLEAN,
  856. .id = V4L2_CID_CCS_LUMINANCE_CORRECTION_LEVEL,
  857. .ops = &ccs_ctrl_ops,
  858. .max = 255,
  859. .step = 1,
  860. .def = 128,
  861. };
  862. sensor->luminance_level =
  863. v4l2_ctrl_new_custom(&sensor->pixel_array->ctrl_handler,
  864. &ctrl_cfg, NULL);
  865. }
  866. if (CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
  867. CCS_DIGITAL_GAIN_CAPABILITY_GLOBAL ||
  868. CCS_LIM(sensor, DIGITAL_GAIN_CAPABILITY) ==
  869. SMIAPP_DIGITAL_GAIN_CAPABILITY_PER_CHANNEL)
  870. v4l2_ctrl_new_std(&sensor->pixel_array->ctrl_handler,
  871. &ccs_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
  872. CCS_LIM(sensor, DIGITAL_GAIN_MIN),
  873. CCS_LIM(sensor, DIGITAL_GAIN_MAX),
  874. max(CCS_LIM(sensor, DIGITAL_GAIN_STEP_SIZE),
  875. 1U),
  876. 0x100);
  877. /* Exposure limits will be updated soon, use just something here. */
  878. sensor->exposure = v4l2_ctrl_new_std(
  879. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  880. V4L2_CID_EXPOSURE, 0, 0, 1, 0);
  881. sensor->hflip = v4l2_ctrl_new_std(
  882. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  883. V4L2_CID_HFLIP, 0, 1, 1, 0);
  884. sensor->vflip = v4l2_ctrl_new_std(
  885. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  886. V4L2_CID_VFLIP, 0, 1, 1, 0);
  887. sensor->vblank = v4l2_ctrl_new_std(
  888. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  889. V4L2_CID_VBLANK, 0, 1, 1, 0);
  890. if (sensor->vblank)
  891. sensor->vblank->flags |= V4L2_CTRL_FLAG_UPDATE;
  892. sensor->hblank = v4l2_ctrl_new_std(
  893. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  894. V4L2_CID_HBLANK, 0, 1, 1, 0);
  895. if (sensor->hblank)
  896. sensor->hblank->flags |= V4L2_CTRL_FLAG_UPDATE;
  897. sensor->pixel_rate_parray = v4l2_ctrl_new_std(
  898. &sensor->pixel_array->ctrl_handler, &ccs_ctrl_ops,
  899. V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
  900. v4l2_ctrl_new_std_menu_items(&sensor->pixel_array->ctrl_handler,
  901. &ccs_ctrl_ops, V4L2_CID_TEST_PATTERN,
  902. ARRAY_SIZE(ccs_test_patterns) - 1,
  903. 0, 0, ccs_test_patterns);
  904. if (sensor->pixel_array->ctrl_handler.error) {
  905. dev_err(&client->dev,
  906. "pixel array controls initialization failed (%d)\n",
  907. sensor->pixel_array->ctrl_handler.error);
  908. return sensor->pixel_array->ctrl_handler.error;
  909. }
  910. sensor->pixel_array->sd.ctrl_handler =
  911. &sensor->pixel_array->ctrl_handler;
  912. v4l2_ctrl_cluster(2, &sensor->hflip);
  913. rval = v4l2_ctrl_handler_init(&sensor->src->ctrl_handler, 0);
  914. if (rval)
  915. return rval;
  916. sensor->src->ctrl_handler.lock = &sensor->mutex;
  917. sensor->pixel_rate_csi = v4l2_ctrl_new_std(
  918. &sensor->src->ctrl_handler, &ccs_ctrl_ops,
  919. V4L2_CID_PIXEL_RATE, 1, INT_MAX, 1, 1);
  920. if (sensor->src->ctrl_handler.error) {
  921. dev_err(&client->dev,
  922. "src controls initialization failed (%d)\n",
  923. sensor->src->ctrl_handler.error);
  924. return sensor->src->ctrl_handler.error;
  925. }
  926. sensor->src->sd.ctrl_handler = &sensor->src->ctrl_handler;
  927. return 0;
  928. }
  929. /*
  930. * For controls that require information on available media bus codes
  931. * and linke frequencies.
  932. */
  933. static int ccs_init_late_controls(struct ccs_sensor *sensor)
  934. {
  935. unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
  936. sensor->csi_format->compressed - sensor->compressed_min_bpp];
  937. unsigned int i;
  938. for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++) {
  939. int max_value = (1 << sensor->csi_format->width) - 1;
  940. sensor->test_data[i] = v4l2_ctrl_new_std(
  941. &sensor->pixel_array->ctrl_handler,
  942. &ccs_ctrl_ops, V4L2_CID_TEST_PATTERN_RED + i,
  943. 0, max_value, 1, max_value);
  944. }
  945. sensor->link_freq = v4l2_ctrl_new_int_menu(
  946. &sensor->src->ctrl_handler, &ccs_ctrl_ops,
  947. V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
  948. __ffs(*valid_link_freqs), sensor->hwcfg.op_sys_clock);
  949. return sensor->src->ctrl_handler.error;
  950. }
  951. static void ccs_free_controls(struct ccs_sensor *sensor)
  952. {
  953. unsigned int i;
  954. for (i = 0; i < sensor->ssds_used; i++)
  955. v4l2_ctrl_handler_free(&sensor->ssds[i].ctrl_handler);
  956. }
  957. static int ccs_get_mbus_formats(struct ccs_sensor *sensor)
  958. {
  959. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  960. struct ccs_pll *pll = &sensor->pll;
  961. u8 compressed_max_bpp = 0;
  962. unsigned int type, n;
  963. unsigned int i, pixel_order;
  964. int rval;
  965. type = CCS_LIM(sensor, DATA_FORMAT_MODEL_TYPE);
  966. dev_dbg(&client->dev, "data_format_model_type %u\n", type);
  967. rval = ccs_read(sensor, PIXEL_ORDER, &pixel_order);
  968. if (rval)
  969. return rval;
  970. if (pixel_order >= ARRAY_SIZE(pixel_order_str)) {
  971. dev_dbg(&client->dev, "bad pixel order %u\n", pixel_order);
  972. return -EINVAL;
  973. }
  974. dev_dbg(&client->dev, "pixel order %u (%s)\n", pixel_order,
  975. pixel_order_str[pixel_order]);
  976. switch (type) {
  977. case CCS_DATA_FORMAT_MODEL_TYPE_NORMAL:
  978. n = SMIAPP_DATA_FORMAT_MODEL_TYPE_NORMAL_N;
  979. break;
  980. case CCS_DATA_FORMAT_MODEL_TYPE_EXTENDED:
  981. n = CCS_LIM_DATA_FORMAT_DESCRIPTOR_MAX_N + 1;
  982. break;
  983. default:
  984. return -EINVAL;
  985. }
  986. sensor->default_pixel_order = pixel_order;
  987. sensor->mbus_frame_fmts = 0;
  988. for (i = 0; i < n; i++) {
  989. unsigned int fmt, j;
  990. fmt = CCS_LIM_AT(sensor, DATA_FORMAT_DESCRIPTOR, i);
  991. dev_dbg(&client->dev, "%u: bpp %u, compressed %u\n",
  992. i, fmt >> 8, (u8)fmt);
  993. for (j = 0; j < ARRAY_SIZE(ccs_csi_data_formats); j++) {
  994. const struct ccs_csi_data_format *f =
  995. &ccs_csi_data_formats[j];
  996. if (f->pixel_order != CCS_PIXEL_ORDER_GRBG)
  997. continue;
  998. if (f->width != fmt >>
  999. CCS_DATA_FORMAT_DESCRIPTOR_UNCOMPRESSED_SHIFT ||
  1000. f->compressed !=
  1001. (fmt & CCS_DATA_FORMAT_DESCRIPTOR_COMPRESSED_MASK))
  1002. continue;
  1003. dev_dbg(&client->dev, "jolly good! %u\n", j);
  1004. sensor->default_mbus_frame_fmts |= BIT_U64(j);
  1005. }
  1006. }
  1007. /* Figure out which BPP values can be used with which formats. */
  1008. pll->binning_horizontal = 1;
  1009. pll->binning_vertical = 1;
  1010. pll->scale_m = CCS_LIM(sensor, SCALER_N_MIN);
  1011. for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
  1012. sensor->compressed_min_bpp =
  1013. min(ccs_csi_data_formats[i].compressed,
  1014. sensor->compressed_min_bpp);
  1015. compressed_max_bpp =
  1016. max(ccs_csi_data_formats[i].compressed,
  1017. compressed_max_bpp);
  1018. }
  1019. sensor->valid_link_freqs = devm_kcalloc(
  1020. &client->dev,
  1021. compressed_max_bpp - sensor->compressed_min_bpp + 1,
  1022. sizeof(*sensor->valid_link_freqs), GFP_KERNEL);
  1023. if (!sensor->valid_link_freqs)
  1024. return -ENOMEM;
  1025. for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
  1026. const struct ccs_csi_data_format *f =
  1027. &ccs_csi_data_formats[i];
  1028. unsigned long *valid_link_freqs =
  1029. &sensor->valid_link_freqs[
  1030. f->compressed - sensor->compressed_min_bpp];
  1031. unsigned int j;
  1032. if (!(sensor->default_mbus_frame_fmts & BIT_U64(i)))
  1033. continue;
  1034. pll->bits_per_pixel = f->compressed;
  1035. for (j = 0; sensor->hwcfg.op_sys_clock[j]; j++) {
  1036. pll->link_freq = sensor->hwcfg.op_sys_clock[j];
  1037. rval = ccs_pll_try(sensor, pll);
  1038. dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
  1039. pll->link_freq, pll->bits_per_pixel,
  1040. rval ? "not ok" : "ok");
  1041. if (rval)
  1042. continue;
  1043. set_bit(j, valid_link_freqs);
  1044. }
  1045. if (!*valid_link_freqs) {
  1046. dev_info(&client->dev,
  1047. "no valid link frequencies for %u bpp\n",
  1048. f->compressed);
  1049. sensor->default_mbus_frame_fmts &= ~BIT(i);
  1050. continue;
  1051. }
  1052. if (!sensor->csi_format
  1053. || f->width > sensor->csi_format->width
  1054. || (f->width == sensor->csi_format->width
  1055. && f->compressed > sensor->csi_format->compressed)) {
  1056. sensor->csi_format = f;
  1057. sensor->internal_csi_format = f;
  1058. }
  1059. }
  1060. if (!sensor->csi_format) {
  1061. dev_err(&client->dev, "no supported mbus code found\n");
  1062. return -EINVAL;
  1063. }
  1064. ccs_update_mbus_formats(sensor);
  1065. return 0;
  1066. }
  1067. static void ccs_update_blanking(struct ccs_sensor *sensor,
  1068. const struct v4l2_rect *pa_src)
  1069. {
  1070. struct v4l2_ctrl *vblank = sensor->vblank;
  1071. struct v4l2_ctrl *hblank = sensor->hblank;
  1072. u16 min_fll, max_fll, min_llp, max_llp, min_lbp;
  1073. int min, max;
  1074. u8 binh, binv;
  1075. ccs_get_binning(sensor, NULL, &binh, &binv);
  1076. if (binv > 1 || binh > 1) {
  1077. min_fll = CCS_LIM(sensor, MIN_FRAME_LENGTH_LINES_BIN);
  1078. max_fll = CCS_LIM(sensor, MAX_FRAME_LENGTH_LINES_BIN);
  1079. min_llp = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK_BIN);
  1080. max_llp = CCS_LIM(sensor, MAX_LINE_LENGTH_PCK_BIN);
  1081. min_lbp = CCS_LIM(sensor, MIN_LINE_BLANKING_PCK_BIN);
  1082. } else {
  1083. min_fll = CCS_LIM(sensor, MIN_FRAME_LENGTH_LINES);
  1084. max_fll = CCS_LIM(sensor, MAX_FRAME_LENGTH_LINES);
  1085. min_llp = CCS_LIM(sensor, MIN_LINE_LENGTH_PCK);
  1086. max_llp = CCS_LIM(sensor, MAX_LINE_LENGTH_PCK);
  1087. min_lbp = CCS_LIM(sensor, MIN_LINE_BLANKING_PCK);
  1088. }
  1089. min = max_t(int,
  1090. CCS_LIM(sensor, MIN_FRAME_BLANKING_LINES),
  1091. min_fll - pa_src->height);
  1092. max = max_fll - pa_src->height;
  1093. __v4l2_ctrl_modify_range(vblank, min, max, vblank->step, min);
  1094. min = max_t(int, min_llp - pa_src->width, min_lbp);
  1095. max = max_llp - pa_src->width;
  1096. __v4l2_ctrl_modify_range(hblank, min, max, hblank->step, min);
  1097. __ccs_update_exposure_limits(sensor, pa_src);
  1098. }
  1099. static int ccs_pll_blanking_update(struct ccs_sensor *sensor)
  1100. {
  1101. struct v4l2_subdev_state *state =
  1102. v4l2_subdev_get_locked_active_state(&sensor->pixel_array->sd);
  1103. const struct v4l2_rect *pa_src =
  1104. v4l2_subdev_state_get_crop(state, CCS_PA_PAD_SRC,
  1105. CCS_STREAM_PIXEL);
  1106. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1107. int rval;
  1108. rval = ccs_pll_update(sensor);
  1109. if (rval < 0)
  1110. return rval;
  1111. /* Output from pixel array, including blanking */
  1112. ccs_update_blanking(sensor, pa_src);
  1113. dev_dbg(&client->dev, "vblank\t\t%d\n", sensor->vblank->val);
  1114. dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
  1115. dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
  1116. sensor->pll.pixel_rate_pixel_array /
  1117. ((pa_src->width + sensor->hblank->val) *
  1118. (pa_src->height + sensor->vblank->val) / 100));
  1119. return 0;
  1120. }
  1121. /*
  1122. *
  1123. * SMIA++ NVM handling
  1124. *
  1125. */
  1126. static int ccs_read_nvm_page(struct ccs_sensor *sensor, u32 p, u8 *nvm,
  1127. u8 *status)
  1128. {
  1129. unsigned int i;
  1130. int rval;
  1131. u32 s;
  1132. *status = 0;
  1133. rval = ccs_write(sensor, DATA_TRANSFER_IF_1_PAGE_SELECT, p);
  1134. if (rval)
  1135. return rval;
  1136. rval = ccs_write(sensor, DATA_TRANSFER_IF_1_CTRL,
  1137. CCS_DATA_TRANSFER_IF_1_CTRL_ENABLE);
  1138. if (rval)
  1139. return rval;
  1140. rval = ccs_read(sensor, DATA_TRANSFER_IF_1_STATUS, &s);
  1141. if (rval)
  1142. return rval;
  1143. if (s & CCS_DATA_TRANSFER_IF_1_STATUS_IMPROPER_IF_USAGE) {
  1144. *status = s;
  1145. return -ENODATA;
  1146. }
  1147. if (CCS_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
  1148. CCS_DATA_TRANSFER_IF_CAPABILITY_POLLING) {
  1149. for (i = 1000; i > 0; i--) {
  1150. if (s & CCS_DATA_TRANSFER_IF_1_STATUS_READ_IF_READY)
  1151. break;
  1152. rval = ccs_read(sensor, DATA_TRANSFER_IF_1_STATUS, &s);
  1153. if (rval)
  1154. return rval;
  1155. }
  1156. if (!i)
  1157. return -ETIMEDOUT;
  1158. }
  1159. for (i = 0; i <= CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P; i++) {
  1160. u32 v;
  1161. rval = ccs_read(sensor, DATA_TRANSFER_IF_1_DATA(i), &v);
  1162. if (rval)
  1163. return rval;
  1164. *nvm++ = v;
  1165. }
  1166. return 0;
  1167. }
  1168. static int ccs_read_nvm(struct ccs_sensor *sensor, unsigned char *nvm,
  1169. size_t nvm_size)
  1170. {
  1171. u8 status = 0;
  1172. u32 p;
  1173. int rval = 0, rval2;
  1174. for (p = 0; p < nvm_size / (CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1)
  1175. && !rval; p++) {
  1176. rval = ccs_read_nvm_page(sensor, p, nvm, &status);
  1177. nvm += CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1;
  1178. }
  1179. if (rval == -ENODATA &&
  1180. status & CCS_DATA_TRANSFER_IF_1_STATUS_IMPROPER_IF_USAGE)
  1181. rval = 0;
  1182. rval2 = ccs_write(sensor, DATA_TRANSFER_IF_1_CTRL, 0);
  1183. if (rval < 0)
  1184. return rval;
  1185. else
  1186. return rval2 ?: p * (CCS_LIM_DATA_TRANSFER_IF_1_DATA_MAX_P + 1);
  1187. }
  1188. /*
  1189. *
  1190. * SMIA++ CCI address control
  1191. *
  1192. */
  1193. static int ccs_change_cci_addr(struct ccs_sensor *sensor)
  1194. {
  1195. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1196. int rval;
  1197. u32 val;
  1198. client->addr = sensor->hwcfg.i2c_addr_dfl;
  1199. rval = read_poll_timeout(ccs_write, rval, !rval, CCS_RESET_DELAY_US,
  1200. CCS_RESET_TIMEOUT_US, false, sensor,
  1201. CCI_ADDRESS_CTRL,
  1202. sensor->hwcfg.i2c_addr_alt << 1);
  1203. if (rval)
  1204. return rval;
  1205. client->addr = sensor->hwcfg.i2c_addr_alt;
  1206. /* verify addr change went ok */
  1207. rval = ccs_read(sensor, CCI_ADDRESS_CTRL, &val);
  1208. if (rval)
  1209. return rval;
  1210. if (val != sensor->hwcfg.i2c_addr_alt << 1)
  1211. return -ENODEV;
  1212. return 0;
  1213. }
  1214. /*
  1215. *
  1216. * SMIA++ Mode Control
  1217. *
  1218. */
  1219. static int ccs_setup_flash_strobe(struct ccs_sensor *sensor)
  1220. {
  1221. struct ccs_flash_strobe_parms *strobe_setup;
  1222. unsigned int ext_freq = sensor->hwcfg.ext_clk;
  1223. u32 tmp;
  1224. u32 strobe_adjustment;
  1225. u32 strobe_width_high_rs;
  1226. int rval;
  1227. strobe_setup = sensor->hwcfg.strobe_setup;
  1228. /*
  1229. * How to calculate registers related to strobe length. Please
  1230. * do not change, or if you do at least know what you're
  1231. * doing. :-)
  1232. *
  1233. * Sakari Ailus <sakari.ailus@linux.intel.com> 2010-10-25
  1234. *
  1235. * flash_strobe_length [us] / 10^6 = (tFlash_strobe_width_ctrl
  1236. * / EXTCLK freq [Hz]) * flash_strobe_adjustment
  1237. *
  1238. * tFlash_strobe_width_ctrl E N, [1 - 0xffff]
  1239. * flash_strobe_adjustment E N, [1 - 0xff]
  1240. *
  1241. * The formula above is written as below to keep it on one
  1242. * line:
  1243. *
  1244. * l / 10^6 = w / e * a
  1245. *
  1246. * Let's mark w * a by x:
  1247. *
  1248. * x = w * a
  1249. *
  1250. * Thus, we get:
  1251. *
  1252. * x = l * e / 10^6
  1253. *
  1254. * The strobe width must be at least as long as requested,
  1255. * thus rounding upwards is needed.
  1256. *
  1257. * x = (l * e + 10^6 - 1) / 10^6
  1258. * -----------------------------
  1259. *
  1260. * Maximum possible accuracy is wanted at all times. Thus keep
  1261. * a as small as possible.
  1262. *
  1263. * Calculate a, assuming maximum w, with rounding upwards:
  1264. *
  1265. * a = (x + (2^16 - 1) - 1) / (2^16 - 1)
  1266. * -------------------------------------
  1267. *
  1268. * Thus, we also get w, with that a, with rounding upwards:
  1269. *
  1270. * w = (x + a - 1) / a
  1271. * -------------------
  1272. *
  1273. * To get limits:
  1274. *
  1275. * x E [1, (2^16 - 1) * (2^8 - 1)]
  1276. *
  1277. * Substituting maximum x to the original formula (with rounding),
  1278. * the maximum l is thus
  1279. *
  1280. * (2^16 - 1) * (2^8 - 1) * 10^6 = l * e + 10^6 - 1
  1281. *
  1282. * l = (10^6 * (2^16 - 1) * (2^8 - 1) - 10^6 + 1) / e
  1283. * --------------------------------------------------
  1284. *
  1285. * flash_strobe_length must be clamped between 1 and
  1286. * (10^6 * (2^16 - 1) * (2^8 - 1) - 10^6 + 1) / EXTCLK freq.
  1287. *
  1288. * Then,
  1289. *
  1290. * flash_strobe_adjustment = ((flash_strobe_length *
  1291. * EXTCLK freq + 10^6 - 1) / 10^6 + (2^16 - 1) - 1) / (2^16 - 1)
  1292. *
  1293. * tFlash_strobe_width_ctrl = ((flash_strobe_length *
  1294. * EXTCLK freq + 10^6 - 1) / 10^6 +
  1295. * flash_strobe_adjustment - 1) / flash_strobe_adjustment
  1296. */
  1297. tmp = div_u64(1000000ULL * ((1 << 16) - 1) * ((1 << 8) - 1) -
  1298. 1000000 + 1, ext_freq);
  1299. strobe_setup->strobe_width_high_us =
  1300. clamp_t(u32, strobe_setup->strobe_width_high_us, 1, tmp);
  1301. tmp = div_u64(((u64)strobe_setup->strobe_width_high_us * (u64)ext_freq +
  1302. 1000000 - 1), 1000000ULL);
  1303. strobe_adjustment = (tmp + (1 << 16) - 1 - 1) / ((1 << 16) - 1);
  1304. strobe_width_high_rs = (tmp + strobe_adjustment - 1) /
  1305. strobe_adjustment;
  1306. rval = ccs_write(sensor, FLASH_MODE_RS, strobe_setup->mode);
  1307. if (rval < 0)
  1308. goto out;
  1309. rval = ccs_write(sensor, FLASH_STROBE_ADJUSTMENT, strobe_adjustment);
  1310. if (rval < 0)
  1311. goto out;
  1312. rval = ccs_write(sensor, TFLASH_STROBE_WIDTH_HIGH_RS_CTRL,
  1313. strobe_width_high_rs);
  1314. if (rval < 0)
  1315. goto out;
  1316. rval = ccs_write(sensor, TFLASH_STROBE_DELAY_RS_CTRL,
  1317. strobe_setup->strobe_delay);
  1318. if (rval < 0)
  1319. goto out;
  1320. rval = ccs_write(sensor, FLASH_STROBE_START_POINT,
  1321. strobe_setup->stobe_start_point);
  1322. if (rval < 0)
  1323. goto out;
  1324. rval = ccs_write(sensor, FLASH_TRIGGER_RS, strobe_setup->trigger);
  1325. out:
  1326. sensor->hwcfg.strobe_setup->trigger = 0;
  1327. return rval;
  1328. }
  1329. /* -----------------------------------------------------------------------------
  1330. * Power management
  1331. */
  1332. static int ccs_write_msr_regs(struct ccs_sensor *sensor)
  1333. {
  1334. int rval;
  1335. rval = ccs_write_data_regs(sensor,
  1336. sensor->sdata.sensor_manufacturer_regs,
  1337. sensor->sdata.num_sensor_manufacturer_regs);
  1338. if (rval)
  1339. return rval;
  1340. return ccs_write_data_regs(sensor,
  1341. sensor->mdata.module_manufacturer_regs,
  1342. sensor->mdata.num_module_manufacturer_regs);
  1343. }
  1344. static int ccs_update_phy_ctrl(struct ccs_sensor *sensor)
  1345. {
  1346. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1347. u8 val;
  1348. if (!sensor->ccs_limits)
  1349. return 0;
  1350. if (CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
  1351. CCS_PHY_CTRL_CAPABILITY_AUTO_PHY_CTL) {
  1352. val = CCS_PHY_CTRL_AUTO;
  1353. } else if (CCS_LIM(sensor, PHY_CTRL_CAPABILITY) &
  1354. CCS_PHY_CTRL_CAPABILITY_UI_PHY_CTL) {
  1355. val = CCS_PHY_CTRL_UI;
  1356. } else {
  1357. dev_err(&client->dev, "manual PHY control not supported\n");
  1358. return -EINVAL;
  1359. }
  1360. return ccs_write(sensor, PHY_CTRL, val);
  1361. }
  1362. static int ccs_power_on(struct device *dev)
  1363. {
  1364. struct v4l2_subdev *subdev = dev_get_drvdata(dev);
  1365. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  1366. /*
  1367. * The sub-device related to the I2C device is always the
  1368. * source one, i.e. ssds[0].
  1369. */
  1370. struct ccs_sensor *sensor =
  1371. container_of(ssd, struct ccs_sensor, ssds[0]);
  1372. const struct ccs_device *ccsdev = device_get_match_data(dev);
  1373. int rval;
  1374. rval = regulator_bulk_enable(ARRAY_SIZE(ccs_regulators),
  1375. sensor->regulators);
  1376. if (rval) {
  1377. dev_err(dev, "failed to enable vana regulator\n");
  1378. return rval;
  1379. }
  1380. if (sensor->reset || sensor->xshutdown || sensor->ext_clk) {
  1381. unsigned int sleep;
  1382. rval = clk_prepare_enable(sensor->ext_clk);
  1383. if (rval < 0) {
  1384. dev_dbg(dev, "failed to enable xclk\n");
  1385. goto out_xclk_fail;
  1386. }
  1387. gpiod_set_value(sensor->reset, 0);
  1388. gpiod_set_value(sensor->xshutdown, 1);
  1389. if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
  1390. sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
  1391. else
  1392. sleep = CCS_RESET_DELAY_US;
  1393. usleep_range(sleep, sleep);
  1394. }
  1395. /*
  1396. * Some devices take longer than the spec-defined time to respond
  1397. * after reset. Try until some time has passed before flagging it
  1398. * an error.
  1399. */
  1400. if (!sensor->reset && !sensor->xshutdown) {
  1401. u32 reset;
  1402. rval = read_poll_timeout(ccs_write, rval, !rval,
  1403. CCS_RESET_DELAY_US,
  1404. CCS_RESET_TIMEOUT_US,
  1405. false, sensor, SOFTWARE_RESET,
  1406. CCS_SOFTWARE_RESET_ON);
  1407. if (rval < 0) {
  1408. dev_err(dev, "software reset failed\n");
  1409. goto out_cci_addr_fail;
  1410. }
  1411. rval = read_poll_timeout(ccs_read, rval,
  1412. !rval &&
  1413. reset == CCS_SOFTWARE_RESET_OFF,
  1414. CCS_RESET_DELAY_US,
  1415. CCS_RESET_TIMEOUT_US, false, sensor,
  1416. SOFTWARE_RESET, &reset);
  1417. if (rval < 0) {
  1418. dev_err_probe(dev, rval,
  1419. "failed to respond after reset\n");
  1420. goto out_cci_addr_fail;
  1421. }
  1422. }
  1423. if (sensor->hwcfg.i2c_addr_alt) {
  1424. rval = ccs_change_cci_addr(sensor);
  1425. if (rval) {
  1426. dev_err(dev, "cci address change error\n");
  1427. goto out_cci_addr_fail;
  1428. }
  1429. }
  1430. rval = ccs_write(sensor, COMPRESSION_MODE,
  1431. CCS_COMPRESSION_MODE_DPCM_PCM_SIMPLE);
  1432. if (rval) {
  1433. dev_err(dev, "compression mode set failed\n");
  1434. goto out_cci_addr_fail;
  1435. }
  1436. rval = ccs_write(sensor, EXTCLK_FREQUENCY_MHZ,
  1437. sensor->hwcfg.ext_clk / (1000000 / (1 << 8)));
  1438. if (rval) {
  1439. dev_err(dev, "extclk frequency set failed\n");
  1440. goto out_cci_addr_fail;
  1441. }
  1442. rval = ccs_write(sensor, CSI_LANE_MODE, sensor->hwcfg.lanes - 1);
  1443. if (rval) {
  1444. dev_err(dev, "csi lane mode set failed\n");
  1445. goto out_cci_addr_fail;
  1446. }
  1447. rval = ccs_write(sensor, FAST_STANDBY_CTRL,
  1448. CCS_FAST_STANDBY_CTRL_FRAME_TRUNCATION);
  1449. if (rval) {
  1450. dev_err(dev, "fast standby set failed\n");
  1451. goto out_cci_addr_fail;
  1452. }
  1453. rval = ccs_write(sensor, CSI_SIGNALING_MODE,
  1454. sensor->hwcfg.csi_signalling_mode);
  1455. if (rval) {
  1456. dev_err(dev, "csi signalling mode set failed\n");
  1457. goto out_cci_addr_fail;
  1458. }
  1459. rval = ccs_update_phy_ctrl(sensor);
  1460. if (rval < 0)
  1461. goto out_cci_addr_fail;
  1462. rval = ccs_write_msr_regs(sensor);
  1463. if (rval)
  1464. goto out_cci_addr_fail;
  1465. rval = ccs_call_quirk(sensor, post_poweron);
  1466. if (rval) {
  1467. dev_err(dev, "post_poweron quirks failed\n");
  1468. goto out_cci_addr_fail;
  1469. }
  1470. return 0;
  1471. out_cci_addr_fail:
  1472. gpiod_set_value(sensor->reset, 1);
  1473. gpiod_set_value(sensor->xshutdown, 0);
  1474. clk_disable_unprepare(sensor->ext_clk);
  1475. out_xclk_fail:
  1476. regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
  1477. sensor->regulators);
  1478. return rval;
  1479. }
  1480. static int ccs_power_off(struct device *dev)
  1481. {
  1482. struct v4l2_subdev *subdev = dev_get_drvdata(dev);
  1483. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  1484. struct ccs_sensor *sensor =
  1485. container_of(ssd, struct ccs_sensor, ssds[0]);
  1486. /*
  1487. * Currently power/clock to lens are enable/disabled separately
  1488. * but they are essentially the same signals. So if the sensor is
  1489. * powered off while the lens is powered on the sensor does not
  1490. * really see a power off and next time the cci address change
  1491. * will fail. So do a soft reset explicitly here.
  1492. */
  1493. if (sensor->hwcfg.i2c_addr_alt)
  1494. ccs_write(sensor, SOFTWARE_RESET, CCS_SOFTWARE_RESET_ON);
  1495. gpiod_set_value(sensor->reset, 1);
  1496. gpiod_set_value(sensor->xshutdown, 0);
  1497. clk_disable_unprepare(sensor->ext_clk);
  1498. usleep_range(5000, 5000);
  1499. regulator_bulk_disable(ARRAY_SIZE(ccs_regulators),
  1500. sensor->regulators);
  1501. return 0;
  1502. }
  1503. /* -----------------------------------------------------------------------------
  1504. * V4L2 subdev video operations
  1505. */
  1506. static int ccs_pm_get_init(struct ccs_sensor *sensor)
  1507. {
  1508. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1509. int rval;
  1510. /*
  1511. * It can't use pm_runtime_resume_and_get() here, as the driver
  1512. * relies at the returned value to detect if the device was already
  1513. * active or not.
  1514. */
  1515. rval = pm_runtime_get_sync(&client->dev);
  1516. if (rval < 0)
  1517. goto error;
  1518. /* Device was already active, so don't set controls */
  1519. if (rval == 1 && !sensor->handler_setup_needed)
  1520. return 0;
  1521. sensor->handler_setup_needed = false;
  1522. /* Restore V4L2 controls to the previously suspended device */
  1523. rval = __v4l2_ctrl_handler_setup(&sensor->pixel_array->ctrl_handler);
  1524. if (rval)
  1525. goto error;
  1526. rval = __v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler);
  1527. if (rval)
  1528. goto error;
  1529. /* Keep PM runtime usage_count incremented on success */
  1530. return 0;
  1531. error:
  1532. pm_runtime_put(&client->dev);
  1533. return rval;
  1534. }
  1535. static int ccs_enable_streams(struct v4l2_subdev *subdev,
  1536. struct v4l2_subdev_state *state, u32 pad,
  1537. u64 streams_mask)
  1538. {
  1539. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1540. struct v4l2_subdev_state *pa_state =
  1541. v4l2_subdev_get_locked_active_state(&sensor->pixel_array->sd);
  1542. struct v4l2_subdev_state *src_state =
  1543. v4l2_subdev_get_locked_active_state(&sensor->src->sd);
  1544. const struct v4l2_rect *pa_src =
  1545. v4l2_subdev_state_get_crop(pa_state, CCS_PA_PAD_SRC,
  1546. CCS_STREAM_PIXEL);
  1547. const struct v4l2_rect *src_src =
  1548. v4l2_subdev_state_get_crop(src_state, CCS_PAD_SRC,
  1549. CCS_STREAM_PIXEL);
  1550. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1551. u8 binning_mode, binh, binv;
  1552. int rval;
  1553. if (pad != CCS_PAD_SRC)
  1554. return -EINVAL;
  1555. if (sensor->streaming) {
  1556. sensor->streaming |= streams_mask;
  1557. return 0;
  1558. }
  1559. rval = ccs_pm_get_init(sensor);
  1560. if (rval)
  1561. return rval;
  1562. rval = ccs_write(sensor, CSI_DATA_FORMAT,
  1563. (sensor->csi_format->width << 8) |
  1564. sensor->csi_format->compressed);
  1565. if (rval)
  1566. goto err_pm_put;
  1567. /* Binning configuration */
  1568. ccs_get_binning(sensor, &binning_mode, &binh, &binv);
  1569. if (binning_mode) {
  1570. rval = ccs_write(sensor, BINNING_TYPE, (binh << 4) | binv);
  1571. if (rval < 0)
  1572. goto err_pm_put;
  1573. }
  1574. rval = ccs_write(sensor, BINNING_MODE, binning_mode);
  1575. if (rval < 0)
  1576. goto err_pm_put;
  1577. /* Set up PLL */
  1578. rval = ccs_pll_configure(sensor);
  1579. if (rval)
  1580. goto err_pm_put;
  1581. /* Analog crop start coordinates */
  1582. rval = ccs_write(sensor, X_ADDR_START, pa_src->left);
  1583. if (rval < 0)
  1584. goto err_pm_put;
  1585. rval = ccs_write(sensor, Y_ADDR_START, pa_src->top);
  1586. if (rval < 0)
  1587. goto err_pm_put;
  1588. /* Analog crop end coordinates */
  1589. rval = ccs_write(sensor, X_ADDR_END, pa_src->left + pa_src->width - 1);
  1590. if (rval < 0)
  1591. goto err_pm_put;
  1592. rval = ccs_write(sensor, Y_ADDR_END, pa_src->top + pa_src->height - 1);
  1593. if (rval < 0)
  1594. goto err_pm_put;
  1595. /*
  1596. * Output from pixel array, including blanking, is set using
  1597. * controls below. No need to set here.
  1598. */
  1599. /* Digital crop */
  1600. if (CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
  1601. == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
  1602. struct v4l2_subdev_state *scaler_state =
  1603. v4l2_subdev_get_locked_active_state(&sensor->scaler->sd);
  1604. const struct v4l2_rect *scaler_sink =
  1605. v4l2_subdev_state_get_crop(scaler_state,
  1606. sensor->scaler->sink_pad,
  1607. CCS_STREAM_PIXEL);
  1608. rval = ccs_write(sensor, DIGITAL_CROP_X_OFFSET,
  1609. scaler_sink->left);
  1610. if (rval < 0)
  1611. goto err_pm_put;
  1612. rval = ccs_write(sensor, DIGITAL_CROP_Y_OFFSET,
  1613. scaler_sink->top);
  1614. if (rval < 0)
  1615. goto err_pm_put;
  1616. rval = ccs_write(sensor, DIGITAL_CROP_IMAGE_WIDTH,
  1617. scaler_sink->width);
  1618. if (rval < 0)
  1619. goto err_pm_put;
  1620. rval = ccs_write(sensor, DIGITAL_CROP_IMAGE_HEIGHT,
  1621. scaler_sink->height);
  1622. if (rval < 0)
  1623. goto err_pm_put;
  1624. }
  1625. /* Scaling */
  1626. if (CCS_LIM(sensor, SCALING_CAPABILITY)
  1627. != CCS_SCALING_CAPABILITY_NONE) {
  1628. u8 scaling_mode, scale_m;
  1629. ccs_get_scaling(sensor, &scaling_mode, &scale_m);
  1630. rval = ccs_write(sensor, SCALING_MODE, scaling_mode);
  1631. if (rval < 0)
  1632. goto err_pm_put;
  1633. rval = ccs_write(sensor, SCALE_M, scale_m);
  1634. if (rval < 0)
  1635. goto err_pm_put;
  1636. }
  1637. /* Output size from sensor */
  1638. rval = ccs_write(sensor, X_OUTPUT_SIZE, src_src->width);
  1639. if (rval < 0)
  1640. goto err_pm_put;
  1641. rval = ccs_write(sensor, Y_OUTPUT_SIZE, src_src->height);
  1642. if (rval < 0)
  1643. goto err_pm_put;
  1644. if (CCS_LIM(sensor, FLASH_MODE_CAPABILITY) &
  1645. (CCS_FLASH_MODE_CAPABILITY_SINGLE_STROBE |
  1646. SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE) &&
  1647. sensor->hwcfg.strobe_setup != NULL &&
  1648. sensor->hwcfg.strobe_setup->trigger != 0) {
  1649. rval = ccs_setup_flash_strobe(sensor);
  1650. if (rval)
  1651. goto err_pm_put;
  1652. }
  1653. rval = ccs_call_quirk(sensor, pre_streamon);
  1654. if (rval) {
  1655. dev_err(&client->dev, "pre_streamon quirks failed\n");
  1656. goto err_pm_put;
  1657. }
  1658. rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_STREAMING);
  1659. sensor->streaming |= streams_mask;
  1660. return 0;
  1661. err_pm_put:
  1662. pm_runtime_put_autosuspend(&client->dev);
  1663. return rval;
  1664. }
  1665. static int ccs_disable_streams(struct v4l2_subdev *subdev,
  1666. struct v4l2_subdev_state *state, u32 pad,
  1667. u64 streams_mask)
  1668. {
  1669. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1670. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1671. int rval;
  1672. if (pad != CCS_PAD_SRC)
  1673. return -EINVAL;
  1674. sensor->streaming &= ~streams_mask;
  1675. if (sensor->streaming)
  1676. return 0;
  1677. rval = ccs_write(sensor, MODE_SELECT, CCS_MODE_SELECT_SOFTWARE_STANDBY);
  1678. if (rval)
  1679. return rval;
  1680. rval = ccs_call_quirk(sensor, post_streamoff);
  1681. if (rval)
  1682. dev_err(&client->dev, "post_streamoff quirks failed\n");
  1683. pm_runtime_put_autosuspend(&client->dev);
  1684. return 0;
  1685. }
  1686. static int ccs_pre_streamon(struct v4l2_subdev *subdev, u32 flags)
  1687. {
  1688. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1689. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1690. int rval;
  1691. if (flags & V4L2_SUBDEV_PRE_STREAMON_FL_MANUAL_LP) {
  1692. switch (sensor->hwcfg.csi_signalling_mode) {
  1693. case CCS_CSI_SIGNALING_MODE_CSI_2_DPHY:
  1694. if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY_2) &
  1695. CCS_PHY_CTRL_CAPABILITY_2_MANUAL_LP_DPHY))
  1696. return -EACCES;
  1697. break;
  1698. case CCS_CSI_SIGNALING_MODE_CSI_2_CPHY:
  1699. if (!(CCS_LIM(sensor, PHY_CTRL_CAPABILITY_2) &
  1700. CCS_PHY_CTRL_CAPABILITY_2_MANUAL_LP_CPHY))
  1701. return -EACCES;
  1702. break;
  1703. default:
  1704. return -EACCES;
  1705. }
  1706. }
  1707. scoped_guard(mutex, &sensor->mutex)
  1708. rval = ccs_pm_get_init(sensor);
  1709. if (rval)
  1710. return rval;
  1711. if (flags & V4L2_SUBDEV_PRE_STREAMON_FL_MANUAL_LP) {
  1712. rval = ccs_write(sensor, MANUAL_LP_CTRL,
  1713. CCS_MANUAL_LP_CTRL_ENABLE);
  1714. if (rval)
  1715. pm_runtime_put(&client->dev);
  1716. }
  1717. return rval;
  1718. }
  1719. static int ccs_post_streamoff(struct v4l2_subdev *subdev)
  1720. {
  1721. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1722. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  1723. pm_runtime_put(&client->dev);
  1724. return 0;
  1725. }
  1726. static const struct ccs_csi_data_format
  1727. *ccs_validate_csi_data_format(struct ccs_sensor *sensor, u32 code)
  1728. {
  1729. unsigned int i;
  1730. for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
  1731. if (sensor->mbus_frame_fmts & BIT_U64(i) &&
  1732. ccs_csi_data_formats[i].code == code)
  1733. return &ccs_csi_data_formats[i];
  1734. }
  1735. return sensor->csi_format;
  1736. }
  1737. static int ccs_enum_mbus_code(struct v4l2_subdev *subdev,
  1738. struct v4l2_subdev_state *sd_state,
  1739. struct v4l2_subdev_mbus_code_enum *code)
  1740. {
  1741. struct i2c_client *client = v4l2_get_subdevdata(subdev);
  1742. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1743. unsigned int i;
  1744. int idx = -1;
  1745. dev_err(&client->dev, "subdev %s, pad %u, index %u\n",
  1746. subdev->name, code->pad, code->index);
  1747. if (subdev != &sensor->src->sd || code->pad != CCS_PAD_SRC) {
  1748. if (code->index)
  1749. return -EINVAL;
  1750. code->code = sensor->internal_csi_format->code;
  1751. return 0;
  1752. }
  1753. for (i = 0; i < ARRAY_SIZE(ccs_csi_data_formats); i++) {
  1754. if (sensor->mbus_frame_fmts & BIT_U64(i))
  1755. idx++;
  1756. if (idx == code->index) {
  1757. code->code = ccs_csi_data_formats[i].code;
  1758. dev_err(&client->dev, "found index %u, i %u, code %x\n",
  1759. code->index, i, code->code);
  1760. return 0;
  1761. }
  1762. }
  1763. return -EINVAL;
  1764. }
  1765. static u32 ccs_get_mbus_code(struct v4l2_subdev *subdev, unsigned int pad)
  1766. {
  1767. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1768. if (subdev == &sensor->src->sd && pad == CCS_PAD_SRC)
  1769. return sensor->csi_format->code;
  1770. else
  1771. return sensor->internal_csi_format->code;
  1772. }
  1773. static int ccs_get_format(struct v4l2_subdev *subdev,
  1774. struct v4l2_subdev_state *sd_state,
  1775. struct v4l2_subdev_format *fmt)
  1776. {
  1777. fmt->format = *v4l2_subdev_state_get_format(sd_state, fmt->pad);
  1778. fmt->format.code = ccs_get_mbus_code(subdev, fmt->pad);
  1779. return 0;
  1780. }
  1781. /* Changes require propagation only on sink pad. */
  1782. static void ccs_propagate(struct v4l2_subdev *subdev,
  1783. struct v4l2_subdev_state *sd_state, int target)
  1784. {
  1785. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  1786. struct v4l2_rect *comp, *crop;
  1787. struct v4l2_mbus_framefmt *fmt;
  1788. comp = v4l2_subdev_state_get_compose(sd_state, ssd->sink_pad,
  1789. CCS_STREAM_PIXEL);
  1790. switch (target) {
  1791. case V4L2_SEL_TGT_CROP:
  1792. crop = v4l2_subdev_state_get_crop(sd_state, CCS_PAD_SINK,
  1793. CCS_STREAM_PIXEL);
  1794. comp->width = crop->width;
  1795. comp->height = crop->height;
  1796. fallthrough;
  1797. case V4L2_SEL_TGT_COMPOSE:
  1798. crop = v4l2_subdev_state_get_crop(sd_state, CCS_PAD_SRC,
  1799. CCS_STREAM_PIXEL);
  1800. *crop = *comp;
  1801. fmt = v4l2_subdev_state_get_format(sd_state, CCS_PAD_SRC,
  1802. CCS_STREAM_PIXEL);
  1803. fmt->width = comp->width;
  1804. fmt->height = comp->height;
  1805. break;
  1806. default:
  1807. WARN_ON_ONCE(1);
  1808. }
  1809. }
  1810. static int ccs_set_format_source(struct v4l2_subdev *subdev,
  1811. struct v4l2_subdev_state *sd_state,
  1812. struct v4l2_subdev_format *fmt)
  1813. {
  1814. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1815. const struct ccs_csi_data_format *csi_format,
  1816. *old_csi_format = sensor->csi_format;
  1817. unsigned long *valid_link_freqs;
  1818. u32 code = fmt->format.code;
  1819. unsigned int i;
  1820. int rval;
  1821. rval = ccs_get_format(subdev, sd_state, fmt);
  1822. if (rval)
  1823. return rval;
  1824. /*
  1825. * Media bus code is changeable on src subdev's source pad. On
  1826. * other source pads we just get format here.
  1827. */
  1828. if (subdev != &sensor->src->sd)
  1829. return 0;
  1830. csi_format = ccs_validate_csi_data_format(sensor, code);
  1831. fmt->format.code = csi_format->code;
  1832. if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
  1833. return 0;
  1834. sensor->csi_format = csi_format;
  1835. if (csi_format->width != old_csi_format->width)
  1836. for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
  1837. __v4l2_ctrl_modify_range(
  1838. sensor->test_data[i], 0,
  1839. (1 << csi_format->width) - 1, 1, 0);
  1840. if (csi_format->compressed == old_csi_format->compressed)
  1841. return 0;
  1842. valid_link_freqs =
  1843. &sensor->valid_link_freqs[sensor->csi_format->compressed
  1844. - sensor->compressed_min_bpp];
  1845. __v4l2_ctrl_modify_range(
  1846. sensor->link_freq, 0,
  1847. __fls(*valid_link_freqs), ~*valid_link_freqs,
  1848. __ffs(*valid_link_freqs));
  1849. return ccs_pll_update(sensor);
  1850. }
  1851. static int ccs_set_format(struct v4l2_subdev *subdev,
  1852. struct v4l2_subdev_state *sd_state,
  1853. struct v4l2_subdev_format *fmt)
  1854. {
  1855. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1856. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  1857. struct v4l2_rect *crop;
  1858. if (fmt->pad == ssd->source_pad) {
  1859. int rval;
  1860. rval = ccs_set_format_source(subdev, sd_state, fmt);
  1861. return rval;
  1862. }
  1863. /* Sink pad. Width and height are changeable here. */
  1864. fmt->format.code = ccs_get_mbus_code(subdev, fmt->pad);
  1865. fmt->format.width &= ~1;
  1866. fmt->format.height &= ~1;
  1867. fmt->format.field = V4L2_FIELD_NONE;
  1868. fmt->format.width =
  1869. clamp(fmt->format.width,
  1870. CCS_LIM(sensor, MIN_X_OUTPUT_SIZE),
  1871. CCS_LIM(sensor, MAX_X_OUTPUT_SIZE));
  1872. fmt->format.height =
  1873. clamp(fmt->format.height,
  1874. CCS_LIM(sensor, MIN_Y_OUTPUT_SIZE),
  1875. CCS_LIM(sensor, MAX_Y_OUTPUT_SIZE));
  1876. crop = v4l2_subdev_state_get_crop(sd_state, ssd->sink_pad,
  1877. CCS_STREAM_PIXEL);
  1878. crop->left = 0;
  1879. crop->top = 0;
  1880. crop->width = fmt->format.width;
  1881. crop->height = fmt->format.height;
  1882. ccs_propagate(subdev, sd_state, V4L2_SEL_TGT_CROP);
  1883. return 0;
  1884. }
  1885. /*
  1886. * Calculate goodness of scaled image size compared to expected image
  1887. * size and flags provided.
  1888. */
  1889. #define SCALING_GOODNESS 100000
  1890. #define SCALING_GOODNESS_EXTREME 100000000
  1891. static int scaling_goodness(struct v4l2_subdev *subdev, int w, int ask_w,
  1892. int h, int ask_h, u32 flags)
  1893. {
  1894. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1895. struct i2c_client *client = v4l2_get_subdevdata(subdev);
  1896. int val = 0;
  1897. w &= ~1;
  1898. ask_w &= ~1;
  1899. h &= ~1;
  1900. ask_h &= ~1;
  1901. if (flags & V4L2_SEL_FLAG_GE) {
  1902. if (w < ask_w)
  1903. val -= SCALING_GOODNESS;
  1904. if (h < ask_h)
  1905. val -= SCALING_GOODNESS;
  1906. }
  1907. if (flags & V4L2_SEL_FLAG_LE) {
  1908. if (w > ask_w)
  1909. val -= SCALING_GOODNESS;
  1910. if (h > ask_h)
  1911. val -= SCALING_GOODNESS;
  1912. }
  1913. val -= abs(w - ask_w);
  1914. val -= abs(h - ask_h);
  1915. if (w < CCS_LIM(sensor, MIN_X_OUTPUT_SIZE))
  1916. val -= SCALING_GOODNESS_EXTREME;
  1917. dev_dbg(&client->dev, "w %d ask_w %d h %d ask_h %d goodness %d\n",
  1918. w, ask_w, h, ask_h, val);
  1919. return val;
  1920. }
  1921. static void ccs_set_compose_binner(struct v4l2_subdev *subdev,
  1922. struct v4l2_subdev_state *sd_state,
  1923. struct v4l2_subdev_selection *sel,
  1924. const struct v4l2_rect *sink_crop)
  1925. {
  1926. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1927. unsigned int i;
  1928. unsigned int binh = 1, binv = 1;
  1929. int best = scaling_goodness(subdev, sink_crop->width, sel->r.width,
  1930. sink_crop->height, sel->r.height,
  1931. sel->flags);
  1932. for (i = 0; i < sensor->nbinning_subtypes; i++) {
  1933. int this = scaling_goodness(subdev,
  1934. sink_crop->width
  1935. / sensor->binning_subtypes[i].horizontal,
  1936. sel->r.width,
  1937. sink_crop->height
  1938. / sensor->binning_subtypes[i].vertical,
  1939. sel->r.height, sel->flags);
  1940. if (this > best) {
  1941. binh = sensor->binning_subtypes[i].horizontal;
  1942. binv = sensor->binning_subtypes[i].vertical;
  1943. best = this;
  1944. }
  1945. }
  1946. sel->r.width = (sink_crop->width / binh) & ~1;
  1947. sel->r.height = (sink_crop->height / binv) & ~1;
  1948. }
  1949. /*
  1950. * Calculate best scaling ratio and mode for given output resolution.
  1951. *
  1952. * Try all of these: horizontal ratio, vertical ratio and smallest
  1953. * size possible (horizontally).
  1954. *
  1955. * Also try whether horizontal scaler or full scaler gives a better
  1956. * result.
  1957. */
  1958. static void ccs_set_compose_scaler(struct v4l2_subdev *subdev,
  1959. struct v4l2_subdev_state *sd_state,
  1960. struct v4l2_subdev_selection *sel,
  1961. const struct v4l2_rect *sink_crop)
  1962. {
  1963. struct i2c_client *client = v4l2_get_subdevdata(subdev);
  1964. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  1965. u32 min, max, a, b, max_m;
  1966. u32 scale_m = CCS_LIM(sensor, SCALER_N_MIN);
  1967. int mode = CCS_SCALING_MODE_HORIZONTAL;
  1968. u32 try[4];
  1969. u32 ntry = 0;
  1970. unsigned int i;
  1971. int best = INT_MIN;
  1972. sel->r.width = min_t(unsigned int, sel->r.width, sink_crop->width);
  1973. sel->r.height = min_t(unsigned int, sel->r.height, sink_crop->height);
  1974. a = sink_crop->width * CCS_LIM(sensor, SCALER_N_MIN) / sel->r.width;
  1975. b = sink_crop->height * CCS_LIM(sensor, SCALER_N_MIN) / sel->r.height;
  1976. max_m = sink_crop->width
  1977. * CCS_LIM(sensor, SCALER_N_MIN)
  1978. / (CCS_LIM(sensor, MIN_X_OUTPUT_SIZE) ?: 1);
  1979. a = clamp(a, CCS_LIM(sensor, SCALER_M_MIN),
  1980. CCS_LIM(sensor, SCALER_M_MAX));
  1981. b = clamp(b, CCS_LIM(sensor, SCALER_M_MIN),
  1982. CCS_LIM(sensor, SCALER_M_MAX));
  1983. max_m = clamp(max_m, CCS_LIM(sensor, SCALER_M_MIN),
  1984. CCS_LIM(sensor, SCALER_M_MAX));
  1985. dev_dbg(&client->dev, "scaling: a %u b %u max_m %u\n", a, b, max_m);
  1986. min = min(max_m, min(a, b));
  1987. max = min(max_m, max(a, b));
  1988. try[ntry] = min;
  1989. ntry++;
  1990. if (min != max) {
  1991. try[ntry] = max;
  1992. ntry++;
  1993. }
  1994. if (max != max_m) {
  1995. try[ntry] = min + 1;
  1996. ntry++;
  1997. if (min != max) {
  1998. try[ntry] = max + 1;
  1999. ntry++;
  2000. }
  2001. }
  2002. for (i = 0; i < ntry; i++) {
  2003. int this = scaling_goodness(subdev,
  2004. sink_crop->width
  2005. / try[i]
  2006. * CCS_LIM(sensor, SCALER_N_MIN),
  2007. sel->r.width, sink_crop->height,
  2008. sel->r.height, sel->flags);
  2009. dev_dbg(&client->dev, "trying factor %u (%u)\n", try[i], i);
  2010. if (this > best) {
  2011. scale_m = try[i];
  2012. mode = CCS_SCALING_MODE_HORIZONTAL;
  2013. best = this;
  2014. }
  2015. if (CCS_LIM(sensor, SCALING_CAPABILITY)
  2016. == CCS_SCALING_CAPABILITY_HORIZONTAL)
  2017. continue;
  2018. this = scaling_goodness(
  2019. subdev, sink_crop->width / try[i]
  2020. * CCS_LIM(sensor, SCALER_N_MIN),
  2021. sel->r.width,
  2022. sink_crop->height / try[i]
  2023. * CCS_LIM(sensor, SCALER_N_MIN),
  2024. sel->r.height,
  2025. sel->flags);
  2026. if (this > best) {
  2027. scale_m = try[i];
  2028. mode = SMIAPP_SCALING_MODE_BOTH;
  2029. best = this;
  2030. }
  2031. }
  2032. sel->r.width = (sink_crop->width / scale_m
  2033. * CCS_LIM(sensor, SCALER_N_MIN)) & ~1;
  2034. if (mode == SMIAPP_SCALING_MODE_BOTH)
  2035. sel->r.height = (sink_crop->height / scale_m
  2036. * CCS_LIM(sensor, SCALER_N_MIN)) & ~1;
  2037. else
  2038. sel->r.height = sink_crop->height;
  2039. }
  2040. /* We're only called on source pads. This function sets scaling. */
  2041. static int ccs_set_compose(struct v4l2_subdev *subdev,
  2042. struct v4l2_subdev_state *sd_state,
  2043. struct v4l2_subdev_selection *sel)
  2044. {
  2045. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2046. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  2047. const struct v4l2_rect *sink_crop;
  2048. struct v4l2_rect *comp;
  2049. sink_crop = v4l2_subdev_state_get_crop(sd_state, CCS_PAD_SINK,
  2050. CCS_STREAM_PIXEL);
  2051. comp = v4l2_subdev_state_get_compose(sd_state, ssd->sink_pad,
  2052. CCS_STREAM_PIXEL);
  2053. sel->r.top = 0;
  2054. sel->r.left = 0;
  2055. if (ssd == sensor->binner)
  2056. ccs_set_compose_binner(subdev, sd_state, sel, sink_crop);
  2057. else
  2058. ccs_set_compose_scaler(subdev, sd_state, sel, sink_crop);
  2059. *comp = sel->r;
  2060. ccs_propagate(subdev, sd_state, V4L2_SEL_TGT_COMPOSE);
  2061. if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
  2062. return ccs_pll_blanking_update(sensor);
  2063. return 0;
  2064. }
  2065. static int ccs_sel_supported(struct v4l2_subdev *subdev,
  2066. struct v4l2_subdev_selection *sel)
  2067. {
  2068. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2069. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  2070. /* We only implement crop in three places. */
  2071. switch (sel->target) {
  2072. case V4L2_SEL_TGT_CROP:
  2073. case V4L2_SEL_TGT_CROP_BOUNDS:
  2074. if (ssd == sensor->pixel_array && sel->pad == CCS_PA_PAD_SRC)
  2075. return 0;
  2076. if (ssd == sensor->src && sel->pad == CCS_PAD_SRC)
  2077. return 0;
  2078. if (ssd == sensor->scaler && sel->pad == CCS_PAD_SINK &&
  2079. CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
  2080. == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
  2081. return 0;
  2082. return -EINVAL;
  2083. case V4L2_SEL_TGT_NATIVE_SIZE:
  2084. if (ssd == sensor->pixel_array && sel->pad == CCS_PA_PAD_SRC)
  2085. return 0;
  2086. return -EINVAL;
  2087. case V4L2_SEL_TGT_COMPOSE:
  2088. case V4L2_SEL_TGT_COMPOSE_BOUNDS:
  2089. if (sel->pad == ssd->source_pad)
  2090. return -EINVAL;
  2091. if (ssd == sensor->binner)
  2092. return 0;
  2093. if (ssd == sensor->scaler && CCS_LIM(sensor, SCALING_CAPABILITY)
  2094. != CCS_SCALING_CAPABILITY_NONE)
  2095. return 0;
  2096. fallthrough;
  2097. default:
  2098. return -EINVAL;
  2099. }
  2100. }
  2101. static int ccs_set_crop(struct v4l2_subdev *subdev,
  2102. struct v4l2_subdev_state *sd_state,
  2103. struct v4l2_subdev_selection *sel)
  2104. {
  2105. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2106. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  2107. struct v4l2_rect src_size = { 0 }, *crop;
  2108. const struct v4l2_rect *comp;
  2109. crop = v4l2_subdev_state_get_crop(sd_state, sel->pad,
  2110. CCS_STREAM_PIXEL);
  2111. comp = v4l2_subdev_state_get_compose(sd_state, ssd->sink_pad,
  2112. CCS_STREAM_PIXEL);
  2113. if (sel->pad == ssd->sink_pad) {
  2114. struct v4l2_mbus_framefmt *mfmt =
  2115. v4l2_subdev_state_get_format(sd_state, sel->pad);
  2116. src_size.width = mfmt->width;
  2117. src_size.height = mfmt->height;
  2118. } else {
  2119. src_size = *comp;
  2120. }
  2121. if (ssd == sensor->src && sel->pad == CCS_PAD_SRC) {
  2122. sel->r.left = 0;
  2123. sel->r.top = 0;
  2124. }
  2125. sel->r.width = min(sel->r.width, src_size.width);
  2126. sel->r.height = min(sel->r.height, src_size.height);
  2127. sel->r.left = min_t(int, sel->r.left, src_size.width - sel->r.width);
  2128. sel->r.top = min_t(int, sel->r.top, src_size.height - sel->r.height);
  2129. *crop = sel->r;
  2130. if (ssd != sensor->pixel_array && sel->pad == CCS_PAD_SINK)
  2131. ccs_propagate(subdev, sd_state, V4L2_SEL_TGT_CROP);
  2132. return 0;
  2133. }
  2134. static void ccs_get_native_size(struct ccs_subdev *ssd, struct v4l2_rect *r)
  2135. {
  2136. r->top = 0;
  2137. r->left = 0;
  2138. r->width = CCS_LIM(ssd->sensor, X_ADDR_MAX) + 1;
  2139. r->height = CCS_LIM(ssd->sensor, Y_ADDR_MAX) + 1;
  2140. }
  2141. static int ccs_get_selection(struct v4l2_subdev *subdev,
  2142. struct v4l2_subdev_state *sd_state,
  2143. struct v4l2_subdev_selection *sel)
  2144. {
  2145. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2146. struct ccs_subdev *ssd = to_ccs_subdev(subdev);
  2147. const struct v4l2_rect *crop, *comp;
  2148. int ret;
  2149. ret = ccs_sel_supported(subdev, sel);
  2150. if (ret)
  2151. return ret;
  2152. crop = v4l2_subdev_state_get_crop(sd_state, sel->pad,
  2153. CCS_STREAM_PIXEL);
  2154. comp = v4l2_subdev_state_get_compose(sd_state, ssd->sink_pad,
  2155. CCS_STREAM_PIXEL);
  2156. switch (sel->target) {
  2157. case V4L2_SEL_TGT_CROP_BOUNDS:
  2158. case V4L2_SEL_TGT_NATIVE_SIZE:
  2159. if (ssd == sensor->pixel_array) {
  2160. ccs_get_native_size(ssd, &sel->r);
  2161. } else if (sel->pad == ssd->sink_pad) {
  2162. struct v4l2_mbus_framefmt *sink_fmt =
  2163. v4l2_subdev_state_get_format(sd_state,
  2164. ssd->sink_pad);
  2165. sel->r.top = sel->r.left = 0;
  2166. sel->r.width = sink_fmt->width;
  2167. sel->r.height = sink_fmt->height;
  2168. } else {
  2169. sel->r = *comp;
  2170. }
  2171. break;
  2172. case V4L2_SEL_TGT_CROP:
  2173. case V4L2_SEL_TGT_COMPOSE_BOUNDS:
  2174. sel->r = *crop;
  2175. break;
  2176. case V4L2_SEL_TGT_COMPOSE:
  2177. sel->r = *comp;
  2178. break;
  2179. }
  2180. return 0;
  2181. }
  2182. static int ccs_set_selection(struct v4l2_subdev *subdev,
  2183. struct v4l2_subdev_state *sd_state,
  2184. struct v4l2_subdev_selection *sel)
  2185. {
  2186. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2187. int ret;
  2188. ret = ccs_sel_supported(subdev, sel);
  2189. if (ret)
  2190. return ret;
  2191. sel->r.left = max(0, sel->r.left & ~1);
  2192. sel->r.top = max(0, sel->r.top & ~1);
  2193. sel->r.width = CCS_ALIGN_DIM(sel->r.width, sel->flags);
  2194. sel->r.height = CCS_ALIGN_DIM(sel->r.height, sel->flags);
  2195. sel->r.width = max_t(unsigned int, CCS_LIM(sensor, MIN_X_OUTPUT_SIZE),
  2196. sel->r.width);
  2197. sel->r.height = max_t(unsigned int, CCS_LIM(sensor, MIN_Y_OUTPUT_SIZE),
  2198. sel->r.height);
  2199. switch (sel->target) {
  2200. case V4L2_SEL_TGT_CROP:
  2201. ret = ccs_set_crop(subdev, sd_state, sel);
  2202. break;
  2203. case V4L2_SEL_TGT_COMPOSE:
  2204. ret = ccs_set_compose(subdev, sd_state, sel);
  2205. break;
  2206. default:
  2207. ret = -EINVAL;
  2208. }
  2209. return ret;
  2210. }
  2211. static int ccs_get_frame_desc(struct v4l2_subdev *subdev, unsigned int pad,
  2212. struct v4l2_mbus_frame_desc *desc)
  2213. {
  2214. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2215. struct v4l2_mbus_frame_desc_entry *entry = desc->entry;
  2216. struct v4l2_subdev_state *sd_state;
  2217. switch (sensor->hwcfg.csi_signalling_mode) {
  2218. case CCS_CSI_SIGNALING_MODE_CSI_2_DPHY:
  2219. case CCS_CSI_SIGNALING_MODE_CSI_2_CPHY:
  2220. desc->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
  2221. break;
  2222. default:
  2223. /* FIXME: CCP2 support */
  2224. return -EINVAL;
  2225. }
  2226. sd_state = v4l2_subdev_lock_and_get_active_state(subdev);
  2227. if (!sd_state)
  2228. return -EINVAL;
  2229. entry->pixelcode = sensor->csi_format->code;
  2230. entry->stream = CCS_STREAM_PIXEL;
  2231. entry->bus.csi2.dt =
  2232. sensor->csi_format->width == sensor->csi_format->compressed ?
  2233. ccs_mipi_csi2_data_type(sensor->csi_format->width) :
  2234. CCS_DEFAULT_COMPRESSED_DT;
  2235. entry++;
  2236. desc->num_entries++;
  2237. v4l2_subdev_unlock_state(sd_state);
  2238. return 0;
  2239. }
  2240. static int ccs_get_skip_frames(struct v4l2_subdev *subdev, u32 *frames)
  2241. {
  2242. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2243. *frames = sensor->frame_skip;
  2244. return 0;
  2245. }
  2246. static int ccs_get_skip_top_lines(struct v4l2_subdev *subdev, u32 *lines)
  2247. {
  2248. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2249. *lines = sensor->image_start;
  2250. return 0;
  2251. }
  2252. /* -----------------------------------------------------------------------------
  2253. * sysfs attributes
  2254. */
  2255. static ssize_t
  2256. nvm_show(struct device *dev, struct device_attribute *attr, char *buf)
  2257. {
  2258. struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
  2259. struct i2c_client *client = v4l2_get_subdevdata(subdev);
  2260. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2261. int rval;
  2262. if (!sensor->dev_init_done)
  2263. return -EBUSY;
  2264. rval = ccs_pm_get_init(sensor);
  2265. if (rval < 0)
  2266. return -ENODEV;
  2267. rval = ccs_read_nvm(sensor, buf, PAGE_SIZE);
  2268. if (rval < 0) {
  2269. pm_runtime_put(&client->dev);
  2270. dev_err(&client->dev, "nvm read failed\n");
  2271. return -ENODEV;
  2272. }
  2273. pm_runtime_put_autosuspend(&client->dev);
  2274. /*
  2275. * NVM is still way below a PAGE_SIZE, so we can safely
  2276. * assume this for now.
  2277. */
  2278. return rval;
  2279. }
  2280. static DEVICE_ATTR_RO(nvm);
  2281. static ssize_t
  2282. ident_show(struct device *dev, struct device_attribute *attr, char *buf)
  2283. {
  2284. struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
  2285. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2286. struct ccs_module_info *minfo = &sensor->minfo;
  2287. if (minfo->mipi_manufacturer_id)
  2288. return sysfs_emit(buf, "%4.4x%4.4x%2.2x\n",
  2289. minfo->mipi_manufacturer_id, minfo->model_id,
  2290. minfo->revision_number) + 1;
  2291. else
  2292. return sysfs_emit(buf, "%2.2x%4.4x%2.2x\n",
  2293. minfo->smia_manufacturer_id, minfo->model_id,
  2294. minfo->revision_number) + 1;
  2295. }
  2296. static DEVICE_ATTR_RO(ident);
  2297. /* -----------------------------------------------------------------------------
  2298. * V4L2 subdev core operations
  2299. */
  2300. static int ccs_identify_module(struct ccs_sensor *sensor)
  2301. {
  2302. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  2303. struct ccs_module_info *minfo = &sensor->minfo;
  2304. unsigned int i;
  2305. u32 rev;
  2306. int rval = 0;
  2307. /* Module info */
  2308. rval = ccs_read(sensor, MODULE_MANUFACTURER_ID,
  2309. &minfo->mipi_manufacturer_id);
  2310. if (!rval && !minfo->mipi_manufacturer_id)
  2311. rval = ccs_read_addr(sensor, SMIAPP_REG_U8_MANUFACTURER_ID,
  2312. &minfo->smia_manufacturer_id);
  2313. if (!rval)
  2314. rval = ccs_read(sensor, MODULE_MODEL_ID, &minfo->model_id);
  2315. if (!rval)
  2316. rval = ccs_read(sensor, MODULE_REVISION_NUMBER_MAJOR, &rev);
  2317. if (!rval) {
  2318. rval = ccs_read(sensor, MODULE_REVISION_NUMBER_MINOR,
  2319. &minfo->revision_number);
  2320. minfo->revision_number |= rev << 8;
  2321. }
  2322. if (!rval)
  2323. rval = ccs_read(sensor, MODULE_DATE_YEAR, &minfo->module_year);
  2324. if (!rval)
  2325. rval = ccs_read(sensor, MODULE_DATE_MONTH,
  2326. &minfo->module_month);
  2327. if (!rval)
  2328. rval = ccs_read(sensor, MODULE_DATE_DAY, &minfo->module_day);
  2329. /* Sensor info */
  2330. if (!rval)
  2331. rval = ccs_read(sensor, SENSOR_MANUFACTURER_ID,
  2332. &minfo->sensor_mipi_manufacturer_id);
  2333. if (!rval && !minfo->sensor_mipi_manufacturer_id)
  2334. rval = ccs_read(sensor, SENSOR_MANUFACTURER_ID,
  2335. &minfo->sensor_smia_manufacturer_id);
  2336. if (!rval)
  2337. rval = ccs_read(sensor, SENSOR_MODEL_ID,
  2338. &minfo->sensor_model_id);
  2339. if (!rval)
  2340. rval = ccs_read(sensor, SENSOR_REVISION_NUMBER,
  2341. &minfo->sensor_revision_number);
  2342. if (!rval && !minfo->sensor_revision_number)
  2343. rval = ccs_read(sensor, SENSOR_REVISION_NUMBER_16,
  2344. &minfo->sensor_revision_number);
  2345. if (!rval)
  2346. rval = ccs_read(sensor, SENSOR_FIRMWARE_VERSION,
  2347. &minfo->sensor_firmware_version);
  2348. /* SMIA */
  2349. if (!rval)
  2350. rval = ccs_read(sensor, MIPI_CCS_VERSION, &minfo->ccs_version);
  2351. if (!rval && !minfo->ccs_version)
  2352. rval = ccs_read_addr(sensor, SMIAPP_REG_U8_SMIA_VERSION,
  2353. &minfo->smia_version);
  2354. if (!rval && !minfo->ccs_version)
  2355. rval = ccs_read_addr(sensor, SMIAPP_REG_U8_SMIAPP_VERSION,
  2356. &minfo->smiapp_version);
  2357. if (rval) {
  2358. dev_err(&client->dev, "sensor detection failed\n");
  2359. return -ENODEV;
  2360. }
  2361. if (minfo->mipi_manufacturer_id)
  2362. dev_dbg(&client->dev, "MIPI CCS module 0x%4.4x-0x%4.4x\n",
  2363. minfo->mipi_manufacturer_id, minfo->model_id);
  2364. else
  2365. dev_dbg(&client->dev, "SMIA module 0x%2.2x-0x%4.4x\n",
  2366. minfo->smia_manufacturer_id, minfo->model_id);
  2367. dev_dbg(&client->dev,
  2368. "module revision 0x%4.4x date %2.2d-%2.2d-%2.2d\n",
  2369. minfo->revision_number, minfo->module_year, minfo->module_month,
  2370. minfo->module_day);
  2371. if (minfo->sensor_mipi_manufacturer_id)
  2372. dev_dbg(&client->dev, "MIPI CCS sensor 0x%4.4x-0x%4.4x\n",
  2373. minfo->sensor_mipi_manufacturer_id,
  2374. minfo->sensor_model_id);
  2375. else
  2376. dev_dbg(&client->dev, "SMIA sensor 0x%2.2x-0x%4.4x\n",
  2377. minfo->sensor_smia_manufacturer_id,
  2378. minfo->sensor_model_id);
  2379. dev_dbg(&client->dev,
  2380. "sensor revision 0x%4.4x firmware version 0x%2.2x\n",
  2381. minfo->sensor_revision_number, minfo->sensor_firmware_version);
  2382. if (minfo->ccs_version) {
  2383. dev_dbg(&client->dev, "MIPI CCS version %u.%u",
  2384. (minfo->ccs_version & CCS_MIPI_CCS_VERSION_MAJOR_MASK)
  2385. >> CCS_MIPI_CCS_VERSION_MAJOR_SHIFT,
  2386. (minfo->ccs_version & CCS_MIPI_CCS_VERSION_MINOR_MASK));
  2387. minfo->name = CCS_NAME;
  2388. } else {
  2389. dev_dbg(&client->dev,
  2390. "smia version %2.2d smiapp version %2.2d\n",
  2391. minfo->smia_version, minfo->smiapp_version);
  2392. minfo->name = SMIAPP_NAME;
  2393. /*
  2394. * Some modules have bad data in the lvalues below. Hope the
  2395. * rvalues have better stuff. The lvalues are module
  2396. * parameters whereas the rvalues are sensor parameters.
  2397. */
  2398. if (minfo->sensor_smia_manufacturer_id &&
  2399. !minfo->smia_manufacturer_id && !minfo->model_id) {
  2400. minfo->smia_manufacturer_id =
  2401. minfo->sensor_smia_manufacturer_id;
  2402. minfo->model_id = minfo->sensor_model_id;
  2403. minfo->revision_number = minfo->sensor_revision_number;
  2404. }
  2405. }
  2406. for (i = 0; i < ARRAY_SIZE(ccs_module_idents); i++) {
  2407. if (ccs_module_idents[i].mipi_manufacturer_id &&
  2408. ccs_module_idents[i].mipi_manufacturer_id
  2409. != minfo->mipi_manufacturer_id)
  2410. continue;
  2411. if (ccs_module_idents[i].smia_manufacturer_id &&
  2412. ccs_module_idents[i].smia_manufacturer_id
  2413. != minfo->smia_manufacturer_id)
  2414. continue;
  2415. if (ccs_module_idents[i].model_id != minfo->model_id)
  2416. continue;
  2417. if (ccs_module_idents[i].flags
  2418. & CCS_MODULE_IDENT_FLAG_REV_LE) {
  2419. if (ccs_module_idents[i].revision_number_major
  2420. < (minfo->revision_number >> 8))
  2421. continue;
  2422. } else {
  2423. if (ccs_module_idents[i].revision_number_major
  2424. != (minfo->revision_number >> 8))
  2425. continue;
  2426. }
  2427. minfo->name = ccs_module_idents[i].name;
  2428. minfo->quirk = ccs_module_idents[i].quirk;
  2429. break;
  2430. }
  2431. dev_dbg(&client->dev, "the sensor is called %s\n", minfo->name);
  2432. return 0;
  2433. }
  2434. static const struct v4l2_subdev_ops ccs_ops;
  2435. static const struct media_entity_operations ccs_entity_ops;
  2436. static int ccs_register_subdev(struct ccs_sensor *sensor,
  2437. struct ccs_subdev *ssd,
  2438. struct ccs_subdev *sink_ssd,
  2439. u16 source_pad, u16 sink_pad, u32 link_flags)
  2440. {
  2441. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  2442. int rval;
  2443. if (!sink_ssd)
  2444. return 0;
  2445. rval = v4l2_device_register_subdev(sensor->src->sd.v4l2_dev, &ssd->sd);
  2446. if (rval) {
  2447. dev_err(&client->dev, "v4l2_device_register_subdev failed\n");
  2448. return rval;
  2449. }
  2450. rval = media_create_pad_link(&ssd->sd.entity, source_pad,
  2451. &sink_ssd->sd.entity, sink_pad,
  2452. link_flags);
  2453. if (rval) {
  2454. dev_err(&client->dev, "media_create_pad_link failed\n");
  2455. v4l2_device_unregister_subdev(&ssd->sd);
  2456. return rval;
  2457. }
  2458. return 0;
  2459. }
  2460. static void ccs_unregistered(struct v4l2_subdev *subdev)
  2461. {
  2462. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2463. unsigned int i;
  2464. for (i = 1; i < sensor->ssds_used; i++)
  2465. v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
  2466. }
  2467. static int ccs_registered(struct v4l2_subdev *subdev)
  2468. {
  2469. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  2470. int rval;
  2471. if (sensor->scaler) {
  2472. rval = ccs_register_subdev(sensor, sensor->binner,
  2473. sensor->scaler,
  2474. CCS_PAD_SRC, CCS_PAD_SINK,
  2475. MEDIA_LNK_FL_ENABLED |
  2476. MEDIA_LNK_FL_IMMUTABLE);
  2477. if (rval < 0)
  2478. return rval;
  2479. }
  2480. rval = ccs_register_subdev(sensor, sensor->pixel_array, sensor->binner,
  2481. CCS_PA_PAD_SRC, CCS_PAD_SINK,
  2482. MEDIA_LNK_FL_ENABLED |
  2483. MEDIA_LNK_FL_IMMUTABLE);
  2484. if (rval)
  2485. goto out_err;
  2486. return 0;
  2487. out_err:
  2488. ccs_unregistered(subdev);
  2489. return rval;
  2490. }
  2491. static void ccs_cleanup(struct ccs_sensor *sensor)
  2492. {
  2493. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  2494. unsigned int i;
  2495. for (i = 0; i < sensor->ssds_used; i++) {
  2496. v4l2_subdev_cleanup(&sensor->ssds[2].sd);
  2497. media_entity_cleanup(&sensor->ssds[i].sd.entity);
  2498. }
  2499. device_remove_file(&client->dev, &dev_attr_nvm);
  2500. device_remove_file(&client->dev, &dev_attr_ident);
  2501. ccs_free_controls(sensor);
  2502. }
  2503. static const struct v4l2_subdev_internal_ops ccs_internal_ops;
  2504. static int ccs_init_subdev(struct ccs_sensor *sensor,
  2505. struct ccs_subdev *ssd, const char *name,
  2506. unsigned short num_pads, u32 function,
  2507. const char *lock_name,
  2508. struct lock_class_key *lock_key)
  2509. {
  2510. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  2511. int rval;
  2512. if (!ssd)
  2513. return 0;
  2514. if (ssd != sensor->src) {
  2515. v4l2_subdev_init(&ssd->sd, &ccs_ops);
  2516. ssd->sd.internal_ops = &ccs_internal_ops;
  2517. }
  2518. ssd->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  2519. ssd->sd.entity.function = function;
  2520. ssd->sd.state_lock = &sensor->mutex;
  2521. ssd->sensor = sensor;
  2522. ssd->npads = num_pads;
  2523. ssd->source_pad = num_pads - 1;
  2524. v4l2_i2c_subdev_set_name(&ssd->sd, client, sensor->minfo.name, name);
  2525. ssd->pads[ssd->source_pad].flags = MEDIA_PAD_FL_SOURCE;
  2526. if (ssd != sensor->pixel_array)
  2527. ssd->pads[ssd->sink_pad].flags = MEDIA_PAD_FL_SINK;
  2528. ssd->sd.entity.ops = &ccs_entity_ops;
  2529. if (ssd != sensor->src) {
  2530. ssd->sd.owner = THIS_MODULE;
  2531. ssd->sd.dev = &client->dev;
  2532. v4l2_set_subdevdata(&ssd->sd, client);
  2533. }
  2534. rval = media_entity_pads_init(&ssd->sd.entity, ssd->npads, ssd->pads);
  2535. if (rval) {
  2536. dev_err(&client->dev, "media_entity_pads_init failed\n");
  2537. return rval;
  2538. }
  2539. rval = __v4l2_subdev_init_finalize(&ssd->sd, lock_name, lock_key);
  2540. if (rval) {
  2541. media_entity_cleanup(&ssd->sd.entity);
  2542. return rval;
  2543. }
  2544. return 0;
  2545. }
  2546. static int ccs_init_state(struct v4l2_subdev *sd,
  2547. struct v4l2_subdev_state *sd_state)
  2548. {
  2549. struct ccs_subdev *ssd = to_ccs_subdev(sd);
  2550. struct ccs_sensor *sensor = ssd->sensor;
  2551. unsigned int pad = ssd == sensor->pixel_array ?
  2552. CCS_PA_PAD_SRC : CCS_PAD_SINK;
  2553. struct v4l2_mbus_framefmt *fmt =
  2554. v4l2_subdev_state_get_format(sd_state, pad);
  2555. struct v4l2_rect *crop =
  2556. v4l2_subdev_state_get_crop(sd_state, pad);
  2557. ccs_get_native_size(ssd, crop);
  2558. fmt->width = crop->width;
  2559. fmt->height = crop->height;
  2560. fmt->code = sensor->internal_csi_format->code;
  2561. fmt->field = V4L2_FIELD_NONE;
  2562. if (ssd == sensor->pixel_array)
  2563. return 0;
  2564. fmt = v4l2_subdev_state_get_format(sd_state, CCS_PAD_SRC);
  2565. fmt->code = ssd == sensor->src ?
  2566. sensor->csi_format->code : sensor->internal_csi_format->code;
  2567. fmt->field = V4L2_FIELD_NONE;
  2568. ccs_propagate(sd, sd_state, V4L2_SEL_TGT_CROP);
  2569. return 0;
  2570. }
  2571. static const struct v4l2_subdev_video_ops ccs_video_ops = {
  2572. .s_stream = v4l2_subdev_s_stream_helper,
  2573. .pre_streamon = ccs_pre_streamon,
  2574. .post_streamoff = ccs_post_streamoff,
  2575. };
  2576. static const struct v4l2_subdev_pad_ops ccs_pad_ops = {
  2577. .enum_mbus_code = ccs_enum_mbus_code,
  2578. .get_fmt = ccs_get_format,
  2579. .set_fmt = ccs_set_format,
  2580. .get_selection = ccs_get_selection,
  2581. .set_selection = ccs_set_selection,
  2582. .enable_streams = ccs_enable_streams,
  2583. .disable_streams = ccs_disable_streams,
  2584. .get_frame_desc = ccs_get_frame_desc,
  2585. };
  2586. static const struct v4l2_subdev_sensor_ops ccs_sensor_ops = {
  2587. .g_skip_frames = ccs_get_skip_frames,
  2588. .g_skip_top_lines = ccs_get_skip_top_lines,
  2589. };
  2590. static const struct v4l2_subdev_ops ccs_ops = {
  2591. .video = &ccs_video_ops,
  2592. .pad = &ccs_pad_ops,
  2593. .sensor = &ccs_sensor_ops,
  2594. };
  2595. static const struct media_entity_operations ccs_entity_ops = {
  2596. .link_validate = v4l2_subdev_link_validate,
  2597. };
  2598. static const struct v4l2_subdev_internal_ops ccs_internal_ops = {
  2599. .init_state = ccs_init_state,
  2600. };
  2601. static const struct v4l2_subdev_internal_ops ccs_internal_src_ops = {
  2602. .init_state = ccs_init_state,
  2603. .registered = ccs_registered,
  2604. .unregistered = ccs_unregistered,
  2605. };
  2606. /* -----------------------------------------------------------------------------
  2607. * I2C Driver
  2608. */
  2609. static int ccs_get_hwconfig(struct ccs_sensor *sensor, struct device *dev)
  2610. {
  2611. struct v4l2_fwnode_endpoint bus_cfg = { .bus_type = V4L2_MBUS_UNKNOWN };
  2612. struct fwnode_handle *fwnode = dev_fwnode(dev), *ep;
  2613. struct ccs_hwconfig *hwcfg = &sensor->hwcfg;
  2614. int rval;
  2615. ep = fwnode_graph_get_endpoint_by_id(fwnode, 0, 0,
  2616. FWNODE_GRAPH_ENDPOINT_NEXT);
  2617. if (!ep)
  2618. return -ENODEV;
  2619. /*
  2620. * Note that we do need to rely on detecting the bus type between CSI-2
  2621. * D-PHY and CCP2 as the old bindings did not require it.
  2622. */
  2623. rval = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
  2624. if (rval)
  2625. goto out_err;
  2626. switch (bus_cfg.bus_type) {
  2627. case V4L2_MBUS_CSI2_DPHY:
  2628. hwcfg->csi_signalling_mode = CCS_CSI_SIGNALING_MODE_CSI_2_DPHY;
  2629. hwcfg->lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
  2630. break;
  2631. case V4L2_MBUS_CSI2_CPHY:
  2632. hwcfg->csi_signalling_mode = CCS_CSI_SIGNALING_MODE_CSI_2_CPHY;
  2633. hwcfg->lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
  2634. break;
  2635. case V4L2_MBUS_CSI1:
  2636. case V4L2_MBUS_CCP2:
  2637. hwcfg->csi_signalling_mode = bus_cfg.bus.mipi_csi1.strobe ?
  2638. SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_STROBE :
  2639. SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_CLOCK;
  2640. hwcfg->lanes = 1;
  2641. break;
  2642. default:
  2643. dev_err(dev, "unsupported bus %u\n", bus_cfg.bus_type);
  2644. rval = -EINVAL;
  2645. goto out_err;
  2646. }
  2647. dev_dbg(dev, "signalling mode: %u\n", hwcfg->csi_signalling_mode);
  2648. if (!bus_cfg.nr_of_link_frequencies) {
  2649. dev_warn(dev, "no link frequencies defined\n");
  2650. rval = -EINVAL;
  2651. goto out_err;
  2652. }
  2653. hwcfg->op_sys_clock =
  2654. devm_kcalloc(dev,
  2655. bus_cfg.nr_of_link_frequencies + 1 /* guardian */,
  2656. sizeof(*hwcfg->op_sys_clock), GFP_KERNEL);
  2657. if (!hwcfg->op_sys_clock) {
  2658. rval = -ENOMEM;
  2659. goto out_err;
  2660. }
  2661. for (unsigned int i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
  2662. hwcfg->op_sys_clock[i] = bus_cfg.link_frequencies[i];
  2663. dev_dbg(dev, "freq %u: %lld\n", i, hwcfg->op_sys_clock[i]);
  2664. }
  2665. fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
  2666. &hwcfg->ext_clk);
  2667. out_err:
  2668. v4l2_fwnode_endpoint_free(&bus_cfg);
  2669. fwnode_handle_put(ep);
  2670. return rval;
  2671. }
  2672. static int ccs_firmware_name(struct i2c_client *client,
  2673. struct ccs_sensor *sensor, char *filename,
  2674. size_t filename_size, bool is_module)
  2675. {
  2676. const struct ccs_device *ccsdev = device_get_match_data(&client->dev);
  2677. bool is_ccs = !(ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA);
  2678. bool is_smiapp = sensor->minfo.smiapp_version;
  2679. u16 manufacturer_id;
  2680. u16 model_id;
  2681. u16 revision_number;
  2682. /*
  2683. * Old SMIA is module-agnostic. Its sensor identification is based on
  2684. * what now are those of the module.
  2685. */
  2686. if (is_module || (!is_ccs && !is_smiapp)) {
  2687. manufacturer_id = is_ccs ?
  2688. sensor->minfo.mipi_manufacturer_id :
  2689. sensor->minfo.smia_manufacturer_id;
  2690. model_id = sensor->minfo.model_id;
  2691. revision_number = sensor->minfo.revision_number;
  2692. } else {
  2693. manufacturer_id = is_ccs ?
  2694. sensor->minfo.sensor_mipi_manufacturer_id :
  2695. sensor->minfo.sensor_smia_manufacturer_id;
  2696. model_id = sensor->minfo.sensor_model_id;
  2697. revision_number = sensor->minfo.sensor_revision_number;
  2698. }
  2699. return snprintf(filename, filename_size,
  2700. "ccs/%s-%s-%0*x-%4.4x-%0*x.fw",
  2701. is_ccs ? "ccs" : is_smiapp ? "smiapp" : "smia",
  2702. is_module || (!is_ccs && !is_smiapp) ?
  2703. "module" : "sensor",
  2704. is_ccs ? 4 : 2, manufacturer_id, model_id,
  2705. !is_ccs && !is_module ? 2 : 4, revision_number);
  2706. }
  2707. static int ccs_probe(struct i2c_client *client)
  2708. {
  2709. static struct lock_class_key pixel_array_lock_key, binner_lock_key,
  2710. scaler_lock_key;
  2711. const struct ccs_device *ccsdev = device_get_match_data(&client->dev);
  2712. struct ccs_sensor *sensor;
  2713. const struct firmware *fw;
  2714. char filename[40];
  2715. unsigned int i;
  2716. int rval;
  2717. sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
  2718. if (sensor == NULL)
  2719. return -ENOMEM;
  2720. rval = ccs_get_hwconfig(sensor, &client->dev);
  2721. if (rval)
  2722. return rval;
  2723. sensor->src = &sensor->ssds[sensor->ssds_used];
  2724. v4l2_i2c_subdev_init(&sensor->src->sd, client, &ccs_ops);
  2725. sensor->src->sd.internal_ops = &ccs_internal_src_ops;
  2726. sensor->regulators = devm_kcalloc(&client->dev,
  2727. ARRAY_SIZE(ccs_regulators),
  2728. sizeof(*sensor->regulators),
  2729. GFP_KERNEL);
  2730. if (!sensor->regulators)
  2731. return -ENOMEM;
  2732. for (i = 0; i < ARRAY_SIZE(ccs_regulators); i++)
  2733. sensor->regulators[i].supply = ccs_regulators[i];
  2734. rval = devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(ccs_regulators),
  2735. sensor->regulators);
  2736. if (rval) {
  2737. dev_err(&client->dev, "could not get regulators\n");
  2738. return rval;
  2739. }
  2740. sensor->ext_clk = devm_v4l2_sensor_clk_get(&client->dev, NULL);
  2741. if (IS_ERR(sensor->ext_clk))
  2742. return dev_err_probe(&client->dev, PTR_ERR(sensor->ext_clk),
  2743. "could not get clock\n");
  2744. if (sensor->hwcfg.ext_clk) {
  2745. unsigned long rate;
  2746. rval = clk_set_rate(sensor->ext_clk, sensor->hwcfg.ext_clk);
  2747. if (rval < 0)
  2748. return dev_err_probe(&client->dev, rval,
  2749. "unable to set clock freq to %u\n",
  2750. sensor->hwcfg.ext_clk);
  2751. rate = clk_get_rate(sensor->ext_clk);
  2752. if (rate != sensor->hwcfg.ext_clk) {
  2753. return dev_err_probe(&client->dev, -EINVAL,
  2754. "can't set clock freq, asked for %u but got %lu\n",
  2755. sensor->hwcfg.ext_clk, rate);
  2756. }
  2757. } else {
  2758. sensor->hwcfg.ext_clk = clk_get_rate(sensor->ext_clk);
  2759. dev_dbg(&client->dev, "obtained clock freq %u\n",
  2760. sensor->hwcfg.ext_clk);
  2761. }
  2762. if (!sensor->hwcfg.ext_clk) {
  2763. dev_err(&client->dev, "cannot work with xclk frequency 0\n");
  2764. return -EINVAL;
  2765. }
  2766. sensor->reset = devm_gpiod_get_optional(&client->dev, "reset",
  2767. GPIOD_OUT_HIGH);
  2768. if (IS_ERR(sensor->reset))
  2769. return PTR_ERR(sensor->reset);
  2770. /* Support old users that may have used "xshutdown" property. */
  2771. if (!sensor->reset)
  2772. sensor->xshutdown = devm_gpiod_get_optional(&client->dev,
  2773. "xshutdown",
  2774. GPIOD_OUT_LOW);
  2775. if (IS_ERR(sensor->xshutdown))
  2776. return PTR_ERR(sensor->xshutdown);
  2777. sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
  2778. if (IS_ERR(sensor->regmap)) {
  2779. dev_err(&client->dev, "can't initialise CCI (%pe)\n",
  2780. sensor->regmap);
  2781. return PTR_ERR(sensor->regmap);
  2782. }
  2783. rval = ccs_power_on(&client->dev);
  2784. if (rval < 0)
  2785. return rval;
  2786. mutex_init(&sensor->mutex);
  2787. rval = ccs_identify_module(sensor);
  2788. if (rval) {
  2789. rval = -ENODEV;
  2790. goto out_power_off;
  2791. }
  2792. rval = ccs_firmware_name(client, sensor, filename, sizeof(filename),
  2793. false);
  2794. if (rval >= sizeof(filename)) {
  2795. rval = -ENOMEM;
  2796. goto out_power_off;
  2797. }
  2798. rval = request_firmware(&fw, filename, &client->dev);
  2799. if (!rval) {
  2800. rval = ccs_data_parse(&sensor->sdata, fw->data, fw->size,
  2801. &client->dev, true);
  2802. release_firmware(fw);
  2803. if (rval)
  2804. goto out_power_off;
  2805. }
  2806. if (!(ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA) ||
  2807. sensor->minfo.smiapp_version) {
  2808. rval = ccs_firmware_name(client, sensor, filename,
  2809. sizeof(filename), true);
  2810. if (rval >= sizeof(filename)) {
  2811. rval = -ENOMEM;
  2812. goto out_release_sdata;
  2813. }
  2814. rval = request_firmware(&fw, filename, &client->dev);
  2815. if (!rval) {
  2816. rval = ccs_data_parse(&sensor->mdata, fw->data,
  2817. fw->size, &client->dev, true);
  2818. release_firmware(fw);
  2819. if (rval)
  2820. goto out_release_sdata;
  2821. }
  2822. }
  2823. rval = ccs_read_all_limits(sensor);
  2824. if (rval)
  2825. goto out_release_mdata;
  2826. rval = ccs_read_frame_fmt(sensor);
  2827. if (rval) {
  2828. rval = -ENODEV;
  2829. goto out_free_ccs_limits;
  2830. }
  2831. rval = ccs_update_phy_ctrl(sensor);
  2832. if (rval < 0)
  2833. goto out_free_ccs_limits;
  2834. rval = ccs_call_quirk(sensor, limits);
  2835. if (rval) {
  2836. dev_err(&client->dev, "limits quirks failed\n");
  2837. goto out_free_ccs_limits;
  2838. }
  2839. if (CCS_LIM(sensor, BINNING_CAPABILITY)) {
  2840. sensor->nbinning_subtypes =
  2841. min_t(u8, CCS_LIM(sensor, BINNING_SUB_TYPES),
  2842. CCS_LIM_BINNING_SUB_TYPE_MAX_N);
  2843. for (i = 0; i < sensor->nbinning_subtypes; i++) {
  2844. sensor->binning_subtypes[i].horizontal =
  2845. CCS_LIM_AT(sensor, BINNING_SUB_TYPE, i) >>
  2846. CCS_BINNING_SUB_TYPE_COLUMN_SHIFT;
  2847. sensor->binning_subtypes[i].vertical =
  2848. CCS_LIM_AT(sensor, BINNING_SUB_TYPE, i) &
  2849. CCS_BINNING_SUB_TYPE_ROW_MASK;
  2850. dev_dbg(&client->dev, "binning %xx%x\n",
  2851. sensor->binning_subtypes[i].horizontal,
  2852. sensor->binning_subtypes[i].vertical);
  2853. }
  2854. }
  2855. if (device_create_file(&client->dev, &dev_attr_ident) != 0) {
  2856. dev_err(&client->dev, "sysfs ident entry creation failed\n");
  2857. rval = -ENOENT;
  2858. goto out_free_ccs_limits;
  2859. }
  2860. if (sensor->minfo.smiapp_version &&
  2861. CCS_LIM(sensor, DATA_TRANSFER_IF_CAPABILITY) &
  2862. CCS_DATA_TRANSFER_IF_CAPABILITY_SUPPORTED) {
  2863. if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
  2864. dev_err(&client->dev, "sysfs nvm entry failed\n");
  2865. rval = -EBUSY;
  2866. goto out_cleanup;
  2867. }
  2868. }
  2869. if (!CCS_LIM(sensor, MIN_OP_SYS_CLK_DIV) ||
  2870. !CCS_LIM(sensor, MAX_OP_SYS_CLK_DIV) ||
  2871. !CCS_LIM(sensor, MIN_OP_PIX_CLK_DIV) ||
  2872. !CCS_LIM(sensor, MAX_OP_PIX_CLK_DIV)) {
  2873. /* No OP clock branch */
  2874. sensor->pll.flags |= CCS_PLL_FLAG_NO_OP_CLOCKS;
  2875. } else if (CCS_LIM(sensor, SCALING_CAPABILITY)
  2876. != CCS_SCALING_CAPABILITY_NONE ||
  2877. CCS_LIM(sensor, DIGITAL_CROP_CAPABILITY)
  2878. == CCS_DIGITAL_CROP_CAPABILITY_INPUT_CROP) {
  2879. /* We have a scaler or digital crop. */
  2880. sensor->scaler = &sensor->ssds[sensor->ssds_used];
  2881. sensor->ssds_used++;
  2882. }
  2883. sensor->binner = &sensor->ssds[sensor->ssds_used];
  2884. sensor->ssds_used++;
  2885. sensor->pixel_array = &sensor->ssds[sensor->ssds_used];
  2886. sensor->ssds_used++;
  2887. /* prepare PLL configuration input values */
  2888. switch (sensor->hwcfg.csi_signalling_mode) {
  2889. case CCS_CSI_SIGNALING_MODE_CSI_2_CPHY:
  2890. sensor->pll.bus_type = CCS_PLL_BUS_TYPE_CSI2_CPHY;
  2891. break;
  2892. case CCS_CSI_SIGNALING_MODE_CSI_2_DPHY:
  2893. case SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_CLOCK:
  2894. case SMIAPP_CSI_SIGNALLING_MODE_CCP2_DATA_STROBE:
  2895. sensor->pll.bus_type = CCS_PLL_BUS_TYPE_CSI2_DPHY;
  2896. break;
  2897. default:
  2898. dev_err(&client->dev, "unsupported signalling mode %u\n",
  2899. sensor->hwcfg.csi_signalling_mode);
  2900. rval = -EINVAL;
  2901. goto out_cleanup;
  2902. }
  2903. sensor->pll.csi2.lanes = sensor->hwcfg.lanes;
  2904. if (CCS_LIM(sensor, CLOCK_CALCULATION) &
  2905. CCS_CLOCK_CALCULATION_LANE_SPEED) {
  2906. sensor->pll.flags |= CCS_PLL_FLAG_LANE_SPEED_MODEL;
  2907. if (CCS_LIM(sensor, CLOCK_CALCULATION) &
  2908. CCS_CLOCK_CALCULATION_LINK_DECOUPLED) {
  2909. sensor->pll.vt_lanes =
  2910. CCS_LIM(sensor, NUM_OF_VT_LANES) + 1;
  2911. sensor->pll.op_lanes =
  2912. CCS_LIM(sensor, NUM_OF_OP_LANES) + 1;
  2913. } else {
  2914. sensor->pll.vt_lanes = sensor->pll.csi2.lanes;
  2915. sensor->pll.op_lanes = sensor->pll.csi2.lanes;
  2916. }
  2917. }
  2918. if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
  2919. CCS_CLOCK_TREE_PLL_CAPABILITY_EXT_DIVIDER)
  2920. sensor->pll.flags |= CCS_PLL_FLAG_EXT_IP_PLL_DIVIDER;
  2921. if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
  2922. CCS_CLOCK_TREE_PLL_CAPABILITY_FLEXIBLE_OP_PIX_CLK_DIV)
  2923. sensor->pll.flags |= CCS_PLL_FLAG_FLEXIBLE_OP_PIX_CLK_DIV;
  2924. if (CCS_LIM(sensor, FIFO_SUPPORT_CAPABILITY) &
  2925. CCS_FIFO_SUPPORT_CAPABILITY_DERATING)
  2926. sensor->pll.flags |= CCS_PLL_FLAG_FIFO_DERATING;
  2927. if (CCS_LIM(sensor, FIFO_SUPPORT_CAPABILITY) &
  2928. CCS_FIFO_SUPPORT_CAPABILITY_DERATING_OVERRATING)
  2929. sensor->pll.flags |= CCS_PLL_FLAG_FIFO_DERATING |
  2930. CCS_PLL_FLAG_FIFO_OVERRATING;
  2931. if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
  2932. CCS_CLOCK_TREE_PLL_CAPABILITY_DUAL_PLL) {
  2933. if (CCS_LIM(sensor, CLOCK_TREE_PLL_CAPABILITY) &
  2934. CCS_CLOCK_TREE_PLL_CAPABILITY_SINGLE_PLL) {
  2935. u32 v;
  2936. /* Use sensor default in PLL mode selection */
  2937. rval = ccs_read(sensor, PLL_MODE, &v);
  2938. if (rval)
  2939. goto out_cleanup;
  2940. if (v == CCS_PLL_MODE_DUAL)
  2941. sensor->pll.flags |= CCS_PLL_FLAG_DUAL_PLL;
  2942. } else {
  2943. sensor->pll.flags |= CCS_PLL_FLAG_DUAL_PLL;
  2944. }
  2945. if (CCS_LIM(sensor, CLOCK_CALCULATION) &
  2946. CCS_CLOCK_CALCULATION_DUAL_PLL_OP_SYS_DDR)
  2947. sensor->pll.flags |= CCS_PLL_FLAG_OP_SYS_DDR;
  2948. if (CCS_LIM(sensor, CLOCK_CALCULATION) &
  2949. CCS_CLOCK_CALCULATION_DUAL_PLL_OP_PIX_DDR)
  2950. sensor->pll.flags |= CCS_PLL_FLAG_OP_PIX_DDR;
  2951. }
  2952. sensor->pll.op_bits_per_lane = CCS_LIM(sensor, OP_BITS_PER_LANE);
  2953. sensor->pll.ext_clk_freq_hz = sensor->hwcfg.ext_clk;
  2954. sensor->pll.scale_n = CCS_LIM(sensor, SCALER_N_MIN);
  2955. rval = ccs_get_mbus_formats(sensor);
  2956. if (rval) {
  2957. rval = -ENODEV;
  2958. goto out_cleanup;
  2959. }
  2960. rval = ccs_init_subdev(sensor, sensor->scaler, " scaler", 2,
  2961. MEDIA_ENT_F_PROC_VIDEO_SCALER,
  2962. "ccs scaler mutex", &scaler_lock_key);
  2963. if (rval)
  2964. goto out_cleanup;
  2965. rval = ccs_init_subdev(sensor, sensor->binner, " binner", 2,
  2966. MEDIA_ENT_F_PROC_VIDEO_SCALER,
  2967. "ccs binner mutex", &binner_lock_key);
  2968. if (rval)
  2969. goto out_cleanup;
  2970. rval = ccs_init_subdev(sensor, sensor->pixel_array, " pixel_array", 1,
  2971. MEDIA_ENT_F_CAM_SENSOR, "ccs pixel array mutex",
  2972. &pixel_array_lock_key);
  2973. if (rval)
  2974. goto out_cleanup;
  2975. rval = ccs_init_controls(sensor);
  2976. if (rval < 0)
  2977. goto out_cleanup;
  2978. rval = ccs_call_quirk(sensor, init);
  2979. if (rval)
  2980. goto out_cleanup;
  2981. rval = ccs_init_late_controls(sensor);
  2982. if (rval) {
  2983. rval = -ENODEV;
  2984. goto out_cleanup;
  2985. }
  2986. scoped_guard(mutex, &sensor->mutex)
  2987. rval = ccs_pll_blanking_update(sensor);
  2988. if (rval) {
  2989. dev_err(&client->dev, "update mode failed\n");
  2990. goto out_cleanup;
  2991. }
  2992. sensor->dev_init_done = true;
  2993. sensor->handler_setup_needed = true;
  2994. rval = ccs_write_msr_regs(sensor);
  2995. if (rval)
  2996. goto out_cleanup;
  2997. pm_runtime_set_active(&client->dev);
  2998. pm_runtime_get_noresume(&client->dev);
  2999. pm_runtime_enable(&client->dev);
  3000. rval = v4l2_async_register_subdev_sensor(&sensor->src->sd);
  3001. if (rval < 0)
  3002. goto out_disable_runtime_pm;
  3003. pm_runtime_set_autosuspend_delay(&client->dev, 1000);
  3004. pm_runtime_use_autosuspend(&client->dev);
  3005. pm_runtime_put_autosuspend(&client->dev);
  3006. return 0;
  3007. out_disable_runtime_pm:
  3008. pm_runtime_put_noidle(&client->dev);
  3009. pm_runtime_disable(&client->dev);
  3010. pm_runtime_set_suspended(&client->dev);
  3011. out_cleanup:
  3012. ccs_cleanup(sensor);
  3013. out_free_ccs_limits:
  3014. kfree(sensor->ccs_limits);
  3015. out_release_mdata:
  3016. kvfree(sensor->mdata.backing);
  3017. out_release_sdata:
  3018. kvfree(sensor->sdata.backing);
  3019. out_power_off:
  3020. ccs_power_off(&client->dev);
  3021. mutex_destroy(&sensor->mutex);
  3022. return rval;
  3023. }
  3024. static void ccs_remove(struct i2c_client *client)
  3025. {
  3026. struct v4l2_subdev *subdev = i2c_get_clientdata(client);
  3027. struct ccs_sensor *sensor = to_ccs_sensor(subdev);
  3028. unsigned int i;
  3029. v4l2_async_unregister_subdev(subdev);
  3030. pm_runtime_disable(&client->dev);
  3031. if (!pm_runtime_status_suspended(&client->dev)) {
  3032. ccs_power_off(&client->dev);
  3033. pm_runtime_set_suspended(&client->dev);
  3034. }
  3035. for (i = 0; i < sensor->ssds_used; i++)
  3036. v4l2_device_unregister_subdev(&sensor->ssds[i].sd);
  3037. ccs_cleanup(sensor);
  3038. mutex_destroy(&sensor->mutex);
  3039. kfree(sensor->ccs_limits);
  3040. kvfree(sensor->sdata.backing);
  3041. kvfree(sensor->mdata.backing);
  3042. }
  3043. static const struct ccs_device smia_device = {
  3044. .flags = CCS_DEVICE_FLAG_IS_SMIA,
  3045. };
  3046. static const struct ccs_device ccs_device = {};
  3047. static const struct acpi_device_id ccs_acpi_table[] = {
  3048. { .id = "MIPI0200", .driver_data = (unsigned long)&ccs_device },
  3049. { },
  3050. };
  3051. MODULE_DEVICE_TABLE(acpi, ccs_acpi_table);
  3052. static const struct of_device_id ccs_of_table[] = {
  3053. { .compatible = "mipi-ccs-1.1", .data = &ccs_device },
  3054. { .compatible = "mipi-ccs-1.0", .data = &ccs_device },
  3055. { .compatible = "mipi-ccs", .data = &ccs_device },
  3056. { .compatible = "nokia,smia", .data = &smia_device },
  3057. { },
  3058. };
  3059. MODULE_DEVICE_TABLE(of, ccs_of_table);
  3060. static const struct dev_pm_ops ccs_pm_ops = {
  3061. SET_RUNTIME_PM_OPS(ccs_power_off, ccs_power_on, NULL)
  3062. };
  3063. static struct i2c_driver ccs_i2c_driver = {
  3064. .driver = {
  3065. .acpi_match_table = ccs_acpi_table,
  3066. .of_match_table = ccs_of_table,
  3067. .name = CCS_NAME,
  3068. .pm = &ccs_pm_ops,
  3069. },
  3070. .probe = ccs_probe,
  3071. .remove = ccs_remove,
  3072. };
  3073. static int ccs_module_init(void)
  3074. {
  3075. unsigned int i, l;
  3076. CCS_BUILD_BUG;
  3077. for (i = 0, l = 0; ccs_limits[i].size && l < CCS_L_LAST; i++) {
  3078. if (!(ccs_limits[i].flags & CCS_L_FL_SAME_REG)) {
  3079. ccs_limit_offsets[l + 1].lim =
  3080. ALIGN(ccs_limit_offsets[l].lim +
  3081. ccs_limits[i].size,
  3082. ccs_limits[i + 1].reg ?
  3083. CCI_REG_WIDTH_BYTES(ccs_limits[i + 1].reg) :
  3084. 1U);
  3085. ccs_limit_offsets[l].info = i;
  3086. l++;
  3087. } else {
  3088. ccs_limit_offsets[l].lim += ccs_limits[i].size;
  3089. }
  3090. }
  3091. if (WARN_ON(ccs_limits[i].size))
  3092. return -EINVAL;
  3093. if (WARN_ON(l != CCS_L_LAST))
  3094. return -EINVAL;
  3095. return i2c_register_driver(THIS_MODULE, &ccs_i2c_driver);
  3096. }
  3097. static void ccs_module_cleanup(void)
  3098. {
  3099. i2c_del_driver(&ccs_i2c_driver);
  3100. }
  3101. module_init(ccs_module_init);
  3102. module_exit(ccs_module_cleanup);
  3103. MODULE_AUTHOR("Sakari Ailus <sakari.ailus@linux.intel.com>");
  3104. MODULE_DESCRIPTION("Generic MIPI CCS/SMIA/SMIA++ camera sensor driver");
  3105. MODULE_LICENSE("GPL v2");
  3106. MODULE_ALIAS("smiapp");