cerf.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mach-pxa/cerf.c
  3.  *  
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License version 2 as
  6.  *  published by the Free Software Foundation.
  7.  */
  8. #include <linux/init.h>
  9. #include <linux/major.h>
  10. #include <linux/fs.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/sched.h>
  13. #include <asm/types.h>
  14. #include <asm/setup.h>
  15. #include <asm/memory.h>
  16. #include <asm/mach-types.h>
  17. #include <asm/hardware.h>
  18. #include <asm/irq.h>
  19. #include <asm/mach/arch.h>
  20. #include <asm/mach/map.h>
  21. #include <asm/mach/irq.h>
  22. #include <asm/io.h>
  23. #include <asm/arch/irq.h>
  24. #include "generic.h"
  25. /*
  26.  * Set this to zero to remove all the debug statements via
  27.  * dead code elimination.
  28.  */
  29. #define DEBUGGING       1
  30. #if DEBUGGING
  31. static unsigned int cerf_debug = DEBUGGING;
  32. #else
  33. #define cerf_debug       0
  34. #endif
  35. static void __init cerf_init_irq(void)
  36. {
  37. pxa_init_irq();
  38. if( cerf_debug > 1)
  39. {
  40. #if 0
  41. GPDR0 = 0xc05b9130;
  42. GPDR1 = 0xfcffab82;
  43. GPDR2 = 0x0001ffff;
  44. #endif
  45. printk(KERN_INFO "Pin directions:n");
  46. printk(KERN_INFO "GPDR0 0x%08xn", GPDR0);
  47. printk(KERN_INFO "GPDR1 0x%08xn", GPDR1);
  48. printk(KERN_INFO "GPDR2 0x%08xn", GPDR2);
  49. printk(KERN_INFO "Pin State:n");
  50. printk(KERN_INFO "GPLR0 0x%08xn", GPLR0);
  51. printk(KERN_INFO "GPLR1 0x%08xn", GPLR1);
  52. printk(KERN_INFO "GPLR2 0x%08xn", GPLR2);
  53. printk(KERN_INFO "Rising Edge:n");
  54. printk(KERN_INFO "GRER0 0x%08xn", GRER0);
  55. printk(KERN_INFO "GRER1 0x%08xn", GRER1);
  56. printk(KERN_INFO "GRER2 0x%08xn", GRER2);
  57. printk(KERN_INFO "Falling Edge:n");
  58. printk(KERN_INFO "GFER0 0x%08xn", GFER0);
  59. printk(KERN_INFO "GFER1 0x%08xn", GFER1);
  60. printk(KERN_INFO "GFER2 0x%08xn", GFER2);
  61. }
  62. /* set_GPIO_IRQ_edge has to be called before an irq can be requested */
  63.         set_GPIO_IRQ_edge(  0, GPIO_FALLING_EDGE); /* CPLD               */
  64. #ifdef CONFIG_PXA_CERF_PDA
  65.         set_GPIO_IRQ_edge(  2, GPIO_RISING_EDGE);  /* UART B Interrupt   */
  66.         set_GPIO_IRQ_edge(  3, GPIO_RISING_EDGE);  /* UART A Interrupt   */
  67.         set_GPIO_IRQ_edge( 32, GPIO_RISING_EDGE);  /* UCB1400 Interrupt  */
  68. #endif
  69.         set_GPIO_IRQ_edge( 14, GPIO_FALLING_EDGE); /* PCMCIA Card Detect */
  70.         set_GPIO_IRQ_edge( 21, GPIO_RISING_EDGE);  /* Ethernet Interrupt */
  71. }
  72. static int __init cerf_init(void)
  73. {
  74. /*
  75.  * All of the code that was here was SA1111 init code
  76.  * which we do not have.
  77.  */
  78. return 0;
  79. }
  80. __initcall(cerf_init);
  81. static void __init
  82. fixup_cerf(struct machine_desc *desc, struct param_struct *params,
  83. char **cmdline, struct meminfo *mi)
  84. {
  85. SET_BANK (0, CERF_RAM_BASE, CERF_RAM_SIZE);
  86. mi->nr_banks      = 1;
  87. #if 0 // Enable this stuff if you plan on not using jffs2
  88. setup_ramdisk (1, 0, 0, 8192);
  89. setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024);
  90. ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
  91. #endif
  92. }
  93. /*
  94.  * IO map for the devices.
  95.  */
  96. static struct map_desc cerf_io_desc[] __initdata = {
  97.  /* virtual           physical          length            domain     r  w  c  b */
  98.   { CERF_FLASH_BASE , CERF_FLASH_PHYS , CERF_FLASH_SIZE , DOMAIN_IO, 0, 1, 0, 0 },
  99.   { CERF_ETH_BASE   , CERF_ETH_PHYS   , CERF_ETH_SIZE   , DOMAIN_IO, 0, 1, 0, 0 },
  100. #ifdef CONFIG_PXA_CERF_PDA
  101.   { CERF_BT_BASE    , CERF_BT_PHYS    , CERF_BT_SIZE    , DOMAIN_IO, 0, 1, 0, 0 },
  102.   { CERF_SERIAL_BASE, CERF_SERIAL_PHYS, CERF_SERIAL_SIZE, DOMAIN_IO, 0, 1, 0, 0 },
  103.   { CERF_CPLD_BASE  , CERF_CPLD_PHYS  , CERF_CPLD_SIZE  , DOMAIN_IO, 0, 1, 0, 0 },
  104. #endif
  105.   LAST_DESC
  106. };
  107. /*
  108.  * Show memory, run, turbo frequency settings.
  109.  */
  110. static void cerf_show_freqs( void)
  111. {
  112. #define BASE_CLOCK 3686400
  113. #define MAX_MEM_MULT 5
  114. static int mem_mult[] = { 0, 27, 32, 36, 40, 45 };
  115. #define MAX_RMTM_MULT 7
  116. static int rmtm_mult[] = { 0, 0, 2, 3, 4, 0, 6, 0 }; //divide by 2 later
  117. #define MAX_MFRM_MULT 3
  118. static int mfrm_mult[] = { 0, 1, 2, 0};
  119. int cccr = CCCR;
  120. int n, m, l;
  121. int mem_freq;
  122. int rm_freq;
  123. int tm_freq;
  124.         int p14val; 
  125. n = (cccr & CCCR_N_MASK) >> 7;
  126. m = (cccr & CCCR_M_MASK) >> 5;
  127. l =  cccr & CCCR_L_MASK;
  128. if( l > MAX_MEM_MULT)
  129. {
  130.     printk(KERN_INFO "cerf.c: Unknown memory freq multiplier.n");
  131.     return;
  132. }
  133. if( n > MAX_RMTM_MULT)
  134. {
  135.     printk(KERN_INFO "cerf.c: Unknown run-mode to turbo-mode freq multiplier.n");
  136.     return;
  137. }
  138. if( m > MAX_MFRM_MULT)
  139. {
  140.     printk(KERN_INFO "cerf.c: Unknown memory to run-mode freq multiplier.n");
  141.     return;
  142. }
  143. mem_freq = BASE_CLOCK * mem_mult[l]; 
  144. rm_freq  = mem_freq * mfrm_mult[m];
  145. tm_freq  = rm_freq * rmtm_mult[n]/2;
  146. printk(KERN_INFO "Memory freq     = %d Mhzn", mem_freq/1000000);
  147. printk(KERN_INFO "Run mode freq   = %d Mhzn", rm_freq/1000000);
  148. printk(KERN_INFO "Turbo mode freq = %d Mhzn", tm_freq/1000000);
  149.         asm("mrc%?   p14, 0, %0, c6, c0" : "=r" (p14val));
  150. printk(KERN_INFO "Turbo mode %s.n", p14val&0x01 ? "on" : "off");
  151. }
  152. static void __init cerf_map_io(void)
  153. {
  154. pxa_map_io();
  155. iotable_init(cerf_io_desc);
  156. if( cerf_debug) cerf_show_freqs();
  157. if( cerf_debug > 1)
  158. {
  159. printk(KERN_INFO "origMCS0 = 0x%08xn", MSC0);
  160. printk(KERN_INFO "origMCS1 = 0x%08xn", MSC1);
  161. printk(KERN_INFO "origMCS2 = 0x%08xn", MSC2);
  162. }
  163. /* setup memory timing for CS0/1 */
  164.         MSC0 = MSC_CS(0, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  165.  MSC_RRR(7) |
  166.  MSC_RDN(15) |
  167.  MSC_RDF(15) |
  168.  MSC_RBW(0) |
  169.  MSC_RT(0)) |
  170. #ifdef CONFIG_PXA_CERF_PDA
  171.                MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  172.  MSC_RRR(7) |
  173.  MSC_RDN(15) |
  174.  MSC_RDF(15) |
  175.  MSC_RBW(1) |
  176.  MSC_RT(0));
  177. #elif defined(CONFIG_PXA_CERF_BOARD)
  178.                MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  179.  MSC_RRR(1) |
  180.  MSC_RDN(2) |
  181.  MSC_RDF(4) |
  182.  MSC_RBW(0) |
  183.  MSC_RT(4));
  184. #endif
  185. printk(KERN_INFO "MCS0 = 0x%08xn", MSC0);
  186. /* setup memory timing for CS2/3 */
  187.         MSC1 = MSC_CS(2, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  188.  MSC_RRR(5) |
  189.  MSC_RDN(10) |
  190.  MSC_RDF(10) |
  191.  MSC_RBW(1) |
  192.  MSC_RT(0)) |
  193.                MSC_CS(3, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  194.  MSC_RRR(5) |
  195.  MSC_RDN(10) |
  196.  MSC_RDF(10) |
  197.  MSC_RBW(1) |
  198.  MSC_RT(0));
  199. printk(KERN_INFO "MCS1 = 0x%08xn", MSC1);
  200. /* setup memory timing for CS4/5 */
  201.         MSC2 = MSC_CS(4, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  202.  MSC_RRR(2) |
  203.  MSC_RDN(4) |
  204.  MSC_RDF(4) |
  205.  MSC_RBW(1) |
  206.  MSC_RT(0)) |
  207.                MSC_CS(5, MSC_RBUFF(MSC_RBUFF_SLOW) | 
  208.  MSC_RRR(2) |
  209.  MSC_RDN(4) |
  210.  MSC_RDF(4) |
  211.  MSC_RBW(1) |
  212.  MSC_RT(0));
  213. printk(KERN_INFO "MCS2 = 0x%08xn", MSC2);
  214. #ifdef CONFIG_SOUND_PXA_AC97
  215. printk(KERN_INFO "Enabling sound amp for pxa cerf pda.n");
  216.         outw( CERF_PDA_SOUND_ENABLE, CERF_CPLD_BASE+CERF_PDA_CPLD_SOUND_ENA);
  217. #endif
  218. #ifdef CONFIG_FB_PXA
  219. printk(KERN_INFO "Setting LCD to brightness to %d/15n", CERF_PDA_DEFAULT_BRIGHTNESS);
  220. outw( CERF_PDA_DEFAULT_BRIGHTNESS, CERF_CPLD_BASE+CERF_PDA_CPLD_BRIGHTNESS);
  221. #endif
  222. #ifdef CONFIG_IRDA
  223. /* Enable IrDA UART (SIR)*/
  224. CKEN |= CKEN5_STUART;
  225. /* We want to get our goods from the STUART */
  226. set_GPIO_mode(GPIO46_STRXD_MD);
  227. set_GPIO_mode(GPIO47_STTXD_MD);
  228. /* make sure FIR ICP is off */
  229. ICCR0 = 0;
  230. /* configure STUART to for SIR
  231.  * NOTE: RCVEIR and XMITIR must not be set at the same time!
  232.  * Start with receive in IR mode, and switch transmit to IR only
  233.  * when we need to send something in serial driver.
  234.  */
  235. STISR = IrSR_IR_RECEIVE_ON;
  236. #endif
  237. #if 0
  238. /* Connect FIR ICP to GPIO pins */
  239. CKEN |= CKEN13_FICP;
  240. set_GPIO_mode(GPIO46_ICPRXD_MD);
  241. set_GPIO_mode(GPIO47_ICPTXD_MD);
  242. ICCR0 = 0x1 | 0x18; //ICP unit enable
  243. #endif
  244. #if 0
  245. /* Enable BT UART */
  246. CKEN |= CKEN7_BTUART;
  247. set_GPIO_mode(GPIO42_BTRXD_MD);
  248. set_GPIO_mode(GPIO43_BTTXD_MD);
  249. set_GPIO_mode(GPIO44_BTCTS_MD);
  250. set_GPIO_mode(GPIO45_BTRTS_MD);
  251. #endif
  252. if( cerf_debug > 1)
  253. {
  254. printk(KERN_INFO "GPDR1 0x%08xn", GPDR1);
  255. printk(KERN_INFO "GPLR1 0x%08xn", GPLR1);
  256. printk(KERN_INFO "GAFR1_L 0x%08xn", GAFR1_L);
  257. printk(KERN_INFO "CKEN  = 0x%08xn", CKEN);
  258. printk(KERN_INFO "ICCR0 = 0x%08xn", ICCR0);
  259. printk(KERN_INFO "STISR = 0x%08xn", STISR);
  260. }
  261. }
  262. MACHINE_START(PXA_CERF, "CerfBoard PXA Reference Board")
  263. MAINTAINER("Intrinsyc Software Inc.")
  264. BOOT_MEM(0xa0000000, 0x40000000, 0xfc000000)
  265. BOOT_PARAMS(0xa0000100)
  266. FIXUP(fixup_cerf)
  267. MAPIO(cerf_map_io)
  268. INITIRQ(cerf_init_irq)
  269. MACHINE_END