mt9m114.c 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * mt9m114.c onsemi MT9M114 sensor driver
  4. *
  5. * Copyright (c) 2020-2023 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  6. * Copyright (c) 2012 Analog Devices Inc.
  7. *
  8. * Almost complete rewrite of work by Scott Jiang <Scott.Jiang.Linux@gmail.com>
  9. * itself based on work from Andrew Chew <achew@nvidia.com>.
  10. */
  11. #include <linux/clk.h>
  12. #include <linux/delay.h>
  13. #include <linux/errno.h>
  14. #include <linux/gpio/consumer.h>
  15. #include <linux/i2c.h>
  16. #include <linux/mod_devicetable.h>
  17. #include <linux/module.h>
  18. #include <linux/mutex.h>
  19. #include <linux/pm_runtime.h>
  20. #include <linux/property.h>
  21. #include <linux/regmap.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/types.h>
  24. #include <linux/videodev2.h>
  25. #include <media/v4l2-async.h>
  26. #include <media/v4l2-cci.h>
  27. #include <media/v4l2-ctrls.h>
  28. #include <media/v4l2-device.h>
  29. #include <media/v4l2-fwnode.h>
  30. #include <media/v4l2-mediabus.h>
  31. #include <media/v4l2-subdev.h>
  32. #include "aptina-pll.h"
  33. /* Sysctl registers */
  34. #define MT9M114_CHIP_ID CCI_REG16(0x0000)
  35. #define MT9M114_COMMAND_REGISTER CCI_REG16(0x0080)
  36. #define MT9M114_COMMAND_REGISTER_APPLY_PATCH BIT(0)
  37. #define MT9M114_COMMAND_REGISTER_SET_STATE BIT(1)
  38. #define MT9M114_COMMAND_REGISTER_REFRESH BIT(2)
  39. #define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT BIT(3)
  40. #define MT9M114_COMMAND_REGISTER_OK BIT(15)
  41. #define MT9M114_RESET_AND_MISC_CONTROL CCI_REG16(0x001a)
  42. #define MT9M114_RESET_SOC BIT(0)
  43. #define MT9M114_PAD_SLEW CCI_REG16(0x001e)
  44. #define MT9M114_PAD_SLEW_MIN 0
  45. #define MT9M114_PAD_SLEW_MAX 7
  46. #define MT9M114_PAD_SLEW_DEFAULT 7
  47. #define MT9M114_PAD_CONTROL CCI_REG16(0x0032)
  48. /* XDMA registers */
  49. #define MT9M114_ACCESS_CTL_STAT CCI_REG16(0x0982)
  50. #define MT9M114_PHYSICAL_ADDRESS_ACCESS CCI_REG16(0x098a)
  51. #define MT9M114_LOGICAL_ADDRESS_ACCESS CCI_REG16(0x098e)
  52. /* Sensor Core registers */
  53. #define MT9M114_COARSE_INTEGRATION_TIME CCI_REG16(0x3012)
  54. #define MT9M114_FINE_INTEGRATION_TIME CCI_REG16(0x3014)
  55. #define MT9M114_RESET_REGISTER CCI_REG16(0x301a)
  56. #define MT9M114_RESET_REGISTER_LOCK_REG BIT(3)
  57. #define MT9M114_RESET_REGISTER_MASK_BAD BIT(9)
  58. #define MT9M114_FLASH CCI_REG16(0x3046)
  59. #define MT9M114_GREEN1_GAIN CCI_REG16(0x3056)
  60. #define MT9M114_BLUE_GAIN CCI_REG16(0x3058)
  61. #define MT9M114_RED_GAIN CCI_REG16(0x305a)
  62. #define MT9M114_GREEN2_GAIN CCI_REG16(0x305c)
  63. #define MT9M114_GLOBAL_GAIN CCI_REG16(0x305e)
  64. #define MT9M114_GAIN_DIGITAL_GAIN(n) ((n) << 12)
  65. #define MT9M114_GAIN_DIGITAL_GAIN_MASK (0xf << 12)
  66. #define MT9M114_GAIN_ANALOG_GAIN(n) ((n) << 0)
  67. #define MT9M114_GAIN_ANALOG_GAIN_MASK (0xff << 0)
  68. #define MT9M114_CUSTOMER_REV CCI_REG16(0x31fe)
  69. /* Monitor registers */
  70. #define MT9M114_MON_MAJOR_VERSION CCI_REG16(0x8000)
  71. #define MT9M114_MON_MINOR_VERSION CCI_REG16(0x8002)
  72. #define MT9M114_MON_RELEASE_VERSION CCI_REG16(0x8004)
  73. /* Auto-Exposure Track registers */
  74. #define MT9M114_AE_TRACK_ALGO CCI_REG16(0xa804)
  75. #define MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE BIT(0)
  76. #define MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED CCI_REG8(0xa80a)
  77. /* Color Correction Matrix registers */
  78. #define MT9M114_CCM_ALGO CCI_REG16(0xb404)
  79. #define MT9M114_CCM_EXEC_CALC_CCM_MATRIX BIT(4)
  80. #define MT9M114_CCM_DELTA_GAIN CCI_REG8(0xb42a)
  81. /* Camera Control registers */
  82. #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_START CCI_REG16(0xc800)
  83. #define MT9M114_CAM_SENSOR_CFG_X_ADDR_START CCI_REG16(0xc802)
  84. #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END CCI_REG16(0xc804)
  85. #define MT9M114_CAM_SENSOR_CFG_X_ADDR_END CCI_REG16(0xc806)
  86. #define MT9M114_CAM_SENSOR_CFG_PIXCLK CCI_REG32(0xc808)
  87. #define MT9M114_CAM_SENSOR_CFG_ROW_SPEED CCI_REG16(0xc80c)
  88. #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN CCI_REG16(0xc80e)
  89. #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX CCI_REG16(0xc810)
  90. #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES CCI_REG16(0xc812)
  91. #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 65535
  92. #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK CCI_REG16(0xc814)
  93. #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 8191
  94. #define MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION CCI_REG16(0xc816)
  95. #define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW CCI_REG16(0xc818)
  96. #define MT9M114_CAM_SENSOR_CFG_REG_0_DATA CCI_REG16(0xc826)
  97. #define MT9M114_CAM_SENSOR_CONTROL_READ_MODE CCI_REG16(0xc834)
  98. #define MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN BIT(0)
  99. #define MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN BIT(1)
  100. #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_NORMAL (0 << 4)
  101. #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SKIPPING (1 << 4)
  102. #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_AVERAGE (2 << 4)
  103. #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING (3 << 4)
  104. #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK (3 << 4)
  105. #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_NORMAL (0 << 8)
  106. #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SKIPPING (1 << 8)
  107. #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING (3 << 8)
  108. #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK (3 << 8)
  109. #define MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN CCI_REG16(0xc836)
  110. #define MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME CCI_REG16(0xc83c)
  111. #define MT9M114_CAM_SENSOR_CONTROL_FINE_INTEGRATION_TIME CCI_REG16(0xc83e)
  112. #define MT9M114_CAM_MODE_SELECT CCI_REG8(0xc84c)
  113. #define MT9M114_CAM_MODE_SELECT_NORMAL (0 << 0)
  114. #define MT9M114_CAM_MODE_SELECT_LENS_CALIBRATION (1 << 0)
  115. #define MT9M114_CAM_MODE_SELECT_TEST_PATTERN (2 << 0)
  116. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT CCI_REG8(0xc84d)
  117. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID (1 << 0)
  118. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS (4 << 0)
  119. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM (5 << 0)
  120. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS (8 << 0)
  121. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B (10 << 0)
  122. #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B (11 << 0)
  123. #define MT9M114_CAM_MODE_TEST_PATTERN_RED CCI_REG16(0xc84e)
  124. #define MT9M114_CAM_MODE_TEST_PATTERN_GREEN CCI_REG16(0xc850)
  125. #define MT9M114_CAM_MODE_TEST_PATTERN_BLUE CCI_REG16(0xc852)
  126. #define MT9M114_CAM_CROP_WINDOW_XOFFSET CCI_REG16(0xc854)
  127. #define MT9M114_CAM_CROP_WINDOW_YOFFSET CCI_REG16(0xc856)
  128. #define MT9M114_CAM_CROP_WINDOW_WIDTH CCI_REG16(0xc858)
  129. #define MT9M114_CAM_CROP_WINDOW_HEIGHT CCI_REG16(0xc85a)
  130. #define MT9M114_CAM_CROP_CROPMODE CCI_REG8(0xc85c)
  131. #define MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN BIT(0)
  132. #define MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN BIT(1)
  133. #define MT9M114_CAM_OUTPUT_WIDTH CCI_REG16(0xc868)
  134. #define MT9M114_CAM_OUTPUT_HEIGHT CCI_REG16(0xc86a)
  135. #define MT9M114_CAM_OUTPUT_FORMAT CCI_REG16(0xc86c)
  136. #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE BIT(0)
  137. #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES BIT(1)
  138. #define MT9M114_CAM_OUTPUT_FORMAT_MONO_ENABLE BIT(2)
  139. #define MT9M114_CAM_OUTPUT_FORMAT_BT656_ENABLE BIT(3)
  140. #define MT9M114_CAM_OUTPUT_FORMAT_BT656_CROP_SCALE_DISABLE BIT(4)
  141. #define MT9M114_CAM_OUTPUT_FORMAT_FVLV_DISABLE BIT(5)
  142. #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV (0 << 8)
  143. #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB (1 << 8)
  144. #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER (2 << 8)
  145. #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_NONE (3 << 8)
  146. #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK (3 << 8)
  147. #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10 (0 << 10)
  148. #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PRELSC_8_2 (1 << 10)
  149. #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_POSTLSC_8_2 (2 << 10)
  150. #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8 (3 << 10)
  151. #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK (3 << 10)
  152. #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB (0 << 12)
  153. #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_555RGB (1 << 12)
  154. #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444xRGB (2 << 12)
  155. #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444RGBx (3 << 12)
  156. #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK (3 << 12)
  157. #define MT9M114_CAM_OUTPUT_FORMAT_YUV CCI_REG16(0xc86e)
  158. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_CLIP BIT(5)
  159. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_AUV_OFFSET BIT(4)
  160. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SELECT_601 BIT(3)
  161. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_NORMALISE BIT(2)
  162. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVEN_UV (0 << 0)
  163. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_ODD_UV (1 << 0)
  164. #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVENU_ODDV (2 << 0)
  165. #define MT9M114_CAM_OUTPUT_Y_OFFSET CCI_REG8(0xc870)
  166. #define MT9M114_CAM_AET_AEMODE CCI_REG8(0xc878)
  167. #define MT9M114_CAM_AET_EXEC_SET_INDOOR BIT(0)
  168. #define MT9M114_CAM_AET_DISCRETE_FRAMERATE BIT(1)
  169. #define MT9M114_CAM_AET_ADAPTATIVE_TARGET_LUMA BIT(2)
  170. #define MT9M114_CAM_AET_ADAPTATIVE_SKIP_FRAMES BIT(3)
  171. #define MT9M114_CAM_AET_SKIP_FRAMES CCI_REG8(0xc879)
  172. #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA CCI_REG8(0xc87a)
  173. #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK CCI_REG8(0xc87b)
  174. #define MT9M114_CAM_AET_BLACK_CLIPPING_TARGET CCI_REG16(0xc87c)
  175. #define MT9M114_CAM_AET_AE_MIN_VIRT_INT_TIME_PCLK CCI_REG16(0xc87e)
  176. #define MT9M114_CAM_AET_AE_MIN_VIRT_DGAIN CCI_REG16(0xc880)
  177. #define MT9M114_CAM_AET_AE_MAX_VIRT_DGAIN CCI_REG16(0xc882)
  178. #define MT9M114_CAM_AET_AE_MIN_VIRT_AGAIN CCI_REG16(0xc884)
  179. #define MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN CCI_REG16(0xc886)
  180. #define MT9M114_CAM_AET_AE_VIRT_GAIN_TH_EG CCI_REG16(0xc888)
  181. #define MT9M114_CAM_AET_AE_EG_GATE_PERCENTAGE CCI_REG8(0xc88a)
  182. #define MT9M114_CAM_AET_FLICKER_FREQ_HZ CCI_REG8(0xc88b)
  183. #define MT9M114_CAM_AET_MAX_FRAME_RATE CCI_REG16(0xc88c)
  184. #define MT9M114_CAM_AET_MIN_FRAME_RATE CCI_REG16(0xc88e)
  185. #define MT9M114_CAM_AET_TARGET_GAIN CCI_REG16(0xc890)
  186. #define MT9M114_CAM_AWB_CCM_L(n) CCI_REG16(0xc892 + (n) * 2)
  187. #define MT9M114_CAM_AWB_CCM_M(n) CCI_REG16(0xc8a4 + (n) * 2)
  188. #define MT9M114_CAM_AWB_CCM_R(n) CCI_REG16(0xc8b6 + (n) * 2)
  189. #define MT9M114_CAM_AWB_CCM_L_RG_GAIN CCI_REG16(0xc8c8)
  190. #define MT9M114_CAM_AWB_CCM_L_BG_GAIN CCI_REG16(0xc8ca)
  191. #define MT9M114_CAM_AWB_CCM_M_RG_GAIN CCI_REG16(0xc8cc)
  192. #define MT9M114_CAM_AWB_CCM_M_BG_GAIN CCI_REG16(0xc8ce)
  193. #define MT9M114_CAM_AWB_CCM_R_RG_GAIN CCI_REG16(0xc8d0)
  194. #define MT9M114_CAM_AWB_CCM_R_BG_GAIN CCI_REG16(0xc8d2)
  195. #define MT9M114_CAM_AWB_CCM_L_CTEMP CCI_REG16(0xc8d4)
  196. #define MT9M114_CAM_AWB_CCM_M_CTEMP CCI_REG16(0xc8d6)
  197. #define MT9M114_CAM_AWB_CCM_R_CTEMP CCI_REG16(0xc8d8)
  198. #define MT9M114_CAM_AWB_AWB_XSCALE CCI_REG8(0xc8f2)
  199. #define MT9M114_CAM_AWB_AWB_YSCALE CCI_REG8(0xc8f3)
  200. #define MT9M114_CAM_AWB_AWB_WEIGHTS(n) CCI_REG16(0xc8f4 + (n) * 2)
  201. #define MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ CCI_REG16(0xc904)
  202. #define MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ CCI_REG16(0xc906)
  203. #define MT9M114_CAM_AWB_AWBMODE CCI_REG8(0xc909)
  204. #define MT9M114_CAM_AWB_MODE_AUTO BIT(1)
  205. #define MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE BIT(0)
  206. #define MT9M114_CAM_AWB_K_R_L CCI_REG8(0xc90c)
  207. #define MT9M114_CAM_AWB_K_G_L CCI_REG8(0xc90d)
  208. #define MT9M114_CAM_AWB_K_B_L CCI_REG8(0xc90e)
  209. #define MT9M114_CAM_AWB_K_R_R CCI_REG8(0xc90f)
  210. #define MT9M114_CAM_AWB_K_G_R CCI_REG8(0xc910)
  211. #define MT9M114_CAM_AWB_K_B_R CCI_REG8(0xc911)
  212. #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART CCI_REG16(0xc914)
  213. #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART CCI_REG16(0xc916)
  214. #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND CCI_REG16(0xc918)
  215. #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND CCI_REG16(0xc91a)
  216. #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART CCI_REG16(0xc91c)
  217. #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART CCI_REG16(0xc91e)
  218. #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND CCI_REG16(0xc920)
  219. #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND CCI_REG16(0xc922)
  220. #define MT9M114_CAM_LL_LLMODE CCI_REG16(0xc924)
  221. #define MT9M114_CAM_LL_START_BRIGHTNESS CCI_REG16(0xc926)
  222. #define MT9M114_CAM_LL_STOP_BRIGHTNESS CCI_REG16(0xc928)
  223. #define MT9M114_CAM_LL_START_SATURATION CCI_REG8(0xc92a)
  224. #define MT9M114_CAM_LL_END_SATURATION CCI_REG8(0xc92b)
  225. #define MT9M114_CAM_LL_START_DESATURATION CCI_REG8(0xc92c)
  226. #define MT9M114_CAM_LL_END_DESATURATION CCI_REG8(0xc92d)
  227. #define MT9M114_CAM_LL_START_DEMOSAICING CCI_REG8(0xc92e)
  228. #define MT9M114_CAM_LL_START_AP_GAIN CCI_REG8(0xc92f)
  229. #define MT9M114_CAM_LL_START_AP_THRESH CCI_REG8(0xc930)
  230. #define MT9M114_CAM_LL_STOP_DEMOSAICING CCI_REG8(0xc931)
  231. #define MT9M114_CAM_LL_STOP_AP_GAIN CCI_REG8(0xc932)
  232. #define MT9M114_CAM_LL_STOP_AP_THRESH CCI_REG8(0xc933)
  233. #define MT9M114_CAM_LL_START_NR_RED CCI_REG8(0xc934)
  234. #define MT9M114_CAM_LL_START_NR_GREEN CCI_REG8(0xc935)
  235. #define MT9M114_CAM_LL_START_NR_BLUE CCI_REG8(0xc936)
  236. #define MT9M114_CAM_LL_START_NR_THRESH CCI_REG8(0xc937)
  237. #define MT9M114_CAM_LL_STOP_NR_RED CCI_REG8(0xc938)
  238. #define MT9M114_CAM_LL_STOP_NR_GREEN CCI_REG8(0xc939)
  239. #define MT9M114_CAM_LL_STOP_NR_BLUE CCI_REG8(0xc93a)
  240. #define MT9M114_CAM_LL_STOP_NR_THRESH CCI_REG8(0xc93b)
  241. #define MT9M114_CAM_LL_START_CONTRAST_BM CCI_REG16(0xc93c)
  242. #define MT9M114_CAM_LL_STOP_CONTRAST_BM CCI_REG16(0xc93e)
  243. #define MT9M114_CAM_LL_GAMMA CCI_REG16(0xc940)
  244. #define MT9M114_CAM_LL_START_CONTRAST_GRADIENT CCI_REG8(0xc942)
  245. #define MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT CCI_REG8(0xc943)
  246. #define MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc944)
  247. #define MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc945)
  248. #define MT9M114_CAM_LL_START_GAIN_METRIC CCI_REG16(0xc946)
  249. #define MT9M114_CAM_LL_STOP_GAIN_METRIC CCI_REG16(0xc948)
  250. #define MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA CCI_REG16(0xc94a)
  251. #define MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA CCI_REG16(0xc94c)
  252. #define MT9M114_CAM_LL_CLUSTER_DC_TH_BM CCI_REG16(0xc94e)
  253. #define MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE CCI_REG8(0xc950)
  254. #define MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR CCI_REG8(0xc951)
  255. #define MT9M114_CAM_LL_START_TARGET_LUMA_BM CCI_REG16(0xc952)
  256. #define MT9M114_CAM_LL_STOP_TARGET_LUMA_BM CCI_REG16(0xc954)
  257. #define MT9M114_CAM_PGA_PGA_CONTROL CCI_REG16(0xc95e)
  258. #define MT9M114_CAM_SYSCTL_PLL_ENABLE CCI_REG8(0xc97e)
  259. #define MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE BIT(0)
  260. #define MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE 0x00
  261. #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N CCI_REG16(0xc980)
  262. #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(m, n) ((((n) - 1) << 8) | (m))
  263. #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P CCI_REG16(0xc982)
  264. #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(p) (((p) - 1) << 8)
  265. #define MT9M114_CAM_PORT_OUTPUT_CONTROL CCI_REG16(0xc984)
  266. #define MT9M114_CAM_PORT_PORT_SELECT_PARALLEL (0 << 0)
  267. #define MT9M114_CAM_PORT_PORT_SELECT_MIPI (1 << 0)
  268. #define MT9M114_CAM_PORT_CLOCK_SLOWDOWN BIT(3)
  269. #define MT9M114_CAM_PORT_TRUNCATE_RAW_BAYER BIT(4)
  270. #define MT9M114_CAM_PORT_PIXCLK_GATE BIT(5)
  271. #define MT9M114_CAM_PORT_CONT_MIPI_CLK BIT(6)
  272. #define MT9M114_CAM_PORT_CHAN_NUM(vc) ((vc) << 8)
  273. #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO CCI_REG16(0xc988)
  274. #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO_VALUE(n) ((n) << 8)
  275. #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_TRAIL CCI_REG16(0xc98a)
  276. #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_VALUE(n) ((n) << 8)
  277. #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_TRAIL_VALUE(n) ((n) << 0)
  278. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_PRE CCI_REG16(0xc98c)
  279. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_VALUE(n) ((n) << 8)
  280. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_PRE_VALUE(n) ((n) << 0)
  281. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_ZERO CCI_REG16(0xc98e)
  282. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_VALUE(n) ((n) << 8)
  283. #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_ZERO_VALUE(n) ((n) << 0)
  284. /* System Manager registers */
  285. #define MT9M114_SYSMGR_NEXT_STATE CCI_REG8(0xdc00)
  286. #define MT9M114_SYSMGR_CURRENT_STATE CCI_REG8(0xdc01)
  287. #define MT9M114_SYSMGR_CMD_STATUS CCI_REG8(0xdc02)
  288. /* Patch Loader registers */
  289. #define MT9M114_PATCHLDR_LOADER_ADDRESS CCI_REG16(0xe000)
  290. #define MT9M114_PATCHLDR_PATCH_ID CCI_REG16(0xe002)
  291. #define MT9M114_PATCHLDR_FIRMWARE_ID CCI_REG32(0xe004)
  292. #define MT9M114_PATCHLDR_APPLY_STATUS CCI_REG8(0xe008)
  293. #define MT9M114_PATCHLDR_NUM_PATCHES CCI_REG8(0xe009)
  294. #define MT9M114_PATCHLDR_PATCH_ID_0 CCI_REG16(0xe00a)
  295. #define MT9M114_PATCHLDR_PATCH_ID_1 CCI_REG16(0xe00c)
  296. #define MT9M114_PATCHLDR_PATCH_ID_2 CCI_REG16(0xe00e)
  297. #define MT9M114_PATCHLDR_PATCH_ID_3 CCI_REG16(0xe010)
  298. #define MT9M114_PATCHLDR_PATCH_ID_4 CCI_REG16(0xe012)
  299. #define MT9M114_PATCHLDR_PATCH_ID_5 CCI_REG16(0xe014)
  300. #define MT9M114_PATCHLDR_PATCH_ID_6 CCI_REG16(0xe016)
  301. #define MT9M114_PATCHLDR_PATCH_ID_7 CCI_REG16(0xe018)
  302. /* SYS_STATE values (for SYSMGR_NEXT_STATE and SYSMGR_CURRENT_STATE) */
  303. #define MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE 0x28
  304. #define MT9M114_SYS_STATE_STREAMING 0x31
  305. #define MT9M114_SYS_STATE_START_STREAMING 0x34
  306. #define MT9M114_SYS_STATE_ENTER_SUSPEND 0x40
  307. #define MT9M114_SYS_STATE_SUSPENDED 0x41
  308. #define MT9M114_SYS_STATE_ENTER_STANDBY 0x50
  309. #define MT9M114_SYS_STATE_STANDBY 0x52
  310. #define MT9M114_SYS_STATE_LEAVE_STANDBY 0x54
  311. /* Result status of last SET_STATE comamnd */
  312. #define MT9M114_SET_STATE_RESULT_ENOERR 0x00
  313. #define MT9M114_SET_STATE_RESULT_EINVAL 0x0c
  314. #define MT9M114_SET_STATE_RESULT_ENOSPC 0x0d
  315. /*
  316. * The minimum amount of horizontal and vertical blanking is undocumented. The
  317. * minimum values that have been seen in register lists are 303 and 21, use
  318. * them.
  319. *
  320. * Set the default to achieve full resolution (1296x976 analog crop
  321. * rectangle, 1280x960 output size) at 30fps with a 48 MHz pixclock.
  322. */
  323. #define MT9M114_MIN_HBLANK 303
  324. #define MT9M114_MIN_VBLANK 21
  325. #define MT9M114_DEF_HBLANK 308
  326. #define MT9M114_DEF_VBLANK 21
  327. #define MT9M114_DEF_FRAME_RATE 30
  328. #define MT9M114_MAX_FRAME_RATE 120
  329. #define MT9M114_DEF_PIXCLOCK 48000000
  330. #define MT9M114_PIXEL_ARRAY_WIDTH 1296U
  331. #define MT9M114_PIXEL_ARRAY_HEIGHT 976U
  332. /*
  333. * These values are not well documented and are semi-arbitrary. The pixel array
  334. * minimum output size is 8 pixels larger than the minimum scaler cropped input
  335. * width to account for the demosaicing.
  336. */
  337. #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH (32U + 8U)
  338. #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT (32U + 8U)
  339. #define MT9M114_SCALER_CROPPED_INPUT_WIDTH 32U
  340. #define MT9M114_SCALER_CROPPED_INPUT_HEIGHT 32U
  341. /* Indices into the mt9m114.ifp.tpg array. */
  342. #define MT9M114_TPG_PATTERN 0
  343. #define MT9M114_TPG_RED 1
  344. #define MT9M114_TPG_GREEN 2
  345. #define MT9M114_TPG_BLUE 3
  346. /* -----------------------------------------------------------------------------
  347. * Data Structures
  348. */
  349. enum mt9m114_format_flag {
  350. MT9M114_FMT_FLAG_PARALLEL = BIT(0),
  351. MT9M114_FMT_FLAG_CSI2 = BIT(1),
  352. };
  353. struct mt9m114_format_info {
  354. u32 code;
  355. u32 output_format;
  356. u32 flags;
  357. };
  358. struct mt9m114 {
  359. struct i2c_client *client;
  360. struct regmap *regmap;
  361. struct clk *clk;
  362. struct gpio_desc *reset;
  363. struct regulator_bulk_data supplies[3];
  364. struct v4l2_fwnode_endpoint bus_cfg;
  365. bool bypass_pll;
  366. struct aptina_pll pll;
  367. unsigned int pixrate;
  368. bool streaming;
  369. u32 pad_slew_rate;
  370. /* Pixel Array */
  371. struct {
  372. struct v4l2_subdev sd;
  373. struct media_pad pad;
  374. struct v4l2_ctrl_handler hdl;
  375. struct v4l2_ctrl *exposure;
  376. struct v4l2_ctrl *gain;
  377. struct v4l2_ctrl *hblank;
  378. struct v4l2_ctrl *vblank;
  379. } pa;
  380. /* Image Flow Processor */
  381. struct {
  382. struct v4l2_subdev sd;
  383. struct media_pad pads[2];
  384. struct v4l2_ctrl_handler hdl;
  385. unsigned int frame_rate;
  386. struct v4l2_ctrl *tpg[4];
  387. } ifp;
  388. };
  389. /* -----------------------------------------------------------------------------
  390. * Formats
  391. */
  392. static const struct mt9m114_format_info mt9m114_format_infos[] = {
  393. {
  394. /*
  395. * The first two entries are used as defaults, for parallel and
  396. * CSI-2 buses respectively. Keep them in that order.
  397. */
  398. .code = MEDIA_BUS_FMT_UYVY8_2X8,
  399. .flags = MT9M114_FMT_FLAG_PARALLEL,
  400. .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV,
  401. }, {
  402. .code = MEDIA_BUS_FMT_UYVY8_1X16,
  403. .flags = MT9M114_FMT_FLAG_CSI2,
  404. .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV,
  405. }, {
  406. .code = MEDIA_BUS_FMT_YUYV8_2X8,
  407. .flags = MT9M114_FMT_FLAG_PARALLEL,
  408. .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV
  409. | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
  410. }, {
  411. .code = MEDIA_BUS_FMT_YUYV8_1X16,
  412. .flags = MT9M114_FMT_FLAG_CSI2,
  413. .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV
  414. | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
  415. }, {
  416. .code = MEDIA_BUS_FMT_RGB565_2X8_LE,
  417. .flags = MT9M114_FMT_FLAG_PARALLEL,
  418. .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
  419. | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB
  420. | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES,
  421. }, {
  422. .code = MEDIA_BUS_FMT_RGB565_2X8_BE,
  423. .flags = MT9M114_FMT_FLAG_PARALLEL,
  424. .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
  425. | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB,
  426. }, {
  427. .code = MEDIA_BUS_FMT_RGB565_1X16,
  428. .flags = MT9M114_FMT_FLAG_CSI2,
  429. .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
  430. | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB,
  431. }, {
  432. .code = MEDIA_BUS_FMT_SGRBG8_1X8,
  433. .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8
  434. | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER,
  435. .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2,
  436. }, {
  437. /* Keep the format compatible with the IFP sink pad last. */
  438. .code = MEDIA_BUS_FMT_SGRBG10_1X10,
  439. .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10
  440. | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER,
  441. .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2,
  442. }
  443. };
  444. static const struct mt9m114_format_info *
  445. mt9m114_default_format_info(struct mt9m114 *sensor)
  446. {
  447. if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
  448. return &mt9m114_format_infos[1];
  449. else
  450. return &mt9m114_format_infos[0];
  451. }
  452. static const struct mt9m114_format_info *
  453. mt9m114_format_info(struct mt9m114 *sensor, unsigned int pad, u32 code)
  454. {
  455. const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos);
  456. unsigned int flag;
  457. unsigned int i;
  458. switch (pad) {
  459. case 0:
  460. return &mt9m114_format_infos[num_formats - 1];
  461. case 1:
  462. if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
  463. flag = MT9M114_FMT_FLAG_CSI2;
  464. else
  465. flag = MT9M114_FMT_FLAG_PARALLEL;
  466. for (i = 0; i < num_formats; ++i) {
  467. const struct mt9m114_format_info *info =
  468. &mt9m114_format_infos[i];
  469. if (info->code == code && info->flags & flag)
  470. return info;
  471. }
  472. return mt9m114_default_format_info(sensor);
  473. default:
  474. return NULL;
  475. }
  476. }
  477. /* -----------------------------------------------------------------------------
  478. * Initialization
  479. */
  480. static const struct cci_reg_sequence mt9m114_init[] = {
  481. { MT9M114_RESET_REGISTER, MT9M114_RESET_REGISTER_MASK_BAD |
  482. MT9M114_RESET_REGISTER_LOCK_REG |
  483. 0x0010 },
  484. /* Sensor optimization */
  485. { CCI_REG16(0x316a), 0x8270 },
  486. { CCI_REG16(0x316c), 0x8270 },
  487. { CCI_REG16(0x3ed0), 0x2305 },
  488. { CCI_REG16(0x3ed2), 0x77cf },
  489. { CCI_REG16(0x316e), 0x8202 },
  490. { CCI_REG16(0x3180), 0x87ff },
  491. { CCI_REG16(0x30d4), 0x6080 },
  492. { CCI_REG16(0xa802), 0x0008 },
  493. { CCI_REG16(0x3e14), 0xff39 },
  494. /* APGA */
  495. { MT9M114_CAM_PGA_PGA_CONTROL, 0x0000 },
  496. /* Automatic White balance */
  497. { MT9M114_CAM_AWB_CCM_L(0), 0x0267 },
  498. { MT9M114_CAM_AWB_CCM_L(1), 0xff1a },
  499. { MT9M114_CAM_AWB_CCM_L(2), 0xffb3 },
  500. { MT9M114_CAM_AWB_CCM_L(3), 0xff80 },
  501. { MT9M114_CAM_AWB_CCM_L(4), 0x0166 },
  502. { MT9M114_CAM_AWB_CCM_L(5), 0x0003 },
  503. { MT9M114_CAM_AWB_CCM_L(6), 0xff9a },
  504. { MT9M114_CAM_AWB_CCM_L(7), 0xfeb4 },
  505. { MT9M114_CAM_AWB_CCM_L(8), 0x024d },
  506. { MT9M114_CAM_AWB_CCM_M(0), 0x01bf },
  507. { MT9M114_CAM_AWB_CCM_M(1), 0xff01 },
  508. { MT9M114_CAM_AWB_CCM_M(2), 0xfff3 },
  509. { MT9M114_CAM_AWB_CCM_M(3), 0xff75 },
  510. { MT9M114_CAM_AWB_CCM_M(4), 0x0198 },
  511. { MT9M114_CAM_AWB_CCM_M(5), 0xfffd },
  512. { MT9M114_CAM_AWB_CCM_M(6), 0xff9a },
  513. { MT9M114_CAM_AWB_CCM_M(7), 0xfee7 },
  514. { MT9M114_CAM_AWB_CCM_M(8), 0x02a8 },
  515. { MT9M114_CAM_AWB_CCM_R(0), 0x01d9 },
  516. { MT9M114_CAM_AWB_CCM_R(1), 0xff26 },
  517. { MT9M114_CAM_AWB_CCM_R(2), 0xfff3 },
  518. { MT9M114_CAM_AWB_CCM_R(3), 0xffb3 },
  519. { MT9M114_CAM_AWB_CCM_R(4), 0x0132 },
  520. { MT9M114_CAM_AWB_CCM_R(5), 0xffe8 },
  521. { MT9M114_CAM_AWB_CCM_R(6), 0xffda },
  522. { MT9M114_CAM_AWB_CCM_R(7), 0xfecd },
  523. { MT9M114_CAM_AWB_CCM_R(8), 0x02c2 },
  524. { MT9M114_CAM_AWB_CCM_L_RG_GAIN, 0x0075 },
  525. { MT9M114_CAM_AWB_CCM_L_BG_GAIN, 0x011c },
  526. { MT9M114_CAM_AWB_CCM_M_RG_GAIN, 0x009a },
  527. { MT9M114_CAM_AWB_CCM_M_BG_GAIN, 0x0105 },
  528. { MT9M114_CAM_AWB_CCM_R_RG_GAIN, 0x00a4 },
  529. { MT9M114_CAM_AWB_CCM_R_BG_GAIN, 0x00ac },
  530. { MT9M114_CAM_AWB_CCM_L_CTEMP, 0x0a8c },
  531. { MT9M114_CAM_AWB_CCM_M_CTEMP, 0x0f0a },
  532. { MT9M114_CAM_AWB_CCM_R_CTEMP, 0x1964 },
  533. { MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ, 51 },
  534. { MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ, 60 },
  535. { MT9M114_CAM_AWB_AWB_XSCALE, 3 },
  536. { MT9M114_CAM_AWB_AWB_YSCALE, 2 },
  537. { MT9M114_CAM_AWB_AWB_WEIGHTS(0), 0x0000 },
  538. { MT9M114_CAM_AWB_AWB_WEIGHTS(1), 0x0000 },
  539. { MT9M114_CAM_AWB_AWB_WEIGHTS(2), 0x0000 },
  540. { MT9M114_CAM_AWB_AWB_WEIGHTS(3), 0xe724 },
  541. { MT9M114_CAM_AWB_AWB_WEIGHTS(4), 0x1583 },
  542. { MT9M114_CAM_AWB_AWB_WEIGHTS(5), 0x2045 },
  543. { MT9M114_CAM_AWB_AWB_WEIGHTS(6), 0x03ff },
  544. { MT9M114_CAM_AWB_AWB_WEIGHTS(7), 0x007c },
  545. { MT9M114_CAM_AWB_K_R_L, 0x80 },
  546. { MT9M114_CAM_AWB_K_G_L, 0x80 },
  547. { MT9M114_CAM_AWB_K_B_L, 0x80 },
  548. { MT9M114_CAM_AWB_K_R_R, 0x88 },
  549. { MT9M114_CAM_AWB_K_G_R, 0x80 },
  550. { MT9M114_CAM_AWB_K_B_R, 0x80 },
  551. /* Low-Light Image Enhancements */
  552. { MT9M114_CAM_LL_START_BRIGHTNESS, 0x0020 },
  553. { MT9M114_CAM_LL_STOP_BRIGHTNESS, 0x009a },
  554. { MT9M114_CAM_LL_START_GAIN_METRIC, 0x0070 },
  555. { MT9M114_CAM_LL_STOP_GAIN_METRIC, 0x00f3 },
  556. { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x20 },
  557. { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x9a },
  558. { MT9M114_CAM_LL_START_SATURATION, 0x80 },
  559. { MT9M114_CAM_LL_END_SATURATION, 0x4b },
  560. { MT9M114_CAM_LL_START_DESATURATION, 0x00 },
  561. { MT9M114_CAM_LL_END_DESATURATION, 0xff },
  562. { MT9M114_CAM_LL_START_DEMOSAICING, 0x3c },
  563. { MT9M114_CAM_LL_START_AP_GAIN, 0x02 },
  564. { MT9M114_CAM_LL_START_AP_THRESH, 0x06 },
  565. { MT9M114_CAM_LL_STOP_DEMOSAICING, 0x64 },
  566. { MT9M114_CAM_LL_STOP_AP_GAIN, 0x01 },
  567. { MT9M114_CAM_LL_STOP_AP_THRESH, 0x0c },
  568. { MT9M114_CAM_LL_START_NR_RED, 0x3c },
  569. { MT9M114_CAM_LL_START_NR_GREEN, 0x3c },
  570. { MT9M114_CAM_LL_START_NR_BLUE, 0x3c },
  571. { MT9M114_CAM_LL_START_NR_THRESH, 0x0f },
  572. { MT9M114_CAM_LL_STOP_NR_RED, 0x64 },
  573. { MT9M114_CAM_LL_STOP_NR_GREEN, 0x64 },
  574. { MT9M114_CAM_LL_STOP_NR_BLUE, 0x64 },
  575. { MT9M114_CAM_LL_STOP_NR_THRESH, 0x32 },
  576. { MT9M114_CAM_LL_START_CONTRAST_BM, 0x0020 },
  577. { MT9M114_CAM_LL_STOP_CONTRAST_BM, 0x009a },
  578. { MT9M114_CAM_LL_GAMMA, 0x00dc },
  579. { MT9M114_CAM_LL_START_CONTRAST_GRADIENT, 0x38 },
  580. { MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT, 0x30 },
  581. { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x50 },
  582. { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x19 },
  583. { MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA, 0x0230 },
  584. { MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA, 0x0010 },
  585. { MT9M114_CAM_LL_CLUSTER_DC_TH_BM, 0x01cd },
  586. { MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE, 0x05 },
  587. { MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR, 0x40 },
  588. /* Auto-Exposure */
  589. { MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK, 0x1b },
  590. { MT9M114_CAM_AET_AEMODE, 0x00 },
  591. { MT9M114_CAM_AET_TARGET_GAIN, 0x0080 },
  592. { MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN, 0x0100 },
  593. { MT9M114_CAM_AET_BLACK_CLIPPING_TARGET, 0x005a },
  594. { MT9M114_CCM_DELTA_GAIN, 0x05 },
  595. { MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED, 0x20 },
  596. /* Pixel array timings and integration time */
  597. { MT9M114_CAM_SENSOR_CFG_ROW_SPEED, 1 },
  598. { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN, 219 },
  599. { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX, 1459 },
  600. { MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION, 96 },
  601. { MT9M114_CAM_SENSOR_CFG_REG_0_DATA, 32 },
  602. };
  603. /* -----------------------------------------------------------------------------
  604. * Hardware Configuration
  605. */
  606. /* Wait for a command to complete. */
  607. static int mt9m114_poll_command(struct mt9m114 *sensor, u32 command)
  608. {
  609. unsigned int i;
  610. u64 value;
  611. int ret;
  612. for (i = 0; i < 100; ++i) {
  613. ret = cci_read(sensor->regmap, MT9M114_COMMAND_REGISTER, &value,
  614. NULL);
  615. if (ret < 0)
  616. return ret;
  617. if (!(value & command))
  618. break;
  619. usleep_range(5000, 6000);
  620. }
  621. if (value & command) {
  622. dev_err(&sensor->client->dev, "Command %u completion timeout\n",
  623. command);
  624. return -ETIMEDOUT;
  625. }
  626. if (!(value & MT9M114_COMMAND_REGISTER_OK)) {
  627. dev_err(&sensor->client->dev, "Command %u failed\n", command);
  628. return -EIO;
  629. }
  630. return 0;
  631. }
  632. /* Wait for a state to be entered. */
  633. static int mt9m114_poll_state(struct mt9m114 *sensor, u32 state)
  634. {
  635. unsigned int i;
  636. u64 value;
  637. int ret;
  638. for (i = 0; i < 100; ++i) {
  639. ret = cci_read(sensor->regmap, MT9M114_SYSMGR_CURRENT_STATE,
  640. &value, NULL);
  641. if (ret < 0)
  642. return ret;
  643. if (value == state)
  644. return 0;
  645. usleep_range(1000, 1500);
  646. }
  647. dev_err(&sensor->client->dev, "Timeout waiting for state 0x%02x\n",
  648. state);
  649. return -ETIMEDOUT;
  650. }
  651. static int mt9m114_set_state(struct mt9m114 *sensor, u8 next_state)
  652. {
  653. int ret = 0;
  654. /* Set the next desired state and start the state transition. */
  655. cci_write(sensor->regmap, MT9M114_SYSMGR_NEXT_STATE, next_state, &ret);
  656. cci_write(sensor->regmap, MT9M114_COMMAND_REGISTER,
  657. MT9M114_COMMAND_REGISTER_OK |
  658. MT9M114_COMMAND_REGISTER_SET_STATE, &ret);
  659. if (ret < 0)
  660. return ret;
  661. /* Wait for the state transition to complete. */
  662. ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE);
  663. if (ret < 0)
  664. return ret;
  665. return 0;
  666. }
  667. static int mt9m114_initialize(struct mt9m114 *sensor)
  668. {
  669. u32 value;
  670. int ret;
  671. ret = cci_multi_reg_write(sensor->regmap, mt9m114_init,
  672. ARRAY_SIZE(mt9m114_init), NULL);
  673. if (ret < 0) {
  674. dev_err(&sensor->client->dev,
  675. "Failed to initialize the sensor\n");
  676. return ret;
  677. }
  678. /* Configure the PLL. */
  679. if (sensor->bypass_pll) {
  680. cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE,
  681. MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE, &ret);
  682. } else {
  683. cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE,
  684. MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE, &ret);
  685. cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N,
  686. MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(sensor->pll.m,
  687. sensor->pll.n),
  688. &ret);
  689. cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_P,
  690. MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(sensor->pll.p1),
  691. &ret);
  692. }
  693. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_PIXCLK,
  694. sensor->pixrate, &ret);
  695. /* Configure the output mode. */
  696. if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) {
  697. value = MT9M114_CAM_PORT_PORT_SELECT_MIPI
  698. | MT9M114_CAM_PORT_CHAN_NUM(0)
  699. | 0x8000;
  700. if (!(sensor->bus_cfg.bus.mipi_csi2.flags &
  701. V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK))
  702. value |= MT9M114_CAM_PORT_CONT_MIPI_CLK;
  703. } else {
  704. value = MT9M114_CAM_PORT_PORT_SELECT_PARALLEL
  705. | 0x8000;
  706. }
  707. cci_write(sensor->regmap, MT9M114_CAM_PORT_OUTPUT_CONTROL, value, &ret);
  708. if (ret < 0)
  709. return ret;
  710. value = sensor->pad_slew_rate
  711. | sensor->pad_slew_rate << 4
  712. | sensor->pad_slew_rate << 8;
  713. cci_write(sensor->regmap, MT9M114_PAD_SLEW, value, &ret);
  714. if (ret < 0)
  715. return ret;
  716. return 0;
  717. }
  718. static int mt9m114_configure_pa(struct mt9m114 *sensor,
  719. struct v4l2_subdev_state *state)
  720. {
  721. const struct v4l2_mbus_framefmt *format;
  722. const struct v4l2_rect *crop;
  723. unsigned int hratio, vratio;
  724. u64 read_mode;
  725. int ret;
  726. format = v4l2_subdev_state_get_format(state, 0);
  727. crop = v4l2_subdev_state_get_crop(state, 0);
  728. ret = cci_read(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
  729. &read_mode, NULL);
  730. if (ret < 0)
  731. return ret;
  732. hratio = crop->width / format->width;
  733. vratio = crop->height / format->height;
  734. /*
  735. * Pixel array crop and binning. The CAM_SENSOR_CFG_CPIPE_LAST_ROW
  736. * register isn't clearly documented, but is always set to the number
  737. * of active rows minus 4 divided by the vertical binning factor in all
  738. * example sensor modes.
  739. */
  740. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_START,
  741. crop->left, &ret);
  742. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_START,
  743. crop->top, &ret);
  744. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_END,
  745. crop->width + crop->left - 1, &ret);
  746. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_END,
  747. crop->height + crop->top - 1, &ret);
  748. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW,
  749. (crop->height - 4) / vratio - 1, &ret);
  750. read_mode &= ~(MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK |
  751. MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK);
  752. if (hratio > 1)
  753. read_mode |= MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING;
  754. if (vratio > 1)
  755. read_mode |= MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING;
  756. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
  757. read_mode, &ret);
  758. return ret;
  759. }
  760. /*
  761. * For source pad formats other then RAW10 the IFP removes a 4 pixel border from
  762. * its sink pad format size for demosaicing.
  763. */
  764. static int mt9m114_ifp_get_border(struct v4l2_subdev_state *state)
  765. {
  766. const struct v4l2_mbus_framefmt *format =
  767. v4l2_subdev_state_get_format(state, 1);
  768. return format->code == MEDIA_BUS_FMT_SGRBG10_1X10 ? 0 : 4;
  769. }
  770. static int mt9m114_configure_ifp(struct mt9m114 *sensor,
  771. struct v4l2_subdev_state *state)
  772. {
  773. const struct mt9m114_format_info *info;
  774. const struct v4l2_mbus_framefmt *format;
  775. const struct v4l2_rect *crop;
  776. const struct v4l2_rect *compose;
  777. unsigned int border;
  778. u64 output_format;
  779. int ret = 0;
  780. format = v4l2_subdev_state_get_format(state, 1);
  781. info = mt9m114_format_info(sensor, 1, format->code);
  782. crop = v4l2_subdev_state_get_crop(state, 0);
  783. compose = v4l2_subdev_state_get_compose(state, 0);
  784. ret = cci_read(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT,
  785. &output_format, NULL);
  786. if (ret < 0)
  787. return ret;
  788. /*
  789. * Color pipeline (IFP) cropping and scaling. The crop window registers
  790. * apply cropping after demosaicing, which itself consumes 4 pixels on
  791. * each side of the image. The crop rectangle exposed to userspace
  792. * includes that demosaicing border, subtract it from the left and top
  793. * coordinates to configure the crop window.
  794. */
  795. border = mt9m114_ifp_get_border(state);
  796. cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_XOFFSET,
  797. crop->left - border, &ret);
  798. cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_YOFFSET,
  799. crop->top - border, &ret);
  800. cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_WIDTH,
  801. crop->width, &ret);
  802. cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_HEIGHT,
  803. crop->height, &ret);
  804. cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_WIDTH,
  805. compose->width, &ret);
  806. cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_HEIGHT,
  807. compose->height, &ret);
  808. /* AWB and AE windows, use the full frame. */
  809. cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART,
  810. 0, &ret);
  811. cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART,
  812. 0, &ret);
  813. cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND,
  814. compose->width - 1, &ret);
  815. cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND,
  816. compose->height - 1, &ret);
  817. cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART,
  818. 0, &ret);
  819. cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART,
  820. 0, &ret);
  821. cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND,
  822. compose->width / 5 - 1, &ret);
  823. cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND,
  824. compose->height / 5 - 1, &ret);
  825. cci_write(sensor->regmap, MT9M114_CAM_CROP_CROPMODE,
  826. MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN |
  827. MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN, &ret);
  828. /* Set the media bus code. */
  829. output_format &= ~(MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK |
  830. MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK |
  831. MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK |
  832. MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES |
  833. MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE);
  834. output_format |= info->output_format;
  835. cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT,
  836. output_format, &ret);
  837. return ret;
  838. }
  839. static int mt9m114_set_frame_rate(struct mt9m114 *sensor)
  840. {
  841. u16 frame_rate = sensor->ifp.frame_rate << 8;
  842. int ret = 0;
  843. cci_write(sensor->regmap, MT9M114_CAM_AET_MIN_FRAME_RATE,
  844. frame_rate, &ret);
  845. cci_write(sensor->regmap, MT9M114_CAM_AET_MAX_FRAME_RATE,
  846. frame_rate, &ret);
  847. return ret;
  848. }
  849. static int mt9m114_start_streaming(struct mt9m114 *sensor,
  850. struct v4l2_subdev_state *pa_state,
  851. struct v4l2_subdev_state *ifp_state)
  852. {
  853. int ret;
  854. ret = pm_runtime_resume_and_get(&sensor->client->dev);
  855. if (ret)
  856. return ret;
  857. ret = mt9m114_initialize(sensor);
  858. if (ret)
  859. goto error;
  860. ret = mt9m114_configure_ifp(sensor, ifp_state);
  861. if (ret)
  862. goto error;
  863. ret = mt9m114_configure_pa(sensor, pa_state);
  864. if (ret)
  865. goto error;
  866. ret = mt9m114_set_frame_rate(sensor);
  867. if (ret)
  868. goto error;
  869. ret = __v4l2_ctrl_handler_setup(&sensor->pa.hdl);
  870. if (ret)
  871. goto error;
  872. ret = __v4l2_ctrl_handler_setup(&sensor->ifp.hdl);
  873. if (ret)
  874. goto error;
  875. /*
  876. * The Change-Config state is transient and moves to the streaming
  877. * state automatically.
  878. */
  879. ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
  880. if (ret)
  881. goto error;
  882. sensor->streaming = true;
  883. return 0;
  884. error:
  885. pm_runtime_put_autosuspend(&sensor->client->dev);
  886. return ret;
  887. }
  888. static int mt9m114_stop_streaming(struct mt9m114 *sensor)
  889. {
  890. int ret;
  891. sensor->streaming = false;
  892. ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND);
  893. pm_runtime_put_autosuspend(&sensor->client->dev);
  894. return ret;
  895. }
  896. /* -----------------------------------------------------------------------------
  897. * Common Subdev Operations
  898. */
  899. static const struct media_entity_operations mt9m114_entity_ops = {
  900. .link_validate = v4l2_subdev_link_validate,
  901. };
  902. /* -----------------------------------------------------------------------------
  903. * Pixel Array Control Operations
  904. */
  905. static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
  906. {
  907. return container_of(ctrl->handler, struct mt9m114, pa.hdl);
  908. }
  909. static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl)
  910. {
  911. struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl);
  912. u64 value;
  913. int ret;
  914. if (!pm_runtime_get_if_in_use(&sensor->client->dev))
  915. return 0;
  916. switch (ctrl->id) {
  917. case V4L2_CID_EXPOSURE:
  918. ret = cci_read(sensor->regmap,
  919. MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME,
  920. &value, NULL);
  921. if (ret)
  922. break;
  923. ctrl->val = value;
  924. break;
  925. case V4L2_CID_ANALOGUE_GAIN:
  926. ret = cci_read(sensor->regmap,
  927. MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN,
  928. &value, NULL);
  929. if (ret)
  930. break;
  931. ctrl->val = value;
  932. break;
  933. default:
  934. ret = -EINVAL;
  935. break;
  936. }
  937. pm_runtime_put_autosuspend(&sensor->client->dev);
  938. return ret;
  939. }
  940. static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl)
  941. {
  942. struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl);
  943. const struct v4l2_mbus_framefmt *format;
  944. struct v4l2_subdev_state *state;
  945. int ret = 0;
  946. u64 mask;
  947. /* V4L2 controls values are applied only when power is up. */
  948. if (!pm_runtime_get_if_in_use(&sensor->client->dev))
  949. return 0;
  950. state = v4l2_subdev_get_locked_active_state(&sensor->pa.sd);
  951. format = v4l2_subdev_state_get_format(state, 0);
  952. switch (ctrl->id) {
  953. case V4L2_CID_HBLANK:
  954. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK,
  955. ctrl->val + format->width, &ret);
  956. break;
  957. case V4L2_CID_VBLANK:
  958. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES,
  959. ctrl->val + format->height, &ret);
  960. break;
  961. case V4L2_CID_EXPOSURE:
  962. cci_write(sensor->regmap,
  963. MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME,
  964. ctrl->val, &ret);
  965. break;
  966. case V4L2_CID_ANALOGUE_GAIN:
  967. /*
  968. * The CAM_SENSOR_CONTROL_ANALOG_GAIN contains linear analog
  969. * gain values that are mapped to the GLOBAL_GAIN register
  970. * values by the sensor firmware.
  971. */
  972. cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN,
  973. ctrl->val, &ret);
  974. break;
  975. case V4L2_CID_HFLIP:
  976. mask = MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN;
  977. ret = cci_update_bits(sensor->regmap,
  978. MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
  979. mask, ctrl->val ? mask : 0, NULL);
  980. break;
  981. case V4L2_CID_VFLIP:
  982. mask = MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN;
  983. ret = cci_update_bits(sensor->regmap,
  984. MT9M114_CAM_SENSOR_CONTROL_READ_MODE,
  985. mask, ctrl->val ? mask : 0, NULL);
  986. break;
  987. default:
  988. ret = -EINVAL;
  989. break;
  990. }
  991. pm_runtime_put_autosuspend(&sensor->client->dev);
  992. return ret;
  993. }
  994. static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops = {
  995. .g_volatile_ctrl = mt9m114_pa_g_ctrl,
  996. .s_ctrl = mt9m114_pa_s_ctrl,
  997. };
  998. static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual)
  999. {
  1000. /*
  1001. * Update the volatile flag on the manual exposure and gain controls.
  1002. * If the controls have switched to manual, read their current value
  1003. * from the hardware to ensure that control read and write operations
  1004. * will behave correctly
  1005. */
  1006. if (manual) {
  1007. mt9m114_pa_g_ctrl(sensor->pa.exposure);
  1008. sensor->pa.exposure->cur.val = sensor->pa.exposure->val;
  1009. sensor->pa.exposure->flags &= ~V4L2_CTRL_FLAG_VOLATILE;
  1010. mt9m114_pa_g_ctrl(sensor->pa.gain);
  1011. sensor->pa.gain->cur.val = sensor->pa.gain->val;
  1012. sensor->pa.gain->flags &= ~V4L2_CTRL_FLAG_VOLATILE;
  1013. } else {
  1014. sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
  1015. sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
  1016. }
  1017. }
  1018. static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor,
  1019. const struct v4l2_mbus_framefmt *format)
  1020. {
  1021. unsigned int max_blank;
  1022. /* Update the blanking controls ranges based on the output size. */
  1023. max_blank = MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX
  1024. - format->width;
  1025. __v4l2_ctrl_modify_range(sensor->pa.hblank, MT9M114_MIN_HBLANK,
  1026. max_blank, 1, MT9M114_DEF_HBLANK);
  1027. max_blank = MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX
  1028. - format->height;
  1029. __v4l2_ctrl_modify_range(sensor->pa.vblank, MT9M114_MIN_VBLANK,
  1030. max_blank, 1, MT9M114_DEF_VBLANK);
  1031. }
  1032. /* -----------------------------------------------------------------------------
  1033. * Pixel Array Subdev Operations
  1034. */
  1035. static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
  1036. {
  1037. return container_of(sd, struct mt9m114, pa.sd);
  1038. }
  1039. static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
  1040. struct v4l2_subdev_state *state)
  1041. {
  1042. struct v4l2_mbus_framefmt *format;
  1043. struct v4l2_rect *crop;
  1044. crop = v4l2_subdev_state_get_crop(state, 0);
  1045. crop->left = 0;
  1046. crop->top = 0;
  1047. crop->width = MT9M114_PIXEL_ARRAY_WIDTH;
  1048. crop->height = MT9M114_PIXEL_ARRAY_HEIGHT;
  1049. format = v4l2_subdev_state_get_format(state, 0);
  1050. format->width = MT9M114_PIXEL_ARRAY_WIDTH;
  1051. format->height = MT9M114_PIXEL_ARRAY_HEIGHT;
  1052. format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
  1053. format->field = V4L2_FIELD_NONE;
  1054. format->colorspace = V4L2_COLORSPACE_RAW;
  1055. format->ycbcr_enc = V4L2_YCBCR_ENC_601;
  1056. format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
  1057. format->xfer_func = V4L2_XFER_FUNC_NONE;
  1058. return 0;
  1059. }
  1060. static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd,
  1061. struct v4l2_subdev_state *state,
  1062. struct v4l2_subdev_mbus_code_enum *code)
  1063. {
  1064. if (code->index > 0)
  1065. return -EINVAL;
  1066. code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
  1067. return 0;
  1068. }
  1069. static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd,
  1070. struct v4l2_subdev_state *state,
  1071. struct v4l2_subdev_frame_size_enum *fse)
  1072. {
  1073. if (fse->index > 1)
  1074. return -EINVAL;
  1075. if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
  1076. return -EINVAL;
  1077. /* Report binning capability through frame size enumeration. */
  1078. fse->min_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1);
  1079. fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1);
  1080. fse->min_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1);
  1081. fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1);
  1082. return 0;
  1083. }
  1084. static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd,
  1085. struct v4l2_subdev_state *state,
  1086. struct v4l2_subdev_format *fmt)
  1087. {
  1088. struct mt9m114 *sensor = pa_to_mt9m114(sd);
  1089. struct v4l2_mbus_framefmt *format;
  1090. struct v4l2_rect *crop;
  1091. unsigned int hscale;
  1092. unsigned int vscale;
  1093. crop = v4l2_subdev_state_get_crop(state, fmt->pad);
  1094. format = v4l2_subdev_state_get_format(state, fmt->pad);
  1095. /* The sensor can bin horizontally and vertically. */
  1096. hscale = DIV_ROUND_CLOSEST(crop->width, fmt->format.width ? : 1);
  1097. vscale = DIV_ROUND_CLOSEST(crop->height, fmt->format.height ? : 1);
  1098. format->width = crop->width / clamp(hscale, 1U, 2U);
  1099. format->height = crop->height / clamp(vscale, 1U, 2U);
  1100. fmt->format = *format;
  1101. if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
  1102. mt9m114_pa_ctrl_update_blanking(sensor, format);
  1103. return 0;
  1104. }
  1105. static int mt9m114_pa_get_selection(struct v4l2_subdev *sd,
  1106. struct v4l2_subdev_state *state,
  1107. struct v4l2_subdev_selection *sel)
  1108. {
  1109. switch (sel->target) {
  1110. case V4L2_SEL_TGT_CROP:
  1111. sel->r = *v4l2_subdev_state_get_crop(state, sel->pad);
  1112. return 0;
  1113. case V4L2_SEL_TGT_CROP_DEFAULT:
  1114. case V4L2_SEL_TGT_CROP_BOUNDS:
  1115. case V4L2_SEL_TGT_NATIVE_SIZE:
  1116. sel->r.left = 0;
  1117. sel->r.top = 0;
  1118. sel->r.width = MT9M114_PIXEL_ARRAY_WIDTH;
  1119. sel->r.height = MT9M114_PIXEL_ARRAY_HEIGHT;
  1120. return 0;
  1121. default:
  1122. return -EINVAL;
  1123. }
  1124. }
  1125. static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
  1126. struct v4l2_subdev_state *state,
  1127. struct v4l2_subdev_selection *sel)
  1128. {
  1129. struct mt9m114 *sensor = pa_to_mt9m114(sd);
  1130. struct v4l2_mbus_framefmt *format;
  1131. struct v4l2_rect *crop;
  1132. int ret = 0;
  1133. if (sel->target != V4L2_SEL_TGT_CROP)
  1134. return -EINVAL;
  1135. crop = v4l2_subdev_state_get_crop(state, sel->pad);
  1136. format = v4l2_subdev_state_get_format(state, sel->pad);
  1137. /*
  1138. * Clamp the crop rectangle. The vertical coordinates must be even, and
  1139. * the horizontal coordinates must be a multiple of 4.
  1140. *
  1141. * FIXME: The horizontal coordinates must be a multiple of 8 when
  1142. * binning, but binning is configured after setting the selection, so
  1143. * we can't know tell here if it will be used.
  1144. */
  1145. sel->r.left = ALIGN(sel->r.left, 4);
  1146. sel->r.top = ALIGN(sel->r.top, 2);
  1147. sel->r.width = clamp_t(unsigned int, ALIGN(sel->r.width, 4),
  1148. MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH,
  1149. MT9M114_PIXEL_ARRAY_WIDTH - sel->r.left);
  1150. sel->r.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
  1151. MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT,
  1152. MT9M114_PIXEL_ARRAY_HEIGHT - sel->r.top);
  1153. /* Changing the selection size is not allowed in streaming state. */
  1154. if (sensor->streaming &&
  1155. (sel->r.height != crop->height || sel->r.width != crop->width))
  1156. return -EBUSY;
  1157. *crop = sel->r;
  1158. /* Reset the format. */
  1159. format->width = crop->width;
  1160. format->height = crop->height;
  1161. if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE)
  1162. return ret;
  1163. mt9m114_pa_ctrl_update_blanking(sensor, format);
  1164. /* Apply values immediately if streaming. */
  1165. if (sensor->streaming) {
  1166. ret = mt9m114_configure_pa(sensor, state);
  1167. if (ret)
  1168. return ret;
  1169. /* Changing the cropping config requires a CONFIG_CHANGE. */
  1170. ret = mt9m114_set_state(sensor,
  1171. MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
  1172. }
  1173. return ret;
  1174. }
  1175. static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = {
  1176. .enum_mbus_code = mt9m114_pa_enum_mbus_code,
  1177. .enum_frame_size = mt9m114_pa_enum_framesizes,
  1178. .get_fmt = v4l2_subdev_get_fmt,
  1179. .set_fmt = mt9m114_pa_set_fmt,
  1180. .get_selection = mt9m114_pa_get_selection,
  1181. .set_selection = mt9m114_pa_set_selection,
  1182. };
  1183. static const struct v4l2_subdev_ops mt9m114_pa_ops = {
  1184. .pad = &mt9m114_pa_pad_ops,
  1185. };
  1186. static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = {
  1187. .init_state = mt9m114_pa_init_state,
  1188. };
  1189. static int mt9m114_pa_init(struct mt9m114 *sensor)
  1190. {
  1191. struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl;
  1192. struct v4l2_subdev *sd = &sensor->pa.sd;
  1193. struct media_pad *pads = &sensor->pa.pad;
  1194. const struct v4l2_mbus_framefmt *format;
  1195. struct v4l2_subdev_state *state;
  1196. unsigned int max_exposure;
  1197. int ret;
  1198. /* Initialize the subdev. */
  1199. v4l2_subdev_init(sd, &mt9m114_pa_ops);
  1200. sd->internal_ops = &mt9m114_pa_internal_ops;
  1201. v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array");
  1202. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  1203. sd->owner = THIS_MODULE;
  1204. sd->dev = &sensor->client->dev;
  1205. v4l2_set_subdevdata(sd, sensor->client);
  1206. /* Initialize the media entity. */
  1207. sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
  1208. sd->entity.ops = &mt9m114_entity_ops;
  1209. pads[0].flags = MEDIA_PAD_FL_SOURCE;
  1210. ret = media_entity_pads_init(&sd->entity, 1, pads);
  1211. if (ret < 0)
  1212. return ret;
  1213. /* Initialize the control handler. */
  1214. v4l2_ctrl_handler_init(hdl, 7);
  1215. /* The range of the HBLANK and VBLANK controls will be updated below. */
  1216. sensor->pa.hblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1217. V4L2_CID_HBLANK,
  1218. MT9M114_DEF_HBLANK,
  1219. MT9M114_DEF_HBLANK, 1,
  1220. MT9M114_DEF_HBLANK);
  1221. sensor->pa.vblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1222. V4L2_CID_VBLANK,
  1223. MT9M114_DEF_VBLANK,
  1224. MT9M114_DEF_VBLANK, 1,
  1225. MT9M114_DEF_VBLANK);
  1226. /*
  1227. * The maximum coarse integration time is the frame length in lines
  1228. * minus two. The default is taken directly from the datasheet, but
  1229. * makes little sense as auto-exposure is enabled by default.
  1230. */
  1231. max_exposure = MT9M114_PIXEL_ARRAY_HEIGHT + MT9M114_MIN_VBLANK - 2;
  1232. sensor->pa.exposure = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1233. V4L2_CID_EXPOSURE, 1,
  1234. max_exposure, 1, 16);
  1235. if (sensor->pa.exposure)
  1236. sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
  1237. sensor->pa.gain = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1238. V4L2_CID_ANALOGUE_GAIN, 1,
  1239. 511, 1, 32);
  1240. if (sensor->pa.gain)
  1241. sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
  1242. v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1243. V4L2_CID_PIXEL_RATE,
  1244. sensor->pixrate, sensor->pixrate, 1,
  1245. sensor->pixrate);
  1246. v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1247. V4L2_CID_HFLIP,
  1248. 0, 1, 1, 0);
  1249. v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops,
  1250. V4L2_CID_VFLIP,
  1251. 0, 1, 1, 0);
  1252. if (hdl->error) {
  1253. ret = hdl->error;
  1254. goto error;
  1255. }
  1256. sd->state_lock = hdl->lock;
  1257. ret = v4l2_subdev_init_finalize(sd);
  1258. if (ret)
  1259. goto error;
  1260. /* Update the range of the blanking controls based on the format. */
  1261. state = v4l2_subdev_lock_and_get_active_state(sd);
  1262. format = v4l2_subdev_state_get_format(state, 0);
  1263. mt9m114_pa_ctrl_update_blanking(sensor, format);
  1264. v4l2_subdev_unlock_state(state);
  1265. sd->ctrl_handler = hdl;
  1266. return 0;
  1267. error:
  1268. v4l2_ctrl_handler_free(&sensor->pa.hdl);
  1269. media_entity_cleanup(&sensor->pa.sd.entity);
  1270. return ret;
  1271. }
  1272. static void mt9m114_pa_cleanup(struct mt9m114 *sensor)
  1273. {
  1274. v4l2_ctrl_handler_free(&sensor->pa.hdl);
  1275. media_entity_cleanup(&sensor->pa.sd.entity);
  1276. }
  1277. /* -----------------------------------------------------------------------------
  1278. * Image Flow Processor Control Operations
  1279. */
  1280. static const char * const mt9m114_test_pattern_menu[] = {
  1281. "Disabled",
  1282. "Solid Color",
  1283. "100% Color Bars",
  1284. "Pseudo-Random",
  1285. "Fade-to-Gray Color Bars",
  1286. "Walking Ones 10-bit",
  1287. "Walking Ones 8-bit",
  1288. };
  1289. /* Keep in sync with mt9m114_test_pattern_menu */
  1290. static const unsigned int mt9m114_test_pattern_value[] = {
  1291. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID,
  1292. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS,
  1293. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM,
  1294. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS,
  1295. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B,
  1296. MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B,
  1297. };
  1298. static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
  1299. {
  1300. return container_of(ctrl->handler, struct mt9m114, ifp.hdl);
  1301. }
  1302. static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl)
  1303. {
  1304. struct mt9m114 *sensor = ifp_ctrl_to_mt9m114(ctrl);
  1305. u32 value;
  1306. int ret = 0;
  1307. if (ctrl->id == V4L2_CID_EXPOSURE_AUTO)
  1308. mt9m114_pa_ctrl_update_exposure(sensor,
  1309. ctrl->val != V4L2_EXPOSURE_AUTO);
  1310. /* V4L2 controls values are applied only when power is up. */
  1311. if (!pm_runtime_get_if_in_use(&sensor->client->dev))
  1312. return 0;
  1313. switch (ctrl->id) {
  1314. case V4L2_CID_AUTO_WHITE_BALANCE:
  1315. /* Control both the AWB mode and the CCM algorithm. */
  1316. if (ctrl->val)
  1317. value = MT9M114_CAM_AWB_MODE_AUTO
  1318. | MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE;
  1319. else
  1320. value = 0;
  1321. cci_write(sensor->regmap, MT9M114_CAM_AWB_AWBMODE, value, &ret);
  1322. if (ctrl->val)
  1323. value = MT9M114_CCM_EXEC_CALC_CCM_MATRIX | 0x22;
  1324. else
  1325. value = 0;
  1326. cci_write(sensor->regmap, MT9M114_CCM_ALGO, value, &ret);
  1327. break;
  1328. case V4L2_CID_EXPOSURE_AUTO:
  1329. if (ctrl->val == V4L2_EXPOSURE_AUTO)
  1330. value = MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE
  1331. | 0x00fe;
  1332. else
  1333. value = 0;
  1334. cci_write(sensor->regmap, MT9M114_AE_TRACK_ALGO, value, &ret);
  1335. if (ret)
  1336. break;
  1337. break;
  1338. case V4L2_CID_TEST_PATTERN:
  1339. case V4L2_CID_TEST_PATTERN_RED:
  1340. case V4L2_CID_TEST_PATTERN_GREENR:
  1341. case V4L2_CID_TEST_PATTERN_BLUE: {
  1342. unsigned int pattern = sensor->ifp.tpg[MT9M114_TPG_PATTERN]->val;
  1343. if (pattern) {
  1344. cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT,
  1345. MT9M114_CAM_MODE_SELECT_TEST_PATTERN, &ret);
  1346. cci_write(sensor->regmap,
  1347. MT9M114_CAM_MODE_TEST_PATTERN_SELECT,
  1348. mt9m114_test_pattern_value[pattern - 1], &ret);
  1349. cci_write(sensor->regmap,
  1350. MT9M114_CAM_MODE_TEST_PATTERN_RED,
  1351. sensor->ifp.tpg[MT9M114_TPG_RED]->val, &ret);
  1352. cci_write(sensor->regmap,
  1353. MT9M114_CAM_MODE_TEST_PATTERN_GREEN,
  1354. sensor->ifp.tpg[MT9M114_TPG_GREEN]->val, &ret);
  1355. cci_write(sensor->regmap,
  1356. MT9M114_CAM_MODE_TEST_PATTERN_BLUE,
  1357. sensor->ifp.tpg[MT9M114_TPG_BLUE]->val, &ret);
  1358. } else {
  1359. cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT,
  1360. MT9M114_CAM_MODE_SELECT_NORMAL, &ret);
  1361. }
  1362. /*
  1363. * A Config-Change needs to be issued for the change to take
  1364. * effect. If we're not streaming ignore this, the change will
  1365. * be applied when the stream is started.
  1366. */
  1367. if (ret || !sensor->streaming)
  1368. break;
  1369. ret = mt9m114_set_state(sensor,
  1370. MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE);
  1371. break;
  1372. }
  1373. default:
  1374. ret = -EINVAL;
  1375. break;
  1376. }
  1377. pm_runtime_put_autosuspend(&sensor->client->dev);
  1378. return ret;
  1379. }
  1380. static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops = {
  1381. .s_ctrl = mt9m114_ifp_s_ctrl,
  1382. };
  1383. /* -----------------------------------------------------------------------------
  1384. * Image Flow Processor Subdev Operations
  1385. */
  1386. static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd)
  1387. {
  1388. return container_of(sd, struct mt9m114, ifp.sd);
  1389. }
  1390. static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable)
  1391. {
  1392. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1393. struct v4l2_subdev_state *pa_state;
  1394. struct v4l2_subdev_state *ifp_state;
  1395. int ret;
  1396. if (!enable)
  1397. return mt9m114_stop_streaming(sensor);
  1398. ifp_state = v4l2_subdev_lock_and_get_active_state(&sensor->ifp.sd);
  1399. pa_state = v4l2_subdev_lock_and_get_active_state(&sensor->pa.sd);
  1400. ret = mt9m114_start_streaming(sensor, pa_state, ifp_state);
  1401. v4l2_subdev_unlock_state(pa_state);
  1402. v4l2_subdev_unlock_state(ifp_state);
  1403. return ret;
  1404. }
  1405. static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd,
  1406. struct v4l2_subdev_state *sd_state,
  1407. struct v4l2_subdev_frame_interval *interval)
  1408. {
  1409. struct v4l2_fract *ival = &interval->interval;
  1410. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1411. /*
  1412. * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2
  1413. * subdev active state API.
  1414. */
  1415. if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE)
  1416. return -EINVAL;
  1417. ival->numerator = 1;
  1418. ival->denominator = sensor->ifp.frame_rate;
  1419. return 0;
  1420. }
  1421. static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd,
  1422. struct v4l2_subdev_state *sd_state,
  1423. struct v4l2_subdev_frame_interval *interval)
  1424. {
  1425. struct v4l2_fract *ival = &interval->interval;
  1426. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1427. int ret = 0;
  1428. /*
  1429. * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2
  1430. * subdev active state API.
  1431. */
  1432. if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE)
  1433. return -EINVAL;
  1434. if (ival->numerator != 0 && ival->denominator != 0)
  1435. sensor->ifp.frame_rate = min_t(unsigned int,
  1436. ival->denominator / ival->numerator,
  1437. MT9M114_MAX_FRAME_RATE);
  1438. else
  1439. sensor->ifp.frame_rate = MT9M114_MAX_FRAME_RATE;
  1440. ival->numerator = 1;
  1441. ival->denominator = sensor->ifp.frame_rate;
  1442. if (sensor->streaming)
  1443. ret = mt9m114_set_frame_rate(sensor);
  1444. return ret;
  1445. }
  1446. static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
  1447. struct v4l2_subdev_state *state)
  1448. {
  1449. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1450. struct v4l2_mbus_framefmt *format;
  1451. struct v4l2_rect *crop;
  1452. struct v4l2_rect *compose;
  1453. format = v4l2_subdev_state_get_format(state, 0);
  1454. format->width = MT9M114_PIXEL_ARRAY_WIDTH;
  1455. format->height = MT9M114_PIXEL_ARRAY_HEIGHT;
  1456. format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
  1457. format->field = V4L2_FIELD_NONE;
  1458. format->colorspace = V4L2_COLORSPACE_RAW;
  1459. format->ycbcr_enc = V4L2_YCBCR_ENC_601;
  1460. format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
  1461. format->xfer_func = V4L2_XFER_FUNC_NONE;
  1462. crop = v4l2_subdev_state_get_crop(state, 0);
  1463. crop->left = 4;
  1464. crop->top = 4;
  1465. crop->width = format->width - 8;
  1466. crop->height = format->height - 8;
  1467. compose = v4l2_subdev_state_get_compose(state, 0);
  1468. compose->left = 0;
  1469. compose->top = 0;
  1470. compose->width = crop->width;
  1471. compose->height = crop->height;
  1472. format = v4l2_subdev_state_get_format(state, 1);
  1473. format->width = compose->width;
  1474. format->height = compose->height;
  1475. format->code = mt9m114_default_format_info(sensor)->code;
  1476. format->field = V4L2_FIELD_NONE;
  1477. format->colorspace = V4L2_COLORSPACE_SRGB;
  1478. format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
  1479. format->quantization = V4L2_QUANTIZATION_DEFAULT;
  1480. format->xfer_func = V4L2_XFER_FUNC_DEFAULT;
  1481. return 0;
  1482. }
  1483. static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd,
  1484. struct v4l2_subdev_state *state,
  1485. struct v4l2_subdev_mbus_code_enum *code)
  1486. {
  1487. const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos);
  1488. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1489. unsigned int index = 0;
  1490. unsigned int flag;
  1491. unsigned int i;
  1492. switch (code->pad) {
  1493. case 0:
  1494. if (code->index != 0)
  1495. return -EINVAL;
  1496. code->code = mt9m114_format_infos[num_formats - 1].code;
  1497. return 0;
  1498. case 1:
  1499. if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY)
  1500. flag = MT9M114_FMT_FLAG_CSI2;
  1501. else
  1502. flag = MT9M114_FMT_FLAG_PARALLEL;
  1503. for (i = 0; i < num_formats; ++i) {
  1504. const struct mt9m114_format_info *info =
  1505. &mt9m114_format_infos[i];
  1506. if (info->flags & flag) {
  1507. if (index == code->index) {
  1508. code->code = info->code;
  1509. return 0;
  1510. }
  1511. index++;
  1512. }
  1513. }
  1514. return -EINVAL;
  1515. default:
  1516. return -EINVAL;
  1517. }
  1518. }
  1519. static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd,
  1520. struct v4l2_subdev_state *state,
  1521. struct v4l2_subdev_frame_size_enum *fse)
  1522. {
  1523. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1524. const struct mt9m114_format_info *info;
  1525. if (fse->index > 0)
  1526. return -EINVAL;
  1527. info = mt9m114_format_info(sensor, fse->pad, fse->code);
  1528. if (!info || info->code != fse->code)
  1529. return -EINVAL;
  1530. if (fse->pad == 0) {
  1531. fse->min_width = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH;
  1532. fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH;
  1533. fse->min_height = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT;
  1534. fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT;
  1535. } else {
  1536. const struct v4l2_rect *crop;
  1537. crop = v4l2_subdev_state_get_crop(state, 0);
  1538. fse->max_width = crop->width;
  1539. fse->max_height = crop->height;
  1540. fse->min_width = fse->max_width / 4;
  1541. fse->min_height = fse->max_height / 4;
  1542. }
  1543. return 0;
  1544. }
  1545. static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd,
  1546. struct v4l2_subdev_state *state,
  1547. struct v4l2_subdev_frame_interval_enum *fie)
  1548. {
  1549. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1550. const struct mt9m114_format_info *info;
  1551. if (fie->index > 0)
  1552. return -EINVAL;
  1553. info = mt9m114_format_info(sensor, fie->pad, fie->code);
  1554. if (!info || info->code != fie->code)
  1555. return -EINVAL;
  1556. fie->interval.numerator = 1;
  1557. fie->interval.denominator = MT9M114_MAX_FRAME_RATE;
  1558. return 0;
  1559. }
  1560. /*
  1561. * Helper function to update IFP crop, compose rectangles and source format
  1562. * when the pixel border size changes, which requires resetting these.
  1563. */
  1564. static void mt9m114_ifp_update_sel_and_src_fmt(struct v4l2_subdev_state *state)
  1565. {
  1566. struct v4l2_mbus_framefmt *src_format, *sink_format;
  1567. struct v4l2_rect *crop;
  1568. unsigned int border;
  1569. sink_format = v4l2_subdev_state_get_format(state, 0);
  1570. src_format = v4l2_subdev_state_get_format(state, 1);
  1571. crop = v4l2_subdev_state_get_crop(state, 0);
  1572. border = mt9m114_ifp_get_border(state);
  1573. crop->left = border;
  1574. crop->top = border;
  1575. crop->width = sink_format->width - 2 * border;
  1576. crop->height = sink_format->height - 2 * border;
  1577. *v4l2_subdev_state_get_compose(state, 0) = *crop;
  1578. src_format->width = crop->width;
  1579. src_format->height = crop->height;
  1580. if (src_format->code == MEDIA_BUS_FMT_SGRBG10_1X10) {
  1581. src_format->colorspace = V4L2_COLORSPACE_RAW;
  1582. src_format->ycbcr_enc = V4L2_YCBCR_ENC_601;
  1583. src_format->quantization = V4L2_QUANTIZATION_FULL_RANGE;
  1584. } else {
  1585. src_format->colorspace = V4L2_COLORSPACE_SRGB;
  1586. src_format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
  1587. src_format->quantization = V4L2_QUANTIZATION_DEFAULT;
  1588. }
  1589. }
  1590. static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd,
  1591. struct v4l2_subdev_state *state,
  1592. struct v4l2_subdev_format *fmt)
  1593. {
  1594. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1595. struct v4l2_mbus_framefmt *format;
  1596. format = v4l2_subdev_state_get_format(state, fmt->pad);
  1597. if (fmt->pad == 0) {
  1598. /* Only the size can be changed on the sink pad. */
  1599. format->width = clamp(ALIGN(fmt->format.width, 8),
  1600. MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH,
  1601. MT9M114_PIXEL_ARRAY_WIDTH);
  1602. format->height = clamp(ALIGN(fmt->format.height, 8),
  1603. MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT,
  1604. MT9M114_PIXEL_ARRAY_HEIGHT);
  1605. /* Propagate changes downstream. */
  1606. mt9m114_ifp_update_sel_and_src_fmt(state);
  1607. } else {
  1608. const struct mt9m114_format_info *info;
  1609. /* Only the media bus code can be changed on the source pad. */
  1610. info = mt9m114_format_info(sensor, 1, fmt->format.code);
  1611. /*
  1612. * If the output format changes from/to RAW10 then the crop
  1613. * rectangle needs to be adjusted to add / remove the 4 pixel
  1614. * border used for demosaicing. And these changes then need to
  1615. * be propagated to the compose rectangle and source format.
  1616. */
  1617. if ((format->code == MEDIA_BUS_FMT_SGRBG10_1X10) !=
  1618. (info->code == MEDIA_BUS_FMT_SGRBG10_1X10)) {
  1619. format->code = info->code;
  1620. mt9m114_ifp_update_sel_and_src_fmt(state);
  1621. } else {
  1622. format->code = info->code;
  1623. }
  1624. }
  1625. fmt->format = *format;
  1626. return 0;
  1627. }
  1628. static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd,
  1629. struct v4l2_subdev_state *state,
  1630. struct v4l2_subdev_selection *sel)
  1631. {
  1632. const struct v4l2_mbus_framefmt *format;
  1633. const struct v4l2_rect *crop;
  1634. unsigned int border;
  1635. int ret = 0;
  1636. /* Crop and compose are only supported on the sink pad. */
  1637. if (sel->pad != 0)
  1638. return -EINVAL;
  1639. switch (sel->target) {
  1640. case V4L2_SEL_TGT_CROP:
  1641. sel->r = *v4l2_subdev_state_get_crop(state, 0);
  1642. break;
  1643. case V4L2_SEL_TGT_CROP_DEFAULT:
  1644. case V4L2_SEL_TGT_CROP_BOUNDS:
  1645. /*
  1646. * Crop defaults and bounds are equal to the sink format size.
  1647. * For source pad formats other then RAW10 this gets reduced
  1648. * by 4 pixels on each side for demosaicing.
  1649. */
  1650. format = v4l2_subdev_state_get_format(state, 0);
  1651. border = mt9m114_ifp_get_border(state);
  1652. sel->r.left = border;
  1653. sel->r.top = border;
  1654. sel->r.width = format->width - 2 * border;
  1655. sel->r.height = format->height - 2 * border;
  1656. break;
  1657. case V4L2_SEL_TGT_COMPOSE:
  1658. sel->r = *v4l2_subdev_state_get_compose(state, 0);
  1659. break;
  1660. case V4L2_SEL_TGT_COMPOSE_DEFAULT:
  1661. case V4L2_SEL_TGT_COMPOSE_BOUNDS:
  1662. /*
  1663. * The compose default and bounds sizes are equal to the sink
  1664. * crop rectangle size.
  1665. */
  1666. crop = v4l2_subdev_state_get_crop(state, 0);
  1667. sel->r.left = 0;
  1668. sel->r.top = 0;
  1669. sel->r.width = crop->width;
  1670. sel->r.height = crop->height;
  1671. break;
  1672. default:
  1673. ret = -EINVAL;
  1674. break;
  1675. }
  1676. return ret;
  1677. }
  1678. static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd,
  1679. struct v4l2_subdev_state *state,
  1680. struct v4l2_subdev_selection *sel)
  1681. {
  1682. struct v4l2_mbus_framefmt *format, *src_format;
  1683. struct v4l2_rect *crop;
  1684. struct v4l2_rect *compose;
  1685. unsigned int border;
  1686. if (sel->target != V4L2_SEL_TGT_CROP &&
  1687. sel->target != V4L2_SEL_TGT_COMPOSE)
  1688. return -EINVAL;
  1689. /* Crop and compose are only supported on the sink pad. */
  1690. if (sel->pad != 0)
  1691. return -EINVAL;
  1692. crop = v4l2_subdev_state_get_crop(state, 0);
  1693. /* Crop and compose cannot be changed when bypassing the scaler. */
  1694. src_format = v4l2_subdev_state_get_format(state, 1);
  1695. if (src_format->code == MEDIA_BUS_FMT_SGRBG10_1X10) {
  1696. sel->r = *crop;
  1697. return 0;
  1698. }
  1699. format = v4l2_subdev_state_get_format(state, 0);
  1700. compose = v4l2_subdev_state_get_compose(state, 0);
  1701. if (sel->target == V4L2_SEL_TGT_CROP) {
  1702. /*
  1703. * Clamp the crop rectangle. For source pad formats other then
  1704. * RAW10 demosaicing removes 4 pixels on each side of the image.
  1705. */
  1706. border = mt9m114_ifp_get_border(state);
  1707. crop->left = clamp_t(unsigned int, ALIGN(sel->r.left, 2), border,
  1708. format->width - border -
  1709. MT9M114_SCALER_CROPPED_INPUT_WIDTH);
  1710. crop->top = clamp_t(unsigned int, ALIGN(sel->r.top, 2), border,
  1711. format->height - border -
  1712. MT9M114_SCALER_CROPPED_INPUT_HEIGHT);
  1713. crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
  1714. MT9M114_SCALER_CROPPED_INPUT_WIDTH,
  1715. format->width - border - crop->left);
  1716. crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
  1717. MT9M114_SCALER_CROPPED_INPUT_HEIGHT,
  1718. format->height - border - crop->top);
  1719. sel->r = *crop;
  1720. /* Propagate to the compose rectangle. */
  1721. compose->width = crop->width;
  1722. compose->height = crop->height;
  1723. } else {
  1724. /*
  1725. * Clamp the compose rectangle. The scaler can only downscale.
  1726. */
  1727. compose->left = 0;
  1728. compose->top = 0;
  1729. compose->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
  1730. MT9M114_SCALER_CROPPED_INPUT_WIDTH,
  1731. crop->width);
  1732. compose->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
  1733. MT9M114_SCALER_CROPPED_INPUT_HEIGHT,
  1734. crop->height);
  1735. sel->r = *compose;
  1736. }
  1737. /* Propagate the compose rectangle to the source format. */
  1738. src_format->width = compose->width;
  1739. src_format->height = compose->height;
  1740. return 0;
  1741. }
  1742. static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd)
  1743. {
  1744. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1745. v4l2_device_unregister_subdev(&sensor->pa.sd);
  1746. }
  1747. static int mt9m114_ifp_registered(struct v4l2_subdev *sd)
  1748. {
  1749. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1750. int ret;
  1751. ret = v4l2_device_register_subdev(sd->v4l2_dev, &sensor->pa.sd);
  1752. if (ret < 0) {
  1753. dev_err(&sensor->client->dev,
  1754. "Failed to register pixel array subdev\n");
  1755. return ret;
  1756. }
  1757. ret = media_create_pad_link(&sensor->pa.sd.entity, 0,
  1758. &sensor->ifp.sd.entity, 0,
  1759. MEDIA_LNK_FL_ENABLED |
  1760. MEDIA_LNK_FL_IMMUTABLE);
  1761. if (ret < 0) {
  1762. dev_err(&sensor->client->dev,
  1763. "Failed to link pixel array to ifp\n");
  1764. v4l2_device_unregister_subdev(&sensor->pa.sd);
  1765. return ret;
  1766. }
  1767. return 0;
  1768. }
  1769. static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = {
  1770. .s_stream = mt9m114_ifp_s_stream,
  1771. };
  1772. static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = {
  1773. .enum_mbus_code = mt9m114_ifp_enum_mbus_code,
  1774. .enum_frame_size = mt9m114_ifp_enum_framesizes,
  1775. .enum_frame_interval = mt9m114_ifp_enum_frameintervals,
  1776. .get_fmt = v4l2_subdev_get_fmt,
  1777. .set_fmt = mt9m114_ifp_set_fmt,
  1778. .get_selection = mt9m114_ifp_get_selection,
  1779. .set_selection = mt9m114_ifp_set_selection,
  1780. .get_frame_interval = mt9m114_ifp_get_frame_interval,
  1781. .set_frame_interval = mt9m114_ifp_set_frame_interval,
  1782. };
  1783. static const struct v4l2_subdev_ops mt9m114_ifp_ops = {
  1784. .video = &mt9m114_ifp_video_ops,
  1785. .pad = &mt9m114_ifp_pad_ops,
  1786. };
  1787. static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = {
  1788. .init_state = mt9m114_ifp_init_state,
  1789. .registered = mt9m114_ifp_registered,
  1790. .unregistered = mt9m114_ifp_unregistered,
  1791. };
  1792. static int mt9m114_ifp_init(struct mt9m114 *sensor)
  1793. {
  1794. struct v4l2_subdev *sd = &sensor->ifp.sd;
  1795. struct media_pad *pads = sensor->ifp.pads;
  1796. struct v4l2_ctrl_handler *hdl = &sensor->ifp.hdl;
  1797. struct v4l2_ctrl *link_freq;
  1798. int ret;
  1799. /* Initialize the subdev. */
  1800. v4l2_i2c_subdev_init(sd, sensor->client, &mt9m114_ifp_ops);
  1801. v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " ifp");
  1802. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  1803. sd->internal_ops = &mt9m114_ifp_internal_ops;
  1804. /* Initialize the media entity. */
  1805. sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP;
  1806. sd->entity.ops = &mt9m114_entity_ops;
  1807. pads[0].flags = MEDIA_PAD_FL_SINK;
  1808. pads[1].flags = MEDIA_PAD_FL_SOURCE;
  1809. ret = media_entity_pads_init(&sd->entity, 2, pads);
  1810. if (ret < 0)
  1811. return ret;
  1812. sensor->ifp.frame_rate = MT9M114_DEF_FRAME_RATE;
  1813. /* Initialize the control handler. */
  1814. v4l2_ctrl_handler_init(hdl, 8);
  1815. v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
  1816. V4L2_CID_AUTO_WHITE_BALANCE,
  1817. 0, 1, 1, 1);
  1818. v4l2_ctrl_new_std_menu(hdl, &mt9m114_ifp_ctrl_ops,
  1819. V4L2_CID_EXPOSURE_AUTO,
  1820. V4L2_EXPOSURE_MANUAL, 0,
  1821. V4L2_EXPOSURE_AUTO);
  1822. link_freq = v4l2_ctrl_new_int_menu(hdl, &mt9m114_ifp_ctrl_ops,
  1823. V4L2_CID_LINK_FREQ,
  1824. sensor->bus_cfg.nr_of_link_frequencies - 1,
  1825. 0, sensor->bus_cfg.link_frequencies);
  1826. if (link_freq)
  1827. link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
  1828. v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
  1829. V4L2_CID_PIXEL_RATE,
  1830. sensor->pixrate, sensor->pixrate, 1,
  1831. sensor->pixrate);
  1832. sensor->ifp.tpg[MT9M114_TPG_PATTERN] =
  1833. v4l2_ctrl_new_std_menu_items(hdl, &mt9m114_ifp_ctrl_ops,
  1834. V4L2_CID_TEST_PATTERN,
  1835. ARRAY_SIZE(mt9m114_test_pattern_menu) - 1,
  1836. 0, 0, mt9m114_test_pattern_menu);
  1837. sensor->ifp.tpg[MT9M114_TPG_RED] =
  1838. v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
  1839. V4L2_CID_TEST_PATTERN_RED,
  1840. 0, 1023, 1, 1023);
  1841. sensor->ifp.tpg[MT9M114_TPG_GREEN] =
  1842. v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
  1843. V4L2_CID_TEST_PATTERN_GREENR,
  1844. 0, 1023, 1, 1023);
  1845. sensor->ifp.tpg[MT9M114_TPG_BLUE] =
  1846. v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops,
  1847. V4L2_CID_TEST_PATTERN_BLUE,
  1848. 0, 1023, 1, 1023);
  1849. v4l2_ctrl_cluster(ARRAY_SIZE(sensor->ifp.tpg), sensor->ifp.tpg);
  1850. if (hdl->error) {
  1851. ret = hdl->error;
  1852. goto error;
  1853. }
  1854. sd->ctrl_handler = hdl;
  1855. sd->state_lock = hdl->lock;
  1856. ret = v4l2_subdev_init_finalize(sd);
  1857. if (ret)
  1858. goto error;
  1859. return 0;
  1860. error:
  1861. v4l2_ctrl_handler_free(&sensor->ifp.hdl);
  1862. media_entity_cleanup(&sensor->ifp.sd.entity);
  1863. return ret;
  1864. }
  1865. static void mt9m114_ifp_cleanup(struct mt9m114 *sensor)
  1866. {
  1867. v4l2_ctrl_handler_free(&sensor->ifp.hdl);
  1868. media_entity_cleanup(&sensor->ifp.sd.entity);
  1869. }
  1870. /* -----------------------------------------------------------------------------
  1871. * Power Management
  1872. */
  1873. static int mt9m114_power_on(struct mt9m114 *sensor)
  1874. {
  1875. int ret;
  1876. /* Enable power and clocks. */
  1877. ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies),
  1878. sensor->supplies);
  1879. if (ret < 0)
  1880. return ret;
  1881. ret = clk_prepare_enable(sensor->clk);
  1882. if (ret < 0)
  1883. goto error_regulator;
  1884. /* Perform a hard reset if available, or a soft reset otherwise. */
  1885. if (sensor->reset) {
  1886. long freq = clk_get_rate(sensor->clk);
  1887. unsigned int duration;
  1888. /*
  1889. * The minimum duration is 50 clock cycles, thus typically
  1890. * around 2µs. Double it to be safe.
  1891. */
  1892. duration = DIV_ROUND_UP(2 * 50 * 1000000, freq);
  1893. gpiod_set_value(sensor->reset, 1);
  1894. fsleep(duration);
  1895. gpiod_set_value(sensor->reset, 0);
  1896. } else {
  1897. /*
  1898. * The power may have just been turned on, we need to wait for
  1899. * the sensor to be ready to accept I2C commands.
  1900. */
  1901. usleep_range(44500, 50000);
  1902. cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL,
  1903. MT9M114_RESET_SOC, &ret);
  1904. cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 0,
  1905. &ret);
  1906. if (ret < 0) {
  1907. dev_err(&sensor->client->dev, "Soft reset failed\n");
  1908. goto error_clock;
  1909. }
  1910. }
  1911. /*
  1912. * Wait for the sensor to be ready to accept I2C commands by polling the
  1913. * command register to wait for initialization to complete.
  1914. */
  1915. usleep_range(44500, 50000);
  1916. ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE);
  1917. if (ret < 0)
  1918. goto error_clock;
  1919. if (sensor->bus_cfg.bus_type == V4L2_MBUS_PARALLEL) {
  1920. /*
  1921. * In parallel mode (OE set to low), the sensor will enter the
  1922. * streaming state after initialization. Enter the standby
  1923. * manually to stop streaming.
  1924. */
  1925. ret = mt9m114_set_state(sensor,
  1926. MT9M114_SYS_STATE_ENTER_STANDBY);
  1927. if (ret < 0)
  1928. goto error_clock;
  1929. }
  1930. /*
  1931. * Before issuing any Set-State command, we must ensure that the sensor
  1932. * reaches the standby mode (either initiated manually above in
  1933. * parallel mode, or automatically after reset in MIPI mode).
  1934. */
  1935. ret = mt9m114_poll_state(sensor, MT9M114_SYS_STATE_STANDBY);
  1936. if (ret < 0)
  1937. goto error_clock;
  1938. return 0;
  1939. error_clock:
  1940. clk_disable_unprepare(sensor->clk);
  1941. error_regulator:
  1942. regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
  1943. return ret;
  1944. }
  1945. static void mt9m114_power_off(struct mt9m114 *sensor)
  1946. {
  1947. unsigned int duration;
  1948. gpiod_set_value(sensor->reset, 1);
  1949. /* Power off takes 10 clock cycles. Double it to be safe. */
  1950. duration = DIV_ROUND_UP(2 * 10 * 1000000, clk_get_rate(sensor->clk));
  1951. fsleep(duration);
  1952. clk_disable_unprepare(sensor->clk);
  1953. regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);
  1954. }
  1955. static int __maybe_unused mt9m114_runtime_resume(struct device *dev)
  1956. {
  1957. struct v4l2_subdev *sd = dev_get_drvdata(dev);
  1958. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1959. return mt9m114_power_on(sensor);
  1960. }
  1961. static int __maybe_unused mt9m114_runtime_suspend(struct device *dev)
  1962. {
  1963. struct v4l2_subdev *sd = dev_get_drvdata(dev);
  1964. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  1965. mt9m114_power_off(sensor);
  1966. return 0;
  1967. }
  1968. static const struct dev_pm_ops mt9m114_pm_ops = {
  1969. SET_RUNTIME_PM_OPS(mt9m114_runtime_suspend, mt9m114_runtime_resume, NULL)
  1970. };
  1971. /* -----------------------------------------------------------------------------
  1972. * Probe & Remove
  1973. */
  1974. static int mt9m114_verify_link_frequency(struct mt9m114 *sensor,
  1975. unsigned int pixrate)
  1976. {
  1977. unsigned int link_freq = sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY
  1978. ? pixrate * 8 : pixrate * 2;
  1979. if (sensor->bus_cfg.nr_of_link_frequencies != 1 ||
  1980. sensor->bus_cfg.link_frequencies[0] != link_freq)
  1981. return -EINVAL;
  1982. return 0;
  1983. }
  1984. /*
  1985. * Based on the docs the PLL is believed to have the following setup:
  1986. *
  1987. * +-----+ +-----+ +-----+ +-----+ +-----+
  1988. * Fin --> | / N | --> | x M | --> | x 2 | --> | / P | --> | / 2 | -->
  1989. * +-----+ +-----+ +-----+ +-----+ +-----+
  1990. * fBit fWord fSensor
  1991. * ext_clock int_clock out_clock pix_clock
  1992. *
  1993. * The MT9M114 docs give a max fBit rate of 768 MHz which translates to
  1994. * an out_clock_max of 384 MHz.
  1995. */
  1996. static int mt9m114_clk_init(struct mt9m114 *sensor)
  1997. {
  1998. static const struct aptina_pll_limits limits = {
  1999. .ext_clock_min = 6000000,
  2000. .ext_clock_max = 54000000,
  2001. /* int_clock_* limits are not documented taken from mt9p031.c */
  2002. .int_clock_min = 2000000,
  2003. .int_clock_max = 13500000,
  2004. /* out_clock_min is not documented, taken from mt9p031.c */
  2005. .out_clock_min = 180000000,
  2006. .out_clock_max = 384000000,
  2007. .pix_clock_max = 48000000,
  2008. .n_min = 1,
  2009. .n_max = 64,
  2010. .m_min = 16,
  2011. .m_max = 192,
  2012. .p1_min = 8,
  2013. .p1_max = 8,
  2014. };
  2015. unsigned int pixrate;
  2016. int ret;
  2017. /*
  2018. * Calculate the pixel rate and link frequency. The CSI-2 bus is clocked
  2019. * for 16-bit per pixel, transmitted in DDR over a single lane. For
  2020. * parallel mode, the sensor ouputs one pixel in two PIXCLK cycles.
  2021. */
  2022. /*
  2023. * Check if EXTCLK fits the configured link frequency. Bypass the PLL
  2024. * in this case.
  2025. */
  2026. pixrate = clk_get_rate(sensor->clk) / 2;
  2027. if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) {
  2028. sensor->pixrate = pixrate;
  2029. sensor->bypass_pll = true;
  2030. return 0;
  2031. }
  2032. /* Check if the PLL configuration fits the configured link frequency. */
  2033. sensor->pll.ext_clock = clk_get_rate(sensor->clk);
  2034. sensor->pll.pix_clock = MT9M114_DEF_PIXCLOCK;
  2035. ret = aptina_pll_calculate(&sensor->client->dev, &limits, &sensor->pll);
  2036. if (ret)
  2037. return ret;
  2038. pixrate = sensor->pll.ext_clock * sensor->pll.m
  2039. / (sensor->pll.n * sensor->pll.p1);
  2040. if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) {
  2041. sensor->pixrate = pixrate;
  2042. sensor->bypass_pll = false;
  2043. return 0;
  2044. }
  2045. dev_err(&sensor->client->dev, "Unsupported DT link-frequencies\n");
  2046. return -EINVAL;
  2047. }
  2048. static int mt9m114_identify(struct mt9m114 *sensor)
  2049. {
  2050. u64 major, minor, release, customer;
  2051. u64 value;
  2052. int ret;
  2053. ret = cci_read(sensor->regmap, MT9M114_CHIP_ID, &value, NULL);
  2054. if (ret) {
  2055. dev_err(&sensor->client->dev, "Failed to read chip ID\n");
  2056. return -ENXIO;
  2057. }
  2058. if (value != 0x2481) {
  2059. dev_err(&sensor->client->dev, "Invalid chip ID 0x%04llx\n",
  2060. value);
  2061. return -ENXIO;
  2062. }
  2063. cci_read(sensor->regmap, MT9M114_MON_MAJOR_VERSION, &major, &ret);
  2064. cci_read(sensor->regmap, MT9M114_MON_MINOR_VERSION, &minor, &ret);
  2065. cci_read(sensor->regmap, MT9M114_MON_RELEASE_VERSION, &release, &ret);
  2066. cci_read(sensor->regmap, MT9M114_CUSTOMER_REV, &customer, &ret);
  2067. if (ret) {
  2068. dev_err(&sensor->client->dev, "Failed to read version\n");
  2069. return -ENXIO;
  2070. }
  2071. dev_dbg(&sensor->client->dev,
  2072. "monitor v%llu.%llu.%04llx customer rev 0x%04llx\n",
  2073. major, minor, release, customer);
  2074. return 0;
  2075. }
  2076. static int mt9m114_parse_dt(struct mt9m114 *sensor)
  2077. {
  2078. struct fwnode_handle *fwnode = dev_fwnode(&sensor->client->dev);
  2079. struct fwnode_handle *ep;
  2080. int ret;
  2081. /*
  2082. * On ACPI systems the fwnode graph can be initialized by a bridge
  2083. * driver, which may not have probed yet. Wait for this.
  2084. *
  2085. * TODO: Return an error once bridge driver code will have moved
  2086. * to the ACPI core.
  2087. */
  2088. ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
  2089. if (!ep)
  2090. return dev_err_probe(&sensor->client->dev, -EPROBE_DEFER,
  2091. "waiting for fwnode graph endpoint\n");
  2092. sensor->bus_cfg.bus_type = V4L2_MBUS_UNKNOWN;
  2093. ret = v4l2_fwnode_endpoint_alloc_parse(ep, &sensor->bus_cfg);
  2094. fwnode_handle_put(ep);
  2095. if (ret < 0) {
  2096. dev_err(&sensor->client->dev, "Failed to parse endpoint\n");
  2097. goto error;
  2098. }
  2099. switch (sensor->bus_cfg.bus_type) {
  2100. case V4L2_MBUS_CSI2_DPHY:
  2101. case V4L2_MBUS_PARALLEL:
  2102. break;
  2103. default:
  2104. dev_err(&sensor->client->dev, "unsupported bus type %u\n",
  2105. sensor->bus_cfg.bus_type);
  2106. ret = -EINVAL;
  2107. goto error;
  2108. }
  2109. sensor->pad_slew_rate = MT9M114_PAD_SLEW_DEFAULT;
  2110. device_property_read_u32(&sensor->client->dev, "slew-rate",
  2111. &sensor->pad_slew_rate);
  2112. if (sensor->pad_slew_rate < MT9M114_PAD_SLEW_MIN ||
  2113. sensor->pad_slew_rate > MT9M114_PAD_SLEW_MAX) {
  2114. dev_err(&sensor->client->dev, "Invalid slew-rate %u\n",
  2115. sensor->pad_slew_rate);
  2116. return -EINVAL;
  2117. }
  2118. return 0;
  2119. error:
  2120. v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
  2121. return ret;
  2122. }
  2123. static int mt9m114_probe(struct i2c_client *client)
  2124. {
  2125. struct device *dev = &client->dev;
  2126. struct mt9m114 *sensor;
  2127. int ret;
  2128. sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
  2129. if (!sensor)
  2130. return -ENOMEM;
  2131. sensor->client = client;
  2132. sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
  2133. if (IS_ERR(sensor->regmap)) {
  2134. dev_err(dev, "Unable to initialize I2C\n");
  2135. return -ENODEV;
  2136. }
  2137. ret = mt9m114_parse_dt(sensor);
  2138. if (ret < 0)
  2139. return ret;
  2140. /* Acquire clocks, GPIOs and regulators. */
  2141. sensor->clk = devm_v4l2_sensor_clk_get(dev, NULL);
  2142. if (IS_ERR(sensor->clk)) {
  2143. ret = dev_err_probe(dev, PTR_ERR(sensor->clk),
  2144. "Failed to get clock\n");
  2145. goto error_ep_free;
  2146. }
  2147. sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
  2148. if (IS_ERR(sensor->reset)) {
  2149. ret = PTR_ERR(sensor->reset);
  2150. dev_err_probe(dev, ret, "Failed to get reset GPIO\n");
  2151. goto error_ep_free;
  2152. }
  2153. sensor->supplies[0].supply = "vddio";
  2154. sensor->supplies[1].supply = "vdd";
  2155. sensor->supplies[2].supply = "vaa";
  2156. ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies),
  2157. sensor->supplies);
  2158. if (ret < 0) {
  2159. dev_err_probe(dev, ret, "Failed to get regulators\n");
  2160. goto error_ep_free;
  2161. }
  2162. ret = mt9m114_clk_init(sensor);
  2163. if (ret)
  2164. goto error_ep_free;
  2165. /*
  2166. * Identify the sensor. The driver supports runtime PM, but needs to
  2167. * work when runtime PM is disabled in the kernel. To that end, power
  2168. * the sensor on manually here to reach the same state as if resumed
  2169. * through runtime PM.
  2170. */
  2171. ret = mt9m114_power_on(sensor);
  2172. if (ret < 0) {
  2173. dev_err_probe(dev, ret, "Could not power on the device\n");
  2174. goto error_ep_free;
  2175. }
  2176. ret = mt9m114_identify(sensor);
  2177. if (ret < 0)
  2178. goto error_power_off;
  2179. /*
  2180. * Enable runtime PM with autosuspend. As the device has been powered
  2181. * manually, mark it as active, and increase the usage count without
  2182. * resuming the device.
  2183. */
  2184. pm_runtime_set_active(dev);
  2185. pm_runtime_get_noresume(dev);
  2186. pm_runtime_enable(dev);
  2187. pm_runtime_set_autosuspend_delay(dev, 1000);
  2188. pm_runtime_use_autosuspend(dev);
  2189. /* Initialize the subdevices. */
  2190. ret = mt9m114_pa_init(sensor);
  2191. if (ret < 0)
  2192. goto error_pm_cleanup;
  2193. ret = mt9m114_ifp_init(sensor);
  2194. if (ret < 0)
  2195. goto error_pa_cleanup;
  2196. ret = v4l2_async_register_subdev(&sensor->ifp.sd);
  2197. if (ret < 0)
  2198. goto error_ifp_cleanup;
  2199. /*
  2200. * Decrease the PM usage count. The device will get suspended after the
  2201. * autosuspend delay, turning the power off.
  2202. */
  2203. pm_runtime_put_autosuspend(dev);
  2204. return 0;
  2205. error_ifp_cleanup:
  2206. mt9m114_ifp_cleanup(sensor);
  2207. error_pa_cleanup:
  2208. mt9m114_pa_cleanup(sensor);
  2209. error_pm_cleanup:
  2210. pm_runtime_disable(dev);
  2211. pm_runtime_put_noidle(dev);
  2212. error_power_off:
  2213. mt9m114_power_off(sensor);
  2214. error_ep_free:
  2215. v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
  2216. return ret;
  2217. }
  2218. static void mt9m114_remove(struct i2c_client *client)
  2219. {
  2220. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  2221. struct mt9m114 *sensor = ifp_to_mt9m114(sd);
  2222. struct device *dev = &client->dev;
  2223. v4l2_async_unregister_subdev(&sensor->ifp.sd);
  2224. mt9m114_ifp_cleanup(sensor);
  2225. mt9m114_pa_cleanup(sensor);
  2226. v4l2_fwnode_endpoint_free(&sensor->bus_cfg);
  2227. /*
  2228. * Disable runtime PM. In case runtime PM is disabled in the kernel,
  2229. * make sure to turn power off manually.
  2230. */
  2231. pm_runtime_disable(dev);
  2232. if (!pm_runtime_status_suspended(dev))
  2233. mt9m114_power_off(sensor);
  2234. pm_runtime_set_suspended(dev);
  2235. }
  2236. static const struct of_device_id mt9m114_of_ids[] = {
  2237. { .compatible = "onnn,mt9m114" },
  2238. { /* sentinel */ },
  2239. };
  2240. MODULE_DEVICE_TABLE(of, mt9m114_of_ids);
  2241. static const struct acpi_device_id mt9m114_acpi_ids[] = {
  2242. { "INT33F0" },
  2243. { /* sentinel */ },
  2244. };
  2245. MODULE_DEVICE_TABLE(acpi, mt9m114_acpi_ids);
  2246. static struct i2c_driver mt9m114_driver = {
  2247. .driver = {
  2248. .name = "mt9m114",
  2249. .pm = &mt9m114_pm_ops,
  2250. .of_match_table = mt9m114_of_ids,
  2251. .acpi_match_table = mt9m114_acpi_ids,
  2252. },
  2253. .probe = mt9m114_probe,
  2254. .remove = mt9m114_remove,
  2255. };
  2256. module_i2c_driver(mt9m114_driver);
  2257. MODULE_DESCRIPTION("onsemi MT9M114 Sensor Driver");
  2258. MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>");
  2259. MODULE_LICENSE("GPL");