11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/arch/arm/mach-pxa/generic.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Author: Nicolas Pitre 51da177e4SLinus Torvalds * Created: Jun 15, 2001 61da177e4SLinus Torvalds * Copyright: MontaVista Software Inc. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Code common to all PXA machines. 91da177e4SLinus Torvalds * 101da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 111da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as 121da177e4SLinus Torvalds * published by the Free Software Foundation. 131da177e4SLinus Torvalds * 141da177e4SLinus Torvalds * Since this file should be linked before any other machine specific file, 151da177e4SLinus Torvalds * the __initcall() here will be executed first. This serves as default 161da177e4SLinus Torvalds * initialization stuff for PXA machines which can be overridden later if 171da177e4SLinus Torvalds * need be. 181da177e4SLinus Torvalds */ 191da177e4SLinus Torvalds #include <linux/module.h> 201da177e4SLinus Torvalds #include <linux/kernel.h> 211da177e4SLinus Torvalds #include <linux/init.h> 221da177e4SLinus Torvalds #include <linux/delay.h> 23d052d1beSRussell King #include <linux/platform_device.h> 241da177e4SLinus Torvalds #include <linux/ioport.h> 251da177e4SLinus Torvalds #include <linux/pm.h> 264e57b681STim Schmielau #include <linux/string.h> 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds #include <asm/hardware.h> 291da177e4SLinus Torvalds #include <asm/irq.h> 301da177e4SLinus Torvalds #include <asm/system.h> 311da177e4SLinus Torvalds #include <asm/pgtable.h> 321da177e4SLinus Torvalds #include <asm/mach/map.h> 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds #include <asm/arch/pxa-regs.h> 353deac046SPhilipp Zabel #include <asm/arch/gpio.h> 361da177e4SLinus Torvalds #include <asm/arch/udc.h> 371da177e4SLinus Torvalds #include <asm/arch/pxafb.h> 381da177e4SLinus Torvalds #include <asm/arch/mmc.h> 396f475c01SNicolas Pitre #include <asm/arch/irda.h> 40eb9181a2SRussell King #include <asm/arch/i2c.h> 411da177e4SLinus Torvalds 4246c41e62SRussell King #include "devices.h" 431da177e4SLinus Torvalds #include "generic.h" 441da177e4SLinus Torvalds 451da177e4SLinus Torvalds /* 46*15a40333SRussell King * Get the clock frequency as reflected by CCCR and the turbo flag. 47*15a40333SRussell King * We assume these values have been applied via a fcs. 48*15a40333SRussell King * If info is not 0 we also display the current settings. 49*15a40333SRussell King */ 50*15a40333SRussell King unsigned int get_clk_frequency_khz(int info) 51*15a40333SRussell King { 52*15a40333SRussell King if (cpu_is_pxa21x() || cpu_is_pxa25x()) 53*15a40333SRussell King return pxa25x_get_clk_frequency_khz(info); 54*15a40333SRussell King else 55*15a40333SRussell King return pxa27x_get_clk_frequency_khz(info); 56*15a40333SRussell King } 57*15a40333SRussell King EXPORT_SYMBOL(get_clk_frequency_khz); 58*15a40333SRussell King 59*15a40333SRussell King /* 60*15a40333SRussell King * Return the current memory clock frequency in units of 10kHz 61*15a40333SRussell King */ 62*15a40333SRussell King unsigned int get_memclk_frequency_10khz(void) 63*15a40333SRussell King { 64*15a40333SRussell King if (cpu_is_pxa21x() || cpu_is_pxa25x()) 65*15a40333SRussell King return pxa25x_get_memclk_frequency_10khz(); 66*15a40333SRussell King else 67*15a40333SRussell King return pxa27x_get_memclk_frequency_10khz(); 68*15a40333SRussell King } 69*15a40333SRussell King EXPORT_SYMBOL(get_memclk_frequency_10khz); 70*15a40333SRussell King 71*15a40333SRussell King /* 72*15a40333SRussell King * Return the current LCD clock frequency in units of 10kHz 73*15a40333SRussell King */ 74*15a40333SRussell King unsigned int get_lcdclk_frequency_10khz(void) 75*15a40333SRussell King { 76*15a40333SRussell King if (cpu_is_pxa21x() || cpu_is_pxa25x()) 77*15a40333SRussell King return pxa25x_get_memclk_frequency_10khz(); 78*15a40333SRussell King else 79*15a40333SRussell King return pxa27x_get_lcdclk_frequency_10khz(); 80*15a40333SRussell King } 81*15a40333SRussell King EXPORT_SYMBOL(get_lcdclk_frequency_10khz); 82*15a40333SRussell King 83*15a40333SRussell King /* 841da177e4SLinus Torvalds * Handy function to set GPIO alternate functions 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds 873deac046SPhilipp Zabel int pxa_gpio_mode(int gpio_mode) 881da177e4SLinus Torvalds { 891da177e4SLinus Torvalds unsigned long flags; 901da177e4SLinus Torvalds int gpio = gpio_mode & GPIO_MD_MASK_NR; 911da177e4SLinus Torvalds int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8; 921da177e4SLinus Torvalds int gafr; 931da177e4SLinus Torvalds 943deac046SPhilipp Zabel if (gpio > PXA_LAST_GPIO) 953deac046SPhilipp Zabel return -EINVAL; 963deac046SPhilipp Zabel 971da177e4SLinus Torvalds local_irq_save(flags); 981da177e4SLinus Torvalds if (gpio_mode & GPIO_DFLT_LOW) 991da177e4SLinus Torvalds GPCR(gpio) = GPIO_bit(gpio); 1001da177e4SLinus Torvalds else if (gpio_mode & GPIO_DFLT_HIGH) 1011da177e4SLinus Torvalds GPSR(gpio) = GPIO_bit(gpio); 1021da177e4SLinus Torvalds if (gpio_mode & GPIO_MD_MASK_DIR) 1031da177e4SLinus Torvalds GPDR(gpio) |= GPIO_bit(gpio); 1041da177e4SLinus Torvalds else 1051da177e4SLinus Torvalds GPDR(gpio) &= ~GPIO_bit(gpio); 1061da177e4SLinus Torvalds gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2)); 1071da177e4SLinus Torvalds GAFR(gpio) = gafr | (fn << (((gpio) & 0xf)*2)); 1081da177e4SLinus Torvalds local_irq_restore(flags); 1093deac046SPhilipp Zabel 1103deac046SPhilipp Zabel return 0; 1111da177e4SLinus Torvalds } 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds EXPORT_SYMBOL(pxa_gpio_mode); 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds /* 1163deac046SPhilipp Zabel * Return GPIO level 1173deac046SPhilipp Zabel */ 1183deac046SPhilipp Zabel int pxa_gpio_get_value(unsigned gpio) 1193deac046SPhilipp Zabel { 1203deac046SPhilipp Zabel return __gpio_get_value(gpio); 1213deac046SPhilipp Zabel } 1223deac046SPhilipp Zabel 1233deac046SPhilipp Zabel EXPORT_SYMBOL(pxa_gpio_get_value); 1243deac046SPhilipp Zabel 1253deac046SPhilipp Zabel /* 1263deac046SPhilipp Zabel * Set output GPIO level 1273deac046SPhilipp Zabel */ 1283deac046SPhilipp Zabel void pxa_gpio_set_value(unsigned gpio, int value) 1293deac046SPhilipp Zabel { 1303deac046SPhilipp Zabel __gpio_set_value(gpio, value); 1313deac046SPhilipp Zabel } 1323deac046SPhilipp Zabel 1333deac046SPhilipp Zabel EXPORT_SYMBOL(pxa_gpio_set_value); 1343deac046SPhilipp Zabel 1353deac046SPhilipp Zabel /* 1361da177e4SLinus Torvalds * Routine to safely enable or disable a clock in the CKEN 1371da177e4SLinus Torvalds */ 1381da177e4SLinus Torvalds void pxa_set_cken(int clock, int enable) 1391da177e4SLinus Torvalds { 1401da177e4SLinus Torvalds unsigned long flags; 1411da177e4SLinus Torvalds local_irq_save(flags); 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds if (enable) 1447053acbdSEric Miao CKEN |= (1 << clock); 1451da177e4SLinus Torvalds else 1467053acbdSEric Miao CKEN &= ~(1 << clock); 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds local_irq_restore(flags); 1491da177e4SLinus Torvalds } 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds EXPORT_SYMBOL(pxa_set_cken); 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds /* 1541da177e4SLinus Torvalds * Intel PXA2xx internal register mapping. 1551da177e4SLinus Torvalds * 1561da177e4SLinus Torvalds * Note 1: not all PXA2xx variants implement all those addresses. 1571da177e4SLinus Torvalds * 1581da177e4SLinus Torvalds * Note 2: virtual 0xfffe0000-0xffffffff is reserved for the vector table 1591da177e4SLinus Torvalds * and cache flush area. 1601da177e4SLinus Torvalds */ 1611da177e4SLinus Torvalds static struct map_desc standard_io_desc[] __initdata = { 1626f9182ebSDeepak Saxena { /* Devs */ 1636f9182ebSDeepak Saxena .virtual = 0xf2000000, 1646f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x40000000), 1656f9182ebSDeepak Saxena .length = 0x02000000, 1666f9182ebSDeepak Saxena .type = MT_DEVICE 1676f9182ebSDeepak Saxena }, { /* LCD */ 1686f9182ebSDeepak Saxena .virtual = 0xf4000000, 1696f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x44000000), 1706f9182ebSDeepak Saxena .length = 0x00100000, 1716f9182ebSDeepak Saxena .type = MT_DEVICE 1726f9182ebSDeepak Saxena }, { /* Mem Ctl */ 1736f9182ebSDeepak Saxena .virtual = 0xf6000000, 1746f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x48000000), 1756f9182ebSDeepak Saxena .length = 0x00100000, 1766f9182ebSDeepak Saxena .type = MT_DEVICE 1776f9182ebSDeepak Saxena }, { /* USB host */ 1786f9182ebSDeepak Saxena .virtual = 0xf8000000, 1796f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x4c000000), 1806f9182ebSDeepak Saxena .length = 0x00100000, 1816f9182ebSDeepak Saxena .type = MT_DEVICE 1826f9182ebSDeepak Saxena }, { /* Camera */ 1836f9182ebSDeepak Saxena .virtual = 0xfa000000, 1846f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x50000000), 1856f9182ebSDeepak Saxena .length = 0x00100000, 1866f9182ebSDeepak Saxena .type = MT_DEVICE 1876f9182ebSDeepak Saxena }, { /* IMem ctl */ 1886f9182ebSDeepak Saxena .virtual = 0xfe000000, 1896f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x58000000), 1906f9182ebSDeepak Saxena .length = 0x00100000, 1916f9182ebSDeepak Saxena .type = MT_DEVICE 1926f9182ebSDeepak Saxena }, { /* UNCACHED_PHYS_0 */ 1936f9182ebSDeepak Saxena .virtual = 0xff000000, 1946f9182ebSDeepak Saxena .pfn = __phys_to_pfn(0x00000000), 1956f9182ebSDeepak Saxena .length = 0x00100000, 1966f9182ebSDeepak Saxena .type = MT_DEVICE 1976f9182ebSDeepak Saxena } 1981da177e4SLinus Torvalds }; 1991da177e4SLinus Torvalds 2001da177e4SLinus Torvalds void __init pxa_map_io(void) 2011da177e4SLinus Torvalds { 2021da177e4SLinus Torvalds iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc)); 2031da177e4SLinus Torvalds get_clk_frequency_khz(1); 2041da177e4SLinus Torvalds } 2051da177e4SLinus Torvalds 2061da177e4SLinus Torvalds 2071da177e4SLinus Torvalds static struct resource pxamci_resources[] = { 2081da177e4SLinus Torvalds [0] = { 2091da177e4SLinus Torvalds .start = 0x41100000, 2101da177e4SLinus Torvalds .end = 0x41100fff, 2111da177e4SLinus Torvalds .flags = IORESOURCE_MEM, 2121da177e4SLinus Torvalds }, 2131da177e4SLinus Torvalds [1] = { 2141da177e4SLinus Torvalds .start = IRQ_MMC, 2151da177e4SLinus Torvalds .end = IRQ_MMC, 2161da177e4SLinus Torvalds .flags = IORESOURCE_IRQ, 2171da177e4SLinus Torvalds }, 2181da177e4SLinus Torvalds }; 2191da177e4SLinus Torvalds 2201da177e4SLinus Torvalds static u64 pxamci_dmamask = 0xffffffffUL; 2211da177e4SLinus Torvalds 222e09d02e1SEric Miao struct platform_device pxa_device_mci = { 2231da177e4SLinus Torvalds .name = "pxa2xx-mci", 2241da177e4SLinus Torvalds .id = -1, 2251da177e4SLinus Torvalds .dev = { 2261da177e4SLinus Torvalds .dma_mask = &pxamci_dmamask, 2271da177e4SLinus Torvalds .coherent_dma_mask = 0xffffffff, 2281da177e4SLinus Torvalds }, 2291da177e4SLinus Torvalds .num_resources = ARRAY_SIZE(pxamci_resources), 2301da177e4SLinus Torvalds .resource = pxamci_resources, 2311da177e4SLinus Torvalds }; 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds void __init pxa_set_mci_info(struct pxamci_platform_data *info) 2341da177e4SLinus Torvalds { 235e09d02e1SEric Miao pxa_device_mci.dev.platform_data = info; 2361da177e4SLinus Torvalds } 2371da177e4SLinus Torvalds 2381da177e4SLinus Torvalds 2391da177e4SLinus Torvalds static struct pxa2xx_udc_mach_info pxa_udc_info; 2401da177e4SLinus Torvalds 2411da177e4SLinus Torvalds void __init pxa_set_udc_info(struct pxa2xx_udc_mach_info *info) 2421da177e4SLinus Torvalds { 2431da177e4SLinus Torvalds memcpy(&pxa_udc_info, info, sizeof *info); 2441da177e4SLinus Torvalds } 2451da177e4SLinus Torvalds 2461da177e4SLinus Torvalds static struct resource pxa2xx_udc_resources[] = { 2471da177e4SLinus Torvalds [0] = { 2481da177e4SLinus Torvalds .start = 0x40600000, 2491da177e4SLinus Torvalds .end = 0x4060ffff, 2501da177e4SLinus Torvalds .flags = IORESOURCE_MEM, 2511da177e4SLinus Torvalds }, 2521da177e4SLinus Torvalds [1] = { 2531da177e4SLinus Torvalds .start = IRQ_USB, 2541da177e4SLinus Torvalds .end = IRQ_USB, 2551da177e4SLinus Torvalds .flags = IORESOURCE_IRQ, 2561da177e4SLinus Torvalds }, 2571da177e4SLinus Torvalds }; 2581da177e4SLinus Torvalds 2591da177e4SLinus Torvalds static u64 udc_dma_mask = ~(u32)0; 2601da177e4SLinus Torvalds 261e09d02e1SEric Miao struct platform_device pxa_device_udc = { 2621da177e4SLinus Torvalds .name = "pxa2xx-udc", 2631da177e4SLinus Torvalds .id = -1, 2641da177e4SLinus Torvalds .resource = pxa2xx_udc_resources, 2651da177e4SLinus Torvalds .num_resources = ARRAY_SIZE(pxa2xx_udc_resources), 2661da177e4SLinus Torvalds .dev = { 2671da177e4SLinus Torvalds .platform_data = &pxa_udc_info, 2681da177e4SLinus Torvalds .dma_mask = &udc_dma_mask, 2691da177e4SLinus Torvalds } 2701da177e4SLinus Torvalds }; 2711da177e4SLinus Torvalds 2721da177e4SLinus Torvalds static struct resource pxafb_resources[] = { 2731da177e4SLinus Torvalds [0] = { 2741da177e4SLinus Torvalds .start = 0x44000000, 2751da177e4SLinus Torvalds .end = 0x4400ffff, 2761da177e4SLinus Torvalds .flags = IORESOURCE_MEM, 2771da177e4SLinus Torvalds }, 2781da177e4SLinus Torvalds [1] = { 2791da177e4SLinus Torvalds .start = IRQ_LCD, 2801da177e4SLinus Torvalds .end = IRQ_LCD, 2811da177e4SLinus Torvalds .flags = IORESOURCE_IRQ, 2821da177e4SLinus Torvalds }, 2831da177e4SLinus Torvalds }; 2841da177e4SLinus Torvalds 2851da177e4SLinus Torvalds static u64 fb_dma_mask = ~(u64)0; 2861da177e4SLinus Torvalds 287e09d02e1SEric Miao struct platform_device pxa_device_fb = { 2881da177e4SLinus Torvalds .name = "pxa2xx-fb", 2891da177e4SLinus Torvalds .id = -1, 2901da177e4SLinus Torvalds .dev = { 2911da177e4SLinus Torvalds .dma_mask = &fb_dma_mask, 2921da177e4SLinus Torvalds .coherent_dma_mask = 0xffffffff, 2931da177e4SLinus Torvalds }, 2941da177e4SLinus Torvalds .num_resources = ARRAY_SIZE(pxafb_resources), 2951da177e4SLinus Torvalds .resource = pxafb_resources, 2961da177e4SLinus Torvalds }; 2971da177e4SLinus Torvalds 298d14b272bSRichard Purdie void __init set_pxa_fb_info(struct pxafb_mach_info *info) 299d14b272bSRichard Purdie { 300e09d02e1SEric Miao pxa_device_fb.dev.platform_data = info; 301d14b272bSRichard Purdie } 302d14b272bSRichard Purdie 303cb38c569SRichard Purdie void __init set_pxa_fb_parent(struct device *parent_dev) 304cb38c569SRichard Purdie { 305e09d02e1SEric Miao pxa_device_fb.dev.parent = parent_dev; 306cb38c569SRichard Purdie } 307cb38c569SRichard Purdie 308e259a3aeSRussell King static struct resource pxa_resource_ffuart[] = { 309e259a3aeSRussell King { 310e259a3aeSRussell King .start = __PREG(FFUART), 311e259a3aeSRussell King .end = __PREG(FFUART) + 35, 312e259a3aeSRussell King .flags = IORESOURCE_MEM, 313e259a3aeSRussell King }, { 314e259a3aeSRussell King .start = IRQ_FFUART, 315e259a3aeSRussell King .end = IRQ_FFUART, 316e259a3aeSRussell King .flags = IORESOURCE_IRQ, 317e259a3aeSRussell King } 318e259a3aeSRussell King }; 319e259a3aeSRussell King 320e09d02e1SEric Miao struct platform_device pxa_device_ffuart= { 3211da177e4SLinus Torvalds .name = "pxa2xx-uart", 3221da177e4SLinus Torvalds .id = 0, 323e259a3aeSRussell King .resource = pxa_resource_ffuart, 324e259a3aeSRussell King .num_resources = ARRAY_SIZE(pxa_resource_ffuart), 3251da177e4SLinus Torvalds }; 326e259a3aeSRussell King 327e259a3aeSRussell King static struct resource pxa_resource_btuart[] = { 328e259a3aeSRussell King { 329e259a3aeSRussell King .start = __PREG(BTUART), 330e259a3aeSRussell King .end = __PREG(BTUART) + 35, 331e259a3aeSRussell King .flags = IORESOURCE_MEM, 332e259a3aeSRussell King }, { 333e259a3aeSRussell King .start = IRQ_BTUART, 334e259a3aeSRussell King .end = IRQ_BTUART, 335e259a3aeSRussell King .flags = IORESOURCE_IRQ, 336e259a3aeSRussell King } 337e259a3aeSRussell King }; 338e259a3aeSRussell King 339e09d02e1SEric Miao struct platform_device pxa_device_btuart = { 3401da177e4SLinus Torvalds .name = "pxa2xx-uart", 3411da177e4SLinus Torvalds .id = 1, 342e259a3aeSRussell King .resource = pxa_resource_btuart, 343e259a3aeSRussell King .num_resources = ARRAY_SIZE(pxa_resource_btuart), 3441da177e4SLinus Torvalds }; 345e259a3aeSRussell King 346e259a3aeSRussell King static struct resource pxa_resource_stuart[] = { 347e259a3aeSRussell King { 348e259a3aeSRussell King .start = __PREG(STUART), 349e259a3aeSRussell King .end = __PREG(STUART) + 35, 350e259a3aeSRussell King .flags = IORESOURCE_MEM, 351e259a3aeSRussell King }, { 352e259a3aeSRussell King .start = IRQ_STUART, 353e259a3aeSRussell King .end = IRQ_STUART, 354e259a3aeSRussell King .flags = IORESOURCE_IRQ, 355e259a3aeSRussell King } 356e259a3aeSRussell King }; 357e259a3aeSRussell King 358e09d02e1SEric Miao struct platform_device pxa_device_stuart = { 3591da177e4SLinus Torvalds .name = "pxa2xx-uart", 3601da177e4SLinus Torvalds .id = 2, 361e259a3aeSRussell King .resource = pxa_resource_stuart, 362e259a3aeSRussell King .num_resources = ARRAY_SIZE(pxa_resource_stuart), 3631da177e4SLinus Torvalds }; 364e259a3aeSRussell King 365e259a3aeSRussell King static struct resource pxa_resource_hwuart[] = { 366e259a3aeSRussell King { 367e259a3aeSRussell King .start = __PREG(HWUART), 368e259a3aeSRussell King .end = __PREG(HWUART) + 47, 369e259a3aeSRussell King .flags = IORESOURCE_MEM, 370e259a3aeSRussell King }, { 371e259a3aeSRussell King .start = IRQ_HWUART, 372e259a3aeSRussell King .end = IRQ_HWUART, 373e259a3aeSRussell King .flags = IORESOURCE_IRQ, 374e259a3aeSRussell King } 375e259a3aeSRussell King }; 376e259a3aeSRussell King 377e09d02e1SEric Miao struct platform_device pxa_device_hwuart = { 378d9e29649SMatt Reimer .name = "pxa2xx-uart", 379d9e29649SMatt Reimer .id = 3, 380e259a3aeSRussell King .resource = pxa_resource_hwuart, 381e259a3aeSRussell King .num_resources = ARRAY_SIZE(pxa_resource_hwuart), 382d9e29649SMatt Reimer }; 3831da177e4SLinus Torvalds 38434f3231fSRussell King static struct resource pxai2c_resources[] = { 385bb9bffcbSRussell King { 386bb9bffcbSRussell King .start = 0x40301680, 387bb9bffcbSRussell King .end = 0x403016a3, 388bb9bffcbSRussell King .flags = IORESOURCE_MEM, 389bb9bffcbSRussell King }, { 390bb9bffcbSRussell King .start = IRQ_I2C, 391bb9bffcbSRussell King .end = IRQ_I2C, 392bb9bffcbSRussell King .flags = IORESOURCE_IRQ, 393bb9bffcbSRussell King }, 394bb9bffcbSRussell King }; 395bb9bffcbSRussell King 396e09d02e1SEric Miao struct platform_device pxa_device_i2c = { 397bb9bffcbSRussell King .name = "pxa2xx-i2c", 398bb9bffcbSRussell King .id = 0, 39934f3231fSRussell King .resource = pxai2c_resources, 40034f3231fSRussell King .num_resources = ARRAY_SIZE(pxai2c_resources), 401bb9bffcbSRussell King }; 402bb9bffcbSRussell King 403bb9bffcbSRussell King void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info) 404bb9bffcbSRussell King { 405e09d02e1SEric Miao pxa_device_i2c.dev.platform_data = info; 406bb9bffcbSRussell King } 407bb9bffcbSRussell King 40834f3231fSRussell King static struct resource pxai2s_resources[] = { 409b2640b42SMatt Reimer { 410b2640b42SMatt Reimer .start = 0x40400000, 411b2640b42SMatt Reimer .end = 0x40400083, 412b2640b42SMatt Reimer .flags = IORESOURCE_MEM, 413b2640b42SMatt Reimer }, { 414b2640b42SMatt Reimer .start = IRQ_I2S, 415b2640b42SMatt Reimer .end = IRQ_I2S, 416b2640b42SMatt Reimer .flags = IORESOURCE_IRQ, 417b2640b42SMatt Reimer }, 418b2640b42SMatt Reimer }; 419b2640b42SMatt Reimer 420e09d02e1SEric Miao struct platform_device pxa_device_i2s = { 421b2640b42SMatt Reimer .name = "pxa2xx-i2s", 422b2640b42SMatt Reimer .id = -1, 42334f3231fSRussell King .resource = pxai2s_resources, 42434f3231fSRussell King .num_resources = ARRAY_SIZE(pxai2s_resources), 425b2640b42SMatt Reimer }; 426b2640b42SMatt Reimer 4276f475c01SNicolas Pitre static u64 pxaficp_dmamask = ~(u32)0; 4286f475c01SNicolas Pitre 429e09d02e1SEric Miao struct platform_device pxa_device_ficp = { 4306f475c01SNicolas Pitre .name = "pxa2xx-ir", 4316f475c01SNicolas Pitre .id = -1, 4326f475c01SNicolas Pitre .dev = { 4336f475c01SNicolas Pitre .dma_mask = &pxaficp_dmamask, 4346f475c01SNicolas Pitre .coherent_dma_mask = 0xffffffff, 4356f475c01SNicolas Pitre }, 4366f475c01SNicolas Pitre }; 4376f475c01SNicolas Pitre 4386f475c01SNicolas Pitre void __init pxa_set_ficp_info(struct pxaficp_platform_data *info) 4396f475c01SNicolas Pitre { 440e09d02e1SEric Miao pxa_device_ficp.dev.platform_data = info; 4416f475c01SNicolas Pitre } 4426f475c01SNicolas Pitre 443e09d02e1SEric Miao struct platform_device pxa_device_rtc = { 444e842f1c8SRichard Purdie .name = "sa1100-rtc", 445e842f1c8SRichard Purdie .id = -1, 446e842f1c8SRichard Purdie }; 447