pwm.c 33 KB

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