pwm.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288
  1. #include <platform/mt_pwm.h>
  2. #include <platform/mt_gpt.h>
  3. //#include <platform/mt_utils.h>
  4. #include <debug.h>
  5. #include <platform/sync_write.h>
  6. #define PWM_DEBUG
  7. #ifdef PWM_DEBUG
  8. #define PWMDBG(fmt, args ...) dprintf(INFO,"pwm %5d: " fmt, __LINE__,##args)
  9. #else
  10. #define PWMDBG(fmt, args ...)
  11. #endif
  12. #define PWMMSG(fmt, args ...) dprintf(INFO, fmt, ##args)
  13. //#define SETREG32(x, y) ((*(volatile u32*)(x)) = (u32)(y))
  14. //#define CLRREG32(x, y) ((*(volatile u32*)(x)) &= ~((u32)(y)))
  15. //#define MASKREG32(x, y, z) ((*(volatile u32*)(x)) &= (~((u32)(y))|(u32)(z)))
  16. #define MASKREG32(x, y, z) OUTREG32(x, (INREG32(x)&~(y))|(z))
  17. //#define INREG32(x) (*(volatile u32 *)(x))
  18. typedef int irqreturn_t;
  19. #ifdef OUTREG32
  20. #undef OUTREG32
  21. #define OUTREG32(x, y) mt65xx_reg_sync_writel(y, x)
  22. #endif
  23. enum {
  24. PWM_CON,
  25. PWM_HDURATION,
  26. PWM_LDURATION,
  27. PWM_GDURATION,
  28. PWM_BUF0_BASE_ADDR,
  29. PWM_BUF0_SIZE,
  30. PWM_BUF1_BASE_ADDR,
  31. PWM_BUF1_SIZE,
  32. PWM_SEND_DATA0,
  33. PWM_SEND_DATA1,
  34. PWM_WAVE_NUM,
  35. PWM_DATA_WIDTH,
  36. PWM_THRESH,
  37. PWM_SEND_WAVENUM,
  38. PWM_VALID
  39. }PWM_REG_OFF;
  40. U32 PWM_register[PWM_NUM]={
  41. (PWM_BASE+0x0010), //PWM1 register base, 15 registers
  42. (PWM_BASE+0x0050), //PWM2 register base 15 registers
  43. (PWM_BASE+0x0090), //PWM3 register base 15 registers
  44. };
  45. #define MT_CG_INFRA_PWM1 16
  46. #define MT_CG_INFRA_PWM2 17
  47. #define MT_CG_INFRA_PWM3 18
  48. #define MT_CG_INFRA_PWM 21
  49. #define INFRACFG_AO_BASE (0x10001000)
  50. #define INFRA_PDN_SET0 (INFRACFG_AO_BASE + 0x0080)
  51. #define INFRA_PDN_CLR0 (INFRACFG_AO_BASE + 0x0084)
  52. #define INFRA_PDN_STA0 (INFRACFG_AO_BASE + 0x0090)
  53. #define PWM_CLOCK_STA (INFRA_PDN_STA0)
  54. #define PWM_CLOCK_SET (INFRA_PDN_SET0)
  55. #define PWM_CLOCK_CLR (INFRA_PDN_CLR0)
  56. #define PWM_SET_BITS(REG, BS) ((*(volatile u32*)(REG)) |= (u32)(BS))
  57. #define PWM_CLR_BITS(REG, BS) ((*(volatile u32*)(REG)) &= ~((u32)(BS)))
  58. void mt_pwm_power_on(U32 pwm_no)
  59. {
  60. PWM_SET_BITS(PWM_CLOCK_CLR, (1<<MT_CG_INFRA_PWM));
  61. PWM_SET_BITS(PWM_CLOCK_CLR, (1<<(MT_CG_INFRA_PWM1+pwm_no))); //enable clock
  62. PWMDBG("enable_clock PWM%d\n", (pwm_no+1));
  63. mdelay(100);
  64. }
  65. void mt_pwm_power_off (U32 pwm_no)
  66. {
  67. PWM_SET_BITS(PWM_CLOCK_SET, (1<<(MT_CG_INFRA_PWM1+pwm_no))); //disable clock
  68. //PWM_SET_BITS(PWM_CLOCK_SET, (1<<MT_CG_INFRA_PWM)); //disable bus clock
  69. PWMDBG("disable_clock PWM%d\n", (pwm_no+1));
  70. }
  71. S32 mt_pwm_sel_pmic(U32 pwm_no)
  72. {
  73. // not support
  74. return RSUCCESS;
  75. }
  76. S32 mt_pwm_sel_ap(U32 pwm_no)
  77. {
  78. // nothing to do
  79. return RSUCCESS;
  80. }
  81. /*******************************************************
  82. * Set PWM_ENABLE register bit to enable pwm1~pwm3
  83. *
  84. ********************************************************/
  85. S32 mt_set_pwm_enable(U32 pwm_no)
  86. {
  87. if ( pwm_no >= PWM_MAX ) {
  88. PWMDBG ( "pwm number is not between PWM1~PWM3(0~2)\n" );
  89. return -EEXCESSPWMNO;
  90. }
  91. DRV_SetReg32(PWM_ENABLE, 1 << pwm_no);
  92. return RSUCCESS;
  93. }
  94. /*******************************************************/
  95. S32 mt_set_pwm_disable ( U32 pwm_no )
  96. {
  97. DRV_ClrReg32 ( PWM_ENABLE, 1 << pwm_no );
  98. mdelay(1);
  99. return RSUCCESS;
  100. }
  101. /********************************************************/
  102. S32 mt_get_pwm_enable(U32 pwm_no)
  103. {
  104. int en;
  105. if ( pwm_no >= PWM_MAX ) {
  106. PWMDBG("pwm number is not between PWM1~PWM3.\n");
  107. return -EEXCESSPWMNO;
  108. }
  109. en = INREG32(PWM_ENABLE );
  110. en &= 1 << pwm_no;
  111. en >>= pwm_no;
  112. return en;
  113. }
  114. void mt_pwm_disable(U32 pwm_no, BOOL pmic_pad)
  115. {
  116. mt_set_pwm_disable(pwm_no);
  117. mt_pwm_power_off(pwm_no);
  118. }
  119. void mt_set_pwm_enable_seqmode(void)
  120. {
  121. // not support
  122. }
  123. void mt_set_pwm_disable_seqmode(void)
  124. {
  125. // not support
  126. }
  127. S32 mt_set_pwm_test_sel(U32 val) //val as 0 or 1
  128. {
  129. // not support
  130. return RSUCCESS;
  131. }
  132. int mt_get_pwm_mode(U32 pwm_no)
  133. {
  134. //U32 reg_val, reg_con;
  135. int mode = -1;
  136. /* u32 con_mode, con_src;
  137. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  138. reg_val = INREG32(reg_con);
  139. if (reg_val & PWM_CON_OLD_MODE_MASK) {
  140. mode = 0;
  141. }else {
  142. reg_val = INREG32(PWM_ENABLE);
  143. if (reg_val & (1 << PWM_ENABLE_SEQ_OFFSET)) {
  144. mode = 4;
  145. }else {
  146. reg_val = INREG32(reg_con);
  147. con_mode = reg_val & PWM_CON_MODE_MASK;
  148. con_src = reg_val & PWM_CON_SRCSEL_MASK;
  149. if ((con_mode == PERIOD)&& (con_src == FIFO)) {
  150. mode = 1;
  151. }else if ((con_mode == RAND) && (con_src == MEMORY)) {
  152. mode = 3;
  153. }else if ((con_mode == PERIOD) && (con_src == MEMORY) ) {
  154. mode = 2;
  155. }else {
  156. PWMDBG("mode is invalid.\n");
  157. PWMDBG("PWM_CON_MODE is :0x%x, PWM_CON_SRCSEL is: 0x%x\n", con_mode, con_src);
  158. }
  159. }
  160. }
  161. */
  162. return mode;
  163. }
  164. S32 mt_set_pwm_clk ( U32 pwm_no, U32 clksrc, U32 div )
  165. {
  166. U32 reg_con;
  167. if ( pwm_no >= PWM_MAX ) {
  168. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  169. return -EEXCESSPWMNO;
  170. }
  171. if ( div >= CLK_DIV_MAX ) {
  172. PWMDBG ("division excesses CLK_DIV_MAX\n");
  173. return -EPARMNOSUPPORT;
  174. }
  175. if (clksrc > CLK_BLOCK_BY_1625_OR_32K) {
  176. PWMDBG("clksrc excesses CLK_BLOCK_BY_1625_OR_32K\n");
  177. return -EPARMNOSUPPORT;
  178. }
  179. reg_con = PWM_register [pwm_no] + 4* PWM_CON;
  180. MASKREG32 ( reg_con, PWM_CON_CLKDIV_MASK, div );
  181. if (clksrc == CLK_BLOCK)
  182. {
  183. //DRV_ClrReg32 ( reg_con, 1 << 4 ); // If want to use 32K as clock source for old mode, remember to clear the bit here.
  184. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_CLKSEL_OFFSET );
  185. }
  186. else if (clksrc == CLK_BLOCK_BY_1625_OR_32K)
  187. {
  188. //DRV_SetReg32 ( reg_con, 1 << 4 ); // If want to use 32K as clock source for old mode.
  189. DRV_SetReg32 ( reg_con, 1 << PWM_CON_CLKSEL_OFFSET );
  190. }
  191. return RSUCCESS;
  192. }
  193. /****************************************************/
  194. S32 mt_get_pwm_clk ( U32 pwm_no )
  195. {
  196. S32 clk;
  197. U32 reg_con, reg_val;
  198. if ( pwm_no >= PWM_MAX) {
  199. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  200. return -EEXCESSPWMNO;
  201. }
  202. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  203. reg_val = INREG32 (reg_con);
  204. clk = (reg_val & PWM_CON_CLKSEL_MASK) >> PWM_CON_CLKSEL_OFFSET;
  205. return clk;
  206. }
  207. /****************************************************/
  208. S32 mt_get_pwm_div ( U32 pwm_no )
  209. {
  210. S32 div;
  211. U32 reg_con, reg_val;
  212. if ( pwm_no >= PWM_MAX) {
  213. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  214. return -EEXCESSPWMNO;
  215. }
  216. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  217. reg_val = INREG32 (reg_con);
  218. div = (reg_val & PWM_CON_CLKDIV_MASK) >> PWM_CON_CLKDIV_OFFSET;
  219. return div;
  220. }
  221. /****************************************************/
  222. S32 mt_get_pwm_high ( U32 pwm_no )
  223. {
  224. S32 high;
  225. U32 reg_high, reg_val;
  226. if ( pwm_no >= PWM_MAX) {
  227. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  228. return -EEXCESSPWMNO;
  229. }
  230. reg_high = PWM_register[pwm_no] + 4*PWM_HDURATION;
  231. reg_val = INREG32 (reg_high);
  232. high = (reg_val & PWM_HDURATION) ;
  233. return high;
  234. }
  235. /****************************************************/
  236. S32 mt_get_pwm_low ( U32 pwm_no )
  237. {
  238. S32 low;
  239. U32 reg_low, reg_val;
  240. if ( pwm_no >= PWM_MAX) {
  241. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  242. return -EEXCESSPWMNO;
  243. }
  244. reg_low = PWM_register[pwm_no] + 4*PWM_LDURATION;
  245. reg_val = INREG32 (reg_low);
  246. low = (reg_val & PWM_LDURATION) ;
  247. return low;
  248. }
  249. /****************************************************/
  250. S32 mt_get_pwm_grd ( U32 pwm_no )
  251. {
  252. S32 grd;
  253. U32 reg_grd, reg_val;
  254. if ( pwm_no >= PWM_MAX) {
  255. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  256. return -EEXCESSPWMNO;
  257. }
  258. reg_grd = PWM_register[pwm_no] + 4*PWM_GDURATION;
  259. reg_val = INREG32 (reg_grd);
  260. grd = (reg_val & PWM_LDURATION) ;
  261. return grd;
  262. }
  263. /****************************************************/
  264. S32 mt_get_pwm_grdval ( U32 pwm_no )
  265. {
  266. S32 grdval;
  267. U32 reg_con, reg_val;
  268. if ( pwm_no >= PWM_MAX) {
  269. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  270. return -EEXCESSPWMNO;
  271. }
  272. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  273. reg_val = INREG32 (reg_con);
  274. grdval = (reg_val & PWM_CON_GUARD_VALUE_MASK) >>PWM_CON_GUARD_VALUE_OFFSET;
  275. return grdval;
  276. }
  277. /****************************************************/
  278. S32 mt_get_pwm_idlval ( U32 pwm_no )
  279. {
  280. S32 idlval;
  281. U32 reg_con, reg_val;
  282. if ( pwm_no >= PWM_MAX) {
  283. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  284. return -EEXCESSPWMNO;
  285. }
  286. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  287. reg_val = INREG32 (reg_con);
  288. idlval = (reg_val & PWM_CON_IDLE_VALUE_MASK) >>PWM_CON_IDLE_VALUE_OFFSET;
  289. return idlval;
  290. }
  291. /******************************************
  292. * Set PWM_CON register data source
  293. * pwm_no: PWM1~PWM3 (0~2)
  294. *val: 0 is fifo mode
  295. * 1 is memory mode
  296. *******************************************/
  297. S32 mt_set_pwm_con_datasrc ( U32 pwm_no, U32 val )
  298. {
  299. U32 reg_con;
  300. if ( pwm_no >= PWM_MAX ) {
  301. PWMDBG ("pwm number excesses PWM_MAX \n");
  302. return -EEXCESSPWMNO;
  303. }
  304. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  305. if ( val == FIFO )
  306. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_SRCSEL_OFFSET );
  307. else if ( val == MEMORY )
  308. DRV_SetReg32 ( reg_con, 1 << PWM_CON_SRCSEL_OFFSET );
  309. else
  310. goto err;
  311. return RSUCCESS;
  312. err:
  313. return -EPARMNOSUPPORT;
  314. }
  315. /************************************************
  316. * set the PWM_CON register
  317. * pwm_no: PWM1~PWM3 (0~2)
  318. * val: 0 is period mode
  319. * 1 is random mode
  320. *
  321. ***************************************************/
  322. S32 mt_set_pwm_con_mode( U32 pwm_no, U32 val )
  323. {
  324. U32 reg_con;
  325. if ( pwm_no >= PWM_MAX ) {
  326. PWMDBG ("pwm number excesses PWM_MAX\n");
  327. return -EEXCESSPWMNO;
  328. }
  329. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  330. if ( val == PERIOD )
  331. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_MODE_OFFSET );
  332. else if (val == RAND)
  333. DRV_SetReg32 ( reg_con, 1 << PWM_CON_MODE_OFFSET );
  334. else
  335. goto err;
  336. return RSUCCESS;
  337. err:
  338. return -EPARMNOSUPPORT;
  339. }
  340. /***********************************************
  341. *Set PWM_CON register, idle value bit
  342. * val: 0 means that idle state is not put out.
  343. * 1 means that idle state is put out
  344. *
  345. * IDLE_FALSE: 0
  346. * IDLE_TRUE: 1
  347. ***********************************************/
  348. S32 mt_set_pwm_con_idleval(U32 pwm_no, U16 val)
  349. {
  350. U32 reg_con;
  351. if ( pwm_no >= PWM_MAX ) {
  352. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  353. return -EEXCESSPWMNO;
  354. }
  355. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  356. if ( val == IDLE_TRUE )
  357. DRV_SetReg32 ( reg_con,1 << PWM_CON_IDLE_VALUE_OFFSET );
  358. else if ( val == IDLE_FALSE )
  359. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_IDLE_VALUE_OFFSET );
  360. else
  361. goto err;
  362. return RSUCCESS;
  363. err:
  364. return -EPARMNOSUPPORT;
  365. }
  366. /*********************************************
  367. * Set PWM_CON register guardvalue bit
  368. * val: 0 means guard state is not put out.
  369. * 1 mens guard state is put out.
  370. *
  371. * GUARD_FALSE: 0
  372. * GUARD_TRUE: 1
  373. **********************************************/
  374. S32 mt_set_pwm_con_guardval(U32 pwm_no, U16 val)
  375. {
  376. U32 reg_con;
  377. if ( pwm_no >= PWM_MAX ) {
  378. PWMDBG ("pwm number excesses PWM_MAX \n");
  379. return -EEXCESSPWMNO;
  380. }
  381. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  382. if ( val == GUARD_TRUE )
  383. DRV_SetReg32 ( reg_con, 1 << PWM_CON_GUARD_VALUE_OFFSET );
  384. else if ( val == GUARD_FALSE )
  385. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_GUARD_VALUE_OFFSET );
  386. else
  387. goto err;
  388. return RSUCCESS;
  389. err:
  390. return -EPARMNOSUPPORT;
  391. }
  392. S32 mt_set_pwm_con_stpbit(U32 pwm_no, U32 stpbit, U32 srcsel )
  393. {
  394. U32 reg_con;
  395. if ( pwm_no >= PWM_MAX ) {
  396. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  397. return -EEXCESSPWMNO;
  398. }
  399. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  400. if (srcsel == FIFO) {
  401. if ( stpbit > 0x3f ) {
  402. PWMDBG ( "stpbit execesses the most of 0x3f in fifo mode\n" );
  403. return -EPARMNOSUPPORT;
  404. }
  405. }else if (srcsel == MEMORY){
  406. if ( stpbit > 0x1f) {
  407. PWMDBG ("stpbit excesses the most of 0x1f in memory mode\n");
  408. return -EPARMNOSUPPORT;
  409. }
  410. }
  411. if ( srcsel == FIFO )
  412. MASKREG32 ( reg_con, PWM_CON_STOP_BITS_MASK, stpbit << PWM_CON_STOP_BITS_OFFSET);
  413. if ( srcsel == MEMORY )
  414. MASKREG32 ( reg_con, PWM_CON_STOP_BITS_MASK & (0x1f << PWM_CON_STOP_BITS_OFFSET), stpbit << PWM_CON_STOP_BITS_OFFSET);
  415. return RSUCCESS;
  416. }
  417. /*****************************************************
  418. *Set PWM_CON register oldmode bit
  419. * val: 0 means disable oldmode
  420. * 1 means enable oldmode
  421. *
  422. * OLDMODE_DISABLE: 0
  423. * OLDMODE_ENABLE: 1
  424. ******************************************************/
  425. S32 mt_set_pwm_con_oldmode ( U32 pwm_no, U32 val )
  426. {
  427. U32 reg_con;
  428. if ( pwm_no >= PWM_MAX ) {
  429. PWMDBG ("pwm number excesses PWM_MAX \n");
  430. return -EEXCESSPWMNO;
  431. }
  432. reg_con = PWM_register[pwm_no] + 4*PWM_CON;
  433. if ( val == OLDMODE_DISABLE )
  434. DRV_ClrReg32 ( reg_con, 1 << PWM_CON_OLD_MODE_OFFSET );
  435. else if ( val == OLDMODE_ENABLE )
  436. DRV_SetReg32 ( reg_con, 1 << PWM_CON_OLD_MODE_OFFSET );
  437. else
  438. goto err;
  439. return RSUCCESS;
  440. err:
  441. return -EPARMNOSUPPORT;
  442. }
  443. /***********************************************************
  444. * Set PWM_HIDURATION register
  445. *
  446. *************************************************************/
  447. S32 mt_set_pwm_HiDur(U32 pwm_no, U16 DurVal) //only low 16 bits are valid
  448. {
  449. U32 reg_HiDur;
  450. if ( pwm_no >= PWM_MAX ) {
  451. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  452. return -EEXCESSPWMNO;
  453. }
  454. reg_HiDur = PWM_register[pwm_no]+4*PWM_HDURATION;
  455. DRV_SetReg32 ( reg_HiDur, DurVal);
  456. return RSUCCESS;
  457. }
  458. /************************************************
  459. * Set PWM Low Duration register
  460. *************************************************/
  461. S32 mt_set_pwm_LowDur (U32 pwm_no, U16 DurVal)
  462. {
  463. U32 reg_LowDur;
  464. if ( pwm_no >= PWM_MAX ) {
  465. PWMDBG ("pwm number excesses PWM_MAX\n");
  466. return -EEXCESSPWMNO;
  467. }
  468. reg_LowDur = PWM_register[pwm_no] + 4*PWM_LDURATION;
  469. DRV_SetReg32 ( reg_LowDur, DurVal );
  470. return RSUCCESS;
  471. }
  472. /***************************************************
  473. * Set PWM_GUARDDURATION register
  474. * pwm_no: PWM1~PWM3 (0~2)
  475. * DurVal: the value of guard duration
  476. ****************************************************/
  477. S32 mt_set_pwm_GuardDur ( U32 pwm_no, U16 DurVal )
  478. {
  479. U32 reg_GuardDur;
  480. if ( pwm_no >= PWM_MAX ) {
  481. PWMDBG ("pwm number excesses PWM_MAX\n");
  482. return -EEXCESSPWMNO;
  483. }
  484. reg_GuardDur = PWM_register[pwm_no] + 4*PWM_GDURATION;
  485. DRV_SetReg32 ( reg_GuardDur, DurVal );
  486. return RSUCCESS;
  487. }
  488. /*****************************************************
  489. * Set pwm_buf0_addr register
  490. * pwm_no: PWM1~PWM3 (0~2)
  491. * addr: data address
  492. ******************************************************/
  493. S32 mt_set_pwm_buf0_addr (U32 pwm_no, U32 addr )
  494. {
  495. U32 reg_buff0_addr;
  496. if ( pwm_no >= PWM_MAX ) {
  497. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  498. return -EEXCESSPWMNO;
  499. }
  500. reg_buff0_addr = PWM_register[pwm_no] + 4 * PWM_BUF0_BASE_ADDR;
  501. DRV_SetReg32 ( reg_buff0_addr, addr );
  502. return RSUCCESS;
  503. }
  504. /*****************************************************
  505. * Set pwm_buf0_size register
  506. * pwm_no: PWM1~PWM3 (0~2)
  507. * size: size of data
  508. ******************************************************/
  509. S32 mt_set_pwm_buf0_size ( U32 pwm_no, U16 size)
  510. {
  511. U32 reg_buff0_size;
  512. if ( pwm_no >= PWM_MAX ) {
  513. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  514. return -EEXCESSPWMNO;
  515. }
  516. reg_buff0_size = PWM_register[pwm_no] + 4* PWM_BUF0_SIZE;
  517. DRV_SetReg32 ( reg_buff0_size, size );
  518. return RSUCCESS;
  519. }
  520. /*****************************************************
  521. * Set pwm_buf1_addr register
  522. * pwm_no: PWM1~PWM3 (0~2)
  523. * addr: data address
  524. ******************************************************/
  525. S32 mt_set_pwm_buf1_addr (U32 pwm_no, U32 addr )
  526. {
  527. U32 reg_buff1_addr;
  528. if ( pwm_no >= PWM_MAX ) {
  529. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  530. return -EEXCESSPWMNO;
  531. }
  532. reg_buff1_addr = PWM_register[pwm_no] + 4 * PWM_BUF1_BASE_ADDR;
  533. DRV_SetReg32 ( reg_buff1_addr, addr );
  534. return RSUCCESS;
  535. }
  536. /*****************************************************
  537. * Set pwm_buf1_size register
  538. * pwm_no: PWM1~PWM3 (0~2)
  539. * size: size of data
  540. ******************************************************/
  541. S32 mt_set_pwm_buf1_size ( U32 pwm_no, U16 size)
  542. {
  543. U32 reg_buff1_size;
  544. if ( pwm_no >= PWM_MAX ) {
  545. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  546. return -EEXCESSPWMNO;
  547. }
  548. reg_buff1_size = PWM_register[pwm_no] + 4* PWM_BUF1_SIZE;
  549. DRV_SetReg32 ( reg_buff1_size, size );
  550. return RSUCCESS;
  551. }
  552. /*****************************************************
  553. * Set pwm_send_data0 register
  554. * pwm_no: PWM1~PWM3 (0~2)
  555. * data: the data in the register
  556. ******************************************************/
  557. S32 mt_set_pwm_send_data0 ( U32 pwm_no, U32 data )
  558. {
  559. U32 reg_data0;
  560. if ( pwm_no >= PWM_MAX ) {
  561. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  562. return -EEXCESSPWMNO;
  563. }
  564. reg_data0 = PWM_register[pwm_no] + 4 * PWM_SEND_DATA0;
  565. DRV_SetReg32 ( reg_data0, data );
  566. return RSUCCESS;
  567. }
  568. /*****************************************************
  569. * Set pwm_send_data1 register
  570. * pwm_no: PWM1~PWM3 (0~2)
  571. * data: the data in the register
  572. ******************************************************/
  573. S32 mt_set_pwm_send_data1 ( U32 pwm_no, U32 data )
  574. {
  575. U32 reg_data1;
  576. if ( pwm_no >= PWM_MAX ) {
  577. PWMDBG ( "pwm number excesses PWM_MAX \n" );
  578. return -EEXCESSPWMNO;
  579. }
  580. reg_data1 = PWM_register[pwm_no] + 4 * PWM_SEND_DATA1;
  581. DRV_SetReg32 ( reg_data1, data );
  582. return RSUCCESS;
  583. }
  584. /*****************************************************
  585. * Set pwm_wave_num register
  586. * pwm_no: PWM1~PWM3 (0~2)
  587. * num:the wave number
  588. ******************************************************/
  589. S32 mt_set_pwm_wave_num ( U32 pwm_no, U16 num )
  590. {
  591. U32 reg_wave_num;
  592. if ( pwm_no >= PWM_MAX ) {
  593. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  594. return -EEXCESSPWMNO;
  595. }
  596. reg_wave_num = PWM_register[pwm_no] + 4 * PWM_WAVE_NUM;
  597. DRV_SetReg32 ( reg_wave_num, num );
  598. return RSUCCESS;
  599. }
  600. /*****************************************************
  601. * Set pwm_data_width register.
  602. * This is only for old mode
  603. * pwm_no: PWM1~PWM3 (0~2)
  604. * width: set the guard value in the old mode
  605. ******************************************************/
  606. S32 mt_set_pwm_data_width ( U32 pwm_no, U16 width )
  607. {
  608. U32 reg_data_width;
  609. if ( pwm_no >= PWM_MAX ) {
  610. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  611. return -EEXCESSPWMNO;
  612. }
  613. reg_data_width = PWM_register[pwm_no] + 4 * PWM_DATA_WIDTH;
  614. DRV_SetReg32 ( reg_data_width, width );
  615. return RSUCCESS;
  616. }
  617. /*****************************************************
  618. * Set pwm_thresh register
  619. * pwm_no: PWM1~PWM3 (0~2)
  620. * thresh: the thresh of the wave
  621. ******************************************************/
  622. S32 mt_set_pwm_thresh ( U32 pwm_no, U16 thresh )
  623. {
  624. U32 reg_thresh;
  625. if ( pwm_no >= PWM_MAX ) {
  626. PWMDBG ( " pwm number excesses PWM_MAX \n");
  627. return -EEXCESSPWMNO;
  628. }
  629. reg_thresh = PWM_register[pwm_no] + 4 * PWM_THRESH;
  630. DRV_SetReg32 ( reg_thresh, thresh );
  631. return RSUCCESS;
  632. }
  633. /*****************************************************
  634. * Set pwm_send_wavenum register
  635. * pwm_no: PWM1~PWM3 (0~2)
  636. *
  637. ******************************************************/
  638. S32 mt_get_pwm_send_wavenum ( U32 pwm_no )
  639. {
  640. U32 reg_send_wavenum;
  641. S32 wave_num;
  642. if ( pwm_no >= PWM_MAX ) {
  643. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  644. return -EEXCESSPWMNO;
  645. }
  646. reg_send_wavenum = PWM_register[pwm_no] + 4 * PWM_SEND_WAVENUM;
  647. wave_num = INREG32 ( reg_send_wavenum );
  648. return wave_num;
  649. }
  650. /*************************************************
  651. * set PWM4_delay when using SEQ mode
  652. *
  653. **************************************************/
  654. S32 mt_set_pwm_delay_duration(U32 pwm_delay_reg, U16 val)
  655. {
  656. // not support
  657. return RSUCCESS;
  658. }
  659. /*******************************************************
  660. * Set pwm delay clock
  661. *
  662. *
  663. ********************************************************/
  664. S32 mt_set_pwm_delay_clock (U32 pwm_delay_reg, U32 clksrc)
  665. {
  666. // not support
  667. return RSUCCESS;
  668. }
  669. /*****************************************************
  670. * Set pwm_send_data1 register
  671. * pwm_no: PWM1~PWM3 (0~2)
  672. * buf_valid_bit:
  673. * for buf0: bit0 and bit1 should be set 1.
  674. * for buf1: bit2 and bit3 should be set 1.
  675. ******************************************************/
  676. S32 mt_set_pwm_valid ( U32 pwm_no, U32 buf_valid_bit ) //set 0 for BUF0 bit or set 1 for BUF1 bit
  677. {
  678. U32 reg_valid;
  679. if ( pwm_no >= PWM_MAX ) {
  680. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  681. return -EEXCESSPWMNO;
  682. }
  683. if ( !buf_valid_bit>= BUF_EN_MAX) {
  684. PWMDBG ( "inavlid bit \n" );
  685. return -EPARMNOSUPPORT;
  686. }
  687. reg_valid = PWM_register[pwm_no] + 4 * PWM_VALID;
  688. DRV_SetReg32 ( reg_valid, 0x3 << (buf_valid_bit *2));
  689. return RSUCCESS;
  690. }
  691. S32 mt_set_pwm_invalid ( U32 pwm_no, U32 buf_valid_bit ) //set 0 for BUF0 bit or set 1 for BUF1 bit
  692. {
  693. U32 reg_valid;
  694. if ( pwm_no >= PWM_MAX ) {
  695. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  696. return -EEXCESSPWMNO;
  697. }
  698. if ( !buf_valid_bit>= BUF_EN_MAX) {
  699. PWMDBG ( "inavlid bit \n" );
  700. return -EPARMNOSUPPORT;
  701. }
  702. reg_valid = PWM_register[pwm_no] + 4 * PWM_VALID;
  703. DRV_ClrReg32 ( reg_valid, 0x1 << (buf_valid_bit * 2));
  704. return RSUCCESS;
  705. }
  706. S32 mt_get_pwm_valid ( U32 pwm_no, U32 buf_valid_bit ) //set 0 for BUF0 bit or set 1 for BUF1 bit
  707. {
  708. U32 reg_valid;
  709. int ret;
  710. if ( pwm_no >= PWM_MAX ) {
  711. PWMDBG ( "pwm number excesses PWM_MAX\n" );
  712. return -EEXCESSPWMNO;
  713. }
  714. if ( !buf_valid_bit>= BUF_EN_MAX) {
  715. PWMDBG ( "inavlid bit \n" );
  716. return -EPARMNOSUPPORT;
  717. }
  718. reg_valid = PWM_register[pwm_no] + 4 * PWM_VALID;
  719. ret = INREG32 ( reg_valid );
  720. ret = ( ret >> (buf_valid_bit * 2)) & 0x01;
  721. return ret;
  722. }
  723. /*******************************************
  724. * Set intr enable register
  725. * pwm_intr_enable_bit: the intr bit,
  726. *
  727. *********************************************/
  728. S32 mt_set_intr_enable(U32 pwm_intr_enable_bit)
  729. {
  730. if (pwm_intr_enable_bit >= PWM_INT_ENABLE_BITS_MAX) {
  731. PWMDBG (" pwm inter enable bit is not right.\n");
  732. return -EEXCESSBITS;
  733. }
  734. DRV_SetReg32 ( PWM_INT_ENABLE, 1 << pwm_intr_enable_bit );
  735. return RSUCCESS;
  736. }
  737. S32 mt_set_intr_disable(U32 pwm_intr_enable_bit)
  738. {
  739. if (pwm_intr_enable_bit >= PWM_INT_ENABLE_BITS_MAX) {
  740. PWMDBG (" pwm inter enable bit is not right.\n");
  741. return -EEXCESSBITS;
  742. }
  743. DRV_ClrReg32 ( PWM_INT_ENABLE, 1 << pwm_intr_enable_bit );
  744. return RSUCCESS;
  745. }
  746. /*****************************************************
  747. * Set intr status register
  748. * pwm_no: PWM1~PWM3 (0~2)
  749. * pwm_intr_status_bit
  750. ******************************************************/
  751. S32 mt_get_intr_status(U32 pwm_intr_status_bit)
  752. {
  753. int ret;
  754. if ( pwm_intr_status_bit >= PWM_INT_STATUS_BITS_MAX ) {
  755. PWMDBG ( "status bit excesses PWM_INT_STATUS_BITS_MAX\n" );
  756. return -EEXCESSBITS;
  757. }
  758. ret = INREG32 ( PWM_INT_STATUS );
  759. ret = ( ret >> pwm_intr_status_bit ) & 0x01;
  760. return ret;
  761. }
  762. /*****************************************************
  763. * Set intr ack register
  764. * pwm_no: PWM1~PWM3 (0~2)
  765. * pwm_intr_ack_bit
  766. ******************************************************/
  767. S32 mt_set_intr_ack ( U32 pwm_intr_ack_bit )
  768. {
  769. if ( pwm_intr_ack_bit >= PWM_INT_ACK_BITS_MAX ) {
  770. PWMDBG ( "ack bit excesses PWM_INT_ACK_BITS_MAX\n" );
  771. return -EEXCESSBITS;
  772. }
  773. DRV_SetReg32 ( PWM_INT_ACK, 1 << pwm_intr_ack_bit );
  774. return RSUCCESS;
  775. }
  776. S32 pwm_set_easy_config ( struct pwm_easy_config *conf)
  777. {
  778. U32 duty = 0;
  779. U16 duration = 0;
  780. U32 data_AllH=0xffffffff;
  781. U32 data0 = 0;
  782. U32 data1 = 0;
  783. if ( conf->pwm_no >= PWM_MAX ) {
  784. PWMDBG("pwm number excess PWM_MAX\n");
  785. return -EEXCESSPWMNO;
  786. }
  787. if (conf->clk_div >= CLK_DIV_MAX) {
  788. PWMDBG ( "PWM clock division invalid\n" );
  789. return -EINVALID;
  790. }
  791. if ( conf ->clk_src >= PWM_CLK_SRC_INVALID ) {
  792. PWMDBG ("PWM clock source invalid\n");
  793. return -EINVALID;
  794. }
  795. PWMDBG("pwm_set_easy_config\n");
  796. if (conf->pmic_pad){
  797. mt_pwm_sel_pmic(conf->pwm_no);
  798. }
  799. if ( conf->duty == 0 ) {
  800. mt_set_pwm_disable (conf->pwm_no);
  801. mt_pwm_power_off(conf->pwm_no);
  802. return RSUCCESS;
  803. }
  804. duty = conf->duty;
  805. duration = conf->duration;
  806. switch ( conf->clk_src ) {
  807. case PWM_CLK_OLD_MODE_BLOCK:
  808. case PWM_CLK_OLD_MODE_32K:
  809. if ( duration > 8191 ) {
  810. PWMDBG ( "duration invalid parameter\n" );
  811. return -EPARMNOSUPPORT;
  812. }
  813. if ( duration < 10 )
  814. duration = 10;
  815. break;
  816. case PWM_CLK_NEW_MODE_BLOCK:
  817. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  818. break;
  819. default:
  820. PWMDBG("invalid clock source\n");
  821. return -EPARMNOSUPPORT;
  822. }
  823. if ( duty > 100 )
  824. duty = 100;
  825. if ( duty > 50 ){
  826. data0 = data_AllH;
  827. data1 = data_AllH >> ((PWM_NEW_MODE_DUTY_TOTAL_BITS * (100 - duty ))/100 );
  828. }else {
  829. data0 = data_AllH >> ((PWM_NEW_MODE_DUTY_TOTAL_BITS * (50 - duty))/100);
  830. PWMDBG("DATA0 :0x%x\n",data0);
  831. data1 = 0;
  832. }
  833. mt_pwm_power_on(conf->pwm_no);
  834. mt_set_pwm_con_guardval(conf->pwm_no, GUARD_TRUE);
  835. mt_set_intr_disable(conf->pwm_no * 2);
  836. mt_set_intr_disable(conf->pwm_no * 2 + 1);
  837. switch ( conf->clk_src ) {
  838. case PWM_CLK_OLD_MODE_32K:
  839. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_ENABLE);
  840. mt_set_pwm_clk ( conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  841. break;
  842. case PWM_CLK_OLD_MODE_BLOCK:
  843. mt_set_pwm_con_oldmode (conf->pwm_no, OLDMODE_ENABLE );
  844. mt_set_pwm_clk ( conf->pwm_no, CLK_BLOCK, conf->clk_div );
  845. break;
  846. case PWM_CLK_NEW_MODE_BLOCK:
  847. mt_set_pwm_con_oldmode (conf->pwm_no, OLDMODE_DISABLE );
  848. mt_set_pwm_clk ( conf->pwm_no, CLK_BLOCK , conf->clk_div );
  849. mt_set_pwm_con_datasrc( conf->pwm_no, FIFO);
  850. mt_set_pwm_con_stpbit ( conf->pwm_no, 0x3f, FIFO );
  851. break;
  852. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  853. mt_set_pwm_con_oldmode (conf->pwm_no, OLDMODE_DISABLE );
  854. mt_set_pwm_clk ( conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div );
  855. mt_set_pwm_con_datasrc( conf->pwm_no, FIFO);
  856. mt_set_pwm_con_stpbit ( conf->pwm_no, 0x3f, FIFO );
  857. break;
  858. default:
  859. break;
  860. }
  861. mt_set_pwm_HiDur ( conf->pwm_no, duration );
  862. mt_set_pwm_LowDur (conf->pwm_no, duration );
  863. mt_set_pwm_GuardDur (conf->pwm_no, 0 );
  864. mt_set_pwm_buf0_addr (conf->pwm_no, 0 );
  865. mt_set_pwm_buf0_size( conf->pwm_no, 0 );
  866. mt_set_pwm_buf1_addr (conf->pwm_no, 0 );
  867. mt_set_pwm_buf1_size (conf->pwm_no, 0 );
  868. mt_set_pwm_send_data0 (conf->pwm_no, data0 );
  869. mt_set_pwm_send_data1 (conf->pwm_no, data1 );
  870. mt_set_pwm_wave_num (conf->pwm_no, 0 );
  871. // if ( conf->pwm_no <= PWM2)
  872. //{
  873. mt_set_pwm_data_width (conf->pwm_no, duration );
  874. mt_set_pwm_thresh ( conf->pwm_no, (( duration * conf->duty)/100));
  875. // mt_set_pwm_valid (conf->pwm_no, BUF0_EN_VALID );
  876. // mt_set_pwm_valid ( conf->pwm_no, BUF1_EN_VALID );
  877. //}
  878. mt_set_pwm_enable ( conf->pwm_no );
  879. PWMDBG("mt_set_pwm_enable\n");
  880. return RSUCCESS;
  881. }
  882. /*****************************************************
  883. * Clear intr ack register
  884. * pwm_no: PWM1~PWM3 (0~2)
  885. * pwm_intr_ack_bit
  886. ******************************************************/
  887. S32 mt_clr_intr_ack ( U32 pwm_intr_ack_bit )
  888. {
  889. if ( pwm_intr_ack_bit >= PWM_INT_ACK_BITS_MAX ) {
  890. PWMDBG ( "ack bit excesses PWM_INT_ACK_BITS_MAX\n" );
  891. return -EEXCESSBITS;
  892. }
  893. DRV_ClrReg32 ( PWM_INT_ACK, 1 << pwm_intr_ack_bit );
  894. return RSUCCESS;
  895. }
  896. S32 pwm_set_spec_config(struct pwm_spec_config *conf)
  897. {
  898. if ( conf->pwm_no >= PWM_MAX ) {
  899. PWMDBG("pwm number excess PWM_MAX\n");
  900. return -EEXCESSPWMNO;
  901. }
  902. if (conf->mode >= PWM_MODE_INVALID) {
  903. PWMDBG ( "PWM mode invalid \n" );
  904. return -EINVALID;
  905. }
  906. if (conf ->clk_src >= PWM_CLK_SRC_INVALID) {
  907. PWMDBG ("PWM clock source invalid\n");
  908. return -EINVALID;
  909. }
  910. if (conf->clk_div >= CLK_DIV_MAX) {
  911. PWMDBG ( "PWM clock division invalid\n" );
  912. return -EINVALID;
  913. }
  914. if ( (conf->mode == PWM_MODE_OLD &&
  915. (conf->clk_src == PWM_CLK_NEW_MODE_BLOCK|| conf->clk_src == PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625))
  916. ||(conf->mode != PWM_MODE_OLD &&
  917. (conf->clk_src == PWM_CLK_OLD_MODE_32K || conf->clk_src == PWM_CLK_OLD_MODE_BLOCK)) ) {
  918. PWMDBG ( "parameters match error\n" );
  919. return -ERROR;
  920. }
  921. if (conf->pmic_pad){
  922. mt_pwm_sel_pmic(conf->pwm_no);
  923. }
  924. mt_pwm_power_on(conf->pwm_no);
  925. mt_set_intr_disable(conf->pwm_no * 2);
  926. mt_set_intr_disable(conf->pwm_no * 2 + 1);
  927. switch (conf->mode ) {
  928. case PWM_MODE_OLD:
  929. PWMDBG("PWM_MODE_OLD\n");
  930. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_ENABLE);
  931. mt_set_pwm_con_idleval(conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.IDLE_VALUE);
  932. mt_set_pwm_con_guardval (conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.GUARD_VALUE);
  933. mt_set_pwm_GuardDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.GDURATION);
  934. mt_set_pwm_wave_num(conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.WAVE_NUM);
  935. mt_set_pwm_data_width(conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.DATA_WIDTH);
  936. mt_set_pwm_thresh(conf->pwm_no, conf->pwm_mode.PWM_MODE_OLD_REGS.THRESH);
  937. PWMDBG ("PWM set old mode finish\n");
  938. break;
  939. case PWM_MODE_FIFO:
  940. PWMDBG("PWM_MODE_FIFO\n");
  941. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  942. mt_set_pwm_con_datasrc(conf->pwm_no, FIFO);
  943. mt_set_pwm_con_mode (conf->pwm_no, PERIOD);
  944. mt_set_pwm_con_idleval(conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.IDLE_VALUE);
  945. mt_set_pwm_con_guardval (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.GUARD_VALUE);
  946. mt_set_pwm_HiDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.HDURATION);
  947. mt_set_pwm_LowDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.LDURATION);
  948. mt_set_pwm_GuardDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.GDURATION);
  949. mt_set_pwm_send_data0 (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.SEND_DATA0);
  950. mt_set_pwm_send_data1 (conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.SEND_DATA1);
  951. mt_set_pwm_wave_num(conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.WAVE_NUM);
  952. mt_set_pwm_con_stpbit(conf->pwm_no, conf->pwm_mode.PWM_MODE_FIFO_REGS.STOP_BITPOS_VALUE,FIFO);
  953. break;
  954. /*case PWM_MODE_MEMORY:
  955. PWMDBG("PWM_MODE_MEMORY\n");
  956. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  957. mt_set_pwm_con_datasrc(conf->pwm_no, MEMORY);
  958. mt_set_pwm_con_mode (conf->pwm_no, PERIOD);
  959. mt_set_pwm_con_idleval(conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.IDLE_VALUE);
  960. mt_set_pwm_con_guardval (conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.GUARD_VALUE);
  961. mt_set_pwm_HiDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.HDURATION);
  962. mt_set_pwm_LowDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.LDURATION);
  963. mt_set_pwm_GuardDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.GDURATION);
  964. mt_set_pwm_buf0_addr(conf->pwm_no, (U32)conf->pwm_mode.PWM_MODE_MEMORY_REGS.BUF0_BASE_ADDR);
  965. mt_set_pwm_buf0_size (conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.BUF0_SIZE);
  966. mt_set_pwm_wave_num(conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.WAVE_NUM);
  967. mt_set_pwm_con_stpbit(conf->pwm_no, conf->pwm_mode.PWM_MODE_MEMORY_REGS.STOP_BITPOS_VALUE,MEMORY);
  968. break;
  969. case PWM_MODE_RANDOM:
  970. PWMDBG("PWM_MODE_RANDOM\n");
  971. mt_set_pwm_disable(conf->pwm_no);
  972. mt_set_pwm_con_oldmode(conf->pwm_no, OLDMODE_DISABLE);
  973. mt_set_pwm_con_datasrc(conf->pwm_no, MEMORY);
  974. mt_set_pwm_con_mode (conf->pwm_no, RAND);
  975. mt_set_pwm_con_idleval(conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.IDLE_VALUE);
  976. mt_set_pwm_con_guardval (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.GUARD_VALUE);
  977. mt_set_pwm_HiDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.HDURATION);
  978. mt_set_pwm_LowDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.LDURATION);
  979. mt_set_pwm_GuardDur (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.GDURATION);
  980. mt_set_pwm_buf0_addr(conf->pwm_no, (U32 )conf->pwm_mode.PWM_MODE_RANDOM_REGS.BUF0_BASE_ADDR);
  981. mt_set_pwm_buf0_size (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.BUF0_SIZE);
  982. mt_set_pwm_buf1_addr(conf->pwm_no, (U32 )conf->pwm_mode.PWM_MODE_RANDOM_REGS.BUF1_BASE_ADDR);
  983. mt_set_pwm_buf1_size (conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.BUF1_SIZE);
  984. mt_set_pwm_wave_num(conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.WAVE_NUM);
  985. mt_set_pwm_con_stpbit(conf->pwm_no, conf->pwm_mode.PWM_MODE_RANDOM_REGS.STOP_BITPOS_VALUE, MEMORY);
  986. mt_set_pwm_valid(conf->pwm_no, BUF0_EN_VALID);
  987. mt_set_pwm_valid(conf->pwm_no, BUF1_EN_VALID);
  988. break;
  989. */
  990. default:
  991. break;
  992. }
  993. switch (conf->clk_src) {
  994. case PWM_CLK_OLD_MODE_BLOCK:
  995. mt_set_pwm_clk (conf->pwm_no, CLK_BLOCK, conf->clk_div);
  996. PWMDBG("Enable oldmode and set clock block\n");
  997. break;
  998. case PWM_CLK_OLD_MODE_32K:
  999. mt_set_pwm_clk (conf->pwm_no, 0x80000000|CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  1000. PWMDBG("Enable oldmode and set clock 32K\n");
  1001. break;
  1002. case PWM_CLK_NEW_MODE_BLOCK:
  1003. mt_set_pwm_clk (conf->pwm_no, CLK_BLOCK, conf->clk_div);
  1004. PWMDBG("Enable newmode and set clock block\n");
  1005. break;
  1006. case PWM_CLK_NEW_MODE_BLOCK_DIV_BY_1625:
  1007. mt_set_pwm_clk (conf->pwm_no, CLK_BLOCK_BY_1625_OR_32K, conf->clk_div);
  1008. PWMDBG("Enable newmode and set clock 32K\n");
  1009. break;
  1010. default:
  1011. break;
  1012. }
  1013. if(conf->intr)
  1014. {
  1015. mt_set_intr_ack(conf->pwm_no * 2);
  1016. mt_set_intr_enable(conf->pwm_no * 2);
  1017. }
  1018. mt_set_pwm_enable(conf->pwm_no);
  1019. PWMDBG("mt_set_pwm_enable\n");
  1020. return RSUCCESS;
  1021. }
  1022. void pwm_init()
  1023. {
  1024. printf("lk pwm init\n");
  1025. // printf("pwm clock : 0x%x\n", INREG32(PWM_CLOCK_STA));
  1026. /*
  1027. mt_pwm_power_on(PWM1);
  1028. mt_pwm_power_on(PWM2);
  1029. mt_pwm_power_on(PWM3);
  1030. */
  1031. // mt65xx_irq_set_sens(MT6575_PWM_IRQ_ID, MT65xx_EDGE_SENSITIVE);
  1032. // mt65xx_irq_set_polarity(MT6575_PWM_IRQ_ID, MT65xx_POLARITY_LOW);
  1033. }