aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-samsung
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-samsung')
-rw-r--r--arch/arm/plat-samsung/Kconfig6
-rw-r--r--arch/arm/plat-samsung/Makefile1
-rw-r--r--arch/arm/plat-samsung/clock.c105
-rw-r--r--arch/arm/plat-samsung/dev-backlight.c149
-rw-r--r--arch/arm/plat-samsung/dev-fb.c14
-rw-r--r--arch/arm/plat-samsung/dev-hwmon.c14
-rw-r--r--arch/arm/plat-samsung/dev-i2c0.c14
-rw-r--r--arch/arm/plat-samsung/dev-i2c1.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c2.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c3.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c4.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c5.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c6.c24
-rw-r--r--arch/arm/plat-samsung/dev-i2c7.c24
-rw-r--r--arch/arm/plat-samsung/dev-nand.c9
-rw-r--r--arch/arm/plat-samsung/dev-ts.c14
-rw-r--r--arch/arm/plat-samsung/dev-usb.c9
-rw-r--r--arch/arm/plat-samsung/dma.c6
-rw-r--r--arch/arm/plat-samsung/include/plat/backlight.h26
-rw-r--r--arch/arm/plat-samsung/include/plat/clock.h3
-rw-r--r--arch/arm/plat-samsung/include/plat/devs.h6
-rw-r--r--arch/arm/plat-samsung/include/plat/dma.h21
-rw-r--r--arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h2
-rw-r--r--arch/arm/plat-samsung/include/plat/iic.h2
-rw-r--r--arch/arm/plat-samsung/include/plat/pm.h5
-rw-r--r--arch/arm/plat-samsung/include/plat/regs-serial.h8
-rw-r--r--arch/arm/plat-samsung/include/plat/s3c64xx-spi.h2
-rw-r--r--arch/arm/plat-samsung/irq-uart.c9
-rw-r--r--arch/arm/plat-samsung/irq-vic-timer.c7
-rw-r--r--arch/arm/plat-samsung/pm-check.c2
-rw-r--r--arch/arm/plat-samsung/pm.c11
-rw-r--r--arch/arm/plat-samsung/pwm-clock.c10
-rw-r--r--arch/arm/plat-samsung/time.c2
33 files changed, 325 insertions, 300 deletions
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig
index 4d79519d19a..b3e10659e4b 100644
--- a/arch/arm/plat-samsung/Kconfig
+++ b/arch/arm/plat-samsung/Kconfig
@@ -280,6 +280,12 @@ config SAMSUNG_DEV_PWM
280 help 280 help
281 Compile in platform device definition for PWM Timer 281 Compile in platform device definition for PWM Timer
282 282
283config SAMSUNG_DEV_BACKLIGHT
284 bool
285 depends on SAMSUNG_DEV_PWM
286 help
287 Compile in platform device definition LCD backlight with PWM Timer
288
283config S3C24XX_PWM 289config S3C24XX_PWM
284 bool "PWM device support" 290 bool "PWM device support"
285 select HAVE_PWM 291 select HAVE_PWM
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile
index 53eb15b0a07..853764ba8cc 100644
--- a/arch/arm/plat-samsung/Makefile
+++ b/arch/arm/plat-samsung/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_SAMSUNG_DEV_IDE) += dev-ide.o
59obj-$(CONFIG_SAMSUNG_DEV_TS) += dev-ts.o 59obj-$(CONFIG_SAMSUNG_DEV_TS) += dev-ts.o
60obj-$(CONFIG_SAMSUNG_DEV_KEYPAD) += dev-keypad.o 60obj-$(CONFIG_SAMSUNG_DEV_KEYPAD) += dev-keypad.o
61obj-$(CONFIG_SAMSUNG_DEV_PWM) += dev-pwm.o 61obj-$(CONFIG_SAMSUNG_DEV_PWM) += dev-pwm.o
62obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT) += dev-backlight.o
62 63
63# DMA support 64# DMA support
64 65
diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c
index 772892826ff..302c42670bd 100644
--- a/arch/arm/plat-samsung/clock.c
+++ b/arch/arm/plat-samsung/clock.c
@@ -71,74 +71,6 @@ static int clk_null_enable(struct clk *clk, int enable)
71 return 0; 71 return 0;
72} 72}
73 73
74static int dev_is_s3c_uart(struct device *dev)
75{
76 struct platform_device **pdev = s3c24xx_uart_devs;
77 int i;
78 for (i = 0; i < ARRAY_SIZE(s3c24xx_uart_devs); i++, pdev++)
79 if (*pdev && dev == &(*pdev)->dev)
80 return 1;
81 return 0;
82}
83
84/*
85 * Serial drivers call get_clock() very early, before platform bus
86 * has been set up, this requires a special check to let them get
87 * a proper clock
88 */
89
90static int dev_is_platform_device(struct device *dev)
91{
92 return dev->bus == &platform_bus_type ||
93 (dev->bus == NULL && dev_is_s3c_uart(dev));
94}
95
96/* Clock API calls */
97
98struct clk *clk_get(struct device *dev, const char *id)
99{
100 struct clk *p;
101 struct clk *clk = ERR_PTR(-ENOENT);
102 int idno;
103
104 if (dev == NULL || !dev_is_platform_device(dev))
105 idno = -1;
106 else
107 idno = to_platform_device(dev)->id;
108
109 spin_lock(&clocks_lock);
110
111 list_for_each_entry(p, &clocks, list) {
112 if (p->id == idno &&
113 strcmp(id, p->name) == 0 &&
114 try_module_get(p->owner)) {
115 clk = p;
116 break;
117 }
118 }
119
120 /* check for the case where a device was supplied, but the
121 * clock that was being searched for is not device specific */
122
123 if (IS_ERR(clk)) {
124 list_for_each_entry(p, &clocks, list) {
125 if (p->id == -1 && strcmp(id, p->name) == 0 &&
126 try_module_get(p->owner)) {
127 clk = p;
128 break;
129 }
130 }
131 }
132
133 spin_unlock(&clocks_lock);
134 return clk;
135}
136
137void clk_put(struct clk *clk)
138{
139 module_put(clk->owner);
140}
141
142int clk_enable(struct clk *clk) 74int clk_enable(struct clk *clk)
143{ 75{
144 if (IS_ERR(clk) || clk == NULL) 76 if (IS_ERR(clk) || clk == NULL)
@@ -241,8 +173,6 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
241 return ret; 173 return ret;
242} 174}
243 175
244EXPORT_SYMBOL(clk_get);
245EXPORT_SYMBOL(clk_put);
246EXPORT_SYMBOL(clk_enable); 176EXPORT_SYMBOL(clk_enable);
247EXPORT_SYMBOL(clk_disable); 177EXPORT_SYMBOL(clk_disable);
248EXPORT_SYMBOL(clk_get_rate); 178EXPORT_SYMBOL(clk_get_rate);
@@ -265,7 +195,6 @@ struct clk_ops clk_ops_def_setrate = {
265 195
266struct clk clk_xtal = { 196struct clk clk_xtal = {
267 .name = "xtal", 197 .name = "xtal",
268 .id = -1,
269 .rate = 0, 198 .rate = 0,
270 .parent = NULL, 199 .parent = NULL,
271 .ctrlbit = 0, 200 .ctrlbit = 0,
@@ -273,30 +202,25 @@ struct clk clk_xtal = {
273 202
274struct clk clk_ext = { 203struct clk clk_ext = {
275 .name = "ext", 204 .name = "ext",
276 .id = -1,
277}; 205};
278 206
279struct clk clk_epll = { 207struct clk clk_epll = {
280 .name = "epll", 208 .name = "epll",
281 .id = -1,
282}; 209};
283 210
284struct clk clk_mpll = { 211struct clk clk_mpll = {
285 .name = "mpll", 212 .name = "mpll",
286 .id = -1,
287 .ops = &clk_ops_def_setrate, 213 .ops = &clk_ops_def_setrate,
288}; 214};
289 215
290struct clk clk_upll = { 216struct clk clk_upll = {
291 .name = "upll", 217 .name = "upll",
292 .id = -1,
293 .parent = NULL, 218 .parent = NULL,
294 .ctrlbit = 0, 219 .ctrlbit = 0,
295}; 220};
296 221
297struct clk clk_f = { 222struct clk clk_f = {
298 .name = "fclk", 223 .name = "fclk",
299 .id = -1,
300 .rate = 0, 224 .rate = 0,
301 .parent = &clk_mpll, 225 .parent = &clk_mpll,
302 .ctrlbit = 0, 226 .ctrlbit = 0,
@@ -304,7 +228,6 @@ struct clk clk_f = {
304 228
305struct clk clk_h = { 229struct clk clk_h = {
306 .name = "hclk", 230 .name = "hclk",
307 .id = -1,
308 .rate = 0, 231 .rate = 0,
309 .parent = NULL, 232 .parent = NULL,
310 .ctrlbit = 0, 233 .ctrlbit = 0,
@@ -313,7 +236,6 @@ struct clk clk_h = {
313 236
314struct clk clk_p = { 237struct clk clk_p = {
315 .name = "pclk", 238 .name = "pclk",
316 .id = -1,
317 .rate = 0, 239 .rate = 0,
318 .parent = NULL, 240 .parent = NULL,
319 .ctrlbit = 0, 241 .ctrlbit = 0,
@@ -322,7 +244,6 @@ struct clk clk_p = {
322 244
323struct clk clk_usb_bus = { 245struct clk clk_usb_bus = {
324 .name = "usb-bus", 246 .name = "usb-bus",
325 .id = -1,
326 .rate = 0, 247 .rate = 0,
327 .parent = &clk_upll, 248 .parent = &clk_upll,
328}; 249};
@@ -330,7 +251,6 @@ struct clk clk_usb_bus = {
330 251
331struct clk s3c24xx_uclk = { 252struct clk s3c24xx_uclk = {
332 .name = "uclk", 253 .name = "uclk",
333 .id = -1,
334}; 254};
335 255
336/* initialise the clock system */ 256/* initialise the clock system */
@@ -346,14 +266,11 @@ int s3c24xx_register_clock(struct clk *clk)
346 if (clk->enable == NULL) 266 if (clk->enable == NULL)
347 clk->enable = clk_null_enable; 267 clk->enable = clk_null_enable;
348 268
349 /* add to the list of available clocks */ 269 /* fill up the clk_lookup structure and register it*/
350 270 clk->lookup.dev_id = clk->devname;
351 /* Quick check to see if this clock has already been registered. */ 271 clk->lookup.con_id = clk->name;
352 BUG_ON(clk->list.prev != clk->list.next); 272 clk->lookup.clk = clk;
353 273 clkdev_add(&clk->lookup);
354 spin_lock(&clocks_lock);
355 list_add(&clk->list, &clocks);
356 spin_unlock(&clocks_lock);
357 274
358 return 0; 275 return 0;
359} 276}
@@ -458,15 +375,12 @@ static struct dentry *clk_debugfs_root;
458static int clk_debugfs_register_one(struct clk *c) 375static int clk_debugfs_register_one(struct clk *c)
459{ 376{
460 int err; 377 int err;
461 struct dentry *d, *child, *child_tmp; 378 struct dentry *d;
462 struct clk *pa = c->parent; 379 struct clk *pa = c->parent;
463 char s[255]; 380 char s[255];
464 char *p = s; 381 char *p = s;
465 382
466 p += sprintf(p, "%s", c->name); 383 p += sprintf(p, "%s", c->devname);
467
468 if (c->id >= 0)
469 sprintf(p, ":%d", c->id);
470 384
471 d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root); 385 d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root);
472 if (!d) 386 if (!d)
@@ -488,10 +402,7 @@ static int clk_debugfs_register_one(struct clk *c)
488 return 0; 402 return 0;
489 403
490err_out: 404err_out:
491 d = c->dent; 405 debugfs_remove_recursive(c->dent);
492 list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
493 debugfs_remove(child);
494 debugfs_remove(c->dent);
495 return err; 406 return err;
496} 407}
497 408
diff --git a/arch/arm/plat-samsung/dev-backlight.c b/arch/arm/plat-samsung/dev-backlight.c
new file mode 100644
index 00000000000..3cedd4c407a
--- /dev/null
+++ b/arch/arm/plat-samsung/dev-backlight.c
@@ -0,0 +1,149 @@
1/* linux/arch/arm/plat-samsung/dev-backlight.c
2 *
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
5 *
6 * Common infrastructure for PWM Backlight for Samsung boards
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#include <linux/gpio.h>
14#include <linux/platform_device.h>
15#include <linux/io.h>
16#include <linux/pwm_backlight.h>
17
18#include <plat/devs.h>
19#include <plat/gpio-cfg.h>
20#include <plat/backlight.h>
21
22static int samsung_bl_init(struct device *dev)
23{
24 int ret = 0;
25 struct platform_device *timer_dev =
26 container_of(dev->parent, struct platform_device, dev);
27 struct samsung_bl_gpio_info *bl_gpio_info =
28 timer_dev->dev.platform_data;
29
30 ret = gpio_request(bl_gpio_info->no, "Backlight");
31 if (ret) {
32 printk(KERN_ERR "failed to request GPIO for LCD Backlight\n");
33 return ret;
34 }
35
36 /* Configure GPIO pin with specific GPIO function for PWM timer */
37 s3c_gpio_cfgpin(bl_gpio_info->no, bl_gpio_info->func);
38
39 return 0;
40}
41
42static void samsung_bl_exit(struct device *dev)
43{
44 struct platform_device *timer_dev =
45 container_of(dev->parent, struct platform_device, dev);
46 struct samsung_bl_gpio_info *bl_gpio_info =
47 timer_dev->dev.platform_data;
48
49 s3c_gpio_cfgpin(bl_gpio_info->no, S3C_GPIO_OUTPUT);
50 gpio_free(bl_gpio_info->no);
51}
52
53/* Initialize few important fields of platform_pwm_backlight_data
54 * structure with default values. These fields can be overridden by
55 * board-specific values sent from machine file.
56 * For ease of operation, these fields are initialized with values
57 * used by most samsung boards.
58 * Users has the option of sending info about other parameters
59 * for their specific boards
60 */
61
62static struct platform_pwm_backlight_data samsung_dfl_bl_data __initdata = {
63 .max_brightness = 255,
64 .dft_brightness = 255,
65 .pwm_period_ns = 78770,
66 .init = samsung_bl_init,
67 .exit = samsung_bl_exit,
68};
69
70static struct platform_device samsung_dfl_bl_device __initdata = {
71 .name = "pwm-backlight",
72};
73
74/* samsung_bl_set - Set board specific data (if any) provided by user for
75 * PWM Backlight control and register specific PWM and backlight device.
76 * @gpio_info: structure containing GPIO info for PWM timer
77 * @bl_data: structure containing Backlight control data
78 */
79void samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
80 struct platform_pwm_backlight_data *bl_data)
81{
82 int ret = 0;
83 struct platform_device *samsung_bl_device;
84 struct platform_pwm_backlight_data *samsung_bl_data;
85
86 samsung_bl_device = kmemdup(&samsung_dfl_bl_device,
87 sizeof(struct platform_device), GFP_KERNEL);
88 if (!samsung_bl_device) {
89 printk(KERN_ERR "%s: no memory for platform dev\n", __func__);
90 return;
91 }
92
93 samsung_bl_data = s3c_set_platdata(&samsung_dfl_bl_data,
94 sizeof(struct platform_pwm_backlight_data), samsung_bl_device);
95 if (!samsung_bl_data) {
96 printk(KERN_ERR "%s: no memory for platform dev\n", __func__);
97 goto err_data;
98 }
99
100 /* Copy board specific data provided by user */
101 samsung_bl_data->pwm_id = bl_data->pwm_id;
102 samsung_bl_device->dev.parent =
103 &s3c_device_timer[samsung_bl_data->pwm_id].dev;
104
105 if (bl_data->max_brightness)
106 samsung_bl_data->max_brightness = bl_data->max_brightness;
107 if (bl_data->dft_brightness)
108 samsung_bl_data->dft_brightness = bl_data->dft_brightness;
109 if (bl_data->lth_brightness)
110 samsung_bl_data->lth_brightness = bl_data->lth_brightness;
111 if (bl_data->pwm_period_ns)
112 samsung_bl_data->pwm_period_ns = bl_data->pwm_period_ns;
113 if (bl_data->init)
114 samsung_bl_data->init = bl_data->init;
115 if (bl_data->notify)
116 samsung_bl_data->notify = bl_data->notify;
117 if (bl_data->exit)
118 samsung_bl_data->exit = bl_data->exit;
119 if (bl_data->check_fb)
120 samsung_bl_data->check_fb = bl_data->check_fb;
121
122 /* Keep the GPIO info for future use */
123 s3c_device_timer[samsung_bl_data->pwm_id].dev.platform_data = gpio_info;
124
125 /* Register the specific PWM timer dev for Backlight control */
126 ret = platform_device_register(
127 &s3c_device_timer[samsung_bl_data->pwm_id]);
128 if (ret) {
129 printk(KERN_ERR "failed to register pwm timer for backlight: %d\n", ret);
130 goto err_plat_reg1;
131 }
132
133 /* Register the Backlight dev */
134 ret = platform_device_register(samsung_bl_device);
135 if (ret) {
136 printk(KERN_ERR "failed to register backlight device: %d\n", ret);
137 goto err_plat_reg2;
138 }
139
140 return;
141
142err_plat_reg2:
143 platform_device_unregister(&s3c_device_timer[samsung_bl_data->pwm_id]);
144err_plat_reg1:
145 kfree(samsung_bl_data);
146err_data:
147 kfree(samsung_bl_device);
148 return;
149}
diff --git a/arch/arm/plat-samsung/dev-fb.c b/arch/arm/plat-samsung/dev-fb.c
index bf60204c629..49a1362fd25 100644
--- a/arch/arm/plat-samsung/dev-fb.c
+++ b/arch/arm/plat-samsung/dev-fb.c
@@ -58,16 +58,6 @@ struct platform_device s3c_device_fb = {
58 58
59void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd) 59void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
60{ 60{
61 struct s3c_fb_platdata *npd; 61 s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
62 62 &s3c_device_fb);
63 if (!pd) {
64 printk(KERN_ERR "%s: no platform data\n", __func__);
65 return;
66 }
67
68 npd = kmemdup(pd, sizeof(struct s3c_fb_platdata), GFP_KERNEL);
69 if (!npd)
70 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
71
72 s3c_device_fb.dev.platform_data = npd;
73} 63}
diff --git a/arch/arm/plat-samsung/dev-hwmon.c b/arch/arm/plat-samsung/dev-hwmon.c
index b3ffb958725..c91a79ce8f3 100644
--- a/arch/arm/plat-samsung/dev-hwmon.c
+++ b/arch/arm/plat-samsung/dev-hwmon.c
@@ -27,16 +27,6 @@ struct platform_device s3c_device_hwmon = {
27 27
28void __init s3c_hwmon_set_platdata(struct s3c_hwmon_pdata *pd) 28void __init s3c_hwmon_set_platdata(struct s3c_hwmon_pdata *pd)
29{ 29{
30 struct s3c_hwmon_pdata *npd; 30 s3c_set_platdata(pd, sizeof(struct s3c_hwmon_pdata),
31 31 &s3c_device_hwmon);
32 if (!pd) {
33 printk(KERN_ERR "%s: no platform data\n", __func__);
34 return;
35 }
36
37 npd = kmemdup(pd, sizeof(struct s3c_hwmon_pdata), GFP_KERNEL);
38 if (!npd)
39 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
40
41 s3c_device_hwmon.dev.platform_data = npd;
42} 32}
diff --git a/arch/arm/plat-samsung/dev-i2c0.c b/arch/arm/plat-samsung/dev-i2c0.c
index 3a601c16f03..f8251f5098b 100644
--- a/arch/arm/plat-samsung/dev-i2c0.c
+++ b/arch/arm/plat-samsung/dev-i2c0.c
@@ -48,7 +48,7 @@ struct platform_device s3c_device_i2c0 = {
48 .resource = s3c_i2c_resource, 48 .resource = s3c_i2c_resource,
49}; 49};
50 50
51static struct s3c2410_platform_i2c default_i2c_data0 __initdata = { 51struct s3c2410_platform_i2c default_i2c_data __initdata = {
52 .flags = 0, 52 .flags = 0,
53 .slave_addr = 0x10, 53 .slave_addr = 0x10,
54 .frequency = 100*1000, 54 .frequency = 100*1000,
@@ -60,13 +60,11 @@ void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
60 struct s3c2410_platform_i2c *npd; 60 struct s3c2410_platform_i2c *npd;
61 61
62 if (!pd) 62 if (!pd)
63 pd = &default_i2c_data0; 63 pd = &default_i2c_data;
64 64
65 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 65 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
66 if (!npd) 66 &s3c_device_i2c0);
67 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
68 else if (!npd->cfg_gpio)
69 npd->cfg_gpio = s3c_i2c0_cfg_gpio;
70 67
71 s3c_device_i2c0.dev.platform_data = npd; 68 if (!npd->cfg_gpio)
69 npd->cfg_gpio = s3c_i2c0_cfg_gpio;
72} 70}
diff --git a/arch/arm/plat-samsung/dev-i2c1.c b/arch/arm/plat-samsung/dev-i2c1.c
index 858ee2a0414..3b7c7bec1cf 100644
--- a/arch/arm/plat-samsung/dev-i2c1.c
+++ b/arch/arm/plat-samsung/dev-i2c1.c
@@ -44,26 +44,18 @@ struct platform_device s3c_device_i2c1 = {
44 .resource = s3c_i2c_resource, 44 .resource = s3c_i2c_resource,
45}; 45};
46 46
47static struct s3c2410_platform_i2c default_i2c_data1 __initdata = {
48 .flags = 0,
49 .bus_num = 1,
50 .slave_addr = 0x10,
51 .frequency = 100*1000,
52 .sda_delay = 100,
53};
54
55void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd) 47void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
56{ 48{
57 struct s3c2410_platform_i2c *npd; 49 struct s3c2410_platform_i2c *npd;
58 50
59 if (!pd) 51 if (!pd) {
60 pd = &default_i2c_data1; 52 pd = &default_i2c_data;
53 pd->bus_num = 1;
54 }
61 55
62 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 56 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
63 if (!npd) 57 &s3c_device_i2c1);
64 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
65 else if (!npd->cfg_gpio)
66 npd->cfg_gpio = s3c_i2c1_cfg_gpio;
67 58
68 s3c_device_i2c1.dev.platform_data = npd; 59 if (!npd->cfg_gpio)
60 npd->cfg_gpio = s3c_i2c1_cfg_gpio;
69} 61}
diff --git a/arch/arm/plat-samsung/dev-i2c2.c b/arch/arm/plat-samsung/dev-i2c2.c
index ff4ba69b683..07e9fd0b1b8 100644
--- a/arch/arm/plat-samsung/dev-i2c2.c
+++ b/arch/arm/plat-samsung/dev-i2c2.c
@@ -45,26 +45,18 @@ struct platform_device s3c_device_i2c2 = {
45 .resource = s3c_i2c_resource, 45 .resource = s3c_i2c_resource,
46}; 46};
47 47
48static struct s3c2410_platform_i2c default_i2c_data2 __initdata = {
49 .flags = 0,
50 .bus_num = 2,
51 .slave_addr = 0x10,
52 .frequency = 100*1000,
53 .sda_delay = 100,
54};
55
56void __init s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *pd) 48void __init s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *pd)
57{ 49{
58 struct s3c2410_platform_i2c *npd; 50 struct s3c2410_platform_i2c *npd;
59 51
60 if (!pd) 52 if (!pd) {
61 pd = &default_i2c_data2; 53 pd = &default_i2c_data;
54 pd->bus_num = 2;
55 }
62 56
63 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 57 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
64 if (!npd) 58 &s3c_device_i2c2);
65 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
66 else if (!npd->cfg_gpio)
67 npd->cfg_gpio = s3c_i2c2_cfg_gpio;
68 59
69 s3c_device_i2c2.dev.platform_data = npd; 60 if (!npd->cfg_gpio)
61 npd->cfg_gpio = s3c_i2c2_cfg_gpio;
70} 62}
diff --git a/arch/arm/plat-samsung/dev-i2c3.c b/arch/arm/plat-samsung/dev-i2c3.c
index 8586a10014b..d48efa93c6e 100644
--- a/arch/arm/plat-samsung/dev-i2c3.c
+++ b/arch/arm/plat-samsung/dev-i2c3.c
@@ -43,26 +43,18 @@ struct platform_device s3c_device_i2c3 = {
43 .resource = s3c_i2c_resource, 43 .resource = s3c_i2c_resource,
44}; 44};
45 45
46static struct s3c2410_platform_i2c default_i2c_data3 __initdata = {
47 .flags = 0,
48 .bus_num = 3,
49 .slave_addr = 0x10,
50 .frequency = 100*1000,
51 .sda_delay = 100,
52};
53
54void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd) 46void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd)
55{ 47{
56 struct s3c2410_platform_i2c *npd; 48 struct s3c2410_platform_i2c *npd;
57 49
58 if (!pd) 50 if (!pd) {
59 pd = &default_i2c_data3; 51 pd = &default_i2c_data;
52 pd->bus_num = 3;
53 }
60 54
61 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 55 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
62 if (!npd) 56 &s3c_device_i2c3);
63 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
64 else if (!npd->cfg_gpio)
65 npd->cfg_gpio = s3c_i2c3_cfg_gpio;
66 57
67 s3c_device_i2c3.dev.platform_data = npd; 58 if (!npd->cfg_gpio)
59 npd->cfg_gpio = s3c_i2c3_cfg_gpio;
68} 60}
diff --git a/arch/arm/plat-samsung/dev-i2c4.c b/arch/arm/plat-samsung/dev-i2c4.c
index df2159e2daa..07e26444efe 100644
--- a/arch/arm/plat-samsung/dev-i2c4.c
+++ b/arch/arm/plat-samsung/dev-i2c4.c
@@ -43,26 +43,18 @@ struct platform_device s3c_device_i2c4 = {
43 .resource = s3c_i2c_resource, 43 .resource = s3c_i2c_resource,
44}; 44};
45 45
46static struct s3c2410_platform_i2c default_i2c_data4 __initdata = {
47 .flags = 0,
48 .bus_num = 4,
49 .slave_addr = 0x10,
50 .frequency = 100*1000,
51 .sda_delay = 100,
52};
53
54void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd) 46void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd)
55{ 47{
56 struct s3c2410_platform_i2c *npd; 48 struct s3c2410_platform_i2c *npd;
57 49
58 if (!pd) 50 if (!pd) {
59 pd = &default_i2c_data4; 51 pd = &default_i2c_data;
52 pd->bus_num = 4;
53 }
60 54
61 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 55 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
62 if (!npd) 56 &s3c_device_i2c4);
63 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
64 else if (!npd->cfg_gpio)
65 npd->cfg_gpio = s3c_i2c4_cfg_gpio;
66 57
67 s3c_device_i2c4.dev.platform_data = npd; 58 if (!npd->cfg_gpio)
59 npd->cfg_gpio = s3c_i2c4_cfg_gpio;
68} 60}
diff --git a/arch/arm/plat-samsung/dev-i2c5.c b/arch/arm/plat-samsung/dev-i2c5.c
index 0499c2c3877..f4965578456 100644
--- a/arch/arm/plat-samsung/dev-i2c5.c
+++ b/arch/arm/plat-samsung/dev-i2c5.c
@@ -43,26 +43,18 @@ struct platform_device s3c_device_i2c5 = {
43 .resource = s3c_i2c_resource, 43 .resource = s3c_i2c_resource,
44}; 44};
45 45
46static struct s3c2410_platform_i2c default_i2c_data5 __initdata = {
47 .flags = 0,
48 .bus_num = 5,
49 .slave_addr = 0x10,
50 .frequency = 100*1000,
51 .sda_delay = 100,
52};
53
54void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd) 46void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd)
55{ 47{
56 struct s3c2410_platform_i2c *npd; 48 struct s3c2410_platform_i2c *npd;
57 49
58 if (!pd) 50 if (!pd) {
59 pd = &default_i2c_data5; 51 pd = &default_i2c_data;
52 pd->bus_num = 5;
53 }
60 54
61 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 55 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
62 if (!npd) 56 &s3c_device_i2c5);
63 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
64 else if (!npd->cfg_gpio)
65 npd->cfg_gpio = s3c_i2c5_cfg_gpio;
66 57
67 s3c_device_i2c5.dev.platform_data = npd; 58 if (!npd->cfg_gpio)
59 npd->cfg_gpio = s3c_i2c5_cfg_gpio;
68} 60}
diff --git a/arch/arm/plat-samsung/dev-i2c6.c b/arch/arm/plat-samsung/dev-i2c6.c
index 4083108908a..141d799944e 100644
--- a/arch/arm/plat-samsung/dev-i2c6.c
+++ b/arch/arm/plat-samsung/dev-i2c6.c
@@ -43,26 +43,18 @@ struct platform_device s3c_device_i2c6 = {
43 .resource = s3c_i2c_resource, 43 .resource = s3c_i2c_resource,
44}; 44};
45 45
46static struct s3c2410_platform_i2c default_i2c_data6 __initdata = {
47 .flags = 0,
48 .bus_num = 6,
49 .slave_addr = 0x10,
50 .frequency = 100*1000,
51 .sda_delay = 100,
52};
53
54void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd) 46void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd)
55{ 47{
56 struct s3c2410_platform_i2c *npd; 48 struct s3c2410_platform_i2c *npd;
57 49
58 if (!pd) 50 if (!pd) {
59 pd = &default_i2c_data6; 51 pd = &default_i2c_data;
52 pd->bus_num = 6;
53 }
60 54
61 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 55 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
62 if (!npd) 56 &s3c_device_i2c6);
63 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
64 else if (!npd->cfg_gpio)
65 npd->cfg_gpio = s3c_i2c6_cfg_gpio;
66 57
67 s3c_device_i2c6.dev.platform_data = npd; 58 if (!npd->cfg_gpio)
59 npd->cfg_gpio = s3c_i2c6_cfg_gpio;
68} 60}
diff --git a/arch/arm/plat-samsung/dev-i2c7.c b/arch/arm/plat-samsung/dev-i2c7.c
index 1182451d7dc..9dddcd1665b 100644
--- a/arch/arm/plat-samsung/dev-i2c7.c
+++ b/arch/arm/plat-samsung/dev-i2c7.c
@@ -43,26 +43,18 @@ struct platform_device s3c_device_i2c7 = {
43 .resource = s3c_i2c_resource, 43 .resource = s3c_i2c_resource,
44}; 44};
45 45
46static struct s3c2410_platform_i2c default_i2c_data7 __initdata = {
47 .flags = 0,
48 .bus_num = 7,
49 .slave_addr = 0x10,
50 .frequency = 100*1000,
51 .sda_delay = 100,
52};
53
54void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd) 46void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd)
55{ 47{
56 struct s3c2410_platform_i2c *npd; 48 struct s3c2410_platform_i2c *npd;
57 49
58 if (!pd) 50 if (!pd) {
59 pd = &default_i2c_data7; 51 pd = &default_i2c_data;
52 pd->bus_num = 7;
53 }
60 54
61 npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); 55 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
62 if (!npd) 56 &s3c_device_i2c7);
63 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
64 else if (!npd->cfg_gpio)
65 npd->cfg_gpio = s3c_i2c7_cfg_gpio;
66 57
67 s3c_device_i2c7.dev.platform_data = npd; 58 if (!npd->cfg_gpio)
59 npd->cfg_gpio = s3c_i2c7_cfg_gpio;
68} 60}
diff --git a/arch/arm/plat-samsung/dev-nand.c b/arch/arm/plat-samsung/dev-nand.c
index 6927ae8fd11..b8e30ec6ac2 100644
--- a/arch/arm/plat-samsung/dev-nand.c
+++ b/arch/arm/plat-samsung/dev-nand.c
@@ -91,11 +91,10 @@ void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
91 * time then there is little chance the system is going to run. 91 * time then there is little chance the system is going to run.
92 */ 92 */
93 93
94 npd = kmemdup(nand, sizeof(struct s3c2410_platform_nand), GFP_KERNEL); 94 npd = s3c_set_platdata(nand, sizeof(struct s3c2410_platform_nand),
95 if (!npd) { 95 &s3c_device_nand);
96 printk(KERN_ERR "%s: failed copying platform data\n", __func__); 96 if (!npd)
97 return; 97 return;
98 }
99 98
100 /* now see if we need to copy any of the nand set data */ 99 /* now see if we need to copy any of the nand set data */
101 100
@@ -123,6 +122,4 @@ void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
123 to++; 122 to++;
124 } 123 }
125 } 124 }
126
127 s3c_device_nand.dev.platform_data = npd;
128} 125}
diff --git a/arch/arm/plat-samsung/dev-ts.c b/arch/arm/plat-samsung/dev-ts.c
index 3e4bd8147bf..82543f0248a 100644
--- a/arch/arm/plat-samsung/dev-ts.c
+++ b/arch/arm/plat-samsung/dev-ts.c
@@ -45,16 +45,6 @@ struct platform_device s3c_device_ts = {
45 45
46void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd) 46void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
47{ 47{
48 struct s3c2410_ts_mach_info *npd; 48 s3c_set_platdata(pd, sizeof(struct s3c2410_ts_mach_info),
49 49 &s3c_device_ts);
50 if (!pd) {
51 printk(KERN_ERR "%s: no platform data\n", __func__);
52 return;
53 }
54
55 npd = kmemdup(pd, sizeof(struct s3c2410_ts_mach_info), GFP_KERNEL);
56 if (!npd)
57 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
58
59 s3c_device_ts.dev.platform_data = npd;
60} 50}
diff --git a/arch/arm/plat-samsung/dev-usb.c b/arch/arm/plat-samsung/dev-usb.c
index 0e0a3bf5c98..33fbaa96770 100644
--- a/arch/arm/plat-samsung/dev-usb.c
+++ b/arch/arm/plat-samsung/dev-usb.c
@@ -60,11 +60,6 @@ EXPORT_SYMBOL(s3c_device_ohci);
60 */ 60 */
61void __init s3c_ohci_set_platdata(struct s3c2410_hcd_info *info) 61void __init s3c_ohci_set_platdata(struct s3c2410_hcd_info *info)
62{ 62{
63 struct s3c2410_hcd_info *npd; 63 s3c_set_platdata(info, sizeof(struct s3c2410_hcd_info),
64 64 &s3c_device_ohci);
65 npd = kmemdup(info, sizeof(struct s3c2410_hcd_info), GFP_KERNEL);
66 if (!npd)
67 printk(KERN_ERR "%s: no memory for platform data\n", __func__);
68
69 s3c_device_ohci.dev.platform_data = npd;
70} 65}
diff --git a/arch/arm/plat-samsung/dma.c b/arch/arm/plat-samsung/dma.c
index cb459dd9545..6143aa14768 100644
--- a/arch/arm/plat-samsung/dma.c
+++ b/arch/arm/plat-samsung/dma.c
@@ -41,7 +41,7 @@ struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
41 * irq? 41 * irq?
42*/ 42*/
43 43
44int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn) 44int s3c2410_dma_set_opfn(enum dma_ch channel, s3c2410_dma_opfn_t rtn)
45{ 45{
46 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); 46 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
47 47
@@ -56,7 +56,7 @@ int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
56} 56}
57EXPORT_SYMBOL(s3c2410_dma_set_opfn); 57EXPORT_SYMBOL(s3c2410_dma_set_opfn);
58 58
59int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn) 59int s3c2410_dma_set_buffdone_fn(enum dma_ch channel, s3c2410_dma_cbfn_t rtn)
60{ 60{
61 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); 61 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
62 62
@@ -71,7 +71,7 @@ int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
71} 71}
72EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn); 72EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
73 73
74int s3c2410_dma_setflags(unsigned int channel, unsigned int flags) 74int s3c2410_dma_setflags(enum dma_ch channel, unsigned int flags)
75{ 75{
76 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); 76 struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
77 77
diff --git a/arch/arm/plat-samsung/include/plat/backlight.h b/arch/arm/plat-samsung/include/plat/backlight.h
new file mode 100644
index 00000000000..51d8da846a6
--- /dev/null
+++ b/arch/arm/plat-samsung/include/plat/backlight.h
@@ -0,0 +1,26 @@
1/* linux/arch/arm/plat-samsung/include/plat/backlight.h
2 *
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.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 __ASM_PLAT_BACKLIGHT_H
12#define __ASM_PLAT_BACKLIGHT_H __FILE__
13
14/* samsung_bl_gpio_info - GPIO info for PWM Backlight control
15 * @no: GPIO number for PWM timer out
16 * @func: Special function of GPIO line for PWM timer
17 */
18struct samsung_bl_gpio_info {
19 int no;
20 int func;
21};
22
23extern void samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
24 struct platform_pwm_backlight_data *bl_data);
25
26#endif /* __ASM_PLAT_BACKLIGHT_H */
diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat-samsung/include/plat/clock.h
index 983c578b827..87d5b38a86f 100644
--- a/arch/arm/plat-samsung/include/plat/clock.h
+++ b/arch/arm/plat-samsung/include/plat/clock.h
@@ -10,6 +10,7 @@
10*/ 10*/
11 11
12#include <linux/spinlock.h> 12#include <linux/spinlock.h>
13#include <linux/clkdev.h>
13 14
14struct clk; 15struct clk;
15 16
@@ -40,6 +41,7 @@ struct clk {
40 struct module *owner; 41 struct module *owner;
41 struct clk *parent; 42 struct clk *parent;
42 const char *name; 43 const char *name;
44 const char *devname;
43 int id; 45 int id;
44 int usage; 46 int usage;
45 unsigned long rate; 47 unsigned long rate;
@@ -47,6 +49,7 @@ struct clk {
47 49
48 struct clk_ops *ops; 50 struct clk_ops *ops;
49 int (*enable)(struct clk *, int enable); 51 int (*enable)(struct clk *, int enable);
52 struct clk_lookup lookup;
50#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) 53#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
51 struct dentry *dent; /* For visible tree hierarchy */ 54 struct dentry *dent; /* For visible tree hierarchy */
52#endif 55#endif
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h
index 4af108ff411..e3b31c26ac3 100644
--- a/arch/arm/plat-samsung/include/plat/devs.h
+++ b/arch/arm/plat-samsung/include/plat/devs.h
@@ -12,6 +12,10 @@
12 * it under the terms of the GNU General Public License version 2 as 12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation. 13 * published by the Free Software Foundation.
14*/ 14*/
15
16#ifndef __PLAT_DEVS_H
17#define __PLAT_DEVS_H __FILE__
18
15#include <linux/platform_device.h> 19#include <linux/platform_device.h>
16 20
17struct s3c24xx_uart_resources { 21struct s3c24xx_uart_resources {
@@ -159,3 +163,5 @@ extern struct platform_device s3c_device_ac97;
159 */ 163 */
160extern void *s3c_set_platdata(void *pd, size_t pdsize, 164extern void *s3c_set_platdata(void *pd, size_t pdsize,
161 struct platform_device *pdev); 165 struct platform_device *pdev);
166
167#endif /* __PLAT_DEVS_H */
diff --git a/arch/arm/plat-samsung/include/plat/dma.h b/arch/arm/plat-samsung/include/plat/dma.h
index 2e8f8c6560d..8c273b7a6f5 100644
--- a/arch/arm/plat-samsung/include/plat/dma.h
+++ b/arch/arm/plat-samsung/include/plat/dma.h
@@ -42,6 +42,7 @@ struct s3c2410_dma_client {
42}; 42};
43 43
44struct s3c2410_dma_chan; 44struct s3c2410_dma_chan;
45enum dma_ch;
45 46
46/* s3c2410_dma_cbfn_t 47/* s3c2410_dma_cbfn_t
47 * 48 *
@@ -62,7 +63,7 @@ typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
62 * request a dma channel exclusivley 63 * request a dma channel exclusivley
63*/ 64*/
64 65
65extern int s3c2410_dma_request(unsigned int channel, 66extern int s3c2410_dma_request(enum dma_ch channel,
66 struct s3c2410_dma_client *, void *dev); 67 struct s3c2410_dma_client *, void *dev);
67 68
68 69
@@ -71,14 +72,14 @@ extern int s3c2410_dma_request(unsigned int channel,
71 * change the state of the dma channel 72 * change the state of the dma channel
72*/ 73*/
73 74
74extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op); 75extern int s3c2410_dma_ctrl(enum dma_ch channel, enum s3c2410_chan_op op);
75 76
76/* s3c2410_dma_setflags 77/* s3c2410_dma_setflags
77 * 78 *
78 * set the channel's flags to a given state 79 * set the channel's flags to a given state
79*/ 80*/
80 81
81extern int s3c2410_dma_setflags(unsigned int channel, 82extern int s3c2410_dma_setflags(enum dma_ch channel,
82 unsigned int flags); 83 unsigned int flags);
83 84
84/* s3c2410_dma_free 85/* s3c2410_dma_free
@@ -86,7 +87,7 @@ extern int s3c2410_dma_setflags(unsigned int channel,
86 * free the dma channel (will also abort any outstanding operations) 87 * free the dma channel (will also abort any outstanding operations)
87*/ 88*/
88 89
89extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *); 90extern int s3c2410_dma_free(enum dma_ch channel, struct s3c2410_dma_client *);
90 91
91/* s3c2410_dma_enqueue 92/* s3c2410_dma_enqueue
92 * 93 *
@@ -95,7 +96,7 @@ extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
95 * drained before the buffer is given to the DMA system. 96 * drained before the buffer is given to the DMA system.
96*/ 97*/
97 98
98extern int s3c2410_dma_enqueue(unsigned int channel, void *id, 99extern int s3c2410_dma_enqueue(enum dma_ch channel, void *id,
99 dma_addr_t data, int size); 100 dma_addr_t data, int size);
100 101
101/* s3c2410_dma_config 102/* s3c2410_dma_config
@@ -103,14 +104,14 @@ extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
103 * configure the dma channel 104 * configure the dma channel
104*/ 105*/
105 106
106extern int s3c2410_dma_config(unsigned int channel, int xferunit); 107extern int s3c2410_dma_config(enum dma_ch channel, int xferunit);
107 108
108/* s3c2410_dma_devconfig 109/* s3c2410_dma_devconfig
109 * 110 *
110 * configure the device we're talking to 111 * configure the device we're talking to
111*/ 112*/
112 113
113extern int s3c2410_dma_devconfig(unsigned int channel, 114extern int s3c2410_dma_devconfig(enum dma_ch channel,
114 enum s3c2410_dmasrc source, unsigned long devaddr); 115 enum s3c2410_dmasrc source, unsigned long devaddr);
115 116
116/* s3c2410_dma_getposition 117/* s3c2410_dma_getposition
@@ -118,10 +119,10 @@ extern int s3c2410_dma_devconfig(unsigned int channel,
118 * get the position that the dma transfer is currently at 119 * get the position that the dma transfer is currently at
119*/ 120*/
120 121
121extern int s3c2410_dma_getposition(unsigned int channel, 122extern int s3c2410_dma_getposition(enum dma_ch channel,
122 dma_addr_t *src, dma_addr_t *dest); 123 dma_addr_t *src, dma_addr_t *dest);
123 124
124extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn); 125extern int s3c2410_dma_set_opfn(enum dma_ch, s3c2410_dma_opfn_t rtn);
125extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn); 126extern int s3c2410_dma_set_buffdone_fn(enum dma_ch, s3c2410_dma_cbfn_t rtn);
126 127
127 128
diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
index 3ad8386599c..9a4e53d5296 100644
--- a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
+++ b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
@@ -140,7 +140,7 @@ extern unsigned s3c_gpio_getcfg_s3c64xx_4bit(struct s3c_gpio_chip *chip,
140 140
141/* Pull-{up,down} resistor controls. 141/* Pull-{up,down} resistor controls.
142 * 142 *
143 * S3C2410,S3C2440,S3C24A0 = Pull-UP, 143 * S3C2410,S3C2440 = Pull-UP,
144 * S3C2412,S3C2413 = Pull-Down 144 * S3C2412,S3C2413 = Pull-Down
145 * S3C6400,S3C6410 = Pull-Both [None,Down,Up,Undef] 145 * S3C6400,S3C6410 = Pull-Both [None,Down,Up,Undef]
146 * S3C2443 = Pull-Both [not same as S3C6400] 146 * S3C2443 = Pull-Both [not same as S3C6400]
diff --git a/arch/arm/plat-samsung/include/plat/iic.h b/arch/arm/plat-samsung/include/plat/iic.h
index 1543da8f85c..56b0059439e 100644
--- a/arch/arm/plat-samsung/include/plat/iic.h
+++ b/arch/arm/plat-samsung/include/plat/iic.h
@@ -71,4 +71,6 @@ extern void s3c_i2c5_cfg_gpio(struct platform_device *dev);
71extern void s3c_i2c6_cfg_gpio(struct platform_device *dev); 71extern void s3c_i2c6_cfg_gpio(struct platform_device *dev);
72extern void s3c_i2c7_cfg_gpio(struct platform_device *dev); 72extern void s3c_i2c7_cfg_gpio(struct platform_device *dev);
73 73
74extern struct s3c2410_platform_i2c default_i2c_data;
75
74#endif /* __ASM_ARCH_IIC_H */ 76#endif /* __ASM_ARCH_IIC_H */
diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h
index 7fb6f6be8c8..f6749916d19 100644
--- a/arch/arm/plat-samsung/include/plat/pm.h
+++ b/arch/arm/plat-samsung/include/plat/pm.h
@@ -42,7 +42,7 @@ extern unsigned long s3c_irqwake_eintallow;
42/* per-cpu sleep functions */ 42/* per-cpu sleep functions */
43 43
44extern void (*pm_cpu_prep)(void); 44extern void (*pm_cpu_prep)(void);
45extern void (*pm_cpu_sleep)(void); 45extern int (*pm_cpu_sleep)(unsigned long);
46 46
47/* Flags for PM Control */ 47/* Flags for PM Control */
48 48
@@ -52,10 +52,9 @@ extern unsigned char pm_uart_udivslot; /* true to save UART UDIVSLOT */
52 52
53/* from sleep.S */ 53/* from sleep.S */
54 54
55extern int s3c_cpu_save(unsigned long *saveblk, long);
56extern void s3c_cpu_resume(void); 55extern void s3c_cpu_resume(void);
57 56
58extern void s3c2410_cpu_suspend(void); 57extern int s3c2410_cpu_suspend(unsigned long);
59 58
60/* sleep save info */ 59/* sleep save info */
61 60
diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h
index 116edfe120b..bac36fa3bec 100644
--- a/arch/arm/plat-samsung/include/plat/regs-serial.h
+++ b/arch/arm/plat-samsung/include/plat/regs-serial.h
@@ -155,14 +155,6 @@
155#define S3C2410_UFSTAT_RXMASK (15<<0) 155#define S3C2410_UFSTAT_RXMASK (15<<0)
156#define S3C2410_UFSTAT_RXSHIFT (0) 156#define S3C2410_UFSTAT_RXSHIFT (0)
157 157
158/* UFSTAT S3C24A0 */
159#define S3C24A0_UFSTAT_TXFULL (1 << 14)
160#define S3C24A0_UFSTAT_RXFULL (1 << 6)
161#define S3C24A0_UFSTAT_TXMASK (63 << 8)
162#define S3C24A0_UFSTAT_TXSHIFT (8)
163#define S3C24A0_UFSTAT_RXMASK (63)
164#define S3C24A0_UFSTAT_RXSHIFT (0)
165
166/* UFSTAT S3C2443 same as S3C2440 */ 158/* UFSTAT S3C2443 same as S3C2440 */
167#define S3C2440_UFSTAT_TXFULL (1<<14) 159#define S3C2440_UFSTAT_TXFULL (1<<14)
168#define S3C2440_UFSTAT_RXFULL (1<<6) 160#define S3C2440_UFSTAT_RXFULL (1<<6)
diff --git a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
index 0ffe34a2155..4c16fa3621b 100644
--- a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
+++ b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
@@ -39,6 +39,7 @@ struct s3c64xx_spi_csinfo {
39 * @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6 39 * @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6
40 * @rx_lvl_offset: Depends on tx fifo_lvl field and bus number 40 * @rx_lvl_offset: Depends on tx fifo_lvl field and bus number
41 * @high_speed: If the controller supports HIGH_SPEED_EN bit 41 * @high_speed: If the controller supports HIGH_SPEED_EN bit
42 * @tx_st_done: Depends on tx fifo_lvl field
42 */ 43 */
43struct s3c64xx_spi_info { 44struct s3c64xx_spi_info {
44 int src_clk_nr; 45 int src_clk_nr;
@@ -53,6 +54,7 @@ struct s3c64xx_spi_info {
53 int fifo_lvl_mask; 54 int fifo_lvl_mask;
54 int rx_lvl_offset; 55 int rx_lvl_offset;
55 int high_speed; 56 int high_speed;
57 int tx_st_done;
56}; 58};
57 59
58/** 60/**
diff --git a/arch/arm/plat-samsung/irq-uart.c b/arch/arm/plat-samsung/irq-uart.c
index 32582c0958e..657405c481d 100644
--- a/arch/arm/plat-samsung/irq-uart.c
+++ b/arch/arm/plat-samsung/irq-uart.c
@@ -54,8 +54,15 @@ static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq)
54 54
55 gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base, 55 gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base,
56 handle_level_irq); 56 handle_level_irq);
57
58 if (!gc) {
59 pr_err("%s: irq_alloc_generic_chip for IRQ %u failed\n",
60 __func__, uirq->base_irq);
61 return;
62 }
63
57 ct = gc->chip_types; 64 ct = gc->chip_types;
58 ct->chip.irq_ack = irq_gc_ack; 65 ct->chip.irq_ack = irq_gc_ack_set_bit;
59 ct->chip.irq_mask = irq_gc_mask_set_bit; 66 ct->chip.irq_mask = irq_gc_mask_set_bit;
60 ct->chip.irq_unmask = irq_gc_mask_clr_bit; 67 ct->chip.irq_unmask = irq_gc_mask_clr_bit;
61 ct->regs.ack = S3C64XX_UINTP; 68 ct->regs.ack = S3C64XX_UINTP;
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c
index a607546ddbd..f714d060370 100644
--- a/arch/arm/plat-samsung/irq-vic-timer.c
+++ b/arch/arm/plat-samsung/irq-vic-timer.c
@@ -54,6 +54,13 @@ void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)
54 54
55 s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq, 55 s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,
56 S3C64XX_TINT_CSTAT, handle_level_irq); 56 S3C64XX_TINT_CSTAT, handle_level_irq);
57
58 if (!s3c_tgc) {
59 pr_err("%s: irq_alloc_generic_chip for IRQ %d failed\n",
60 __func__, timer_irq);
61 return;
62 }
63
57 ct = s3c_tgc->chip_types; 64 ct = s3c_tgc->chip_types;
58 ct->chip.irq_mask = irq_gc_mask_clr_bit; 65 ct->chip.irq_mask = irq_gc_mask_clr_bit;
59 ct->chip.irq_unmask = irq_gc_mask_set_bit; 66 ct->chip.irq_unmask = irq_gc_mask_set_bit;
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index 6b733fafe7c..3cbd62666b1 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -72,7 +72,7 @@ static void s3c_pm_run_sysram(run_fn_t fn, u32 *arg)
72 72
73static u32 *s3c_pm_countram(struct resource *res, u32 *val) 73static u32 *s3c_pm_countram(struct resource *res, u32 *val)
74{ 74{
75 u32 size = (u32)(res->end - res->start)+1; 75 u32 size = (u32)resource_size(res);
76 76
77 size += CHECK_CHUNKSIZE-1; 77 size += CHECK_CHUNKSIZE-1;
78 size /= CHECK_CHUNKSIZE; 78 size /= CHECK_CHUNKSIZE;
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c
index 5c0a440d6e1..5fa1742d019 100644
--- a/arch/arm/plat-samsung/pm.c
+++ b/arch/arm/plat-samsung/pm.c
@@ -20,6 +20,7 @@
20#include <linux/io.h> 20#include <linux/io.h>
21 21
22#include <asm/cacheflush.h> 22#include <asm/cacheflush.h>
23#include <asm/suspend.h>
23#include <mach/hardware.h> 24#include <mach/hardware.h>
24#include <mach/map.h> 25#include <mach/map.h>
25 26
@@ -231,7 +232,7 @@ static void __maybe_unused s3c_pm_show_resume_irqs(int start,
231 232
232 233
233void (*pm_cpu_prep)(void); 234void (*pm_cpu_prep)(void);
234void (*pm_cpu_sleep)(void); 235int (*pm_cpu_sleep)(unsigned long);
235 236
236#define any_allowed(mask, allow) (((mask) & (allow)) != (allow)) 237#define any_allowed(mask, allow) (((mask) & (allow)) != (allow))
237 238
@@ -294,15 +295,11 @@ static int s3c_pm_enter(suspend_state_t state)
294 295
295 s3c_pm_arch_stop_clocks(); 296 s3c_pm_arch_stop_clocks();
296 297
297 /* s3c_cpu_save will also act as our return point from when 298 /* this will also act as our return point from when
298 * we resume as it saves its own register state and restores it 299 * we resume as it saves its own register state and restores it
299 * during the resume. */ 300 * during the resume. */
300 301
301 s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET); 302 cpu_suspend(0, pm_cpu_sleep);
302
303 /* restore the cpu state using the kernel's cpu init code. */
304
305 cpu_init();
306 303
307 /* restore the system state */ 304 /* restore the system state */
308 305
diff --git a/arch/arm/plat-samsung/pwm-clock.c b/arch/arm/plat-samsung/pwm-clock.c
index 46c9381e083..f1bba88ed2f 100644
--- a/arch/arm/plat-samsung/pwm-clock.c
+++ b/arch/arm/plat-samsung/pwm-clock.c
@@ -268,6 +268,7 @@ static struct pwm_tdiv_clk clk_timer_tdiv[] = {
268 [0] = { 268 [0] = {
269 .clk = { 269 .clk = {
270 .name = "pwm-tdiv", 270 .name = "pwm-tdiv",
271 .devname = "s3c24xx-pwm.0",
271 .ops = &clk_tdiv_ops, 272 .ops = &clk_tdiv_ops,
272 .parent = &clk_timer_scaler[0], 273 .parent = &clk_timer_scaler[0],
273 }, 274 },
@@ -275,6 +276,7 @@ static struct pwm_tdiv_clk clk_timer_tdiv[] = {
275 [1] = { 276 [1] = {
276 .clk = { 277 .clk = {
277 .name = "pwm-tdiv", 278 .name = "pwm-tdiv",
279 .devname = "s3c24xx-pwm.1",
278 .ops = &clk_tdiv_ops, 280 .ops = &clk_tdiv_ops,
279 .parent = &clk_timer_scaler[0], 281 .parent = &clk_timer_scaler[0],
280 } 282 }
@@ -282,6 +284,7 @@ static struct pwm_tdiv_clk clk_timer_tdiv[] = {
282 [2] = { 284 [2] = {
283 .clk = { 285 .clk = {
284 .name = "pwm-tdiv", 286 .name = "pwm-tdiv",
287 .devname = "s3c24xx-pwm.2",
285 .ops = &clk_tdiv_ops, 288 .ops = &clk_tdiv_ops,
286 .parent = &clk_timer_scaler[1], 289 .parent = &clk_timer_scaler[1],
287 }, 290 },
@@ -289,6 +292,7 @@ static struct pwm_tdiv_clk clk_timer_tdiv[] = {
289 [3] = { 292 [3] = {
290 .clk = { 293 .clk = {
291 .name = "pwm-tdiv", 294 .name = "pwm-tdiv",
295 .devname = "s3c24xx-pwm.3",
292 .ops = &clk_tdiv_ops, 296 .ops = &clk_tdiv_ops,
293 .parent = &clk_timer_scaler[1], 297 .parent = &clk_timer_scaler[1],
294 }, 298 },
@@ -296,6 +300,7 @@ static struct pwm_tdiv_clk clk_timer_tdiv[] = {
296 [4] = { 300 [4] = {
297 .clk = { 301 .clk = {
298 .name = "pwm-tdiv", 302 .name = "pwm-tdiv",
303 .devname = "s3c24xx-pwm.4",
299 .ops = &clk_tdiv_ops, 304 .ops = &clk_tdiv_ops,
300 .parent = &clk_timer_scaler[1], 305 .parent = &clk_timer_scaler[1],
301 }, 306 },
@@ -361,26 +366,31 @@ static struct clk_ops clk_tin_ops = {
361static struct clk clk_tin[] = { 366static struct clk clk_tin[] = {
362 [0] = { 367 [0] = {
363 .name = "pwm-tin", 368 .name = "pwm-tin",
369 .devname = "s3c24xx-pwm.0",
364 .id = 0, 370 .id = 0,
365 .ops = &clk_tin_ops, 371 .ops = &clk_tin_ops,
366 }, 372 },
367 [1] = { 373 [1] = {
368 .name = "pwm-tin", 374 .name = "pwm-tin",
375 .devname = "s3c24xx-pwm.1",
369 .id = 1, 376 .id = 1,
370 .ops = &clk_tin_ops, 377 .ops = &clk_tin_ops,
371 }, 378 },
372 [2] = { 379 [2] = {
373 .name = "pwm-tin", 380 .name = "pwm-tin",
381 .devname = "s3c24xx-pwm.2",
374 .id = 2, 382 .id = 2,
375 .ops = &clk_tin_ops, 383 .ops = &clk_tin_ops,
376 }, 384 },
377 [3] = { 385 [3] = {
378 .name = "pwm-tin", 386 .name = "pwm-tin",
387 .devname = "s3c24xx-pwm.3",
379 .id = 3, 388 .id = 3,
380 .ops = &clk_tin_ops, 389 .ops = &clk_tin_ops,
381 }, 390 },
382 [4] = { 391 [4] = {
383 .name = "pwm-tin", 392 .name = "pwm-tin",
393 .devname = "s3c24xx-pwm.4",
384 .id = 4, 394 .id = 4,
385 .ops = &clk_tin_ops, 395 .ops = &clk_tin_ops,
386 }, 396 },
diff --git a/arch/arm/plat-samsung/time.c b/arch/arm/plat-samsung/time.c
index 2231d80ad81..e3bb806bbaf 100644
--- a/arch/arm/plat-samsung/time.c
+++ b/arch/arm/plat-samsung/time.c
@@ -259,6 +259,8 @@ static void __init s3c2410_timer_resources(void)
259 clk_enable(timerclk); 259 clk_enable(timerclk);
260 260
261 if (!use_tclk1_12()) { 261 if (!use_tclk1_12()) {
262 tmpdev.id = 4;
263 tmpdev.dev.init_name = "s3c24xx-pwm.4";
262 tin = clk_get(&tmpdev.dev, "pwm-tin"); 264 tin = clk_get(&tmpdev.dev, "pwm-tin");
263 if (IS_ERR(tin)) 265 if (IS_ERR(tin))
264 panic("failed to get pwm-tin clock for system timer"); 266 panic("failed to get pwm-tin clock for system timer");