diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
| commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
| tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/arm/mach-s5pc100 | |
| parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) | |
Diffstat (limited to 'arch/arm/mach-s5pc100')
| -rw-r--r-- | arch/arm/mach-s5pc100/cpu.c | 169 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/dev-spi.c | 227 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/clkdev.h | 7 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/io.h | 18 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/memory.h | 18 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/pwm-clock.h | 56 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/spi-clocks.h | 18 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/system.h | 21 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/include/mach/vmalloc.h | 17 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/init.c | 24 | ||||
| -rw-r--r-- | arch/arm/mach-s5pc100/setup-sdhci.c | 65 |
11 files changed, 640 insertions, 0 deletions
diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/cpu.c new file mode 100644 index 00000000000..fd2708e7d8a --- /dev/null +++ b/arch/arm/mach-s5pc100/cpu.c | |||
| @@ -0,0 +1,169 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/cpu.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * Copyright 2009 Samsung Electronics Co. | ||
| 7 | * Byungho Min <bhmin@samsung.com> | ||
| 8 | * | ||
| 9 | * Based on mach-s3c6410/cpu.c | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License version 2 as | ||
| 13 | * published by the Free Software Foundation. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/kernel.h> | ||
| 17 | #include <linux/types.h> | ||
| 18 | #include <linux/interrupt.h> | ||
| 19 | #include <linux/list.h> | ||
| 20 | #include <linux/timer.h> | ||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/clk.h> | ||
| 23 | #include <linux/io.h> | ||
| 24 | #include <linux/sysdev.h> | ||
| 25 | #include <linux/serial_core.h> | ||
| 26 | #include <linux/platform_device.h> | ||
| 27 | #include <linux/sched.h> | ||
| 28 | |||
| 29 | #include <asm/mach/arch.h> | ||
| 30 | #include <asm/mach/map.h> | ||
| 31 | #include <asm/mach/irq.h> | ||
| 32 | |||
| 33 | #include <asm/proc-fns.h> | ||
| 34 | |||
| 35 | #include <mach/hardware.h> | ||
| 36 | #include <mach/map.h> | ||
| 37 | #include <asm/irq.h> | ||
| 38 | |||
| 39 | #include <plat/regs-serial.h> | ||
| 40 | #include <mach/regs-clock.h> | ||
| 41 | |||
| 42 | #include <plat/cpu.h> | ||
| 43 | #include <plat/devs.h> | ||
| 44 | #include <plat/clock.h> | ||
| 45 | #include <plat/ata-core.h> | ||
| 46 | #include <plat/iic-core.h> | ||
| 47 | #include <plat/sdhci.h> | ||
| 48 | #include <plat/adc-core.h> | ||
| 49 | #include <plat/onenand-core.h> | ||
| 50 | #include <plat/fb-core.h> | ||
| 51 | |||
| 52 | #include <plat/s5pc100.h> | ||
| 53 | |||
| 54 | /* Initial IO mappings */ | ||
| 55 | |||
| 56 | static struct map_desc s5pc100_iodesc[] __initdata = { | ||
| 57 | { | ||
| 58 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | ||
| 59 | .pfn = __phys_to_pfn(S5PC100_PA_SYSTIMER), | ||
| 60 | .length = SZ_16K, | ||
| 61 | .type = MT_DEVICE, | ||
| 62 | }, { | ||
| 63 | .virtual = (unsigned long)S5P_VA_GPIO, | ||
| 64 | .pfn = __phys_to_pfn(S5PC100_PA_GPIO), | ||
| 65 | .length = SZ_4K, | ||
| 66 | .type = MT_DEVICE, | ||
| 67 | }, { | ||
| 68 | .virtual = (unsigned long)VA_VIC0, | ||
| 69 | .pfn = __phys_to_pfn(S5PC100_PA_VIC0), | ||
| 70 | .length = SZ_16K, | ||
| 71 | .type = MT_DEVICE, | ||
| 72 | }, { | ||
| 73 | .virtual = (unsigned long)VA_VIC1, | ||
| 74 | .pfn = __phys_to_pfn(S5PC100_PA_VIC1), | ||
| 75 | .length = SZ_16K, | ||
| 76 | .type = MT_DEVICE, | ||
| 77 | }, { | ||
| 78 | .virtual = (unsigned long)VA_VIC2, | ||
| 79 | .pfn = __phys_to_pfn(S5PC100_PA_VIC2), | ||
| 80 | .length = SZ_16K, | ||
| 81 | .type = MT_DEVICE, | ||
| 82 | }, { | ||
| 83 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 84 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
| 85 | .length = SZ_512K, | ||
| 86 | .type = MT_DEVICE, | ||
| 87 | }, { | ||
| 88 | .virtual = (unsigned long)S5PC100_VA_OTHERS, | ||
| 89 | .pfn = __phys_to_pfn(S5PC100_PA_OTHERS), | ||
| 90 | .length = SZ_4K, | ||
| 91 | .type = MT_DEVICE, | ||
| 92 | } | ||
| 93 | }; | ||
| 94 | |||
| 95 | static void s5pc100_idle(void) | ||
| 96 | { | ||
| 97 | if (!need_resched()) | ||
| 98 | cpu_do_idle(); | ||
| 99 | |||
| 100 | local_irq_enable(); | ||
| 101 | } | ||
| 102 | |||
| 103 | /* s5pc100_map_io | ||
| 104 | * | ||
| 105 | * register the standard cpu IO areas | ||
| 106 | */ | ||
| 107 | |||
| 108 | void __init s5pc100_map_io(void) | ||
| 109 | { | ||
| 110 | iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc)); | ||
| 111 | |||
| 112 | /* initialise device information early */ | ||
| 113 | s5pc100_default_sdhci0(); | ||
| 114 | s5pc100_default_sdhci1(); | ||
| 115 | s5pc100_default_sdhci2(); | ||
| 116 | |||
| 117 | s3c_adc_setname("s3c64xx-adc"); | ||
| 118 | |||
| 119 | /* the i2c devices are directly compatible with s3c2440 */ | ||
| 120 | s3c_i2c0_setname("s3c2440-i2c"); | ||
| 121 | s3c_i2c1_setname("s3c2440-i2c"); | ||
| 122 | |||
| 123 | s3c_onenand_setname("s5pc100-onenand"); | ||
| 124 | s3c_fb_setname("s5pc100-fb"); | ||
| 125 | s3c_cfcon_setname("s5pc100-pata"); | ||
| 126 | } | ||
| 127 | |||
| 128 | void __init s5pc100_init_clocks(int xtal) | ||
| 129 | { | ||
| 130 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 131 | |||
| 132 | s3c24xx_register_baseclocks(xtal); | ||
| 133 | s5p_register_clocks(xtal); | ||
| 134 | s5pc100_register_clocks(); | ||
| 135 | s5pc100_setup_clocks(); | ||
| 136 | } | ||
| 137 | |||
| 138 | void __init s5pc100_init_irq(void) | ||
| 139 | { | ||
| 140 | u32 vic[] = {~0, ~0, ~0}; | ||
| 141 | |||
| 142 | /* VIC0, VIC1, and VIC2 are fully populated. */ | ||
| 143 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
| 144 | } | ||
| 145 | |||
| 146 | static struct sysdev_class s5pc100_sysclass = { | ||
| 147 | .name = "s5pc100-core", | ||
| 148 | }; | ||
| 149 | |||
| 150 | static struct sys_device s5pc100_sysdev = { | ||
| 151 | .cls = &s5pc100_sysclass, | ||
| 152 | }; | ||
| 153 | |||
| 154 | static int __init s5pc100_core_init(void) | ||
| 155 | { | ||
| 156 | return sysdev_class_register(&s5pc100_sysclass); | ||
| 157 | } | ||
| 158 | |||
| 159 | core_initcall(s5pc100_core_init); | ||
| 160 | |||
| 161 | int __init s5pc100_init(void) | ||
| 162 | { | ||
| 163 | printk(KERN_INFO "S5PC100: Initializing architecture\n"); | ||
| 164 | |||
| 165 | /* set idle function */ | ||
| 166 | pm_idle = s5pc100_idle; | ||
| 167 | |||
| 168 | return sysdev_register(&s5pc100_sysdev); | ||
| 169 | } | ||
diff --git a/arch/arm/mach-s5pc100/dev-spi.c b/arch/arm/mach-s5pc100/dev-spi.c new file mode 100644 index 00000000000..e5d6c4dceb5 --- /dev/null +++ b/arch/arm/mach-s5pc100/dev-spi.c | |||
| @@ -0,0 +1,227 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/dev-spi.c | ||
| 2 | * | ||
| 3 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
| 4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/platform_device.h> | ||
| 12 | #include <linux/dma-mapping.h> | ||
| 13 | #include <linux/gpio.h> | ||
| 14 | |||
| 15 | #include <mach/dma.h> | ||
| 16 | #include <mach/map.h> | ||
| 17 | #include <mach/spi-clocks.h> | ||
| 18 | #include <mach/irqs.h> | ||
| 19 | |||
| 20 | #include <plat/s3c64xx-spi.h> | ||
| 21 | #include <plat/gpio-cfg.h> | ||
| 22 | #include <plat/irqs.h> | ||
| 23 | |||
| 24 | static char *spi_src_clks[] = { | ||
| 25 | [S5PC100_SPI_SRCCLK_PCLK] = "pclk", | ||
| 26 | [S5PC100_SPI_SRCCLK_48M] = "spi_48m", | ||
| 27 | [S5PC100_SPI_SRCCLK_SPIBUS] = "spi_bus", | ||
| 28 | }; | ||
| 29 | |||
| 30 | /* SPI Controller platform_devices */ | ||
| 31 | |||
| 32 | /* Since we emulate multi-cs capability, we do not touch the CS. | ||
| 33 | * The emulated CS is toggled by board specific mechanism, as it can | ||
| 34 | * be either some immediate GPIO or some signal out of some other | ||
| 35 | * chip in between ... or some yet another way. | ||
| 36 | * We simply do not assume anything about CS. | ||
| 37 | */ | ||
| 38 | static int s5pc100_spi_cfg_gpio(struct platform_device *pdev) | ||
| 39 | { | ||
| 40 | switch (pdev->id) { | ||
| 41 | case 0: | ||
| 42 | s3c_gpio_cfgall_range(S5PC100_GPB(0), 3, | ||
| 43 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
| 44 | break; | ||
| 45 | |||
| 46 | case 1: | ||
| 47 | s3c_gpio_cfgall_range(S5PC100_GPB(4), 3, | ||
| 48 | S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP); | ||
| 49 | break; | ||
| 50 | |||
| 51 | case 2: | ||
| 52 | s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3)); | ||
| 53 | s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP); | ||
| 54 | s3c_gpio_cfgall_range(S5PC100_GPB(2), 2, | ||
| 55 | S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP); | ||
| 56 | break; | ||
| 57 | |||
| 58 | default: | ||
| 59 | dev_err(&pdev->dev, "Invalid SPI Controller number!"); | ||
| 60 | return -EINVAL; | ||
| 61 | } | ||
| 62 | |||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | |||
| 66 | static struct resource s5pc100_spi0_resource[] = { | ||
| 67 | [0] = { | ||
| 68 | .start = S5PC100_PA_SPI0, | ||
| 69 | .end = S5PC100_PA_SPI0 + 0x100 - 1, | ||
| 70 | .flags = IORESOURCE_MEM, | ||
| 71 | }, | ||
| 72 | [1] = { | ||
| 73 | .start = DMACH_SPI0_TX, | ||
| 74 | .end = DMACH_SPI0_TX, | ||
| 75 | .flags = IORESOURCE_DMA, | ||
| 76 | }, | ||
| 77 | [2] = { | ||
| 78 | .start = DMACH_SPI0_RX, | ||
| 79 | .end = DMACH_SPI0_RX, | ||
| 80 | .flags = IORESOURCE_DMA, | ||
| 81 | }, | ||
| 82 | [3] = { | ||
| 83 | .start = IRQ_SPI0, | ||
| 84 | .end = IRQ_SPI0, | ||
| 85 | .flags = IORESOURCE_IRQ, | ||
| 86 | }, | ||
| 87 | }; | ||
| 88 | |||
| 89 | static struct s3c64xx_spi_info s5pc100_spi0_pdata = { | ||
| 90 | .cfg_gpio = s5pc100_spi_cfg_gpio, | ||
| 91 | .fifo_lvl_mask = 0x7f, | ||
| 92 | .rx_lvl_offset = 13, | ||
| 93 | .high_speed = 1, | ||
| 94 | .tx_st_done = 21, | ||
| 95 | }; | ||
| 96 | |||
| 97 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
| 98 | |||
| 99 | struct platform_device s5pc100_device_spi0 = { | ||
| 100 | .name = "s3c64xx-spi", | ||
| 101 | .id = 0, | ||
| 102 | .num_resources = ARRAY_SIZE(s5pc100_spi0_resource), | ||
| 103 | .resource = s5pc100_spi0_resource, | ||
| 104 | .dev = { | ||
| 105 | .dma_mask = &spi_dmamask, | ||
| 106 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 107 | .platform_data = &s5pc100_spi0_pdata, | ||
| 108 | }, | ||
| 109 | }; | ||
| 110 | |||
| 111 | static struct resource s5pc100_spi1_resource[] = { | ||
| 112 | [0] = { | ||
| 113 | .start = S5PC100_PA_SPI1, | ||
| 114 | .end = S5PC100_PA_SPI1 + 0x100 - 1, | ||
| 115 | .flags = IORESOURCE_MEM, | ||
| 116 | }, | ||
| 117 | [1] = { | ||
| 118 | .start = DMACH_SPI1_TX, | ||
| 119 | .end = DMACH_SPI1_TX, | ||
| 120 | .flags = IORESOURCE_DMA, | ||
| 121 | }, | ||
| 122 | [2] = { | ||
| 123 | .start = DMACH_SPI1_RX, | ||
| 124 | .end = DMACH_SPI1_RX, | ||
| 125 | .flags = IORESOURCE_DMA, | ||
| 126 | }, | ||
| 127 | [3] = { | ||
| 128 | .start = IRQ_SPI1, | ||
| 129 | .end = IRQ_SPI1, | ||
| 130 | .flags = IORESOURCE_IRQ, | ||
| 131 | }, | ||
| 132 | }; | ||
| 133 | |||
| 134 | static struct s3c64xx_spi_info s5pc100_spi1_pdata = { | ||
| 135 | .cfg_gpio = s5pc100_spi_cfg_gpio, | ||
| 136 | .fifo_lvl_mask = 0x7f, | ||
| 137 | .rx_lvl_offset = 13, | ||
| 138 | .high_speed = 1, | ||
| 139 | .tx_st_done = 21, | ||
| 140 | }; | ||
| 141 | |||
| 142 | struct platform_device s5pc100_device_spi1 = { | ||
| 143 | .name = "s3c64xx-spi", | ||
| 144 | .id = 1, | ||
| 145 | .num_resources = ARRAY_SIZE(s5pc100_spi1_resource), | ||
| 146 | .resource = s5pc100_spi1_resource, | ||
| 147 | .dev = { | ||
| 148 | .dma_mask = &spi_dmamask, | ||
| 149 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 150 | .platform_data = &s5pc100_spi1_pdata, | ||
| 151 | }, | ||
| 152 | }; | ||
| 153 | |||
| 154 | static struct resource s5pc100_spi2_resource[] = { | ||
| 155 | [0] = { | ||
| 156 | .start = S5PC100_PA_SPI2, | ||
| 157 | .end = S5PC100_PA_SPI2 + 0x100 - 1, | ||
| 158 | .flags = IORESOURCE_MEM, | ||
| 159 | }, | ||
| 160 | [1] = { | ||
| 161 | .start = DMACH_SPI2_TX, | ||
| 162 | .end = DMACH_SPI2_TX, | ||
| 163 | .flags = IORESOURCE_DMA, | ||
| 164 | }, | ||
| 165 | [2] = { | ||
| 166 | .start = DMACH_SPI2_RX, | ||
| 167 | .end = DMACH_SPI2_RX, | ||
| 168 | .flags = IORESOURCE_DMA, | ||
| 169 | }, | ||
| 170 | [3] = { | ||
| 171 | .start = IRQ_SPI2, | ||
| 172 | .end = IRQ_SPI2, | ||
| 173 | .flags = IORESOURCE_IRQ, | ||
| 174 | }, | ||
| 175 | }; | ||
| 176 | |||
| 177 | static struct s3c64xx_spi_info s5pc100_spi2_pdata = { | ||
| 178 | .cfg_gpio = s5pc100_spi_cfg_gpio, | ||
| 179 | .fifo_lvl_mask = 0x7f, | ||
| 180 | .rx_lvl_offset = 13, | ||
| 181 | .high_speed = 1, | ||
| 182 | .tx_st_done = 21, | ||
| 183 | }; | ||
| 184 | |||
| 185 | struct platform_device s5pc100_device_spi2 = { | ||
| 186 | .name = "s3c64xx-spi", | ||
| 187 | .id = 2, | ||
| 188 | .num_resources = ARRAY_SIZE(s5pc100_spi2_resource), | ||
| 189 | .resource = s5pc100_spi2_resource, | ||
| 190 | .dev = { | ||
| 191 | .dma_mask = &spi_dmamask, | ||
| 192 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 193 | .platform_data = &s5pc100_spi2_pdata, | ||
| 194 | }, | ||
| 195 | }; | ||
| 196 | |||
| 197 | void __init s5pc100_spi_set_info(int cntrlr, int src_clk_nr, int num_cs) | ||
| 198 | { | ||
| 199 | struct s3c64xx_spi_info *pd; | ||
| 200 | |||
| 201 | /* Reject invalid configuration */ | ||
| 202 | if (!num_cs || src_clk_nr < 0 | ||
| 203 | || src_clk_nr > S5PC100_SPI_SRCCLK_SPIBUS) { | ||
| 204 | printk(KERN_ERR "%s: Invalid SPI configuration\n", __func__); | ||
| 205 | return; | ||
| 206 | } | ||
| 207 | |||
| 208 | switch (cntrlr) { | ||
| 209 | case 0: | ||
| 210 | pd = &s5pc100_spi0_pdata; | ||
| 211 | break; | ||
| 212 | case 1: | ||
| 213 | pd = &s5pc100_spi1_pdata; | ||
| 214 | break; | ||
| 215 | case 2: | ||
| 216 | pd = &s5pc100_spi2_pdata; | ||
| 217 | break; | ||
| 218 | default: | ||
| 219 | printk(KERN_ERR "%s: Invalid SPI controller(%d)\n", | ||
| 220 | __func__, cntrlr); | ||
| 221 | return; | ||
| 222 | } | ||
| 223 | |||
| 224 | pd->num_cs = num_cs; | ||
| 225 | pd->src_clk_nr = src_clk_nr; | ||
| 226 | pd->src_clk_name = spi_src_clks[src_clk_nr]; | ||
| 227 | } | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/clkdev.h b/arch/arm/mach-s5pc100/include/mach/clkdev.h new file mode 100644 index 00000000000..7dffa83d23f --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/clkdev.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #ifndef __MACH_CLKDEV_H__ | ||
| 2 | #define __MACH_CLKDEV_H__ | ||
| 3 | |||
| 4 | #define __clk_get(clk) ({ 1; }) | ||
| 5 | #define __clk_put(clk) do {} while (0) | ||
| 6 | |||
| 7 | #endif | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/io.h b/arch/arm/mach-s5pc100/include/mach/io.h new file mode 100644 index 00000000000..819acf5eaf8 --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/io.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | /* arch/arm/mach-s5pc100/include/mach/io.h | ||
| 2 | * | ||
| 3 | * Copyright 2008 Simtec Electronics | ||
| 4 | * Ben Dooks <ben-linux@fluff.org> | ||
| 5 | * | ||
| 6 | * Default IO routines for S5PC100 systems | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef __ASM_ARM_ARCH_IO_H | ||
| 10 | #define __ASM_ARM_ARCH_IO_H | ||
| 11 | |||
| 12 | /* No current ISA/PCI bus support. */ | ||
| 13 | #define __io(a) __typesafe_io(a) | ||
| 14 | #define __mem_pci(a) (a) | ||
| 15 | |||
| 16 | #define IO_SPACE_LIMIT (0xFFFFFFFF) | ||
| 17 | |||
| 18 | #endif | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/memory.h b/arch/arm/mach-s5pc100/include/mach/memory.h new file mode 100644 index 00000000000..bda4e79fd5f --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/memory.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | /* arch/arm/mach-s5pc100/include/mach/memory.h | ||
| 2 | * | ||
| 3 | * Copyright 2008 Samsung Electronics Co. | ||
| 4 | * Byungho Min <bhmin@samsung.com> | ||
| 5 | * | ||
| 6 | * Based on mach-s3c6400/include/mach/memory.h | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __ASM_ARCH_MEMORY_H | ||
| 14 | #define __ASM_ARCH_MEMORY_H | ||
| 15 | |||
| 16 | #define PLAT_PHYS_OFFSET UL(0x20000000) | ||
| 17 | |||
| 18 | #endif | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/pwm-clock.h b/arch/arm/mach-s5pc100/include/mach/pwm-clock.h new file mode 100644 index 00000000000..b34d2f7aae5 --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/pwm-clock.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/include/mach/pwm-clock.h | ||
| 2 | * | ||
| 3 | * Copyright 2009 Samsung Electronics Co. | ||
| 4 | * Byungho Min <bhmin@samsung.com> | ||
| 5 | * | ||
| 6 | * S5PC100 - pwm clock and timer support | ||
| 7 | * | ||
| 8 | * Based on mach-s3c6400/include/mach/pwm-clock.h | ||
| 9 | */ | ||
| 10 | |||
| 11 | /** | ||
| 12 | * pwm_cfg_src_is_tclk() - return whether the given mux config is a tclk | ||
| 13 | * @tcfg: The timer TCFG1 register bits shifted down to 0. | ||
| 14 | * | ||
| 15 | * Return true if the given configuration from TCFG1 is a TCLK instead | ||
| 16 | * any of the TDIV clocks. | ||
| 17 | */ | ||
| 18 | static inline int pwm_cfg_src_is_tclk(unsigned long tcfg) | ||
| 19 | { | ||
| 20 | return tcfg >= S3C64XX_TCFG1_MUX_TCLK; | ||
| 21 | } | ||
| 22 | |||
| 23 | /** | ||
| 24 | * tcfg_to_divisor() - convert tcfg1 setting to a divisor | ||
| 25 | * @tcfg1: The tcfg1 setting, shifted down. | ||
| 26 | * | ||
| 27 | * Get the divisor value for the given tcfg1 setting. We assume the | ||
| 28 | * caller has already checked to see if this is not a TCLK source. | ||
| 29 | */ | ||
| 30 | static inline unsigned long tcfg_to_divisor(unsigned long tcfg1) | ||
| 31 | { | ||
| 32 | return 1 << tcfg1; | ||
| 33 | } | ||
| 34 | |||
| 35 | /** | ||
| 36 | * pwm_tdiv_has_div1() - does the tdiv setting have a /1 | ||
| 37 | * | ||
| 38 | * Return true if we have a /1 in the tdiv setting. | ||
| 39 | */ | ||
| 40 | static inline unsigned int pwm_tdiv_has_div1(void) | ||
| 41 | { | ||
| 42 | return 1; | ||
| 43 | } | ||
| 44 | |||
| 45 | /** | ||
| 46 | * pwm_tdiv_div_bits() - calculate TCFG1 divisor value. | ||
| 47 | * @div: The divisor to calculate the bit information for. | ||
| 48 | * | ||
| 49 | * Turn a divisor into the necessary bit field for TCFG1. | ||
| 50 | */ | ||
| 51 | static inline unsigned long pwm_tdiv_div_bits(unsigned int div) | ||
| 52 | { | ||
| 53 | return ilog2(div); | ||
| 54 | } | ||
| 55 | |||
| 56 | #define S3C_TCFG1_MUX_TCLK S3C64XX_TCFG1_MUX_TCLK | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/spi-clocks.h b/arch/arm/mach-s5pc100/include/mach/spi-clocks.h new file mode 100644 index 00000000000..65e426370bb --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/spi-clocks.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/include/mach/spi-clocks.h | ||
| 2 | * | ||
| 3 | * Copyright (C) 2010 Samsung Electronics Co. Ltd. | ||
| 4 | * Jaswinder Singh <jassi.brar@samsung.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __S5PC100_PLAT_SPI_CLKS_H | ||
| 12 | #define __S5PC100_PLAT_SPI_CLKS_H __FILE__ | ||
| 13 | |||
| 14 | #define S5PC100_SPI_SRCCLK_PCLK 0 | ||
| 15 | #define S5PC100_SPI_SRCCLK_48M 1 | ||
| 16 | #define S5PC100_SPI_SRCCLK_SPIBUS 2 | ||
| 17 | |||
| 18 | #endif /* __S5PC100_PLAT_SPI_CLKS_H */ | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/system.h b/arch/arm/mach-s5pc100/include/mach/system.h new file mode 100644 index 00000000000..a9ea57c0660 --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/system.h | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/include/mach/system.h | ||
| 2 | * | ||
| 3 | * Copyright 2009 Samsung Electronics Co. | ||
| 4 | * Byungho Min <bhmin@samsung.com> | ||
| 5 | * | ||
| 6 | * S5PC100 - system implementation | ||
| 7 | * | ||
| 8 | * Based on mach-s3c6400/include/mach/system.h | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __ASM_ARCH_SYSTEM_H | ||
| 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ | ||
| 13 | |||
| 14 | #include <plat/system-reset.h> | ||
| 15 | |||
| 16 | static void arch_idle(void) | ||
| 17 | { | ||
| 18 | /* nothing here yet */ | ||
| 19 | } | ||
| 20 | |||
| 21 | #endif /* __ASM_ARCH_IRQ_H */ | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/vmalloc.h b/arch/arm/mach-s5pc100/include/mach/vmalloc.h new file mode 100644 index 00000000000..44c8e5726d9 --- /dev/null +++ b/arch/arm/mach-s5pc100/include/mach/vmalloc.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* arch/arm/mach-s5pc100/include/mach/vmalloc.h | ||
| 2 | * | ||
| 3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License version 2 as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * S3C6400 vmalloc definition | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ASM_ARCH_VMALLOC_H | ||
| 13 | #define __ASM_ARCH_VMALLOC_H | ||
| 14 | |||
| 15 | #define VMALLOC_END 0xF6000000UL | ||
| 16 | |||
| 17 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5pc100/init.c b/arch/arm/mach-s5pc100/init.c new file mode 100644 index 00000000000..19d7b523c13 --- /dev/null +++ b/arch/arm/mach-s5pc100/init.c | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* linux/arch/arm/plat-s5pc100/s5pc100-init.c | ||
| 2 | * | ||
| 3 | * Copyright 2009 Samsung Electronics Co. | ||
| 4 | * Byungho Min <bhmin@samsung.com> | ||
| 5 | * | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/types.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 16 | #include <plat/cpu.h> | ||
| 17 | #include <plat/devs.h> | ||
| 18 | #include <plat/s5pc100.h> | ||
| 19 | |||
| 20 | /* uart registration process */ | ||
| 21 | void __init s5pc100_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 22 | { | ||
| 23 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 24 | } | ||
diff --git a/arch/arm/mach-s5pc100/setup-sdhci.c b/arch/arm/mach-s5pc100/setup-sdhci.c new file mode 100644 index 00000000000..be25879bb2e --- /dev/null +++ b/arch/arm/mach-s5pc100/setup-sdhci.c | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/setup-sdhci.c | ||
| 2 | * | ||
| 3 | * Copyright 2008 Samsung Electronics | ||
| 4 | * | ||
| 5 | * S5PC100 - Helper functions for settign up SDHCI device(s) (HSMMC) | ||
| 6 | * | ||
| 7 | * Based on mach-s3c6410/setup-sdhci.c | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License version 2 as | ||
| 11 | * published by the Free Software Foundation. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/types.h> | ||
| 16 | #include <linux/interrupt.h> | ||
| 17 | #include <linux/platform_device.h> | ||
| 18 | #include <linux/io.h> | ||
| 19 | |||
| 20 | #include <linux/mmc/card.h> | ||
| 21 | #include <linux/mmc/host.h> | ||
| 22 | |||
| 23 | #include <plat/regs-sdhci.h> | ||
| 24 | #include <plat/sdhci.h> | ||
| 25 | |||
| 26 | /* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */ | ||
| 27 | |||
| 28 | char *s5pc100_hsmmc_clksrcs[4] = { | ||
| 29 | [0] = "hsmmc", /* HCLK */ | ||
| 30 | /* [1] = "hsmmc", - duplicate HCLK entry */ | ||
| 31 | [2] = "sclk_mmc", /* mmc_bus */ | ||
| 32 | /* [3] = "48m", - note not successfully used yet */ | ||
| 33 | }; | ||
| 34 | |||
| 35 | |||
| 36 | void s5pc100_setup_sdhci0_cfg_card(struct platform_device *dev, | ||
| 37 | void __iomem *r, | ||
| 38 | struct mmc_ios *ios, | ||
| 39 | struct mmc_card *card) | ||
| 40 | { | ||
| 41 | u32 ctrl2, ctrl3; | ||
| 42 | |||
| 43 | /* don't need to alter anything according to card-type */ | ||
| 44 | |||
| 45 | writel(S3C64XX_SDHCI_CONTROL4_DRIVE_9mA, r + S3C64XX_SDHCI_CONTROL4); | ||
| 46 | |||
| 47 | ctrl2 = readl(r + S3C_SDHCI_CONTROL2); | ||
| 48 | ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK; | ||
| 49 | ctrl2 |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR | | ||
| 50 | S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK | | ||
| 51 | S3C_SDHCI_CTRL2_ENFBCLKRX | | ||
| 52 | S3C_SDHCI_CTRL2_DFCNT_NONE | | ||
| 53 | S3C_SDHCI_CTRL2_ENCLKOUTHOLD); | ||
| 54 | |||
| 55 | if (ios->clock < 25 * 1000000) | ||
| 56 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL3 | | ||
| 57 | S3C_SDHCI_CTRL3_FCSEL2 | | ||
| 58 | S3C_SDHCI_CTRL3_FCSEL1 | | ||
| 59 | S3C_SDHCI_CTRL3_FCSEL0); | ||
| 60 | else | ||
| 61 | ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0); | ||
| 62 | |||
| 63 | writel(ctrl2, r + S3C_SDHCI_CONTROL2); | ||
| 64 | writel(ctrl3, r + S3C_SDHCI_CONTROL3); | ||
| 65 | } | ||
