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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mach-pxa/lubbock.c
  3.  *
  4.  *  Support for the Intel DBPXA250 Development Platform.
  5.  *  
  6.  *  Author: Nicolas Pitre
  7.  *  Created: Jun 15, 2001
  8.  *  Copyright: MontaVista Software Inc.
  9.  *  
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License version 2 as
  12.  *  published by the Free Software Foundation.
  13.  */
  14. #include <linux/init.h>
  15. #include <linux/major.h>
  16. #include <linux/fs.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/sched.h>
  19. #include <asm/types.h>
  20. #include <asm/setup.h>
  21. #include <asm/memory.h>
  22. #include <asm/mach-types.h>
  23. #include <asm/hardware.h>
  24. #include <asm/irq.h>
  25. #include <asm/mach/arch.h>
  26. #include <asm/mach/map.h>
  27. #include <asm/mach/irq.h>
  28. #include <asm/arch/irq.h>
  29. #include <asm/hardware/sa1111.h>
  30. #include "generic.h"
  31. #ifdef CONFIG_SA1111
  32.  #include "sa1111.h"
  33. #endif
  34. static unsigned long lubbock_irq_en_mask;
  35. static void lubbock_mask_and_ack_irq(unsigned int irq)
  36. {
  37. int lubbock_irq = (irq - LUBBOCK_IRQ(0));
  38. lubbock_irq_en_mask &= ~(1 << lubbock_irq);
  39. LUB_IRQ_MASK_EN &= ~(1 << lubbock_irq);
  40. LUB_IRQ_SET_CLR &= ~(1 << lubbock_irq);
  41. }
  42. static void lubbock_mask_irq(unsigned int irq)
  43. {
  44. int lubbock_irq = (irq - LUBBOCK_IRQ(0));
  45. lubbock_irq_en_mask &= ~(1 << lubbock_irq);
  46. LUB_IRQ_MASK_EN &= ~(1 << lubbock_irq);
  47. }
  48. static void lubbock_unmask_irq(unsigned int irq)
  49. {
  50. int lubbock_irq = (irq - LUBBOCK_IRQ(0));
  51. lubbock_irq_en_mask |= (1 << lubbock_irq);
  52. LUB_IRQ_MASK_EN |= (1 << lubbock_irq);
  53. }
  54. void lubbock_irq_demux(int irq, void *dev_id, struct pt_regs *regs)
  55. {
  56. unsigned long irq_status;
  57. int i;
  58. while ((irq_status = LUB_IRQ_SET_CLR & lubbock_irq_en_mask)) {
  59. for (i = 0; i < 6; i++) {
  60. if(irq_status & (1<<i)) 
  61. do_IRQ(LUBBOCK_IRQ(i), regs);
  62. }
  63. }
  64. }
  65. static struct irqaction lubbock_irq = {
  66. name: "Lubbock FPGA",
  67. handler: lubbock_irq_demux,
  68. flags: SA_INTERRUPT
  69. };
  70. static void __init lubbock_init_irq(void)
  71. {
  72. int irq;
  73. pxa_init_irq();
  74. /* setup extra lubbock irqs */
  75. for(irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_IRQ(5); irq++)
  76. {
  77. irq_desc[irq].valid = 1;
  78. irq_desc[irq].probe_ok = 1;
  79. irq_desc[irq].mask_ack = lubbock_mask_and_ack_irq;
  80. irq_desc[irq].mask = lubbock_mask_irq;
  81. irq_desc[irq].unmask = lubbock_unmask_irq;
  82. }
  83. set_GPIO_IRQ_edge(GPIO_LUBBOCK_IRQ, GPIO_FALLING_EDGE);
  84. setup_arm_irq(IRQ_GPIO_LUBBOCK_IRQ, &lubbock_irq);
  85. }
  86. static int __init lubbock_init(void)
  87. {
  88. int ret;
  89. ret = sa1111_probe(LUBBOCK_SA1111_BASE);
  90. if (ret)
  91. return ret;
  92. sa1111_wake();
  93. sa1111_init_irq(LUBBOCK_SA1111_IRQ);
  94. return 0;
  95. }
  96. __initcall(lubbock_init);
  97. static void __init
  98. fixup_lubbock(struct machine_desc *desc, struct param_struct *params,
  99. char **cmdline, struct meminfo *mi)
  100. {
  101. SET_BANK (0, 0xa0000000, 64*1024*1024);
  102. mi->nr_banks      = 1;
  103. #if 0
  104. setup_ramdisk (1, 0, 0, 8192);
  105. setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024);
  106. ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
  107. #endif
  108. }
  109. static struct map_desc lubbock_io_desc[] __initdata = {
  110.  /* virtual     physical    length      domain     r  w  c  b */
  111.   { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */
  112.   { 0xf1000000, 0x0c000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 IO */
  113.   { 0xf1100000, 0x0e000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 Attr */
  114.   { 0xf4000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* SA1111 */
  115.   LAST_DESC
  116. };
  117. static void __init lubbock_map_io(void)
  118. {
  119. pxa_map_io();
  120. iotable_init(lubbock_io_desc);
  121. /* This enables the BTUART */
  122. CKEN |= CKEN7_BTUART;
  123. set_GPIO_mode(GPIO42_BTRXD_MD);
  124. set_GPIO_mode(GPIO43_BTTXD_MD);
  125. set_GPIO_mode(GPIO44_BTCTS_MD);
  126. set_GPIO_mode(GPIO45_BTRTS_MD);
  127. /* This is for the SMC chip select */
  128. set_GPIO_mode(GPIO79_nCS_3_MD);
  129. /* setup sleep mode values */
  130. PWER  = 0x00000002;
  131. PFER  = 0x00000000;
  132. PRER  = 0x00000002;
  133. PGSR0 = 0x00008000;
  134. PGSR1 = 0x003F0202;
  135. PGSR2 = 0x0001C000;
  136. PCFR |= PCFR_OPDE;
  137. }
  138. MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform")
  139. MAINTAINER("MontaVista Software Inc.")
  140. BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
  141. FIXUP(fixup_lubbock)
  142. MAPIO(lubbock_map_io)
  143. INITIRQ(lubbock_init_irq)
  144. MACHINE_END