mpc86xads_setup.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /*arch/powerpc/platforms/8xx/mpc86xads_setup.c
  2. *
  3. * Platform setup for the Freescale mpc86xads board
  4. *
  5. * Vitaly Bordug <vbordug@ru.mvista.com>
  6. *
  7. * Copyright 2005 MontaVista Software Inc.
  8. *
  9. * This file is licensed under the terms of the GNU General Public License
  10. * version 2. This program is licensed "as is" without any warranty of any
  11. * kind, whether express or implied.
  12. */
  13. #include <linux/init.h>
  14. #include <linux/module.h>
  15. #include <linux/param.h>
  16. #include <linux/string.h>
  17. #include <linux/ioport.h>
  18. #include <linux/device.h>
  19. #include <linux/delay.h>
  20. #include <linux/root_dev.h>
  21. #include <linux/fs_enet_pd.h>
  22. #include <linux/fs_uart_pd.h>
  23. #include <linux/mii.h>
  24. #include <asm/delay.h>
  25. #include <asm/io.h>
  26. #include <asm/machdep.h>
  27. #include <asm/page.h>
  28. #include <asm/processor.h>
  29. #include <asm/system.h>
  30. #include <asm/time.h>
  31. #include <asm/mpc8xx.h>
  32. #include <asm/8xx_immap.h>
  33. #include <asm/commproc.h>
  34. #include <asm/fs_pd.h>
  35. #include <asm/prom.h>
  36. #include <sysdev/commproc.h>
  37. static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi);
  38. static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi);
  39. static void init_scc1_ioports(struct fs_platform_info* ptr);
  40. void __init mpc86xads_board_setup(void)
  41. {
  42. cpm8xx_t *cp;
  43. unsigned int *bcsr_io;
  44. u8 tmpval8;
  45. bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
  46. cp = (cpm8xx_t *)immr_map(im_cpm);
  47. if (bcsr_io == NULL) {
  48. printk(KERN_CRIT "Could not remap BCSR\n");
  49. return;
  50. }
  51. #ifdef CONFIG_SERIAL_CPM_SMC1
  52. clrbits32(bcsr_io, BCSR1_RS232EN_1);
  53. clrbits32(&cp->cp_simode, 0xe0000000 >> 17); /* brg1 */
  54. tmpval8 = in_8(&(cp->cp_smc[0].smc_smcm)) | (SMCM_RX | SMCM_TX);
  55. out_8(&(cp->cp_smc[0].smc_smcm), tmpval8);
  56. clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
  57. #else
  58. setbits32(bcsr_io,BCSR1_RS232EN_1);
  59. out_be16(&cp->cp_smc[0].smc_smcmr, 0);
  60. out_8(&cp->cp_smc[0].smc_smce, 0);
  61. #endif
  62. #ifdef CONFIG_SERIAL_CPM_SMC2
  63. clrbits32(bcsr_io,BCSR1_RS232EN_2);
  64. clrbits32(&cp->cp_simode, 0xe0000000 >> 1);
  65. setbits32(&cp->cp_simode, 0x20000000 >> 1); /* brg2 */
  66. tmpval8 = in_8(&(cp->cp_smc[1].smc_smcm)) | (SMCM_RX | SMCM_TX);
  67. out_8(&(cp->cp_smc[1].smc_smcm), tmpval8);
  68. clrbits16(&cp->cp_smc[1].smc_smcmr, SMCMR_REN | SMCMR_TEN);
  69. init_smc2_uart_ioports(0);
  70. #else
  71. setbits32(bcsr_io,BCSR1_RS232EN_2);
  72. out_be16(&cp->cp_smc[1].smc_smcmr, 0);
  73. out_8(&cp->cp_smc[1].smc_smce, 0);
  74. #endif
  75. immr_unmap(cp);
  76. iounmap(bcsr_io);
  77. }
  78. static void init_fec1_ioports(struct fs_platform_info* ptr)
  79. {
  80. iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
  81. /* configure FEC1 pins */
  82. setbits16(&io_port->iop_pdpar, 0x1fff);
  83. setbits16(&io_port->iop_pddir, 0x1fff);
  84. immr_unmap(io_port);
  85. }
  86. void init_fec_ioports(struct fs_platform_info *fpi)
  87. {
  88. int fec_no = fs_get_fec_index(fpi->fs_no);
  89. switch (fec_no) {
  90. case 0:
  91. init_fec1_ioports(fpi);
  92. break;
  93. default:
  94. printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
  95. return;
  96. }
  97. }
  98. static void init_scc1_ioports(struct fs_platform_info* fpi)
  99. {
  100. unsigned *bcsr_io;
  101. iop8xx_t *io_port;
  102. cpm8xx_t *cp;
  103. bcsr_io = ioremap(BCSR_ADDR, BCSR_SIZE);
  104. io_port = (iop8xx_t *)immr_map(im_ioport);
  105. cp = (cpm8xx_t *)immr_map(im_cpm);
  106. if (bcsr_io == NULL) {
  107. printk(KERN_CRIT "Could not remap BCSR\n");
  108. return;
  109. }
  110. /* Configure port A pins for Txd and Rxd.
  111. */
  112. setbits16(&io_port->iop_papar, PA_ENET_RXD | PA_ENET_TXD);
  113. clrbits16(&io_port->iop_padir, PA_ENET_RXD | PA_ENET_TXD);
  114. clrbits16(&io_port->iop_paodr, PA_ENET_TXD);
  115. /* Configure port C pins to enable CLSN and RENA.
  116. */
  117. clrbits16(&io_port->iop_pcpar, PC_ENET_CLSN | PC_ENET_RENA);
  118. clrbits16(&io_port->iop_pcdir, PC_ENET_CLSN | PC_ENET_RENA);
  119. setbits16(&io_port->iop_pcso, PC_ENET_CLSN | PC_ENET_RENA);
  120. /* Configure port A for TCLK and RCLK.
  121. */
  122. setbits16(&io_port->iop_papar, PA_ENET_TCLK | PA_ENET_RCLK);
  123. clrbits16(&io_port->iop_padir, PA_ENET_TCLK | PA_ENET_RCLK);
  124. clrbits32(&cp->cp_pbpar, PB_ENET_TENA);
  125. clrbits32(&cp->cp_pbdir, PB_ENET_TENA);
  126. /* Configure Serial Interface clock routing.
  127. * First, clear all SCC bits to zero, then set the ones we want.
  128. */
  129. clrbits32(&cp->cp_sicr, SICR_ENET_MASK);
  130. setbits32(&cp->cp_sicr, SICR_ENET_CLKRT);
  131. /* In the original SCC enet driver the following code is placed at
  132. the end of the initialization */
  133. setbits32(&cp->cp_pbpar, PB_ENET_TENA);
  134. setbits32(&cp->cp_pbdir, PB_ENET_TENA);
  135. clrbits32(bcsr_io+1, BCSR1_ETHEN);
  136. iounmap(bcsr_io);
  137. immr_unmap(cp);
  138. immr_unmap(io_port);
  139. }
  140. void init_scc_ioports(struct fs_platform_info *fpi)
  141. {
  142. int scc_no = fs_get_scc_index(fpi->fs_no);
  143. switch (scc_no) {
  144. case 0:
  145. init_scc1_ioports(fpi);
  146. break;
  147. default:
  148. printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
  149. return;
  150. }
  151. }
  152. static void init_smc1_uart_ioports(struct fs_uart_platform_info* ptr)
  153. {
  154. unsigned *bcsr_io;
  155. cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
  156. setbits32(&cp->cp_pbpar, 0x000000c0);
  157. clrbits32(&cp->cp_pbdir, 0x000000c0);
  158. clrbits16(&cp->cp_pbodr, 0x00c0);
  159. immr_unmap(cp);
  160. bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
  161. if (bcsr_io == NULL) {
  162. printk(KERN_CRIT "Could not remap BCSR1\n");
  163. return;
  164. }
  165. clrbits32(bcsr_io,BCSR1_RS232EN_1);
  166. iounmap(bcsr_io);
  167. }
  168. static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi)
  169. {
  170. unsigned *bcsr_io;
  171. cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
  172. setbits32(&cp->cp_pbpar, 0x00000c00);
  173. clrbits32(&cp->cp_pbdir, 0x00000c00);
  174. clrbits16(&cp->cp_pbodr, 0x0c00);
  175. immr_unmap(cp);
  176. bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
  177. if (bcsr_io == NULL) {
  178. printk(KERN_CRIT "Could not remap BCSR1\n");
  179. return;
  180. }
  181. clrbits32(bcsr_io,BCSR1_RS232EN_2);
  182. iounmap(bcsr_io);
  183. }
  184. void init_smc_ioports(struct fs_uart_platform_info *data)
  185. {
  186. int smc_no = fs_uart_id_fsid2smc(data->fs_no);
  187. switch (smc_no) {
  188. case 0:
  189. init_smc1_uart_ioports(data);
  190. data->brg = data->clk_rx;
  191. break;
  192. case 1:
  193. init_smc2_uart_ioports(data);
  194. data->brg = data->clk_rx;
  195. break;
  196. default:
  197. printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
  198. return;
  199. }
  200. }
  201. int platform_device_skip(const char *model, int id)
  202. {
  203. return 0;
  204. }
  205. static void __init mpc86xads_setup_arch(void)
  206. {
  207. cpm_reset();
  208. mpc86xads_board_setup();
  209. ROOT_DEV = Root_NFS;
  210. }
  211. static int __init mpc86xads_probe(void)
  212. {
  213. char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
  214. "model", NULL);
  215. if (model == NULL)
  216. return 0;
  217. if (strcmp(model, "MPC866ADS"))
  218. return 0;
  219. return 1;
  220. }
  221. define_machine(mpc86x_ads) {
  222. .name = "MPC86x ADS",
  223. .probe = mpc86xads_probe,
  224. .setup_arch = mpc86xads_setup_arch,
  225. .init_IRQ = m8xx_pic_init,
  226. .get_irq = mpc8xx_get_irq,
  227. .restart = mpc8xx_restart,
  228. .calibrate_decr = mpc8xx_calibrate_decr,
  229. .set_rtc_time = mpc8xx_set_rtc_time,
  230. .get_rtc_time = mpc8xx_get_rtc_time,
  231. };