pwm.c 33 KB

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