asus-wmi.c 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Asus PC WMI hotkey driver
  4. *
  5. * Copyright(C) 2010 Intel Corporation.
  6. * Copyright(C) 2010-2011 Corentin Chary <[email protected]>
  7. *
  8. * Portions based on wistron_btns.c:
  9. * Copyright (C) 2005 Miloslav Trmac <[email protected]>
  10. * Copyright (C) 2005 Bernhard Rosenkraenzer <[email protected]>
  11. * Copyright (C) 2005 Dmitry Torokhov <[email protected]>
  12. */
  13. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  14. #include <linux/acpi.h>
  15. #include <linux/backlight.h>
  16. #include <linux/debugfs.h>
  17. #include <linux/dmi.h>
  18. #include <linux/fb.h>
  19. #include <linux/hwmon.h>
  20. #include <linux/hwmon-sysfs.h>
  21. #include <linux/init.h>
  22. #include <linux/input.h>
  23. #include <linux/input/sparse-keymap.h>
  24. #include <linux/kernel.h>
  25. #include <linux/leds.h>
  26. #include <linux/module.h>
  27. #include <linux/pci.h>
  28. #include <linux/pci_hotplug.h>
  29. #include <linux/platform_data/x86/asus-wmi.h>
  30. #include <linux/platform_device.h>
  31. #include <linux/platform_profile.h>
  32. #include <linux/power_supply.h>
  33. #include <linux/rfkill.h>
  34. #include <linux/seq_file.h>
  35. #include <linux/slab.h>
  36. #include <linux/types.h>
  37. #include <linux/units.h>
  38. #include <acpi/battery.h>
  39. #include <acpi/video.h>
  40. #include "asus-wmi.h"
  41. MODULE_AUTHOR("Corentin Chary <[email protected]>");
  42. MODULE_AUTHOR("Yong Wang <[email protected]>");
  43. MODULE_DESCRIPTION("Asus Generic WMI Driver");
  44. MODULE_LICENSE("GPL");
  45. static bool fnlock_default = true;
  46. module_param(fnlock_default, bool, 0444);
  47. #define to_asus_wmi_driver(pdrv) \
  48. (container_of((pdrv), struct asus_wmi_driver, platform_driver))
  49. #define ASUS_WMI_MGMT_GUID "97845ED0-4E6D-11DE-8A39-0800200C9A66"
  50. #define NOTIFY_BRNUP_MIN 0x11
  51. #define NOTIFY_BRNUP_MAX 0x1f
  52. #define NOTIFY_BRNDOWN_MIN 0x20
  53. #define NOTIFY_BRNDOWN_MAX 0x2e
  54. #define NOTIFY_FNLOCK_TOGGLE 0x4e
  55. #define NOTIFY_KBD_DOCK_CHANGE 0x75
  56. #define NOTIFY_KBD_BRTUP 0xc4
  57. #define NOTIFY_KBD_BRTDWN 0xc5
  58. #define NOTIFY_KBD_BRTTOGGLE 0xc7
  59. #define NOTIFY_KBD_FBM 0x99
  60. #define NOTIFY_KBD_TTP 0xae
  61. #define NOTIFY_LID_FLIP 0xfa
  62. #define NOTIFY_LID_FLIP_ROG 0xbd
  63. #define ASUS_WMI_FNLOCK_BIOS_DISABLED BIT(0)
  64. #define ASUS_GPU_FAN_DESC "gpu_fan"
  65. #define ASUS_FAN_DESC "cpu_fan"
  66. #define ASUS_FAN_MFUN 0x13
  67. #define ASUS_FAN_SFUN_READ 0x06
  68. #define ASUS_FAN_SFUN_WRITE 0x07
  69. /* Based on standard hwmon pwmX_enable values */
  70. #define ASUS_FAN_CTRL_FULLSPEED 0
  71. #define ASUS_FAN_CTRL_MANUAL 1
  72. #define ASUS_FAN_CTRL_AUTO 2
  73. #define ASUS_FAN_BOOST_MODE_NORMAL 0
  74. #define ASUS_FAN_BOOST_MODE_OVERBOOST 1
  75. #define ASUS_FAN_BOOST_MODE_OVERBOOST_MASK 0x01
  76. #define ASUS_FAN_BOOST_MODE_SILENT 2
  77. #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02
  78. #define ASUS_FAN_BOOST_MODES_MASK 0x03
  79. #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0
  80. #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1
  81. #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2
  82. #define USB_INTEL_XUSB2PR 0xD0
  83. #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
  84. #define ASUS_ACPI_UID_ASUSWMI "ASUSWMI"
  85. #define ASUS_ACPI_UID_ATK "ATK"
  86. #define WMI_EVENT_QUEUE_SIZE 0x10
  87. #define WMI_EVENT_QUEUE_END 0x1
  88. #define WMI_EVENT_MASK 0xFFFF
  89. /* The WMI hotkey event value is always the same. */
  90. #define WMI_EVENT_VALUE_ATK 0xFF
  91. #define WMI_EVENT_MASK 0xFFFF
  92. #define FAN_CURVE_POINTS 8
  93. #define FAN_CURVE_BUF_LEN 32
  94. #define FAN_CURVE_DEV_CPU 0x00
  95. #define FAN_CURVE_DEV_GPU 0x01
  96. /* Mask to determine if setting temperature or percentage */
  97. #define FAN_CURVE_PWM_MASK 0x04
  98. static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
  99. static int throttle_thermal_policy_write(struct asus_wmi *);
  100. static bool ashs_present(void)
  101. {
  102. int i = 0;
  103. while (ashs_ids[i]) {
  104. if (acpi_dev_found(ashs_ids[i++]))
  105. return true;
  106. }
  107. return false;
  108. }
  109. struct bios_args {
  110. u32 arg0;
  111. u32 arg1;
  112. u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */
  113. u32 arg3;
  114. u32 arg4; /* Some ROG laptops require a full 5 input args */
  115. u32 arg5;
  116. } __packed;
  117. /*
  118. * Struct that's used for all methods called via AGFN. Naming is
  119. * identically to the AML code.
  120. */
  121. struct agfn_args {
  122. u16 mfun; /* probably "Multi-function" to be called */
  123. u16 sfun; /* probably "Sub-function" to be called */
  124. u16 len; /* size of the hole struct, including subfunction fields */
  125. u8 stas; /* not used by now */
  126. u8 err; /* zero on success */
  127. } __packed;
  128. /* struct used for calling fan read and write methods */
  129. struct agfn_fan_args {
  130. struct agfn_args agfn; /* common fields */
  131. u8 fan; /* fan number: 0: set auto mode 1: 1st fan */
  132. u32 speed; /* read: RPM/100 - write: 0-255 */
  133. } __packed;
  134. /*
  135. * <platform>/ - debugfs root directory
  136. * dev_id - current dev_id
  137. * ctrl_param - current ctrl_param
  138. * method_id - current method_id
  139. * devs - call DEVS(dev_id, ctrl_param) and print result
  140. * dsts - call DSTS(dev_id) and print result
  141. * call - call method_id(dev_id, ctrl_param) and print result
  142. */
  143. struct asus_wmi_debug {
  144. struct dentry *root;
  145. u32 method_id;
  146. u32 dev_id;
  147. u32 ctrl_param;
  148. };
  149. struct asus_rfkill {
  150. struct asus_wmi *asus;
  151. struct rfkill *rfkill;
  152. u32 dev_id;
  153. };
  154. enum fan_type {
  155. FAN_TYPE_NONE = 0,
  156. FAN_TYPE_AGFN, /* deprecated on newer platforms */
  157. FAN_TYPE_SPEC83, /* starting in Spec 8.3, use CPU_FAN_CTRL */
  158. };
  159. struct fan_curve_data {
  160. bool enabled;
  161. u32 device_id;
  162. u8 temps[FAN_CURVE_POINTS];
  163. u8 percents[FAN_CURVE_POINTS];
  164. };
  165. struct asus_wmi {
  166. int dsts_id;
  167. int spec;
  168. int sfun;
  169. bool wmi_event_queue;
  170. struct input_dev *inputdev;
  171. struct backlight_device *backlight_device;
  172. struct platform_device *platform_device;
  173. struct led_classdev wlan_led;
  174. int wlan_led_wk;
  175. struct led_classdev tpd_led;
  176. int tpd_led_wk;
  177. struct led_classdev kbd_led;
  178. int kbd_led_wk;
  179. struct led_classdev lightbar_led;
  180. int lightbar_led_wk;
  181. struct led_classdev micmute_led;
  182. struct workqueue_struct *led_workqueue;
  183. struct work_struct tpd_led_work;
  184. struct work_struct wlan_led_work;
  185. struct work_struct lightbar_led_work;
  186. struct asus_rfkill wlan;
  187. struct asus_rfkill bluetooth;
  188. struct asus_rfkill wimax;
  189. struct asus_rfkill wwan3g;
  190. struct asus_rfkill gps;
  191. struct asus_rfkill uwb;
  192. int tablet_switch_event_code;
  193. u32 tablet_switch_dev_id;
  194. bool tablet_switch_inverted;
  195. enum fan_type fan_type;
  196. enum fan_type gpu_fan_type;
  197. int fan_pwm_mode;
  198. int gpu_fan_pwm_mode;
  199. int agfn_pwm;
  200. bool fan_boost_mode_available;
  201. u8 fan_boost_mode_mask;
  202. u8 fan_boost_mode;
  203. bool egpu_enable_available;
  204. bool dgpu_disable_available;
  205. bool gpu_mux_mode_available;
  206. bool kbd_rgb_mode_available;
  207. bool kbd_rgb_state_available;
  208. bool throttle_thermal_policy_available;
  209. u8 throttle_thermal_policy_mode;
  210. bool cpu_fan_curve_available;
  211. bool gpu_fan_curve_available;
  212. struct fan_curve_data custom_fan_curves[2];
  213. struct platform_profile_handler platform_profile_handler;
  214. bool platform_profile_support;
  215. // The RSOC controls the maximum charging percentage.
  216. bool battery_rsoc_available;
  217. bool panel_overdrive_available;
  218. struct hotplug_slot hotplug_slot;
  219. struct mutex hotplug_lock;
  220. struct mutex wmi_lock;
  221. struct workqueue_struct *hotplug_workqueue;
  222. struct work_struct hotplug_work;
  223. bool fnlock_locked;
  224. struct asus_wmi_debug debug;
  225. struct asus_wmi_driver *driver;
  226. };
  227. /* WMI ************************************************************************/
  228. static int asus_wmi_evaluate_method3(u32 method_id,
  229. u32 arg0, u32 arg1, u32 arg2, u32 *retval)
  230. {
  231. struct bios_args args = {
  232. .arg0 = arg0,
  233. .arg1 = arg1,
  234. .arg2 = arg2,
  235. };
  236. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  237. struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
  238. acpi_status status;
  239. union acpi_object *obj;
  240. u32 tmp = 0;
  241. status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
  242. &input, &output);
  243. if (ACPI_FAILURE(status))
  244. return -EIO;
  245. obj = (union acpi_object *)output.pointer;
  246. if (obj && obj->type == ACPI_TYPE_INTEGER)
  247. tmp = (u32) obj->integer.value;
  248. if (retval)
  249. *retval = tmp;
  250. kfree(obj);
  251. if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
  252. return -ENODEV;
  253. return 0;
  254. }
  255. int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval)
  256. {
  257. return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval);
  258. }
  259. EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method);
  260. static int asus_wmi_evaluate_method5(u32 method_id,
  261. u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 *retval)
  262. {
  263. struct bios_args args = {
  264. .arg0 = arg0,
  265. .arg1 = arg1,
  266. .arg2 = arg2,
  267. .arg3 = arg3,
  268. .arg4 = arg4,
  269. };
  270. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  271. struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
  272. acpi_status status;
  273. union acpi_object *obj;
  274. u32 tmp = 0;
  275. status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
  276. &input, &output);
  277. if (ACPI_FAILURE(status))
  278. return -EIO;
  279. obj = (union acpi_object *)output.pointer;
  280. if (obj && obj->type == ACPI_TYPE_INTEGER)
  281. tmp = (u32) obj->integer.value;
  282. if (retval)
  283. *retval = tmp;
  284. kfree(obj);
  285. if (tmp == ASUS_WMI_UNSUPPORTED_METHOD)
  286. return -ENODEV;
  287. return 0;
  288. }
  289. /*
  290. * Returns as an error if the method output is not a buffer. Typically this
  291. * means that the method called is unsupported.
  292. */
  293. static int asus_wmi_evaluate_method_buf(u32 method_id,
  294. u32 arg0, u32 arg1, u8 *ret_buffer, size_t size)
  295. {
  296. struct bios_args args = {
  297. .arg0 = arg0,
  298. .arg1 = arg1,
  299. .arg2 = 0,
  300. };
  301. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  302. struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
  303. acpi_status status;
  304. union acpi_object *obj;
  305. int err = 0;
  306. status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, 0, method_id,
  307. &input, &output);
  308. if (ACPI_FAILURE(status))
  309. return -EIO;
  310. obj = (union acpi_object *)output.pointer;
  311. switch (obj->type) {
  312. case ACPI_TYPE_BUFFER:
  313. if (obj->buffer.length > size) {
  314. err = -ENOSPC;
  315. break;
  316. }
  317. if (obj->buffer.length == 0) {
  318. err = -ENODATA;
  319. break;
  320. }
  321. memcpy(ret_buffer, obj->buffer.pointer, obj->buffer.length);
  322. break;
  323. case ACPI_TYPE_INTEGER:
  324. err = (u32)obj->integer.value;
  325. if (err == ASUS_WMI_UNSUPPORTED_METHOD)
  326. err = -ENODEV;
  327. /*
  328. * At least one method returns a 0 with no buffer if no arg
  329. * is provided, such as ASUS_WMI_DEVID_CPU_FAN_CURVE
  330. */
  331. if (err == 0)
  332. err = -ENODATA;
  333. break;
  334. default:
  335. err = -ENODATA;
  336. break;
  337. }
  338. kfree(obj);
  339. if (err)
  340. return err;
  341. return 0;
  342. }
  343. static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args)
  344. {
  345. struct acpi_buffer input;
  346. u64 phys_addr;
  347. u32 retval;
  348. u32 status;
  349. /*
  350. * Copy to dma capable address otherwise memory corruption occurs as
  351. * bios has to be able to access it.
  352. */
  353. input.pointer = kmemdup(args.pointer, args.length, GFP_DMA | GFP_KERNEL);
  354. input.length = args.length;
  355. if (!input.pointer)
  356. return -ENOMEM;
  357. phys_addr = virt_to_phys(input.pointer);
  358. status = asus_wmi_evaluate_method(ASUS_WMI_METHODID_AGFN,
  359. phys_addr, 0, &retval);
  360. if (!status)
  361. memcpy(args.pointer, input.pointer, args.length);
  362. kfree(input.pointer);
  363. if (status)
  364. return -ENXIO;
  365. return retval;
  366. }
  367. static int asus_wmi_get_devstate(struct asus_wmi *asus, u32 dev_id, u32 *retval)
  368. {
  369. return asus_wmi_evaluate_method(asus->dsts_id, dev_id, 0, retval);
  370. }
  371. static int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param,
  372. u32 *retval)
  373. {
  374. return asus_wmi_evaluate_method(ASUS_WMI_METHODID_DEVS, dev_id,
  375. ctrl_param, retval);
  376. }
  377. /* Helper for special devices with magic return codes */
  378. static int asus_wmi_get_devstate_bits(struct asus_wmi *asus,
  379. u32 dev_id, u32 mask)
  380. {
  381. u32 retval = 0;
  382. int err;
  383. err = asus_wmi_get_devstate(asus, dev_id, &retval);
  384. if (err < 0)
  385. return err;
  386. if (!(retval & ASUS_WMI_DSTS_PRESENCE_BIT))
  387. return -ENODEV;
  388. if (mask == ASUS_WMI_DSTS_STATUS_BIT) {
  389. if (retval & ASUS_WMI_DSTS_UNKNOWN_BIT)
  390. return -ENODEV;
  391. }
  392. return retval & mask;
  393. }
  394. static int asus_wmi_get_devstate_simple(struct asus_wmi *asus, u32 dev_id)
  395. {
  396. return asus_wmi_get_devstate_bits(asus, dev_id,
  397. ASUS_WMI_DSTS_STATUS_BIT);
  398. }
  399. static bool asus_wmi_dev_is_present(struct asus_wmi *asus, u32 dev_id)
  400. {
  401. u32 retval;
  402. int status = asus_wmi_get_devstate(asus, dev_id, &retval);
  403. return status == 0 && (retval & ASUS_WMI_DSTS_PRESENCE_BIT);
  404. }
  405. /* Input **********************************************************************/
  406. static void asus_wmi_tablet_sw_report(struct asus_wmi *asus, bool value)
  407. {
  408. input_report_switch(asus->inputdev, SW_TABLET_MODE,
  409. asus->tablet_switch_inverted ? !value : value);
  410. input_sync(asus->inputdev);
  411. }
  412. static void asus_wmi_tablet_sw_init(struct asus_wmi *asus, u32 dev_id, int event_code)
  413. {
  414. struct device *dev = &asus->platform_device->dev;
  415. int result;
  416. result = asus_wmi_get_devstate_simple(asus, dev_id);
  417. if (result >= 0) {
  418. input_set_capability(asus->inputdev, EV_SW, SW_TABLET_MODE);
  419. asus_wmi_tablet_sw_report(asus, result);
  420. asus->tablet_switch_dev_id = dev_id;
  421. asus->tablet_switch_event_code = event_code;
  422. } else if (result == -ENODEV) {
  423. dev_err(dev, "This device has tablet-mode-switch quirk but got ENODEV checking it. This is a bug.");
  424. } else {
  425. dev_err(dev, "Error checking for tablet-mode-switch: %d\n", result);
  426. }
  427. }
  428. static int asus_wmi_input_init(struct asus_wmi *asus)
  429. {
  430. struct device *dev = &asus->platform_device->dev;
  431. int err;
  432. asus->inputdev = input_allocate_device();
  433. if (!asus->inputdev)
  434. return -ENOMEM;
  435. asus->inputdev->name = asus->driver->input_name;
  436. asus->inputdev->phys = asus->driver->input_phys;
  437. asus->inputdev->id.bustype = BUS_HOST;
  438. asus->inputdev->dev.parent = dev;
  439. set_bit(EV_REP, asus->inputdev->evbit);
  440. err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL);
  441. if (err)
  442. goto err_free_dev;
  443. switch (asus->driver->quirks->tablet_switch_mode) {
  444. case asus_wmi_no_tablet_switch:
  445. break;
  446. case asus_wmi_kbd_dock_devid:
  447. asus->tablet_switch_inverted = true;
  448. asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_KBD_DOCK, NOTIFY_KBD_DOCK_CHANGE);
  449. break;
  450. case asus_wmi_lid_flip_devid:
  451. asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP, NOTIFY_LID_FLIP);
  452. break;
  453. case asus_wmi_lid_flip_rog_devid:
  454. asus_wmi_tablet_sw_init(asus, ASUS_WMI_DEVID_LID_FLIP_ROG, NOTIFY_LID_FLIP_ROG);
  455. break;
  456. }
  457. err = input_register_device(asus->inputdev);
  458. if (err)
  459. goto err_free_dev;
  460. return 0;
  461. err_free_dev:
  462. input_free_device(asus->inputdev);
  463. return err;
  464. }
  465. static void asus_wmi_input_exit(struct asus_wmi *asus)
  466. {
  467. if (asus->inputdev)
  468. input_unregister_device(asus->inputdev);
  469. asus->inputdev = NULL;
  470. }
  471. /* Tablet mode ****************************************************************/
  472. static void asus_wmi_tablet_mode_get_state(struct asus_wmi *asus)
  473. {
  474. int result;
  475. if (!asus->tablet_switch_dev_id)
  476. return;
  477. result = asus_wmi_get_devstate_simple(asus, asus->tablet_switch_dev_id);
  478. if (result >= 0)
  479. asus_wmi_tablet_sw_report(asus, result);
  480. }
  481. /* dGPU ********************************************************************/
  482. static ssize_t dgpu_disable_show(struct device *dev,
  483. struct device_attribute *attr, char *buf)
  484. {
  485. struct asus_wmi *asus = dev_get_drvdata(dev);
  486. int result;
  487. result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_DGPU);
  488. if (result < 0)
  489. return result;
  490. return sysfs_emit(buf, "%d\n", result);
  491. }
  492. /*
  493. * A user may be required to store the value twice, typcial store first, then
  494. * rescan PCI bus to activate power, then store a second time to save correctly.
  495. * The reason for this is that an extra code path in the ACPI is enabled when
  496. * the device and bus are powered.
  497. */
  498. static ssize_t dgpu_disable_store(struct device *dev,
  499. struct device_attribute *attr,
  500. const char *buf, size_t count)
  501. {
  502. int result, err;
  503. u32 disable;
  504. struct asus_wmi *asus = dev_get_drvdata(dev);
  505. result = kstrtou32(buf, 10, &disable);
  506. if (result)
  507. return result;
  508. if (disable > 1)
  509. return -EINVAL;
  510. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, disable, &result);
  511. if (err) {
  512. pr_warn("Failed to set dgpu disable: %d\n", err);
  513. return err;
  514. }
  515. if (result > 1) {
  516. pr_warn("Failed to set dgpu disable (result): 0x%x\n", result);
  517. return -EIO;
  518. }
  519. sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_disable");
  520. return count;
  521. }
  522. static DEVICE_ATTR_RW(dgpu_disable);
  523. /* eGPU ********************************************************************/
  524. static ssize_t egpu_enable_show(struct device *dev,
  525. struct device_attribute *attr, char *buf)
  526. {
  527. struct asus_wmi *asus = dev_get_drvdata(dev);
  528. int result;
  529. result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU);
  530. if (result < 0)
  531. return result;
  532. return sysfs_emit(buf, "%d\n", result);
  533. }
  534. /* The ACPI call to enable the eGPU also disables the internal dGPU */
  535. static ssize_t egpu_enable_store(struct device *dev,
  536. struct device_attribute *attr,
  537. const char *buf, size_t count)
  538. {
  539. int result, err;
  540. u32 enable;
  541. struct asus_wmi *asus = dev_get_drvdata(dev);
  542. err = kstrtou32(buf, 10, &enable);
  543. if (err)
  544. return err;
  545. if (enable > 1)
  546. return -EINVAL;
  547. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, enable, &result);
  548. if (err) {
  549. pr_warn("Failed to set egpu disable: %d\n", err);
  550. return err;
  551. }
  552. if (result > 1) {
  553. pr_warn("Failed to set egpu disable (retval): 0x%x\n", result);
  554. return -EIO;
  555. }
  556. sysfs_notify(&asus->platform_device->dev.kobj, NULL, "egpu_enable");
  557. return count;
  558. }
  559. static DEVICE_ATTR_RW(egpu_enable);
  560. /* gpu mux switch *************************************************************/
  561. static ssize_t gpu_mux_mode_show(struct device *dev,
  562. struct device_attribute *attr, char *buf)
  563. {
  564. struct asus_wmi *asus = dev_get_drvdata(dev);
  565. int result;
  566. result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX);
  567. if (result < 0)
  568. return result;
  569. return sysfs_emit(buf, "%d\n", result);
  570. }
  571. static ssize_t gpu_mux_mode_store(struct device *dev,
  572. struct device_attribute *attr,
  573. const char *buf, size_t count)
  574. {
  575. struct asus_wmi *asus = dev_get_drvdata(dev);
  576. int result, err;
  577. u32 optimus;
  578. err = kstrtou32(buf, 10, &optimus);
  579. if (err)
  580. return err;
  581. if (optimus > 1)
  582. return -EINVAL;
  583. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_MUX, optimus, &result);
  584. if (err) {
  585. dev_err(dev, "Failed to set GPU MUX mode: %d\n", err);
  586. return err;
  587. }
  588. /* !1 is considered a fail by ASUS */
  589. if (result != 1) {
  590. dev_warn(dev, "Failed to set GPU MUX mode (result): 0x%x\n", result);
  591. return -EIO;
  592. }
  593. sysfs_notify(&asus->platform_device->dev.kobj, NULL, "gpu_mux_mode");
  594. return count;
  595. }
  596. static DEVICE_ATTR_RW(gpu_mux_mode);
  597. /* TUF Laptop Keyboard RGB Modes **********************************************/
  598. static ssize_t kbd_rgb_mode_store(struct device *dev,
  599. struct device_attribute *attr,
  600. const char *buf, size_t count)
  601. {
  602. u32 cmd, mode, r, g, b, speed;
  603. int err;
  604. if (sscanf(buf, "%d %d %d %d %d %d", &cmd, &mode, &r, &g, &b, &speed) != 6)
  605. return -EINVAL;
  606. /* B3 is set and B4 is save to BIOS */
  607. switch (cmd) {
  608. case 0:
  609. cmd = 0xb3;
  610. break;
  611. case 1:
  612. cmd = 0xb4;
  613. break;
  614. default:
  615. return -EINVAL;
  616. }
  617. /* These are the known usable modes across all TUF/ROG */
  618. if (mode >= 12 || mode == 9)
  619. mode = 10;
  620. switch (speed) {
  621. case 0:
  622. speed = 0xe1;
  623. break;
  624. case 1:
  625. speed = 0xeb;
  626. break;
  627. case 2:
  628. speed = 0xf5;
  629. break;
  630. default:
  631. speed = 0xeb;
  632. }
  633. err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_TUF_RGB_MODE,
  634. cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL);
  635. if (err)
  636. return err;
  637. return count;
  638. }
  639. static DEVICE_ATTR_WO(kbd_rgb_mode);
  640. static ssize_t kbd_rgb_mode_index_show(struct device *device,
  641. struct device_attribute *attr,
  642. char *buf)
  643. {
  644. return sysfs_emit(buf, "%s\n", "cmd mode red green blue speed");
  645. }
  646. static DEVICE_ATTR_RO(kbd_rgb_mode_index);
  647. static struct attribute *kbd_rgb_mode_attrs[] = {
  648. &dev_attr_kbd_rgb_mode.attr,
  649. &dev_attr_kbd_rgb_mode_index.attr,
  650. NULL,
  651. };
  652. static const struct attribute_group kbd_rgb_mode_group = {
  653. .attrs = kbd_rgb_mode_attrs,
  654. };
  655. /* TUF Laptop Keyboard RGB State **********************************************/
  656. static ssize_t kbd_rgb_state_store(struct device *dev,
  657. struct device_attribute *attr,
  658. const char *buf, size_t count)
  659. {
  660. u32 flags, cmd, boot, awake, sleep, keyboard;
  661. int err;
  662. if (sscanf(buf, "%d %d %d %d %d", &cmd, &boot, &awake, &sleep, &keyboard) != 5)
  663. return -EINVAL;
  664. if (cmd)
  665. cmd = BIT(2);
  666. flags = 0;
  667. if (boot)
  668. flags |= BIT(1);
  669. if (awake)
  670. flags |= BIT(3);
  671. if (sleep)
  672. flags |= BIT(5);
  673. if (keyboard)
  674. flags |= BIT(7);
  675. /* 0xbd is the required default arg0 for the method. Nothing happens otherwise */
  676. err = asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS,
  677. ASUS_WMI_DEVID_TUF_RGB_STATE, 0xbd | cmd << 8 | (flags << 16), 0, NULL);
  678. if (err)
  679. return err;
  680. return count;
  681. }
  682. static DEVICE_ATTR_WO(kbd_rgb_state);
  683. static ssize_t kbd_rgb_state_index_show(struct device *device,
  684. struct device_attribute *attr,
  685. char *buf)
  686. {
  687. return sysfs_emit(buf, "%s\n", "cmd boot awake sleep keyboard");
  688. }
  689. static DEVICE_ATTR_RO(kbd_rgb_state_index);
  690. static struct attribute *kbd_rgb_state_attrs[] = {
  691. &dev_attr_kbd_rgb_state.attr,
  692. &dev_attr_kbd_rgb_state_index.attr,
  693. NULL,
  694. };
  695. static const struct attribute_group kbd_rgb_state_group = {
  696. .attrs = kbd_rgb_state_attrs,
  697. };
  698. static const struct attribute_group *kbd_rgb_mode_groups[] = {
  699. NULL,
  700. NULL,
  701. NULL,
  702. };
  703. /* Battery ********************************************************************/
  704. /* The battery maximum charging percentage */
  705. static int charge_end_threshold;
  706. static ssize_t charge_control_end_threshold_store(struct device *dev,
  707. struct device_attribute *attr,
  708. const char *buf, size_t count)
  709. {
  710. int value, ret, rv;
  711. ret = kstrtouint(buf, 10, &value);
  712. if (ret)
  713. return ret;
  714. if (value < 0 || value > 100)
  715. return -EINVAL;
  716. ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, value, &rv);
  717. if (ret)
  718. return ret;
  719. if (rv != 1)
  720. return -EIO;
  721. /* There isn't any method in the DSDT to read the threshold, so we
  722. * save the threshold.
  723. */
  724. charge_end_threshold = value;
  725. return count;
  726. }
  727. static ssize_t charge_control_end_threshold_show(struct device *device,
  728. struct device_attribute *attr,
  729. char *buf)
  730. {
  731. return sysfs_emit(buf, "%d\n", charge_end_threshold);
  732. }
  733. static DEVICE_ATTR_RW(charge_control_end_threshold);
  734. static int asus_wmi_battery_add(struct power_supply *battery)
  735. {
  736. /* The WMI method does not provide a way to specific a battery, so we
  737. * just assume it is the first battery.
  738. * Note: On some newer ASUS laptops (Zenbook UM431DA), the primary/first
  739. * battery is named BATT.
  740. */
  741. if (strcmp(battery->desc->name, "BAT0") != 0 &&
  742. strcmp(battery->desc->name, "BAT1") != 0 &&
  743. strcmp(battery->desc->name, "BATC") != 0 &&
  744. strcmp(battery->desc->name, "BATT") != 0)
  745. return -ENODEV;
  746. if (device_create_file(&battery->dev,
  747. &dev_attr_charge_control_end_threshold))
  748. return -ENODEV;
  749. /* The charge threshold is only reset when the system is power cycled,
  750. * and we can't get the current threshold so let set it to 100% when
  751. * a battery is added.
  752. */
  753. asus_wmi_set_devstate(ASUS_WMI_DEVID_RSOC, 100, NULL);
  754. charge_end_threshold = 100;
  755. return 0;
  756. }
  757. static int asus_wmi_battery_remove(struct power_supply *battery)
  758. {
  759. device_remove_file(&battery->dev,
  760. &dev_attr_charge_control_end_threshold);
  761. return 0;
  762. }
  763. static struct acpi_battery_hook battery_hook = {
  764. .add_battery = asus_wmi_battery_add,
  765. .remove_battery = asus_wmi_battery_remove,
  766. .name = "ASUS Battery Extension",
  767. };
  768. static void asus_wmi_battery_init(struct asus_wmi *asus)
  769. {
  770. asus->battery_rsoc_available = false;
  771. if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_RSOC)) {
  772. asus->battery_rsoc_available = true;
  773. battery_hook_register(&battery_hook);
  774. }
  775. }
  776. static void asus_wmi_battery_exit(struct asus_wmi *asus)
  777. {
  778. if (asus->battery_rsoc_available)
  779. battery_hook_unregister(&battery_hook);
  780. }
  781. /* LEDs ***********************************************************************/
  782. /*
  783. * These functions actually update the LED's, and are called from a
  784. * workqueue. By doing this as separate work rather than when the LED
  785. * subsystem asks, we avoid messing with the Asus ACPI stuff during a
  786. * potentially bad time, such as a timer interrupt.
  787. */
  788. static void tpd_led_update(struct work_struct *work)
  789. {
  790. int ctrl_param;
  791. struct asus_wmi *asus;
  792. asus = container_of(work, struct asus_wmi, tpd_led_work);
  793. ctrl_param = asus->tpd_led_wk;
  794. asus_wmi_set_devstate(ASUS_WMI_DEVID_TOUCHPAD_LED, ctrl_param, NULL);
  795. }
  796. static void tpd_led_set(struct led_classdev *led_cdev,
  797. enum led_brightness value)
  798. {
  799. struct asus_wmi *asus;
  800. asus = container_of(led_cdev, struct asus_wmi, tpd_led);
  801. asus->tpd_led_wk = !!value;
  802. queue_work(asus->led_workqueue, &asus->tpd_led_work);
  803. }
  804. static int read_tpd_led_state(struct asus_wmi *asus)
  805. {
  806. return asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_TOUCHPAD_LED);
  807. }
  808. static enum led_brightness tpd_led_get(struct led_classdev *led_cdev)
  809. {
  810. struct asus_wmi *asus;
  811. asus = container_of(led_cdev, struct asus_wmi, tpd_led);
  812. return read_tpd_led_state(asus);
  813. }
  814. static void kbd_led_update(struct asus_wmi *asus)
  815. {
  816. int ctrl_param = 0;
  817. ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
  818. asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
  819. }
  820. static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
  821. {
  822. int retval;
  823. /*
  824. * bits 0-2: level
  825. * bit 7: light on/off
  826. * bit 8-10: environment (0: dark, 1: normal, 2: light)
  827. * bit 17: status unknown
  828. */
  829. retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT,
  830. 0xFFFF);
  831. /* Unknown status is considered as off */
  832. if (retval == 0x8000)
  833. retval = 0;
  834. if (retval < 0)
  835. return retval;
  836. if (level)
  837. *level = retval & 0x7F;
  838. if (env)
  839. *env = (retval >> 8) & 0x7F;
  840. return 0;
  841. }
  842. static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
  843. {
  844. struct asus_wmi *asus;
  845. int max_level;
  846. asus = container_of(led_cdev, struct asus_wmi, kbd_led);
  847. max_level = asus->kbd_led.max_brightness;
  848. asus->kbd_led_wk = clamp_val(value, 0, max_level);
  849. kbd_led_update(asus);
  850. }
  851. static void kbd_led_set(struct led_classdev *led_cdev,
  852. enum led_brightness value)
  853. {
  854. /* Prevent disabling keyboard backlight on module unregister */
  855. if (led_cdev->flags & LED_UNREGISTERING)
  856. return;
  857. do_kbd_led_set(led_cdev, value);
  858. }
  859. static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value)
  860. {
  861. struct led_classdev *led_cdev = &asus->kbd_led;
  862. do_kbd_led_set(led_cdev, value);
  863. led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk);
  864. }
  865. static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
  866. {
  867. struct asus_wmi *asus;
  868. int retval, value;
  869. asus = container_of(led_cdev, struct asus_wmi, kbd_led);
  870. retval = kbd_led_read(asus, &value, NULL);
  871. if (retval < 0)
  872. return retval;
  873. return value;
  874. }
  875. static int wlan_led_unknown_state(struct asus_wmi *asus)
  876. {
  877. u32 result;
  878. asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
  879. return result & ASUS_WMI_DSTS_UNKNOWN_BIT;
  880. }
  881. static void wlan_led_update(struct work_struct *work)
  882. {
  883. int ctrl_param;
  884. struct asus_wmi *asus;
  885. asus = container_of(work, struct asus_wmi, wlan_led_work);
  886. ctrl_param = asus->wlan_led_wk;
  887. asus_wmi_set_devstate(ASUS_WMI_DEVID_WIRELESS_LED, ctrl_param, NULL);
  888. }
  889. static void wlan_led_set(struct led_classdev *led_cdev,
  890. enum led_brightness value)
  891. {
  892. struct asus_wmi *asus;
  893. asus = container_of(led_cdev, struct asus_wmi, wlan_led);
  894. asus->wlan_led_wk = !!value;
  895. queue_work(asus->led_workqueue, &asus->wlan_led_work);
  896. }
  897. static enum led_brightness wlan_led_get(struct led_classdev *led_cdev)
  898. {
  899. struct asus_wmi *asus;
  900. u32 result;
  901. asus = container_of(led_cdev, struct asus_wmi, wlan_led);
  902. asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WIRELESS_LED, &result);
  903. return result & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
  904. }
  905. static void lightbar_led_update(struct work_struct *work)
  906. {
  907. struct asus_wmi *asus;
  908. int ctrl_param;
  909. asus = container_of(work, struct asus_wmi, lightbar_led_work);
  910. ctrl_param = asus->lightbar_led_wk;
  911. asus_wmi_set_devstate(ASUS_WMI_DEVID_LIGHTBAR, ctrl_param, NULL);
  912. }
  913. static void lightbar_led_set(struct led_classdev *led_cdev,
  914. enum led_brightness value)
  915. {
  916. struct asus_wmi *asus;
  917. asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
  918. asus->lightbar_led_wk = !!value;
  919. queue_work(asus->led_workqueue, &asus->lightbar_led_work);
  920. }
  921. static enum led_brightness lightbar_led_get(struct led_classdev *led_cdev)
  922. {
  923. struct asus_wmi *asus;
  924. u32 result;
  925. asus = container_of(led_cdev, struct asus_wmi, lightbar_led);
  926. asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_LIGHTBAR, &result);
  927. return result & ASUS_WMI_DSTS_LIGHTBAR_MASK;
  928. }
  929. static int micmute_led_set(struct led_classdev *led_cdev,
  930. enum led_brightness brightness)
  931. {
  932. int state = brightness != LED_OFF;
  933. int err;
  934. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MICMUTE_LED, state, NULL);
  935. return err < 0 ? err : 0;
  936. }
  937. static void asus_wmi_led_exit(struct asus_wmi *asus)
  938. {
  939. led_classdev_unregister(&asus->kbd_led);
  940. led_classdev_unregister(&asus->tpd_led);
  941. led_classdev_unregister(&asus->wlan_led);
  942. led_classdev_unregister(&asus->lightbar_led);
  943. led_classdev_unregister(&asus->micmute_led);
  944. if (asus->led_workqueue)
  945. destroy_workqueue(asus->led_workqueue);
  946. }
  947. static int asus_wmi_led_init(struct asus_wmi *asus)
  948. {
  949. int rv = 0, num_rgb_groups = 0, led_val;
  950. if (asus->kbd_rgb_mode_available)
  951. kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_mode_group;
  952. if (asus->kbd_rgb_state_available)
  953. kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_state_group;
  954. asus->led_workqueue = create_singlethread_workqueue("led_workqueue");
  955. if (!asus->led_workqueue)
  956. return -ENOMEM;
  957. if (read_tpd_led_state(asus) >= 0) {
  958. INIT_WORK(&asus->tpd_led_work, tpd_led_update);
  959. asus->tpd_led.name = "asus::touchpad";
  960. asus->tpd_led.brightness_set = tpd_led_set;
  961. asus->tpd_led.brightness_get = tpd_led_get;
  962. asus->tpd_led.max_brightness = 1;
  963. rv = led_classdev_register(&asus->platform_device->dev,
  964. &asus->tpd_led);
  965. if (rv)
  966. goto error;
  967. }
  968. if (!kbd_led_read(asus, &led_val, NULL)) {
  969. asus->kbd_led_wk = led_val;
  970. asus->kbd_led.name = "asus::kbd_backlight";
  971. asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
  972. asus->kbd_led.brightness_set = kbd_led_set;
  973. asus->kbd_led.brightness_get = kbd_led_get;
  974. asus->kbd_led.max_brightness = 3;
  975. if (num_rgb_groups != 0)
  976. asus->kbd_led.groups = kbd_rgb_mode_groups;
  977. rv = led_classdev_register(&asus->platform_device->dev,
  978. &asus->kbd_led);
  979. if (rv)
  980. goto error;
  981. }
  982. if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED)
  983. && (asus->driver->quirks->wapf > 0)) {
  984. INIT_WORK(&asus->wlan_led_work, wlan_led_update);
  985. asus->wlan_led.name = "asus::wlan";
  986. asus->wlan_led.brightness_set = wlan_led_set;
  987. if (!wlan_led_unknown_state(asus))
  988. asus->wlan_led.brightness_get = wlan_led_get;
  989. asus->wlan_led.flags = LED_CORE_SUSPENDRESUME;
  990. asus->wlan_led.max_brightness = 1;
  991. asus->wlan_led.default_trigger = "asus-wlan";
  992. rv = led_classdev_register(&asus->platform_device->dev,
  993. &asus->wlan_led);
  994. if (rv)
  995. goto error;
  996. }
  997. if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_LIGHTBAR)) {
  998. INIT_WORK(&asus->lightbar_led_work, lightbar_led_update);
  999. asus->lightbar_led.name = "asus::lightbar";
  1000. asus->lightbar_led.brightness_set = lightbar_led_set;
  1001. asus->lightbar_led.brightness_get = lightbar_led_get;
  1002. asus->lightbar_led.max_brightness = 1;
  1003. rv = led_classdev_register(&asus->platform_device->dev,
  1004. &asus->lightbar_led);
  1005. }
  1006. if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MICMUTE_LED)) {
  1007. asus->micmute_led.name = "platform::micmute";
  1008. asus->micmute_led.max_brightness = 1;
  1009. asus->micmute_led.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
  1010. asus->micmute_led.brightness_set_blocking = micmute_led_set;
  1011. asus->micmute_led.default_trigger = "audio-micmute";
  1012. rv = led_classdev_register(&asus->platform_device->dev,
  1013. &asus->micmute_led);
  1014. if (rv)
  1015. goto error;
  1016. }
  1017. error:
  1018. if (rv)
  1019. asus_wmi_led_exit(asus);
  1020. return rv;
  1021. }
  1022. /* RF *************************************************************************/
  1023. /*
  1024. * PCI hotplug (for wlan rfkill)
  1025. */
  1026. static bool asus_wlan_rfkill_blocked(struct asus_wmi *asus)
  1027. {
  1028. int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
  1029. if (result < 0)
  1030. return false;
  1031. return !result;
  1032. }
  1033. static void asus_rfkill_hotplug(struct asus_wmi *asus)
  1034. {
  1035. struct pci_dev *dev;
  1036. struct pci_bus *bus;
  1037. bool blocked;
  1038. bool absent;
  1039. u32 l;
  1040. mutex_lock(&asus->wmi_lock);
  1041. blocked = asus_wlan_rfkill_blocked(asus);
  1042. mutex_unlock(&asus->wmi_lock);
  1043. mutex_lock(&asus->hotplug_lock);
  1044. pci_lock_rescan_remove();
  1045. if (asus->wlan.rfkill)
  1046. rfkill_set_sw_state(asus->wlan.rfkill, blocked);
  1047. if (asus->hotplug_slot.ops) {
  1048. bus = pci_find_bus(0, 1);
  1049. if (!bus) {
  1050. pr_warn("Unable to find PCI bus 1?\n");
  1051. goto out_unlock;
  1052. }
  1053. if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
  1054. pr_err("Unable to read PCI config space?\n");
  1055. goto out_unlock;
  1056. }
  1057. absent = (l == 0xffffffff);
  1058. if (blocked != absent) {
  1059. pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
  1060. blocked ? "blocked" : "unblocked",
  1061. absent ? "absent" : "present");
  1062. pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
  1063. goto out_unlock;
  1064. }
  1065. if (!blocked) {
  1066. dev = pci_get_slot(bus, 0);
  1067. if (dev) {
  1068. /* Device already present */
  1069. pci_dev_put(dev);
  1070. goto out_unlock;
  1071. }
  1072. dev = pci_scan_single_device(bus, 0);
  1073. if (dev) {
  1074. pci_bus_assign_resources(bus);
  1075. pci_bus_add_device(dev);
  1076. }
  1077. } else {
  1078. dev = pci_get_slot(bus, 0);
  1079. if (dev) {
  1080. pci_stop_and_remove_bus_device(dev);
  1081. pci_dev_put(dev);
  1082. }
  1083. }
  1084. }
  1085. out_unlock:
  1086. pci_unlock_rescan_remove();
  1087. mutex_unlock(&asus->hotplug_lock);
  1088. }
  1089. static void asus_rfkill_notify(acpi_handle handle, u32 event, void *data)
  1090. {
  1091. struct asus_wmi *asus = data;
  1092. if (event != ACPI_NOTIFY_BUS_CHECK)
  1093. return;
  1094. /*
  1095. * We can't call directly asus_rfkill_hotplug because most
  1096. * of the time WMBC is still being executed and not reetrant.
  1097. * There is currently no way to tell ACPICA that we want this
  1098. * method to be serialized, we schedule a asus_rfkill_hotplug
  1099. * call later, in a safer context.
  1100. */
  1101. queue_work(asus->hotplug_workqueue, &asus->hotplug_work);
  1102. }
  1103. static int asus_register_rfkill_notifier(struct asus_wmi *asus, char *node)
  1104. {
  1105. acpi_status status;
  1106. acpi_handle handle;
  1107. status = acpi_get_handle(NULL, node, &handle);
  1108. if (ACPI_FAILURE(status))
  1109. return -ENODEV;
  1110. status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
  1111. asus_rfkill_notify, asus);
  1112. if (ACPI_FAILURE(status))
  1113. pr_warn("Failed to register notify on %s\n", node);
  1114. return 0;
  1115. }
  1116. static void asus_unregister_rfkill_notifier(struct asus_wmi *asus, char *node)
  1117. {
  1118. acpi_status status = AE_OK;
  1119. acpi_handle handle;
  1120. status = acpi_get_handle(NULL, node, &handle);
  1121. if (ACPI_FAILURE(status))
  1122. return;
  1123. status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
  1124. asus_rfkill_notify);
  1125. if (ACPI_FAILURE(status))
  1126. pr_err("Error removing rfkill notify handler %s\n", node);
  1127. }
  1128. static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
  1129. u8 *value)
  1130. {
  1131. struct asus_wmi *asus = container_of(hotplug_slot,
  1132. struct asus_wmi, hotplug_slot);
  1133. int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
  1134. if (result < 0)
  1135. return result;
  1136. *value = !!result;
  1137. return 0;
  1138. }
  1139. static const struct hotplug_slot_ops asus_hotplug_slot_ops = {
  1140. .get_adapter_status = asus_get_adapter_status,
  1141. .get_power_status = asus_get_adapter_status,
  1142. };
  1143. static void asus_hotplug_work(struct work_struct *work)
  1144. {
  1145. struct asus_wmi *asus;
  1146. asus = container_of(work, struct asus_wmi, hotplug_work);
  1147. asus_rfkill_hotplug(asus);
  1148. }
  1149. static int asus_setup_pci_hotplug(struct asus_wmi *asus)
  1150. {
  1151. int ret = -ENOMEM;
  1152. struct pci_bus *bus = pci_find_bus(0, 1);
  1153. if (!bus) {
  1154. pr_err("Unable to find wifi PCI bus\n");
  1155. return -ENODEV;
  1156. }
  1157. asus->hotplug_workqueue =
  1158. create_singlethread_workqueue("hotplug_workqueue");
  1159. if (!asus->hotplug_workqueue)
  1160. goto error_workqueue;
  1161. INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
  1162. asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
  1163. ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
  1164. if (ret) {
  1165. pr_err("Unable to register hotplug slot - %d\n", ret);
  1166. goto error_register;
  1167. }
  1168. return 0;
  1169. error_register:
  1170. asus->hotplug_slot.ops = NULL;
  1171. destroy_workqueue(asus->hotplug_workqueue);
  1172. error_workqueue:
  1173. return ret;
  1174. }
  1175. /*
  1176. * Rfkill devices
  1177. */
  1178. static int asus_rfkill_set(void *data, bool blocked)
  1179. {
  1180. struct asus_rfkill *priv = data;
  1181. u32 ctrl_param = !blocked;
  1182. u32 dev_id = priv->dev_id;
  1183. /*
  1184. * If the user bit is set, BIOS can't set and record the wlan status,
  1185. * it will report the value read from id ASUS_WMI_DEVID_WLAN_LED
  1186. * while we query the wlan status through WMI(ASUS_WMI_DEVID_WLAN).
  1187. * So, we have to record wlan status in id ASUS_WMI_DEVID_WLAN_LED
  1188. * while setting the wlan status through WMI.
  1189. * This is also the behavior that windows app will do.
  1190. */
  1191. if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
  1192. priv->asus->driver->wlan_ctrl_by_user)
  1193. dev_id = ASUS_WMI_DEVID_WLAN_LED;
  1194. return asus_wmi_set_devstate(dev_id, ctrl_param, NULL);
  1195. }
  1196. static void asus_rfkill_query(struct rfkill *rfkill, void *data)
  1197. {
  1198. struct asus_rfkill *priv = data;
  1199. int result;
  1200. result = asus_wmi_get_devstate_simple(priv->asus, priv->dev_id);
  1201. if (result < 0)
  1202. return;
  1203. rfkill_set_sw_state(priv->rfkill, !result);
  1204. }
  1205. static int asus_rfkill_wlan_set(void *data, bool blocked)
  1206. {
  1207. struct asus_rfkill *priv = data;
  1208. struct asus_wmi *asus = priv->asus;
  1209. int ret;
  1210. /*
  1211. * This handler is enabled only if hotplug is enabled.
  1212. * In this case, the asus_wmi_set_devstate() will
  1213. * trigger a wmi notification and we need to wait
  1214. * this call to finish before being able to call
  1215. * any wmi method
  1216. */
  1217. mutex_lock(&asus->wmi_lock);
  1218. ret = asus_rfkill_set(data, blocked);
  1219. mutex_unlock(&asus->wmi_lock);
  1220. return ret;
  1221. }
  1222. static const struct rfkill_ops asus_rfkill_wlan_ops = {
  1223. .set_block = asus_rfkill_wlan_set,
  1224. .query = asus_rfkill_query,
  1225. };
  1226. static const struct rfkill_ops asus_rfkill_ops = {
  1227. .set_block = asus_rfkill_set,
  1228. .query = asus_rfkill_query,
  1229. };
  1230. static int asus_new_rfkill(struct asus_wmi *asus,
  1231. struct asus_rfkill *arfkill,
  1232. const char *name, enum rfkill_type type, int dev_id)
  1233. {
  1234. int result = asus_wmi_get_devstate_simple(asus, dev_id);
  1235. struct rfkill **rfkill = &arfkill->rfkill;
  1236. if (result < 0)
  1237. return result;
  1238. arfkill->dev_id = dev_id;
  1239. arfkill->asus = asus;
  1240. if (dev_id == ASUS_WMI_DEVID_WLAN &&
  1241. asus->driver->quirks->hotplug_wireless)
  1242. *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
  1243. &asus_rfkill_wlan_ops, arfkill);
  1244. else
  1245. *rfkill = rfkill_alloc(name, &asus->platform_device->dev, type,
  1246. &asus_rfkill_ops, arfkill);
  1247. if (!*rfkill)
  1248. return -EINVAL;
  1249. if ((dev_id == ASUS_WMI_DEVID_WLAN) &&
  1250. (asus->driver->quirks->wapf > 0))
  1251. rfkill_set_led_trigger_name(*rfkill, "asus-wlan");
  1252. rfkill_init_sw_state(*rfkill, !result);
  1253. result = rfkill_register(*rfkill);
  1254. if (result) {
  1255. rfkill_destroy(*rfkill);
  1256. *rfkill = NULL;
  1257. return result;
  1258. }
  1259. return 0;
  1260. }
  1261. static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
  1262. {
  1263. if (asus->driver->wlan_ctrl_by_user && ashs_present())
  1264. return;
  1265. asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
  1266. asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
  1267. asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
  1268. if (asus->wlan.rfkill) {
  1269. rfkill_unregister(asus->wlan.rfkill);
  1270. rfkill_destroy(asus->wlan.rfkill);
  1271. asus->wlan.rfkill = NULL;
  1272. }
  1273. /*
  1274. * Refresh pci hotplug in case the rfkill state was changed after
  1275. * asus_unregister_rfkill_notifier()
  1276. */
  1277. asus_rfkill_hotplug(asus);
  1278. if (asus->hotplug_slot.ops)
  1279. pci_hp_deregister(&asus->hotplug_slot);
  1280. if (asus->hotplug_workqueue)
  1281. destroy_workqueue(asus->hotplug_workqueue);
  1282. if (asus->bluetooth.rfkill) {
  1283. rfkill_unregister(asus->bluetooth.rfkill);
  1284. rfkill_destroy(asus->bluetooth.rfkill);
  1285. asus->bluetooth.rfkill = NULL;
  1286. }
  1287. if (asus->wimax.rfkill) {
  1288. rfkill_unregister(asus->wimax.rfkill);
  1289. rfkill_destroy(asus->wimax.rfkill);
  1290. asus->wimax.rfkill = NULL;
  1291. }
  1292. if (asus->wwan3g.rfkill) {
  1293. rfkill_unregister(asus->wwan3g.rfkill);
  1294. rfkill_destroy(asus->wwan3g.rfkill);
  1295. asus->wwan3g.rfkill = NULL;
  1296. }
  1297. if (asus->gps.rfkill) {
  1298. rfkill_unregister(asus->gps.rfkill);
  1299. rfkill_destroy(asus->gps.rfkill);
  1300. asus->gps.rfkill = NULL;
  1301. }
  1302. if (asus->uwb.rfkill) {
  1303. rfkill_unregister(asus->uwb.rfkill);
  1304. rfkill_destroy(asus->uwb.rfkill);
  1305. asus->uwb.rfkill = NULL;
  1306. }
  1307. }
  1308. static int asus_wmi_rfkill_init(struct asus_wmi *asus)
  1309. {
  1310. int result = 0;
  1311. mutex_init(&asus->hotplug_lock);
  1312. mutex_init(&asus->wmi_lock);
  1313. result = asus_new_rfkill(asus, &asus->wlan, "asus-wlan",
  1314. RFKILL_TYPE_WLAN, ASUS_WMI_DEVID_WLAN);
  1315. if (result && result != -ENODEV)
  1316. goto exit;
  1317. result = asus_new_rfkill(asus, &asus->bluetooth,
  1318. "asus-bluetooth", RFKILL_TYPE_BLUETOOTH,
  1319. ASUS_WMI_DEVID_BLUETOOTH);
  1320. if (result && result != -ENODEV)
  1321. goto exit;
  1322. result = asus_new_rfkill(asus, &asus->wimax, "asus-wimax",
  1323. RFKILL_TYPE_WIMAX, ASUS_WMI_DEVID_WIMAX);
  1324. if (result && result != -ENODEV)
  1325. goto exit;
  1326. result = asus_new_rfkill(asus, &asus->wwan3g, "asus-wwan3g",
  1327. RFKILL_TYPE_WWAN, ASUS_WMI_DEVID_WWAN3G);
  1328. if (result && result != -ENODEV)
  1329. goto exit;
  1330. result = asus_new_rfkill(asus, &asus->gps, "asus-gps",
  1331. RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS);
  1332. if (result && result != -ENODEV)
  1333. goto exit;
  1334. result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb",
  1335. RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB);
  1336. if (result && result != -ENODEV)
  1337. goto exit;
  1338. if (!asus->driver->quirks->hotplug_wireless)
  1339. goto exit;
  1340. result = asus_setup_pci_hotplug(asus);
  1341. /*
  1342. * If we get -EBUSY then something else is handling the PCI hotplug -
  1343. * don't fail in this case
  1344. */
  1345. if (result == -EBUSY)
  1346. result = 0;
  1347. asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
  1348. asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
  1349. asus_register_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
  1350. /*
  1351. * Refresh pci hotplug in case the rfkill state was changed during
  1352. * setup.
  1353. */
  1354. asus_rfkill_hotplug(asus);
  1355. exit:
  1356. if (result && result != -ENODEV)
  1357. asus_wmi_rfkill_exit(asus);
  1358. if (result == -ENODEV)
  1359. result = 0;
  1360. return result;
  1361. }
  1362. /* Panel Overdrive ************************************************************/
  1363. static ssize_t panel_od_show(struct device *dev,
  1364. struct device_attribute *attr, char *buf)
  1365. {
  1366. struct asus_wmi *asus = dev_get_drvdata(dev);
  1367. int result;
  1368. result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_PANEL_OD);
  1369. if (result < 0)
  1370. return result;
  1371. return sysfs_emit(buf, "%d\n", result);
  1372. }
  1373. static ssize_t panel_od_store(struct device *dev,
  1374. struct device_attribute *attr,
  1375. const char *buf, size_t count)
  1376. {
  1377. int result, err;
  1378. u32 overdrive;
  1379. struct asus_wmi *asus = dev_get_drvdata(dev);
  1380. result = kstrtou32(buf, 10, &overdrive);
  1381. if (result)
  1382. return result;
  1383. if (overdrive > 1)
  1384. return -EINVAL;
  1385. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_PANEL_OD, overdrive, &result);
  1386. if (err) {
  1387. pr_warn("Failed to set panel overdrive: %d\n", err);
  1388. return err;
  1389. }
  1390. if (result > 1) {
  1391. pr_warn("Failed to set panel overdrive (result): 0x%x\n", result);
  1392. return -EIO;
  1393. }
  1394. sysfs_notify(&asus->platform_device->dev.kobj, NULL, "panel_od");
  1395. return count;
  1396. }
  1397. static DEVICE_ATTR_RW(panel_od);
  1398. /* Quirks *********************************************************************/
  1399. static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
  1400. {
  1401. struct pci_dev *xhci_pdev;
  1402. u32 orig_ports_available;
  1403. u32 ports_available = asus->driver->quirks->xusb2pr;
  1404. xhci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
  1405. PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI,
  1406. NULL);
  1407. if (!xhci_pdev)
  1408. return;
  1409. pci_read_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
  1410. &orig_ports_available);
  1411. pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
  1412. cpu_to_le32(ports_available));
  1413. pci_dev_put(xhci_pdev);
  1414. pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
  1415. orig_ports_available, ports_available);
  1416. }
  1417. /*
  1418. * Some devices dont support or have borcken get_als method
  1419. * but still support set method.
  1420. */
  1421. static void asus_wmi_set_als(void)
  1422. {
  1423. asus_wmi_set_devstate(ASUS_WMI_DEVID_ALS_ENABLE, 1, NULL);
  1424. }
  1425. /* Hwmon device ***************************************************************/
  1426. static int asus_agfn_fan_speed_read(struct asus_wmi *asus, int fan,
  1427. int *speed)
  1428. {
  1429. struct agfn_fan_args args = {
  1430. .agfn.len = sizeof(args),
  1431. .agfn.mfun = ASUS_FAN_MFUN,
  1432. .agfn.sfun = ASUS_FAN_SFUN_READ,
  1433. .fan = fan,
  1434. .speed = 0,
  1435. };
  1436. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  1437. int status;
  1438. if (fan != 1)
  1439. return -EINVAL;
  1440. status = asus_wmi_evaluate_method_agfn(input);
  1441. if (status || args.agfn.err)
  1442. return -ENXIO;
  1443. if (speed)
  1444. *speed = args.speed;
  1445. return 0;
  1446. }
  1447. static int asus_agfn_fan_speed_write(struct asus_wmi *asus, int fan,
  1448. int *speed)
  1449. {
  1450. struct agfn_fan_args args = {
  1451. .agfn.len = sizeof(args),
  1452. .agfn.mfun = ASUS_FAN_MFUN,
  1453. .agfn.sfun = ASUS_FAN_SFUN_WRITE,
  1454. .fan = fan,
  1455. .speed = speed ? *speed : 0,
  1456. };
  1457. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  1458. int status;
  1459. /* 1: for setting 1st fan's speed 0: setting auto mode */
  1460. if (fan != 1 && fan != 0)
  1461. return -EINVAL;
  1462. status = asus_wmi_evaluate_method_agfn(input);
  1463. if (status || args.agfn.err)
  1464. return -ENXIO;
  1465. if (speed && fan == 1)
  1466. asus->agfn_pwm = *speed;
  1467. return 0;
  1468. }
  1469. /*
  1470. * Check if we can read the speed of one fan. If true we assume we can also
  1471. * control it.
  1472. */
  1473. static bool asus_wmi_has_agfn_fan(struct asus_wmi *asus)
  1474. {
  1475. int status;
  1476. int speed;
  1477. u32 value;
  1478. status = asus_agfn_fan_speed_read(asus, 1, &speed);
  1479. if (status != 0)
  1480. return false;
  1481. status = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
  1482. if (status != 0)
  1483. return false;
  1484. /*
  1485. * We need to find a better way, probably using sfun,
  1486. * bits or spec ...
  1487. * Currently we disable it if:
  1488. * - ASUS_WMI_UNSUPPORTED_METHOD is returned
  1489. * - reverved bits are non-zero
  1490. * - sfun and presence bit are not set
  1491. */
  1492. return !(value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000
  1493. || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT)));
  1494. }
  1495. static int asus_fan_set_auto(struct asus_wmi *asus)
  1496. {
  1497. int status;
  1498. u32 retval;
  1499. switch (asus->fan_type) {
  1500. case FAN_TYPE_SPEC83:
  1501. status = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
  1502. 0, &retval);
  1503. if (status)
  1504. return status;
  1505. if (retval != 1)
  1506. return -EIO;
  1507. break;
  1508. case FAN_TYPE_AGFN:
  1509. status = asus_agfn_fan_speed_write(asus, 0, NULL);
  1510. if (status)
  1511. return -ENXIO;
  1512. break;
  1513. default:
  1514. return -ENXIO;
  1515. }
  1516. /*
  1517. * Modern models like the G713 also have GPU fan control (this is not AGFN)
  1518. */
  1519. if (asus->gpu_fan_type == FAN_TYPE_SPEC83) {
  1520. status = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
  1521. 0, &retval);
  1522. if (status)
  1523. return status;
  1524. if (retval != 1)
  1525. return -EIO;
  1526. }
  1527. return 0;
  1528. }
  1529. static ssize_t pwm1_show(struct device *dev,
  1530. struct device_attribute *attr,
  1531. char *buf)
  1532. {
  1533. struct asus_wmi *asus = dev_get_drvdata(dev);
  1534. int err;
  1535. int value;
  1536. /* If we already set a value then just return it */
  1537. if (asus->agfn_pwm >= 0)
  1538. return sprintf(buf, "%d\n", asus->agfn_pwm);
  1539. /*
  1540. * If we haven't set already set a value through the AGFN interface,
  1541. * we read a current value through the (now-deprecated) FAN_CTRL device.
  1542. */
  1543. err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_CTRL, &value);
  1544. if (err < 0)
  1545. return err;
  1546. value &= 0xFF;
  1547. if (value == 1) /* Low Speed */
  1548. value = 85;
  1549. else if (value == 2)
  1550. value = 170;
  1551. else if (value == 3)
  1552. value = 255;
  1553. else if (value) {
  1554. pr_err("Unknown fan speed %#x\n", value);
  1555. value = -1;
  1556. }
  1557. return sysfs_emit(buf, "%d\n", value);
  1558. }
  1559. static ssize_t pwm1_store(struct device *dev,
  1560. struct device_attribute *attr,
  1561. const char *buf, size_t count) {
  1562. struct asus_wmi *asus = dev_get_drvdata(dev);
  1563. int value;
  1564. int state;
  1565. int ret;
  1566. ret = kstrtouint(buf, 10, &value);
  1567. if (ret)
  1568. return ret;
  1569. value = clamp(value, 0, 255);
  1570. state = asus_agfn_fan_speed_write(asus, 1, &value);
  1571. if (state)
  1572. pr_warn("Setting fan speed failed: %d\n", state);
  1573. else
  1574. asus->fan_pwm_mode = ASUS_FAN_CTRL_MANUAL;
  1575. return count;
  1576. }
  1577. static ssize_t fan1_input_show(struct device *dev,
  1578. struct device_attribute *attr,
  1579. char *buf)
  1580. {
  1581. struct asus_wmi *asus = dev_get_drvdata(dev);
  1582. int value;
  1583. int ret;
  1584. switch (asus->fan_type) {
  1585. case FAN_TYPE_SPEC83:
  1586. ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL,
  1587. &value);
  1588. if (ret < 0)
  1589. return ret;
  1590. value &= 0xffff;
  1591. break;
  1592. case FAN_TYPE_AGFN:
  1593. /* no speed readable on manual mode */
  1594. if (asus->fan_pwm_mode == ASUS_FAN_CTRL_MANUAL)
  1595. return -ENXIO;
  1596. ret = asus_agfn_fan_speed_read(asus, 1, &value);
  1597. if (ret) {
  1598. pr_warn("reading fan speed failed: %d\n", ret);
  1599. return -ENXIO;
  1600. }
  1601. break;
  1602. default:
  1603. return -ENXIO;
  1604. }
  1605. return sysfs_emit(buf, "%d\n", value < 0 ? -1 : value * 100);
  1606. }
  1607. static ssize_t pwm1_enable_show(struct device *dev,
  1608. struct device_attribute *attr,
  1609. char *buf)
  1610. {
  1611. struct asus_wmi *asus = dev_get_drvdata(dev);
  1612. /*
  1613. * Just read back the cached pwm mode.
  1614. *
  1615. * For the CPU_FAN device, the spec indicates that we should be
  1616. * able to read the device status and consult bit 19 to see if we
  1617. * are in Full On or Automatic mode. However, this does not work
  1618. * in practice on X532FL at least (the bit is always 0) and there's
  1619. * also nothing in the DSDT to indicate that this behaviour exists.
  1620. */
  1621. return sysfs_emit(buf, "%d\n", asus->fan_pwm_mode);
  1622. }
  1623. static ssize_t pwm1_enable_store(struct device *dev,
  1624. struct device_attribute *attr,
  1625. const char *buf, size_t count)
  1626. {
  1627. struct asus_wmi *asus = dev_get_drvdata(dev);
  1628. int status = 0;
  1629. int state;
  1630. int value;
  1631. int ret;
  1632. u32 retval;
  1633. ret = kstrtouint(buf, 10, &state);
  1634. if (ret)
  1635. return ret;
  1636. if (asus->fan_type == FAN_TYPE_SPEC83) {
  1637. switch (state) { /* standard documented hwmon values */
  1638. case ASUS_FAN_CTRL_FULLSPEED:
  1639. value = 1;
  1640. break;
  1641. case ASUS_FAN_CTRL_AUTO:
  1642. value = 0;
  1643. break;
  1644. default:
  1645. return -EINVAL;
  1646. }
  1647. ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_CPU_FAN_CTRL,
  1648. value, &retval);
  1649. if (ret)
  1650. return ret;
  1651. if (retval != 1)
  1652. return -EIO;
  1653. } else if (asus->fan_type == FAN_TYPE_AGFN) {
  1654. switch (state) {
  1655. case ASUS_FAN_CTRL_MANUAL:
  1656. break;
  1657. case ASUS_FAN_CTRL_AUTO:
  1658. status = asus_fan_set_auto(asus);
  1659. if (status)
  1660. return status;
  1661. break;
  1662. default:
  1663. return -EINVAL;
  1664. }
  1665. }
  1666. asus->fan_pwm_mode = state;
  1667. /* Must set to disabled if mode is toggled */
  1668. if (asus->cpu_fan_curve_available)
  1669. asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
  1670. if (asus->gpu_fan_curve_available)
  1671. asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
  1672. return count;
  1673. }
  1674. static ssize_t fan1_label_show(struct device *dev,
  1675. struct device_attribute *attr,
  1676. char *buf)
  1677. {
  1678. return sysfs_emit(buf, "%s\n", ASUS_FAN_DESC);
  1679. }
  1680. static ssize_t asus_hwmon_temp1(struct device *dev,
  1681. struct device_attribute *attr,
  1682. char *buf)
  1683. {
  1684. struct asus_wmi *asus = dev_get_drvdata(dev);
  1685. u32 value;
  1686. int err;
  1687. err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value);
  1688. if (err < 0)
  1689. return err;
  1690. return sprintf(buf, "%ld\n",
  1691. deci_kelvin_to_millicelsius(value & 0xFFFF));
  1692. }
  1693. /* GPU fan on modern ROG laptops */
  1694. static ssize_t fan2_input_show(struct device *dev,
  1695. struct device_attribute *attr,
  1696. char *buf)
  1697. {
  1698. struct asus_wmi *asus = dev_get_drvdata(dev);
  1699. int value;
  1700. int ret;
  1701. ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL, &value);
  1702. if (ret < 0)
  1703. return ret;
  1704. value &= 0xffff;
  1705. return sysfs_emit(buf, "%d\n", value * 100);
  1706. }
  1707. static ssize_t fan2_label_show(struct device *dev,
  1708. struct device_attribute *attr,
  1709. char *buf)
  1710. {
  1711. return sysfs_emit(buf, "%s\n", ASUS_GPU_FAN_DESC);
  1712. }
  1713. static ssize_t pwm2_enable_show(struct device *dev,
  1714. struct device_attribute *attr,
  1715. char *buf)
  1716. {
  1717. struct asus_wmi *asus = dev_get_drvdata(dev);
  1718. return sysfs_emit(buf, "%d\n", asus->gpu_fan_pwm_mode);
  1719. }
  1720. static ssize_t pwm2_enable_store(struct device *dev,
  1721. struct device_attribute *attr,
  1722. const char *buf, size_t count)
  1723. {
  1724. struct asus_wmi *asus = dev_get_drvdata(dev);
  1725. int state;
  1726. int value;
  1727. int ret;
  1728. u32 retval;
  1729. ret = kstrtouint(buf, 10, &state);
  1730. if (ret)
  1731. return ret;
  1732. switch (state) { /* standard documented hwmon values */
  1733. case ASUS_FAN_CTRL_FULLSPEED:
  1734. value = 1;
  1735. break;
  1736. case ASUS_FAN_CTRL_AUTO:
  1737. value = 0;
  1738. break;
  1739. default:
  1740. return -EINVAL;
  1741. }
  1742. ret = asus_wmi_set_devstate(ASUS_WMI_DEVID_GPU_FAN_CTRL,
  1743. value, &retval);
  1744. if (ret)
  1745. return ret;
  1746. if (retval != 1)
  1747. return -EIO;
  1748. asus->gpu_fan_pwm_mode = state;
  1749. return count;
  1750. }
  1751. /* Fan1 */
  1752. static DEVICE_ATTR_RW(pwm1);
  1753. static DEVICE_ATTR_RW(pwm1_enable);
  1754. static DEVICE_ATTR_RO(fan1_input);
  1755. static DEVICE_ATTR_RO(fan1_label);
  1756. /* Fan2 - GPU fan */
  1757. static DEVICE_ATTR_RW(pwm2_enable);
  1758. static DEVICE_ATTR_RO(fan2_input);
  1759. static DEVICE_ATTR_RO(fan2_label);
  1760. /* Temperature */
  1761. static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
  1762. static struct attribute *hwmon_attributes[] = {
  1763. &dev_attr_pwm1.attr,
  1764. &dev_attr_pwm1_enable.attr,
  1765. &dev_attr_pwm2_enable.attr,
  1766. &dev_attr_fan1_input.attr,
  1767. &dev_attr_fan1_label.attr,
  1768. &dev_attr_fan2_input.attr,
  1769. &dev_attr_fan2_label.attr,
  1770. &dev_attr_temp1_input.attr,
  1771. NULL
  1772. };
  1773. static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
  1774. struct attribute *attr, int idx)
  1775. {
  1776. struct device *dev = kobj_to_dev(kobj);
  1777. struct asus_wmi *asus = dev_get_drvdata(dev->parent);
  1778. u32 value = ASUS_WMI_UNSUPPORTED_METHOD;
  1779. if (attr == &dev_attr_pwm1.attr) {
  1780. if (asus->fan_type != FAN_TYPE_AGFN)
  1781. return 0;
  1782. } else if (attr == &dev_attr_fan1_input.attr
  1783. || attr == &dev_attr_fan1_label.attr
  1784. || attr == &dev_attr_pwm1_enable.attr) {
  1785. if (asus->fan_type == FAN_TYPE_NONE)
  1786. return 0;
  1787. } else if (attr == &dev_attr_fan2_input.attr
  1788. || attr == &dev_attr_fan2_label.attr
  1789. || attr == &dev_attr_pwm2_enable.attr) {
  1790. if (asus->gpu_fan_type == FAN_TYPE_NONE)
  1791. return 0;
  1792. } else if (attr == &dev_attr_temp1_input.attr) {
  1793. int err = asus_wmi_get_devstate(asus,
  1794. ASUS_WMI_DEVID_THERMAL_CTRL,
  1795. &value);
  1796. if (err < 0)
  1797. return 0; /* can't return negative here */
  1798. /*
  1799. * If the temperature value in deci-Kelvin is near the absolute
  1800. * zero temperature, something is clearly wrong
  1801. */
  1802. if (value == 0 || value == 1)
  1803. return 0;
  1804. }
  1805. return attr->mode;
  1806. }
  1807. static const struct attribute_group hwmon_attribute_group = {
  1808. .is_visible = asus_hwmon_sysfs_is_visible,
  1809. .attrs = hwmon_attributes
  1810. };
  1811. __ATTRIBUTE_GROUPS(hwmon_attribute);
  1812. static int asus_wmi_hwmon_init(struct asus_wmi *asus)
  1813. {
  1814. struct device *dev = &asus->platform_device->dev;
  1815. struct device *hwmon;
  1816. hwmon = devm_hwmon_device_register_with_groups(dev, "asus", asus,
  1817. hwmon_attribute_groups);
  1818. if (IS_ERR(hwmon)) {
  1819. pr_err("Could not register asus hwmon device\n");
  1820. return PTR_ERR(hwmon);
  1821. }
  1822. return 0;
  1823. }
  1824. static int asus_wmi_fan_init(struct asus_wmi *asus)
  1825. {
  1826. asus->gpu_fan_type = FAN_TYPE_NONE;
  1827. asus->fan_type = FAN_TYPE_NONE;
  1828. asus->agfn_pwm = -1;
  1829. if (asus->driver->quirks->wmi_ignore_fan)
  1830. asus->fan_type = FAN_TYPE_NONE;
  1831. else if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CPU_FAN_CTRL))
  1832. asus->fan_type = FAN_TYPE_SPEC83;
  1833. else if (asus_wmi_has_agfn_fan(asus))
  1834. asus->fan_type = FAN_TYPE_AGFN;
  1835. /* Modern models like G713 also have GPU fan control */
  1836. if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL))
  1837. asus->gpu_fan_type = FAN_TYPE_SPEC83;
  1838. if (asus->fan_type == FAN_TYPE_NONE)
  1839. return -ENODEV;
  1840. asus_fan_set_auto(asus);
  1841. asus->fan_pwm_mode = ASUS_FAN_CTRL_AUTO;
  1842. return 0;
  1843. }
  1844. /* Fan mode *******************************************************************/
  1845. static int fan_boost_mode_check_present(struct asus_wmi *asus)
  1846. {
  1847. u32 result;
  1848. int err;
  1849. asus->fan_boost_mode_available = false;
  1850. err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FAN_BOOST_MODE,
  1851. &result);
  1852. if (err) {
  1853. if (err == -ENODEV)
  1854. return 0;
  1855. else
  1856. return err;
  1857. }
  1858. if ((result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
  1859. (result & ASUS_FAN_BOOST_MODES_MASK)) {
  1860. asus->fan_boost_mode_available = true;
  1861. asus->fan_boost_mode_mask = result & ASUS_FAN_BOOST_MODES_MASK;
  1862. }
  1863. return 0;
  1864. }
  1865. static int fan_boost_mode_write(struct asus_wmi *asus)
  1866. {
  1867. u32 retval;
  1868. u8 value;
  1869. int err;
  1870. value = asus->fan_boost_mode;
  1871. pr_info("Set fan boost mode: %u\n", value);
  1872. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_FAN_BOOST_MODE, value,
  1873. &retval);
  1874. sysfs_notify(&asus->platform_device->dev.kobj, NULL,
  1875. "fan_boost_mode");
  1876. if (err) {
  1877. pr_warn("Failed to set fan boost mode: %d\n", err);
  1878. return err;
  1879. }
  1880. if (retval != 1) {
  1881. pr_warn("Failed to set fan boost mode (retval): 0x%x\n",
  1882. retval);
  1883. return -EIO;
  1884. }
  1885. return 0;
  1886. }
  1887. static int fan_boost_mode_switch_next(struct asus_wmi *asus)
  1888. {
  1889. u8 mask = asus->fan_boost_mode_mask;
  1890. if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_NORMAL) {
  1891. if (mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK)
  1892. asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_OVERBOOST;
  1893. else if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
  1894. asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
  1895. } else if (asus->fan_boost_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
  1896. if (mask & ASUS_FAN_BOOST_MODE_SILENT_MASK)
  1897. asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_SILENT;
  1898. else
  1899. asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
  1900. } else {
  1901. asus->fan_boost_mode = ASUS_FAN_BOOST_MODE_NORMAL;
  1902. }
  1903. return fan_boost_mode_write(asus);
  1904. }
  1905. static ssize_t fan_boost_mode_show(struct device *dev,
  1906. struct device_attribute *attr, char *buf)
  1907. {
  1908. struct asus_wmi *asus = dev_get_drvdata(dev);
  1909. return sysfs_emit(buf, "%d\n", asus->fan_boost_mode);
  1910. }
  1911. static ssize_t fan_boost_mode_store(struct device *dev,
  1912. struct device_attribute *attr,
  1913. const char *buf, size_t count)
  1914. {
  1915. struct asus_wmi *asus = dev_get_drvdata(dev);
  1916. u8 mask = asus->fan_boost_mode_mask;
  1917. u8 new_mode;
  1918. int result;
  1919. result = kstrtou8(buf, 10, &new_mode);
  1920. if (result < 0) {
  1921. pr_warn("Trying to store invalid value\n");
  1922. return result;
  1923. }
  1924. if (new_mode == ASUS_FAN_BOOST_MODE_OVERBOOST) {
  1925. if (!(mask & ASUS_FAN_BOOST_MODE_OVERBOOST_MASK))
  1926. return -EINVAL;
  1927. } else if (new_mode == ASUS_FAN_BOOST_MODE_SILENT) {
  1928. if (!(mask & ASUS_FAN_BOOST_MODE_SILENT_MASK))
  1929. return -EINVAL;
  1930. } else if (new_mode != ASUS_FAN_BOOST_MODE_NORMAL) {
  1931. return -EINVAL;
  1932. }
  1933. asus->fan_boost_mode = new_mode;
  1934. fan_boost_mode_write(asus);
  1935. return count;
  1936. }
  1937. // Fan boost mode: 0 - normal, 1 - overboost, 2 - silent
  1938. static DEVICE_ATTR_RW(fan_boost_mode);
  1939. /* Custom fan curves **********************************************************/
  1940. static void fan_curve_copy_from_buf(struct fan_curve_data *data, u8 *buf)
  1941. {
  1942. int i;
  1943. for (i = 0; i < FAN_CURVE_POINTS; i++) {
  1944. data->temps[i] = buf[i];
  1945. }
  1946. for (i = 0; i < FAN_CURVE_POINTS; i++) {
  1947. data->percents[i] =
  1948. 255 * buf[i + FAN_CURVE_POINTS] / 100;
  1949. }
  1950. }
  1951. static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev)
  1952. {
  1953. struct fan_curve_data *curves;
  1954. u8 buf[FAN_CURVE_BUF_LEN];
  1955. int fan_idx = 0;
  1956. u8 mode = 0;
  1957. int err;
  1958. if (asus->throttle_thermal_policy_available)
  1959. mode = asus->throttle_thermal_policy_mode;
  1960. /* DEVID_<C/G>PU_FAN_CURVE is switched for OVERBOOST vs SILENT */
  1961. if (mode == 2)
  1962. mode = 1;
  1963. else if (mode == 1)
  1964. mode = 2;
  1965. if (fan_dev == ASUS_WMI_DEVID_GPU_FAN_CURVE)
  1966. fan_idx = FAN_CURVE_DEV_GPU;
  1967. curves = &asus->custom_fan_curves[fan_idx];
  1968. err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf,
  1969. FAN_CURVE_BUF_LEN);
  1970. if (err) {
  1971. pr_warn("%s (0x%08x) failed: %d\n", __func__, fan_dev, err);
  1972. return err;
  1973. }
  1974. fan_curve_copy_from_buf(curves, buf);
  1975. curves->device_id = fan_dev;
  1976. return 0;
  1977. }
  1978. /* Check if capability exists, and populate defaults */
  1979. static int fan_curve_check_present(struct asus_wmi *asus, bool *available,
  1980. u32 fan_dev)
  1981. {
  1982. int err;
  1983. *available = false;
  1984. if (asus->fan_type == FAN_TYPE_NONE)
  1985. return 0;
  1986. err = fan_curve_get_factory_default(asus, fan_dev);
  1987. if (err) {
  1988. return 0;
  1989. }
  1990. *available = true;
  1991. return 0;
  1992. }
  1993. /* Determine which fan the attribute is for if SENSOR_ATTR */
  1994. static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus,
  1995. struct device_attribute *attr)
  1996. {
  1997. int index = to_sensor_dev_attr(attr)->index;
  1998. return &asus->custom_fan_curves[index & FAN_CURVE_DEV_GPU];
  1999. }
  2000. /* Determine which fan the attribute is for if SENSOR_ATTR_2 */
  2001. static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus,
  2002. struct device_attribute *attr)
  2003. {
  2004. int nr = to_sensor_dev_attr_2(attr)->nr;
  2005. return &asus->custom_fan_curves[nr & FAN_CURVE_DEV_GPU];
  2006. }
  2007. static ssize_t fan_curve_show(struct device *dev,
  2008. struct device_attribute *attr, char *buf)
  2009. {
  2010. struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
  2011. struct asus_wmi *asus = dev_get_drvdata(dev);
  2012. struct fan_curve_data *data;
  2013. int value, index, nr;
  2014. data = fan_curve_attr_2_select(asus, attr);
  2015. index = dev_attr->index;
  2016. nr = dev_attr->nr;
  2017. if (nr & FAN_CURVE_PWM_MASK)
  2018. value = data->percents[index];
  2019. else
  2020. value = data->temps[index];
  2021. return sysfs_emit(buf, "%d\n", value);
  2022. }
  2023. /*
  2024. * "fan_dev" is the related WMI method such as ASUS_WMI_DEVID_CPU_FAN_CURVE.
  2025. */
  2026. static int fan_curve_write(struct asus_wmi *asus,
  2027. struct fan_curve_data *data)
  2028. {
  2029. u32 arg1 = 0, arg2 = 0, arg3 = 0, arg4 = 0;
  2030. u8 *percents = data->percents;
  2031. u8 *temps = data->temps;
  2032. int ret, i, shift = 0;
  2033. if (!data->enabled)
  2034. return 0;
  2035. for (i = 0; i < FAN_CURVE_POINTS / 2; i++) {
  2036. arg1 += (temps[i]) << shift;
  2037. arg2 += (temps[i + 4]) << shift;
  2038. /* Scale to percentage for device */
  2039. arg3 += (100 * percents[i] / 255) << shift;
  2040. arg4 += (100 * percents[i + 4] / 255) << shift;
  2041. shift += 8;
  2042. }
  2043. return asus_wmi_evaluate_method5(ASUS_WMI_METHODID_DEVS,
  2044. data->device_id,
  2045. arg1, arg2, arg3, arg4, &ret);
  2046. }
  2047. static ssize_t fan_curve_store(struct device *dev,
  2048. struct device_attribute *attr, const char *buf,
  2049. size_t count)
  2050. {
  2051. struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr);
  2052. struct asus_wmi *asus = dev_get_drvdata(dev);
  2053. struct fan_curve_data *data;
  2054. u8 value;
  2055. int err;
  2056. int pwm = dev_attr->nr & FAN_CURVE_PWM_MASK;
  2057. int index = dev_attr->index;
  2058. data = fan_curve_attr_2_select(asus, attr);
  2059. err = kstrtou8(buf, 10, &value);
  2060. if (err < 0)
  2061. return err;
  2062. if (pwm) {
  2063. data->percents[index] = value;
  2064. } else {
  2065. data->temps[index] = value;
  2066. }
  2067. /*
  2068. * Mark as disabled so the user has to explicitly enable to apply a
  2069. * changed fan curve. This prevents potential lockups from writing out
  2070. * many changes as one-write-per-change.
  2071. */
  2072. data->enabled = false;
  2073. return count;
  2074. }
  2075. static ssize_t fan_curve_enable_show(struct device *dev,
  2076. struct device_attribute *attr, char *buf)
  2077. {
  2078. struct asus_wmi *asus = dev_get_drvdata(dev);
  2079. struct fan_curve_data *data;
  2080. int out = 2;
  2081. data = fan_curve_attr_select(asus, attr);
  2082. if (data->enabled)
  2083. out = 1;
  2084. return sysfs_emit(buf, "%d\n", out);
  2085. }
  2086. static ssize_t fan_curve_enable_store(struct device *dev,
  2087. struct device_attribute *attr,
  2088. const char *buf, size_t count)
  2089. {
  2090. struct asus_wmi *asus = dev_get_drvdata(dev);
  2091. struct fan_curve_data *data;
  2092. int value, err;
  2093. data = fan_curve_attr_select(asus, attr);
  2094. err = kstrtoint(buf, 10, &value);
  2095. if (err < 0)
  2096. return err;
  2097. switch (value) {
  2098. case 1:
  2099. data->enabled = true;
  2100. break;
  2101. case 2:
  2102. data->enabled = false;
  2103. break;
  2104. /*
  2105. * Auto + reset the fan curve data to defaults. Make it an explicit
  2106. * option so that users don't accidentally overwrite a set fan curve.
  2107. */
  2108. case 3:
  2109. err = fan_curve_get_factory_default(asus, data->device_id);
  2110. if (err)
  2111. return err;
  2112. data->enabled = false;
  2113. break;
  2114. default:
  2115. return -EINVAL;
  2116. }
  2117. if (data->enabled) {
  2118. err = fan_curve_write(asus, data);
  2119. if (err)
  2120. return err;
  2121. } else {
  2122. /*
  2123. * For machines with throttle this is the only way to reset fans
  2124. * to default mode of operation (does not erase curve data).
  2125. */
  2126. if (asus->throttle_thermal_policy_available) {
  2127. err = throttle_thermal_policy_write(asus);
  2128. if (err)
  2129. return err;
  2130. /* Similar is true for laptops with this fan */
  2131. } else if (asus->fan_type == FAN_TYPE_SPEC83) {
  2132. err = asus_fan_set_auto(asus);
  2133. if (err)
  2134. return err;
  2135. } else {
  2136. /* Safeguard against fautly ACPI tables */
  2137. err = fan_curve_get_factory_default(asus, data->device_id);
  2138. if (err)
  2139. return err;
  2140. err = fan_curve_write(asus, data);
  2141. if (err)
  2142. return err;
  2143. }
  2144. }
  2145. return count;
  2146. }
  2147. /* CPU */
  2148. static SENSOR_DEVICE_ATTR_RW(pwm1_enable, fan_curve_enable, FAN_CURVE_DEV_CPU);
  2149. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_temp, fan_curve,
  2150. FAN_CURVE_DEV_CPU, 0);
  2151. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_temp, fan_curve,
  2152. FAN_CURVE_DEV_CPU, 1);
  2153. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_temp, fan_curve,
  2154. FAN_CURVE_DEV_CPU, 2);
  2155. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_temp, fan_curve,
  2156. FAN_CURVE_DEV_CPU, 3);
  2157. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_temp, fan_curve,
  2158. FAN_CURVE_DEV_CPU, 4);
  2159. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_temp, fan_curve,
  2160. FAN_CURVE_DEV_CPU, 5);
  2161. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_temp, fan_curve,
  2162. FAN_CURVE_DEV_CPU, 6);
  2163. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve,
  2164. FAN_CURVE_DEV_CPU, 7);
  2165. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm, fan_curve,
  2166. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 0);
  2167. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm, fan_curve,
  2168. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 1);
  2169. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm, fan_curve,
  2170. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 2);
  2171. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point4_pwm, fan_curve,
  2172. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 3);
  2173. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point5_pwm, fan_curve,
  2174. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 4);
  2175. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point6_pwm, fan_curve,
  2176. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 5);
  2177. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point7_pwm, fan_curve,
  2178. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 6);
  2179. static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_pwm, fan_curve,
  2180. FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 7);
  2181. /* GPU */
  2182. static SENSOR_DEVICE_ATTR_RW(pwm2_enable, fan_curve_enable, FAN_CURVE_DEV_GPU);
  2183. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_temp, fan_curve,
  2184. FAN_CURVE_DEV_GPU, 0);
  2185. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_temp, fan_curve,
  2186. FAN_CURVE_DEV_GPU, 1);
  2187. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_temp, fan_curve,
  2188. FAN_CURVE_DEV_GPU, 2);
  2189. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_temp, fan_curve,
  2190. FAN_CURVE_DEV_GPU, 3);
  2191. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_temp, fan_curve,
  2192. FAN_CURVE_DEV_GPU, 4);
  2193. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_temp, fan_curve,
  2194. FAN_CURVE_DEV_GPU, 5);
  2195. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_temp, fan_curve,
  2196. FAN_CURVE_DEV_GPU, 6);
  2197. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_temp, fan_curve,
  2198. FAN_CURVE_DEV_GPU, 7);
  2199. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point1_pwm, fan_curve,
  2200. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 0);
  2201. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point2_pwm, fan_curve,
  2202. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 1);
  2203. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point3_pwm, fan_curve,
  2204. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 2);
  2205. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point4_pwm, fan_curve,
  2206. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 3);
  2207. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point5_pwm, fan_curve,
  2208. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 4);
  2209. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point6_pwm, fan_curve,
  2210. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 5);
  2211. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve,
  2212. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 6);
  2213. static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve,
  2214. FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
  2215. static struct attribute *asus_fan_curve_attr[] = {
  2216. /* CPU */
  2217. &sensor_dev_attr_pwm1_enable.dev_attr.attr,
  2218. &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr,
  2219. &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr,
  2220. &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr,
  2221. &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr,
  2222. &sensor_dev_attr_pwm1_auto_point5_temp.dev_attr.attr,
  2223. &sensor_dev_attr_pwm1_auto_point6_temp.dev_attr.attr,
  2224. &sensor_dev_attr_pwm1_auto_point7_temp.dev_attr.attr,
  2225. &sensor_dev_attr_pwm1_auto_point8_temp.dev_attr.attr,
  2226. &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
  2227. &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
  2228. &sensor_dev_attr_pwm1_auto_point3_pwm.dev_attr.attr,
  2229. &sensor_dev_attr_pwm1_auto_point4_pwm.dev_attr.attr,
  2230. &sensor_dev_attr_pwm1_auto_point5_pwm.dev_attr.attr,
  2231. &sensor_dev_attr_pwm1_auto_point6_pwm.dev_attr.attr,
  2232. &sensor_dev_attr_pwm1_auto_point7_pwm.dev_attr.attr,
  2233. &sensor_dev_attr_pwm1_auto_point8_pwm.dev_attr.attr,
  2234. /* GPU */
  2235. &sensor_dev_attr_pwm2_enable.dev_attr.attr,
  2236. &sensor_dev_attr_pwm2_auto_point1_temp.dev_attr.attr,
  2237. &sensor_dev_attr_pwm2_auto_point2_temp.dev_attr.attr,
  2238. &sensor_dev_attr_pwm2_auto_point3_temp.dev_attr.attr,
  2239. &sensor_dev_attr_pwm2_auto_point4_temp.dev_attr.attr,
  2240. &sensor_dev_attr_pwm2_auto_point5_temp.dev_attr.attr,
  2241. &sensor_dev_attr_pwm2_auto_point6_temp.dev_attr.attr,
  2242. &sensor_dev_attr_pwm2_auto_point7_temp.dev_attr.attr,
  2243. &sensor_dev_attr_pwm2_auto_point8_temp.dev_attr.attr,
  2244. &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
  2245. &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
  2246. &sensor_dev_attr_pwm2_auto_point3_pwm.dev_attr.attr,
  2247. &sensor_dev_attr_pwm2_auto_point4_pwm.dev_attr.attr,
  2248. &sensor_dev_attr_pwm2_auto_point5_pwm.dev_attr.attr,
  2249. &sensor_dev_attr_pwm2_auto_point6_pwm.dev_attr.attr,
  2250. &sensor_dev_attr_pwm2_auto_point7_pwm.dev_attr.attr,
  2251. &sensor_dev_attr_pwm2_auto_point8_pwm.dev_attr.attr,
  2252. NULL
  2253. };
  2254. static umode_t asus_fan_curve_is_visible(struct kobject *kobj,
  2255. struct attribute *attr, int idx)
  2256. {
  2257. struct device *dev = kobj_to_dev(kobj);
  2258. struct asus_wmi *asus = dev_get_drvdata(dev->parent);
  2259. /*
  2260. * Check the char instead of casting attr as there are two attr types
  2261. * involved here (attr1 and attr2)
  2262. */
  2263. if (asus->cpu_fan_curve_available && attr->name[3] == '1')
  2264. return 0644;
  2265. if (asus->gpu_fan_curve_available && attr->name[3] == '2')
  2266. return 0644;
  2267. return 0;
  2268. }
  2269. static const struct attribute_group asus_fan_curve_attr_group = {
  2270. .is_visible = asus_fan_curve_is_visible,
  2271. .attrs = asus_fan_curve_attr,
  2272. };
  2273. __ATTRIBUTE_GROUPS(asus_fan_curve_attr);
  2274. /*
  2275. * Must be initialised after throttle_thermal_policy_check_present() as
  2276. * we check the status of throttle_thermal_policy_available during init.
  2277. */
  2278. static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
  2279. {
  2280. struct device *dev = &asus->platform_device->dev;
  2281. struct device *hwmon;
  2282. int err;
  2283. err = fan_curve_check_present(asus, &asus->cpu_fan_curve_available,
  2284. ASUS_WMI_DEVID_CPU_FAN_CURVE);
  2285. if (err)
  2286. return err;
  2287. err = fan_curve_check_present(asus, &asus->gpu_fan_curve_available,
  2288. ASUS_WMI_DEVID_GPU_FAN_CURVE);
  2289. if (err)
  2290. return err;
  2291. if (!asus->cpu_fan_curve_available && !asus->gpu_fan_curve_available)
  2292. return 0;
  2293. hwmon = devm_hwmon_device_register_with_groups(
  2294. dev, "asus_custom_fan_curve", asus, asus_fan_curve_attr_groups);
  2295. if (IS_ERR(hwmon)) {
  2296. dev_err(dev,
  2297. "Could not register asus_custom_fan_curve device\n");
  2298. return PTR_ERR(hwmon);
  2299. }
  2300. return 0;
  2301. }
  2302. /* Throttle thermal policy ****************************************************/
  2303. static int throttle_thermal_policy_check_present(struct asus_wmi *asus)
  2304. {
  2305. u32 result;
  2306. int err;
  2307. asus->throttle_thermal_policy_available = false;
  2308. err = asus_wmi_get_devstate(asus,
  2309. ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
  2310. &result);
  2311. if (err) {
  2312. if (err == -ENODEV)
  2313. return 0;
  2314. return err;
  2315. }
  2316. if (result & ASUS_WMI_DSTS_PRESENCE_BIT)
  2317. asus->throttle_thermal_policy_available = true;
  2318. return 0;
  2319. }
  2320. static int throttle_thermal_policy_write(struct asus_wmi *asus)
  2321. {
  2322. int err;
  2323. u8 value;
  2324. u32 retval;
  2325. value = asus->throttle_thermal_policy_mode;
  2326. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY,
  2327. value, &retval);
  2328. sysfs_notify(&asus->platform_device->dev.kobj, NULL,
  2329. "throttle_thermal_policy");
  2330. if (err) {
  2331. pr_warn("Failed to set throttle thermal policy: %d\n", err);
  2332. return err;
  2333. }
  2334. if (retval != 1) {
  2335. pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n",
  2336. retval);
  2337. return -EIO;
  2338. }
  2339. /* Must set to disabled if mode is toggled */
  2340. if (asus->cpu_fan_curve_available)
  2341. asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
  2342. if (asus->gpu_fan_curve_available)
  2343. asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
  2344. return 0;
  2345. }
  2346. static int throttle_thermal_policy_set_default(struct asus_wmi *asus)
  2347. {
  2348. if (!asus->throttle_thermal_policy_available)
  2349. return 0;
  2350. asus->throttle_thermal_policy_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
  2351. return throttle_thermal_policy_write(asus);
  2352. }
  2353. static int throttle_thermal_policy_switch_next(struct asus_wmi *asus)
  2354. {
  2355. u8 new_mode = asus->throttle_thermal_policy_mode + 1;
  2356. int err;
  2357. if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
  2358. new_mode = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
  2359. asus->throttle_thermal_policy_mode = new_mode;
  2360. err = throttle_thermal_policy_write(asus);
  2361. if (err)
  2362. return err;
  2363. /*
  2364. * Ensure that platform_profile updates userspace with the change to ensure
  2365. * that platform_profile and throttle_thermal_policy_mode are in sync.
  2366. */
  2367. platform_profile_notify();
  2368. return 0;
  2369. }
  2370. static ssize_t throttle_thermal_policy_show(struct device *dev,
  2371. struct device_attribute *attr, char *buf)
  2372. {
  2373. struct asus_wmi *asus = dev_get_drvdata(dev);
  2374. u8 mode = asus->throttle_thermal_policy_mode;
  2375. return sysfs_emit(buf, "%d\n", mode);
  2376. }
  2377. static ssize_t throttle_thermal_policy_store(struct device *dev,
  2378. struct device_attribute *attr,
  2379. const char *buf, size_t count)
  2380. {
  2381. struct asus_wmi *asus = dev_get_drvdata(dev);
  2382. u8 new_mode;
  2383. int result;
  2384. int err;
  2385. result = kstrtou8(buf, 10, &new_mode);
  2386. if (result < 0)
  2387. return result;
  2388. if (new_mode > ASUS_THROTTLE_THERMAL_POLICY_SILENT)
  2389. return -EINVAL;
  2390. asus->throttle_thermal_policy_mode = new_mode;
  2391. err = throttle_thermal_policy_write(asus);
  2392. if (err)
  2393. return err;
  2394. /*
  2395. * Ensure that platform_profile updates userspace with the change to ensure
  2396. * that platform_profile and throttle_thermal_policy_mode are in sync.
  2397. */
  2398. platform_profile_notify();
  2399. return count;
  2400. }
  2401. // Throttle thermal policy: 0 - default, 1 - overboost, 2 - silent
  2402. static DEVICE_ATTR_RW(throttle_thermal_policy);
  2403. /* Platform profile ***********************************************************/
  2404. static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
  2405. enum platform_profile_option *profile)
  2406. {
  2407. struct asus_wmi *asus;
  2408. int tp;
  2409. asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
  2410. tp = asus->throttle_thermal_policy_mode;
  2411. switch (tp) {
  2412. case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
  2413. *profile = PLATFORM_PROFILE_BALANCED;
  2414. break;
  2415. case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
  2416. *profile = PLATFORM_PROFILE_PERFORMANCE;
  2417. break;
  2418. case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
  2419. *profile = PLATFORM_PROFILE_QUIET;
  2420. break;
  2421. default:
  2422. return -EINVAL;
  2423. }
  2424. return 0;
  2425. }
  2426. static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
  2427. enum platform_profile_option profile)
  2428. {
  2429. struct asus_wmi *asus;
  2430. int tp;
  2431. asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
  2432. switch (profile) {
  2433. case PLATFORM_PROFILE_PERFORMANCE:
  2434. tp = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
  2435. break;
  2436. case PLATFORM_PROFILE_BALANCED:
  2437. tp = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
  2438. break;
  2439. case PLATFORM_PROFILE_QUIET:
  2440. tp = ASUS_THROTTLE_THERMAL_POLICY_SILENT;
  2441. break;
  2442. default:
  2443. return -EOPNOTSUPP;
  2444. }
  2445. asus->throttle_thermal_policy_mode = tp;
  2446. return throttle_thermal_policy_write(asus);
  2447. }
  2448. static int platform_profile_setup(struct asus_wmi *asus)
  2449. {
  2450. struct device *dev = &asus->platform_device->dev;
  2451. int err;
  2452. /*
  2453. * Not an error if a component platform_profile relies on is unavailable
  2454. * so early return, skipping the setup of platform_profile.
  2455. */
  2456. if (!asus->throttle_thermal_policy_available)
  2457. return 0;
  2458. dev_info(dev, "Using throttle_thermal_policy for platform_profile support\n");
  2459. asus->platform_profile_handler.profile_get = asus_wmi_platform_profile_get;
  2460. asus->platform_profile_handler.profile_set = asus_wmi_platform_profile_set;
  2461. set_bit(PLATFORM_PROFILE_QUIET, asus->platform_profile_handler.choices);
  2462. set_bit(PLATFORM_PROFILE_BALANCED,
  2463. asus->platform_profile_handler.choices);
  2464. set_bit(PLATFORM_PROFILE_PERFORMANCE,
  2465. asus->platform_profile_handler.choices);
  2466. err = platform_profile_register(&asus->platform_profile_handler);
  2467. if (err)
  2468. return err;
  2469. asus->platform_profile_support = true;
  2470. return 0;
  2471. }
  2472. /* Backlight ******************************************************************/
  2473. static int read_backlight_power(struct asus_wmi *asus)
  2474. {
  2475. int ret;
  2476. if (asus->driver->quirks->store_backlight_power)
  2477. ret = !asus->driver->panel_power;
  2478. else
  2479. ret = asus_wmi_get_devstate_simple(asus,
  2480. ASUS_WMI_DEVID_BACKLIGHT);
  2481. if (ret < 0)
  2482. return ret;
  2483. return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
  2484. }
  2485. static int read_brightness_max(struct asus_wmi *asus)
  2486. {
  2487. u32 retval;
  2488. int err;
  2489. err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
  2490. if (err < 0)
  2491. return err;
  2492. retval = retval & ASUS_WMI_DSTS_MAX_BRIGTH_MASK;
  2493. retval >>= 8;
  2494. if (!retval)
  2495. return -ENODEV;
  2496. return retval;
  2497. }
  2498. static int read_brightness(struct backlight_device *bd)
  2499. {
  2500. struct asus_wmi *asus = bl_get_data(bd);
  2501. u32 retval;
  2502. int err;
  2503. err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_BRIGHTNESS, &retval);
  2504. if (err < 0)
  2505. return err;
  2506. return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK;
  2507. }
  2508. static u32 get_scalar_command(struct backlight_device *bd)
  2509. {
  2510. struct asus_wmi *asus = bl_get_data(bd);
  2511. u32 ctrl_param = 0;
  2512. if ((asus->driver->brightness < bd->props.brightness) ||
  2513. bd->props.brightness == bd->props.max_brightness)
  2514. ctrl_param = 0x00008001;
  2515. else if ((asus->driver->brightness > bd->props.brightness) ||
  2516. bd->props.brightness == 0)
  2517. ctrl_param = 0x00008000;
  2518. asus->driver->brightness = bd->props.brightness;
  2519. return ctrl_param;
  2520. }
  2521. static int update_bl_status(struct backlight_device *bd)
  2522. {
  2523. struct asus_wmi *asus = bl_get_data(bd);
  2524. u32 ctrl_param;
  2525. int power, err = 0;
  2526. power = read_backlight_power(asus);
  2527. if (power != -ENODEV && bd->props.power != power) {
  2528. ctrl_param = !!(bd->props.power == FB_BLANK_UNBLANK);
  2529. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT,
  2530. ctrl_param, NULL);
  2531. if (asus->driver->quirks->store_backlight_power)
  2532. asus->driver->panel_power = bd->props.power;
  2533. /* When using scalar brightness, updating the brightness
  2534. * will mess with the backlight power */
  2535. if (asus->driver->quirks->scalar_panel_brightness)
  2536. return err;
  2537. }
  2538. if (asus->driver->quirks->scalar_panel_brightness)
  2539. ctrl_param = get_scalar_command(bd);
  2540. else
  2541. ctrl_param = bd->props.brightness;
  2542. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BRIGHTNESS,
  2543. ctrl_param, NULL);
  2544. return err;
  2545. }
  2546. static const struct backlight_ops asus_wmi_bl_ops = {
  2547. .get_brightness = read_brightness,
  2548. .update_status = update_bl_status,
  2549. };
  2550. static int asus_wmi_backlight_notify(struct asus_wmi *asus, int code)
  2551. {
  2552. struct backlight_device *bd = asus->backlight_device;
  2553. int old = bd->props.brightness;
  2554. int new = old;
  2555. if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX)
  2556. new = code - NOTIFY_BRNUP_MIN + 1;
  2557. else if (code >= NOTIFY_BRNDOWN_MIN && code <= NOTIFY_BRNDOWN_MAX)
  2558. new = code - NOTIFY_BRNDOWN_MIN;
  2559. bd->props.brightness = new;
  2560. backlight_update_status(bd);
  2561. backlight_force_update(bd, BACKLIGHT_UPDATE_HOTKEY);
  2562. return old;
  2563. }
  2564. static int asus_wmi_backlight_init(struct asus_wmi *asus)
  2565. {
  2566. struct backlight_device *bd;
  2567. struct backlight_properties props;
  2568. int max;
  2569. int power;
  2570. max = read_brightness_max(asus);
  2571. if (max < 0)
  2572. return max;
  2573. power = read_backlight_power(asus);
  2574. if (power == -ENODEV)
  2575. power = FB_BLANK_UNBLANK;
  2576. else if (power < 0)
  2577. return power;
  2578. memset(&props, 0, sizeof(struct backlight_properties));
  2579. props.type = BACKLIGHT_PLATFORM;
  2580. props.max_brightness = max;
  2581. bd = backlight_device_register(asus->driver->name,
  2582. &asus->platform_device->dev, asus,
  2583. &asus_wmi_bl_ops, &props);
  2584. if (IS_ERR(bd)) {
  2585. pr_err("Could not register backlight device\n");
  2586. return PTR_ERR(bd);
  2587. }
  2588. asus->backlight_device = bd;
  2589. if (asus->driver->quirks->store_backlight_power)
  2590. asus->driver->panel_power = power;
  2591. bd->props.brightness = read_brightness(bd);
  2592. bd->props.power = power;
  2593. backlight_update_status(bd);
  2594. asus->driver->brightness = bd->props.brightness;
  2595. return 0;
  2596. }
  2597. static void asus_wmi_backlight_exit(struct asus_wmi *asus)
  2598. {
  2599. backlight_device_unregister(asus->backlight_device);
  2600. asus->backlight_device = NULL;
  2601. }
  2602. static int is_display_toggle(int code)
  2603. {
  2604. /* display toggle keys */
  2605. if ((code >= 0x61 && code <= 0x67) ||
  2606. (code >= 0x8c && code <= 0x93) ||
  2607. (code >= 0xa0 && code <= 0xa7) ||
  2608. (code >= 0xd0 && code <= 0xd5))
  2609. return 1;
  2610. return 0;
  2611. }
  2612. /* Fn-lock ********************************************************************/
  2613. static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus)
  2614. {
  2615. u32 result;
  2616. asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_FNLOCK, &result);
  2617. return (result & ASUS_WMI_DSTS_PRESENCE_BIT) &&
  2618. !(result & ASUS_WMI_FNLOCK_BIOS_DISABLED);
  2619. }
  2620. static void asus_wmi_fnlock_update(struct asus_wmi *asus)
  2621. {
  2622. int mode = asus->fnlock_locked;
  2623. asus_wmi_set_devstate(ASUS_WMI_DEVID_FNLOCK, mode, NULL);
  2624. }
  2625. /* WMI events *****************************************************************/
  2626. static int asus_wmi_get_event_code(u32 value)
  2627. {
  2628. struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
  2629. union acpi_object *obj;
  2630. acpi_status status;
  2631. int code;
  2632. status = wmi_get_event_data(value, &response);
  2633. if (ACPI_FAILURE(status)) {
  2634. pr_warn("Failed to get WMI notify code: %s\n",
  2635. acpi_format_exception(status));
  2636. return -EIO;
  2637. }
  2638. obj = (union acpi_object *)response.pointer;
  2639. if (obj && obj->type == ACPI_TYPE_INTEGER)
  2640. code = (int)(obj->integer.value & WMI_EVENT_MASK);
  2641. else
  2642. code = -EIO;
  2643. kfree(obj);
  2644. return code;
  2645. }
  2646. static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus)
  2647. {
  2648. unsigned int key_value = 1;
  2649. bool autorelease = 1;
  2650. if (asus->driver->key_filter) {
  2651. asus->driver->key_filter(asus->driver, &code, &key_value,
  2652. &autorelease);
  2653. if (code == ASUS_WMI_KEY_IGNORE)
  2654. return;
  2655. }
  2656. if (acpi_video_get_backlight_type() == acpi_backlight_vendor &&
  2657. code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNDOWN_MAX) {
  2658. asus_wmi_backlight_notify(asus, code);
  2659. return;
  2660. }
  2661. if (code == NOTIFY_KBD_BRTUP) {
  2662. kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
  2663. return;
  2664. }
  2665. if (code == NOTIFY_KBD_BRTDWN) {
  2666. kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1);
  2667. return;
  2668. }
  2669. if (code == NOTIFY_KBD_BRTTOGGLE) {
  2670. if (asus->kbd_led_wk == asus->kbd_led.max_brightness)
  2671. kbd_led_set_by_kbd(asus, 0);
  2672. else
  2673. kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1);
  2674. return;
  2675. }
  2676. if (code == NOTIFY_FNLOCK_TOGGLE) {
  2677. asus->fnlock_locked = !asus->fnlock_locked;
  2678. asus_wmi_fnlock_update(asus);
  2679. return;
  2680. }
  2681. if (code == asus->tablet_switch_event_code) {
  2682. asus_wmi_tablet_mode_get_state(asus);
  2683. return;
  2684. }
  2685. if (code == NOTIFY_KBD_FBM || code == NOTIFY_KBD_TTP) {
  2686. if (asus->fan_boost_mode_available)
  2687. fan_boost_mode_switch_next(asus);
  2688. if (asus->throttle_thermal_policy_available)
  2689. throttle_thermal_policy_switch_next(asus);
  2690. return;
  2691. }
  2692. if (is_display_toggle(code) && asus->driver->quirks->no_display_toggle)
  2693. return;
  2694. if (!sparse_keymap_report_event(asus->inputdev, code,
  2695. key_value, autorelease))
  2696. pr_info("Unknown key code 0x%x\n", code);
  2697. }
  2698. static void asus_wmi_notify(u32 value, void *context)
  2699. {
  2700. struct asus_wmi *asus = context;
  2701. int code;
  2702. int i;
  2703. for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
  2704. code = asus_wmi_get_event_code(value);
  2705. if (code < 0) {
  2706. pr_warn("Failed to get notify code: %d\n", code);
  2707. return;
  2708. }
  2709. if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
  2710. return;
  2711. asus_wmi_handle_event_code(code, asus);
  2712. /*
  2713. * Double check that queue is present:
  2714. * ATK (with queue) uses 0xff, ASUSWMI (without) 0xd2.
  2715. */
  2716. if (!asus->wmi_event_queue || value != WMI_EVENT_VALUE_ATK)
  2717. return;
  2718. }
  2719. pr_warn("Failed to process event queue, last code: 0x%x\n", code);
  2720. }
  2721. static int asus_wmi_notify_queue_flush(struct asus_wmi *asus)
  2722. {
  2723. int code;
  2724. int i;
  2725. for (i = 0; i < WMI_EVENT_QUEUE_SIZE + 1; i++) {
  2726. code = asus_wmi_get_event_code(WMI_EVENT_VALUE_ATK);
  2727. if (code < 0) {
  2728. pr_warn("Failed to get event during flush: %d\n", code);
  2729. return code;
  2730. }
  2731. if (code == WMI_EVENT_QUEUE_END || code == WMI_EVENT_MASK)
  2732. return 0;
  2733. }
  2734. pr_warn("Failed to flush event queue\n");
  2735. return -EIO;
  2736. }
  2737. /* Sysfs **********************************************************************/
  2738. static ssize_t store_sys_wmi(struct asus_wmi *asus, int devid,
  2739. const char *buf, size_t count)
  2740. {
  2741. u32 retval;
  2742. int err, value;
  2743. value = asus_wmi_get_devstate_simple(asus, devid);
  2744. if (value < 0)
  2745. return value;
  2746. err = kstrtoint(buf, 0, &value);
  2747. if (err)
  2748. return err;
  2749. err = asus_wmi_set_devstate(devid, value, &retval);
  2750. if (err < 0)
  2751. return err;
  2752. return count;
  2753. }
  2754. static ssize_t show_sys_wmi(struct asus_wmi *asus, int devid, char *buf)
  2755. {
  2756. int value = asus_wmi_get_devstate_simple(asus, devid);
  2757. if (value < 0)
  2758. return value;
  2759. return sprintf(buf, "%d\n", value);
  2760. }
  2761. #define ASUS_WMI_CREATE_DEVICE_ATTR(_name, _mode, _cm) \
  2762. static ssize_t show_##_name(struct device *dev, \
  2763. struct device_attribute *attr, \
  2764. char *buf) \
  2765. { \
  2766. struct asus_wmi *asus = dev_get_drvdata(dev); \
  2767. \
  2768. return show_sys_wmi(asus, _cm, buf); \
  2769. } \
  2770. static ssize_t store_##_name(struct device *dev, \
  2771. struct device_attribute *attr, \
  2772. const char *buf, size_t count) \
  2773. { \
  2774. struct asus_wmi *asus = dev_get_drvdata(dev); \
  2775. \
  2776. return store_sys_wmi(asus, _cm, buf, count); \
  2777. } \
  2778. static struct device_attribute dev_attr_##_name = { \
  2779. .attr = { \
  2780. .name = __stringify(_name), \
  2781. .mode = _mode }, \
  2782. .show = show_##_name, \
  2783. .store = store_##_name, \
  2784. }
  2785. ASUS_WMI_CREATE_DEVICE_ATTR(touchpad, 0644, ASUS_WMI_DEVID_TOUCHPAD);
  2786. ASUS_WMI_CREATE_DEVICE_ATTR(camera, 0644, ASUS_WMI_DEVID_CAMERA);
  2787. ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER);
  2788. ASUS_WMI_CREATE_DEVICE_ATTR(lid_resume, 0644, ASUS_WMI_DEVID_LID_RESUME);
  2789. ASUS_WMI_CREATE_DEVICE_ATTR(als_enable, 0644, ASUS_WMI_DEVID_ALS_ENABLE);
  2790. static ssize_t cpufv_store(struct device *dev, struct device_attribute *attr,
  2791. const char *buf, size_t count)
  2792. {
  2793. int value, rv;
  2794. rv = kstrtoint(buf, 0, &value);
  2795. if (rv)
  2796. return rv;
  2797. if (value < 0 || value > 2)
  2798. return -EINVAL;
  2799. rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL);
  2800. if (rv < 0)
  2801. return rv;
  2802. return count;
  2803. }
  2804. static DEVICE_ATTR_WO(cpufv);
  2805. static struct attribute *platform_attributes[] = {
  2806. &dev_attr_cpufv.attr,
  2807. &dev_attr_camera.attr,
  2808. &dev_attr_cardr.attr,
  2809. &dev_attr_touchpad.attr,
  2810. &dev_attr_egpu_enable.attr,
  2811. &dev_attr_dgpu_disable.attr,
  2812. &dev_attr_gpu_mux_mode.attr,
  2813. &dev_attr_lid_resume.attr,
  2814. &dev_attr_als_enable.attr,
  2815. &dev_attr_fan_boost_mode.attr,
  2816. &dev_attr_throttle_thermal_policy.attr,
  2817. &dev_attr_panel_od.attr,
  2818. NULL
  2819. };
  2820. static umode_t asus_sysfs_is_visible(struct kobject *kobj,
  2821. struct attribute *attr, int idx)
  2822. {
  2823. struct device *dev = kobj_to_dev(kobj);
  2824. struct asus_wmi *asus = dev_get_drvdata(dev);
  2825. bool ok = true;
  2826. int devid = -1;
  2827. if (attr == &dev_attr_camera.attr)
  2828. devid = ASUS_WMI_DEVID_CAMERA;
  2829. else if (attr == &dev_attr_cardr.attr)
  2830. devid = ASUS_WMI_DEVID_CARDREADER;
  2831. else if (attr == &dev_attr_touchpad.attr)
  2832. devid = ASUS_WMI_DEVID_TOUCHPAD;
  2833. else if (attr == &dev_attr_lid_resume.attr)
  2834. devid = ASUS_WMI_DEVID_LID_RESUME;
  2835. else if (attr == &dev_attr_als_enable.attr)
  2836. devid = ASUS_WMI_DEVID_ALS_ENABLE;
  2837. else if (attr == &dev_attr_egpu_enable.attr)
  2838. ok = asus->egpu_enable_available;
  2839. else if (attr == &dev_attr_dgpu_disable.attr)
  2840. ok = asus->dgpu_disable_available;
  2841. else if (attr == &dev_attr_gpu_mux_mode.attr)
  2842. ok = asus->gpu_mux_mode_available;
  2843. else if (attr == &dev_attr_fan_boost_mode.attr)
  2844. ok = asus->fan_boost_mode_available;
  2845. else if (attr == &dev_attr_throttle_thermal_policy.attr)
  2846. ok = asus->throttle_thermal_policy_available;
  2847. else if (attr == &dev_attr_panel_od.attr)
  2848. ok = asus->panel_overdrive_available;
  2849. if (devid != -1)
  2850. ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0);
  2851. return ok ? attr->mode : 0;
  2852. }
  2853. static const struct attribute_group platform_attribute_group = {
  2854. .is_visible = asus_sysfs_is_visible,
  2855. .attrs = platform_attributes
  2856. };
  2857. static void asus_wmi_sysfs_exit(struct platform_device *device)
  2858. {
  2859. sysfs_remove_group(&device->dev.kobj, &platform_attribute_group);
  2860. }
  2861. static int asus_wmi_sysfs_init(struct platform_device *device)
  2862. {
  2863. return sysfs_create_group(&device->dev.kobj, &platform_attribute_group);
  2864. }
  2865. /* Platform device ************************************************************/
  2866. static int asus_wmi_platform_init(struct asus_wmi *asus)
  2867. {
  2868. struct device *dev = &asus->platform_device->dev;
  2869. char *wmi_uid;
  2870. int rv;
  2871. /* INIT enable hotkeys on some models */
  2872. if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_INIT, 0, 0, &rv))
  2873. pr_info("Initialization: %#x\n", rv);
  2874. /* We don't know yet what to do with this version... */
  2875. if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) {
  2876. pr_info("BIOS WMI version: %d.%d\n", rv >> 16, rv & 0xFF);
  2877. asus->spec = rv;
  2878. }
  2879. /*
  2880. * The SFUN method probably allows the original driver to get the list
  2881. * of features supported by a given model. For now, 0x0100 or 0x0800
  2882. * bit signifies that the laptop is equipped with a Wi-Fi MiniPCI card.
  2883. * The significance of others is yet to be found.
  2884. */
  2885. if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SFUN, 0, 0, &rv)) {
  2886. pr_info("SFUN value: %#x\n", rv);
  2887. asus->sfun = rv;
  2888. }
  2889. /*
  2890. * Eee PC and Notebooks seems to have different method_id for DSTS,
  2891. * but it may also be related to the BIOS's SPEC.
  2892. * Note, on most Eeepc, there is no way to check if a method exist
  2893. * or note, while on notebooks, they returns 0xFFFFFFFE on failure,
  2894. * but once again, SPEC may probably be used for that kind of things.
  2895. *
  2896. * Additionally at least TUF Gaming series laptops return nothing for
  2897. * unknown methods, so the detection in this way is not possible.
  2898. *
  2899. * There is strong indication that only ACPI WMI devices that have _UID
  2900. * equal to "ASUSWMI" use DCTS whereas those with "ATK" use DSTS.
  2901. */
  2902. wmi_uid = wmi_get_acpi_device_uid(ASUS_WMI_MGMT_GUID);
  2903. if (!wmi_uid)
  2904. return -ENODEV;
  2905. if (!strcmp(wmi_uid, ASUS_ACPI_UID_ASUSWMI)) {
  2906. dev_info(dev, "Detected ASUSWMI, use DCTS\n");
  2907. asus->dsts_id = ASUS_WMI_METHODID_DCTS;
  2908. } else {
  2909. dev_info(dev, "Detected %s, not ASUSWMI, use DSTS\n", wmi_uid);
  2910. asus->dsts_id = ASUS_WMI_METHODID_DSTS;
  2911. }
  2912. /*
  2913. * Some devices can have multiple event codes stored in a queue before
  2914. * the module load if it was unloaded intermittently after calling
  2915. * the INIT method (enables event handling). The WMI notify handler is
  2916. * expected to retrieve all event codes until a retrieved code equals
  2917. * queue end marker (One or Ones). Old codes are flushed from the queue
  2918. * upon module load. Not enabling this when it should be has minimal
  2919. * visible impact so fall back if anything goes wrong.
  2920. */
  2921. wmi_uid = wmi_get_acpi_device_uid(asus->driver->event_guid);
  2922. if (wmi_uid && !strcmp(wmi_uid, ASUS_ACPI_UID_ATK)) {
  2923. dev_info(dev, "Detected ATK, enable event queue\n");
  2924. if (!asus_wmi_notify_queue_flush(asus))
  2925. asus->wmi_event_queue = true;
  2926. }
  2927. /* CWAP allow to define the behavior of the Fn+F2 key,
  2928. * this method doesn't seems to be present on Eee PCs */
  2929. if (asus->driver->quirks->wapf >= 0)
  2930. asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP,
  2931. asus->driver->quirks->wapf, NULL);
  2932. return 0;
  2933. }
  2934. /* debugfs ********************************************************************/
  2935. struct asus_wmi_debugfs_node {
  2936. struct asus_wmi *asus;
  2937. char *name;
  2938. int (*show) (struct seq_file *m, void *data);
  2939. };
  2940. static int show_dsts(struct seq_file *m, void *data)
  2941. {
  2942. struct asus_wmi *asus = m->private;
  2943. int err;
  2944. u32 retval = -1;
  2945. err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval);
  2946. if (err < 0)
  2947. return err;
  2948. seq_printf(m, "DSTS(%#x) = %#x\n", asus->debug.dev_id, retval);
  2949. return 0;
  2950. }
  2951. static int show_devs(struct seq_file *m, void *data)
  2952. {
  2953. struct asus_wmi *asus = m->private;
  2954. int err;
  2955. u32 retval = -1;
  2956. err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param,
  2957. &retval);
  2958. if (err < 0)
  2959. return err;
  2960. seq_printf(m, "DEVS(%#x, %#x) = %#x\n", asus->debug.dev_id,
  2961. asus->debug.ctrl_param, retval);
  2962. return 0;
  2963. }
  2964. static int show_call(struct seq_file *m, void *data)
  2965. {
  2966. struct asus_wmi *asus = m->private;
  2967. struct bios_args args = {
  2968. .arg0 = asus->debug.dev_id,
  2969. .arg1 = asus->debug.ctrl_param,
  2970. };
  2971. struct acpi_buffer input = { (acpi_size) sizeof(args), &args };
  2972. struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
  2973. union acpi_object *obj;
  2974. acpi_status status;
  2975. status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID,
  2976. 0, asus->debug.method_id,
  2977. &input, &output);
  2978. if (ACPI_FAILURE(status))
  2979. return -EIO;
  2980. obj = (union acpi_object *)output.pointer;
  2981. if (obj && obj->type == ACPI_TYPE_INTEGER)
  2982. seq_printf(m, "%#x(%#x, %#x) = %#x\n", asus->debug.method_id,
  2983. asus->debug.dev_id, asus->debug.ctrl_param,
  2984. (u32) obj->integer.value);
  2985. else
  2986. seq_printf(m, "%#x(%#x, %#x) = t:%d\n", asus->debug.method_id,
  2987. asus->debug.dev_id, asus->debug.ctrl_param,
  2988. obj ? obj->type : -1);
  2989. kfree(obj);
  2990. return 0;
  2991. }
  2992. static struct asus_wmi_debugfs_node asus_wmi_debug_files[] = {
  2993. {NULL, "devs", show_devs},
  2994. {NULL, "dsts", show_dsts},
  2995. {NULL, "call", show_call},
  2996. };
  2997. static int asus_wmi_debugfs_open(struct inode *inode, struct file *file)
  2998. {
  2999. struct asus_wmi_debugfs_node *node = inode->i_private;
  3000. return single_open(file, node->show, node->asus);
  3001. }
  3002. static const struct file_operations asus_wmi_debugfs_io_ops = {
  3003. .owner = THIS_MODULE,
  3004. .open = asus_wmi_debugfs_open,
  3005. .read = seq_read,
  3006. .llseek = seq_lseek,
  3007. .release = single_release,
  3008. };
  3009. static void asus_wmi_debugfs_exit(struct asus_wmi *asus)
  3010. {
  3011. debugfs_remove_recursive(asus->debug.root);
  3012. }
  3013. static void asus_wmi_debugfs_init(struct asus_wmi *asus)
  3014. {
  3015. int i;
  3016. asus->debug.root = debugfs_create_dir(asus->driver->name, NULL);
  3017. debugfs_create_x32("method_id", S_IRUGO | S_IWUSR, asus->debug.root,
  3018. &asus->debug.method_id);
  3019. debugfs_create_x32("dev_id", S_IRUGO | S_IWUSR, asus->debug.root,
  3020. &asus->debug.dev_id);
  3021. debugfs_create_x32("ctrl_param", S_IRUGO | S_IWUSR, asus->debug.root,
  3022. &asus->debug.ctrl_param);
  3023. for (i = 0; i < ARRAY_SIZE(asus_wmi_debug_files); i++) {
  3024. struct asus_wmi_debugfs_node *node = &asus_wmi_debug_files[i];
  3025. node->asus = asus;
  3026. debugfs_create_file(node->name, S_IFREG | S_IRUGO,
  3027. asus->debug.root, node,
  3028. &asus_wmi_debugfs_io_ops);
  3029. }
  3030. }
  3031. /* Init / exit ****************************************************************/
  3032. static int asus_wmi_add(struct platform_device *pdev)
  3033. {
  3034. struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
  3035. struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
  3036. struct asus_wmi *asus;
  3037. acpi_status status;
  3038. int err;
  3039. u32 result;
  3040. asus = kzalloc(sizeof(struct asus_wmi), GFP_KERNEL);
  3041. if (!asus)
  3042. return -ENOMEM;
  3043. asus->driver = wdrv;
  3044. asus->platform_device = pdev;
  3045. wdrv->platform_device = pdev;
  3046. platform_set_drvdata(asus->platform_device, asus);
  3047. if (wdrv->detect_quirks)
  3048. wdrv->detect_quirks(asus->driver);
  3049. err = asus_wmi_platform_init(asus);
  3050. if (err)
  3051. goto fail_platform;
  3052. asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
  3053. asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
  3054. asus->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX);
  3055. asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE);
  3056. asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
  3057. asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD);
  3058. err = fan_boost_mode_check_present(asus);
  3059. if (err)
  3060. goto fail_fan_boost_mode;
  3061. err = throttle_thermal_policy_check_present(asus);
  3062. if (err)
  3063. goto fail_throttle_thermal_policy;
  3064. else
  3065. throttle_thermal_policy_set_default(asus);
  3066. err = platform_profile_setup(asus);
  3067. if (err)
  3068. goto fail_platform_profile_setup;
  3069. err = asus_wmi_sysfs_init(asus->platform_device);
  3070. if (err)
  3071. goto fail_sysfs;
  3072. err = asus_wmi_input_init(asus);
  3073. if (err)
  3074. goto fail_input;
  3075. err = asus_wmi_fan_init(asus); /* probably no problems on error */
  3076. err = asus_wmi_hwmon_init(asus);
  3077. if (err)
  3078. goto fail_hwmon;
  3079. err = asus_wmi_custom_fan_curve_init(asus);
  3080. if (err)
  3081. goto fail_custom_fan_curve;
  3082. err = asus_wmi_led_init(asus);
  3083. if (err)
  3084. goto fail_leds;
  3085. asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
  3086. if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
  3087. asus->driver->wlan_ctrl_by_user = 1;
  3088. if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
  3089. err = asus_wmi_rfkill_init(asus);
  3090. if (err)
  3091. goto fail_rfkill;
  3092. }
  3093. if (asus->driver->quirks->wmi_force_als_set)
  3094. asus_wmi_set_als();
  3095. if (asus->driver->quirks->xusb2pr)
  3096. asus_wmi_set_xusb2pr(asus);
  3097. if (acpi_video_get_backlight_type() == acpi_backlight_vendor) {
  3098. err = asus_wmi_backlight_init(asus);
  3099. if (err && err != -ENODEV)
  3100. goto fail_backlight;
  3101. } else if (asus->driver->quirks->wmi_backlight_set_devstate)
  3102. err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL);
  3103. if (asus_wmi_has_fnlock_key(asus)) {
  3104. asus->fnlock_locked = fnlock_default;
  3105. asus_wmi_fnlock_update(asus);
  3106. }
  3107. status = wmi_install_notify_handler(asus->driver->event_guid,
  3108. asus_wmi_notify, asus);
  3109. if (ACPI_FAILURE(status)) {
  3110. pr_err("Unable to register notify handler - %d\n", status);
  3111. err = -ENODEV;
  3112. goto fail_wmi_handler;
  3113. }
  3114. if (asus->driver->quirks->i8042_filter) {
  3115. err = i8042_install_filter(asus->driver->quirks->i8042_filter);
  3116. if (err)
  3117. pr_warn("Unable to install key filter - %d\n", err);
  3118. }
  3119. asus_wmi_battery_init(asus);
  3120. asus_wmi_debugfs_init(asus);
  3121. return 0;
  3122. fail_wmi_handler:
  3123. asus_wmi_backlight_exit(asus);
  3124. fail_backlight:
  3125. asus_wmi_rfkill_exit(asus);
  3126. fail_rfkill:
  3127. asus_wmi_led_exit(asus);
  3128. fail_leds:
  3129. fail_hwmon:
  3130. asus_wmi_input_exit(asus);
  3131. fail_input:
  3132. asus_wmi_sysfs_exit(asus->platform_device);
  3133. fail_sysfs:
  3134. fail_throttle_thermal_policy:
  3135. fail_custom_fan_curve:
  3136. fail_platform_profile_setup:
  3137. if (asus->platform_profile_support)
  3138. platform_profile_remove();
  3139. fail_fan_boost_mode:
  3140. fail_platform:
  3141. kfree(asus);
  3142. return err;
  3143. }
  3144. static int asus_wmi_remove(struct platform_device *device)
  3145. {
  3146. struct asus_wmi *asus;
  3147. asus = platform_get_drvdata(device);
  3148. if (asus->driver->quirks->i8042_filter)
  3149. i8042_remove_filter(asus->driver->quirks->i8042_filter);
  3150. wmi_remove_notify_handler(asus->driver->event_guid);
  3151. asus_wmi_backlight_exit(asus);
  3152. asus_wmi_input_exit(asus);
  3153. asus_wmi_led_exit(asus);
  3154. asus_wmi_rfkill_exit(asus);
  3155. asus_wmi_debugfs_exit(asus);
  3156. asus_wmi_sysfs_exit(asus->platform_device);
  3157. asus_fan_set_auto(asus);
  3158. throttle_thermal_policy_set_default(asus);
  3159. asus_wmi_battery_exit(asus);
  3160. if (asus->platform_profile_support)
  3161. platform_profile_remove();
  3162. kfree(asus);
  3163. return 0;
  3164. }
  3165. /* Platform driver - hibernate/resume callbacks *******************************/
  3166. static int asus_hotk_thaw(struct device *device)
  3167. {
  3168. struct asus_wmi *asus = dev_get_drvdata(device);
  3169. if (asus->wlan.rfkill) {
  3170. bool wlan;
  3171. /*
  3172. * Work around bios bug - acpi _PTS turns off the wireless led
  3173. * during suspend. Normally it restores it on resume, but
  3174. * we should kick it ourselves in case hibernation is aborted.
  3175. */
  3176. wlan = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
  3177. asus_wmi_set_devstate(ASUS_WMI_DEVID_WLAN, wlan, NULL);
  3178. }
  3179. return 0;
  3180. }
  3181. static int asus_hotk_resume(struct device *device)
  3182. {
  3183. struct asus_wmi *asus = dev_get_drvdata(device);
  3184. if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
  3185. kbd_led_update(asus);
  3186. if (asus_wmi_has_fnlock_key(asus))
  3187. asus_wmi_fnlock_update(asus);
  3188. asus_wmi_tablet_mode_get_state(asus);
  3189. return 0;
  3190. }
  3191. static int asus_hotk_restore(struct device *device)
  3192. {
  3193. struct asus_wmi *asus = dev_get_drvdata(device);
  3194. int bl;
  3195. /* Refresh both wlan rfkill state and pci hotplug */
  3196. if (asus->wlan.rfkill)
  3197. asus_rfkill_hotplug(asus);
  3198. if (asus->bluetooth.rfkill) {
  3199. bl = !asus_wmi_get_devstate_simple(asus,
  3200. ASUS_WMI_DEVID_BLUETOOTH);
  3201. rfkill_set_sw_state(asus->bluetooth.rfkill, bl);
  3202. }
  3203. if (asus->wimax.rfkill) {
  3204. bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WIMAX);
  3205. rfkill_set_sw_state(asus->wimax.rfkill, bl);
  3206. }
  3207. if (asus->wwan3g.rfkill) {
  3208. bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G);
  3209. rfkill_set_sw_state(asus->wwan3g.rfkill, bl);
  3210. }
  3211. if (asus->gps.rfkill) {
  3212. bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS);
  3213. rfkill_set_sw_state(asus->gps.rfkill, bl);
  3214. }
  3215. if (asus->uwb.rfkill) {
  3216. bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB);
  3217. rfkill_set_sw_state(asus->uwb.rfkill, bl);
  3218. }
  3219. if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
  3220. kbd_led_update(asus);
  3221. if (asus_wmi_has_fnlock_key(asus))
  3222. asus_wmi_fnlock_update(asus);
  3223. asus_wmi_tablet_mode_get_state(asus);
  3224. return 0;
  3225. }
  3226. static const struct dev_pm_ops asus_pm_ops = {
  3227. .thaw = asus_hotk_thaw,
  3228. .restore = asus_hotk_restore,
  3229. .resume = asus_hotk_resume,
  3230. };
  3231. /* Registration ***************************************************************/
  3232. static int asus_wmi_probe(struct platform_device *pdev)
  3233. {
  3234. struct platform_driver *pdrv = to_platform_driver(pdev->dev.driver);
  3235. struct asus_wmi_driver *wdrv = to_asus_wmi_driver(pdrv);
  3236. int ret;
  3237. if (!wmi_has_guid(ASUS_WMI_MGMT_GUID)) {
  3238. pr_warn("ASUS Management GUID not found\n");
  3239. return -ENODEV;
  3240. }
  3241. if (wdrv->event_guid && !wmi_has_guid(wdrv->event_guid)) {
  3242. pr_warn("ASUS Event GUID not found\n");
  3243. return -ENODEV;
  3244. }
  3245. if (wdrv->probe) {
  3246. ret = wdrv->probe(pdev);
  3247. if (ret)
  3248. return ret;
  3249. }
  3250. return asus_wmi_add(pdev);
  3251. }
  3252. static bool used;
  3253. int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver)
  3254. {
  3255. struct platform_driver *platform_driver;
  3256. struct platform_device *platform_device;
  3257. if (used)
  3258. return -EBUSY;
  3259. platform_driver = &driver->platform_driver;
  3260. platform_driver->remove = asus_wmi_remove;
  3261. platform_driver->driver.owner = driver->owner;
  3262. platform_driver->driver.name = driver->name;
  3263. platform_driver->driver.pm = &asus_pm_ops;
  3264. platform_device = platform_create_bundle(platform_driver,
  3265. asus_wmi_probe,
  3266. NULL, 0, NULL, 0);
  3267. if (IS_ERR(platform_device))
  3268. return PTR_ERR(platform_device);
  3269. used = true;
  3270. return 0;
  3271. }
  3272. EXPORT_SYMBOL_GPL(asus_wmi_register_driver);
  3273. void asus_wmi_unregister_driver(struct asus_wmi_driver *driver)
  3274. {
  3275. platform_device_unregister(driver->platform_device);
  3276. platform_driver_unregister(&driver->platform_driver);
  3277. used = false;
  3278. }
  3279. EXPORT_SYMBOL_GPL(asus_wmi_unregister_driver);
  3280. static int __init asus_wmi_init(void)
  3281. {
  3282. pr_info("ASUS WMI generic driver loaded\n");
  3283. return 0;
  3284. }
  3285. static void __exit asus_wmi_exit(void)
  3286. {
  3287. pr_info("ASUS WMI generic driver unloaded\n");
  3288. }
  3289. module_init(asus_wmi_init);
  3290. module_exit(asus_wmi_exit);