mt_pwm.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848
  1. /*******************************************************************************
  2. * mt_pwm.c PWM Drvier
  3. *
  4. * Copyright (c) 2012, Media Teck.inc
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms and conditions of the GNU General Public Licence,
  8. * version 2, as publish by the Free Software Foundation.
  9. *
  10. * This program is distributed and in hope it will be useful, but WITHOUT
  11. * ANY WARRNTY; without even the implied warranty of MERCHANTABITLITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. */
  16. #include <linux/init.h>
  17. #include <linux/module.h>
  18. #include <linux/kernel.h>
  19. #include <generated/autoconf.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/fs.h>
  22. #include <linux/types.h>
  23. #include <linux/delay.h>
  24. #include <linux/dma-mapping.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/slab.h>
  27. #include <linux/types.h>
  28. #include <linux/device.h>
  29. #include <linux/spinlock.h>
  30. #include <linux/cdev.h>
  31. #include <linux/miscdevice.h>
  32. #include <linux/atomic.h>
  33. #include <linux/uaccess.h>
  34. #include <linux/io.h>
  35. #ifdef CONFIG_OF
  36. #include <linux/of.h>
  37. #include <linux/of_address.h>
  38. #include <linux/of_irq.h>
  39. #endif
  40. #include <mt-plat/mt_pwm.h>
  41. #include <mt-plat/mt_pwm_hal_pub.h>
  42. #include <mach/mt_pwm_hal.h>
  43. #if !defined(CONFIG_MTK_CLKMGR)
  44. #include <linux/clk.h>
  45. #endif
  46. #ifdef CONFIG_OF
  47. void __iomem *pwm_base;
  48. #endif
  49. struct pwm_device {
  50. const char *name;
  51. atomic_t ref;
  52. dev_t devno;
  53. spinlock_t lock;
  54. unsigned long power_flag;/* bitwise, bit(8):map to MT_CG_PERI0_PWM */
  55. struct device dev;
  56. };
  57. static struct pwm_device pwm_dat = {
  58. .name = PWM_DEVICE,
  59. .ref = ATOMIC_INIT(0),
  60. .power_flag = 0,
  61. .lock = __SPIN_LOCK_UNLOCKED(pwm_dat.lock)
  62. };
  63. static struct pwm_device *pwm_dev = &pwm_dat;
  64. static void mt_pwm_power_on(u32 pwm_no, bool pmic_pad)
  65. {
  66. mt_pwm_power_on_hal(pwm_no, pmic_pad, &(pwm_dev->power_flag));
  67. }
  68. static void mt_pwm_power_off(u32 pwm_no, bool pmic_pad)
  69. {
  70. mt_pwm_power_off_hal(pwm_no, pmic_pad, &(pwm_dev->power_flag));
  71. }
  72. static s32 mt_pwm_sel_pmic(u32 pwm_no)
  73. {
  74. unsigned long flags;
  75. s32 ret;
  76. struct pwm_device *dev = pwm_dev;
  77. spin_lock_irqsave(&dev->lock, flags);
  78. ret = mt_pwm_sel_pmic_hal(pwm_no);
  79. spin_unlock_irqrestore(&dev->lock, flags);
  80. if (ret == (-EEXCESSPWMNO))
  81. PWMDBG("PWM1~PWM4 not support pmic_pad\n");
  82. return ret;
  83. }
  84. static s32 mt_pwm_sel_ap(u32 pwm_no)
  85. {
  86. unsigned long flags;
  87. s32 ret;
  88. struct pwm_device *dev = pwm_dev;
  89. spin_lock_irqsave(&dev->lock, flags);
  90. ret = mt_pwm_sel_ap_hal(pwm_no);
  91. spin_unlock_irqrestore(&dev->lock, flags);
  92. if (ret == (-EEXCESSPWMNO))
  93. PWMDBG("PWM1~PWM4 not support pmic_pad\n");
  94. return ret;
  95. }
  96. /*******************************************************
  97. * Set PWM_ENABLE register bit to enable pwm1~pwm7
  98. *
  99. ********************************************************/
  100. static s32 mt_set_pwm_enable(u32 pwm_no)
  101. {
  102. unsigned long flags;
  103. struct pwm_device *dev = pwm_dev;
  104. if (!dev) {
  105. PWMDBG("dev is not valid!\n");
  106. return -EINVALID;
  107. }
  108. if (pwm_no >= PWM_MAX) {
  109. PWMDBG("pwm number is not between PWM1~PWM7\n");
  110. return -EEXCESSPWMNO;
  111. }
  112. spin_lock_irqsave(&dev->lock, flags);
  113. mt_set_pwm_enable_hal(pwm_no);
  114. spin_unlock_irqrestore(&dev->lock, flags);
  115. return RSUCCESS;
  116. }
  117. /*******************************************************/
  118. static s32 mt_set_pwm_disable(u32 pwm_no)
  119. {
  120. unsigned long flags;
  121. struct pwm_device *dev = pwm_dev;
  122. if (!dev) {
  123. PWMDBG("dev is not valid\n");
  124. return -EINVALID;
  125. }
  126. if (pwm_no >= PWM_MAX) {
  127. PWMDBG("pwm number is not between PWM1~PWM7\n");
  128. return -EEXCESSPWMNO;
  129. }
  130. spin_lock_irqsave(&dev->lock, flags);
  131. mt_set_pwm_disable_hal(pwm_no);
  132. spin_unlock_irqrestore(&dev->lock, flags);
  133. mdelay(1);
  134. return RSUCCESS;
  135. }
  136. void mt_pwm_disable(u32 pwm_no, u8 pmic_pad)
  137. {
  138. mt_set_pwm_disable(pwm_no);
  139. mt_pwm_power_off(pwm_no, pmic_pad);
  140. }
  141. void mt_set_pwm_enable_seqmode(void)
  142. {
  143. unsigned long flags;
  144. struct pwm_device *dev = pwm_dev;
  145. if (!dev) {
  146. PWMDBG("dev is not valid\n");
  147. return;
  148. }
  149. spin_lock_irqsave(&dev->lock, flags);
  150. mt_set_pwm_enable_seqmode_hal();
  151. spin_unlock_irqrestore(&dev->lock, flags);
  152. }
  153. void mt_set_pwm_disable_seqmode(void)
  154. {
  155. unsigned long flags;
  156. struct pwm_device *dev = pwm_dev;
  157. if (!dev) {
  158. PWMDBG("dev is not valid\n");
  159. return;
  160. }
  161. spin_lock_irqsave(&dev->lock, flags);
  162. mt_set_pwm_disable_seqmode_hal();
  163. spin_unlock_irqrestore(&dev->lock, flags);
  164. }
  165. s32 mt_set_pwm_test_sel(u32 val) /* val as 0 or 1 */
  166. {
  167. unsigned long flags;
  168. struct pwm_device *dev = pwm_dev;
  169. if (!dev) {
  170. PWMDBG("dev is not pwm_dev\n");
  171. return -EINVALID;
  172. }
  173. spin_lock_irqsave(&dev->lock, flags);
  174. if (mt_set_pwm_test_sel_hal(val))
  175. goto err;
  176. spin_unlock_irqrestore(&dev->lock, flags);
  177. return RSUCCESS;
  178. err:
  179. spin_unlock_irqrestore(&dev->lock, flags);
  180. return -EPARMNOSUPPORT;
  181. }
  182. s32 mt_set_pwm_clk(u32 pwm_no, u32 clksrc, u32 div)
  183. {
  184. unsigned long flags;
  185. struct pwm_device *dev = pwm_dev;
  186. if (!dev) {
  187. PWMDBG("dev is not valid\n");
  188. return -EINVALID;
  189. }
  190. if (pwm_no >= PWM_MAX) {
  191. PWMDBG("pwm number excesses PWM_MAX\n");
  192. return -EEXCESSPWMNO;
  193. }
  194. if (div >= CLK_DIV_MAX) {
  195. PWMDBG("division excesses CLK_DIV_MAX\n");
  196. return -EPARMNOSUPPORT;
  197. }
  198. if ((clksrc & 0x7FFFFFFF) > CLK_BLOCK_BY_1625_OR_32K) {
  199. PWMDBG("clksrc excesses CLK_BLOCK_BY_1625_OR_32K\n");
  200. return -EPARMNOSUPPORT;
  201. }
  202. spin_lock_irqsave(&dev->lock, flags);
  203. mt_set_pwm_clk_hal(pwm_no, clksrc, div);
  204. spin_unlock_irqrestore(&dev->lock, flags);
  205. return RSUCCESS;
  206. }
  207. s32 mt_get_pwm_clk(u32 pwm_no)
  208. {
  209. struct pwm_device *dev = pwm_dev;
  210. if (!dev) {
  211. PWMDBG("dev is not valid\n");
  212. return -EINVALID;
  213. }
  214. if (pwm_no >= PWM_MAX) {
  215. PWMDBG("pwm number excesses PWM_MAX\n");
  216. return -EEXCESSPWMNO;
  217. }
  218. return mt_get_pwm_clk_hal(pwm_no);
  219. }
  220. /******************************************
  221. * Set PWM_CON register data source
  222. * pwm_no: pwm1~pwm7(0~6)
  223. *val: 0 is fifo mode
  224. * 1 is memory mode
  225. *******************************************/
  226. static s32 mt_set_pwm_con_datasrc(u32 pwm_no, u32 val)
  227. {
  228. unsigned long flags;
  229. struct pwm_device *dev = pwm_dev;
  230. if (!dev) {
  231. PWMDBG("pwm device doesn't exist\n");
  232. return -EINVALID;
  233. }
  234. if (pwm_no >= PWM_MAX) {
  235. PWMDBG("pwm number excesses PWM_MAX\n");
  236. return -EEXCESSPWMNO;
  237. }
  238. spin_lock_irqsave(&dev->lock, flags);
  239. if (mt_set_pwm_con_datasrc_hal(pwm_no, val))
  240. goto err;
  241. spin_unlock_irqrestore(&dev->lock, flags);
  242. return RSUCCESS;
  243. err:
  244. spin_unlock_irqrestore(&dev->lock, flags);
  245. return -EPARMNOSUPPORT;
  246. }
  247. /************************************************
  248. * set the PWM_CON register
  249. * pwm_no : pwm1~pwm7 (0~6)
  250. * val: 0 is period mode
  251. * 1 is random mode
  252. *
  253. ***************************************************/
  254. static s32 mt_set_pwm_con_mode(u32 pwm_no, u32 val)
  255. {
  256. unsigned long flags;
  257. struct pwm_device *dev = pwm_dev;
  258. if (!dev) {
  259. PWMDBG("dev is not valid\n");
  260. return -EINVALID;
  261. }
  262. if (pwm_no >= PWM_MAX) {
  263. PWMDBG("pwm number excesses PWM_MAX\n");
  264. return -EEXCESSPWMNO;
  265. }
  266. spin_lock_irqsave(&dev->lock, flags);
  267. if (mt_set_pwm_con_mode_hal(pwm_no, val))
  268. goto err;
  269. spin_unlock_irqrestore(&dev->lock, flags);
  270. return RSUCCESS;
  271. err:
  272. spin_unlock_irqrestore(&dev->lock, flags);
  273. return -EPARMNOSUPPORT;
  274. }
  275. /***********************************************
  276. *Set PWM_CON register, idle value bit
  277. * val: 0 means that idle state is not put out.
  278. * 1 means that idle state is put out
  279. *
  280. * IDLE_FALSE: 0
  281. * IDLE_TRUE: 1
  282. ***********************************************/
  283. static s32 mt_set_pwm_con_idleval(u32 pwm_no, u16 val)
  284. {
  285. unsigned long flags;
  286. struct pwm_device *dev = pwm_dev;
  287. if (!dev) {
  288. PWMDBG("dev is not valid\n");
  289. return -EINVALID;
  290. }
  291. if (pwm_no >= PWM_MAX) {
  292. PWMDBG("pwm number excesses PWM_MAX\n");
  293. return -EEXCESSPWMNO;
  294. }
  295. spin_lock_irqsave(&dev->lock, flags);
  296. if (mt_set_pwm_con_idleval_hal(pwm_no, val))
  297. goto err;
  298. spin_unlock_irqrestore(&dev->lock, flags);
  299. return RSUCCESS;
  300. err:
  301. spin_unlock_irqrestore(&dev->lock, flags);
  302. return -EPARMNOSUPPORT;
  303. }
  304. /*********************************************
  305. * Set PWM_CON register guardvalue bit
  306. * val: 0 means guard state is not put out.
  307. * 1 mens guard state is put out.
  308. *
  309. * GUARD_FALSE: 0
  310. * GUARD_TRUE: 1
  311. **********************************************/
  312. static s32 mt_set_pwm_con_guardval(u32 pwm_no, u16 val)
  313. {
  314. unsigned long flags;
  315. struct pwm_device *dev = pwm_dev;
  316. if (!dev) {
  317. PWMDBG("dev is not valid\n");
  318. return -EINVALID;
  319. }
  320. if (pwm_no >= PWM_MAX) {
  321. PWMDBG("pwm number excesses PWM_MAX\n");
  322. return -EEXCESSPWMNO;
  323. }
  324. spin_lock_irqsave(&dev->lock, flags);
  325. if (mt_set_pwm_con_guardval_hal(pwm_no, val))
  326. goto err;
  327. spin_unlock_irqrestore(&dev->lock, flags);
  328. return RSUCCESS;
  329. err:
  330. spin_unlock_irqrestore(&dev->lock, flags);
  331. return -EPARMNOSUPPORT;
  332. }
  333. /*************************************************
  334. * Set PWM_CON register stopbits
  335. *stop bits should be less then 0x3f
  336. *
  337. **************************************************/
  338. static s32 mt_set_pwm_con_stpbit(u32 pwm_no, u32 stpbit, u32 srcsel)
  339. {
  340. unsigned long flags;
  341. struct pwm_device *dev = pwm_dev;
  342. if (!dev) {
  343. PWMDBG("dev is not valid\n");
  344. return -EINVALID;
  345. }
  346. if (pwm_no >= PWM_MAX) {
  347. PWMDBG("pwm number excesses PWM_MAX\n");
  348. return -EEXCESSPWMNO;
  349. }
  350. if (srcsel == PWM_FIFO) {
  351. if (stpbit > 0x3f) {
  352. PWMDBG("stpbit execesses the most of 0x3f in fifo mode\n");
  353. return -EPARMNOSUPPORT;
  354. }
  355. } else if (srcsel == MEMORY) {
  356. if (stpbit > 0x1f) {
  357. PWMDBG("stpbit excesses the most of 0x1f in memory mode\n");
  358. return -EPARMNOSUPPORT;
  359. }
  360. }
  361. spin_lock_irqsave(&dev->lock, flags);
  362. mt_set_pwm_con_stpbit_hal(pwm_no, stpbit, srcsel);
  363. spin_unlock_irqrestore(&dev->lock, flags);
  364. return RSUCCESS;
  365. }
  366. /*****************************************************
  367. *Set PWM_CON register oldmode bit
  368. * val: 0 means disable oldmode
  369. * 1 means enable oldmode
  370. *
  371. * OLDMODE_DISABLE: 0
  372. * OLDMODE_ENABLE: 1
  373. ******************************************************/
  374. static s32 mt_set_pwm_con_oldmode(u32 pwm_no, u32 val)
  375. {
  376. unsigned long flags;
  377. struct pwm_device *dev = pwm_dev;
  378. if (!dev) {
  379. PWMDBG("dev is not valid\n");
  380. return -EINVALID;
  381. }
  382. if (pwm_no >= PWM_MAX) {
  383. PWMDBG("pwm number excesses PWM_MAX\n");
  384. return -EEXCESSPWMNO;
  385. }
  386. spin_lock_irqsave(&dev->lock, flags);
  387. if (mt_set_pwm_con_oldmode_hal(pwm_no, val))
  388. goto err;
  389. spin_unlock_irqrestore(&dev->lock, flags);
  390. return RSUCCESS;
  391. err:
  392. spin_unlock_irqrestore(&dev->lock, flags);
  393. return -EPARMNOSUPPORT;
  394. }
  395. /***********************************************************
  396. * Set PWM_HIDURATION register
  397. *
  398. *************************************************************/
  399. static s32 mt_set_pwm_HiDur(u32 pwm_no, u16 DurVal)
  400. {
  401. unsigned long flags;
  402. struct pwm_device *dev = pwm_dev;
  403. if (!dev) {
  404. PWMDBG("dev is not valid\n");
  405. return -EINVALID;
  406. }
  407. if (pwm_no >= PWM_MAX) {
  408. PWMDBG("pwm number excesses PWM_MAX\n");
  409. return -EEXCESSPWMNO;
  410. }
  411. spin_lock_irqsave(&dev->lock, flags);
  412. mt_set_pwm_HiDur_hal(pwm_no, DurVal);
  413. spin_unlock_irqrestore(&dev->lock, flags);
  414. return RSUCCESS;
  415. }
  416. /************************************************
  417. * Set PWM Low Duration register
  418. *************************************************/
  419. static s32 mt_set_pwm_LowDur(u32 pwm_no, u16 DurVal)
  420. {
  421. unsigned long flags;
  422. struct pwm_device *dev = pwm_dev;
  423. if (!dev) {
  424. PWMDBG("dev is not valid\n");
  425. return -EINVALID;
  426. }
  427. if (pwm_no >= PWM_MAX) {
  428. PWMDBG("pwm number excesses PWM_MAX\n");
  429. return -EEXCESSPWMNO;
  430. }
  431. spin_lock_irqsave(&dev->lock, flags);
  432. mt_set_pwm_LowDur_hal(pwm_no, DurVal);
  433. spin_unlock_irqrestore(&dev->lock, flags);
  434. return RSUCCESS;
  435. }
  436. /***************************************************
  437. * Set PWM_GUARDDURATION register
  438. * pwm_no: PWM1~PWM7(0~6)
  439. * DurVal: the value of guard duration
  440. ****************************************************/
  441. static s32 mt_set_pwm_GuardDur(u32 pwm_no, u16 DurVal)
  442. {
  443. unsigned long flags;
  444. struct pwm_device *dev = pwm_dev;
  445. if (!dev) {
  446. PWMDBG("dev is not valid\n");
  447. return -EINVALID;
  448. }
  449. if (pwm_no >= PWM_MAX) {
  450. PWMDBG("pwm number excesses PWM_MAX\n");
  451. return -EEXCESSPWMNO;
  452. }
  453. spin_lock_irqsave(&dev->lock, flags);
  454. mt_set_pwm_GuardDur_hal(pwm_no, DurVal);
  455. spin_unlock_irqrestore(&dev->lock, flags);
  456. return RSUCCESS;
  457. }
  458. /*****************************************************
  459. * Set pwm_buf0_addr register
  460. * pwm_no: pwm1~pwm7 (0~6)
  461. * addr: data address
  462. ******************************************************/
  463. s32 mt_set_pwm_buf0_addr(u32 pwm_no, u32 *addr)
  464. {
  465. unsigned long flags;
  466. struct pwm_device *dev = pwm_dev;
  467. if (!dev) {
  468. PWMDBG("dev is not valid\n");
  469. return -EINVALID;
  470. }
  471. if (pwm_no >= PWM_MAX) {
  472. PWMDBG("pwm number excesses PWM_MAX\n");
  473. return -EEXCESSPWMNO;
  474. }
  475. spin_lock_irqsave(&dev->lock, flags);
  476. mt_set_pwm_buf0_addr_hal(pwm_no, addr);
  477. spin_unlock_irqrestore(&dev->lock, flags);
  478. return RSUCCESS;
  479. }
  480. /*****************************************************
  481. * Set pwm_buf0_size register
  482. * pwm_no: pwm1~pwm7 (0~6)
  483. * size: size of data
  484. ******************************************************/
  485. s32 mt_set_pwm_buf0_size(u32 pwm_no, u16 size)
  486. {
  487. unsigned long flags;
  488. struct pwm_device *dev = pwm_dev;
  489. if (!dev) {
  490. PWMDBG("dev is not valid\n");
  491. return -EINVALID;
  492. }
  493. if (pwm_no >= PWM_MAX) {
  494. PWMDBG("pwm number excesses PWM_MAX\n");
  495. return -EEXCESSPWMNO;
  496. }
  497. spin_lock_irqsave(&dev->lock, flags);
  498. mt_set_pwm_buf0_size_hal(pwm_no, size);
  499. spin_unlock_irqrestore(&dev->lock, flags);
  500. return RSUCCESS;
  501. }
  502. /*****************************************************
  503. * Set pwm_buf1_addr register
  504. * pwm_no: pwm1~pwm7 (0~6)
  505. * addr: data address
  506. *****************************************************
  507. s32 mt_set_pwm_buf1_addr (u32 pwm_no, u32 addr )
  508. {
  509. unsigned long flags;
  510. u32 reg_buff1_addr;
  511. struct pwm_device *dev = pwm_dev;
  512. if ( !dev ) {
  513. PWMDBG ( "dev is not valid\n" );
  514. return -EINVALID;
  515. }
  516. if ( pwm_no >= PWM_MAX ) {
  517. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  518. return -EEXCESSPWMNO;
  519. }
  520. reg_buff1_addr = PWM_register[pwm_no] + 4 * PWM_BUF1_BASE_ADDR;
  521. spin_lock_irqsave ( &dev->lock, flags );
  522. OUTREG32 ( reg_buff1_addr, addr );
  523. spin_unlock_irqrestore ( &dev->lock, flags );
  524. return RSUCCESS;
  525. }*/
  526. /*****************************************************
  527. * Set pwm_buf1_size register
  528. * pwm_no: pwm1~pwm7 (0~6)
  529. * size: size of data
  530. *****************************************************
  531. s32 mt_set_pwm_buf1_size ( u32 pwm_no, u16 size)
  532. {
  533. unsigned long flags;
  534. u32 reg_buff1_size;
  535. struct pwm_device *dev = pwm_dev;
  536. if ( !dev ) {
  537. PWMDBG ( "dev is not valid\n" );
  538. return -EINVALID;
  539. }
  540. if ( pwm_no >= PWM_MAX ) {
  541. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  542. return -EEXCESSPWMNO;
  543. }
  544. reg_buff1_size = PWM_register[pwm_no] + 4* PWM_BUF1_SIZE;
  545. spin_lock_irqsave ( &dev->lock, flags );
  546. OUTREG32 ( reg_buff1_size, size );
  547. spin_unlock_irqrestore ( &dev->lock, flags );
  548. return RSUCCESS;
  549. }*/
  550. /*****************************************************
  551. * Set pwm_send_data0 register
  552. * pwm_no: pwm1~pwm7 (0~6)
  553. * data: the data in the register
  554. ******************************************************/
  555. static s32 mt_set_pwm_send_data0(u32 pwm_no, u32 data)
  556. {
  557. unsigned long flags;
  558. struct pwm_device *dev = pwm_dev;
  559. if (!dev) {
  560. PWMDBG("dev is not valid\n");
  561. return -EINVALID;
  562. }
  563. if (pwm_no >= PWM_MAX) {
  564. PWMDBG("pwm number excesses PWM_MAX\n");
  565. return -EEXCESSPWMNO;
  566. }
  567. spin_lock_irqsave(&dev->lock, flags);
  568. mt_set_pwm_send_data0_hal(pwm_no, data);
  569. spin_unlock_irqrestore(&dev->lock, flags);
  570. return RSUCCESS;
  571. }
  572. /*****************************************************
  573. * Set pwm_send_data1 register
  574. * pwm_no: pwm1~pwm7 (0~6)
  575. * data: the data in the register
  576. ******************************************************/
  577. static s32 mt_set_pwm_send_data1(u32 pwm_no, u32 data)
  578. {
  579. unsigned long flags;
  580. struct pwm_device *dev = pwm_dev;
  581. if (!dev) {
  582. PWMDBG("dev is not valid\n");
  583. return -EINVALID;
  584. }
  585. if (pwm_no >= PWM_MAX) {
  586. PWMDBG("pwm number excesses PWM_MAX\n");
  587. return -EEXCESSPWMNO;
  588. }
  589. spin_lock_irqsave(&dev->lock, flags);
  590. mt_set_pwm_send_data1_hal(pwm_no, data);
  591. spin_unlock_irqrestore(&dev->lock, flags);
  592. return RSUCCESS;
  593. }
  594. /*****************************************************
  595. * Set pwm_wave_num register
  596. * pwm_no: pwm1~pwm7 (0~6)
  597. * num:the wave number
  598. ******************************************************/
  599. static s32 mt_set_pwm_wave_num(u32 pwm_no, u16 num)
  600. {
  601. unsigned long flags;
  602. struct pwm_device *dev = pwm_dev;
  603. if (!dev) {
  604. PWMDBG("dev is not valid\n");
  605. return -EINVALID;
  606. }
  607. if (pwm_no >= PWM_MAX) {
  608. PWMDBG("pwm number excesses PWM_MAX\n");
  609. return -EEXCESSPWMNO;
  610. }
  611. spin_lock_irqsave(&dev->lock, flags);
  612. mt_set_pwm_wave_num_hal(pwm_no, num);
  613. spin_unlock_irqrestore(&dev->lock, flags);
  614. return RSUCCESS;
  615. }
  616. /*****************************************************
  617. * Set pwm_data_width register.
  618. * This is only for old mode
  619. * pwm_no: pwm1~pwm7 (0~6)
  620. * width: set the guard value in the old mode
  621. ******************************************************/
  622. static s32 mt_set_pwm_data_width(u32 pwm_no, u16 width)
  623. {
  624. unsigned long flags;
  625. struct pwm_device *dev = pwm_dev;
  626. if (!dev) {
  627. PWMDBG("dev is not valid\n");
  628. return -EINVALID;
  629. }
  630. if (pwm_no >= PWM_MAX) {
  631. PWMDBG("pwm number excesses PWM_MAX\n");
  632. return -EEXCESSPWMNO;
  633. }
  634. spin_lock_irqsave(&dev->lock, flags);
  635. mt_set_pwm_data_width_hal(pwm_no, width);
  636. spin_unlock_irqrestore(&dev->lock, flags);
  637. return RSUCCESS;
  638. }
  639. /*****************************************************
  640. * Set pwm_thresh register
  641. * pwm_no: pwm1~pwm7 (0~6)
  642. * thresh: the thresh of the wave
  643. ******************************************************/
  644. static s32 mt_set_pwm_thresh(u32 pwm_no, u16 thresh)
  645. {
  646. unsigned long flags;
  647. struct pwm_device *dev = pwm_dev;
  648. if (!dev) {
  649. PWMDBG("dev is not valid\n");
  650. return -EINVALID;
  651. }
  652. if (pwm_no >= PWM_MAX) {
  653. PWMDBG(" pwm number excesses PWM_MAX\n");
  654. return -EEXCESSPWMNO;
  655. }
  656. spin_lock_irqsave(&dev->lock, flags);
  657. mt_set_pwm_thresh_hal(pwm_no, thresh);
  658. spin_unlock_irqrestore(&dev->lock, flags);
  659. return RSUCCESS;
  660. }
  661. /*****************************************************
  662. * Set pwm_send_wavenum register
  663. * pwm_no: pwm1~pwm7 (0~6)
  664. *
  665. ******************************************************/
  666. s32 mt_get_pwm_send_wavenum(u32 pwm_no)
  667. {
  668. struct pwm_device *dev = pwm_dev;
  669. if (!dev) {
  670. PWMDBG("dev is not valid\n");
  671. return -EBADADDR;
  672. }
  673. if (pwm_no >= PWM_MAX) {
  674. PWMDBG("pwm number excesses PWM_MAX\n");
  675. return -EEXCESSPWMNO;
  676. }
  677. return mt_get_pwm_send_wavenum_hal(pwm_no);
  678. }
  679. /*****************************************************
  680. * Set pwm_send_data1 register
  681. * pwm_no: pwm1~pwm7 (0~6)
  682. * buf_valid_bit:
  683. * for buf0: bit0 and bit1 should be set 1.
  684. * for buf1: bit2 and bit3 should be set 1.
  685. *****************************************************
  686. s32 mt_set_pwm_valid ( u32 pwm_no, u32 buf_valid_bit ) //set 0 for BUF0 bit or set 1 for BUF1 bit
  687. {
  688. unsigned long flags;
  689. u32 reg_valid;
  690. struct pwm_device *dev = pwm_dev;
  691. if ( !dev ) {
  692. PWMDBG ("dev is not valid\n");
  693. return -EINVALID;
  694. }
  695. if ( pwm_no >= PWM_MAX ) {
  696. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  697. return -EEXCESSPWMNO;
  698. }
  699. if ( !buf_valid_bit>= BUF_EN_MAX) {
  700. PWMDBG ( "inavlid bit\n" );
  701. return -EPARMNOSUPPORT;
  702. }
  703. if ( (pwm_no <= PWM2)||(pwm_no == PWM6))
  704. reg_valid = PWM_register[pwm_no] + 4 * PWM_VALID;
  705. else
  706. reg_valid = PWM_register[pwm_no] + 4* (PWM_VALID -2);
  707. spin_lock_irqsave ( &dev->lock, flags );
  708. SETREG32 ( reg_valid, 1 << buf_valid_bit );
  709. spin_unlock_irqrestore ( &dev->lock, flags );
  710. return RSUCCESS;
  711. }*/
  712. /*************************************************
  713. * set PWM4_delay when using SEQ mode
  714. *
  715. *************************************************
  716. s32 mt_set_pwm_delay_duration(u32 pwm_delay_reg, u16 val)
  717. {
  718. unsigned long flags;
  719. struct pwm_device *pwmdev = pwm_dev;
  720. if (!pwmdev) {
  721. PWMDBG( "device doesn't exist\n" );
  722. return -EBADADDR;
  723. }
  724. spin_lock_irqsave ( &pwmdev->lock, flags );
  725. MASKREG32 ( pwm_delay_reg, PWM_DELAY_DURATION_MASK, val );
  726. spin_unlock_irqrestore ( &pwmdev->lock, flags );
  727. return RSUCCESS;
  728. }*/
  729. /*******************************************************
  730. * Set pwm delay clock
  731. *
  732. *
  733. *******************************************************
  734. s32 mt_set_pwm_delay_clock (u32 pwm_delay_reg, u32 clksrc)
  735. {
  736. unsigned long flags;
  737. struct pwm_device *pwmdev = pwm_dev;
  738. if ( ! pwmdev ) {
  739. PWMDBG ( "device doesn't exist\n" );
  740. return -EBADADDR;
  741. }
  742. spin_lock_irqsave ( &pwmdev->lock, flags );
  743. MASKREG32 (pwm_delay_reg, PWM_DELAY_CLK_MASK, clksrc );
  744. spin_unlock_irqrestore (&pwmdev->lock, flags);
  745. return RSUCCESS;
  746. }*/
  747. /*******************************************
  748. * Set intr enable register
  749. * pwm_intr_enable_bit: the intr bit,
  750. *
  751. *********************************************/
  752. s32 mt_set_intr_enable(u32 pwm_intr_enable_bit)
  753. {
  754. unsigned long flags;
  755. struct pwm_device *dev = pwm_dev;
  756. if (!dev) {
  757. PWMDBG("dev is not valid\n");
  758. return -EINVALID;
  759. }
  760. if (pwm_intr_enable_bit >= PWM_INT_ENABLE_BITS_MAX) {
  761. PWMDBG(" pwm inter enable bit is not right.\n");
  762. return -EEXCESSBITS;
  763. }
  764. spin_lock_irqsave(&dev->lock, flags);
  765. mt_set_intr_enable_hal(pwm_intr_enable_bit);
  766. spin_unlock_irqrestore(&dev->lock, flags);
  767. return RSUCCESS;
  768. }
  769. /*****************************************************
  770. * Set intr status register
  771. * pwm_no: pwm1~pwm7 (0~6)
  772. * pwm_intr_status_bit
  773. ******************************************************/
  774. s32 mt_get_intr_status(u32 pwm_intr_status_bit)
  775. {
  776. unsigned long flags;
  777. int ret;
  778. struct pwm_device *dev = pwm_dev;
  779. if (!dev) {
  780. PWMDBG("dev is not valid\n");
  781. return -EINVALID;
  782. }
  783. if (pwm_intr_status_bit >= PWM_INT_STATUS_BITS_MAX) {
  784. PWMDBG("status bit excesses PWM_INT_STATUS_BITS_MAX\n");
  785. return -EEXCESSBITS;
  786. }
  787. spin_lock_irqsave(&dev->lock, flags);
  788. ret = mt_get_intr_status_hal(pwm_intr_status_bit);
  789. spin_unlock_irqrestore(&dev->lock, flags);
  790. return ret;
  791. }
  792. /*****************************************************
  793. * Set intr ack register
  794. * pwm_no: pwm1~pwm7 (0~6)
  795. * pwm_intr_ack_bit
  796. ******************************************************/
  797. s32 mt_set_intr_ack(u32 pwm_intr_ack_bit)
  798. {
  799. unsigned long flags;
  800. struct pwm_device *dev = pwm_dev;
  801. if (!dev) {
  802. PWMDBG("dev is not valid\n");
  803. return -EINVALID;
  804. }
  805. if (pwm_intr_ack_bit >= PWM_INT_ACK_BITS_MAX) {
  806. PWMDBG("ack bit excesses PWM_INT_ACK_BITS_MAX\n");
  807. return -EEXCESSBITS;
  808. }
  809. spin_lock_irqsave(&dev->lock, flags);
  810. mt_set_intr_ack_hal(pwm_intr_ack_bit);
  811. spin_unlock_irqrestore(&dev->lock, flags);
  812. return RSUCCESS;
  813. }
  814. /*----------3dLCM support-----------*/
  815. /*
  816. base pwm2, select pwm3&4&5 same as pwm2 or inversion of pwm2
  817. */
  818. void mt_set_pwm_3dlcm_enable(u8 enable)
  819. {
  820. unsigned long flags;
  821. struct pwm_device *dev = pwm_dev;
  822. if (!dev) {
  823. PWMDBG("dev is not valid\n");
  824. return;
  825. }
  826. spin_lock_irqsave(&dev->lock, flags);
  827. mt_set_pwm_3dlcm_enable_hal(enable);
  828. spin_unlock_irqrestore(&dev->lock, flags);
  829. }
  830. /*
  831. set "pwm_no" inversion of pwm base or not
  832. */
  833. void mt_set_pwm_3dlcm_inv(u32 pwm_no, u8 inv)
  834. {
  835. unsigned long flags;
  836. struct pwm_device *dev = pwm_dev;
  837. if (!dev) {
  838. PWMDBG("dev is not valid\n");
  839. return;
  840. }
  841. spin_lock_irqsave(&dev->lock, flags);
  842. mt_set_pwm_3dlcm_inv_hal(pwm_no, inv);
  843. spin_unlock_irqrestore(&dev->lock, flags);
  844. }
  845. /*
  846. void mt_set_pwm_3dlcm_base(u32 pwm_no)
  847. {
  848. unsigned long flags;
  849. struct pwm_device *dev = pwm_dev;
  850. if ( !dev ) {
  851. PWMDBG ( "dev is not valid\n" );
  852. return;
  853. }
  854. spin_lock_irqsave ( &dev->lock, flags );
  855. mt_set_pwm_3dlcm_base_hal(pwm_no);
  856. spin_unlock_irqrestore ( &dev->lock, flags );
  857. return;
  858. }
  859. */
  860. /*
  861. void mt_pwm_26M_clk_enable(u32 enable)
  862. {
  863. unsigned long flags;
  864. struct pwm_device *dev = pwm_dev;
  865. if ( !dev ) {
  866. PWMDBG ( "dev is not valid\n" );
  867. return;
  868. }
  869. spin_lock_irqsave ( &dev->lock, flags );
  870. mt_pwm_26M_clk_enable_hal(enable);
  871. spin_unlock_irqrestore ( &dev->lock, flags );
  872. return;
  873. }
  874. */
  875. s32 pwm_set_easy_config(struct pwm_easy_config *conf)
  876. {
  877. u32 duty = 0;
  878. u16 duration = 0;
  879. u32 data_AllH = 0xffffffff;
  880. u32 data0 = 0;
  881. u32 data1 = 0;
  882. if (conf->pwm_no >= PWM_MAX || conf->pwm_no < PWM_MIN) {
  883. PWMDBG("pwm number excess PWM_MAX\n");
  884. return -EEXCESSPWMNO;
  885. }
  886. if ((conf->clk_div >= CLK_DIV_MAX) || (conf->clk_div < CLK_DIV_MIN)) {
  887. PWMDBG("PWM clock division invalid\n");
  888. return -EINVALID;
  889. }
  890. if ((conf->clk_src >= PWM_CLK_SRC_INVALID) || (conf->clk_src < PWM_CLK_SRC_MIN)) {
  891. PWMDBG("PWM clock source invalid\n");
  892. return -EINVALID;
  893. }
  894. if (conf->duty < 0) {
  895. PWMDBG("duty parameter is invalid\n");
  896. return -EINVALID;
  897. }
  898. PWMDBG("pwm_set_easy_config\n");
  899. if (conf->duty == 0) {
  900. mt_set_pwm_disable(conf->pwm_no);
  901. mt_pwm_power_off(conf->pwm_no, conf->pmic_pad);
  902. return RSUCCESS;
  903. }
  904. duty = conf->duty;
  905. duration = conf->duration;
  906. switch (conf->clk_src) {
  907. case PWM_CLK_OLD_MODE_BLOCK:
  908. case PWM_CLK_OLD_MODE_32K:
  909. if (duration > 8191 || duration < 0) {
  910. PWMDBG("duration invalid parameter\n");
  911. return -EPARMNOSUPPORT;
  912. }
  913. if (duration < 10)
  914. duration = 10;
  915. break;
  916. case PWM_CLK_NEW_MODE_BLOCK:
  917. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  918. if (duration > 65535 || duration < 0) {
  919. PWMDBG("invalid parameters\n");
  920. return -EPARMNOSUPPORT;
  921. }
  922. break;
  923. default:
  924. PWMDBG("invalid clock source\n");
  925. return -EPARMNOSUPPORT;
  926. }
  927. if (duty > 100)
  928. duty = 100;
  929. if (duty > 50) {
  930. data0 = data_AllH;
  931. data1 = data_AllH >> ((PWM_NEW_MODE_DUTY_TOTAL_BITS * (100 - duty))/100);
  932. } else {
  933. data0 = data_AllH >> ((PWM_NEW_MODE_DUTY_TOTAL_BITS * (50 - duty))/100);
  934. PWMDBG("DATA0 :0x%x\n", data0);
  935. data1 = 0;
  936. }
  937. mt_pwm_power_on(conf->pwm_no, conf->pmic_pad);
  938. if (conf->pmic_pad)
  939. mt_pwm_sel_pmic(conf->pwm_no);
  940. else
  941. mt_pwm_sel_ap(conf->pwm_no);
  942. mt_set_pwm_con_guardval(conf->pwm_no, GUARD_TRUE);
  943. switch (conf->clk_src) {
  944. case PWM_CLK_OLD_MODE_32K:
  945. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_ENABLE);
  946. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  947. break;
  948. case PWM_CLK_OLD_MODE_BLOCK:
  949. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_ENABLE);
  950. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK, conf->clk_div);
  951. break;
  952. case PWM_CLK_NEW_MODE_BLOCK:
  953. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  954. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK , conf->clk_div);
  955. mt_set_pwm_con_datasrc(conf->pwm_no, PWM_FIFO);
  956. mt_set_pwm_con_stpbit(conf->pwm_no, 0x3f, PWM_FIFO);
  957. break;
  958. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  959. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  960. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  961. mt_set_pwm_con_datasrc(conf->pwm_no, PWM_FIFO);
  962. mt_set_pwm_con_stpbit(conf->pwm_no, 0x3f, PWM_FIFO);
  963. break;
  964. default:
  965. break;
  966. }
  967. PWMDBG("The duration is:%x\n", duration);
  968. PWMDBG("The data0 is:%x\n", data0);
  969. PWMDBG("The data1 is:%x\n", data1);
  970. mt_set_pwm_HiDur(conf->pwm_no, duration);
  971. mt_set_pwm_LowDur(conf->pwm_no, duration);
  972. mt_set_pwm_GuardDur(conf->pwm_no, 0);
  973. /* mt_set_pwm_buf0_addr (conf->pwm_no, 0 ); */
  974. /* mt_set_pwm_buf0_size( conf->pwm_no, 0 ); */
  975. /* mt_set_pwm_buf1_addr (conf->pwm_no, 0 ); */
  976. /* mt_set_pwm_buf1_size (conf->pwm_no, 0 ); */
  977. mt_set_pwm_send_data0(conf->pwm_no, data0);
  978. mt_set_pwm_send_data1(conf->pwm_no, data1);
  979. mt_set_pwm_wave_num(conf->pwm_no, 0);
  980. /* if ( conf->pwm_no <= PWM2 || conf->pwm_no == PWM6) */
  981. /* { */
  982. mt_set_pwm_data_width(conf->pwm_no, duration);
  983. mt_set_pwm_thresh(conf->pwm_no, ((duration * conf->duty)/100));
  984. /* mt_set_pwm_valid (conf->pwm_no, BUF0_EN_VALID ); */
  985. /* mt_set_pwm_valid ( conf->pwm_no, BUF1_EN_VALID ); */
  986. /* } */
  987. mb();/* For memory barrier */
  988. mt_set_pwm_enable(conf->pwm_no);
  989. PWMDBG("mt_set_pwm_enable\n");
  990. return RSUCCESS;
  991. }
  992. EXPORT_SYMBOL(pwm_set_easy_config);
  993. s32 pwm_set_spec_config(struct pwm_spec_config *conf)
  994. {
  995. if (conf->pwm_no >= PWM_MAX) {
  996. PWMDBG("pwm number excess PWM_MAX\n");
  997. return -EEXCESSPWMNO;
  998. }
  999. if ((conf->mode >= PWM_MODE_INVALID) || (conf->mode < PWM_MODE_MIN)) {
  1000. PWMDBG("PWM mode invalid\n");
  1001. return -EINVALID;
  1002. }
  1003. if ((conf->clk_src >= PWM_CLK_SRC_INVALID) || (conf->clk_src < PWM_CLK_SRC_MIN)) {
  1004. PWMDBG("PWM clock source invalid\n");
  1005. return -EINVALID;
  1006. }
  1007. if ((conf->clk_div >= CLK_DIV_MAX) || (conf->clk_div < CLK_DIV_MIN)) {
  1008. PWMDBG("PWM clock division invalid\n");
  1009. return -EINVALID;
  1010. }
  1011. if ((conf->mode == PWM_MODE_OLD && (conf->clk_src == PWM_CLK_NEW_MODE_BLOCK))
  1012. || (conf->mode != PWM_MODE_OLD &&
  1013. (conf->clk_src == PWM_CLK_OLD_MODE_32K
  1014. || conf->clk_src == PWM_CLK_OLD_MODE_BLOCK))) {
  1015. PWMDBG("parameters match error\n");
  1016. return -ERROR;
  1017. }
  1018. mt_pwm_power_on(conf->pwm_no, conf->pmic_pad);
  1019. if (conf->pmic_pad)
  1020. mt_pwm_sel_pmic(conf->pwm_no);
  1021. switch (conf->mode) {
  1022. case PWM_MODE_OLD:
  1023. PWMDBG("PWM_MODE_OLD\n");
  1024. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_ENABLE);
  1025. mt_set_pwm_con_idleval(conf->pwm_no, conf->PWM_MODE_OLD_REGS.IDLE_VALUE);
  1026. mt_set_pwm_con_guardval(conf->pwm_no, conf->PWM_MODE_OLD_REGS.GUARD_VALUE);
  1027. mt_set_pwm_GuardDur(conf->pwm_no, conf->PWM_MODE_OLD_REGS.GDURATION);
  1028. mt_set_pwm_wave_num(conf->pwm_no, conf->PWM_MODE_OLD_REGS.WAVE_NUM);
  1029. mt_set_pwm_data_width(conf->pwm_no, conf->PWM_MODE_OLD_REGS.DATA_WIDTH);
  1030. mt_set_pwm_thresh(conf->pwm_no, conf->PWM_MODE_OLD_REGS.THRESH);
  1031. PWMDBG("PWM set old mode finish\n");
  1032. break;
  1033. case PWM_MODE_FIFO:
  1034. PWMDBG("PWM_MODE_FIFO\n");
  1035. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  1036. mt_set_pwm_con_datasrc(conf->pwm_no, PWM_FIFO);
  1037. mt_set_pwm_con_mode(conf->pwm_no, PERIOD);
  1038. mt_set_pwm_con_idleval(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.IDLE_VALUE);
  1039. mt_set_pwm_con_guardval(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.GUARD_VALUE);
  1040. mt_set_pwm_HiDur(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.HDURATION);
  1041. mt_set_pwm_LowDur(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.LDURATION);
  1042. mt_set_pwm_GuardDur(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.GDURATION);
  1043. mt_set_pwm_send_data0(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.SEND_DATA0);
  1044. mt_set_pwm_send_data1(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.SEND_DATA1);
  1045. mt_set_pwm_wave_num(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.WAVE_NUM);
  1046. mt_set_pwm_con_stpbit(conf->pwm_no, conf->PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE,
  1047. PWM_FIFO);
  1048. break;
  1049. case PWM_MODE_MEMORY:
  1050. PWMDBG("PWM_MODE_MEMORY\n");
  1051. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  1052. mt_set_pwm_con_datasrc(conf->pwm_no, MEMORY);
  1053. mt_set_pwm_con_mode(conf->pwm_no, PERIOD);
  1054. mt_set_pwm_con_idleval(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.IDLE_VALUE);
  1055. mt_set_pwm_con_guardval(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.GUARD_VALUE);
  1056. mt_set_pwm_HiDur(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.HDURATION);
  1057. mt_set_pwm_LowDur(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.LDURATION);
  1058. mt_set_pwm_GuardDur(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.GDURATION);
  1059. mt_set_pwm_buf0_addr(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.BUF0_BASE_ADDR);
  1060. mt_set_pwm_buf0_size(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.BUF0_SIZE);
  1061. mt_set_pwm_wave_num(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.WAVE_NUM);
  1062. mt_set_pwm_con_stpbit(conf->pwm_no, conf->PWM_MODE_MEMORY_REGS.STOP_BITPOS_VALUE,
  1063. MEMORY);
  1064. break;
  1065. /*
  1066. case PWM_MODE_RANDOM:
  1067. PWMDBG("PWM_MODE_RANDOM\n");
  1068. mt_set_pwm_disable(conf->pwm_no);
  1069. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  1070. mt_set_pwm_con_datasrc(conf->pwm_no, MEMORY);
  1071. mt_set_pwm_con_mode (conf->pwm_no, RAND);
  1072. mt_set_pwm_con_idleval(conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.IDLE_VALUE);
  1073. mt_set_pwm_con_guardval (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.GUARD_VALUE);
  1074. mt_set_pwm_HiDur (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.HDURATION);
  1075. mt_set_pwm_LowDur (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.LDURATION);
  1076. mt_set_pwm_GuardDur (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.GDURATION);
  1077. mt_set_pwm_buf0_addr(conf->pwm_no, (u32 )conf->PWM_MODE_RANDOM_REGS.BUF0_BASE_ADDR);
  1078. mt_set_pwm_buf0_size (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.BUF0_SIZE);
  1079. mt_set_pwm_buf1_addr(conf->pwm_no, (u32 )conf->PWM_MODE_RANDOM_REGS.BUF1_BASE_ADDR);
  1080. mt_set_pwm_buf1_size (conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.BUF1_SIZE);
  1081. mt_set_pwm_wave_num(conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.WAVE_NUM);
  1082. mt_set_pwm_con_stpbit(conf->pwm_no, conf->PWM_MODE_RANDOM_REGS.STOP_BITPOS_VALUE, MEMORY);
  1083. mt_set_pwm_valid(conf->pwm_no, BUF0_EN_VALID);
  1084. mt_set_pwm_valid(conf->pwm_no, BUF1_EN_VALID);
  1085. break;
  1086. case PWM_MODE_DELAY:
  1087. PWMDBG("PWM_MODE_DELAY\n");
  1088. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  1089. mt_set_pwm_enable_seqmode();
  1090. mt_set_pwm_disable(PWM2);
  1091. mt_set_pwm_disable(PWM3);
  1092. mt_set_pwm_disable(PWM4);
  1093. mt_set_pwm_disable(PWM5);
  1094. if ( conf->PWM_MODE_DELAY_REGS.PWM3_DELAY_DUR <0 ||
  1095. conf->PWM_MODE_DELAY_REGS.PWM3_DELAY_DUR >= (1<<17) ||
  1096. conf->PWM_MODE_DELAY_REGS.PWM4_DELAY_DUR < 0||
  1097. conf->PWM_MODE_DELAY_REGS.PWM4_DELAY_DUR >= (1<<17) ||
  1098. conf->PWM_MODE_DELAY_REGS.PWM5_DELAY_DUR <0 ||
  1099. conf->PWM_MODE_DELAY_REGS.PWM5_DELAY_DUR >=(1<<17) ) {
  1100. PWMDBG("Delay value invalid\n");
  1101. return -EINVALID;
  1102. }
  1103. mt_set_pwm_delay_duration(PWM3_DELAY, conf->PWM_MODE_DELAY_REGS.PWM3_DELAY_DUR );
  1104. mt_set_pwm_delay_clock(PWM3_DELAY, conf->PWM_MODE_DELAY_REGS.PWM3_DELAY_CLK);
  1105. mt_set_pwm_delay_duration(PWM4_DELAY, conf->PWM_MODE_DELAY_REGS.PWM4_DELAY_DUR);
  1106. mt_set_pwm_delay_clock(PWM4_DELAY, conf->PWM_MODE_DELAY_REGS.PWM4_DELAY_CLK);
  1107. mt_set_pwm_delay_duration(PWM5_DELAY, conf->PWM_MODE_DELAY_REGS.PWM5_DELAY_DUR);
  1108. mt_set_pwm_delay_clock(PWM5_DELAY, conf->PWM_MODE_DELAY_REGS.PWM5_DELAY_CLK);
  1109. mt_set_pwm_enable(PWM2);
  1110. mt_set_pwm_enable(PWM3);
  1111. mt_set_pwm_enable(PWM4);
  1112. mt_set_pwm_enable(PWM5);
  1113. break;
  1114. */
  1115. default:
  1116. break;
  1117. }
  1118. switch (conf->clk_src) {
  1119. case PWM_CLK_OLD_MODE_BLOCK:
  1120. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK, conf->clk_div);
  1121. PWMDBG("Enable oldmode and set clock block\n");
  1122. break;
  1123. case PWM_CLK_OLD_MODE_32K:
  1124. mt_set_pwm_clk(conf->pwm_no, 0x80000000|CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  1125. PWMDBG("Enable oldmode and set clock 32K\n");
  1126. break;
  1127. case PWM_CLK_NEW_MODE_BLOCK:
  1128. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK, conf->clk_div);
  1129. PWMDBG("Enable newmode and set clock block\n");
  1130. break;
  1131. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  1132. mt_set_pwm_clk(conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  1133. PWMDBG("Enable newmode and set clock 32K\n");
  1134. break;
  1135. default:
  1136. break;
  1137. }
  1138. mb();/* For memory barrier */
  1139. mt_set_pwm_enable(conf->pwm_no);
  1140. PWMDBG("mt_set_pwm_enable\n");
  1141. return RSUCCESS;
  1142. }
  1143. EXPORT_SYMBOL(pwm_set_spec_config);
  1144. void mt_pwm_dump_regs(void)
  1145. {
  1146. mt_pwm_dump_regs_hal();
  1147. PWMDBG("pwm power_flag: 0x%x\n", (unsigned int)pwm_dev->power_flag);
  1148. }
  1149. EXPORT_SYMBOL(mt_pwm_dump_regs);
  1150. struct platform_device pwm_plat_dev = {
  1151. .name = "mt-pwm",
  1152. };
  1153. static ssize_t pwm_debug_store(struct device *dev, struct device_attribute *attr, const char *buf,
  1154. size_t count)
  1155. {
  1156. PWMDBG("pwm power_flag: 0x%x\n", (unsigned int)pwm_dev->power_flag);
  1157. pwm_debug_store_hal();
  1158. /* PWM LDVT Hight Test Case */
  1159. #if 0
  1160. PWMDBG("Enter into pwm_debug_store\n");
  1161. int cmd, sub_cmd, pwm_no, n;
  1162. n = sscanf(buf, "%d %d %d", &cmd, &sub_cmd, &pwm_no);
  1163. if (!n)
  1164. pr_err("pwm_debug_store nothing\n");
  1165. /* set gpio mode */
  1166. /* pwm0 */
  1167. if (pwm_no == 0) {
  1168. mt_set_gpio_mode(GPIO44, GPIO_MODE_06);
  1169. mt_set_gpio_mode(GPIO78, GPIO_MODE_05);
  1170. mt_set_gpio_mode(GPIO201, GPIO_MODE_03);
  1171. } else if (pwm_no == 1) {
  1172. mt_set_gpio_mode(GPIO10, GPIO_MODE_01);
  1173. mt_set_gpio_mode(GPIO69, GPIO_MODE_02);
  1174. } else if (pwm_no == 2) {
  1175. mt_set_gpio_mode(GPIO1, GPIO_MODE_01);
  1176. mt_set_gpio_mode(GPIO21, GPIO_MODE_02);
  1177. mt_set_gpio_mode(GPIO55, GPIO_MODE_02);
  1178. } else if (pwm_no == 3) {
  1179. mt_set_gpio_mode(GPIO0, GPIO_MODE_05);
  1180. mt_set_gpio_mode(GPIO59, GPIO_MODE_05);
  1181. mt_set_gpio_mode(GPIO79, GPIO_MODE_05);
  1182. } else if (pwm_no == 4) {
  1183. mt_set_gpio_mode(GPIO60, GPIO_MODE_05);
  1184. mt_set_gpio_mode(GPIO80, GPIO_MODE_05);
  1185. } else {
  1186. PWMDBG("Invalid PWM Number!\n");
  1187. }
  1188. if (cmd == 0) {
  1189. PWMDBG("********** HELP **********\n");
  1190. PWMDBG(" \t1 -> clk source select: 26M or Others source clock\n");
  1191. PWMDBG("\t\t1.1 -> sub cmd 1 : 26M\n");
  1192. PWMDBG("\t\t1.1 -> sub cmd 2 : 66M or Others\n");
  1193. PWMDBG(" \t2 -> FIFO stop bit test: PWM0~PWM4 63, 62, 31\n");
  1194. PWMDBG("\t\t2.1 -> sub cmd 1 : stop bit is 63\n");
  1195. PWMDBG("\t\t2.2 -> sub cmd 2 : stop bit is 62\n");
  1196. PWMDBG("\t\t2.3 -> sub cmd 3 : stop bit is 31\n");
  1197. PWMDBG(" \t3 -> FIFO wavenum test: PWM0~PWM4 num=1/num=0\n");
  1198. PWMDBG(" \t\t3.1 -> sub cmd 1 : PWM0~PWM4 num=0\n");
  1199. PWMDBG(" \t\t3.2 -> sub cmd 2 : PWM0~PWM4 num=1\n");
  1200. PWMDBG(" \t4 -> 32K select or use internal frequency individal\n");
  1201. PWMDBG("\t\t4.1 -> sub cmd 1 : 32KHz selected\n");
  1202. PWMDBG("\t\t4.2 -> sub cmd 2 : 26MHz 1625 setting selected\n");
  1203. PWMDBG("\t\t4.3 -> sub cmd 3 : 26MHz selected\n");
  1204. PWMDBG(" \t5 -> 3D LCM\n");
  1205. PWMDBG(" \t6 -> Test all gpio, This coverd by above test case\n");
  1206. PWMDBG(" \t7 -> MEMO Mode test\n");
  1207. } else if (cmd == 1) {
  1208. if (sub_cmd == 1) {
  1209. struct pwm_spec_config conf;
  1210. pr_debug("=============clk source select test : 26M===============\n");
  1211. conf.pwm_no = pwm_no;
  1212. conf.mode = PWM_MODE_FIFO;
  1213. conf.clk_div = CLK_DIV6;
  1214. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1215. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1216. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1217. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1218. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1219. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1220. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1221. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xffffffff;
  1222. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0x00000000;
  1223. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1224. mt_pwm_26M_clk_enable_hal(1);
  1225. pwm_set_spec_config(&conf);
  1226. } else if (sub_cmd == 2) {
  1227. struct pwm_spec_config conf;
  1228. pr_debug("=============clk source select test: Others===============\n");
  1229. conf.pwm_no = pwm_no;
  1230. conf.mode = PWM_MODE_FIFO;
  1231. conf.clk_div = CLK_DIV1;
  1232. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1233. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1234. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1235. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1236. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1237. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1238. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1239. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xf0f0f0f0;
  1240. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xf0f0f0f0;
  1241. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1242. mt_pwm_26M_clk_enable_hal(0);
  1243. pwm_set_spec_config(&conf);
  1244. } /* end sub cmd */
  1245. } else if (cmd == 2) {
  1246. if (sub_cmd == 1) {
  1247. struct pwm_spec_config conf;
  1248. pr_debug("=============Stop bit test : 63===============\n");
  1249. conf.pwm_no = pwm_no;
  1250. conf.mode = PWM_MODE_FIFO;
  1251. conf.clk_div = CLK_DIV1;
  1252. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1253. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1254. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1255. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1256. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1257. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1258. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1259. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0x0000ff11;
  1260. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xffffffff;
  1261. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1262. mt_pwm_26M_clk_enable_hal(1);
  1263. pwm_set_spec_config(&conf);
  1264. } else if (sub_cmd == 2) {
  1265. struct pwm_spec_config conf;
  1266. pr_debug("=============Stop bit test: 62===============\n");
  1267. conf.pwm_no = pwm_no;
  1268. conf.mode = PWM_MODE_FIFO;
  1269. conf.clk_div = CLK_DIV1;
  1270. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1271. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1272. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1273. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 62;
  1274. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1275. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1276. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1277. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0x0000ff11;
  1278. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xffffffff;
  1279. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1280. mt_pwm_26M_clk_enable_hal(1);
  1281. pwm_set_spec_config(&conf);
  1282. } else if (sub_cmd == 3) {
  1283. struct pwm_spec_config conf;
  1284. pr_debug("=============Stop bit test: 31===============\n");
  1285. conf.pwm_no = pwm_no;
  1286. conf.mode = PWM_MODE_FIFO;
  1287. conf.clk_div = CLK_DIV1;
  1288. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1289. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1290. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1291. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 31;
  1292. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1293. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1294. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1295. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0x0000ff11;
  1296. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xffffffff;
  1297. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1298. mt_pwm_26M_clk_enable_hal(1);
  1299. pwm_set_spec_config(&conf);
  1300. } /* end sub cmd */
  1301. } else if (cmd == 3) {
  1302. if (sub_cmd == 1) {
  1303. struct pwm_spec_config conf;
  1304. pr_debug("=============Wave number test : 0===============\n");
  1305. conf.pwm_no = pwm_no;
  1306. conf.mode = PWM_MODE_FIFO;
  1307. conf.clk_div = CLK_DIV1;
  1308. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1309. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1310. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1311. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1312. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1313. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1314. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1315. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xf0f0f0f0;
  1316. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xf0f0f0f0;
  1317. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1318. mt_pwm_26M_clk_enable_hal(1);
  1319. pwm_set_spec_config(&conf);
  1320. } else if (sub_cmd == 2) {
  1321. struct pwm_spec_config conf;
  1322. mt_set_intr_enable_hal(0);
  1323. pr_debug("=============Wave Number test: 1===============\n");
  1324. conf.pwm_no = pwm_no;
  1325. conf.mode = PWM_MODE_FIFO;
  1326. conf.clk_div = CLK_DIV1;
  1327. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1328. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1329. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1330. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1331. conf.PWM_MODE_FIFO_REGS.HDURATION = 119;
  1332. conf.PWM_MODE_FIFO_REGS.LDURATION = 119;
  1333. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1334. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0x0000ff11;
  1335. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xffffffff;
  1336. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 2;
  1337. mt_pwm_26M_clk_enable_hal(1);
  1338. pwm_set_spec_config(&conf);
  1339. mt_set_intr_ack_hal(0);
  1340. } /* end sub cmd */
  1341. } else if (cmd == 4) {
  1342. if (sub_cmd == 1) {
  1343. struct pwm_spec_config conf;
  1344. pr_debug("=============Clk select test : 32KHz===============\n");
  1345. conf.pwm_no = pwm_no;
  1346. conf.mode = PWM_MODE_OLD;
  1347. conf.clk_div = CLK_DIV1;
  1348. conf.clk_src = PWM_CLK_OLD_MODE_32K; /* 16KHz */
  1349. conf.PWM_MODE_OLD_REGS.IDLE_VALUE = IDLE_FALSE;
  1350. conf.PWM_MODE_OLD_REGS.GUARD_VALUE = GUARD_FALSE;
  1351. conf.PWM_MODE_OLD_REGS.GDURATION = 0;
  1352. conf.PWM_MODE_OLD_REGS.WAVE_NUM = 0;
  1353. conf.PWM_MODE_OLD_REGS.DATA_WIDTH = 10;
  1354. conf.PWM_MODE_OLD_REGS.THRESH = 5;
  1355. pwm_set_spec_config(&conf);
  1356. } else if (sub_cmd == 2) {
  1357. struct pwm_spec_config conf;
  1358. pr_debug("=============Clk select test : 26MHz/1625===============\n");
  1359. conf.pwm_no = pwm_no;
  1360. conf.mode = PWM_MODE_OLD;
  1361. conf.clk_div = CLK_DIV1;
  1362. conf.clk_src = PWM_CLK_OLD_MODE_32K; /* 16KHz */
  1363. conf.PWM_MODE_OLD_REGS.IDLE_VALUE = IDLE_FALSE;
  1364. conf.PWM_MODE_OLD_REGS.GUARD_VALUE = GUARD_FALSE;
  1365. conf.PWM_MODE_OLD_REGS.GDURATION = 0;
  1366. conf.PWM_MODE_OLD_REGS.WAVE_NUM = 0;
  1367. conf.PWM_MODE_OLD_REGS.DATA_WIDTH = 10;
  1368. conf.PWM_MODE_OLD_REGS.THRESH = 5;
  1369. pwm_set_spec_config(&conf);
  1370. } else if (sub_cmd == 3) {
  1371. struct pwm_spec_config conf;
  1372. pr_debug("=============Clk select test : 26MHz===============\n");
  1373. conf.pwm_no = pwm_no;
  1374. conf.mode = PWM_MODE_OLD;
  1375. conf.clk_div = CLK_DIV1;
  1376. conf.clk_src = PWM_CLK_OLD_MODE_BLOCK; /* 26MHz */
  1377. conf.PWM_MODE_OLD_REGS.IDLE_VALUE = IDLE_FALSE;
  1378. conf.PWM_MODE_OLD_REGS.GUARD_VALUE = GUARD_FALSE;
  1379. conf.PWM_MODE_OLD_REGS.GDURATION = 0;
  1380. conf.PWM_MODE_OLD_REGS.WAVE_NUM = 0;
  1381. conf.PWM_MODE_OLD_REGS.DATA_WIDTH = 10;
  1382. conf.PWM_MODE_OLD_REGS.THRESH = 5;
  1383. pwm_set_spec_config(&conf);
  1384. } /* end sub cmd */
  1385. } else if (cmd == 5) {
  1386. struct pwm_spec_config conf;
  1387. PWMDBG("=============3DLCM test===============\n");
  1388. conf.mode = PWM_MODE_3DLCM;
  1389. conf.pwm_no = pwm_no;
  1390. conf.clk_div = CLK_DIV1;
  1391. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1392. conf.PWM_MODE_FIFO_REGS.IDLE_VALUE = IDLE_FALSE;
  1393. conf.PWM_MODE_FIFO_REGS.GUARD_VALUE = GUARD_FALSE;
  1394. conf.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE = 63;
  1395. conf.PWM_MODE_FIFO_REGS.HDURATION = 0;
  1396. conf.PWM_MODE_FIFO_REGS.LDURATION = 0;
  1397. conf.PWM_MODE_FIFO_REGS.GDURATION = 0;
  1398. conf.PWM_MODE_FIFO_REGS.SEND_DATA0 = 0xf0f0f0f0;
  1399. conf.PWM_MODE_FIFO_REGS.SEND_DATA1 = 0xf0f0f0f0;
  1400. conf.PWM_MODE_FIFO_REGS.WAVE_NUM = 0;
  1401. mt_pwm_26M_clk_enable_hal(1);
  1402. pwm_set_spec_config(&conf);
  1403. } else if (cmd == 6) {
  1404. PWMDBG(" \tTest all gpio, This coverd by above test case!\n");
  1405. } else if (cmd == 7) {
  1406. struct pwm_spec_config conf;
  1407. PWMDBG("=============MEMO test===============\n");
  1408. conf.mode = PWM_MODE_MEMORY;
  1409. conf.pwm_no = pwm_no;
  1410. conf.clk_div = CLK_DIV1;
  1411. conf.clk_src = PWM_CLK_NEW_MODE_BLOCK;
  1412. conf.PWM_MODE_MEMORY_REGS.IDLE_VALUE = IDLE_FALSE;
  1413. conf.PWM_MODE_MEMORY_REGS.GUARD_VALUE = GUARD_FALSE;
  1414. conf.PWM_MODE_MEMORY_REGS.HDURATION = 119;
  1415. conf.PWM_MODE_MEMORY_REGS.LDURATION = 119;
  1416. conf.PWM_MODE_MEMORY_REGS.GDURATION = 0;
  1417. conf.PWM_MODE_MEMORY_REGS.WAVE_NUM = 0;
  1418. conf.PWM_MODE_MEMORY_REGS.STOP_BITPOS_VALUE = 32;
  1419. mt_pwm_26M_clk_enable_hal(1);
  1420. unsigned int *phys;
  1421. unsigned int *virt;
  1422. virt = dma_alloc_coherent(NULL, 8, &phys, GFP_KERNEL);
  1423. /* virt = (unsigned int*)malloc(sizeof(unsigned int) * 128); */
  1424. unsigned int *membuff = virt;
  1425. /* static unsigned int data = {0xaaaaaaaa, 0xaaaaaaaa}; */
  1426. membuff[0] = 0xaaaaaaaa;
  1427. membuff[1] = 0xffff0000;
  1428. /* conf.PWM_MODE_MEMORY_REGS.BUF0_SIZE = sizeof(data)/sizeof(data[0])-1; */
  1429. conf.PWM_MODE_MEMORY_REGS.BUF0_SIZE = 8;
  1430. conf.PWM_MODE_MEMORY_REGS.BUF0_BASE_ADDR = phys;
  1431. pwm_set_spec_config(&conf);
  1432. } else {
  1433. PWMDBG(" \tInvalid Command!\n");
  1434. }
  1435. #endif
  1436. return count;
  1437. }
  1438. static ssize_t pwm_debug_show(struct device *dev, struct device_attribute *attr, char *buf)
  1439. {
  1440. pwm_debug_show_hal();
  1441. return sprintf(buf, "%s\n", buf);
  1442. }
  1443. static DEVICE_ATTR(pwm_debug, 0644, pwm_debug_show, pwm_debug_store);
  1444. static int mt_pwm_probe(struct platform_device *pdev)
  1445. {
  1446. int ret;
  1447. #ifdef CONFIG_OF
  1448. pwm_base = of_iomap(pdev->dev.of_node, 0);
  1449. if (!pwm_base) {
  1450. PWMDBG("PWM iomap failed\n");
  1451. return -ENODEV;
  1452. };
  1453. #if 0
  1454. pwm_irqnr = irq_of_parse_and_map(pdev->dev.of_node, 0);
  1455. if (!pwm_irqnr) {
  1456. PWMDBG("PWM get irqnr failed\n");
  1457. return -ENODEV;
  1458. }
  1459. PWMDBG("pwm base: 0x%p pwm irq: %d\n", pwm_base, pwm_irqnr);
  1460. #endif
  1461. PWMDBG("pwm base: 0x%p\n", pwm_base);
  1462. #endif
  1463. #if !defined(CONFIG_MTK_CLKMGR)
  1464. ret = mt_get_pwm_clk_src(pdev);
  1465. if (ret != 0)
  1466. PWMDBG("[%s]: Fail :%d\n", __func__, ret);
  1467. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  1468. platform_set_drvdata(pdev, pwm_dev);
  1469. ret = device_create_file(&pdev->dev, &dev_attr_pwm_debug);
  1470. if (ret)
  1471. PWMDBG("error creating sysfs files: pwm_debug\n");
  1472. #ifdef CONFIG_OF
  1473. /* r = request_irq(pwm_irqnr, mt_pwm_irq, IRQF_TRIGGER_LOW, PWM_DEVICE, NULL); */
  1474. #else
  1475. /* request_irq(69, mt_pwm_irq, IRQF_TRIGGER_LOW, "mt6589_pwm", NULL); */
  1476. #endif
  1477. #if 0 /* for support gpio pinctrl standardization */
  1478. struct pinctrl *pinctrl;
  1479. pinctrl = devm_pinctrl_get_select(&pdev->dev, "state_pwm2");
  1480. if (IS_ERR(pinctrl)) {
  1481. ret = PTR_ERR(pinctrl);
  1482. dev_err(&pdev->dev, "Cannot find pwm pinctrl!\n");
  1483. return -1;
  1484. }
  1485. #endif
  1486. return RSUCCESS;
  1487. }
  1488. static int mt_pwm_remove(struct platform_device *pdev)
  1489. {
  1490. if (!pdev) {
  1491. PWMDBG("The plaform device is not exist\n");
  1492. return -EBADADDR;
  1493. }
  1494. device_remove_file(&pdev->dev, &dev_attr_pwm_debug);
  1495. PWMDBG("mt_pwm_remove\n");
  1496. return RSUCCESS;
  1497. }
  1498. static void mt_pwm_shutdown(struct platform_device *pdev)
  1499. {
  1500. PWMDBG("mt_pwm_shutdown\n");
  1501. }
  1502. #ifdef CONFIG_OF
  1503. static const struct of_device_id pwm_of_match[] = {
  1504. {.compatible = "mediatek,pwm",},
  1505. {.compatible = "mediatek,mt8173-pwm",},
  1506. {.compatible = "mediatek,mt8127-pwm",},
  1507. {},
  1508. };
  1509. #endif
  1510. struct platform_driver pwm_plat_driver = {
  1511. .probe = mt_pwm_probe,
  1512. .remove = mt_pwm_remove,
  1513. .shutdown = mt_pwm_shutdown,
  1514. .driver = {
  1515. .name = "mt-pwm",
  1516. #ifdef CONFIG_OF
  1517. .of_match_table = pwm_of_match,
  1518. #endif
  1519. },
  1520. };
  1521. static int __init mt_pwm_init(void)
  1522. {
  1523. int ret;
  1524. #ifndef CONFIG_OF
  1525. ret = platform_device_register(&pwm_plat_dev);
  1526. if (ret < 0) {
  1527. PWMDBG("platform_device_register error\n");
  1528. goto out;
  1529. }
  1530. #endif
  1531. ret = platform_driver_register(&pwm_plat_driver);
  1532. if (ret < 0) {
  1533. PWMDBG("platform_driver_register error\n");
  1534. goto out;
  1535. }
  1536. out:
  1537. mt_pwm_init_power_flag(&(pwm_dev->power_flag));
  1538. return ret;
  1539. }
  1540. static void __exit mt_pwm_exit(void)
  1541. {
  1542. #ifndef CONFIG_OF
  1543. platform_device_unregister(&pwm_plat_dev);
  1544. #endif
  1545. platform_driver_unregister(&pwm_plat_driver);
  1546. }
  1547. module_init(mt_pwm_init);
  1548. module_exit(mt_pwm_exit);
  1549. MODULE_LICENSE("GPL");
  1550. MODULE_AUTHOR("MTK");
  1551. MODULE_DESCRIPTION(" This module is for mtk chip of mediatek");