panel-simple.c 135 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455
  1. /*
  2. * Copyright (C) 2013, NVIDIA Corporation. All rights reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sub license,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the
  12. * next paragraph) shall be included in all copies or substantial portions
  13. * of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <linux/delay.h>
  24. #include <linux/gpio/consumer.h>
  25. #include <linux/i2c.h>
  26. #include <linux/media-bus-format.h>
  27. #include <linux/module.h>
  28. #include <linux/of_platform.h>
  29. #include <linux/platform_device.h>
  30. #include <linux/pm_runtime.h>
  31. #include <linux/regulator/consumer.h>
  32. #include <video/display_timing.h>
  33. #include <video/of_display_timing.h>
  34. #include <video/videomode.h>
  35. #include <drm/drm_crtc.h>
  36. #include <drm/drm_device.h>
  37. #include <drm/drm_edid.h>
  38. #include <drm/drm_mipi_dsi.h>
  39. #include <drm/drm_panel.h>
  40. #include <drm/drm_of.h>
  41. /**
  42. * struct panel_desc - Describes a simple panel.
  43. */
  44. struct panel_desc {
  45. /**
  46. * @modes: Pointer to array of fixed modes appropriate for this panel.
  47. *
  48. * If only one mode then this can just be the address of the mode.
  49. * NOTE: cannot be used with "timings" and also if this is specified
  50. * then you cannot override the mode in the device tree.
  51. */
  52. const struct drm_display_mode *modes;
  53. /** @num_modes: Number of elements in modes array. */
  54. unsigned int num_modes;
  55. /**
  56. * @timings: Pointer to array of display timings
  57. *
  58. * NOTE: cannot be used with "modes" and also these will be used to
  59. * validate a device tree override if one is present.
  60. */
  61. const struct display_timing *timings;
  62. /** @num_timings: Number of elements in timings array. */
  63. unsigned int num_timings;
  64. /** @bpc: Bits per color. */
  65. unsigned int bpc;
  66. /** @size: Structure containing the physical size of this panel. */
  67. struct {
  68. /**
  69. * @size.width: Width (in mm) of the active display area.
  70. */
  71. unsigned int width;
  72. /**
  73. * @size.height: Height (in mm) of the active display area.
  74. */
  75. unsigned int height;
  76. } size;
  77. /** @delay: Structure containing various delay values for this panel. */
  78. struct {
  79. /**
  80. * @delay.prepare: Time for the panel to become ready.
  81. *
  82. * The time (in milliseconds) that it takes for the panel to
  83. * become ready and start receiving video data
  84. */
  85. unsigned int prepare;
  86. /**
  87. * @delay.enable: Time for the panel to display a valid frame.
  88. *
  89. * The time (in milliseconds) that it takes for the panel to
  90. * display the first valid frame after starting to receive
  91. * video data.
  92. */
  93. unsigned int enable;
  94. /**
  95. * @delay.disable: Time for the panel to turn the display off.
  96. *
  97. * The time (in milliseconds) that it takes for the panel to
  98. * turn the display off (no content is visible).
  99. */
  100. unsigned int disable;
  101. /**
  102. * @delay.unprepare: Time to power down completely.
  103. *
  104. * The time (in milliseconds) that it takes for the panel
  105. * to power itself down completely.
  106. *
  107. * This time is used to prevent a future "prepare" from
  108. * starting until at least this many milliseconds has passed.
  109. * If at prepare time less time has passed since unprepare
  110. * finished, the driver waits for the remaining time.
  111. */
  112. unsigned int unprepare;
  113. } delay;
  114. /** @bus_format: See MEDIA_BUS_FMT_... defines. */
  115. u32 bus_format;
  116. /** @bus_flags: See DRM_BUS_FLAG_... defines. */
  117. u32 bus_flags;
  118. /** @connector_type: LVDS, eDP, DSI, DPI, etc. */
  119. int connector_type;
  120. };
  121. struct panel_simple {
  122. struct drm_panel base;
  123. ktime_t unprepared_time;
  124. const struct panel_desc *desc;
  125. struct regulator *supply;
  126. struct i2c_adapter *ddc;
  127. struct gpio_desc *enable_gpio;
  128. const struct drm_edid *drm_edid;
  129. struct drm_display_mode override_mode;
  130. enum drm_panel_orientation orientation;
  131. };
  132. static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
  133. {
  134. return container_of(panel, struct panel_simple, base);
  135. }
  136. static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
  137. struct drm_connector *connector)
  138. {
  139. struct drm_display_mode *mode;
  140. unsigned int i, num = 0;
  141. for (i = 0; i < panel->desc->num_timings; i++) {
  142. const struct display_timing *dt = &panel->desc->timings[i];
  143. struct videomode vm;
  144. videomode_from_timing(dt, &vm);
  145. mode = drm_mode_create(connector->dev);
  146. if (!mode) {
  147. dev_err(panel->base.dev, "failed to add mode %ux%u\n",
  148. dt->hactive.typ, dt->vactive.typ);
  149. continue;
  150. }
  151. drm_display_mode_from_videomode(&vm, mode);
  152. mode->type |= DRM_MODE_TYPE_DRIVER;
  153. if (panel->desc->num_timings == 1)
  154. mode->type |= DRM_MODE_TYPE_PREFERRED;
  155. drm_mode_probed_add(connector, mode);
  156. num++;
  157. }
  158. return num;
  159. }
  160. static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
  161. struct drm_connector *connector)
  162. {
  163. struct drm_display_mode *mode;
  164. unsigned int i, num = 0;
  165. for (i = 0; i < panel->desc->num_modes; i++) {
  166. const struct drm_display_mode *m = &panel->desc->modes[i];
  167. mode = drm_mode_duplicate(connector->dev, m);
  168. if (!mode) {
  169. dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n",
  170. m->hdisplay, m->vdisplay,
  171. drm_mode_vrefresh(m));
  172. continue;
  173. }
  174. mode->type |= DRM_MODE_TYPE_DRIVER;
  175. if (panel->desc->num_modes == 1)
  176. mode->type |= DRM_MODE_TYPE_PREFERRED;
  177. drm_mode_set_name(mode);
  178. drm_mode_probed_add(connector, mode);
  179. num++;
  180. }
  181. return num;
  182. }
  183. static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
  184. struct drm_connector *connector)
  185. {
  186. struct drm_display_mode *mode;
  187. bool has_override = panel->override_mode.type;
  188. unsigned int num = 0;
  189. if (!panel->desc)
  190. return 0;
  191. if (has_override) {
  192. mode = drm_mode_duplicate(connector->dev,
  193. &panel->override_mode);
  194. if (mode) {
  195. drm_mode_probed_add(connector, mode);
  196. num = 1;
  197. } else {
  198. dev_err(panel->base.dev, "failed to add override mode\n");
  199. }
  200. }
  201. /* Only add timings if override was not there or failed to validate */
  202. if (num == 0 && panel->desc->num_timings)
  203. num = panel_simple_get_timings_modes(panel, connector);
  204. /*
  205. * Only add fixed modes if timings/override added no mode.
  206. *
  207. * We should only ever have either the display timings specified
  208. * or a fixed mode. Anything else is rather bogus.
  209. */
  210. WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
  211. if (num == 0)
  212. num = panel_simple_get_display_modes(panel, connector);
  213. connector->display_info.bpc = panel->desc->bpc;
  214. connector->display_info.width_mm = panel->desc->size.width;
  215. connector->display_info.height_mm = panel->desc->size.height;
  216. if (panel->desc->bus_format)
  217. drm_display_info_set_bus_formats(&connector->display_info,
  218. &panel->desc->bus_format, 1);
  219. connector->display_info.bus_flags = panel->desc->bus_flags;
  220. return num;
  221. }
  222. static void panel_simple_wait(ktime_t start_ktime, unsigned int min_ms)
  223. {
  224. ktime_t now_ktime, min_ktime;
  225. if (!min_ms)
  226. return;
  227. min_ktime = ktime_add(start_ktime, ms_to_ktime(min_ms));
  228. now_ktime = ktime_get_boottime();
  229. if (ktime_before(now_ktime, min_ktime))
  230. msleep(ktime_to_ms(ktime_sub(min_ktime, now_ktime)) + 1);
  231. }
  232. static int panel_simple_disable(struct drm_panel *panel)
  233. {
  234. struct panel_simple *p = to_panel_simple(panel);
  235. if (p->desc->delay.disable)
  236. msleep(p->desc->delay.disable);
  237. return 0;
  238. }
  239. static int panel_simple_suspend(struct device *dev)
  240. {
  241. struct panel_simple *p = dev_get_drvdata(dev);
  242. gpiod_set_value_cansleep(p->enable_gpio, 0);
  243. regulator_disable(p->supply);
  244. p->unprepared_time = ktime_get_boottime();
  245. drm_edid_free(p->drm_edid);
  246. p->drm_edid = NULL;
  247. return 0;
  248. }
  249. static int panel_simple_unprepare(struct drm_panel *panel)
  250. {
  251. int ret;
  252. pm_runtime_mark_last_busy(panel->dev);
  253. ret = pm_runtime_put_autosuspend(panel->dev);
  254. if (ret < 0)
  255. return ret;
  256. return 0;
  257. }
  258. static int panel_simple_resume(struct device *dev)
  259. {
  260. struct panel_simple *p = dev_get_drvdata(dev);
  261. int err;
  262. panel_simple_wait(p->unprepared_time, p->desc->delay.unprepare);
  263. err = regulator_enable(p->supply);
  264. if (err < 0) {
  265. dev_err(dev, "failed to enable supply: %d\n", err);
  266. return err;
  267. }
  268. gpiod_set_value_cansleep(p->enable_gpio, 1);
  269. if (p->desc->delay.prepare)
  270. msleep(p->desc->delay.prepare);
  271. return 0;
  272. }
  273. static int panel_simple_prepare(struct drm_panel *panel)
  274. {
  275. int ret;
  276. ret = pm_runtime_get_sync(panel->dev);
  277. if (ret < 0) {
  278. pm_runtime_put_autosuspend(panel->dev);
  279. return ret;
  280. }
  281. return 0;
  282. }
  283. static int panel_simple_enable(struct drm_panel *panel)
  284. {
  285. struct panel_simple *p = to_panel_simple(panel);
  286. if (p->desc->delay.enable)
  287. msleep(p->desc->delay.enable);
  288. return 0;
  289. }
  290. static int panel_simple_get_modes(struct drm_panel *panel,
  291. struct drm_connector *connector)
  292. {
  293. struct panel_simple *p = to_panel_simple(panel);
  294. int num = 0;
  295. /* probe EDID if a DDC bus is available */
  296. if (p->ddc) {
  297. pm_runtime_get_sync(panel->dev);
  298. if (!p->drm_edid)
  299. p->drm_edid = drm_edid_read_ddc(connector, p->ddc);
  300. drm_edid_connector_update(connector, p->drm_edid);
  301. num += drm_edid_connector_add_modes(connector);
  302. pm_runtime_mark_last_busy(panel->dev);
  303. pm_runtime_put_autosuspend(panel->dev);
  304. }
  305. /* add hard-coded panel modes */
  306. num += panel_simple_get_non_edid_modes(p, connector);
  307. /*
  308. * TODO: Remove once all drm drivers call
  309. * drm_connector_set_orientation_from_panel()
  310. */
  311. drm_connector_set_panel_orientation(connector, p->orientation);
  312. return num;
  313. }
  314. static int panel_simple_get_timings(struct drm_panel *panel,
  315. unsigned int num_timings,
  316. struct display_timing *timings)
  317. {
  318. struct panel_simple *p = to_panel_simple(panel);
  319. unsigned int i;
  320. if (p->desc->num_timings < num_timings)
  321. num_timings = p->desc->num_timings;
  322. if (timings)
  323. for (i = 0; i < num_timings; i++)
  324. timings[i] = p->desc->timings[i];
  325. return p->desc->num_timings;
  326. }
  327. static enum drm_panel_orientation panel_simple_get_orientation(struct drm_panel *panel)
  328. {
  329. struct panel_simple *p = to_panel_simple(panel);
  330. return p->orientation;
  331. }
  332. static const struct drm_panel_funcs panel_simple_funcs = {
  333. .disable = panel_simple_disable,
  334. .unprepare = panel_simple_unprepare,
  335. .prepare = panel_simple_prepare,
  336. .enable = panel_simple_enable,
  337. .get_modes = panel_simple_get_modes,
  338. .get_orientation = panel_simple_get_orientation,
  339. .get_timings = panel_simple_get_timings,
  340. };
  341. static struct panel_desc panel_dpi;
  342. static int panel_dpi_probe(struct device *dev,
  343. struct panel_simple *panel)
  344. {
  345. struct display_timing *timing;
  346. const struct device_node *np;
  347. struct panel_desc *desc;
  348. unsigned int bus_flags;
  349. struct videomode vm;
  350. int ret;
  351. np = dev->of_node;
  352. desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
  353. if (!desc)
  354. return -ENOMEM;
  355. timing = devm_kzalloc(dev, sizeof(*timing), GFP_KERNEL);
  356. if (!timing)
  357. return -ENOMEM;
  358. ret = of_get_display_timing(np, "panel-timing", timing);
  359. if (ret < 0) {
  360. dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n",
  361. np);
  362. return ret;
  363. }
  364. desc->timings = timing;
  365. desc->num_timings = 1;
  366. of_property_read_u32(np, "width-mm", &desc->size.width);
  367. of_property_read_u32(np, "height-mm", &desc->size.height);
  368. /* Extract bus_flags from display_timing */
  369. bus_flags = 0;
  370. vm.flags = timing->flags;
  371. drm_bus_flags_from_videomode(&vm, &bus_flags);
  372. desc->bus_flags = bus_flags;
  373. /* We do not know the connector for the DT node, so guess it */
  374. desc->connector_type = DRM_MODE_CONNECTOR_DPI;
  375. panel->desc = desc;
  376. return 0;
  377. }
  378. #define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \
  379. (to_check->field.typ >= bounds->field.min && \
  380. to_check->field.typ <= bounds->field.max)
  381. static void panel_simple_parse_panel_timing_node(struct device *dev,
  382. struct panel_simple *panel,
  383. const struct display_timing *ot)
  384. {
  385. const struct panel_desc *desc = panel->desc;
  386. struct videomode vm;
  387. unsigned int i;
  388. if (WARN_ON(desc->num_modes)) {
  389. dev_err(dev, "Reject override mode: panel has a fixed mode\n");
  390. return;
  391. }
  392. if (WARN_ON(!desc->num_timings)) {
  393. dev_err(dev, "Reject override mode: no timings specified\n");
  394. return;
  395. }
  396. for (i = 0; i < panel->desc->num_timings; i++) {
  397. const struct display_timing *dt = &panel->desc->timings[i];
  398. if (!PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hactive) ||
  399. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hfront_porch) ||
  400. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hback_porch) ||
  401. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hsync_len) ||
  402. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vactive) ||
  403. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vfront_porch) ||
  404. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vback_porch) ||
  405. !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vsync_len))
  406. continue;
  407. if (ot->flags != dt->flags)
  408. continue;
  409. videomode_from_timing(ot, &vm);
  410. drm_display_mode_from_videomode(&vm, &panel->override_mode);
  411. panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
  412. DRM_MODE_TYPE_PREFERRED;
  413. break;
  414. }
  415. if (WARN_ON(!panel->override_mode.type))
  416. dev_err(dev, "Reject override mode: No display_timing found\n");
  417. }
  418. static int panel_simple_override_nondefault_lvds_datamapping(struct device *dev,
  419. struct panel_simple *panel)
  420. {
  421. int ret, bpc;
  422. ret = drm_of_lvds_get_data_mapping(dev->of_node);
  423. if (ret < 0) {
  424. if (ret == -EINVAL)
  425. dev_warn(dev, "Ignore invalid data-mapping property\n");
  426. /*
  427. * Ignore non-existing or malformatted property, fallback to
  428. * default data-mapping, and return 0.
  429. */
  430. return 0;
  431. }
  432. switch (ret) {
  433. default:
  434. WARN_ON(1);
  435. fallthrough;
  436. case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
  437. fallthrough;
  438. case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
  439. bpc = 8;
  440. break;
  441. case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
  442. bpc = 6;
  443. }
  444. if (panel->desc->bpc != bpc || panel->desc->bus_format != ret) {
  445. struct panel_desc *override_desc;
  446. override_desc = devm_kmemdup(dev, panel->desc, sizeof(*panel->desc), GFP_KERNEL);
  447. if (!override_desc)
  448. return -ENOMEM;
  449. override_desc->bus_format = ret;
  450. override_desc->bpc = bpc;
  451. panel->desc = override_desc;
  452. }
  453. return 0;
  454. }
  455. static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
  456. {
  457. struct panel_simple *panel;
  458. struct display_timing dt;
  459. struct device_node *ddc;
  460. int connector_type;
  461. u32 bus_flags;
  462. int err;
  463. panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
  464. if (!panel)
  465. return -ENOMEM;
  466. panel->desc = desc;
  467. panel->supply = devm_regulator_get(dev, "power");
  468. if (IS_ERR(panel->supply))
  469. return PTR_ERR(panel->supply);
  470. panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
  471. GPIOD_OUT_LOW);
  472. if (IS_ERR(panel->enable_gpio))
  473. return dev_err_probe(dev, PTR_ERR(panel->enable_gpio),
  474. "failed to request GPIO\n");
  475. err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
  476. if (err) {
  477. dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
  478. return err;
  479. }
  480. ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
  481. if (ddc) {
  482. panel->ddc = of_find_i2c_adapter_by_node(ddc);
  483. of_node_put(ddc);
  484. if (!panel->ddc)
  485. return -EPROBE_DEFER;
  486. }
  487. if (desc == &panel_dpi) {
  488. /* Handle the generic panel-dpi binding */
  489. err = panel_dpi_probe(dev, panel);
  490. if (err)
  491. goto free_ddc;
  492. desc = panel->desc;
  493. } else {
  494. if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
  495. panel_simple_parse_panel_timing_node(dev, panel, &dt);
  496. }
  497. if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
  498. /* Optional data-mapping property for overriding bus format */
  499. err = panel_simple_override_nondefault_lvds_datamapping(dev, panel);
  500. if (err)
  501. goto free_ddc;
  502. }
  503. connector_type = desc->connector_type;
  504. /* Catch common mistakes for panels. */
  505. switch (connector_type) {
  506. case 0:
  507. dev_warn(dev, "Specify missing connector_type\n");
  508. connector_type = DRM_MODE_CONNECTOR_DPI;
  509. break;
  510. case DRM_MODE_CONNECTOR_LVDS:
  511. WARN_ON(desc->bus_flags &
  512. ~(DRM_BUS_FLAG_DE_LOW |
  513. DRM_BUS_FLAG_DE_HIGH |
  514. DRM_BUS_FLAG_DATA_MSB_TO_LSB |
  515. DRM_BUS_FLAG_DATA_LSB_TO_MSB));
  516. WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
  517. desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG &&
  518. desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA);
  519. WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
  520. desc->bpc != 6);
  521. WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG ||
  522. desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) &&
  523. desc->bpc != 8);
  524. break;
  525. case DRM_MODE_CONNECTOR_eDP:
  526. dev_warn(dev, "eDP panels moved to panel-edp\n");
  527. err = -EINVAL;
  528. goto free_ddc;
  529. case DRM_MODE_CONNECTOR_DSI:
  530. if (desc->bpc != 6 && desc->bpc != 8)
  531. dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
  532. break;
  533. case DRM_MODE_CONNECTOR_DPI:
  534. bus_flags = DRM_BUS_FLAG_DE_LOW |
  535. DRM_BUS_FLAG_DE_HIGH |
  536. DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE |
  537. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  538. DRM_BUS_FLAG_DATA_MSB_TO_LSB |
  539. DRM_BUS_FLAG_DATA_LSB_TO_MSB |
  540. DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE |
  541. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE;
  542. if (desc->bus_flags & ~bus_flags)
  543. dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags);
  544. if (!(desc->bus_flags & bus_flags))
  545. dev_warn(dev, "Specify missing bus_flags\n");
  546. if (desc->bus_format == 0)
  547. dev_warn(dev, "Specify missing bus_format\n");
  548. if (desc->bpc != 6 && desc->bpc != 8)
  549. dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
  550. break;
  551. default:
  552. dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type);
  553. connector_type = DRM_MODE_CONNECTOR_DPI;
  554. break;
  555. }
  556. dev_set_drvdata(dev, panel);
  557. /*
  558. * We use runtime PM for prepare / unprepare since those power the panel
  559. * on and off and those can be very slow operations. This is important
  560. * to optimize powering the panel on briefly to read the EDID before
  561. * fully enabling the panel.
  562. */
  563. pm_runtime_enable(dev);
  564. pm_runtime_set_autosuspend_delay(dev, 1000);
  565. pm_runtime_use_autosuspend(dev);
  566. drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type);
  567. err = drm_panel_of_backlight(&panel->base);
  568. if (err) {
  569. dev_err_probe(dev, err, "Could not find backlight\n");
  570. goto disable_pm_runtime;
  571. }
  572. drm_panel_add(&panel->base);
  573. return 0;
  574. disable_pm_runtime:
  575. pm_runtime_dont_use_autosuspend(dev);
  576. pm_runtime_disable(dev);
  577. free_ddc:
  578. if (panel->ddc)
  579. put_device(&panel->ddc->dev);
  580. return err;
  581. }
  582. static void panel_simple_shutdown(struct device *dev)
  583. {
  584. struct panel_simple *panel = dev_get_drvdata(dev);
  585. /*
  586. * NOTE: the following two calls don't really belong here. It is the
  587. * responsibility of a correctly written DRM modeset driver to call
  588. * drm_atomic_helper_shutdown() at shutdown time and that should
  589. * cause the panel to be disabled / unprepared if needed. For now,
  590. * however, we'll keep these calls due to the sheer number of
  591. * different DRM modeset drivers used with panel-simple. Once we've
  592. * confirmed that all DRM modeset drivers using this panel properly
  593. * call drm_atomic_helper_shutdown() we can simply delete the two
  594. * calls below.
  595. *
  596. * TO BE EXPLICIT: THE CALLS BELOW SHOULDN'T BE COPIED TO ANY NEW
  597. * PANEL DRIVERS.
  598. *
  599. * FIXME: If we're still haven't figured out if all DRM modeset
  600. * drivers properly call drm_atomic_helper_shutdown() but we _have_
  601. * managed to make sure that DRM modeset drivers get their shutdown()
  602. * callback before the panel's shutdown() callback (perhaps using
  603. * device link), we could add a WARN_ON here to help move forward.
  604. */
  605. if (panel->base.enabled)
  606. drm_panel_disable(&panel->base);
  607. if (panel->base.prepared)
  608. drm_panel_unprepare(&panel->base);
  609. }
  610. static void panel_simple_remove(struct device *dev)
  611. {
  612. struct panel_simple *panel = dev_get_drvdata(dev);
  613. drm_panel_remove(&panel->base);
  614. panel_simple_shutdown(dev);
  615. pm_runtime_dont_use_autosuspend(dev);
  616. pm_runtime_disable(dev);
  617. if (panel->ddc)
  618. put_device(&panel->ddc->dev);
  619. }
  620. static const struct drm_display_mode ampire_am_1280800n3tzqw_t00h_mode = {
  621. .clock = 71100,
  622. .hdisplay = 1280,
  623. .hsync_start = 1280 + 40,
  624. .hsync_end = 1280 + 40 + 80,
  625. .htotal = 1280 + 40 + 80 + 40,
  626. .vdisplay = 800,
  627. .vsync_start = 800 + 3,
  628. .vsync_end = 800 + 3 + 10,
  629. .vtotal = 800 + 3 + 10 + 10,
  630. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  631. };
  632. static const struct panel_desc ampire_am_1280800n3tzqw_t00h = {
  633. .modes = &ampire_am_1280800n3tzqw_t00h_mode,
  634. .num_modes = 1,
  635. .bpc = 8,
  636. .size = {
  637. .width = 217,
  638. .height = 136,
  639. },
  640. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  641. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  642. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  643. };
  644. static const struct drm_display_mode ampire_am_480272h3tmqw_t01h_mode = {
  645. .clock = 9000,
  646. .hdisplay = 480,
  647. .hsync_start = 480 + 2,
  648. .hsync_end = 480 + 2 + 41,
  649. .htotal = 480 + 2 + 41 + 2,
  650. .vdisplay = 272,
  651. .vsync_start = 272 + 2,
  652. .vsync_end = 272 + 2 + 10,
  653. .vtotal = 272 + 2 + 10 + 2,
  654. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  655. };
  656. static const struct panel_desc ampire_am_480272h3tmqw_t01h = {
  657. .modes = &ampire_am_480272h3tmqw_t01h_mode,
  658. .num_modes = 1,
  659. .bpc = 8,
  660. .size = {
  661. .width = 99,
  662. .height = 58,
  663. },
  664. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  665. };
  666. static const struct drm_display_mode ampire_am800480r3tmqwa1h_mode = {
  667. .clock = 33333,
  668. .hdisplay = 800,
  669. .hsync_start = 800 + 0,
  670. .hsync_end = 800 + 0 + 255,
  671. .htotal = 800 + 0 + 255 + 0,
  672. .vdisplay = 480,
  673. .vsync_start = 480 + 2,
  674. .vsync_end = 480 + 2 + 45,
  675. .vtotal = 480 + 2 + 45 + 0,
  676. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  677. };
  678. static const struct display_timing ampire_am_800480l1tmqw_t00h_timing = {
  679. .pixelclock = { 29930000, 33260000, 36590000 },
  680. .hactive = { 800, 800, 800 },
  681. .hfront_porch = { 1, 40, 168 },
  682. .hback_porch = { 88, 88, 88 },
  683. .hsync_len = { 1, 128, 128 },
  684. .vactive = { 480, 480, 480 },
  685. .vfront_porch = { 1, 35, 37 },
  686. .vback_porch = { 8, 8, 8 },
  687. .vsync_len = { 1, 2, 2 },
  688. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  689. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  690. DISPLAY_FLAGS_SYNC_POSEDGE,
  691. };
  692. static const struct panel_desc ampire_am_800480l1tmqw_t00h = {
  693. .timings = &ampire_am_800480l1tmqw_t00h_timing,
  694. .num_timings = 1,
  695. .bpc = 8,
  696. .size = {
  697. .width = 111,
  698. .height = 67,
  699. },
  700. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  701. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  702. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  703. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  704. .connector_type = DRM_MODE_CONNECTOR_DPI,
  705. };
  706. static const struct panel_desc ampire_am800480r3tmqwa1h = {
  707. .modes = &ampire_am800480r3tmqwa1h_mode,
  708. .num_modes = 1,
  709. .bpc = 6,
  710. .size = {
  711. .width = 152,
  712. .height = 91,
  713. },
  714. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  715. };
  716. static const struct display_timing ampire_am800600p5tmqw_tb8h_timing = {
  717. .pixelclock = { 34500000, 39600000, 50400000 },
  718. .hactive = { 800, 800, 800 },
  719. .hfront_porch = { 12, 112, 312 },
  720. .hback_porch = { 87, 87, 48 },
  721. .hsync_len = { 1, 1, 40 },
  722. .vactive = { 600, 600, 600 },
  723. .vfront_porch = { 1, 21, 61 },
  724. .vback_porch = { 38, 38, 19 },
  725. .vsync_len = { 1, 1, 20 },
  726. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  727. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  728. DISPLAY_FLAGS_SYNC_POSEDGE,
  729. };
  730. static const struct panel_desc ampire_am800600p5tmqwtb8h = {
  731. .timings = &ampire_am800600p5tmqw_tb8h_timing,
  732. .num_timings = 1,
  733. .bpc = 6,
  734. .size = {
  735. .width = 162,
  736. .height = 122,
  737. },
  738. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  739. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  740. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  741. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  742. .connector_type = DRM_MODE_CONNECTOR_DPI,
  743. };
  744. static const struct display_timing santek_st0700i5y_rbslw_f_timing = {
  745. .pixelclock = { 26400000, 33300000, 46800000 },
  746. .hactive = { 800, 800, 800 },
  747. .hfront_porch = { 16, 210, 354 },
  748. .hback_porch = { 45, 36, 6 },
  749. .hsync_len = { 1, 10, 40 },
  750. .vactive = { 480, 480, 480 },
  751. .vfront_porch = { 7, 22, 147 },
  752. .vback_porch = { 22, 13, 3 },
  753. .vsync_len = { 1, 10, 20 },
  754. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  755. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
  756. };
  757. static const struct panel_desc armadeus_st0700_adapt = {
  758. .timings = &santek_st0700i5y_rbslw_f_timing,
  759. .num_timings = 1,
  760. .bpc = 6,
  761. .size = {
  762. .width = 154,
  763. .height = 86,
  764. },
  765. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  766. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  767. };
  768. static const struct drm_display_mode auo_b101aw03_mode = {
  769. .clock = 51450,
  770. .hdisplay = 1024,
  771. .hsync_start = 1024 + 156,
  772. .hsync_end = 1024 + 156 + 8,
  773. .htotal = 1024 + 156 + 8 + 156,
  774. .vdisplay = 600,
  775. .vsync_start = 600 + 16,
  776. .vsync_end = 600 + 16 + 6,
  777. .vtotal = 600 + 16 + 6 + 16,
  778. };
  779. static const struct panel_desc auo_b101aw03 = {
  780. .modes = &auo_b101aw03_mode,
  781. .num_modes = 1,
  782. .bpc = 6,
  783. .size = {
  784. .width = 223,
  785. .height = 125,
  786. },
  787. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  788. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  789. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  790. };
  791. static const struct drm_display_mode auo_b101xtn01_mode = {
  792. .clock = 72000,
  793. .hdisplay = 1366,
  794. .hsync_start = 1366 + 20,
  795. .hsync_end = 1366 + 20 + 70,
  796. .htotal = 1366 + 20 + 70,
  797. .vdisplay = 768,
  798. .vsync_start = 768 + 14,
  799. .vsync_end = 768 + 14 + 42,
  800. .vtotal = 768 + 14 + 42,
  801. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  802. };
  803. static const struct panel_desc auo_b101xtn01 = {
  804. .modes = &auo_b101xtn01_mode,
  805. .num_modes = 1,
  806. .bpc = 6,
  807. .size = {
  808. .width = 223,
  809. .height = 125,
  810. },
  811. };
  812. static const struct drm_display_mode auo_b116xw03_mode = {
  813. .clock = 70589,
  814. .hdisplay = 1366,
  815. .hsync_start = 1366 + 40,
  816. .hsync_end = 1366 + 40 + 40,
  817. .htotal = 1366 + 40 + 40 + 32,
  818. .vdisplay = 768,
  819. .vsync_start = 768 + 10,
  820. .vsync_end = 768 + 10 + 12,
  821. .vtotal = 768 + 10 + 12 + 6,
  822. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  823. };
  824. static const struct panel_desc auo_b116xw03 = {
  825. .modes = &auo_b116xw03_mode,
  826. .num_modes = 1,
  827. .bpc = 6,
  828. .size = {
  829. .width = 256,
  830. .height = 144,
  831. },
  832. .delay = {
  833. .prepare = 1,
  834. .enable = 200,
  835. .disable = 200,
  836. .unprepare = 500,
  837. },
  838. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  839. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  840. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  841. };
  842. static const struct display_timing auo_g070vvn01_timings = {
  843. .pixelclock = { 33300000, 34209000, 45000000 },
  844. .hactive = { 800, 800, 800 },
  845. .hfront_porch = { 20, 40, 200 },
  846. .hback_porch = { 87, 40, 1 },
  847. .hsync_len = { 1, 48, 87 },
  848. .vactive = { 480, 480, 480 },
  849. .vfront_porch = { 5, 13, 200 },
  850. .vback_porch = { 31, 31, 29 },
  851. .vsync_len = { 1, 1, 3 },
  852. };
  853. static const struct panel_desc auo_g070vvn01 = {
  854. .timings = &auo_g070vvn01_timings,
  855. .num_timings = 1,
  856. .bpc = 8,
  857. .size = {
  858. .width = 152,
  859. .height = 91,
  860. },
  861. .delay = {
  862. .prepare = 200,
  863. .enable = 50,
  864. .disable = 50,
  865. .unprepare = 1000,
  866. },
  867. };
  868. static const struct display_timing auo_g101evn010_timing = {
  869. .pixelclock = { 64000000, 68930000, 85000000 },
  870. .hactive = { 1280, 1280, 1280 },
  871. .hfront_porch = { 8, 64, 256 },
  872. .hback_porch = { 8, 64, 256 },
  873. .hsync_len = { 40, 168, 767 },
  874. .vactive = { 800, 800, 800 },
  875. .vfront_porch = { 4, 8, 100 },
  876. .vback_porch = { 4, 8, 100 },
  877. .vsync_len = { 8, 16, 223 },
  878. };
  879. static const struct panel_desc auo_g101evn010 = {
  880. .timings = &auo_g101evn010_timing,
  881. .num_timings = 1,
  882. .bpc = 6,
  883. .size = {
  884. .width = 216,
  885. .height = 135,
  886. },
  887. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  888. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  889. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  890. };
  891. static const struct drm_display_mode auo_g104sn02_mode = {
  892. .clock = 40000,
  893. .hdisplay = 800,
  894. .hsync_start = 800 + 40,
  895. .hsync_end = 800 + 40 + 216,
  896. .htotal = 800 + 40 + 216 + 128,
  897. .vdisplay = 600,
  898. .vsync_start = 600 + 10,
  899. .vsync_end = 600 + 10 + 35,
  900. .vtotal = 600 + 10 + 35 + 2,
  901. };
  902. static const struct panel_desc auo_g104sn02 = {
  903. .modes = &auo_g104sn02_mode,
  904. .num_modes = 1,
  905. .bpc = 8,
  906. .size = {
  907. .width = 211,
  908. .height = 158,
  909. },
  910. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  911. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  912. };
  913. static const struct drm_display_mode auo_g104stn01_mode = {
  914. .clock = 40000,
  915. .hdisplay = 800,
  916. .hsync_start = 800 + 40,
  917. .hsync_end = 800 + 40 + 88,
  918. .htotal = 800 + 40 + 88 + 128,
  919. .vdisplay = 600,
  920. .vsync_start = 600 + 1,
  921. .vsync_end = 600 + 1 + 23,
  922. .vtotal = 600 + 1 + 23 + 4,
  923. };
  924. static const struct panel_desc auo_g104stn01 = {
  925. .modes = &auo_g104stn01_mode,
  926. .num_modes = 1,
  927. .bpc = 8,
  928. .size = {
  929. .width = 211,
  930. .height = 158,
  931. },
  932. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  933. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  934. };
  935. static const struct display_timing auo_g121ean01_timing = {
  936. .pixelclock = { 60000000, 74400000, 90000000 },
  937. .hactive = { 1280, 1280, 1280 },
  938. .hfront_porch = { 20, 50, 100 },
  939. .hback_porch = { 20, 50, 100 },
  940. .hsync_len = { 30, 100, 200 },
  941. .vactive = { 800, 800, 800 },
  942. .vfront_porch = { 2, 10, 25 },
  943. .vback_porch = { 2, 10, 25 },
  944. .vsync_len = { 4, 18, 50 },
  945. };
  946. static const struct panel_desc auo_g121ean01 = {
  947. .timings = &auo_g121ean01_timing,
  948. .num_timings = 1,
  949. .bpc = 8,
  950. .size = {
  951. .width = 261,
  952. .height = 163,
  953. },
  954. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  955. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  956. };
  957. static const struct display_timing auo_g133han01_timings = {
  958. .pixelclock = { 134000000, 141200000, 149000000 },
  959. .hactive = { 1920, 1920, 1920 },
  960. .hfront_porch = { 39, 58, 77 },
  961. .hback_porch = { 59, 88, 117 },
  962. .hsync_len = { 28, 42, 56 },
  963. .vactive = { 1080, 1080, 1080 },
  964. .vfront_porch = { 3, 8, 11 },
  965. .vback_porch = { 5, 14, 19 },
  966. .vsync_len = { 4, 14, 19 },
  967. };
  968. static const struct panel_desc auo_g133han01 = {
  969. .timings = &auo_g133han01_timings,
  970. .num_timings = 1,
  971. .bpc = 8,
  972. .size = {
  973. .width = 293,
  974. .height = 165,
  975. },
  976. .delay = {
  977. .prepare = 200,
  978. .enable = 50,
  979. .disable = 50,
  980. .unprepare = 1000,
  981. },
  982. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  983. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  984. };
  985. static const struct display_timing auo_g156han04_timings = {
  986. .pixelclock = { 137000000, 141000000, 146000000 },
  987. .hactive = { 1920, 1920, 1920 },
  988. .hfront_porch = { 60, 60, 60 },
  989. .hback_porch = { 90, 92, 111 },
  990. .hsync_len = { 32, 32, 32 },
  991. .vactive = { 1080, 1080, 1080 },
  992. .vfront_porch = { 12, 12, 12 },
  993. .vback_porch = { 24, 36, 56 },
  994. .vsync_len = { 8, 8, 8 },
  995. };
  996. static const struct panel_desc auo_g156han04 = {
  997. .timings = &auo_g156han04_timings,
  998. .num_timings = 1,
  999. .bpc = 8,
  1000. .size = {
  1001. .width = 344,
  1002. .height = 194,
  1003. },
  1004. .delay = {
  1005. .prepare = 50, /* T2 */
  1006. .enable = 200, /* T3 */
  1007. .disable = 110, /* T10 */
  1008. .unprepare = 1000, /* T13 */
  1009. },
  1010. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1011. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1012. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1013. };
  1014. static const struct drm_display_mode auo_g156xtn01_mode = {
  1015. .clock = 76000,
  1016. .hdisplay = 1366,
  1017. .hsync_start = 1366 + 33,
  1018. .hsync_end = 1366 + 33 + 67,
  1019. .htotal = 1560,
  1020. .vdisplay = 768,
  1021. .vsync_start = 768 + 4,
  1022. .vsync_end = 768 + 4 + 4,
  1023. .vtotal = 806,
  1024. };
  1025. static const struct panel_desc auo_g156xtn01 = {
  1026. .modes = &auo_g156xtn01_mode,
  1027. .num_modes = 1,
  1028. .bpc = 8,
  1029. .size = {
  1030. .width = 344,
  1031. .height = 194,
  1032. },
  1033. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1034. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1035. };
  1036. static const struct display_timing auo_g185han01_timings = {
  1037. .pixelclock = { 120000000, 144000000, 175000000 },
  1038. .hactive = { 1920, 1920, 1920 },
  1039. .hfront_porch = { 36, 120, 148 },
  1040. .hback_porch = { 24, 88, 108 },
  1041. .hsync_len = { 20, 48, 64 },
  1042. .vactive = { 1080, 1080, 1080 },
  1043. .vfront_porch = { 6, 10, 40 },
  1044. .vback_porch = { 2, 5, 20 },
  1045. .vsync_len = { 2, 5, 20 },
  1046. };
  1047. static const struct panel_desc auo_g185han01 = {
  1048. .timings = &auo_g185han01_timings,
  1049. .num_timings = 1,
  1050. .bpc = 8,
  1051. .size = {
  1052. .width = 409,
  1053. .height = 230,
  1054. },
  1055. .delay = {
  1056. .prepare = 50,
  1057. .enable = 200,
  1058. .disable = 110,
  1059. .unprepare = 1000,
  1060. },
  1061. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1062. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1063. };
  1064. static const struct display_timing auo_g190ean01_timings = {
  1065. .pixelclock = { 90000000, 108000000, 135000000 },
  1066. .hactive = { 1280, 1280, 1280 },
  1067. .hfront_porch = { 126, 184, 1266 },
  1068. .hback_porch = { 84, 122, 844 },
  1069. .hsync_len = { 70, 102, 704 },
  1070. .vactive = { 1024, 1024, 1024 },
  1071. .vfront_porch = { 4, 26, 76 },
  1072. .vback_porch = { 2, 8, 25 },
  1073. .vsync_len = { 2, 8, 25 },
  1074. };
  1075. static const struct panel_desc auo_g190ean01 = {
  1076. .timings = &auo_g190ean01_timings,
  1077. .num_timings = 1,
  1078. .bpc = 8,
  1079. .size = {
  1080. .width = 376,
  1081. .height = 301,
  1082. },
  1083. .delay = {
  1084. .prepare = 50,
  1085. .enable = 200,
  1086. .disable = 110,
  1087. .unprepare = 1000,
  1088. },
  1089. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1090. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1091. };
  1092. static const struct display_timing auo_p320hvn03_timings = {
  1093. .pixelclock = { 106000000, 148500000, 164000000 },
  1094. .hactive = { 1920, 1920, 1920 },
  1095. .hfront_porch = { 25, 50, 130 },
  1096. .hback_porch = { 25, 50, 130 },
  1097. .hsync_len = { 20, 40, 105 },
  1098. .vactive = { 1080, 1080, 1080 },
  1099. .vfront_porch = { 8, 17, 150 },
  1100. .vback_porch = { 8, 17, 150 },
  1101. .vsync_len = { 4, 11, 100 },
  1102. };
  1103. static const struct panel_desc auo_p320hvn03 = {
  1104. .timings = &auo_p320hvn03_timings,
  1105. .num_timings = 1,
  1106. .bpc = 8,
  1107. .size = {
  1108. .width = 698,
  1109. .height = 393,
  1110. },
  1111. .delay = {
  1112. .prepare = 1,
  1113. .enable = 450,
  1114. .unprepare = 500,
  1115. },
  1116. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1117. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1118. };
  1119. static const struct drm_display_mode auo_t215hvn01_mode = {
  1120. .clock = 148800,
  1121. .hdisplay = 1920,
  1122. .hsync_start = 1920 + 88,
  1123. .hsync_end = 1920 + 88 + 44,
  1124. .htotal = 1920 + 88 + 44 + 148,
  1125. .vdisplay = 1080,
  1126. .vsync_start = 1080 + 4,
  1127. .vsync_end = 1080 + 4 + 5,
  1128. .vtotal = 1080 + 4 + 5 + 36,
  1129. };
  1130. static const struct panel_desc auo_t215hvn01 = {
  1131. .modes = &auo_t215hvn01_mode,
  1132. .num_modes = 1,
  1133. .bpc = 8,
  1134. .size = {
  1135. .width = 430,
  1136. .height = 270,
  1137. },
  1138. .delay = {
  1139. .disable = 5,
  1140. .unprepare = 1000,
  1141. },
  1142. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1143. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1144. };
  1145. static const struct drm_display_mode avic_tm070ddh03_mode = {
  1146. .clock = 51200,
  1147. .hdisplay = 1024,
  1148. .hsync_start = 1024 + 160,
  1149. .hsync_end = 1024 + 160 + 4,
  1150. .htotal = 1024 + 160 + 4 + 156,
  1151. .vdisplay = 600,
  1152. .vsync_start = 600 + 17,
  1153. .vsync_end = 600 + 17 + 1,
  1154. .vtotal = 600 + 17 + 1 + 17,
  1155. };
  1156. static const struct panel_desc avic_tm070ddh03 = {
  1157. .modes = &avic_tm070ddh03_mode,
  1158. .num_modes = 1,
  1159. .bpc = 8,
  1160. .size = {
  1161. .width = 154,
  1162. .height = 90,
  1163. },
  1164. .delay = {
  1165. .prepare = 20,
  1166. .enable = 200,
  1167. .disable = 200,
  1168. },
  1169. };
  1170. static const struct drm_display_mode bananapi_s070wv20_ct16_mode = {
  1171. .clock = 30000,
  1172. .hdisplay = 800,
  1173. .hsync_start = 800 + 40,
  1174. .hsync_end = 800 + 40 + 48,
  1175. .htotal = 800 + 40 + 48 + 40,
  1176. .vdisplay = 480,
  1177. .vsync_start = 480 + 13,
  1178. .vsync_end = 480 + 13 + 3,
  1179. .vtotal = 480 + 13 + 3 + 29,
  1180. };
  1181. static const struct panel_desc bananapi_s070wv20_ct16 = {
  1182. .modes = &bananapi_s070wv20_ct16_mode,
  1183. .num_modes = 1,
  1184. .bpc = 6,
  1185. .size = {
  1186. .width = 154,
  1187. .height = 86,
  1188. },
  1189. };
  1190. static const struct drm_display_mode boe_bp101wx1_100_mode = {
  1191. .clock = 78945,
  1192. .hdisplay = 1280,
  1193. .hsync_start = 1280 + 0,
  1194. .hsync_end = 1280 + 0 + 2,
  1195. .htotal = 1280 + 62 + 0 + 2,
  1196. .vdisplay = 800,
  1197. .vsync_start = 800 + 8,
  1198. .vsync_end = 800 + 8 + 2,
  1199. .vtotal = 800 + 6 + 8 + 2,
  1200. };
  1201. static const struct panel_desc boe_bp082wx1_100 = {
  1202. .modes = &boe_bp101wx1_100_mode,
  1203. .num_modes = 1,
  1204. .bpc = 8,
  1205. .size = {
  1206. .width = 177,
  1207. .height = 110,
  1208. },
  1209. .delay = {
  1210. .enable = 50,
  1211. .disable = 50,
  1212. },
  1213. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  1214. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1215. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1216. };
  1217. static const struct panel_desc boe_bp101wx1_100 = {
  1218. .modes = &boe_bp101wx1_100_mode,
  1219. .num_modes = 1,
  1220. .bpc = 8,
  1221. .size = {
  1222. .width = 217,
  1223. .height = 136,
  1224. },
  1225. .delay = {
  1226. .enable = 50,
  1227. .disable = 50,
  1228. },
  1229. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  1230. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1231. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1232. };
  1233. static const struct display_timing boe_ev121wxm_n10_1850_timing = {
  1234. .pixelclock = { 69922000, 71000000, 72293000 },
  1235. .hactive = { 1280, 1280, 1280 },
  1236. .hfront_porch = { 48, 48, 48 },
  1237. .hback_porch = { 80, 80, 80 },
  1238. .hsync_len = { 32, 32, 32 },
  1239. .vactive = { 800, 800, 800 },
  1240. .vfront_porch = { 3, 3, 3 },
  1241. .vback_porch = { 14, 14, 14 },
  1242. .vsync_len = { 6, 6, 6 },
  1243. };
  1244. static const struct panel_desc boe_ev121wxm_n10_1850 = {
  1245. .timings = &boe_ev121wxm_n10_1850_timing,
  1246. .num_timings = 1,
  1247. .bpc = 8,
  1248. .size = {
  1249. .width = 261,
  1250. .height = 163,
  1251. },
  1252. .delay = {
  1253. .prepare = 9,
  1254. .enable = 300,
  1255. .unprepare = 300,
  1256. .disable = 560,
  1257. },
  1258. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1259. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1260. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1261. };
  1262. static const struct drm_display_mode boe_hv070wsa_mode = {
  1263. .clock = 42105,
  1264. .hdisplay = 1024,
  1265. .hsync_start = 1024 + 30,
  1266. .hsync_end = 1024 + 30 + 30,
  1267. .htotal = 1024 + 30 + 30 + 30,
  1268. .vdisplay = 600,
  1269. .vsync_start = 600 + 10,
  1270. .vsync_end = 600 + 10 + 10,
  1271. .vtotal = 600 + 10 + 10 + 10,
  1272. };
  1273. static const struct panel_desc boe_hv070wsa = {
  1274. .modes = &boe_hv070wsa_mode,
  1275. .num_modes = 1,
  1276. .bpc = 8,
  1277. .size = {
  1278. .width = 154,
  1279. .height = 90,
  1280. },
  1281. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1282. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1283. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1284. };
  1285. static const struct display_timing cct_cmt430b19n00_timing = {
  1286. .pixelclock = { 8000000, 9000000, 12000000 },
  1287. .hactive = { 480, 480, 480 },
  1288. .hfront_porch = { 2, 8, 75 },
  1289. .hback_porch = { 3, 43, 43 },
  1290. .hsync_len = { 2, 4, 75 },
  1291. .vactive = { 272, 272, 272 },
  1292. .vfront_porch = { 2, 8, 37 },
  1293. .vback_porch = { 2, 12, 12 },
  1294. .vsync_len = { 2, 4, 37 },
  1295. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW
  1296. };
  1297. static const struct panel_desc cct_cmt430b19n00 = {
  1298. .timings = &cct_cmt430b19n00_timing,
  1299. .num_timings = 1,
  1300. .bpc = 8,
  1301. .size = {
  1302. .width = 95,
  1303. .height = 53,
  1304. },
  1305. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1306. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  1307. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1308. };
  1309. static const struct drm_display_mode cdtech_s043wq26h_ct7_mode = {
  1310. .clock = 9000,
  1311. .hdisplay = 480,
  1312. .hsync_start = 480 + 5,
  1313. .hsync_end = 480 + 5 + 5,
  1314. .htotal = 480 + 5 + 5 + 40,
  1315. .vdisplay = 272,
  1316. .vsync_start = 272 + 8,
  1317. .vsync_end = 272 + 8 + 8,
  1318. .vtotal = 272 + 8 + 8 + 8,
  1319. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1320. };
  1321. static const struct panel_desc cdtech_s043wq26h_ct7 = {
  1322. .modes = &cdtech_s043wq26h_ct7_mode,
  1323. .num_modes = 1,
  1324. .bpc = 8,
  1325. .size = {
  1326. .width = 95,
  1327. .height = 54,
  1328. },
  1329. .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  1330. };
  1331. /* S070PWS19HP-FC21 2017/04/22 */
  1332. static const struct drm_display_mode cdtech_s070pws19hp_fc21_mode = {
  1333. .clock = 51200,
  1334. .hdisplay = 1024,
  1335. .hsync_start = 1024 + 160,
  1336. .hsync_end = 1024 + 160 + 20,
  1337. .htotal = 1024 + 160 + 20 + 140,
  1338. .vdisplay = 600,
  1339. .vsync_start = 600 + 12,
  1340. .vsync_end = 600 + 12 + 3,
  1341. .vtotal = 600 + 12 + 3 + 20,
  1342. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1343. };
  1344. static const struct panel_desc cdtech_s070pws19hp_fc21 = {
  1345. .modes = &cdtech_s070pws19hp_fc21_mode,
  1346. .num_modes = 1,
  1347. .bpc = 6,
  1348. .size = {
  1349. .width = 154,
  1350. .height = 86,
  1351. },
  1352. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1353. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  1354. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1355. };
  1356. /* S070SWV29HG-DC44 2017/09/21 */
  1357. static const struct drm_display_mode cdtech_s070swv29hg_dc44_mode = {
  1358. .clock = 33300,
  1359. .hdisplay = 800,
  1360. .hsync_start = 800 + 210,
  1361. .hsync_end = 800 + 210 + 2,
  1362. .htotal = 800 + 210 + 2 + 44,
  1363. .vdisplay = 480,
  1364. .vsync_start = 480 + 22,
  1365. .vsync_end = 480 + 22 + 2,
  1366. .vtotal = 480 + 22 + 2 + 21,
  1367. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1368. };
  1369. static const struct panel_desc cdtech_s070swv29hg_dc44 = {
  1370. .modes = &cdtech_s070swv29hg_dc44_mode,
  1371. .num_modes = 1,
  1372. .bpc = 6,
  1373. .size = {
  1374. .width = 154,
  1375. .height = 86,
  1376. },
  1377. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1378. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  1379. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1380. };
  1381. static const struct drm_display_mode cdtech_s070wv95_ct16_mode = {
  1382. .clock = 35000,
  1383. .hdisplay = 800,
  1384. .hsync_start = 800 + 40,
  1385. .hsync_end = 800 + 40 + 40,
  1386. .htotal = 800 + 40 + 40 + 48,
  1387. .vdisplay = 480,
  1388. .vsync_start = 480 + 29,
  1389. .vsync_end = 480 + 29 + 13,
  1390. .vtotal = 480 + 29 + 13 + 3,
  1391. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1392. };
  1393. static const struct panel_desc cdtech_s070wv95_ct16 = {
  1394. .modes = &cdtech_s070wv95_ct16_mode,
  1395. .num_modes = 1,
  1396. .bpc = 8,
  1397. .size = {
  1398. .width = 154,
  1399. .height = 85,
  1400. },
  1401. };
  1402. static const struct display_timing chefree_ch101olhlwh_002_timing = {
  1403. .pixelclock = { 68900000, 71100000, 73400000 },
  1404. .hactive = { 1280, 1280, 1280 },
  1405. .hfront_porch = { 65, 80, 95 },
  1406. .hback_porch = { 64, 79, 94 },
  1407. .hsync_len = { 1, 1, 1 },
  1408. .vactive = { 800, 800, 800 },
  1409. .vfront_porch = { 7, 11, 14 },
  1410. .vback_porch = { 7, 11, 14 },
  1411. .vsync_len = { 1, 1, 1 },
  1412. .flags = DISPLAY_FLAGS_DE_HIGH,
  1413. };
  1414. static const struct panel_desc chefree_ch101olhlwh_002 = {
  1415. .timings = &chefree_ch101olhlwh_002_timing,
  1416. .num_timings = 1,
  1417. .bpc = 8,
  1418. .size = {
  1419. .width = 217,
  1420. .height = 135,
  1421. },
  1422. .delay = {
  1423. .enable = 200,
  1424. .disable = 200,
  1425. },
  1426. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1427. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1428. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1429. };
  1430. static const struct drm_display_mode chunghwa_claa070wp03xg_mode = {
  1431. .clock = 66770,
  1432. .hdisplay = 800,
  1433. .hsync_start = 800 + 49,
  1434. .hsync_end = 800 + 49 + 33,
  1435. .htotal = 800 + 49 + 33 + 17,
  1436. .vdisplay = 1280,
  1437. .vsync_start = 1280 + 1,
  1438. .vsync_end = 1280 + 1 + 7,
  1439. .vtotal = 1280 + 1 + 7 + 15,
  1440. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  1441. };
  1442. static const struct panel_desc chunghwa_claa070wp03xg = {
  1443. .modes = &chunghwa_claa070wp03xg_mode,
  1444. .num_modes = 1,
  1445. .bpc = 6,
  1446. .size = {
  1447. .width = 94,
  1448. .height = 150,
  1449. },
  1450. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  1451. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1452. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1453. };
  1454. static const struct drm_display_mode chunghwa_claa101wa01a_mode = {
  1455. .clock = 72070,
  1456. .hdisplay = 1366,
  1457. .hsync_start = 1366 + 58,
  1458. .hsync_end = 1366 + 58 + 58,
  1459. .htotal = 1366 + 58 + 58 + 58,
  1460. .vdisplay = 768,
  1461. .vsync_start = 768 + 4,
  1462. .vsync_end = 768 + 4 + 4,
  1463. .vtotal = 768 + 4 + 4 + 4,
  1464. };
  1465. static const struct panel_desc chunghwa_claa101wa01a = {
  1466. .modes = &chunghwa_claa101wa01a_mode,
  1467. .num_modes = 1,
  1468. .bpc = 6,
  1469. .size = {
  1470. .width = 220,
  1471. .height = 120,
  1472. },
  1473. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  1474. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1475. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1476. };
  1477. static const struct drm_display_mode chunghwa_claa101wb01_mode = {
  1478. .clock = 69300,
  1479. .hdisplay = 1366,
  1480. .hsync_start = 1366 + 48,
  1481. .hsync_end = 1366 + 48 + 32,
  1482. .htotal = 1366 + 48 + 32 + 20,
  1483. .vdisplay = 768,
  1484. .vsync_start = 768 + 16,
  1485. .vsync_end = 768 + 16 + 8,
  1486. .vtotal = 768 + 16 + 8 + 16,
  1487. };
  1488. static const struct panel_desc chunghwa_claa101wb01 = {
  1489. .modes = &chunghwa_claa101wb01_mode,
  1490. .num_modes = 1,
  1491. .bpc = 6,
  1492. .size = {
  1493. .width = 223,
  1494. .height = 125,
  1495. },
  1496. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  1497. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1498. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1499. };
  1500. static const struct display_timing dataimage_fg040346dsswbg04_timing = {
  1501. .pixelclock = { 5000000, 9000000, 12000000 },
  1502. .hactive = { 480, 480, 480 },
  1503. .hfront_porch = { 12, 12, 12 },
  1504. .hback_porch = { 12, 12, 12 },
  1505. .hsync_len = { 21, 21, 21 },
  1506. .vactive = { 272, 272, 272 },
  1507. .vfront_porch = { 4, 4, 4 },
  1508. .vback_porch = { 4, 4, 4 },
  1509. .vsync_len = { 8, 8, 8 },
  1510. };
  1511. static const struct panel_desc dataimage_fg040346dsswbg04 = {
  1512. .timings = &dataimage_fg040346dsswbg04_timing,
  1513. .num_timings = 1,
  1514. .bpc = 8,
  1515. .size = {
  1516. .width = 95,
  1517. .height = 54,
  1518. },
  1519. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1520. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  1521. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1522. };
  1523. static const struct display_timing dataimage_fg1001l0dsswmg01_timing = {
  1524. .pixelclock = { 68900000, 71110000, 73400000 },
  1525. .hactive = { 1280, 1280, 1280 },
  1526. .vactive = { 800, 800, 800 },
  1527. .hback_porch = { 100, 100, 100 },
  1528. .hfront_porch = { 100, 100, 100 },
  1529. .vback_porch = { 5, 5, 5 },
  1530. .vfront_porch = { 5, 5, 5 },
  1531. .hsync_len = { 24, 24, 24 },
  1532. .vsync_len = { 3, 3, 3 },
  1533. .flags = DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  1534. DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
  1535. };
  1536. static const struct panel_desc dataimage_fg1001l0dsswmg01 = {
  1537. .timings = &dataimage_fg1001l0dsswmg01_timing,
  1538. .num_timings = 1,
  1539. .bpc = 8,
  1540. .size = {
  1541. .width = 217,
  1542. .height = 136,
  1543. },
  1544. };
  1545. static const struct drm_display_mode dataimage_scf0700c48ggu18_mode = {
  1546. .clock = 33260,
  1547. .hdisplay = 800,
  1548. .hsync_start = 800 + 40,
  1549. .hsync_end = 800 + 40 + 128,
  1550. .htotal = 800 + 40 + 128 + 88,
  1551. .vdisplay = 480,
  1552. .vsync_start = 480 + 10,
  1553. .vsync_end = 480 + 10 + 2,
  1554. .vtotal = 480 + 10 + 2 + 33,
  1555. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  1556. };
  1557. static const struct panel_desc dataimage_scf0700c48ggu18 = {
  1558. .modes = &dataimage_scf0700c48ggu18_mode,
  1559. .num_modes = 1,
  1560. .bpc = 8,
  1561. .size = {
  1562. .width = 152,
  1563. .height = 91,
  1564. },
  1565. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1566. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  1567. };
  1568. static const struct display_timing dlc_dlc0700yzg_1_timing = {
  1569. .pixelclock = { 45000000, 51200000, 57000000 },
  1570. .hactive = { 1024, 1024, 1024 },
  1571. .hfront_porch = { 100, 106, 113 },
  1572. .hback_porch = { 100, 106, 113 },
  1573. .hsync_len = { 100, 108, 114 },
  1574. .vactive = { 600, 600, 600 },
  1575. .vfront_porch = { 8, 11, 15 },
  1576. .vback_porch = { 8, 11, 15 },
  1577. .vsync_len = { 9, 13, 15 },
  1578. .flags = DISPLAY_FLAGS_DE_HIGH,
  1579. };
  1580. static const struct panel_desc dlc_dlc0700yzg_1 = {
  1581. .timings = &dlc_dlc0700yzg_1_timing,
  1582. .num_timings = 1,
  1583. .bpc = 6,
  1584. .size = {
  1585. .width = 154,
  1586. .height = 86,
  1587. },
  1588. .delay = {
  1589. .prepare = 30,
  1590. .enable = 200,
  1591. .disable = 200,
  1592. },
  1593. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  1594. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1595. };
  1596. static const struct display_timing dlc_dlc1010gig_timing = {
  1597. .pixelclock = { 68900000, 71100000, 73400000 },
  1598. .hactive = { 1280, 1280, 1280 },
  1599. .hfront_porch = { 43, 53, 63 },
  1600. .hback_porch = { 43, 53, 63 },
  1601. .hsync_len = { 44, 54, 64 },
  1602. .vactive = { 800, 800, 800 },
  1603. .vfront_porch = { 5, 8, 11 },
  1604. .vback_porch = { 5, 8, 11 },
  1605. .vsync_len = { 5, 7, 11 },
  1606. .flags = DISPLAY_FLAGS_DE_HIGH,
  1607. };
  1608. static const struct panel_desc dlc_dlc1010gig = {
  1609. .timings = &dlc_dlc1010gig_timing,
  1610. .num_timings = 1,
  1611. .bpc = 8,
  1612. .size = {
  1613. .width = 216,
  1614. .height = 135,
  1615. },
  1616. .delay = {
  1617. .prepare = 60,
  1618. .enable = 150,
  1619. .disable = 100,
  1620. .unprepare = 60,
  1621. },
  1622. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1623. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1624. };
  1625. static const struct drm_display_mode edt_et035012dm6_mode = {
  1626. .clock = 6500,
  1627. .hdisplay = 320,
  1628. .hsync_start = 320 + 20,
  1629. .hsync_end = 320 + 20 + 30,
  1630. .htotal = 320 + 20 + 68,
  1631. .vdisplay = 240,
  1632. .vsync_start = 240 + 4,
  1633. .vsync_end = 240 + 4 + 4,
  1634. .vtotal = 240 + 4 + 4 + 14,
  1635. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  1636. };
  1637. static const struct panel_desc edt_et035012dm6 = {
  1638. .modes = &edt_et035012dm6_mode,
  1639. .num_modes = 1,
  1640. .bpc = 8,
  1641. .size = {
  1642. .width = 70,
  1643. .height = 52,
  1644. },
  1645. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1646. .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  1647. };
  1648. static const struct drm_display_mode edt_etm0350g0dh6_mode = {
  1649. .clock = 6520,
  1650. .hdisplay = 320,
  1651. .hsync_start = 320 + 20,
  1652. .hsync_end = 320 + 20 + 68,
  1653. .htotal = 320 + 20 + 68,
  1654. .vdisplay = 240,
  1655. .vsync_start = 240 + 4,
  1656. .vsync_end = 240 + 4 + 18,
  1657. .vtotal = 240 + 4 + 18,
  1658. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  1659. };
  1660. static const struct panel_desc edt_etm0350g0dh6 = {
  1661. .modes = &edt_etm0350g0dh6_mode,
  1662. .num_modes = 1,
  1663. .bpc = 6,
  1664. .size = {
  1665. .width = 70,
  1666. .height = 53,
  1667. },
  1668. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1669. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  1670. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1671. };
  1672. static const struct drm_display_mode edt_etm043080dh6gp_mode = {
  1673. .clock = 10870,
  1674. .hdisplay = 480,
  1675. .hsync_start = 480 + 8,
  1676. .hsync_end = 480 + 8 + 4,
  1677. .htotal = 480 + 8 + 4 + 41,
  1678. /*
  1679. * IWG22M: Y resolution changed for "dc_linuxfb" module crashing while
  1680. * fb_align
  1681. */
  1682. .vdisplay = 288,
  1683. .vsync_start = 288 + 2,
  1684. .vsync_end = 288 + 2 + 4,
  1685. .vtotal = 288 + 2 + 4 + 10,
  1686. };
  1687. static const struct panel_desc edt_etm043080dh6gp = {
  1688. .modes = &edt_etm043080dh6gp_mode,
  1689. .num_modes = 1,
  1690. .bpc = 8,
  1691. .size = {
  1692. .width = 100,
  1693. .height = 65,
  1694. },
  1695. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1696. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1697. };
  1698. static const struct drm_display_mode edt_etm0430g0dh6_mode = {
  1699. .clock = 9000,
  1700. .hdisplay = 480,
  1701. .hsync_start = 480 + 2,
  1702. .hsync_end = 480 + 2 + 41,
  1703. .htotal = 480 + 2 + 41 + 2,
  1704. .vdisplay = 272,
  1705. .vsync_start = 272 + 2,
  1706. .vsync_end = 272 + 2 + 10,
  1707. .vtotal = 272 + 2 + 10 + 2,
  1708. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1709. };
  1710. static const struct panel_desc edt_etm0430g0dh6 = {
  1711. .modes = &edt_etm0430g0dh6_mode,
  1712. .num_modes = 1,
  1713. .bpc = 6,
  1714. .size = {
  1715. .width = 95,
  1716. .height = 54,
  1717. },
  1718. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1719. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  1720. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1721. };
  1722. static const struct drm_display_mode edt_et057090dhu_mode = {
  1723. .clock = 25175,
  1724. .hdisplay = 640,
  1725. .hsync_start = 640 + 16,
  1726. .hsync_end = 640 + 16 + 30,
  1727. .htotal = 640 + 16 + 30 + 114,
  1728. .vdisplay = 480,
  1729. .vsync_start = 480 + 10,
  1730. .vsync_end = 480 + 10 + 3,
  1731. .vtotal = 480 + 10 + 3 + 32,
  1732. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  1733. };
  1734. static const struct panel_desc edt_et057090dhu = {
  1735. .modes = &edt_et057090dhu_mode,
  1736. .num_modes = 1,
  1737. .bpc = 6,
  1738. .size = {
  1739. .width = 115,
  1740. .height = 86,
  1741. },
  1742. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1743. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  1744. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1745. };
  1746. static const struct drm_display_mode edt_etm0700g0dh6_mode = {
  1747. .clock = 33260,
  1748. .hdisplay = 800,
  1749. .hsync_start = 800 + 40,
  1750. .hsync_end = 800 + 40 + 128,
  1751. .htotal = 800 + 40 + 128 + 88,
  1752. .vdisplay = 480,
  1753. .vsync_start = 480 + 10,
  1754. .vsync_end = 480 + 10 + 2,
  1755. .vtotal = 480 + 10 + 2 + 33,
  1756. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1757. };
  1758. static const struct panel_desc edt_etm0700g0dh6 = {
  1759. .modes = &edt_etm0700g0dh6_mode,
  1760. .num_modes = 1,
  1761. .bpc = 6,
  1762. .size = {
  1763. .width = 152,
  1764. .height = 91,
  1765. },
  1766. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1767. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  1768. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1769. };
  1770. static const struct panel_desc edt_etm0700g0bdh6 = {
  1771. .modes = &edt_etm0700g0dh6_mode,
  1772. .num_modes = 1,
  1773. .bpc = 6,
  1774. .size = {
  1775. .width = 152,
  1776. .height = 91,
  1777. },
  1778. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  1779. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  1780. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1781. };
  1782. static const struct display_timing edt_etml0700y5dha_timing = {
  1783. .pixelclock = { 40800000, 51200000, 67200000 },
  1784. .hactive = { 1024, 1024, 1024 },
  1785. .hfront_porch = { 30, 106, 125 },
  1786. .hback_porch = { 30, 106, 125 },
  1787. .hsync_len = { 30, 108, 126 },
  1788. .vactive = { 600, 600, 600 },
  1789. .vfront_porch = { 3, 12, 67},
  1790. .vback_porch = { 3, 12, 67 },
  1791. .vsync_len = { 4, 11, 66 },
  1792. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  1793. DISPLAY_FLAGS_DE_HIGH,
  1794. };
  1795. static const struct panel_desc edt_etml0700y5dha = {
  1796. .timings = &edt_etml0700y5dha_timing,
  1797. .num_timings = 1,
  1798. .bpc = 8,
  1799. .size = {
  1800. .width = 155,
  1801. .height = 86,
  1802. },
  1803. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1804. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1805. };
  1806. static const struct display_timing edt_etml1010g3dra_timing = {
  1807. .pixelclock = { 66300000, 72400000, 78900000 },
  1808. .hactive = { 1280, 1280, 1280 },
  1809. .hfront_porch = { 12, 72, 132 },
  1810. .hback_porch = { 86, 86, 86 },
  1811. .hsync_len = { 2, 2, 2 },
  1812. .vactive = { 800, 800, 800 },
  1813. .vfront_porch = { 1, 15, 49 },
  1814. .vback_porch = { 21, 21, 21 },
  1815. .vsync_len = { 2, 2, 2 },
  1816. .flags = DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_HSYNC_LOW |
  1817. DISPLAY_FLAGS_DE_HIGH,
  1818. };
  1819. static const struct panel_desc edt_etml1010g3dra = {
  1820. .timings = &edt_etml1010g3dra_timing,
  1821. .num_timings = 1,
  1822. .bpc = 8,
  1823. .size = {
  1824. .width = 216,
  1825. .height = 135,
  1826. },
  1827. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  1828. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1829. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1830. };
  1831. static const struct drm_display_mode edt_etmv570g2dhu_mode = {
  1832. .clock = 25175,
  1833. .hdisplay = 640,
  1834. .hsync_start = 640,
  1835. .hsync_end = 640 + 16,
  1836. .htotal = 640 + 16 + 30 + 114,
  1837. .vdisplay = 480,
  1838. .vsync_start = 480 + 10,
  1839. .vsync_end = 480 + 10 + 3,
  1840. .vtotal = 480 + 10 + 3 + 35,
  1841. .flags = DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_PHSYNC,
  1842. };
  1843. static const struct panel_desc edt_etmv570g2dhu = {
  1844. .modes = &edt_etmv570g2dhu_mode,
  1845. .num_modes = 1,
  1846. .bpc = 6,
  1847. .size = {
  1848. .width = 115,
  1849. .height = 86,
  1850. },
  1851. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1852. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  1853. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1854. };
  1855. static const struct display_timing eink_vb3300_kca_timing = {
  1856. .pixelclock = { 40000000, 40000000, 40000000 },
  1857. .hactive = { 334, 334, 334 },
  1858. .hfront_porch = { 1, 1, 1 },
  1859. .hback_porch = { 1, 1, 1 },
  1860. .hsync_len = { 1, 1, 1 },
  1861. .vactive = { 1405, 1405, 1405 },
  1862. .vfront_porch = { 1, 1, 1 },
  1863. .vback_porch = { 1, 1, 1 },
  1864. .vsync_len = { 1, 1, 1 },
  1865. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  1866. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
  1867. };
  1868. static const struct panel_desc eink_vb3300_kca = {
  1869. .timings = &eink_vb3300_kca_timing,
  1870. .num_timings = 1,
  1871. .bpc = 6,
  1872. .size = {
  1873. .width = 157,
  1874. .height = 209,
  1875. },
  1876. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1877. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  1878. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1879. };
  1880. static const struct display_timing evervision_vgg644804_timing = {
  1881. .pixelclock = { 25175000, 25175000, 25175000 },
  1882. .hactive = { 640, 640, 640 },
  1883. .hfront_porch = { 16, 16, 16 },
  1884. .hback_porch = { 82, 114, 170 },
  1885. .hsync_len = { 5, 30, 30 },
  1886. .vactive = { 480, 480, 480 },
  1887. .vfront_porch = { 10, 10, 10 },
  1888. .vback_porch = { 30, 32, 34 },
  1889. .vsync_len = { 1, 3, 5 },
  1890. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  1891. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  1892. DISPLAY_FLAGS_SYNC_POSEDGE,
  1893. };
  1894. static const struct panel_desc evervision_vgg644804 = {
  1895. .timings = &evervision_vgg644804_timing,
  1896. .num_timings = 1,
  1897. .bpc = 6,
  1898. .size = {
  1899. .width = 115,
  1900. .height = 86,
  1901. },
  1902. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  1903. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1904. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  1905. };
  1906. static const struct display_timing evervision_vgg804821_timing = {
  1907. .pixelclock = { 27600000, 33300000, 50000000 },
  1908. .hactive = { 800, 800, 800 },
  1909. .hfront_porch = { 40, 66, 70 },
  1910. .hback_porch = { 40, 67, 70 },
  1911. .hsync_len = { 40, 67, 70 },
  1912. .vactive = { 480, 480, 480 },
  1913. .vfront_porch = { 6, 10, 10 },
  1914. .vback_porch = { 7, 11, 11 },
  1915. .vsync_len = { 7, 11, 11 },
  1916. .flags = DISPLAY_FLAGS_HSYNC_HIGH | DISPLAY_FLAGS_VSYNC_HIGH |
  1917. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE |
  1918. DISPLAY_FLAGS_SYNC_NEGEDGE,
  1919. };
  1920. static const struct panel_desc evervision_vgg804821 = {
  1921. .timings = &evervision_vgg804821_timing,
  1922. .num_timings = 1,
  1923. .bpc = 8,
  1924. .size = {
  1925. .width = 108,
  1926. .height = 64,
  1927. },
  1928. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1929. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  1930. };
  1931. static const struct drm_display_mode foxlink_fl500wvr00_a0t_mode = {
  1932. .clock = 32260,
  1933. .hdisplay = 800,
  1934. .hsync_start = 800 + 168,
  1935. .hsync_end = 800 + 168 + 64,
  1936. .htotal = 800 + 168 + 64 + 88,
  1937. .vdisplay = 480,
  1938. .vsync_start = 480 + 37,
  1939. .vsync_end = 480 + 37 + 2,
  1940. .vtotal = 480 + 37 + 2 + 8,
  1941. };
  1942. static const struct panel_desc foxlink_fl500wvr00_a0t = {
  1943. .modes = &foxlink_fl500wvr00_a0t_mode,
  1944. .num_modes = 1,
  1945. .bpc = 8,
  1946. .size = {
  1947. .width = 108,
  1948. .height = 65,
  1949. },
  1950. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1951. };
  1952. static const struct drm_display_mode frida_frd350h54004_modes[] = {
  1953. { /* 60 Hz */
  1954. .clock = 6000,
  1955. .hdisplay = 320,
  1956. .hsync_start = 320 + 44,
  1957. .hsync_end = 320 + 44 + 16,
  1958. .htotal = 320 + 44 + 16 + 20,
  1959. .vdisplay = 240,
  1960. .vsync_start = 240 + 2,
  1961. .vsync_end = 240 + 2 + 6,
  1962. .vtotal = 240 + 2 + 6 + 2,
  1963. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1964. },
  1965. { /* 50 Hz */
  1966. .clock = 5400,
  1967. .hdisplay = 320,
  1968. .hsync_start = 320 + 56,
  1969. .hsync_end = 320 + 56 + 16,
  1970. .htotal = 320 + 56 + 16 + 40,
  1971. .vdisplay = 240,
  1972. .vsync_start = 240 + 2,
  1973. .vsync_end = 240 + 2 + 6,
  1974. .vtotal = 240 + 2 + 6 + 2,
  1975. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  1976. },
  1977. };
  1978. static const struct panel_desc frida_frd350h54004 = {
  1979. .modes = frida_frd350h54004_modes,
  1980. .num_modes = ARRAY_SIZE(frida_frd350h54004_modes),
  1981. .bpc = 8,
  1982. .size = {
  1983. .width = 77,
  1984. .height = 64,
  1985. },
  1986. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  1987. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  1988. .connector_type = DRM_MODE_CONNECTOR_DPI,
  1989. };
  1990. static const struct drm_display_mode friendlyarm_hd702e_mode = {
  1991. .clock = 67185,
  1992. .hdisplay = 800,
  1993. .hsync_start = 800 + 20,
  1994. .hsync_end = 800 + 20 + 24,
  1995. .htotal = 800 + 20 + 24 + 20,
  1996. .vdisplay = 1280,
  1997. .vsync_start = 1280 + 4,
  1998. .vsync_end = 1280 + 4 + 8,
  1999. .vtotal = 1280 + 4 + 8 + 4,
  2000. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  2001. };
  2002. static const struct panel_desc friendlyarm_hd702e = {
  2003. .modes = &friendlyarm_hd702e_mode,
  2004. .num_modes = 1,
  2005. .size = {
  2006. .width = 94,
  2007. .height = 151,
  2008. },
  2009. };
  2010. static const struct drm_display_mode giantplus_gpg482739qs5_mode = {
  2011. .clock = 9000,
  2012. .hdisplay = 480,
  2013. .hsync_start = 480 + 5,
  2014. .hsync_end = 480 + 5 + 1,
  2015. .htotal = 480 + 5 + 1 + 40,
  2016. .vdisplay = 272,
  2017. .vsync_start = 272 + 8,
  2018. .vsync_end = 272 + 8 + 1,
  2019. .vtotal = 272 + 8 + 1 + 8,
  2020. };
  2021. static const struct panel_desc giantplus_gpg482739qs5 = {
  2022. .modes = &giantplus_gpg482739qs5_mode,
  2023. .num_modes = 1,
  2024. .bpc = 8,
  2025. .size = {
  2026. .width = 95,
  2027. .height = 54,
  2028. },
  2029. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2030. };
  2031. static const struct display_timing giantplus_gpm940b0_timing = {
  2032. .pixelclock = { 13500000, 27000000, 27500000 },
  2033. .hactive = { 320, 320, 320 },
  2034. .hfront_porch = { 14, 686, 718 },
  2035. .hback_porch = { 50, 70, 255 },
  2036. .hsync_len = { 1, 1, 1 },
  2037. .vactive = { 240, 240, 240 },
  2038. .vfront_porch = { 1, 1, 179 },
  2039. .vback_porch = { 1, 21, 31 },
  2040. .vsync_len = { 1, 1, 6 },
  2041. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
  2042. };
  2043. static const struct panel_desc giantplus_gpm940b0 = {
  2044. .timings = &giantplus_gpm940b0_timing,
  2045. .num_timings = 1,
  2046. .bpc = 8,
  2047. .size = {
  2048. .width = 60,
  2049. .height = 45,
  2050. },
  2051. .bus_format = MEDIA_BUS_FMT_RGB888_3X8,
  2052. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  2053. };
  2054. static const struct display_timing hannstar_hsd070pww1_timing = {
  2055. .pixelclock = { 64300000, 71100000, 82000000 },
  2056. .hactive = { 1280, 1280, 1280 },
  2057. .hfront_porch = { 1, 1, 10 },
  2058. .hback_porch = { 1, 1, 10 },
  2059. /*
  2060. * According to the data sheet, the minimum horizontal blanking interval
  2061. * is 54 clocks (1 + 52 + 1), but tests with a Nitrogen6X have shown the
  2062. * minimum working horizontal blanking interval to be 60 clocks.
  2063. */
  2064. .hsync_len = { 58, 158, 661 },
  2065. .vactive = { 800, 800, 800 },
  2066. .vfront_porch = { 1, 1, 10 },
  2067. .vback_porch = { 1, 1, 10 },
  2068. .vsync_len = { 1, 21, 203 },
  2069. .flags = DISPLAY_FLAGS_DE_HIGH,
  2070. };
  2071. static const struct panel_desc hannstar_hsd070pww1 = {
  2072. .timings = &hannstar_hsd070pww1_timing,
  2073. .num_timings = 1,
  2074. .bpc = 6,
  2075. .size = {
  2076. .width = 151,
  2077. .height = 94,
  2078. },
  2079. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2080. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2081. };
  2082. static const struct display_timing hannstar_hsd100pxn1_timing = {
  2083. .pixelclock = { 55000000, 65000000, 75000000 },
  2084. .hactive = { 1024, 1024, 1024 },
  2085. .hfront_porch = { 40, 40, 40 },
  2086. .hback_porch = { 220, 220, 220 },
  2087. .hsync_len = { 20, 60, 100 },
  2088. .vactive = { 768, 768, 768 },
  2089. .vfront_porch = { 7, 7, 7 },
  2090. .vback_porch = { 21, 21, 21 },
  2091. .vsync_len = { 10, 10, 10 },
  2092. .flags = DISPLAY_FLAGS_DE_HIGH,
  2093. };
  2094. static const struct panel_desc hannstar_hsd100pxn1 = {
  2095. .timings = &hannstar_hsd100pxn1_timing,
  2096. .num_timings = 1,
  2097. .bpc = 6,
  2098. .size = {
  2099. .width = 203,
  2100. .height = 152,
  2101. },
  2102. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2103. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2104. };
  2105. static const struct display_timing hannstar_hsd101pww2_timing = {
  2106. .pixelclock = { 64300000, 71100000, 82000000 },
  2107. .hactive = { 1280, 1280, 1280 },
  2108. .hfront_porch = { 1, 1, 10 },
  2109. .hback_porch = { 1, 1, 10 },
  2110. .hsync_len = { 58, 158, 661 },
  2111. .vactive = { 800, 800, 800 },
  2112. .vfront_porch = { 1, 1, 10 },
  2113. .vback_porch = { 1, 1, 10 },
  2114. .vsync_len = { 1, 21, 203 },
  2115. .flags = DISPLAY_FLAGS_DE_HIGH,
  2116. };
  2117. static const struct panel_desc hannstar_hsd101pww2 = {
  2118. .timings = &hannstar_hsd101pww2_timing,
  2119. .num_timings = 1,
  2120. .bpc = 8,
  2121. .size = {
  2122. .width = 217,
  2123. .height = 136,
  2124. },
  2125. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2126. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2127. };
  2128. static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = {
  2129. .clock = 33333,
  2130. .hdisplay = 800,
  2131. .hsync_start = 800 + 85,
  2132. .hsync_end = 800 + 85 + 86,
  2133. .htotal = 800 + 85 + 86 + 85,
  2134. .vdisplay = 480,
  2135. .vsync_start = 480 + 16,
  2136. .vsync_end = 480 + 16 + 13,
  2137. .vtotal = 480 + 16 + 13 + 16,
  2138. };
  2139. static const struct panel_desc hitachi_tx23d38vm0caa = {
  2140. .modes = &hitachi_tx23d38vm0caa_mode,
  2141. .num_modes = 1,
  2142. .bpc = 6,
  2143. .size = {
  2144. .width = 195,
  2145. .height = 117,
  2146. },
  2147. .delay = {
  2148. .enable = 160,
  2149. .disable = 160,
  2150. },
  2151. };
  2152. static const struct drm_display_mode innolux_at043tn24_mode = {
  2153. .clock = 9000,
  2154. .hdisplay = 480,
  2155. .hsync_start = 480 + 2,
  2156. .hsync_end = 480 + 2 + 41,
  2157. .htotal = 480 + 2 + 41 + 2,
  2158. .vdisplay = 272,
  2159. .vsync_start = 272 + 2,
  2160. .vsync_end = 272 + 2 + 10,
  2161. .vtotal = 272 + 2 + 10 + 2,
  2162. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  2163. };
  2164. static const struct panel_desc innolux_at043tn24 = {
  2165. .modes = &innolux_at043tn24_mode,
  2166. .num_modes = 1,
  2167. .bpc = 8,
  2168. .size = {
  2169. .width = 95,
  2170. .height = 54,
  2171. },
  2172. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2173. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2174. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  2175. };
  2176. static const struct drm_display_mode innolux_at070tn92_mode = {
  2177. .clock = 33333,
  2178. .hdisplay = 800,
  2179. .hsync_start = 800 + 210,
  2180. .hsync_end = 800 + 210 + 20,
  2181. .htotal = 800 + 210 + 20 + 46,
  2182. .vdisplay = 480,
  2183. .vsync_start = 480 + 22,
  2184. .vsync_end = 480 + 22 + 10,
  2185. .vtotal = 480 + 22 + 23 + 10,
  2186. };
  2187. static const struct panel_desc innolux_at070tn92 = {
  2188. .modes = &innolux_at070tn92_mode,
  2189. .num_modes = 1,
  2190. .size = {
  2191. .width = 154,
  2192. .height = 86,
  2193. },
  2194. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2195. };
  2196. static const struct display_timing innolux_g070ace_l01_timing = {
  2197. .pixelclock = { 25200000, 35000000, 35700000 },
  2198. .hactive = { 800, 800, 800 },
  2199. .hfront_porch = { 30, 32, 87 },
  2200. .hback_porch = { 30, 32, 87 },
  2201. .hsync_len = { 1, 1, 1 },
  2202. .vactive = { 480, 480, 480 },
  2203. .vfront_porch = { 3, 3, 3 },
  2204. .vback_porch = { 13, 13, 13 },
  2205. .vsync_len = { 1, 1, 4 },
  2206. .flags = DISPLAY_FLAGS_DE_HIGH,
  2207. };
  2208. static const struct panel_desc innolux_g070ace_l01 = {
  2209. .timings = &innolux_g070ace_l01_timing,
  2210. .num_timings = 1,
  2211. .bpc = 8,
  2212. .size = {
  2213. .width = 152,
  2214. .height = 91,
  2215. },
  2216. .delay = {
  2217. .prepare = 10,
  2218. .enable = 50,
  2219. .disable = 50,
  2220. .unprepare = 500,
  2221. },
  2222. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2223. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2224. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2225. };
  2226. static const struct display_timing innolux_g070y2_l01_timing = {
  2227. .pixelclock = { 28000000, 29500000, 32000000 },
  2228. .hactive = { 800, 800, 800 },
  2229. .hfront_porch = { 61, 91, 141 },
  2230. .hback_porch = { 60, 90, 140 },
  2231. .hsync_len = { 12, 12, 12 },
  2232. .vactive = { 480, 480, 480 },
  2233. .vfront_porch = { 4, 9, 30 },
  2234. .vback_porch = { 4, 8, 28 },
  2235. .vsync_len = { 2, 2, 2 },
  2236. .flags = DISPLAY_FLAGS_DE_HIGH,
  2237. };
  2238. static const struct panel_desc innolux_g070y2_l01 = {
  2239. .timings = &innolux_g070y2_l01_timing,
  2240. .num_timings = 1,
  2241. .bpc = 8,
  2242. .size = {
  2243. .width = 152,
  2244. .height = 91,
  2245. },
  2246. .delay = {
  2247. .prepare = 10,
  2248. .enable = 100,
  2249. .disable = 100,
  2250. .unprepare = 800,
  2251. },
  2252. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2253. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2254. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2255. };
  2256. static const struct display_timing innolux_g070ace_lh3_timing = {
  2257. .pixelclock = { 25200000, 25400000, 35700000 },
  2258. .hactive = { 800, 800, 800 },
  2259. .hfront_porch = { 30, 32, 87 },
  2260. .hback_porch = { 29, 31, 86 },
  2261. .hsync_len = { 1, 1, 1 },
  2262. .vactive = { 480, 480, 480 },
  2263. .vfront_porch = { 4, 5, 65 },
  2264. .vback_porch = { 3, 4, 65 },
  2265. .vsync_len = { 1, 1, 1 },
  2266. .flags = DISPLAY_FLAGS_DE_HIGH,
  2267. };
  2268. static const struct panel_desc innolux_g070ace_lh3 = {
  2269. .timings = &innolux_g070ace_lh3_timing,
  2270. .num_timings = 1,
  2271. .bpc = 8,
  2272. .size = {
  2273. .width = 152,
  2274. .height = 91,
  2275. },
  2276. .delay = {
  2277. .prepare = 10,
  2278. .enable = 450,
  2279. .disable = 200,
  2280. .unprepare = 510,
  2281. },
  2282. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2283. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2284. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2285. };
  2286. static const struct drm_display_mode innolux_g070y2_t02_mode = {
  2287. .clock = 33333,
  2288. .hdisplay = 800,
  2289. .hsync_start = 800 + 210,
  2290. .hsync_end = 800 + 210 + 20,
  2291. .htotal = 800 + 210 + 20 + 46,
  2292. .vdisplay = 480,
  2293. .vsync_start = 480 + 22,
  2294. .vsync_end = 480 + 22 + 10,
  2295. .vtotal = 480 + 22 + 23 + 10,
  2296. };
  2297. static const struct panel_desc innolux_g070y2_t02 = {
  2298. .modes = &innolux_g070y2_t02_mode,
  2299. .num_modes = 1,
  2300. .bpc = 8,
  2301. .size = {
  2302. .width = 152,
  2303. .height = 92,
  2304. },
  2305. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2306. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  2307. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2308. };
  2309. static const struct display_timing innolux_g101ice_l01_timing = {
  2310. .pixelclock = { 60400000, 71100000, 74700000 },
  2311. .hactive = { 1280, 1280, 1280 },
  2312. .hfront_porch = { 30, 60, 70 },
  2313. .hback_porch = { 30, 60, 70 },
  2314. .hsync_len = { 22, 40, 60 },
  2315. .vactive = { 800, 800, 800 },
  2316. .vfront_porch = { 3, 8, 14 },
  2317. .vback_porch = { 3, 8, 14 },
  2318. .vsync_len = { 4, 7, 12 },
  2319. .flags = DISPLAY_FLAGS_DE_HIGH,
  2320. };
  2321. static const struct panel_desc innolux_g101ice_l01 = {
  2322. .timings = &innolux_g101ice_l01_timing,
  2323. .num_timings = 1,
  2324. .bpc = 8,
  2325. .size = {
  2326. .width = 217,
  2327. .height = 135,
  2328. },
  2329. .delay = {
  2330. .enable = 200,
  2331. .disable = 200,
  2332. },
  2333. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2334. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2335. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2336. };
  2337. static const struct display_timing innolux_g121i1_l01_timing = {
  2338. .pixelclock = { 67450000, 71000000, 74550000 },
  2339. .hactive = { 1280, 1280, 1280 },
  2340. .hfront_porch = { 40, 80, 160 },
  2341. .hback_porch = { 39, 79, 159 },
  2342. .hsync_len = { 1, 1, 1 },
  2343. .vactive = { 800, 800, 800 },
  2344. .vfront_porch = { 5, 11, 100 },
  2345. .vback_porch = { 4, 11, 99 },
  2346. .vsync_len = { 1, 1, 1 },
  2347. };
  2348. static const struct panel_desc innolux_g121i1_l01 = {
  2349. .timings = &innolux_g121i1_l01_timing,
  2350. .num_timings = 1,
  2351. .bpc = 6,
  2352. .size = {
  2353. .width = 261,
  2354. .height = 163,
  2355. },
  2356. .delay = {
  2357. .enable = 200,
  2358. .disable = 20,
  2359. },
  2360. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2361. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2362. };
  2363. static const struct display_timing innolux_g121x1_l03_timings = {
  2364. .pixelclock = { 57500000, 64900000, 74400000 },
  2365. .hactive = { 1024, 1024, 1024 },
  2366. .hfront_porch = { 90, 140, 190 },
  2367. .hback_porch = { 90, 140, 190 },
  2368. .hsync_len = { 36, 40, 60 },
  2369. .vactive = { 768, 768, 768 },
  2370. .vfront_porch = { 2, 15, 30 },
  2371. .vback_porch = { 2, 15, 30 },
  2372. .vsync_len = { 2, 8, 20 },
  2373. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
  2374. };
  2375. static const struct panel_desc innolux_g121x1_l03 = {
  2376. .timings = &innolux_g121x1_l03_timings,
  2377. .num_timings = 1,
  2378. .bpc = 6,
  2379. .size = {
  2380. .width = 246,
  2381. .height = 185,
  2382. },
  2383. .delay = {
  2384. .enable = 200,
  2385. .unprepare = 200,
  2386. .disable = 400,
  2387. },
  2388. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2389. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2390. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2391. };
  2392. static const struct panel_desc innolux_g121xce_l01 = {
  2393. .timings = &innolux_g121x1_l03_timings,
  2394. .num_timings = 1,
  2395. .bpc = 8,
  2396. .size = {
  2397. .width = 246,
  2398. .height = 185,
  2399. },
  2400. .delay = {
  2401. .enable = 200,
  2402. .unprepare = 200,
  2403. .disable = 400,
  2404. },
  2405. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2406. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2407. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2408. };
  2409. static const struct display_timing innolux_g156hce_l01_timings = {
  2410. .pixelclock = { 120000000, 141860000, 150000000 },
  2411. .hactive = { 1920, 1920, 1920 },
  2412. .hfront_porch = { 80, 90, 100 },
  2413. .hback_porch = { 80, 90, 100 },
  2414. .hsync_len = { 20, 30, 30 },
  2415. .vactive = { 1080, 1080, 1080 },
  2416. .vfront_porch = { 3, 10, 20 },
  2417. .vback_porch = { 3, 10, 20 },
  2418. .vsync_len = { 4, 10, 10 },
  2419. };
  2420. static const struct panel_desc innolux_g156hce_l01 = {
  2421. .timings = &innolux_g156hce_l01_timings,
  2422. .num_timings = 1,
  2423. .bpc = 8,
  2424. .size = {
  2425. .width = 344,
  2426. .height = 194,
  2427. },
  2428. .delay = {
  2429. .prepare = 1, /* T1+T2 */
  2430. .enable = 450, /* T5 */
  2431. .disable = 200, /* T6 */
  2432. .unprepare = 10, /* T3+T7 */
  2433. },
  2434. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2435. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2436. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2437. };
  2438. static const struct drm_display_mode innolux_n156bge_l21_mode = {
  2439. .clock = 69300,
  2440. .hdisplay = 1366,
  2441. .hsync_start = 1366 + 16,
  2442. .hsync_end = 1366 + 16 + 34,
  2443. .htotal = 1366 + 16 + 34 + 50,
  2444. .vdisplay = 768,
  2445. .vsync_start = 768 + 2,
  2446. .vsync_end = 768 + 2 + 6,
  2447. .vtotal = 768 + 2 + 6 + 12,
  2448. };
  2449. static const struct panel_desc innolux_n156bge_l21 = {
  2450. .modes = &innolux_n156bge_l21_mode,
  2451. .num_modes = 1,
  2452. .bpc = 6,
  2453. .size = {
  2454. .width = 344,
  2455. .height = 193,
  2456. },
  2457. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2458. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2459. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2460. };
  2461. static const struct drm_display_mode innolux_zj070na_01p_mode = {
  2462. .clock = 51501,
  2463. .hdisplay = 1024,
  2464. .hsync_start = 1024 + 128,
  2465. .hsync_end = 1024 + 128 + 64,
  2466. .htotal = 1024 + 128 + 64 + 128,
  2467. .vdisplay = 600,
  2468. .vsync_start = 600 + 16,
  2469. .vsync_end = 600 + 16 + 4,
  2470. .vtotal = 600 + 16 + 4 + 16,
  2471. };
  2472. static const struct panel_desc innolux_zj070na_01p = {
  2473. .modes = &innolux_zj070na_01p_mode,
  2474. .num_modes = 1,
  2475. .bpc = 6,
  2476. .size = {
  2477. .width = 154,
  2478. .height = 90,
  2479. },
  2480. };
  2481. static const struct display_timing koe_tx14d24vm1bpa_timing = {
  2482. .pixelclock = { 5580000, 5850000, 6200000 },
  2483. .hactive = { 320, 320, 320 },
  2484. .hfront_porch = { 30, 30, 30 },
  2485. .hback_porch = { 30, 30, 30 },
  2486. .hsync_len = { 1, 5, 17 },
  2487. .vactive = { 240, 240, 240 },
  2488. .vfront_porch = { 6, 6, 6 },
  2489. .vback_porch = { 5, 5, 5 },
  2490. .vsync_len = { 1, 2, 11 },
  2491. .flags = DISPLAY_FLAGS_DE_HIGH,
  2492. };
  2493. static const struct panel_desc koe_tx14d24vm1bpa = {
  2494. .timings = &koe_tx14d24vm1bpa_timing,
  2495. .num_timings = 1,
  2496. .bpc = 6,
  2497. .size = {
  2498. .width = 115,
  2499. .height = 86,
  2500. },
  2501. };
  2502. static const struct display_timing koe_tx26d202vm0bwa_timing = {
  2503. .pixelclock = { 151820000, 156720000, 159780000 },
  2504. .hactive = { 1920, 1920, 1920 },
  2505. .hfront_porch = { 105, 130, 142 },
  2506. .hback_porch = { 45, 70, 82 },
  2507. .hsync_len = { 30, 30, 30 },
  2508. .vactive = { 1200, 1200, 1200},
  2509. .vfront_porch = { 3, 5, 10 },
  2510. .vback_porch = { 2, 5, 10 },
  2511. .vsync_len = { 5, 5, 5 },
  2512. .flags = DISPLAY_FLAGS_DE_HIGH,
  2513. };
  2514. static const struct panel_desc koe_tx26d202vm0bwa = {
  2515. .timings = &koe_tx26d202vm0bwa_timing,
  2516. .num_timings = 1,
  2517. .bpc = 8,
  2518. .size = {
  2519. .width = 217,
  2520. .height = 136,
  2521. },
  2522. .delay = {
  2523. .prepare = 1000,
  2524. .enable = 1000,
  2525. .unprepare = 1000,
  2526. .disable = 1000,
  2527. },
  2528. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2529. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2530. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2531. };
  2532. static const struct display_timing koe_tx31d200vm0baa_timing = {
  2533. .pixelclock = { 39600000, 43200000, 48000000 },
  2534. .hactive = { 1280, 1280, 1280 },
  2535. .hfront_porch = { 16, 36, 56 },
  2536. .hback_porch = { 16, 36, 56 },
  2537. .hsync_len = { 8, 8, 8 },
  2538. .vactive = { 480, 480, 480 },
  2539. .vfront_porch = { 6, 21, 33 },
  2540. .vback_porch = { 6, 21, 33 },
  2541. .vsync_len = { 8, 8, 8 },
  2542. .flags = DISPLAY_FLAGS_DE_HIGH,
  2543. };
  2544. static const struct panel_desc koe_tx31d200vm0baa = {
  2545. .timings = &koe_tx31d200vm0baa_timing,
  2546. .num_timings = 1,
  2547. .bpc = 6,
  2548. .size = {
  2549. .width = 292,
  2550. .height = 109,
  2551. },
  2552. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  2553. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2554. };
  2555. static const struct display_timing kyo_tcg121xglp_timing = {
  2556. .pixelclock = { 52000000, 65000000, 71000000 },
  2557. .hactive = { 1024, 1024, 1024 },
  2558. .hfront_porch = { 2, 2, 2 },
  2559. .hback_porch = { 2, 2, 2 },
  2560. .hsync_len = { 86, 124, 244 },
  2561. .vactive = { 768, 768, 768 },
  2562. .vfront_porch = { 2, 2, 2 },
  2563. .vback_porch = { 2, 2, 2 },
  2564. .vsync_len = { 6, 34, 73 },
  2565. .flags = DISPLAY_FLAGS_DE_HIGH,
  2566. };
  2567. static const struct panel_desc kyo_tcg121xglp = {
  2568. .timings = &kyo_tcg121xglp_timing,
  2569. .num_timings = 1,
  2570. .bpc = 8,
  2571. .size = {
  2572. .width = 246,
  2573. .height = 184,
  2574. },
  2575. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2576. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2577. };
  2578. static const struct drm_display_mode lemaker_bl035_rgb_002_mode = {
  2579. .clock = 7000,
  2580. .hdisplay = 320,
  2581. .hsync_start = 320 + 20,
  2582. .hsync_end = 320 + 20 + 30,
  2583. .htotal = 320 + 20 + 30 + 38,
  2584. .vdisplay = 240,
  2585. .vsync_start = 240 + 4,
  2586. .vsync_end = 240 + 4 + 3,
  2587. .vtotal = 240 + 4 + 3 + 15,
  2588. };
  2589. static const struct panel_desc lemaker_bl035_rgb_002 = {
  2590. .modes = &lemaker_bl035_rgb_002_mode,
  2591. .num_modes = 1,
  2592. .size = {
  2593. .width = 70,
  2594. .height = 52,
  2595. },
  2596. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2597. .bus_flags = DRM_BUS_FLAG_DE_LOW,
  2598. };
  2599. static const struct display_timing lg_lb070wv8_timing = {
  2600. .pixelclock = { 31950000, 33260000, 34600000 },
  2601. .hactive = { 800, 800, 800 },
  2602. .hfront_porch = { 88, 88, 88 },
  2603. .hback_porch = { 88, 88, 88 },
  2604. .hsync_len = { 80, 80, 80 },
  2605. .vactive = { 480, 480, 480 },
  2606. .vfront_porch = { 10, 10, 10 },
  2607. .vback_porch = { 10, 10, 10 },
  2608. .vsync_len = { 25, 25, 25 },
  2609. };
  2610. static const struct panel_desc lg_lb070wv8 = {
  2611. .timings = &lg_lb070wv8_timing,
  2612. .num_timings = 1,
  2613. .bpc = 8,
  2614. .size = {
  2615. .width = 151,
  2616. .height = 91,
  2617. },
  2618. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2619. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2620. };
  2621. static const struct drm_display_mode lincolntech_lcd185_101ct_mode = {
  2622. .clock = 155127,
  2623. .hdisplay = 1920,
  2624. .hsync_start = 1920 + 128,
  2625. .hsync_end = 1920 + 128 + 20,
  2626. .htotal = 1920 + 128 + 20 + 12,
  2627. .vdisplay = 1200,
  2628. .vsync_start = 1200 + 19,
  2629. .vsync_end = 1200 + 19 + 4,
  2630. .vtotal = 1200 + 19 + 4 + 20,
  2631. };
  2632. static const struct panel_desc lincolntech_lcd185_101ct = {
  2633. .modes = &lincolntech_lcd185_101ct_mode,
  2634. .bpc = 8,
  2635. .num_modes = 1,
  2636. .size = {
  2637. .width = 217,
  2638. .height = 136,
  2639. },
  2640. .delay = {
  2641. .prepare = 50,
  2642. .disable = 50,
  2643. },
  2644. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2645. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2646. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2647. };
  2648. static const struct display_timing logictechno_lt161010_2nh_timing = {
  2649. .pixelclock = { 26400000, 33300000, 46800000 },
  2650. .hactive = { 800, 800, 800 },
  2651. .hfront_porch = { 16, 210, 354 },
  2652. .hback_porch = { 46, 46, 46 },
  2653. .hsync_len = { 1, 20, 40 },
  2654. .vactive = { 480, 480, 480 },
  2655. .vfront_porch = { 7, 22, 147 },
  2656. .vback_porch = { 23, 23, 23 },
  2657. .vsync_len = { 1, 10, 20 },
  2658. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  2659. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  2660. DISPLAY_FLAGS_SYNC_POSEDGE,
  2661. };
  2662. static const struct panel_desc logictechno_lt161010_2nh = {
  2663. .timings = &logictechno_lt161010_2nh_timing,
  2664. .num_timings = 1,
  2665. .bpc = 6,
  2666. .size = {
  2667. .width = 154,
  2668. .height = 86,
  2669. },
  2670. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  2671. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  2672. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  2673. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  2674. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2675. };
  2676. static const struct display_timing logictechno_lt170410_2whc_timing = {
  2677. .pixelclock = { 68900000, 71100000, 73400000 },
  2678. .hactive = { 1280, 1280, 1280 },
  2679. .hfront_porch = { 23, 60, 71 },
  2680. .hback_porch = { 23, 60, 71 },
  2681. .hsync_len = { 15, 40, 47 },
  2682. .vactive = { 800, 800, 800 },
  2683. .vfront_porch = { 5, 7, 10 },
  2684. .vback_porch = { 5, 7, 10 },
  2685. .vsync_len = { 6, 9, 12 },
  2686. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  2687. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  2688. DISPLAY_FLAGS_SYNC_POSEDGE,
  2689. };
  2690. static const struct panel_desc logictechno_lt170410_2whc = {
  2691. .timings = &logictechno_lt170410_2whc_timing,
  2692. .num_timings = 1,
  2693. .bpc = 8,
  2694. .size = {
  2695. .width = 217,
  2696. .height = 136,
  2697. },
  2698. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2699. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2700. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2701. };
  2702. static const struct drm_display_mode logictechno_lttd800480070_l2rt_mode = {
  2703. .clock = 33000,
  2704. .hdisplay = 800,
  2705. .hsync_start = 800 + 112,
  2706. .hsync_end = 800 + 112 + 3,
  2707. .htotal = 800 + 112 + 3 + 85,
  2708. .vdisplay = 480,
  2709. .vsync_start = 480 + 38,
  2710. .vsync_end = 480 + 38 + 3,
  2711. .vtotal = 480 + 38 + 3 + 29,
  2712. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  2713. };
  2714. static const struct panel_desc logictechno_lttd800480070_l2rt = {
  2715. .modes = &logictechno_lttd800480070_l2rt_mode,
  2716. .num_modes = 1,
  2717. .bpc = 8,
  2718. .size = {
  2719. .width = 154,
  2720. .height = 86,
  2721. },
  2722. .delay = {
  2723. .prepare = 45,
  2724. .enable = 100,
  2725. .disable = 100,
  2726. .unprepare = 45
  2727. },
  2728. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2729. .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  2730. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2731. };
  2732. static const struct drm_display_mode logictechno_lttd800480070_l6wh_rt_mode = {
  2733. .clock = 33000,
  2734. .hdisplay = 800,
  2735. .hsync_start = 800 + 154,
  2736. .hsync_end = 800 + 154 + 3,
  2737. .htotal = 800 + 154 + 3 + 43,
  2738. .vdisplay = 480,
  2739. .vsync_start = 480 + 47,
  2740. .vsync_end = 480 + 47 + 3,
  2741. .vtotal = 480 + 47 + 3 + 20,
  2742. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  2743. };
  2744. static const struct panel_desc logictechno_lttd800480070_l6wh_rt = {
  2745. .modes = &logictechno_lttd800480070_l6wh_rt_mode,
  2746. .num_modes = 1,
  2747. .bpc = 8,
  2748. .size = {
  2749. .width = 154,
  2750. .height = 86,
  2751. },
  2752. .delay = {
  2753. .prepare = 45,
  2754. .enable = 100,
  2755. .disable = 100,
  2756. .unprepare = 45
  2757. },
  2758. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2759. .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  2760. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2761. };
  2762. static const struct drm_display_mode logicpd_type_28_mode = {
  2763. .clock = 9107,
  2764. .hdisplay = 480,
  2765. .hsync_start = 480 + 3,
  2766. .hsync_end = 480 + 3 + 42,
  2767. .htotal = 480 + 3 + 42 + 2,
  2768. .vdisplay = 272,
  2769. .vsync_start = 272 + 2,
  2770. .vsync_end = 272 + 2 + 11,
  2771. .vtotal = 272 + 2 + 11 + 3,
  2772. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  2773. };
  2774. static const struct panel_desc logicpd_type_28 = {
  2775. .modes = &logicpd_type_28_mode,
  2776. .num_modes = 1,
  2777. .bpc = 8,
  2778. .size = {
  2779. .width = 105,
  2780. .height = 67,
  2781. },
  2782. .delay = {
  2783. .prepare = 200,
  2784. .enable = 200,
  2785. .unprepare = 200,
  2786. .disable = 200,
  2787. },
  2788. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2789. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
  2790. DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE,
  2791. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2792. };
  2793. static const struct drm_display_mode microtips_mf_101hiebcaf0_c_mode = {
  2794. .clock = 150275,
  2795. .hdisplay = 1920,
  2796. .hsync_start = 1920 + 32,
  2797. .hsync_end = 1920 + 32 + 52,
  2798. .htotal = 1920 + 32 + 52 + 24,
  2799. .vdisplay = 1200,
  2800. .vsync_start = 1200 + 24,
  2801. .vsync_end = 1200 + 24 + 8,
  2802. .vtotal = 1200 + 24 + 8 + 3,
  2803. };
  2804. static const struct panel_desc microtips_mf_101hiebcaf0_c = {
  2805. .modes = &microtips_mf_101hiebcaf0_c_mode,
  2806. .bpc = 8,
  2807. .num_modes = 1,
  2808. .size = {
  2809. .width = 217,
  2810. .height = 136,
  2811. },
  2812. .delay = {
  2813. .prepare = 50,
  2814. .disable = 50,
  2815. },
  2816. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2817. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2818. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2819. };
  2820. static const struct drm_display_mode microtips_mf_103hieb0ga0_mode = {
  2821. .clock = 93301,
  2822. .hdisplay = 1920,
  2823. .hsync_start = 1920 + 72,
  2824. .hsync_end = 1920 + 72 + 72,
  2825. .htotal = 1920 + 72 + 72 + 72,
  2826. .vdisplay = 720,
  2827. .vsync_start = 720 + 3,
  2828. .vsync_end = 720 + 3 + 3,
  2829. .vtotal = 720 + 3 + 3 + 2,
  2830. };
  2831. static const struct panel_desc microtips_mf_103hieb0ga0 = {
  2832. .modes = &microtips_mf_103hieb0ga0_mode,
  2833. .bpc = 8,
  2834. .num_modes = 1,
  2835. .size = {
  2836. .width = 244,
  2837. .height = 92,
  2838. },
  2839. .delay = {
  2840. .prepare = 50,
  2841. .disable = 50,
  2842. },
  2843. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2844. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2845. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2846. };
  2847. static const struct drm_display_mode mitsubishi_aa070mc01_mode = {
  2848. .clock = 30400,
  2849. .hdisplay = 800,
  2850. .hsync_start = 800 + 0,
  2851. .hsync_end = 800 + 1,
  2852. .htotal = 800 + 0 + 1 + 160,
  2853. .vdisplay = 480,
  2854. .vsync_start = 480 + 0,
  2855. .vsync_end = 480 + 48 + 1,
  2856. .vtotal = 480 + 48 + 1 + 0,
  2857. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  2858. };
  2859. static const struct panel_desc mitsubishi_aa070mc01 = {
  2860. .modes = &mitsubishi_aa070mc01_mode,
  2861. .num_modes = 1,
  2862. .bpc = 8,
  2863. .size = {
  2864. .width = 152,
  2865. .height = 91,
  2866. },
  2867. .delay = {
  2868. .enable = 200,
  2869. .unprepare = 200,
  2870. .disable = 400,
  2871. },
  2872. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2873. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2874. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2875. };
  2876. static const struct drm_display_mode mitsubishi_aa084xe01_mode = {
  2877. .clock = 56234,
  2878. .hdisplay = 1024,
  2879. .hsync_start = 1024 + 24,
  2880. .hsync_end = 1024 + 24 + 63,
  2881. .htotal = 1024 + 24 + 63 + 1,
  2882. .vdisplay = 768,
  2883. .vsync_start = 768 + 3,
  2884. .vsync_end = 768 + 3 + 6,
  2885. .vtotal = 768 + 3 + 6 + 1,
  2886. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  2887. };
  2888. static const struct panel_desc mitsubishi_aa084xe01 = {
  2889. .modes = &mitsubishi_aa084xe01_mode,
  2890. .num_modes = 1,
  2891. .bpc = 8,
  2892. .size = {
  2893. .width = 1024,
  2894. .height = 768,
  2895. },
  2896. .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
  2897. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2898. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  2899. };
  2900. static const struct display_timing multi_inno_mi0700s4t_6_timing = {
  2901. .pixelclock = { 29000000, 33000000, 38000000 },
  2902. .hactive = { 800, 800, 800 },
  2903. .hfront_porch = { 180, 210, 240 },
  2904. .hback_porch = { 16, 16, 16 },
  2905. .hsync_len = { 30, 30, 30 },
  2906. .vactive = { 480, 480, 480 },
  2907. .vfront_porch = { 12, 22, 32 },
  2908. .vback_porch = { 10, 10, 10 },
  2909. .vsync_len = { 13, 13, 13 },
  2910. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  2911. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  2912. DISPLAY_FLAGS_SYNC_POSEDGE,
  2913. };
  2914. static const struct panel_desc multi_inno_mi0700s4t_6 = {
  2915. .timings = &multi_inno_mi0700s4t_6_timing,
  2916. .num_timings = 1,
  2917. .bpc = 8,
  2918. .size = {
  2919. .width = 154,
  2920. .height = 86,
  2921. },
  2922. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2923. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  2924. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  2925. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  2926. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2927. };
  2928. static const struct display_timing multi_inno_mi0800ft_9_timing = {
  2929. .pixelclock = { 32000000, 40000000, 50000000 },
  2930. .hactive = { 800, 800, 800 },
  2931. .hfront_porch = { 16, 210, 354 },
  2932. .hback_porch = { 6, 26, 45 },
  2933. .hsync_len = { 1, 20, 40 },
  2934. .vactive = { 600, 600, 600 },
  2935. .vfront_porch = { 1, 12, 77 },
  2936. .vback_porch = { 3, 13, 22 },
  2937. .vsync_len = { 1, 10, 20 },
  2938. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  2939. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  2940. DISPLAY_FLAGS_SYNC_POSEDGE,
  2941. };
  2942. static const struct panel_desc multi_inno_mi0800ft_9 = {
  2943. .timings = &multi_inno_mi0800ft_9_timing,
  2944. .num_timings = 1,
  2945. .bpc = 8,
  2946. .size = {
  2947. .width = 162,
  2948. .height = 122,
  2949. },
  2950. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  2951. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  2952. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  2953. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  2954. .connector_type = DRM_MODE_CONNECTOR_DPI,
  2955. };
  2956. static const struct display_timing multi_inno_mi1010ait_1cp_timing = {
  2957. .pixelclock = { 68900000, 70000000, 73400000 },
  2958. .hactive = { 1280, 1280, 1280 },
  2959. .hfront_porch = { 30, 60, 71 },
  2960. .hback_porch = { 30, 60, 71 },
  2961. .hsync_len = { 10, 10, 48 },
  2962. .vactive = { 800, 800, 800 },
  2963. .vfront_porch = { 5, 10, 10 },
  2964. .vback_porch = { 5, 10, 10 },
  2965. .vsync_len = { 5, 6, 13 },
  2966. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  2967. DISPLAY_FLAGS_DE_HIGH,
  2968. };
  2969. static const struct panel_desc multi_inno_mi1010ait_1cp = {
  2970. .timings = &multi_inno_mi1010ait_1cp_timing,
  2971. .num_timings = 1,
  2972. .bpc = 8,
  2973. .size = {
  2974. .width = 217,
  2975. .height = 136,
  2976. },
  2977. .delay = {
  2978. .enable = 50,
  2979. .disable = 50,
  2980. },
  2981. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  2982. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  2983. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  2984. };
  2985. static const struct display_timing nec_nl12880bc20_05_timing = {
  2986. .pixelclock = { 67000000, 71000000, 75000000 },
  2987. .hactive = { 1280, 1280, 1280 },
  2988. .hfront_porch = { 2, 30, 30 },
  2989. .hback_porch = { 6, 100, 100 },
  2990. .hsync_len = { 2, 30, 30 },
  2991. .vactive = { 800, 800, 800 },
  2992. .vfront_porch = { 5, 5, 5 },
  2993. .vback_porch = { 11, 11, 11 },
  2994. .vsync_len = { 7, 7, 7 },
  2995. };
  2996. static const struct panel_desc nec_nl12880bc20_05 = {
  2997. .timings = &nec_nl12880bc20_05_timing,
  2998. .num_timings = 1,
  2999. .bpc = 8,
  3000. .size = {
  3001. .width = 261,
  3002. .height = 163,
  3003. },
  3004. .delay = {
  3005. .enable = 50,
  3006. .disable = 50,
  3007. },
  3008. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3009. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3010. };
  3011. static const struct drm_display_mode nec_nl4827hc19_05b_mode = {
  3012. .clock = 10870,
  3013. .hdisplay = 480,
  3014. .hsync_start = 480 + 2,
  3015. .hsync_end = 480 + 2 + 41,
  3016. .htotal = 480 + 2 + 41 + 2,
  3017. .vdisplay = 272,
  3018. .vsync_start = 272 + 2,
  3019. .vsync_end = 272 + 2 + 4,
  3020. .vtotal = 272 + 2 + 4 + 2,
  3021. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3022. };
  3023. static const struct panel_desc nec_nl4827hc19_05b = {
  3024. .modes = &nec_nl4827hc19_05b_mode,
  3025. .num_modes = 1,
  3026. .bpc = 8,
  3027. .size = {
  3028. .width = 95,
  3029. .height = 54,
  3030. },
  3031. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3032. .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  3033. };
  3034. static const struct drm_display_mode netron_dy_e231732_mode = {
  3035. .clock = 66000,
  3036. .hdisplay = 1024,
  3037. .hsync_start = 1024 + 160,
  3038. .hsync_end = 1024 + 160 + 70,
  3039. .htotal = 1024 + 160 + 70 + 90,
  3040. .vdisplay = 600,
  3041. .vsync_start = 600 + 127,
  3042. .vsync_end = 600 + 127 + 20,
  3043. .vtotal = 600 + 127 + 20 + 3,
  3044. };
  3045. static const struct panel_desc netron_dy_e231732 = {
  3046. .modes = &netron_dy_e231732_mode,
  3047. .num_modes = 1,
  3048. .size = {
  3049. .width = 154,
  3050. .height = 87,
  3051. },
  3052. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3053. };
  3054. static const struct drm_display_mode newhaven_nhd_43_480272ef_atxl_mode = {
  3055. .clock = 9000,
  3056. .hdisplay = 480,
  3057. .hsync_start = 480 + 2,
  3058. .hsync_end = 480 + 2 + 41,
  3059. .htotal = 480 + 2 + 41 + 2,
  3060. .vdisplay = 272,
  3061. .vsync_start = 272 + 2,
  3062. .vsync_end = 272 + 2 + 10,
  3063. .vtotal = 272 + 2 + 10 + 2,
  3064. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3065. };
  3066. static const struct panel_desc newhaven_nhd_43_480272ef_atxl = {
  3067. .modes = &newhaven_nhd_43_480272ef_atxl_mode,
  3068. .num_modes = 1,
  3069. .bpc = 8,
  3070. .size = {
  3071. .width = 95,
  3072. .height = 54,
  3073. },
  3074. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3075. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
  3076. DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
  3077. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3078. };
  3079. static const struct display_timing nlt_nl192108ac18_02d_timing = {
  3080. .pixelclock = { 130000000, 148350000, 163000000 },
  3081. .hactive = { 1920, 1920, 1920 },
  3082. .hfront_porch = { 80, 100, 100 },
  3083. .hback_porch = { 100, 120, 120 },
  3084. .hsync_len = { 50, 60, 60 },
  3085. .vactive = { 1080, 1080, 1080 },
  3086. .vfront_porch = { 12, 30, 30 },
  3087. .vback_porch = { 4, 10, 10 },
  3088. .vsync_len = { 4, 5, 5 },
  3089. };
  3090. static const struct panel_desc nlt_nl192108ac18_02d = {
  3091. .timings = &nlt_nl192108ac18_02d_timing,
  3092. .num_timings = 1,
  3093. .bpc = 8,
  3094. .size = {
  3095. .width = 344,
  3096. .height = 194,
  3097. },
  3098. .delay = {
  3099. .unprepare = 500,
  3100. },
  3101. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3102. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3103. };
  3104. static const struct drm_display_mode nvd_9128_mode = {
  3105. .clock = 29500,
  3106. .hdisplay = 800,
  3107. .hsync_start = 800 + 130,
  3108. .hsync_end = 800 + 130 + 98,
  3109. .htotal = 800 + 0 + 130 + 98,
  3110. .vdisplay = 480,
  3111. .vsync_start = 480 + 10,
  3112. .vsync_end = 480 + 10 + 50,
  3113. .vtotal = 480 + 0 + 10 + 50,
  3114. };
  3115. static const struct panel_desc nvd_9128 = {
  3116. .modes = &nvd_9128_mode,
  3117. .num_modes = 1,
  3118. .bpc = 8,
  3119. .size = {
  3120. .width = 156,
  3121. .height = 88,
  3122. },
  3123. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3124. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3125. };
  3126. static const struct display_timing okaya_rs800480t_7x0gp_timing = {
  3127. .pixelclock = { 30000000, 30000000, 40000000 },
  3128. .hactive = { 800, 800, 800 },
  3129. .hfront_porch = { 40, 40, 40 },
  3130. .hback_porch = { 40, 40, 40 },
  3131. .hsync_len = { 1, 48, 48 },
  3132. .vactive = { 480, 480, 480 },
  3133. .vfront_porch = { 13, 13, 13 },
  3134. .vback_porch = { 29, 29, 29 },
  3135. .vsync_len = { 3, 3, 3 },
  3136. .flags = DISPLAY_FLAGS_DE_HIGH,
  3137. };
  3138. static const struct panel_desc okaya_rs800480t_7x0gp = {
  3139. .timings = &okaya_rs800480t_7x0gp_timing,
  3140. .num_timings = 1,
  3141. .bpc = 6,
  3142. .size = {
  3143. .width = 154,
  3144. .height = 87,
  3145. },
  3146. .delay = {
  3147. .prepare = 41,
  3148. .enable = 50,
  3149. .unprepare = 41,
  3150. .disable = 50,
  3151. },
  3152. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3153. };
  3154. static const struct drm_display_mode olimex_lcd_olinuxino_43ts_mode = {
  3155. .clock = 9000,
  3156. .hdisplay = 480,
  3157. .hsync_start = 480 + 5,
  3158. .hsync_end = 480 + 5 + 30,
  3159. .htotal = 480 + 5 + 30 + 10,
  3160. .vdisplay = 272,
  3161. .vsync_start = 272 + 8,
  3162. .vsync_end = 272 + 8 + 5,
  3163. .vtotal = 272 + 8 + 5 + 3,
  3164. };
  3165. static const struct panel_desc olimex_lcd_olinuxino_43ts = {
  3166. .modes = &olimex_lcd_olinuxino_43ts_mode,
  3167. .num_modes = 1,
  3168. .size = {
  3169. .width = 95,
  3170. .height = 54,
  3171. },
  3172. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3173. };
  3174. static const struct display_timing ontat_kd50g21_40nt_a1_timing = {
  3175. .pixelclock = { 30000000, 30000000, 50000000 },
  3176. .hactive = { 800, 800, 800 },
  3177. .hfront_porch = { 1, 40, 255 },
  3178. .hback_porch = { 1, 40, 87 },
  3179. .hsync_len = { 1, 48, 87 },
  3180. .vactive = { 480, 480, 480 },
  3181. .vfront_porch = { 1, 13, 255 },
  3182. .vback_porch = { 1, 29, 29 },
  3183. .vsync_len = { 3, 3, 31 },
  3184. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  3185. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
  3186. };
  3187. static const struct panel_desc ontat_kd50g21_40nt_a1 = {
  3188. .timings = &ontat_kd50g21_40nt_a1_timing,
  3189. .num_timings = 1,
  3190. .bpc = 8,
  3191. .size = {
  3192. .width = 108,
  3193. .height = 65,
  3194. },
  3195. .delay = {
  3196. .prepare = 147, /* 5 VSDs */
  3197. .enable = 147, /* 5 VSDs */
  3198. .disable = 88, /* 3 VSDs */
  3199. .unprepare = 117, /* 4 VSDs */
  3200. },
  3201. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3202. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  3203. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3204. };
  3205. /*
  3206. * 800x480 CVT. The panel appears to be quite accepting, at least as far as
  3207. * pixel clocks, but this is the timing that was being used in the Adafruit
  3208. * installation instructions.
  3209. */
  3210. static const struct drm_display_mode ontat_yx700wv03_mode = {
  3211. .clock = 29500,
  3212. .hdisplay = 800,
  3213. .hsync_start = 824,
  3214. .hsync_end = 896,
  3215. .htotal = 992,
  3216. .vdisplay = 480,
  3217. .vsync_start = 483,
  3218. .vsync_end = 493,
  3219. .vtotal = 500,
  3220. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3221. };
  3222. /*
  3223. * Specification at:
  3224. * https://www.adafruit.com/images/product-files/2406/c3163.pdf
  3225. */
  3226. static const struct panel_desc ontat_yx700wv03 = {
  3227. .modes = &ontat_yx700wv03_mode,
  3228. .num_modes = 1,
  3229. .bpc = 8,
  3230. .size = {
  3231. .width = 154,
  3232. .height = 83,
  3233. },
  3234. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3235. };
  3236. static const struct drm_display_mode ortustech_com37h3m_mode = {
  3237. .clock = 22230,
  3238. .hdisplay = 480,
  3239. .hsync_start = 480 + 40,
  3240. .hsync_end = 480 + 40 + 10,
  3241. .htotal = 480 + 40 + 10 + 40,
  3242. .vdisplay = 640,
  3243. .vsync_start = 640 + 4,
  3244. .vsync_end = 640 + 4 + 2,
  3245. .vtotal = 640 + 4 + 2 + 4,
  3246. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3247. };
  3248. static const struct panel_desc ortustech_com37h3m = {
  3249. .modes = &ortustech_com37h3m_mode,
  3250. .num_modes = 1,
  3251. .bpc = 8,
  3252. .size = {
  3253. .width = 56, /* 56.16mm */
  3254. .height = 75, /* 74.88mm */
  3255. },
  3256. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3257. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  3258. DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
  3259. };
  3260. static const struct drm_display_mode ortustech_com43h4m85ulc_mode = {
  3261. .clock = 25000,
  3262. .hdisplay = 480,
  3263. .hsync_start = 480 + 10,
  3264. .hsync_end = 480 + 10 + 10,
  3265. .htotal = 480 + 10 + 10 + 15,
  3266. .vdisplay = 800,
  3267. .vsync_start = 800 + 3,
  3268. .vsync_end = 800 + 3 + 3,
  3269. .vtotal = 800 + 3 + 3 + 3,
  3270. };
  3271. static const struct panel_desc ortustech_com43h4m85ulc = {
  3272. .modes = &ortustech_com43h4m85ulc_mode,
  3273. .num_modes = 1,
  3274. .bpc = 6,
  3275. .size = {
  3276. .width = 56,
  3277. .height = 93,
  3278. },
  3279. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3280. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  3281. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3282. };
  3283. static const struct drm_display_mode osddisplays_osd070t1718_19ts_mode = {
  3284. .clock = 33000,
  3285. .hdisplay = 800,
  3286. .hsync_start = 800 + 210,
  3287. .hsync_end = 800 + 210 + 30,
  3288. .htotal = 800 + 210 + 30 + 16,
  3289. .vdisplay = 480,
  3290. .vsync_start = 480 + 22,
  3291. .vsync_end = 480 + 22 + 13,
  3292. .vtotal = 480 + 22 + 13 + 10,
  3293. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3294. };
  3295. static const struct panel_desc osddisplays_osd070t1718_19ts = {
  3296. .modes = &osddisplays_osd070t1718_19ts_mode,
  3297. .num_modes = 1,
  3298. .bpc = 8,
  3299. .size = {
  3300. .width = 152,
  3301. .height = 91,
  3302. },
  3303. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3304. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE |
  3305. DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
  3306. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3307. };
  3308. static const struct drm_display_mode pda_91_00156_a0_mode = {
  3309. .clock = 33300,
  3310. .hdisplay = 800,
  3311. .hsync_start = 800 + 1,
  3312. .hsync_end = 800 + 1 + 64,
  3313. .htotal = 800 + 1 + 64 + 64,
  3314. .vdisplay = 480,
  3315. .vsync_start = 480 + 1,
  3316. .vsync_end = 480 + 1 + 23,
  3317. .vtotal = 480 + 1 + 23 + 22,
  3318. };
  3319. static const struct panel_desc pda_91_00156_a0 = {
  3320. .modes = &pda_91_00156_a0_mode,
  3321. .num_modes = 1,
  3322. .size = {
  3323. .width = 152,
  3324. .height = 91,
  3325. },
  3326. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3327. };
  3328. static const struct drm_display_mode powertip_ph128800t006_zhc01_mode = {
  3329. .clock = 66500,
  3330. .hdisplay = 1280,
  3331. .hsync_start = 1280 + 12,
  3332. .hsync_end = 1280 + 12 + 20,
  3333. .htotal = 1280 + 12 + 20 + 56,
  3334. .vdisplay = 800,
  3335. .vsync_start = 800 + 1,
  3336. .vsync_end = 800 + 1 + 3,
  3337. .vtotal = 800 + 1 + 3 + 20,
  3338. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  3339. };
  3340. static const struct panel_desc powertip_ph128800t006_zhc01 = {
  3341. .modes = &powertip_ph128800t006_zhc01_mode,
  3342. .num_modes = 1,
  3343. .bpc = 8,
  3344. .size = {
  3345. .width = 216,
  3346. .height = 135,
  3347. },
  3348. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3349. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3350. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3351. };
  3352. static const struct drm_display_mode powertip_ph800480t013_idf02_mode = {
  3353. .clock = 24750,
  3354. .hdisplay = 800,
  3355. .hsync_start = 800 + 54,
  3356. .hsync_end = 800 + 54 + 2,
  3357. .htotal = 800 + 54 + 2 + 44,
  3358. .vdisplay = 480,
  3359. .vsync_start = 480 + 49,
  3360. .vsync_end = 480 + 49 + 2,
  3361. .vtotal = 480 + 49 + 2 + 22,
  3362. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3363. };
  3364. static const struct panel_desc powertip_ph800480t013_idf02 = {
  3365. .modes = &powertip_ph800480t013_idf02_mode,
  3366. .num_modes = 1,
  3367. .bpc = 8,
  3368. .size = {
  3369. .width = 152,
  3370. .height = 91,
  3371. },
  3372. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  3373. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  3374. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  3375. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3376. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3377. };
  3378. static const struct drm_display_mode primeview_pm070wl4_mode = {
  3379. .clock = 32000,
  3380. .hdisplay = 800,
  3381. .hsync_start = 800 + 42,
  3382. .hsync_end = 800 + 42 + 128,
  3383. .htotal = 800 + 42 + 128 + 86,
  3384. .vdisplay = 480,
  3385. .vsync_start = 480 + 10,
  3386. .vsync_end = 480 + 10 + 2,
  3387. .vtotal = 480 + 10 + 2 + 33,
  3388. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  3389. };
  3390. static const struct panel_desc primeview_pm070wl4 = {
  3391. .modes = &primeview_pm070wl4_mode,
  3392. .num_modes = 1,
  3393. .bpc = 6,
  3394. .size = {
  3395. .width = 152,
  3396. .height = 91,
  3397. },
  3398. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  3399. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3400. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3401. };
  3402. static const struct drm_display_mode qd43003c0_40_mode = {
  3403. .clock = 9000,
  3404. .hdisplay = 480,
  3405. .hsync_start = 480 + 8,
  3406. .hsync_end = 480 + 8 + 4,
  3407. .htotal = 480 + 8 + 4 + 39,
  3408. .vdisplay = 272,
  3409. .vsync_start = 272 + 4,
  3410. .vsync_end = 272 + 4 + 10,
  3411. .vtotal = 272 + 4 + 10 + 2,
  3412. };
  3413. static const struct panel_desc qd43003c0_40 = {
  3414. .modes = &qd43003c0_40_mode,
  3415. .num_modes = 1,
  3416. .bpc = 8,
  3417. .size = {
  3418. .width = 95,
  3419. .height = 53,
  3420. },
  3421. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3422. };
  3423. static const struct drm_display_mode qishenglong_gopher2b_lcd_modes[] = {
  3424. { /* 60 Hz */
  3425. .clock = 10800,
  3426. .hdisplay = 480,
  3427. .hsync_start = 480 + 77,
  3428. .hsync_end = 480 + 77 + 41,
  3429. .htotal = 480 + 77 + 41 + 2,
  3430. .vdisplay = 272,
  3431. .vsync_start = 272 + 16,
  3432. .vsync_end = 272 + 16 + 10,
  3433. .vtotal = 272 + 16 + 10 + 2,
  3434. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3435. },
  3436. { /* 50 Hz */
  3437. .clock = 10800,
  3438. .hdisplay = 480,
  3439. .hsync_start = 480 + 17,
  3440. .hsync_end = 480 + 17 + 41,
  3441. .htotal = 480 + 17 + 41 + 2,
  3442. .vdisplay = 272,
  3443. .vsync_start = 272 + 116,
  3444. .vsync_end = 272 + 116 + 10,
  3445. .vtotal = 272 + 116 + 10 + 2,
  3446. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3447. },
  3448. };
  3449. static const struct panel_desc qishenglong_gopher2b_lcd = {
  3450. .modes = qishenglong_gopher2b_lcd_modes,
  3451. .num_modes = ARRAY_SIZE(qishenglong_gopher2b_lcd_modes),
  3452. .bpc = 8,
  3453. .size = {
  3454. .width = 95,
  3455. .height = 54,
  3456. },
  3457. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3458. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  3459. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3460. };
  3461. static const struct display_timing rocktech_rk043fn48h_timing = {
  3462. .pixelclock = { 6000000, 9000000, 12000000 },
  3463. .hactive = { 480, 480, 480 },
  3464. .hback_porch = { 8, 43, 43 },
  3465. .hfront_porch = { 2, 8, 10 },
  3466. .hsync_len = { 1, 1, 1 },
  3467. .vactive = { 272, 272, 272 },
  3468. .vback_porch = { 2, 12, 26 },
  3469. .vfront_porch = { 1, 4, 4 },
  3470. .vsync_len = { 1, 10, 10 },
  3471. .flags = DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_HSYNC_LOW |
  3472. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  3473. DISPLAY_FLAGS_SYNC_POSEDGE,
  3474. };
  3475. static const struct panel_desc rocktech_rk043fn48h = {
  3476. .timings = &rocktech_rk043fn48h_timing,
  3477. .num_timings = 1,
  3478. .bpc = 8,
  3479. .size = {
  3480. .width = 95,
  3481. .height = 54,
  3482. },
  3483. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3484. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3485. };
  3486. static const struct display_timing rocktech_rk070er9427_timing = {
  3487. .pixelclock = { 26400000, 33300000, 46800000 },
  3488. .hactive = { 800, 800, 800 },
  3489. .hfront_porch = { 16, 210, 354 },
  3490. .hback_porch = { 46, 46, 46 },
  3491. .hsync_len = { 1, 1, 1 },
  3492. .vactive = { 480, 480, 480 },
  3493. .vfront_porch = { 7, 22, 147 },
  3494. .vback_porch = { 23, 23, 23 },
  3495. .vsync_len = { 1, 1, 1 },
  3496. .flags = DISPLAY_FLAGS_DE_HIGH,
  3497. };
  3498. static const struct panel_desc rocktech_rk070er9427 = {
  3499. .timings = &rocktech_rk070er9427_timing,
  3500. .num_timings = 1,
  3501. .bpc = 6,
  3502. .size = {
  3503. .width = 154,
  3504. .height = 86,
  3505. },
  3506. .delay = {
  3507. .prepare = 41,
  3508. .enable = 50,
  3509. .unprepare = 41,
  3510. .disable = 50,
  3511. },
  3512. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3513. };
  3514. static const struct drm_display_mode rocktech_rk101ii01d_ct_mode = {
  3515. .clock = 71100,
  3516. .hdisplay = 1280,
  3517. .hsync_start = 1280 + 48,
  3518. .hsync_end = 1280 + 48 + 32,
  3519. .htotal = 1280 + 48 + 32 + 80,
  3520. .vdisplay = 800,
  3521. .vsync_start = 800 + 2,
  3522. .vsync_end = 800 + 2 + 5,
  3523. .vtotal = 800 + 2 + 5 + 16,
  3524. };
  3525. static const struct panel_desc rocktech_rk101ii01d_ct = {
  3526. .modes = &rocktech_rk101ii01d_ct_mode,
  3527. .bpc = 8,
  3528. .num_modes = 1,
  3529. .size = {
  3530. .width = 217,
  3531. .height = 136,
  3532. },
  3533. .delay = {
  3534. .prepare = 50,
  3535. .disable = 50,
  3536. },
  3537. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3538. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3539. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3540. };
  3541. static const struct display_timing samsung_ltl101al01_timing = {
  3542. .pixelclock = { 66663000, 66663000, 66663000 },
  3543. .hactive = { 1280, 1280, 1280 },
  3544. .hfront_porch = { 18, 18, 18 },
  3545. .hback_porch = { 36, 36, 36 },
  3546. .hsync_len = { 16, 16, 16 },
  3547. .vactive = { 800, 800, 800 },
  3548. .vfront_porch = { 4, 4, 4 },
  3549. .vback_porch = { 16, 16, 16 },
  3550. .vsync_len = { 3, 3, 3 },
  3551. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
  3552. };
  3553. static const struct panel_desc samsung_ltl101al01 = {
  3554. .timings = &samsung_ltl101al01_timing,
  3555. .num_timings = 1,
  3556. .bpc = 8,
  3557. .size = {
  3558. .width = 217,
  3559. .height = 135,
  3560. },
  3561. .delay = {
  3562. .prepare = 40,
  3563. .enable = 300,
  3564. .disable = 200,
  3565. .unprepare = 600,
  3566. },
  3567. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3568. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3569. };
  3570. static const struct drm_display_mode samsung_ltn101nt05_mode = {
  3571. .clock = 54030,
  3572. .hdisplay = 1024,
  3573. .hsync_start = 1024 + 24,
  3574. .hsync_end = 1024 + 24 + 136,
  3575. .htotal = 1024 + 24 + 136 + 160,
  3576. .vdisplay = 600,
  3577. .vsync_start = 600 + 3,
  3578. .vsync_end = 600 + 3 + 6,
  3579. .vtotal = 600 + 3 + 6 + 61,
  3580. };
  3581. static const struct panel_desc samsung_ltn101nt05 = {
  3582. .modes = &samsung_ltn101nt05_mode,
  3583. .num_modes = 1,
  3584. .bpc = 6,
  3585. .size = {
  3586. .width = 223,
  3587. .height = 125,
  3588. },
  3589. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  3590. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3591. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3592. };
  3593. static const struct display_timing satoz_sat050at40h12r2_timing = {
  3594. .pixelclock = {33300000, 33300000, 50000000},
  3595. .hactive = {800, 800, 800},
  3596. .hfront_porch = {16, 210, 354},
  3597. .hback_porch = {46, 46, 46},
  3598. .hsync_len = {1, 1, 40},
  3599. .vactive = {480, 480, 480},
  3600. .vfront_porch = {7, 22, 147},
  3601. .vback_porch = {23, 23, 23},
  3602. .vsync_len = {1, 1, 20},
  3603. };
  3604. static const struct panel_desc satoz_sat050at40h12r2 = {
  3605. .timings = &satoz_sat050at40h12r2_timing,
  3606. .num_timings = 1,
  3607. .bpc = 8,
  3608. .size = {
  3609. .width = 108,
  3610. .height = 65,
  3611. },
  3612. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3613. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3614. };
  3615. static const struct drm_display_mode sharp_lq070y3dg3b_mode = {
  3616. .clock = 33260,
  3617. .hdisplay = 800,
  3618. .hsync_start = 800 + 64,
  3619. .hsync_end = 800 + 64 + 128,
  3620. .htotal = 800 + 64 + 128 + 64,
  3621. .vdisplay = 480,
  3622. .vsync_start = 480 + 8,
  3623. .vsync_end = 480 + 8 + 2,
  3624. .vtotal = 480 + 8 + 2 + 35,
  3625. .flags = DISPLAY_FLAGS_PIXDATA_POSEDGE,
  3626. };
  3627. static const struct panel_desc sharp_lq070y3dg3b = {
  3628. .modes = &sharp_lq070y3dg3b_mode,
  3629. .num_modes = 1,
  3630. .bpc = 8,
  3631. .size = {
  3632. .width = 152, /* 152.4mm */
  3633. .height = 91, /* 91.4mm */
  3634. },
  3635. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3636. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  3637. DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
  3638. };
  3639. static const struct drm_display_mode sharp_lq035q7db03_mode = {
  3640. .clock = 5500,
  3641. .hdisplay = 240,
  3642. .hsync_start = 240 + 16,
  3643. .hsync_end = 240 + 16 + 7,
  3644. .htotal = 240 + 16 + 7 + 5,
  3645. .vdisplay = 320,
  3646. .vsync_start = 320 + 9,
  3647. .vsync_end = 320 + 9 + 1,
  3648. .vtotal = 320 + 9 + 1 + 7,
  3649. };
  3650. static const struct panel_desc sharp_lq035q7db03 = {
  3651. .modes = &sharp_lq035q7db03_mode,
  3652. .num_modes = 1,
  3653. .bpc = 6,
  3654. .size = {
  3655. .width = 54,
  3656. .height = 72,
  3657. },
  3658. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3659. };
  3660. static const struct display_timing sharp_lq101k1ly04_timing = {
  3661. .pixelclock = { 60000000, 65000000, 80000000 },
  3662. .hactive = { 1280, 1280, 1280 },
  3663. .hfront_porch = { 20, 20, 20 },
  3664. .hback_porch = { 20, 20, 20 },
  3665. .hsync_len = { 10, 10, 10 },
  3666. .vactive = { 800, 800, 800 },
  3667. .vfront_porch = { 4, 4, 4 },
  3668. .vback_porch = { 4, 4, 4 },
  3669. .vsync_len = { 4, 4, 4 },
  3670. .flags = DISPLAY_FLAGS_PIXDATA_POSEDGE,
  3671. };
  3672. static const struct panel_desc sharp_lq101k1ly04 = {
  3673. .timings = &sharp_lq101k1ly04_timing,
  3674. .num_timings = 1,
  3675. .bpc = 8,
  3676. .size = {
  3677. .width = 217,
  3678. .height = 136,
  3679. },
  3680. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  3681. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3682. };
  3683. static const struct drm_display_mode sharp_ls020b1dd01d_modes[] = {
  3684. { /* 50 Hz */
  3685. .clock = 3000,
  3686. .hdisplay = 240,
  3687. .hsync_start = 240 + 58,
  3688. .hsync_end = 240 + 58 + 1,
  3689. .htotal = 240 + 58 + 1 + 1,
  3690. .vdisplay = 160,
  3691. .vsync_start = 160 + 24,
  3692. .vsync_end = 160 + 24 + 10,
  3693. .vtotal = 160 + 24 + 10 + 6,
  3694. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC,
  3695. },
  3696. { /* 60 Hz */
  3697. .clock = 3000,
  3698. .hdisplay = 240,
  3699. .hsync_start = 240 + 8,
  3700. .hsync_end = 240 + 8 + 1,
  3701. .htotal = 240 + 8 + 1 + 1,
  3702. .vdisplay = 160,
  3703. .vsync_start = 160 + 24,
  3704. .vsync_end = 160 + 24 + 10,
  3705. .vtotal = 160 + 24 + 10 + 6,
  3706. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC,
  3707. },
  3708. };
  3709. static const struct panel_desc sharp_ls020b1dd01d = {
  3710. .modes = sharp_ls020b1dd01d_modes,
  3711. .num_modes = ARRAY_SIZE(sharp_ls020b1dd01d_modes),
  3712. .bpc = 6,
  3713. .size = {
  3714. .width = 42,
  3715. .height = 28,
  3716. },
  3717. .bus_format = MEDIA_BUS_FMT_RGB565_1X16,
  3718. .bus_flags = DRM_BUS_FLAG_DE_HIGH
  3719. | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE
  3720. | DRM_BUS_FLAG_SHARP_SIGNALS,
  3721. };
  3722. static const struct drm_display_mode shelly_sca07010_bfn_lnn_mode = {
  3723. .clock = 33300,
  3724. .hdisplay = 800,
  3725. .hsync_start = 800 + 1,
  3726. .hsync_end = 800 + 1 + 64,
  3727. .htotal = 800 + 1 + 64 + 64,
  3728. .vdisplay = 480,
  3729. .vsync_start = 480 + 1,
  3730. .vsync_end = 480 + 1 + 23,
  3731. .vtotal = 480 + 1 + 23 + 22,
  3732. };
  3733. static const struct panel_desc shelly_sca07010_bfn_lnn = {
  3734. .modes = &shelly_sca07010_bfn_lnn_mode,
  3735. .num_modes = 1,
  3736. .size = {
  3737. .width = 152,
  3738. .height = 91,
  3739. },
  3740. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  3741. };
  3742. static const struct drm_display_mode starry_kr070pe2t_mode = {
  3743. .clock = 33000,
  3744. .hdisplay = 800,
  3745. .hsync_start = 800 + 209,
  3746. .hsync_end = 800 + 209 + 1,
  3747. .htotal = 800 + 209 + 1 + 45,
  3748. .vdisplay = 480,
  3749. .vsync_start = 480 + 22,
  3750. .vsync_end = 480 + 22 + 1,
  3751. .vtotal = 480 + 22 + 1 + 22,
  3752. };
  3753. static const struct panel_desc starry_kr070pe2t = {
  3754. .modes = &starry_kr070pe2t_mode,
  3755. .num_modes = 1,
  3756. .bpc = 8,
  3757. .size = {
  3758. .width = 152,
  3759. .height = 86,
  3760. },
  3761. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3762. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
  3763. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3764. };
  3765. static const struct display_timing startek_kd070wvfpa_mode = {
  3766. .pixelclock = { 25200000, 27200000, 30500000 },
  3767. .hactive = { 800, 800, 800 },
  3768. .hfront_porch = { 19, 44, 115 },
  3769. .hback_porch = { 5, 16, 101 },
  3770. .hsync_len = { 1, 2, 100 },
  3771. .vactive = { 480, 480, 480 },
  3772. .vfront_porch = { 5, 43, 67 },
  3773. .vback_porch = { 5, 5, 67 },
  3774. .vsync_len = { 1, 2, 66 },
  3775. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  3776. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
  3777. DISPLAY_FLAGS_SYNC_POSEDGE,
  3778. };
  3779. static const struct panel_desc startek_kd070wvfpa = {
  3780. .timings = &startek_kd070wvfpa_mode,
  3781. .num_timings = 1,
  3782. .bpc = 8,
  3783. .size = {
  3784. .width = 152,
  3785. .height = 91,
  3786. },
  3787. .delay = {
  3788. .prepare = 20,
  3789. .enable = 200,
  3790. .disable = 200,
  3791. },
  3792. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3793. .connector_type = DRM_MODE_CONNECTOR_DPI,
  3794. .bus_flags = DRM_BUS_FLAG_DE_HIGH |
  3795. DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
  3796. DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE,
  3797. };
  3798. static const struct display_timing tsd_tst043015cmhx_timing = {
  3799. .pixelclock = { 5000000, 9000000, 12000000 },
  3800. .hactive = { 480, 480, 480 },
  3801. .hfront_porch = { 4, 5, 65 },
  3802. .hback_porch = { 36, 40, 255 },
  3803. .hsync_len = { 1, 1, 1 },
  3804. .vactive = { 272, 272, 272 },
  3805. .vfront_porch = { 2, 8, 97 },
  3806. .vback_porch = { 3, 8, 31 },
  3807. .vsync_len = { 1, 1, 1 },
  3808. .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
  3809. DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
  3810. };
  3811. static const struct panel_desc tsd_tst043015cmhx = {
  3812. .timings = &tsd_tst043015cmhx_timing,
  3813. .num_timings = 1,
  3814. .bpc = 8,
  3815. .size = {
  3816. .width = 105,
  3817. .height = 67,
  3818. },
  3819. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3820. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  3821. };
  3822. static const struct drm_display_mode tfc_s9700rtwv43tr_01b_mode = {
  3823. .clock = 30000,
  3824. .hdisplay = 800,
  3825. .hsync_start = 800 + 39,
  3826. .hsync_end = 800 + 39 + 47,
  3827. .htotal = 800 + 39 + 47 + 39,
  3828. .vdisplay = 480,
  3829. .vsync_start = 480 + 13,
  3830. .vsync_end = 480 + 13 + 2,
  3831. .vtotal = 480 + 13 + 2 + 29,
  3832. };
  3833. static const struct panel_desc tfc_s9700rtwv43tr_01b = {
  3834. .modes = &tfc_s9700rtwv43tr_01b_mode,
  3835. .num_modes = 1,
  3836. .bpc = 8,
  3837. .size = {
  3838. .width = 155,
  3839. .height = 90,
  3840. },
  3841. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3842. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  3843. };
  3844. static const struct display_timing tianma_tm070jdhg30_timing = {
  3845. .pixelclock = { 62600000, 68200000, 78100000 },
  3846. .hactive = { 1280, 1280, 1280 },
  3847. .hfront_porch = { 15, 64, 159 },
  3848. .hback_porch = { 5, 5, 5 },
  3849. .hsync_len = { 1, 1, 256 },
  3850. .vactive = { 800, 800, 800 },
  3851. .vfront_porch = { 3, 40, 99 },
  3852. .vback_porch = { 2, 2, 2 },
  3853. .vsync_len = { 1, 1, 128 },
  3854. .flags = DISPLAY_FLAGS_DE_HIGH,
  3855. };
  3856. static const struct panel_desc tianma_tm070jdhg30 = {
  3857. .timings = &tianma_tm070jdhg30_timing,
  3858. .num_timings = 1,
  3859. .bpc = 8,
  3860. .size = {
  3861. .width = 151,
  3862. .height = 95,
  3863. },
  3864. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3865. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3866. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3867. };
  3868. static const struct panel_desc tianma_tm070jvhg33 = {
  3869. .timings = &tianma_tm070jdhg30_timing,
  3870. .num_timings = 1,
  3871. .bpc = 8,
  3872. .size = {
  3873. .width = 150,
  3874. .height = 94,
  3875. },
  3876. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3877. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3878. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3879. };
  3880. static const struct display_timing tianma_tm070rvhg71_timing = {
  3881. .pixelclock = { 27700000, 29200000, 39600000 },
  3882. .hactive = { 800, 800, 800 },
  3883. .hfront_porch = { 12, 40, 212 },
  3884. .hback_porch = { 88, 88, 88 },
  3885. .hsync_len = { 1, 1, 40 },
  3886. .vactive = { 480, 480, 480 },
  3887. .vfront_porch = { 1, 13, 88 },
  3888. .vback_porch = { 32, 32, 32 },
  3889. .vsync_len = { 1, 1, 3 },
  3890. .flags = DISPLAY_FLAGS_DE_HIGH,
  3891. };
  3892. static const struct panel_desc tianma_tm070rvhg71 = {
  3893. .timings = &tianma_tm070rvhg71_timing,
  3894. .num_timings = 1,
  3895. .bpc = 8,
  3896. .size = {
  3897. .width = 154,
  3898. .height = 86,
  3899. },
  3900. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  3901. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3902. };
  3903. static const struct drm_display_mode ti_nspire_cx_lcd_mode[] = {
  3904. {
  3905. .clock = 10000,
  3906. .hdisplay = 320,
  3907. .hsync_start = 320 + 50,
  3908. .hsync_end = 320 + 50 + 6,
  3909. .htotal = 320 + 50 + 6 + 38,
  3910. .vdisplay = 240,
  3911. .vsync_start = 240 + 3,
  3912. .vsync_end = 240 + 3 + 1,
  3913. .vtotal = 240 + 3 + 1 + 17,
  3914. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  3915. },
  3916. };
  3917. static const struct panel_desc ti_nspire_cx_lcd_panel = {
  3918. .modes = ti_nspire_cx_lcd_mode,
  3919. .num_modes = 1,
  3920. .bpc = 8,
  3921. .size = {
  3922. .width = 65,
  3923. .height = 49,
  3924. },
  3925. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  3926. .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
  3927. };
  3928. static const struct drm_display_mode ti_nspire_classic_lcd_mode[] = {
  3929. {
  3930. .clock = 10000,
  3931. .hdisplay = 320,
  3932. .hsync_start = 320 + 6,
  3933. .hsync_end = 320 + 6 + 6,
  3934. .htotal = 320 + 6 + 6 + 6,
  3935. .vdisplay = 240,
  3936. .vsync_start = 240 + 0,
  3937. .vsync_end = 240 + 0 + 1,
  3938. .vtotal = 240 + 0 + 1 + 0,
  3939. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  3940. },
  3941. };
  3942. static const struct panel_desc ti_nspire_classic_lcd_panel = {
  3943. .modes = ti_nspire_classic_lcd_mode,
  3944. .num_modes = 1,
  3945. /* The grayscale panel has 8 bit for the color .. Y (black) */
  3946. .bpc = 8,
  3947. .size = {
  3948. .width = 71,
  3949. .height = 53,
  3950. },
  3951. /* This is the grayscale bus format */
  3952. .bus_format = MEDIA_BUS_FMT_Y8_1X8,
  3953. .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  3954. };
  3955. static const struct drm_display_mode toshiba_lt089ac29000_mode = {
  3956. .clock = 79500,
  3957. .hdisplay = 1280,
  3958. .hsync_start = 1280 + 192,
  3959. .hsync_end = 1280 + 192 + 128,
  3960. .htotal = 1280 + 192 + 128 + 64,
  3961. .vdisplay = 768,
  3962. .vsync_start = 768 + 20,
  3963. .vsync_end = 768 + 20 + 7,
  3964. .vtotal = 768 + 20 + 7 + 3,
  3965. };
  3966. static const struct panel_desc toshiba_lt089ac29000 = {
  3967. .modes = &toshiba_lt089ac29000_mode,
  3968. .num_modes = 1,
  3969. .size = {
  3970. .width = 194,
  3971. .height = 116,
  3972. },
  3973. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  3974. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  3975. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  3976. };
  3977. static const struct drm_display_mode tpk_f07a_0102_mode = {
  3978. .clock = 33260,
  3979. .hdisplay = 800,
  3980. .hsync_start = 800 + 40,
  3981. .hsync_end = 800 + 40 + 128,
  3982. .htotal = 800 + 40 + 128 + 88,
  3983. .vdisplay = 480,
  3984. .vsync_start = 480 + 10,
  3985. .vsync_end = 480 + 10 + 2,
  3986. .vtotal = 480 + 10 + 2 + 33,
  3987. };
  3988. static const struct panel_desc tpk_f07a_0102 = {
  3989. .modes = &tpk_f07a_0102_mode,
  3990. .num_modes = 1,
  3991. .size = {
  3992. .width = 152,
  3993. .height = 91,
  3994. },
  3995. .bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  3996. };
  3997. static const struct drm_display_mode tpk_f10a_0102_mode = {
  3998. .clock = 45000,
  3999. .hdisplay = 1024,
  4000. .hsync_start = 1024 + 176,
  4001. .hsync_end = 1024 + 176 + 5,
  4002. .htotal = 1024 + 176 + 5 + 88,
  4003. .vdisplay = 600,
  4004. .vsync_start = 600 + 20,
  4005. .vsync_end = 600 + 20 + 5,
  4006. .vtotal = 600 + 20 + 5 + 25,
  4007. };
  4008. static const struct panel_desc tpk_f10a_0102 = {
  4009. .modes = &tpk_f10a_0102_mode,
  4010. .num_modes = 1,
  4011. .size = {
  4012. .width = 223,
  4013. .height = 125,
  4014. },
  4015. };
  4016. static const struct display_timing urt_umsh_8596md_timing = {
  4017. .pixelclock = { 33260000, 33260000, 33260000 },
  4018. .hactive = { 800, 800, 800 },
  4019. .hfront_porch = { 41, 41, 41 },
  4020. .hback_porch = { 216 - 128, 216 - 128, 216 - 128 },
  4021. .hsync_len = { 71, 128, 128 },
  4022. .vactive = { 480, 480, 480 },
  4023. .vfront_porch = { 10, 10, 10 },
  4024. .vback_porch = { 35 - 2, 35 - 2, 35 - 2 },
  4025. .vsync_len = { 2, 2, 2 },
  4026. .flags = DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE |
  4027. DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
  4028. };
  4029. static const struct panel_desc urt_umsh_8596md_lvds = {
  4030. .timings = &urt_umsh_8596md_timing,
  4031. .num_timings = 1,
  4032. .bpc = 6,
  4033. .size = {
  4034. .width = 152,
  4035. .height = 91,
  4036. },
  4037. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  4038. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  4039. };
  4040. static const struct panel_desc urt_umsh_8596md_parallel = {
  4041. .timings = &urt_umsh_8596md_timing,
  4042. .num_timings = 1,
  4043. .bpc = 6,
  4044. .size = {
  4045. .width = 152,
  4046. .height = 91,
  4047. },
  4048. .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
  4049. };
  4050. static const struct drm_display_mode vivax_tpc9150_panel_mode = {
  4051. .clock = 60000,
  4052. .hdisplay = 1024,
  4053. .hsync_start = 1024 + 160,
  4054. .hsync_end = 1024 + 160 + 100,
  4055. .htotal = 1024 + 160 + 100 + 60,
  4056. .vdisplay = 600,
  4057. .vsync_start = 600 + 12,
  4058. .vsync_end = 600 + 12 + 10,
  4059. .vtotal = 600 + 12 + 10 + 13,
  4060. };
  4061. static const struct panel_desc vivax_tpc9150_panel = {
  4062. .modes = &vivax_tpc9150_panel_mode,
  4063. .num_modes = 1,
  4064. .bpc = 6,
  4065. .size = {
  4066. .width = 200,
  4067. .height = 115,
  4068. },
  4069. .bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
  4070. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  4071. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  4072. };
  4073. static const struct drm_display_mode vl050_8048nt_c01_mode = {
  4074. .clock = 33333,
  4075. .hdisplay = 800,
  4076. .hsync_start = 800 + 210,
  4077. .hsync_end = 800 + 210 + 20,
  4078. .htotal = 800 + 210 + 20 + 46,
  4079. .vdisplay = 480,
  4080. .vsync_start = 480 + 22,
  4081. .vsync_end = 480 + 22 + 10,
  4082. .vtotal = 480 + 22 + 10 + 23,
  4083. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  4084. };
  4085. static const struct panel_desc vl050_8048nt_c01 = {
  4086. .modes = &vl050_8048nt_c01_mode,
  4087. .num_modes = 1,
  4088. .bpc = 8,
  4089. .size = {
  4090. .width = 120,
  4091. .height = 76,
  4092. },
  4093. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  4094. .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
  4095. };
  4096. static const struct drm_display_mode winstar_wf35ltiacd_mode = {
  4097. .clock = 6410,
  4098. .hdisplay = 320,
  4099. .hsync_start = 320 + 20,
  4100. .hsync_end = 320 + 20 + 30,
  4101. .htotal = 320 + 20 + 30 + 38,
  4102. .vdisplay = 240,
  4103. .vsync_start = 240 + 4,
  4104. .vsync_end = 240 + 4 + 3,
  4105. .vtotal = 240 + 4 + 3 + 15,
  4106. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  4107. };
  4108. static const struct panel_desc winstar_wf35ltiacd = {
  4109. .modes = &winstar_wf35ltiacd_mode,
  4110. .num_modes = 1,
  4111. .bpc = 8,
  4112. .size = {
  4113. .width = 70,
  4114. .height = 53,
  4115. },
  4116. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  4117. };
  4118. static const struct drm_display_mode yes_optoelectronics_ytc700tlag_05_201c_mode = {
  4119. .clock = 51200,
  4120. .hdisplay = 1024,
  4121. .hsync_start = 1024 + 100,
  4122. .hsync_end = 1024 + 100 + 100,
  4123. .htotal = 1024 + 100 + 100 + 120,
  4124. .vdisplay = 600,
  4125. .vsync_start = 600 + 10,
  4126. .vsync_end = 600 + 10 + 10,
  4127. .vtotal = 600 + 10 + 10 + 15,
  4128. .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
  4129. };
  4130. static const struct panel_desc yes_optoelectronics_ytc700tlag_05_201c = {
  4131. .modes = &yes_optoelectronics_ytc700tlag_05_201c_mode,
  4132. .num_modes = 1,
  4133. .bpc = 8,
  4134. .size = {
  4135. .width = 154,
  4136. .height = 90,
  4137. },
  4138. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  4139. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
  4140. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  4141. };
  4142. static const struct drm_display_mode mchp_ac69t88a_mode = {
  4143. .clock = 25000,
  4144. .hdisplay = 800,
  4145. .hsync_start = 800 + 88,
  4146. .hsync_end = 800 + 88 + 5,
  4147. .htotal = 800 + 88 + 5 + 40,
  4148. .vdisplay = 480,
  4149. .vsync_start = 480 + 23,
  4150. .vsync_end = 480 + 23 + 5,
  4151. .vtotal = 480 + 23 + 5 + 1,
  4152. };
  4153. static const struct panel_desc mchp_ac69t88a = {
  4154. .modes = &mchp_ac69t88a_mode,
  4155. .num_modes = 1,
  4156. .bpc = 8,
  4157. .size = {
  4158. .width = 108,
  4159. .height = 65,
  4160. },
  4161. .bus_flags = DRM_BUS_FLAG_DE_HIGH,
  4162. .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA,
  4163. .connector_type = DRM_MODE_CONNECTOR_LVDS,
  4164. };
  4165. static const struct drm_display_mode arm_rtsm_mode[] = {
  4166. {
  4167. .clock = 65000,
  4168. .hdisplay = 1024,
  4169. .hsync_start = 1024 + 24,
  4170. .hsync_end = 1024 + 24 + 136,
  4171. .htotal = 1024 + 24 + 136 + 160,
  4172. .vdisplay = 768,
  4173. .vsync_start = 768 + 3,
  4174. .vsync_end = 768 + 3 + 6,
  4175. .vtotal = 768 + 3 + 6 + 29,
  4176. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  4177. },
  4178. };
  4179. static const struct panel_desc arm_rtsm = {
  4180. .modes = arm_rtsm_mode,
  4181. .num_modes = 1,
  4182. .bpc = 8,
  4183. .size = {
  4184. .width = 400,
  4185. .height = 300,
  4186. },
  4187. .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
  4188. };
  4189. static const struct of_device_id platform_of_match[] = {
  4190. {
  4191. .compatible = "ampire,am-1280800n3tzqw-t00h",
  4192. .data = &ampire_am_1280800n3tzqw_t00h,
  4193. }, {
  4194. .compatible = "ampire,am-480272h3tmqw-t01h",
  4195. .data = &ampire_am_480272h3tmqw_t01h,
  4196. }, {
  4197. .compatible = "ampire,am-800480l1tmqw-t00h",
  4198. .data = &ampire_am_800480l1tmqw_t00h,
  4199. }, {
  4200. .compatible = "ampire,am800480r3tmqwa1h",
  4201. .data = &ampire_am800480r3tmqwa1h,
  4202. }, {
  4203. .compatible = "ampire,am800600p5tmqw-tb8h",
  4204. .data = &ampire_am800600p5tmqwtb8h,
  4205. }, {
  4206. .compatible = "arm,rtsm-display",
  4207. .data = &arm_rtsm,
  4208. }, {
  4209. .compatible = "armadeus,st0700-adapt",
  4210. .data = &armadeus_st0700_adapt,
  4211. }, {
  4212. .compatible = "auo,b101aw03",
  4213. .data = &auo_b101aw03,
  4214. }, {
  4215. .compatible = "auo,b101xtn01",
  4216. .data = &auo_b101xtn01,
  4217. }, {
  4218. .compatible = "auo,b116xw03",
  4219. .data = &auo_b116xw03,
  4220. }, {
  4221. .compatible = "auo,g070vvn01",
  4222. .data = &auo_g070vvn01,
  4223. }, {
  4224. .compatible = "auo,g101evn010",
  4225. .data = &auo_g101evn010,
  4226. }, {
  4227. .compatible = "auo,g104sn02",
  4228. .data = &auo_g104sn02,
  4229. }, {
  4230. .compatible = "auo,g104stn01",
  4231. .data = &auo_g104stn01,
  4232. }, {
  4233. .compatible = "auo,g121ean01",
  4234. .data = &auo_g121ean01,
  4235. }, {
  4236. .compatible = "auo,g133han01",
  4237. .data = &auo_g133han01,
  4238. }, {
  4239. .compatible = "auo,g156han04",
  4240. .data = &auo_g156han04,
  4241. }, {
  4242. .compatible = "auo,g156xtn01",
  4243. .data = &auo_g156xtn01,
  4244. }, {
  4245. .compatible = "auo,g185han01",
  4246. .data = &auo_g185han01,
  4247. }, {
  4248. .compatible = "auo,g190ean01",
  4249. .data = &auo_g190ean01,
  4250. }, {
  4251. .compatible = "auo,p320hvn03",
  4252. .data = &auo_p320hvn03,
  4253. }, {
  4254. .compatible = "auo,t215hvn01",
  4255. .data = &auo_t215hvn01,
  4256. }, {
  4257. .compatible = "avic,tm070ddh03",
  4258. .data = &avic_tm070ddh03,
  4259. }, {
  4260. .compatible = "bananapi,s070wv20-ct16",
  4261. .data = &bananapi_s070wv20_ct16,
  4262. }, {
  4263. .compatible = "boe,bp082wx1-100",
  4264. .data = &boe_bp082wx1_100,
  4265. }, {
  4266. .compatible = "boe,bp101wx1-100",
  4267. .data = &boe_bp101wx1_100,
  4268. }, {
  4269. .compatible = "boe,ev121wxm-n10-1850",
  4270. .data = &boe_ev121wxm_n10_1850,
  4271. }, {
  4272. .compatible = "boe,hv070wsa-100",
  4273. .data = &boe_hv070wsa
  4274. }, {
  4275. .compatible = "cct,cmt430b19n00",
  4276. .data = &cct_cmt430b19n00,
  4277. }, {
  4278. .compatible = "cdtech,s043wq26h-ct7",
  4279. .data = &cdtech_s043wq26h_ct7,
  4280. }, {
  4281. .compatible = "cdtech,s070pws19hp-fc21",
  4282. .data = &cdtech_s070pws19hp_fc21,
  4283. }, {
  4284. .compatible = "cdtech,s070swv29hg-dc44",
  4285. .data = &cdtech_s070swv29hg_dc44,
  4286. }, {
  4287. .compatible = "cdtech,s070wv95-ct16",
  4288. .data = &cdtech_s070wv95_ct16,
  4289. }, {
  4290. .compatible = "chefree,ch101olhlwh-002",
  4291. .data = &chefree_ch101olhlwh_002,
  4292. }, {
  4293. .compatible = "chunghwa,claa070wp03xg",
  4294. .data = &chunghwa_claa070wp03xg,
  4295. }, {
  4296. .compatible = "chunghwa,claa101wa01a",
  4297. .data = &chunghwa_claa101wa01a
  4298. }, {
  4299. .compatible = "chunghwa,claa101wb01",
  4300. .data = &chunghwa_claa101wb01
  4301. }, {
  4302. .compatible = "dataimage,fg040346dsswbg04",
  4303. .data = &dataimage_fg040346dsswbg04,
  4304. }, {
  4305. .compatible = "dataimage,fg1001l0dsswmg01",
  4306. .data = &dataimage_fg1001l0dsswmg01,
  4307. }, {
  4308. .compatible = "dataimage,scf0700c48ggu18",
  4309. .data = &dataimage_scf0700c48ggu18,
  4310. }, {
  4311. .compatible = "dlc,dlc0700yzg-1",
  4312. .data = &dlc_dlc0700yzg_1,
  4313. }, {
  4314. .compatible = "dlc,dlc1010gig",
  4315. .data = &dlc_dlc1010gig,
  4316. }, {
  4317. .compatible = "edt,et035012dm6",
  4318. .data = &edt_et035012dm6,
  4319. }, {
  4320. .compatible = "edt,etm0350g0dh6",
  4321. .data = &edt_etm0350g0dh6,
  4322. }, {
  4323. .compatible = "edt,etm043080dh6gp",
  4324. .data = &edt_etm043080dh6gp,
  4325. }, {
  4326. .compatible = "edt,etm0430g0dh6",
  4327. .data = &edt_etm0430g0dh6,
  4328. }, {
  4329. .compatible = "edt,et057090dhu",
  4330. .data = &edt_et057090dhu,
  4331. }, {
  4332. .compatible = "edt,et070080dh6",
  4333. .data = &edt_etm0700g0dh6,
  4334. }, {
  4335. .compatible = "edt,etm0700g0dh6",
  4336. .data = &edt_etm0700g0dh6,
  4337. }, {
  4338. .compatible = "edt,etm0700g0bdh6",
  4339. .data = &edt_etm0700g0bdh6,
  4340. }, {
  4341. .compatible = "edt,etm0700g0edh6",
  4342. .data = &edt_etm0700g0bdh6,
  4343. }, {
  4344. .compatible = "edt,etml0700y5dha",
  4345. .data = &edt_etml0700y5dha,
  4346. }, {
  4347. .compatible = "edt,etml1010g3dra",
  4348. .data = &edt_etml1010g3dra,
  4349. }, {
  4350. .compatible = "edt,etmv570g2dhu",
  4351. .data = &edt_etmv570g2dhu,
  4352. }, {
  4353. .compatible = "eink,vb3300-kca",
  4354. .data = &eink_vb3300_kca,
  4355. }, {
  4356. .compatible = "evervision,vgg644804",
  4357. .data = &evervision_vgg644804,
  4358. }, {
  4359. .compatible = "evervision,vgg804821",
  4360. .data = &evervision_vgg804821,
  4361. }, {
  4362. .compatible = "foxlink,fl500wvr00-a0t",
  4363. .data = &foxlink_fl500wvr00_a0t,
  4364. }, {
  4365. .compatible = "frida,frd350h54004",
  4366. .data = &frida_frd350h54004,
  4367. }, {
  4368. .compatible = "friendlyarm,hd702e",
  4369. .data = &friendlyarm_hd702e,
  4370. }, {
  4371. .compatible = "giantplus,gpg482739qs5",
  4372. .data = &giantplus_gpg482739qs5
  4373. }, {
  4374. .compatible = "giantplus,gpm940b0",
  4375. .data = &giantplus_gpm940b0,
  4376. }, {
  4377. .compatible = "hannstar,hsd070pww1",
  4378. .data = &hannstar_hsd070pww1,
  4379. }, {
  4380. .compatible = "hannstar,hsd100pxn1",
  4381. .data = &hannstar_hsd100pxn1,
  4382. }, {
  4383. .compatible = "hannstar,hsd101pww2",
  4384. .data = &hannstar_hsd101pww2,
  4385. }, {
  4386. .compatible = "hit,tx23d38vm0caa",
  4387. .data = &hitachi_tx23d38vm0caa
  4388. }, {
  4389. .compatible = "innolux,at043tn24",
  4390. .data = &innolux_at043tn24,
  4391. }, {
  4392. .compatible = "innolux,at070tn92",
  4393. .data = &innolux_at070tn92,
  4394. }, {
  4395. .compatible = "innolux,g070ace-l01",
  4396. .data = &innolux_g070ace_l01,
  4397. }, {
  4398. .compatible = "innolux,g070ace-lh3",
  4399. .data = &innolux_g070ace_lh3,
  4400. }, {
  4401. .compatible = "innolux,g070y2-l01",
  4402. .data = &innolux_g070y2_l01,
  4403. }, {
  4404. .compatible = "innolux,g070y2-t02",
  4405. .data = &innolux_g070y2_t02,
  4406. }, {
  4407. .compatible = "innolux,g101ice-l01",
  4408. .data = &innolux_g101ice_l01
  4409. }, {
  4410. .compatible = "innolux,g121i1-l01",
  4411. .data = &innolux_g121i1_l01
  4412. }, {
  4413. .compatible = "innolux,g121x1-l03",
  4414. .data = &innolux_g121x1_l03,
  4415. }, {
  4416. .compatible = "innolux,g121xce-l01",
  4417. .data = &innolux_g121xce_l01,
  4418. }, {
  4419. .compatible = "innolux,g156hce-l01",
  4420. .data = &innolux_g156hce_l01,
  4421. }, {
  4422. .compatible = "innolux,n156bge-l21",
  4423. .data = &innolux_n156bge_l21,
  4424. }, {
  4425. .compatible = "innolux,zj070na-01p",
  4426. .data = &innolux_zj070na_01p,
  4427. }, {
  4428. .compatible = "koe,tx14d24vm1bpa",
  4429. .data = &koe_tx14d24vm1bpa,
  4430. }, {
  4431. .compatible = "koe,tx26d202vm0bwa",
  4432. .data = &koe_tx26d202vm0bwa,
  4433. }, {
  4434. .compatible = "koe,tx31d200vm0baa",
  4435. .data = &koe_tx31d200vm0baa,
  4436. }, {
  4437. .compatible = "kyo,tcg121xglp",
  4438. .data = &kyo_tcg121xglp,
  4439. }, {
  4440. .compatible = "lemaker,bl035-rgb-002",
  4441. .data = &lemaker_bl035_rgb_002,
  4442. }, {
  4443. .compatible = "lg,lb070wv8",
  4444. .data = &lg_lb070wv8,
  4445. }, {
  4446. .compatible = "lincolntech,lcd185-101ct",
  4447. .data = &lincolntech_lcd185_101ct,
  4448. }, {
  4449. .compatible = "logicpd,type28",
  4450. .data = &logicpd_type_28,
  4451. }, {
  4452. .compatible = "logictechno,lt161010-2nhc",
  4453. .data = &logictechno_lt161010_2nh,
  4454. }, {
  4455. .compatible = "logictechno,lt161010-2nhr",
  4456. .data = &logictechno_lt161010_2nh,
  4457. }, {
  4458. .compatible = "logictechno,lt170410-2whc",
  4459. .data = &logictechno_lt170410_2whc,
  4460. }, {
  4461. .compatible = "logictechno,lttd800480070-l2rt",
  4462. .data = &logictechno_lttd800480070_l2rt,
  4463. }, {
  4464. .compatible = "logictechno,lttd800480070-l6wh-rt",
  4465. .data = &logictechno_lttd800480070_l6wh_rt,
  4466. }, {
  4467. .compatible = "microtips,mf-101hiebcaf0",
  4468. .data = &microtips_mf_101hiebcaf0_c,
  4469. }, {
  4470. .compatible = "microtips,mf-103hieb0ga0",
  4471. .data = &microtips_mf_103hieb0ga0,
  4472. }, {
  4473. .compatible = "mitsubishi,aa070mc01-ca1",
  4474. .data = &mitsubishi_aa070mc01,
  4475. }, {
  4476. .compatible = "mitsubishi,aa084xe01",
  4477. .data = &mitsubishi_aa084xe01,
  4478. }, {
  4479. .compatible = "multi-inno,mi0700s4t-6",
  4480. .data = &multi_inno_mi0700s4t_6,
  4481. }, {
  4482. .compatible = "multi-inno,mi0800ft-9",
  4483. .data = &multi_inno_mi0800ft_9,
  4484. }, {
  4485. .compatible = "multi-inno,mi1010ait-1cp",
  4486. .data = &multi_inno_mi1010ait_1cp,
  4487. }, {
  4488. .compatible = "nec,nl12880bc20-05",
  4489. .data = &nec_nl12880bc20_05,
  4490. }, {
  4491. .compatible = "nec,nl4827hc19-05b",
  4492. .data = &nec_nl4827hc19_05b,
  4493. }, {
  4494. .compatible = "netron-dy,e231732",
  4495. .data = &netron_dy_e231732,
  4496. }, {
  4497. .compatible = "newhaven,nhd-4.3-480272ef-atxl",
  4498. .data = &newhaven_nhd_43_480272ef_atxl,
  4499. }, {
  4500. .compatible = "nlt,nl192108ac18-02d",
  4501. .data = &nlt_nl192108ac18_02d,
  4502. }, {
  4503. .compatible = "nvd,9128",
  4504. .data = &nvd_9128,
  4505. }, {
  4506. .compatible = "okaya,rs800480t-7x0gp",
  4507. .data = &okaya_rs800480t_7x0gp,
  4508. }, {
  4509. .compatible = "olimex,lcd-olinuxino-43-ts",
  4510. .data = &olimex_lcd_olinuxino_43ts,
  4511. }, {
  4512. .compatible = "ontat,kd50g21-40nt-a1",
  4513. .data = &ontat_kd50g21_40nt_a1,
  4514. }, {
  4515. .compatible = "ontat,yx700wv03",
  4516. .data = &ontat_yx700wv03,
  4517. }, {
  4518. .compatible = "ortustech,com37h3m05dtc",
  4519. .data = &ortustech_com37h3m,
  4520. }, {
  4521. .compatible = "ortustech,com37h3m99dtc",
  4522. .data = &ortustech_com37h3m,
  4523. }, {
  4524. .compatible = "ortustech,com43h4m85ulc",
  4525. .data = &ortustech_com43h4m85ulc,
  4526. }, {
  4527. .compatible = "osddisplays,osd070t1718-19ts",
  4528. .data = &osddisplays_osd070t1718_19ts,
  4529. }, {
  4530. .compatible = "pda,91-00156-a0",
  4531. .data = &pda_91_00156_a0,
  4532. }, {
  4533. .compatible = "powertip,ph128800t006-zhc01",
  4534. .data = &powertip_ph128800t006_zhc01,
  4535. }, {
  4536. .compatible = "powertip,ph800480t013-idf02",
  4537. .data = &powertip_ph800480t013_idf02,
  4538. }, {
  4539. .compatible = "primeview,pm070wl4",
  4540. .data = &primeview_pm070wl4,
  4541. }, {
  4542. .compatible = "qiaodian,qd43003c0-40",
  4543. .data = &qd43003c0_40,
  4544. }, {
  4545. .compatible = "qishenglong,gopher2b-lcd",
  4546. .data = &qishenglong_gopher2b_lcd,
  4547. }, {
  4548. .compatible = "rocktech,rk043fn48h",
  4549. .data = &rocktech_rk043fn48h,
  4550. }, {
  4551. .compatible = "rocktech,rk070er9427",
  4552. .data = &rocktech_rk070er9427,
  4553. }, {
  4554. .compatible = "rocktech,rk101ii01d-ct",
  4555. .data = &rocktech_rk101ii01d_ct,
  4556. }, {
  4557. .compatible = "samsung,ltl101al01",
  4558. .data = &samsung_ltl101al01,
  4559. }, {
  4560. .compatible = "samsung,ltn101nt05",
  4561. .data = &samsung_ltn101nt05,
  4562. }, {
  4563. .compatible = "satoz,sat050at40h12r2",
  4564. .data = &satoz_sat050at40h12r2,
  4565. }, {
  4566. .compatible = "sharp,lq035q7db03",
  4567. .data = &sharp_lq035q7db03,
  4568. }, {
  4569. .compatible = "sharp,lq070y3dg3b",
  4570. .data = &sharp_lq070y3dg3b,
  4571. }, {
  4572. .compatible = "sharp,lq101k1ly04",
  4573. .data = &sharp_lq101k1ly04,
  4574. }, {
  4575. .compatible = "sharp,ls020b1dd01d",
  4576. .data = &sharp_ls020b1dd01d,
  4577. }, {
  4578. .compatible = "shelly,sca07010-bfn-lnn",
  4579. .data = &shelly_sca07010_bfn_lnn,
  4580. }, {
  4581. .compatible = "starry,kr070pe2t",
  4582. .data = &starry_kr070pe2t,
  4583. }, {
  4584. .compatible = "startek,kd070wvfpa",
  4585. .data = &startek_kd070wvfpa,
  4586. }, {
  4587. .compatible = "team-source-display,tst043015cmhx",
  4588. .data = &tsd_tst043015cmhx,
  4589. }, {
  4590. .compatible = "tfc,s9700rtwv43tr-01b",
  4591. .data = &tfc_s9700rtwv43tr_01b,
  4592. }, {
  4593. .compatible = "tianma,tm070jdhg30",
  4594. .data = &tianma_tm070jdhg30,
  4595. }, {
  4596. .compatible = "tianma,tm070jvhg33",
  4597. .data = &tianma_tm070jvhg33,
  4598. }, {
  4599. .compatible = "tianma,tm070rvhg71",
  4600. .data = &tianma_tm070rvhg71,
  4601. }, {
  4602. .compatible = "ti,nspire-cx-lcd-panel",
  4603. .data = &ti_nspire_cx_lcd_panel,
  4604. }, {
  4605. .compatible = "ti,nspire-classic-lcd-panel",
  4606. .data = &ti_nspire_classic_lcd_panel,
  4607. }, {
  4608. .compatible = "toshiba,lt089ac29000",
  4609. .data = &toshiba_lt089ac29000,
  4610. }, {
  4611. .compatible = "tpk,f07a-0102",
  4612. .data = &tpk_f07a_0102,
  4613. }, {
  4614. .compatible = "tpk,f10a-0102",
  4615. .data = &tpk_f10a_0102,
  4616. }, {
  4617. .compatible = "urt,umsh-8596md-t",
  4618. .data = &urt_umsh_8596md_parallel,
  4619. }, {
  4620. .compatible = "urt,umsh-8596md-1t",
  4621. .data = &urt_umsh_8596md_parallel,
  4622. }, {
  4623. .compatible = "urt,umsh-8596md-7t",
  4624. .data = &urt_umsh_8596md_parallel,
  4625. }, {
  4626. .compatible = "urt,umsh-8596md-11t",
  4627. .data = &urt_umsh_8596md_lvds,
  4628. }, {
  4629. .compatible = "urt,umsh-8596md-19t",
  4630. .data = &urt_umsh_8596md_lvds,
  4631. }, {
  4632. .compatible = "urt,umsh-8596md-20t",
  4633. .data = &urt_umsh_8596md_parallel,
  4634. }, {
  4635. .compatible = "vivax,tpc9150-panel",
  4636. .data = &vivax_tpc9150_panel,
  4637. }, {
  4638. .compatible = "vxt,vl050-8048nt-c01",
  4639. .data = &vl050_8048nt_c01,
  4640. }, {
  4641. .compatible = "winstar,wf35ltiacd",
  4642. .data = &winstar_wf35ltiacd,
  4643. }, {
  4644. .compatible = "yes-optoelectronics,ytc700tlag-05-201c",
  4645. .data = &yes_optoelectronics_ytc700tlag_05_201c,
  4646. }, {
  4647. .compatible = "microchip,ac69t88a",
  4648. .data = &mchp_ac69t88a,
  4649. }, {
  4650. /* Must be the last entry */
  4651. .compatible = "panel-dpi",
  4652. .data = &panel_dpi,
  4653. }, {
  4654. /* sentinel */
  4655. }
  4656. };
  4657. MODULE_DEVICE_TABLE(of, platform_of_match);
  4658. static int panel_simple_platform_probe(struct platform_device *pdev)
  4659. {
  4660. const struct panel_desc *desc;
  4661. desc = of_device_get_match_data(&pdev->dev);
  4662. if (!desc)
  4663. return -ENODEV;
  4664. return panel_simple_probe(&pdev->dev, desc);
  4665. }
  4666. static void panel_simple_platform_remove(struct platform_device *pdev)
  4667. {
  4668. panel_simple_remove(&pdev->dev);
  4669. }
  4670. static void panel_simple_platform_shutdown(struct platform_device *pdev)
  4671. {
  4672. panel_simple_shutdown(&pdev->dev);
  4673. }
  4674. static const struct dev_pm_ops panel_simple_pm_ops = {
  4675. SET_RUNTIME_PM_OPS(panel_simple_suspend, panel_simple_resume, NULL)
  4676. SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
  4677. pm_runtime_force_resume)
  4678. };
  4679. static struct platform_driver panel_simple_platform_driver = {
  4680. .driver = {
  4681. .name = "panel-simple",
  4682. .of_match_table = platform_of_match,
  4683. .pm = &panel_simple_pm_ops,
  4684. },
  4685. .probe = panel_simple_platform_probe,
  4686. .remove_new = panel_simple_platform_remove,
  4687. .shutdown = panel_simple_platform_shutdown,
  4688. };
  4689. struct panel_desc_dsi {
  4690. struct panel_desc desc;
  4691. unsigned long flags;
  4692. enum mipi_dsi_pixel_format format;
  4693. unsigned int lanes;
  4694. };
  4695. static const struct drm_display_mode auo_b080uan01_mode = {
  4696. .clock = 154500,
  4697. .hdisplay = 1200,
  4698. .hsync_start = 1200 + 62,
  4699. .hsync_end = 1200 + 62 + 4,
  4700. .htotal = 1200 + 62 + 4 + 62,
  4701. .vdisplay = 1920,
  4702. .vsync_start = 1920 + 9,
  4703. .vsync_end = 1920 + 9 + 2,
  4704. .vtotal = 1920 + 9 + 2 + 8,
  4705. };
  4706. static const struct panel_desc_dsi auo_b080uan01 = {
  4707. .desc = {
  4708. .modes = &auo_b080uan01_mode,
  4709. .num_modes = 1,
  4710. .bpc = 8,
  4711. .size = {
  4712. .width = 108,
  4713. .height = 272,
  4714. },
  4715. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4716. },
  4717. .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
  4718. .format = MIPI_DSI_FMT_RGB888,
  4719. .lanes = 4,
  4720. };
  4721. static const struct drm_display_mode boe_tv080wum_nl0_mode = {
  4722. .clock = 160000,
  4723. .hdisplay = 1200,
  4724. .hsync_start = 1200 + 120,
  4725. .hsync_end = 1200 + 120 + 20,
  4726. .htotal = 1200 + 120 + 20 + 21,
  4727. .vdisplay = 1920,
  4728. .vsync_start = 1920 + 21,
  4729. .vsync_end = 1920 + 21 + 3,
  4730. .vtotal = 1920 + 21 + 3 + 18,
  4731. .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  4732. };
  4733. static const struct panel_desc_dsi boe_tv080wum_nl0 = {
  4734. .desc = {
  4735. .modes = &boe_tv080wum_nl0_mode,
  4736. .num_modes = 1,
  4737. .size = {
  4738. .width = 107,
  4739. .height = 172,
  4740. },
  4741. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4742. },
  4743. .flags = MIPI_DSI_MODE_VIDEO |
  4744. MIPI_DSI_MODE_VIDEO_BURST |
  4745. MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
  4746. .format = MIPI_DSI_FMT_RGB888,
  4747. .lanes = 4,
  4748. };
  4749. static const struct drm_display_mode lg_ld070wx3_sl01_mode = {
  4750. .clock = 71000,
  4751. .hdisplay = 800,
  4752. .hsync_start = 800 + 32,
  4753. .hsync_end = 800 + 32 + 1,
  4754. .htotal = 800 + 32 + 1 + 57,
  4755. .vdisplay = 1280,
  4756. .vsync_start = 1280 + 28,
  4757. .vsync_end = 1280 + 28 + 1,
  4758. .vtotal = 1280 + 28 + 1 + 14,
  4759. };
  4760. static const struct panel_desc_dsi lg_ld070wx3_sl01 = {
  4761. .desc = {
  4762. .modes = &lg_ld070wx3_sl01_mode,
  4763. .num_modes = 1,
  4764. .bpc = 8,
  4765. .size = {
  4766. .width = 94,
  4767. .height = 151,
  4768. },
  4769. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4770. },
  4771. .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
  4772. .format = MIPI_DSI_FMT_RGB888,
  4773. .lanes = 4,
  4774. };
  4775. static const struct drm_display_mode lg_lh500wx1_sd03_mode = {
  4776. .clock = 67000,
  4777. .hdisplay = 720,
  4778. .hsync_start = 720 + 12,
  4779. .hsync_end = 720 + 12 + 4,
  4780. .htotal = 720 + 12 + 4 + 112,
  4781. .vdisplay = 1280,
  4782. .vsync_start = 1280 + 8,
  4783. .vsync_end = 1280 + 8 + 4,
  4784. .vtotal = 1280 + 8 + 4 + 12,
  4785. };
  4786. static const struct panel_desc_dsi lg_lh500wx1_sd03 = {
  4787. .desc = {
  4788. .modes = &lg_lh500wx1_sd03_mode,
  4789. .num_modes = 1,
  4790. .bpc = 8,
  4791. .size = {
  4792. .width = 62,
  4793. .height = 110,
  4794. },
  4795. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4796. },
  4797. .flags = MIPI_DSI_MODE_VIDEO,
  4798. .format = MIPI_DSI_FMT_RGB888,
  4799. .lanes = 4,
  4800. };
  4801. static const struct drm_display_mode panasonic_vvx10f004b00_mode = {
  4802. .clock = 157200,
  4803. .hdisplay = 1920,
  4804. .hsync_start = 1920 + 154,
  4805. .hsync_end = 1920 + 154 + 16,
  4806. .htotal = 1920 + 154 + 16 + 32,
  4807. .vdisplay = 1200,
  4808. .vsync_start = 1200 + 17,
  4809. .vsync_end = 1200 + 17 + 2,
  4810. .vtotal = 1200 + 17 + 2 + 16,
  4811. };
  4812. static const struct panel_desc_dsi panasonic_vvx10f004b00 = {
  4813. .desc = {
  4814. .modes = &panasonic_vvx10f004b00_mode,
  4815. .num_modes = 1,
  4816. .bpc = 8,
  4817. .size = {
  4818. .width = 217,
  4819. .height = 136,
  4820. },
  4821. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4822. },
  4823. .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  4824. MIPI_DSI_CLOCK_NON_CONTINUOUS,
  4825. .format = MIPI_DSI_FMT_RGB888,
  4826. .lanes = 4,
  4827. };
  4828. static const struct drm_display_mode lg_acx467akm_7_mode = {
  4829. .clock = 150000,
  4830. .hdisplay = 1080,
  4831. .hsync_start = 1080 + 2,
  4832. .hsync_end = 1080 + 2 + 2,
  4833. .htotal = 1080 + 2 + 2 + 2,
  4834. .vdisplay = 1920,
  4835. .vsync_start = 1920 + 2,
  4836. .vsync_end = 1920 + 2 + 2,
  4837. .vtotal = 1920 + 2 + 2 + 2,
  4838. };
  4839. static const struct panel_desc_dsi lg_acx467akm_7 = {
  4840. .desc = {
  4841. .modes = &lg_acx467akm_7_mode,
  4842. .num_modes = 1,
  4843. .bpc = 8,
  4844. .size = {
  4845. .width = 62,
  4846. .height = 110,
  4847. },
  4848. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4849. },
  4850. .flags = 0,
  4851. .format = MIPI_DSI_FMT_RGB888,
  4852. .lanes = 4,
  4853. };
  4854. static const struct drm_display_mode osd101t2045_53ts_mode = {
  4855. .clock = 154500,
  4856. .hdisplay = 1920,
  4857. .hsync_start = 1920 + 112,
  4858. .hsync_end = 1920 + 112 + 16,
  4859. .htotal = 1920 + 112 + 16 + 32,
  4860. .vdisplay = 1200,
  4861. .vsync_start = 1200 + 16,
  4862. .vsync_end = 1200 + 16 + 2,
  4863. .vtotal = 1200 + 16 + 2 + 16,
  4864. .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
  4865. };
  4866. static const struct panel_desc_dsi osd101t2045_53ts = {
  4867. .desc = {
  4868. .modes = &osd101t2045_53ts_mode,
  4869. .num_modes = 1,
  4870. .bpc = 8,
  4871. .size = {
  4872. .width = 217,
  4873. .height = 136,
  4874. },
  4875. .connector_type = DRM_MODE_CONNECTOR_DSI,
  4876. },
  4877. .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
  4878. MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  4879. MIPI_DSI_MODE_NO_EOT_PACKET,
  4880. .format = MIPI_DSI_FMT_RGB888,
  4881. .lanes = 4,
  4882. };
  4883. static const struct of_device_id dsi_of_match[] = {
  4884. {
  4885. .compatible = "auo,b080uan01",
  4886. .data = &auo_b080uan01
  4887. }, {
  4888. .compatible = "boe,tv080wum-nl0",
  4889. .data = &boe_tv080wum_nl0
  4890. }, {
  4891. .compatible = "lg,ld070wx3-sl01",
  4892. .data = &lg_ld070wx3_sl01
  4893. }, {
  4894. .compatible = "lg,lh500wx1-sd03",
  4895. .data = &lg_lh500wx1_sd03
  4896. }, {
  4897. .compatible = "panasonic,vvx10f004b00",
  4898. .data = &panasonic_vvx10f004b00
  4899. }, {
  4900. .compatible = "lg,acx467akm-7",
  4901. .data = &lg_acx467akm_7
  4902. }, {
  4903. .compatible = "osddisplays,osd101t2045-53ts",
  4904. .data = &osd101t2045_53ts
  4905. }, {
  4906. /* sentinel */
  4907. }
  4908. };
  4909. MODULE_DEVICE_TABLE(of, dsi_of_match);
  4910. static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
  4911. {
  4912. const struct panel_desc_dsi *desc;
  4913. int err;
  4914. desc = of_device_get_match_data(&dsi->dev);
  4915. if (!desc)
  4916. return -ENODEV;
  4917. err = panel_simple_probe(&dsi->dev, &desc->desc);
  4918. if (err < 0)
  4919. return err;
  4920. dsi->mode_flags = desc->flags;
  4921. dsi->format = desc->format;
  4922. dsi->lanes = desc->lanes;
  4923. err = mipi_dsi_attach(dsi);
  4924. if (err) {
  4925. struct panel_simple *panel = mipi_dsi_get_drvdata(dsi);
  4926. drm_panel_remove(&panel->base);
  4927. }
  4928. return err;
  4929. }
  4930. static void panel_simple_dsi_remove(struct mipi_dsi_device *dsi)
  4931. {
  4932. int err;
  4933. err = mipi_dsi_detach(dsi);
  4934. if (err < 0)
  4935. dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err);
  4936. panel_simple_remove(&dsi->dev);
  4937. }
  4938. static void panel_simple_dsi_shutdown(struct mipi_dsi_device *dsi)
  4939. {
  4940. panel_simple_shutdown(&dsi->dev);
  4941. }
  4942. static struct mipi_dsi_driver panel_simple_dsi_driver = {
  4943. .driver = {
  4944. .name = "panel-simple-dsi",
  4945. .of_match_table = dsi_of_match,
  4946. .pm = &panel_simple_pm_ops,
  4947. },
  4948. .probe = panel_simple_dsi_probe,
  4949. .remove = panel_simple_dsi_remove,
  4950. .shutdown = panel_simple_dsi_shutdown,
  4951. };
  4952. static int __init panel_simple_init(void)
  4953. {
  4954. int err;
  4955. err = platform_driver_register(&panel_simple_platform_driver);
  4956. if (err < 0)
  4957. return err;
  4958. if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
  4959. err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
  4960. if (err < 0)
  4961. goto err_did_platform_register;
  4962. }
  4963. return 0;
  4964. err_did_platform_register:
  4965. platform_driver_unregister(&panel_simple_platform_driver);
  4966. return err;
  4967. }
  4968. module_init(panel_simple_init);
  4969. static void __exit panel_simple_exit(void)
  4970. {
  4971. if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
  4972. mipi_dsi_driver_unregister(&panel_simple_dsi_driver);
  4973. platform_driver_unregister(&panel_simple_platform_driver);
  4974. }
  4975. module_exit(panel_simple_exit);
  4976. MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
  4977. MODULE_DESCRIPTION("DRM Driver for Simple Panels");
  4978. MODULE_LICENSE("GPL and additional rights");