setup.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. /*
  2. * iop13xx platform Initialization
  3. * Copyright (c) 2005-2006, Intel Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  16. * Place - Suite 330, Boston, MA 02111-1307 USA.
  17. *
  18. */
  19. #include <linux/serial_8250.h>
  20. #include <linux/io.h>
  21. #ifdef CONFIG_MTD_PHYSMAP
  22. #include <linux/mtd/physmap.h>
  23. #endif
  24. #include <asm/mach/map.h>
  25. #include <mach/hardware.h>
  26. #include <asm/irq.h>
  27. #include <asm/hardware/iop_adma.h>
  28. #define IOP13XX_UART_XTAL 33334000
  29. #define IOP13XX_SETUP_DEBUG 0
  30. #define PRINTK(x...) ((void)(IOP13XX_SETUP_DEBUG && printk(x)))
  31. /* Standard IO mapping for all IOP13XX based systems
  32. */
  33. static struct map_desc iop13xx_std_desc[] __initdata = {
  34. { /* mem mapped registers */
  35. .virtual = IOP13XX_PMMR_VIRT_MEM_BASE,
  36. .pfn = __phys_to_pfn(IOP13XX_PMMR_PHYS_MEM_BASE),
  37. .length = IOP13XX_PMMR_SIZE,
  38. .type = MT_DEVICE,
  39. }, { /* PCIE IO space */
  40. .virtual = IOP13XX_PCIE_LOWER_IO_VA,
  41. .pfn = __phys_to_pfn(IOP13XX_PCIE_LOWER_IO_PA),
  42. .length = IOP13XX_PCIX_IO_WINDOW_SIZE,
  43. .type = MT_DEVICE,
  44. }, { /* PCIX IO space */
  45. .virtual = IOP13XX_PCIX_LOWER_IO_VA,
  46. .pfn = __phys_to_pfn(IOP13XX_PCIX_LOWER_IO_PA),
  47. .length = IOP13XX_PCIX_IO_WINDOW_SIZE,
  48. .type = MT_DEVICE,
  49. },
  50. };
  51. static struct resource iop13xx_uart0_resources[] = {
  52. [0] = {
  53. .start = IOP13XX_UART0_PHYS,
  54. .end = IOP13XX_UART0_PHYS + 0x3f,
  55. .flags = IORESOURCE_MEM,
  56. },
  57. [1] = {
  58. .start = IRQ_IOP13XX_UART0,
  59. .end = IRQ_IOP13XX_UART0,
  60. .flags = IORESOURCE_IRQ
  61. }
  62. };
  63. static struct resource iop13xx_uart1_resources[] = {
  64. [0] = {
  65. .start = IOP13XX_UART1_PHYS,
  66. .end = IOP13XX_UART1_PHYS + 0x3f,
  67. .flags = IORESOURCE_MEM,
  68. },
  69. [1] = {
  70. .start = IRQ_IOP13XX_UART1,
  71. .end = IRQ_IOP13XX_UART1,
  72. .flags = IORESOURCE_IRQ
  73. }
  74. };
  75. static struct plat_serial8250_port iop13xx_uart0_data[] = {
  76. {
  77. .membase = (char*)(IOP13XX_UART0_VIRT),
  78. .mapbase = (IOP13XX_UART0_PHYS),
  79. .irq = IRQ_IOP13XX_UART0,
  80. .uartclk = IOP13XX_UART_XTAL,
  81. .regshift = 2,
  82. .iotype = UPIO_MEM,
  83. .flags = UPF_SKIP_TEST,
  84. },
  85. { },
  86. };
  87. static struct plat_serial8250_port iop13xx_uart1_data[] = {
  88. {
  89. .membase = (char*)(IOP13XX_UART1_VIRT),
  90. .mapbase = (IOP13XX_UART1_PHYS),
  91. .irq = IRQ_IOP13XX_UART1,
  92. .uartclk = IOP13XX_UART_XTAL,
  93. .regshift = 2,
  94. .iotype = UPIO_MEM,
  95. .flags = UPF_SKIP_TEST,
  96. },
  97. { },
  98. };
  99. /* The ids are fixed up later in iop13xx_platform_init */
  100. static struct platform_device iop13xx_uart0 = {
  101. .name = "serial8250",
  102. .id = 0,
  103. .dev.platform_data = iop13xx_uart0_data,
  104. .num_resources = 2,
  105. .resource = iop13xx_uart0_resources,
  106. };
  107. static struct platform_device iop13xx_uart1 = {
  108. .name = "serial8250",
  109. .id = 0,
  110. .dev.platform_data = iop13xx_uart1_data,
  111. .num_resources = 2,
  112. .resource = iop13xx_uart1_resources
  113. };
  114. static struct resource iop13xx_i2c_0_resources[] = {
  115. [0] = {
  116. .start = IOP13XX_I2C0_PHYS,
  117. .end = IOP13XX_I2C0_PHYS + 0x18,
  118. .flags = IORESOURCE_MEM,
  119. },
  120. [1] = {
  121. .start = IRQ_IOP13XX_I2C_0,
  122. .end = IRQ_IOP13XX_I2C_0,
  123. .flags = IORESOURCE_IRQ
  124. }
  125. };
  126. static struct resource iop13xx_i2c_1_resources[] = {
  127. [0] = {
  128. .start = IOP13XX_I2C1_PHYS,
  129. .end = IOP13XX_I2C1_PHYS + 0x18,
  130. .flags = IORESOURCE_MEM,
  131. },
  132. [1] = {
  133. .start = IRQ_IOP13XX_I2C_1,
  134. .end = IRQ_IOP13XX_I2C_1,
  135. .flags = IORESOURCE_IRQ
  136. }
  137. };
  138. static struct resource iop13xx_i2c_2_resources[] = {
  139. [0] = {
  140. .start = IOP13XX_I2C2_PHYS,
  141. .end = IOP13XX_I2C2_PHYS + 0x18,
  142. .flags = IORESOURCE_MEM,
  143. },
  144. [1] = {
  145. .start = IRQ_IOP13XX_I2C_2,
  146. .end = IRQ_IOP13XX_I2C_2,
  147. .flags = IORESOURCE_IRQ
  148. }
  149. };
  150. /* I2C controllers. The IOP13XX uses the same block as the IOP3xx, so
  151. * we just use the same device name.
  152. */
  153. /* The ids are fixed up later in iop13xx_platform_init */
  154. static struct platform_device iop13xx_i2c_0_controller = {
  155. .name = "IOP3xx-I2C",
  156. .id = 0,
  157. .num_resources = 2,
  158. .resource = iop13xx_i2c_0_resources
  159. };
  160. static struct platform_device iop13xx_i2c_1_controller = {
  161. .name = "IOP3xx-I2C",
  162. .id = 0,
  163. .num_resources = 2,
  164. .resource = iop13xx_i2c_1_resources
  165. };
  166. static struct platform_device iop13xx_i2c_2_controller = {
  167. .name = "IOP3xx-I2C",
  168. .id = 0,
  169. .num_resources = 2,
  170. .resource = iop13xx_i2c_2_resources
  171. };
  172. #ifdef CONFIG_MTD_PHYSMAP
  173. /* PBI Flash Device
  174. */
  175. static struct physmap_flash_data iq8134x_flash_data = {
  176. .width = 2,
  177. };
  178. static struct resource iq8134x_flash_resource = {
  179. .start = IQ81340_FLASHBASE,
  180. .end = 0,
  181. .flags = IORESOURCE_MEM,
  182. };
  183. static struct platform_device iq8134x_flash = {
  184. .name = "physmap-flash",
  185. .id = 0,
  186. .dev = { .platform_data = &iq8134x_flash_data, },
  187. .num_resources = 1,
  188. .resource = &iq8134x_flash_resource,
  189. };
  190. static unsigned long iq8134x_probe_flash_size(void)
  191. {
  192. uint8_t __iomem *flash_addr = ioremap(IQ81340_FLASHBASE, PAGE_SIZE);
  193. int i;
  194. char query[3];
  195. unsigned long size = 0;
  196. int width = iq8134x_flash_data.width;
  197. if (flash_addr) {
  198. /* send CFI 'query' command */
  199. writew(0x98, flash_addr);
  200. /* check for CFI compliance */
  201. for (i = 0; i < 3 * width; i += width)
  202. query[i / width] = readb(flash_addr + (0x10 * width) + i);
  203. /* read the size */
  204. if (memcmp(query, "QRY", 3) == 0)
  205. size = 1 << readb(flash_addr + (0x27 * width));
  206. /* send CFI 'read array' command */
  207. writew(0xff, flash_addr);
  208. iounmap(flash_addr);
  209. }
  210. return size;
  211. }
  212. #endif
  213. /* ADMA Channels */
  214. static struct resource iop13xx_adma_0_resources[] = {
  215. [0] = {
  216. .start = IOP13XX_ADMA_PHYS_BASE(0),
  217. .end = IOP13XX_ADMA_UPPER_PA(0),
  218. .flags = IORESOURCE_MEM,
  219. },
  220. [1] = {
  221. .start = IRQ_IOP13XX_ADMA0_EOT,
  222. .end = IRQ_IOP13XX_ADMA0_EOT,
  223. .flags = IORESOURCE_IRQ
  224. },
  225. [2] = {
  226. .start = IRQ_IOP13XX_ADMA0_EOC,
  227. .end = IRQ_IOP13XX_ADMA0_EOC,
  228. .flags = IORESOURCE_IRQ
  229. },
  230. [3] = {
  231. .start = IRQ_IOP13XX_ADMA0_ERR,
  232. .end = IRQ_IOP13XX_ADMA0_ERR,
  233. .flags = IORESOURCE_IRQ
  234. }
  235. };
  236. static struct resource iop13xx_adma_1_resources[] = {
  237. [0] = {
  238. .start = IOP13XX_ADMA_PHYS_BASE(1),
  239. .end = IOP13XX_ADMA_UPPER_PA(1),
  240. .flags = IORESOURCE_MEM,
  241. },
  242. [1] = {
  243. .start = IRQ_IOP13XX_ADMA1_EOT,
  244. .end = IRQ_IOP13XX_ADMA1_EOT,
  245. .flags = IORESOURCE_IRQ
  246. },
  247. [2] = {
  248. .start = IRQ_IOP13XX_ADMA1_EOC,
  249. .end = IRQ_IOP13XX_ADMA1_EOC,
  250. .flags = IORESOURCE_IRQ
  251. },
  252. [3] = {
  253. .start = IRQ_IOP13XX_ADMA1_ERR,
  254. .end = IRQ_IOP13XX_ADMA1_ERR,
  255. .flags = IORESOURCE_IRQ
  256. }
  257. };
  258. static struct resource iop13xx_adma_2_resources[] = {
  259. [0] = {
  260. .start = IOP13XX_ADMA_PHYS_BASE(2),
  261. .end = IOP13XX_ADMA_UPPER_PA(2),
  262. .flags = IORESOURCE_MEM,
  263. },
  264. [1] = {
  265. .start = IRQ_IOP13XX_ADMA2_EOT,
  266. .end = IRQ_IOP13XX_ADMA2_EOT,
  267. .flags = IORESOURCE_IRQ
  268. },
  269. [2] = {
  270. .start = IRQ_IOP13XX_ADMA2_EOC,
  271. .end = IRQ_IOP13XX_ADMA2_EOC,
  272. .flags = IORESOURCE_IRQ
  273. },
  274. [3] = {
  275. .start = IRQ_IOP13XX_ADMA2_ERR,
  276. .end = IRQ_IOP13XX_ADMA2_ERR,
  277. .flags = IORESOURCE_IRQ
  278. }
  279. };
  280. static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64);
  281. static struct iop_adma_platform_data iop13xx_adma_0_data = {
  282. .hw_id = 0,
  283. .pool_size = PAGE_SIZE,
  284. };
  285. static struct iop_adma_platform_data iop13xx_adma_1_data = {
  286. .hw_id = 1,
  287. .pool_size = PAGE_SIZE,
  288. };
  289. static struct iop_adma_platform_data iop13xx_adma_2_data = {
  290. .hw_id = 2,
  291. .pool_size = PAGE_SIZE,
  292. };
  293. /* The ids are fixed up later in iop13xx_platform_init */
  294. static struct platform_device iop13xx_adma_0_channel = {
  295. .name = "iop-adma",
  296. .id = 0,
  297. .num_resources = 4,
  298. .resource = iop13xx_adma_0_resources,
  299. .dev = {
  300. .dma_mask = &iop13xx_adma_dmamask,
  301. .coherent_dma_mask = DMA_BIT_MASK(64),
  302. .platform_data = (void *) &iop13xx_adma_0_data,
  303. },
  304. };
  305. static struct platform_device iop13xx_adma_1_channel = {
  306. .name = "iop-adma",
  307. .id = 0,
  308. .num_resources = 4,
  309. .resource = iop13xx_adma_1_resources,
  310. .dev = {
  311. .dma_mask = &iop13xx_adma_dmamask,
  312. .coherent_dma_mask = DMA_BIT_MASK(64),
  313. .platform_data = (void *) &iop13xx_adma_1_data,
  314. },
  315. };
  316. static struct platform_device iop13xx_adma_2_channel = {
  317. .name = "iop-adma",
  318. .id = 0,
  319. .num_resources = 4,
  320. .resource = iop13xx_adma_2_resources,
  321. .dev = {
  322. .dma_mask = &iop13xx_adma_dmamask,
  323. .coherent_dma_mask = DMA_BIT_MASK(64),
  324. .platform_data = (void *) &iop13xx_adma_2_data,
  325. },
  326. };
  327. void __init iop13xx_map_io(void)
  328. {
  329. /* Initialize the Static Page Table maps */
  330. iotable_init(iop13xx_std_desc, ARRAY_SIZE(iop13xx_std_desc));
  331. }
  332. static int init_uart;
  333. static int init_i2c;
  334. static int init_adma;
  335. void __init iop13xx_platform_init(void)
  336. {
  337. int i;
  338. u32 uart_idx, i2c_idx, adma_idx, plat_idx;
  339. struct platform_device *iop13xx_devices[IQ81340_MAX_PLAT_DEVICES];
  340. /* set the bases so we can read the device id */
  341. iop13xx_set_atu_mmr_bases();
  342. memset(iop13xx_devices, 0, sizeof(iop13xx_devices));
  343. if (init_uart == IOP13XX_INIT_UART_DEFAULT) {
  344. switch (iop13xx_dev_id()) {
  345. /* enable both uarts on iop341 */
  346. case 0x3380:
  347. case 0x3384:
  348. case 0x3388:
  349. case 0x338c:
  350. init_uart |= IOP13XX_INIT_UART_0;
  351. init_uart |= IOP13XX_INIT_UART_1;
  352. break;
  353. /* only enable uart 1 */
  354. default:
  355. init_uart |= IOP13XX_INIT_UART_1;
  356. }
  357. }
  358. if (init_i2c == IOP13XX_INIT_I2C_DEFAULT) {
  359. switch (iop13xx_dev_id()) {
  360. /* enable all i2c units on iop341 and iop342 */
  361. case 0x3380:
  362. case 0x3384:
  363. case 0x3388:
  364. case 0x338c:
  365. case 0x3382:
  366. case 0x3386:
  367. case 0x338a:
  368. case 0x338e:
  369. init_i2c |= IOP13XX_INIT_I2C_0;
  370. init_i2c |= IOP13XX_INIT_I2C_1;
  371. init_i2c |= IOP13XX_INIT_I2C_2;
  372. break;
  373. /* only enable i2c 1 and 2 */
  374. default:
  375. init_i2c |= IOP13XX_INIT_I2C_1;
  376. init_i2c |= IOP13XX_INIT_I2C_2;
  377. }
  378. }
  379. if (init_adma == IOP13XX_INIT_ADMA_DEFAULT) {
  380. init_adma |= IOP13XX_INIT_ADMA_0;
  381. init_adma |= IOP13XX_INIT_ADMA_1;
  382. init_adma |= IOP13XX_INIT_ADMA_2;
  383. }
  384. plat_idx = 0;
  385. uart_idx = 0;
  386. i2c_idx = 0;
  387. /* uart 1 (if enabled) is ttyS0 */
  388. if (init_uart & IOP13XX_INIT_UART_1) {
  389. PRINTK("Adding uart1 to platform device list\n");
  390. iop13xx_uart1.id = uart_idx++;
  391. iop13xx_devices[plat_idx++] = &iop13xx_uart1;
  392. }
  393. if (init_uart & IOP13XX_INIT_UART_0) {
  394. PRINTK("Adding uart0 to platform device list\n");
  395. iop13xx_uart0.id = uart_idx++;
  396. iop13xx_devices[plat_idx++] = &iop13xx_uart0;
  397. }
  398. for(i = 0; i < IQ81340_NUM_I2C; i++) {
  399. if ((init_i2c & (1 << i)) && IOP13XX_SETUP_DEBUG)
  400. printk("Adding i2c%d to platform device list\n", i);
  401. switch(init_i2c & (1 << i)) {
  402. case IOP13XX_INIT_I2C_0:
  403. iop13xx_i2c_0_controller.id = i2c_idx++;
  404. iop13xx_devices[plat_idx++] =
  405. &iop13xx_i2c_0_controller;
  406. break;
  407. case IOP13XX_INIT_I2C_1:
  408. iop13xx_i2c_1_controller.id = i2c_idx++;
  409. iop13xx_devices[plat_idx++] =
  410. &iop13xx_i2c_1_controller;
  411. break;
  412. case IOP13XX_INIT_I2C_2:
  413. iop13xx_i2c_2_controller.id = i2c_idx++;
  414. iop13xx_devices[plat_idx++] =
  415. &iop13xx_i2c_2_controller;
  416. break;
  417. }
  418. }
  419. /* initialize adma channel ids and capabilities */
  420. adma_idx = 0;
  421. for (i = 0; i < IQ81340_NUM_ADMA; i++) {
  422. struct iop_adma_platform_data *plat_data;
  423. if ((init_adma & (1 << i)) && IOP13XX_SETUP_DEBUG)
  424. printk(KERN_INFO
  425. "Adding adma%d to platform device list\n", i);
  426. switch (init_adma & (1 << i)) {
  427. case IOP13XX_INIT_ADMA_0:
  428. iop13xx_adma_0_channel.id = adma_idx++;
  429. iop13xx_devices[plat_idx++] = &iop13xx_adma_0_channel;
  430. plat_data = &iop13xx_adma_0_data;
  431. dma_cap_set(DMA_MEMCPY, plat_data->cap_mask);
  432. dma_cap_set(DMA_XOR, plat_data->cap_mask);
  433. dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask);
  434. dma_cap_set(DMA_MEMSET, plat_data->cap_mask);
  435. dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask);
  436. break;
  437. case IOP13XX_INIT_ADMA_1:
  438. iop13xx_adma_1_channel.id = adma_idx++;
  439. iop13xx_devices[plat_idx++] = &iop13xx_adma_1_channel;
  440. plat_data = &iop13xx_adma_1_data;
  441. dma_cap_set(DMA_MEMCPY, plat_data->cap_mask);
  442. dma_cap_set(DMA_XOR, plat_data->cap_mask);
  443. dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask);
  444. dma_cap_set(DMA_MEMSET, plat_data->cap_mask);
  445. dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask);
  446. break;
  447. case IOP13XX_INIT_ADMA_2:
  448. iop13xx_adma_2_channel.id = adma_idx++;
  449. iop13xx_devices[plat_idx++] = &iop13xx_adma_2_channel;
  450. plat_data = &iop13xx_adma_2_data;
  451. dma_cap_set(DMA_MEMCPY, plat_data->cap_mask);
  452. dma_cap_set(DMA_XOR, plat_data->cap_mask);
  453. dma_cap_set(DMA_XOR_VAL, plat_data->cap_mask);
  454. dma_cap_set(DMA_MEMSET, plat_data->cap_mask);
  455. dma_cap_set(DMA_INTERRUPT, plat_data->cap_mask);
  456. dma_cap_set(DMA_PQ, plat_data->cap_mask);
  457. dma_cap_set(DMA_PQ_VAL, plat_data->cap_mask);
  458. break;
  459. }
  460. }
  461. #ifdef CONFIG_MTD_PHYSMAP
  462. iq8134x_flash_resource.end = iq8134x_flash_resource.start +
  463. iq8134x_probe_flash_size() - 1;
  464. if (iq8134x_flash_resource.end > iq8134x_flash_resource.start)
  465. iop13xx_devices[plat_idx++] = &iq8134x_flash;
  466. else
  467. printk(KERN_ERR "%s: Failed to probe flash size\n", __func__);
  468. #endif
  469. platform_add_devices(iop13xx_devices, plat_idx);
  470. }
  471. static int __init iop13xx_init_uart_setup(char *str)
  472. {
  473. if (str) {
  474. while (*str != '\0') {
  475. switch(*str) {
  476. case '0':
  477. init_uart |= IOP13XX_INIT_UART_0;
  478. break;
  479. case '1':
  480. init_uart |= IOP13XX_INIT_UART_1;
  481. break;
  482. case ',':
  483. case '=':
  484. break;
  485. default:
  486. PRINTK("\"iop13xx_init_uart\" malformed"
  487. " at character: \'%c\'", *str);
  488. *(str + 1) = '\0';
  489. init_uart = IOP13XX_INIT_UART_DEFAULT;
  490. }
  491. str++;
  492. }
  493. }
  494. return 1;
  495. }
  496. static int __init iop13xx_init_i2c_setup(char *str)
  497. {
  498. if (str) {
  499. while (*str != '\0') {
  500. switch(*str) {
  501. case '0':
  502. init_i2c |= IOP13XX_INIT_I2C_0;
  503. break;
  504. case '1':
  505. init_i2c |= IOP13XX_INIT_I2C_1;
  506. break;
  507. case '2':
  508. init_i2c |= IOP13XX_INIT_I2C_2;
  509. break;
  510. case ',':
  511. case '=':
  512. break;
  513. default:
  514. PRINTK("\"iop13xx_init_i2c\" malformed"
  515. " at character: \'%c\'", *str);
  516. *(str + 1) = '\0';
  517. init_i2c = IOP13XX_INIT_I2C_DEFAULT;
  518. }
  519. str++;
  520. }
  521. }
  522. return 1;
  523. }
  524. static int __init iop13xx_init_adma_setup(char *str)
  525. {
  526. if (str) {
  527. while (*str != '\0') {
  528. switch (*str) {
  529. case '0':
  530. init_adma |= IOP13XX_INIT_ADMA_0;
  531. break;
  532. case '1':
  533. init_adma |= IOP13XX_INIT_ADMA_1;
  534. break;
  535. case '2':
  536. init_adma |= IOP13XX_INIT_ADMA_2;
  537. break;
  538. case ',':
  539. case '=':
  540. break;
  541. default:
  542. PRINTK("\"iop13xx_init_adma\" malformed"
  543. " at character: \'%c\'", *str);
  544. *(str + 1) = '\0';
  545. init_adma = IOP13XX_INIT_ADMA_DEFAULT;
  546. }
  547. str++;
  548. }
  549. }
  550. return 1;
  551. }
  552. __setup("iop13xx_init_adma", iop13xx_init_adma_setup);
  553. __setup("iop13xx_init_uart", iop13xx_init_uart_setup);
  554. __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup);