11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/arch/arm/mach-sa1100/generic.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author: Nicolas Pitre 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Code common to all SA11x0 machines. 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 122f8163baada3dbd0ce891c35bc59ae46e773487aRussell King#include <linux/gpio.h> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 177931d92f4f38100061cf6b8a9737967057f94871Russell King#include <linux/dma-mapping.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pm.h> 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/cpufreq.h> 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h> 21d052d1beff706920e82c5d55006b08e256b5df09Russell King#include <linux/platform_device.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 23e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King#include <video/sa1100fb.h> 24e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/div64.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/map.h> 2714e66f767f5e8d023e098b475dc24ddc9a5dbdfdRussell King#include <asm/mach/flash.h> 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h> 299f97da78bf018206fb623cd351d454af2f105fe0David Howells#include <asm/system_misc.h> 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 31f314f33be77d6a48ae19748e3dc4a6657042b525Rob Herring#include <mach/hardware.h> 32f314f33be77d6a48ae19748e3dc4a6657042b525Rob Herring#include <mach/irqs.h> 33f314f33be77d6a48ae19748e3dc4a6657042b525Rob Herring 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "generic.h" 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3604fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miaounsigned int reset_status; 3704fef228fb00dd79475a2313f4ba73b4fbfe2faaEric MiaoEXPORT_SYMBOL(reset_status); 3804fef228fb00dd79475a2313f4ba73b4fbfe2faaEric Miao 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NR_FREQS 16 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This table is setup for a 3.6864MHz Crystal. 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const unsigned short cclk_frequency_100khz[NR_FREQS] = { 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 590, /* 59.0 MHz */ 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 737, /* 73.7 MHz */ 47bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson 885, /* 88.5 MHz */ 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1032, /* 103.2 MHz */ 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1180, /* 118.0 MHz */ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1327, /* 132.7 MHz */ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1475, /* 147.5 MHz */ 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1622, /* 162.2 MHz */ 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1769, /* 176.9 MHz */ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1917, /* 191.7 MHz */ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2064, /* 206.4 MHz */ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2212, /* 221.2 MHz */ 57bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson 2359, /* 235.9 MHz */ 58bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson 2507, /* 250.7 MHz */ 59bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson 2654, /* 265.4 MHz */ 60bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson 2802 /* 280.2 MHz */ 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* rounds up(!) */ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned int sa11x0_freq_to_ppcr(unsigned int khz) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds khz /= 100; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < NR_FREQS; i++) 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cclk_frequency_100khz[i] >= khz) 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return i; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned int sa11x0_ppcr_to_freq(unsigned int idx) 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int freq = 0; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (idx < NR_FREQS) 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds freq = cclk_frequency_100khz[idx] * 100; 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return freq; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* make sure that only the "userspace" governor is run -- anything else wouldn't make sense on 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * this platform, anyway. 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint sa11x0_verify_speed(struct cpufreq_policy *policy) 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int tmp; 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (policy->cpu) 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, policy->cpuinfo.max_freq); 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* make sure that at least one frequency is within the policy */ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tmp = cclk_frequency_100khz[sa11x0_freq_to_ppcr(policy->min)] * 100; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (tmp > policy->max) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds policy->max = tmp; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, policy->cpuinfo.max_freq); 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned int sa11x0_getspeed(unsigned int cpu) 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (cpu) 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cclk_frequency_100khz[PPCR & 0xf] * 100; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default power-off for SA1100 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void sa1100_power_off(void) 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mdelay(100); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_disable(); 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* disable internal oscillator, float CS lines */ 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS); 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* enable wake-up on GPIO0 (Assabet...) */ 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PWER = GFER = GRER = 1; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * set scratchpad to zero, just in case it is used as a 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * restart address by the bootloader. 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PSPR = 0; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* enter sleep mode */ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PMCR = PMCR_SF; 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 134d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell Kingvoid sa11x0_restart(char mode, const char *cmd) 135d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King{ 136d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King if (mode == 's') { 137d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King /* Jump into ROM at address 0 */ 138d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King soft_restart(0); 139d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King } else { 140d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King /* Use on-chip reset capability */ 141d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King RSRR = RSRR_SWR; 142d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King } 143d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King} 144d9ca5839fd4b0c820c19401b72962a1d099cb99eRussell King 1457a5b4e16c880f8350d255dc188f81622905618c1Russell Kingstatic void sa11x0_register_device(struct platform_device *dev, void *data) 1467a5b4e16c880f8350d255dc188f81622905618c1Russell King{ 1477a5b4e16c880f8350d255dc188f81622905618c1Russell King int err; 1487a5b4e16c880f8350d255dc188f81622905618c1Russell King dev->dev.platform_data = data; 1497a5b4e16c880f8350d255dc188f81622905618c1Russell King err = platform_device_register(dev); 1507a5b4e16c880f8350d255dc188f81622905618c1Russell King if (err) 1517a5b4e16c880f8350d255dc188f81622905618c1Russell King printk(KERN_ERR "Unable to register device %s: %d\n", 1527a5b4e16c880f8350d255dc188f81622905618c1Russell King dev->name, err); 1537a5b4e16c880f8350d255dc188f81622905618c1Russell King} 1547a5b4e16c880f8350d255dc188f81622905618c1Russell King 1557a5b4e16c880f8350d255dc188f81622905618c1Russell King 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0udc_resources[] = { 157a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(__PREG(Ser0UDCCR), SZ_64K), 158a181099e2f74dffe45487704cf0e97fd007b2628Russell King [1] = DEFINE_RES_IRQ(IRQ_Ser0UDC), 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u64 sa11x0udc_dma_mask = 0xffffffffUL; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0udc_device = { 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-udc", 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dev = { 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dma_mask = &sa11x0udc_dma_mask, 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .coherent_dma_mask = 0xffffffff, 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0udc_resources), 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0udc_resources, 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0uart1_resources[] = { 175a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(__PREG(Ser1UTCR0), SZ_64K), 176a181099e2f74dffe45487704cf0e97fd007b2628Russell King [1] = DEFINE_RES_IRQ(IRQ_Ser1UART), 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0uart1_device = { 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-uart", 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = 1, 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0uart1_resources), 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0uart1_resources, 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0uart3_resources[] = { 187a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(__PREG(Ser3UTCR0), SZ_64K), 188a181099e2f74dffe45487704cf0e97fd007b2628Russell King [1] = DEFINE_RES_IRQ(IRQ_Ser3UART), 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0uart3_device = { 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-uart", 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = 3, 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0uart3_resources), 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0uart3_resources, 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0mcp_resources[] = { 199a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(__PREG(Ser4MCCR0), SZ_64K), 2007256ecc2b7b91b4212ccc5511cb12254bdf806d0Russell King [1] = DEFINE_RES_MEM(__PREG(Ser4MCCR1), 4), 2017256ecc2b7b91b4212ccc5511cb12254bdf806d0Russell King [2] = DEFINE_RES_IRQ(IRQ_Ser4MCP), 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u64 sa11x0mcp_dma_mask = 0xffffffffUL; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0mcp_device = { 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-mcp", 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dev = { 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dma_mask = &sa11x0mcp_dma_mask, 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .coherent_dma_mask = 0xffffffff, 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0mcp_resources), 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0mcp_resources, 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 217e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell Kingvoid __init sa11x0_ppc_configure_mcp(void) 218e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King{ 219e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King /* Setup the PPC unit for the MCP */ 220e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King PPDR &= ~PPC_RXD4; 221e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; 222e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King PSDR |= PPC_RXD4; 223e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); 224e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); 225e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King} 226e36e26a8b761d1a601e284e2b5d8aff84de3b756Russell King 2277a5b4e16c880f8350d255dc188f81622905618c1Russell Kingvoid sa11x0_register_mcp(struct mcp_plat_data *data) 228323cdfc191b7c1597dc748175062c368568d6af4Russell King{ 2297a5b4e16c880f8350d255dc188f81622905618c1Russell King sa11x0_register_device(&sa11x0mcp_device, data); 230323cdfc191b7c1597dc748175062c368568d6af4Russell King} 231323cdfc191b7c1597dc748175062c368568d6af4Russell King 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0ssp_resources[] = { 233a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(0x80070000, SZ_64K), 234a181099e2f74dffe45487704cf0e97fd007b2628Russell King [1] = DEFINE_RES_IRQ(IRQ_Ser4SSP), 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic u64 sa11x0ssp_dma_mask = 0xffffffffUL; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0ssp_device = { 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-ssp", 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dev = { 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dma_mask = &sa11x0ssp_dma_mask, 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .coherent_dma_mask = 0xffffffff, 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0ssp_resources), 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0ssp_resources, 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0fb_resources[] = { 251a181099e2f74dffe45487704cf0e97fd007b2628Russell King [0] = DEFINE_RES_MEM(0xb0100000, SZ_64K), 252a181099e2f74dffe45487704cf0e97fd007b2628Russell King [1] = DEFINE_RES_IRQ(IRQ_LCD), 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0fb_device = { 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-fb", 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .dev = { 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .coherent_dma_mask = 0xffffffff, 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }, 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0fb_resources), 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0fb_resources, 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 265e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell Kingvoid sa11x0_register_lcd(struct sa1100fb_mach_info *inf) 266e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King{ 267e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King sa11x0_register_device(&sa11x0fb_device, inf); 268e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King} 269e1b7a72aeb8292502c97b43eceb01aea47ded40fRussell King 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0pcmcia_device = { 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-pcmcia", 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0mtd_device = { 276bcc8f3e01facc51b9d4f6351cd866f19eac0b5aeUwe Kleine-König .name = "sa1100-mtd", 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2807a5b4e16c880f8350d255dc188f81622905618c1Russell Kingvoid sa11x0_register_mtd(struct flash_platform_data *flash, 2817a5b4e16c880f8350d255dc188f81622905618c1Russell King struct resource *res, int nr) 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 28314e66f767f5e8d023e098b475dc24ddc9a5dbdfdRussell King flash->name = "sa1100"; 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sa11x0mtd_device.resource = res; 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sa11x0mtd_device.num_resources = nr; 2867a5b4e16c880f8350d255dc188f81622905618c1Russell King sa11x0_register_device(&sa11x0mtd_device, flash); 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct resource sa11x0ir_resources[] = { 290a181099e2f74dffe45487704cf0e97fd007b2628Russell King DEFINE_RES_MEM(__PREG(Ser2UTCR0), 0x24), 291a181099e2f74dffe45487704cf0e97fd007b2628Russell King DEFINE_RES_MEM(__PREG(Ser2HSCR0), 0x1c), 292a181099e2f74dffe45487704cf0e97fd007b2628Russell King DEFINE_RES_MEM(__PREG(Ser2HSCR2), 0x04), 293a181099e2f74dffe45487704cf0e97fd007b2628Russell King DEFINE_RES_IRQ(IRQ_Ser2ICP), 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device sa11x0ir_device = { 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "sa11x0-ir", 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id = -1, 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .num_resources = ARRAY_SIZE(sa11x0ir_resources), 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .resource = sa11x0ir_resources, 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3037a5b4e16c880f8350d255dc188f81622905618c1Russell Kingvoid sa11x0_register_irda(struct irda_platform_data *irda) 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3057a5b4e16c880f8350d255dc188f81622905618c1Russell King sa11x0_register_device(&sa11x0ir_device, irda); 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3083888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuangstatic struct resource sa1100_rtc_resources[] = { 3099f9d27e3f3317f39c91c286b6184f1ca05452968Dmitry Artamonow DEFINE_RES_MEM(0x90010000, 0x40), 3103888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang DEFINE_RES_IRQ_NAMED(IRQ_RTC1Hz, "rtc 1Hz"), 3113888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang DEFINE_RES_IRQ_NAMED(IRQ_RTCAlrm, "rtc alarm"), 3123888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang}; 3133888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang 314e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdiestatic struct platform_device sa11x0rtc_device = { 315e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdie .name = "sa1100-rtc", 316e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdie .id = -1, 3173888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang .num_resources = ARRAY_SIZE(sa1100_rtc_resources), 3183888c09074db2ca561c74571dcbd777949a856b8Haojian Zhuang .resource = sa1100_rtc_resources, 319e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdie}; 320e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdie 3217931d92f4f38100061cf6b8a9737967057f94871Russell Kingstatic struct resource sa11x0dma_resources[] = { 322c21320104ec5b8ffa0d62865d43ee56cbfccc2deRussell King DEFINE_RES_MEM(DMA_PHYS, DMA_SIZE), 3237931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA0), 3247931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA1), 3257931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA2), 3267931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA3), 3277931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA4), 3287931d92f4f38100061cf6b8a9737967057f94871Russell King DEFINE_RES_IRQ(IRQ_DMA5), 3297931d92f4f38100061cf6b8a9737967057f94871Russell King}; 3307931d92f4f38100061cf6b8a9737967057f94871Russell King 3317931d92f4f38100061cf6b8a9737967057f94871Russell Kingstatic u64 sa11x0dma_dma_mask = DMA_BIT_MASK(32); 3327931d92f4f38100061cf6b8a9737967057f94871Russell King 3337931d92f4f38100061cf6b8a9737967057f94871Russell Kingstatic struct platform_device sa11x0dma_device = { 3347931d92f4f38100061cf6b8a9737967057f94871Russell King .name = "sa11x0-dma", 3357931d92f4f38100061cf6b8a9737967057f94871Russell King .id = -1, 3367931d92f4f38100061cf6b8a9737967057f94871Russell King .dev = { 3377931d92f4f38100061cf6b8a9737967057f94871Russell King .dma_mask = &sa11x0dma_dma_mask, 3387931d92f4f38100061cf6b8a9737967057f94871Russell King .coherent_dma_mask = 0xffffffff, 3397931d92f4f38100061cf6b8a9737967057f94871Russell King }, 3407931d92f4f38100061cf6b8a9737967057f94871Russell King .num_resources = ARRAY_SIZE(sa11x0dma_resources), 3417931d92f4f38100061cf6b8a9737967057f94871Russell King .resource = sa11x0dma_resources, 3427931d92f4f38100061cf6b8a9737967057f94871Russell King}; 3437931d92f4f38100061cf6b8a9737967057f94871Russell King 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct platform_device *sa11x0_devices[] __initdata = { 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sa11x0udc_device, 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sa11x0uart1_device, 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sa11x0uart3_device, 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sa11x0ssp_device, 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &sa11x0pcmcia_device, 350e842f1c8ff8a88f290e26d1139e89aad02c4e0c3Richard Purdie &sa11x0rtc_device, 3517931d92f4f38100061cf6b8a9737967057f94871Russell King &sa11x0dma_device, 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init sa1100_init(void) 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pm_power_off = sa1100_power_off; 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return platform_add_devices(sa11x0_devices, ARRAY_SIZE(sa11x0_devices)); 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsarch_initcall(sa1100_init); 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Common I/O mapping: 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Typically, static virtual address mappings are as follow: 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xf0000000-0xf3ffffff: miscellaneous stuff (CPLDs, etc.) 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xf4000000-0xf4ffffff: SA-1111 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xf5000000-0xf5ffffff: reserved (used by cache flushing area) 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xf6000000-0xfffeffff: reserved (internal SA1100 IO defined above) 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xffff0000-0xffff0fff: SA1100 exception vectors 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0xffff2000-0xffff2fff: Minicache copy_user_page area 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Below 0xe8000000 is reserved for vm allocation. 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The machine specific code must provide the extra mapping beside the 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * default mapping provided here. 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct map_desc standard_io_desc[] __initdata = { 382bda03086093d4535e39ee8a6120e3fbb73e83b1aKristoffer Ericson { /* PCM */ 38392519d82828a93743adc31202927f411601c0d04Deepak Saxena .virtual = 0xf8000000, 38492519d82828a93743adc31202927f411601c0d04Deepak Saxena .pfn = __phys_to_pfn(0x80000000), 38592519d82828a93743adc31202927f411601c0d04Deepak Saxena .length = 0x00100000, 38692519d82828a93743adc31202927f411601c0d04Deepak Saxena .type = MT_DEVICE 38792519d82828a93743adc31202927f411601c0d04Deepak Saxena }, { /* SCM */ 38892519d82828a93743adc31202927f411601c0d04Deepak Saxena .virtual = 0xfa000000, 38992519d82828a93743adc31202927f411601c0d04Deepak Saxena .pfn = __phys_to_pfn(0x90000000), 39092519d82828a93743adc31202927f411601c0d04Deepak Saxena .length = 0x00100000, 39192519d82828a93743adc31202927f411601c0d04Deepak Saxena .type = MT_DEVICE 39292519d82828a93743adc31202927f411601c0d04Deepak Saxena }, { /* MER */ 39392519d82828a93743adc31202927f411601c0d04Deepak Saxena .virtual = 0xfc000000, 39492519d82828a93743adc31202927f411601c0d04Deepak Saxena .pfn = __phys_to_pfn(0xa0000000), 39592519d82828a93743adc31202927f411601c0d04Deepak Saxena .length = 0x00100000, 39692519d82828a93743adc31202927f411601c0d04Deepak Saxena .type = MT_DEVICE 39792519d82828a93743adc31202927f411601c0d04Deepak Saxena }, { /* LCD + DMA */ 39892519d82828a93743adc31202927f411601c0d04Deepak Saxena .virtual = 0xfe000000, 39992519d82828a93743adc31202927f411601c0d04Deepak Saxena .pfn = __phys_to_pfn(0xb0000000), 40092519d82828a93743adc31202927f411601c0d04Deepak Saxena .length = 0x00200000, 40192519d82828a93743adc31202927f411601c0d04Deepak Saxena .type = MT_DEVICE 40292519d82828a93743adc31202927f411601c0d04Deepak Saxena }, 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init sa1100_map_io(void) 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc)); 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Disable the memory bus request/grant signals on the SA1110 to 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ensure that we don't receive spurious memory requests. We set 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the MBGNT signal false to ensure the SA1111 doesn't own the 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SDRAM bus. 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 41680ea2065e186d8d69b617770ae7fe51dfea6ba90Russell Kingvoid sa1110_mb_disable(void) 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long flags; 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_save(flags); 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PGSR &= ~GPIO_MBGNT; 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPCR = GPIO_MBGNT; 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPDR = (GPDR & ~GPIO_MBREQ) | GPIO_MBGNT; 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GAFR &= ~(GPIO_MBGNT | GPIO_MBREQ); 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_restore(flags); 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the system is going to use the SA-1111 DMA engines, set up 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the memory bus request/grant pins. 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 43580ea2065e186d8d69b617770ae7fe51dfea6ba90Russell Kingvoid sa1110_mb_enable(void) 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long flags; 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_save(flags); 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds PGSR &= ~GPIO_MBGNT; 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPCR = GPIO_MBGNT; 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPDR = (GPDR & ~GPIO_MBREQ) | GPIO_MBGNT; 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GAFR |= (GPIO_MBGNT | GPIO_MBREQ); 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TUCR |= TUCR_MR; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds local_irq_restore(flags); 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 451