pwm.c 32 KB

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