diff options
Diffstat (limited to 'arch/arm/plat-samsung')
25 files changed, 683 insertions, 22 deletions
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index 7c0bde781167..dcd6eff4ee53 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig | |||
@@ -180,6 +180,31 @@ config S3C_DEV_I2C2 | |||
180 | help | 180 | help |
181 | Compile in platform device definitions for I2C channel 2 | 181 | Compile in platform device definitions for I2C channel 2 |
182 | 182 | ||
183 | config S3C_DEV_I2C3 | ||
184 | bool | ||
185 | help | ||
186 | Compile in platform device definition for I2C controller 3 | ||
187 | |||
188 | config S3C_DEV_I2C4 | ||
189 | bool | ||
190 | help | ||
191 | Compile in platform device definition for I2C controller 4 | ||
192 | |||
193 | config S3C_DEV_I2C5 | ||
194 | bool | ||
195 | help | ||
196 | Compile in platform device definition for I2C controller 5 | ||
197 | |||
198 | config S3C_DEV_I2C6 | ||
199 | bool | ||
200 | help | ||
201 | Compile in platform device definition for I2C controller 6 | ||
202 | |||
203 | config S3C_DEV_I2C7 | ||
204 | bool | ||
205 | help | ||
206 | Compile in platform device definition for I2C controller 7 | ||
207 | |||
183 | config S3C_DEV_FB | 208 | config S3C_DEV_FB |
184 | bool | 209 | bool |
185 | help | 210 | help |
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 4d8ff923207a..afcce474af8e 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile | |||
@@ -40,6 +40,11 @@ obj-$(CONFIG_S3C_DEV_HWMON) += dev-hwmon.o | |||
40 | obj-y += dev-i2c0.o | 40 | obj-y += dev-i2c0.o |
41 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o | 41 | obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o |
42 | obj-$(CONFIG_S3C_DEV_I2C2) += dev-i2c2.o | 42 | obj-$(CONFIG_S3C_DEV_I2C2) += dev-i2c2.o |
43 | obj-$(CONFIG_S3C_DEV_I2C3) += dev-i2c3.o | ||
44 | obj-$(CONFIG_S3C_DEV_I2C4) += dev-i2c4.o | ||
45 | obj-$(CONFIG_S3C_DEV_I2C5) += dev-i2c5.o | ||
46 | obj-$(CONFIG_S3C_DEV_I2C6) += dev-i2c6.o | ||
47 | obj-$(CONFIG_S3C_DEV_I2C7) += dev-i2c7.o | ||
43 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o | 48 | obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o |
44 | obj-y += dev-uart.o | 49 | obj-y += dev-uart.o |
45 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o | 50 | obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o |
diff --git a/arch/arm/plat-samsung/dev-hsmmc.c b/arch/arm/plat-samsung/dev-hsmmc.c index 9d2be0941410..db7a65c7f127 100644 --- a/arch/arm/plat-samsung/dev-hsmmc.c +++ b/arch/arm/plat-samsung/dev-hsmmc.c | |||
@@ -41,6 +41,7 @@ struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = { | |||
41 | .max_width = 4, | 41 | .max_width = 4, |
42 | .host_caps = (MMC_CAP_4_BIT_DATA | | 42 | .host_caps = (MMC_CAP_4_BIT_DATA | |
43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
44 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | struct platform_device s3c_device_hsmmc0 = { | 47 | struct platform_device s3c_device_hsmmc0 = { |
@@ -59,17 +60,20 @@ void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd) | |||
59 | { | 60 | { |
60 | struct s3c_sdhci_platdata *set = &s3c_hsmmc0_def_platdata; | 61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc0_def_platdata; |
61 | 62 | ||
62 | set->max_width = pd->max_width; | ||
63 | set->cd_type = pd->cd_type; | 63 | set->cd_type = pd->cd_type; |
64 | set->ext_cd_init = pd->ext_cd_init; | 64 | set->ext_cd_init = pd->ext_cd_init; |
65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
66 | set->ext_cd_gpio = pd->ext_cd_gpio; | 66 | set->ext_cd_gpio = pd->ext_cd_gpio; |
67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
68 | 68 | ||
69 | if (pd->max_width) | ||
70 | set->max_width = pd->max_width; | ||
69 | if (pd->cfg_gpio) | 71 | if (pd->cfg_gpio) |
70 | set->cfg_gpio = pd->cfg_gpio; | 72 | set->cfg_gpio = pd->cfg_gpio; |
71 | if (pd->cfg_card) | 73 | if (pd->cfg_card) |
72 | set->cfg_card = pd->cfg_card; | 74 | set->cfg_card = pd->cfg_card; |
73 | if (pd->host_caps) | 75 | if (pd->host_caps) |
74 | set->host_caps = pd->host_caps; | 76 | set->host_caps |= pd->host_caps; |
77 | if (pd->clk_type) | ||
78 | set->clk_type = pd->clk_type; | ||
75 | } | 79 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc1.c b/arch/arm/plat-samsung/dev-hsmmc1.c index a6c8295840af..2497321f08d7 100644 --- a/arch/arm/plat-samsung/dev-hsmmc1.c +++ b/arch/arm/plat-samsung/dev-hsmmc1.c | |||
@@ -41,6 +41,7 @@ struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata = { | |||
41 | .max_width = 4, | 41 | .max_width = 4, |
42 | .host_caps = (MMC_CAP_4_BIT_DATA | | 42 | .host_caps = (MMC_CAP_4_BIT_DATA | |
43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 43 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
44 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | struct platform_device s3c_device_hsmmc1 = { | 47 | struct platform_device s3c_device_hsmmc1 = { |
@@ -59,17 +60,20 @@ void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd) | |||
59 | { | 60 | { |
60 | struct s3c_sdhci_platdata *set = &s3c_hsmmc1_def_platdata; | 61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc1_def_platdata; |
61 | 62 | ||
62 | set->max_width = pd->max_width; | ||
63 | set->cd_type = pd->cd_type; | 63 | set->cd_type = pd->cd_type; |
64 | set->ext_cd_init = pd->ext_cd_init; | 64 | set->ext_cd_init = pd->ext_cd_init; |
65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 65 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
66 | set->ext_cd_gpio = pd->ext_cd_gpio; | 66 | set->ext_cd_gpio = pd->ext_cd_gpio; |
67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 67 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
68 | 68 | ||
69 | if (pd->max_width) | ||
70 | set->max_width = pd->max_width; | ||
69 | if (pd->cfg_gpio) | 71 | if (pd->cfg_gpio) |
70 | set->cfg_gpio = pd->cfg_gpio; | 72 | set->cfg_gpio = pd->cfg_gpio; |
71 | if (pd->cfg_card) | 73 | if (pd->cfg_card) |
72 | set->cfg_card = pd->cfg_card; | 74 | set->cfg_card = pd->cfg_card; |
73 | if (pd->host_caps) | 75 | if (pd->host_caps) |
74 | set->host_caps = pd->host_caps; | 76 | set->host_caps |= pd->host_caps; |
77 | if (pd->clk_type) | ||
78 | set->clk_type = pd->clk_type; | ||
75 | } | 79 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc2.c b/arch/arm/plat-samsung/dev-hsmmc2.c index cb0d7143381a..f60aedba417c 100644 --- a/arch/arm/plat-samsung/dev-hsmmc2.c +++ b/arch/arm/plat-samsung/dev-hsmmc2.c | |||
@@ -42,6 +42,7 @@ struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = { | |||
42 | .max_width = 4, | 42 | .max_width = 4, |
43 | .host_caps = (MMC_CAP_4_BIT_DATA | | 43 | .host_caps = (MMC_CAP_4_BIT_DATA | |
44 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 44 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
45 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
45 | }; | 46 | }; |
46 | 47 | ||
47 | struct platform_device s3c_device_hsmmc2 = { | 48 | struct platform_device s3c_device_hsmmc2 = { |
@@ -60,17 +61,20 @@ void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd) | |||
60 | { | 61 | { |
61 | struct s3c_sdhci_platdata *set = &s3c_hsmmc2_def_platdata; | 62 | struct s3c_sdhci_platdata *set = &s3c_hsmmc2_def_platdata; |
62 | 63 | ||
63 | set->max_width = pd->max_width; | ||
64 | set->cd_type = pd->cd_type; | 64 | set->cd_type = pd->cd_type; |
65 | set->ext_cd_init = pd->ext_cd_init; | 65 | set->ext_cd_init = pd->ext_cd_init; |
66 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 66 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
67 | set->ext_cd_gpio = pd->ext_cd_gpio; | 67 | set->ext_cd_gpio = pd->ext_cd_gpio; |
68 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 68 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
69 | 69 | ||
70 | if (pd->max_width) | ||
71 | set->max_width = pd->max_width; | ||
70 | if (pd->cfg_gpio) | 72 | if (pd->cfg_gpio) |
71 | set->cfg_gpio = pd->cfg_gpio; | 73 | set->cfg_gpio = pd->cfg_gpio; |
72 | if (pd->cfg_card) | 74 | if (pd->cfg_card) |
73 | set->cfg_card = pd->cfg_card; | 75 | set->cfg_card = pd->cfg_card; |
74 | if (pd->host_caps) | 76 | if (pd->host_caps) |
75 | set->host_caps = pd->host_caps; | 77 | set->host_caps |= pd->host_caps; |
78 | if (pd->clk_type) | ||
79 | set->clk_type = pd->clk_type; | ||
76 | } | 80 | } |
diff --git a/arch/arm/plat-samsung/dev-hsmmc3.c b/arch/arm/plat-samsung/dev-hsmmc3.c index 85aaf0f2842f..ede776f20e62 100644 --- a/arch/arm/plat-samsung/dev-hsmmc3.c +++ b/arch/arm/plat-samsung/dev-hsmmc3.c | |||
@@ -33,8 +33,8 @@ static struct resource s3c_hsmmc3_resource[] = { | |||
33 | .flags = IORESOURCE_MEM, | 33 | .flags = IORESOURCE_MEM, |
34 | }, | 34 | }, |
35 | [1] = { | 35 | [1] = { |
36 | .start = IRQ_MMC3, | 36 | .start = IRQ_HSMMC3, |
37 | .end = IRQ_MMC3, | 37 | .end = IRQ_HSMMC3, |
38 | .flags = IORESOURCE_IRQ, | 38 | .flags = IORESOURCE_IRQ, |
39 | } | 39 | } |
40 | }; | 40 | }; |
@@ -45,6 +45,7 @@ struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata = { | |||
45 | .max_width = 4, | 45 | .max_width = 4, |
46 | .host_caps = (MMC_CAP_4_BIT_DATA | | 46 | .host_caps = (MMC_CAP_4_BIT_DATA | |
47 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), | 47 | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), |
48 | .clk_type = S3C_SDHCI_CLK_DIV_INTERNAL, | ||
48 | }; | 49 | }; |
49 | 50 | ||
50 | struct platform_device s3c_device_hsmmc3 = { | 51 | struct platform_device s3c_device_hsmmc3 = { |
@@ -63,15 +64,20 @@ void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd) | |||
63 | { | 64 | { |
64 | struct s3c_sdhci_platdata *set = &s3c_hsmmc3_def_platdata; | 65 | struct s3c_sdhci_platdata *set = &s3c_hsmmc3_def_platdata; |
65 | 66 | ||
66 | set->max_width = pd->max_width; | ||
67 | set->cd_type = pd->cd_type; | 67 | set->cd_type = pd->cd_type; |
68 | set->ext_cd_init = pd->ext_cd_init; | 68 | set->ext_cd_init = pd->ext_cd_init; |
69 | set->ext_cd_cleanup = pd->ext_cd_cleanup; | 69 | set->ext_cd_cleanup = pd->ext_cd_cleanup; |
70 | set->ext_cd_gpio = pd->ext_cd_gpio; | 70 | set->ext_cd_gpio = pd->ext_cd_gpio; |
71 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; | 71 | set->ext_cd_gpio_invert = pd->ext_cd_gpio_invert; |
72 | 72 | ||
73 | if (pd->max_width) | ||
74 | set->max_width = pd->max_width; | ||
73 | if (pd->cfg_gpio) | 75 | if (pd->cfg_gpio) |
74 | set->cfg_gpio = pd->cfg_gpio; | 76 | set->cfg_gpio = pd->cfg_gpio; |
75 | if (pd->cfg_card) | 77 | if (pd->cfg_card) |
76 | set->cfg_card = pd->cfg_card; | 78 | set->cfg_card = pd->cfg_card; |
79 | if (pd->host_caps) | ||
80 | set->host_caps |= pd->host_caps; | ||
81 | if (pd->clk_type) | ||
82 | set->clk_type = pd->clk_type; | ||
77 | } | 83 | } |
diff --git a/arch/arm/plat-samsung/dev-i2c2.c b/arch/arm/plat-samsung/dev-i2c2.c index 07036dee09e7..ff4ba69b6830 100644 --- a/arch/arm/plat-samsung/dev-i2c2.c +++ b/arch/arm/plat-samsung/dev-i2c2.c | |||
@@ -32,8 +32,8 @@ static struct resource s3c_i2c_resource[] = { | |||
32 | .flags = IORESOURCE_MEM, | 32 | .flags = IORESOURCE_MEM, |
33 | }, | 33 | }, |
34 | [1] = { | 34 | [1] = { |
35 | .start = IRQ_CAN0, | 35 | .start = IRQ_IIC2, |
36 | .end = IRQ_CAN0, | 36 | .end = IRQ_IIC2, |
37 | .flags = IORESOURCE_IRQ, | 37 | .flags = IORESOURCE_IRQ, |
38 | }, | 38 | }, |
39 | }; | 39 | }; |
diff --git a/arch/arm/plat-samsung/dev-i2c3.c b/arch/arm/plat-samsung/dev-i2c3.c new file mode 100644 index 000000000000..8586a10014b7 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c3.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c3.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
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/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC3, | ||
29 | .end = S3C_PA_IIC3 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC3, | ||
34 | .end = IRQ_IIC3, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c3 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 3, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static 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 | |||
54 | void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data3; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
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 | |||
67 | s3c_device_i2c3.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c4.c b/arch/arm/plat-samsung/dev-i2c4.c new file mode 100644 index 000000000000..df2159e2daa6 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c4.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c4.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
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/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC4, | ||
29 | .end = S3C_PA_IIC4 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC4, | ||
34 | .end = IRQ_IIC4, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c4 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 4, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static 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 | |||
54 | void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data4; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
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 | |||
67 | s3c_device_i2c4.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c5.c b/arch/arm/plat-samsung/dev-i2c5.c new file mode 100644 index 000000000000..0499c2c3877b --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c5.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c3.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 3 | ||
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/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC5, | ||
29 | .end = S3C_PA_IIC5 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC5, | ||
34 | .end = IRQ_IIC5, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c5 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 5, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static 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 | |||
54 | void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data5; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
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 | |||
67 | s3c_device_i2c5.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c6.c b/arch/arm/plat-samsung/dev-i2c6.c new file mode 100644 index 000000000000..4083108908a8 --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c6.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c6.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 6 | ||
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/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC6, | ||
29 | .end = S3C_PA_IIC6 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC6, | ||
34 | .end = IRQ_IIC6, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c6 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 6, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static 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 | |||
54 | void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data6; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
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 | |||
67 | s3c_device_i2c6.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/dev-i2c7.c b/arch/arm/plat-samsung/dev-i2c7.c new file mode 100644 index 000000000000..1182451d7dce --- /dev/null +++ b/arch/arm/plat-samsung/dev-i2c7.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* linux/arch/arm/plat-samsung/dev-i2c7.c | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S5P series device definition for i2c device 7 | ||
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/gfp.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | |||
18 | #include <mach/irqs.h> | ||
19 | #include <mach/map.h> | ||
20 | |||
21 | #include <plat/regs-iic.h> | ||
22 | #include <plat/iic.h> | ||
23 | #include <plat/devs.h> | ||
24 | #include <plat/cpu.h> | ||
25 | |||
26 | static struct resource s3c_i2c_resource[] = { | ||
27 | [0] = { | ||
28 | .start = S3C_PA_IIC7, | ||
29 | .end = S3C_PA_IIC7 + SZ_4K - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .start = IRQ_IIC7, | ||
34 | .end = IRQ_IIC7, | ||
35 | .flags = IORESOURCE_IRQ, | ||
36 | }, | ||
37 | }; | ||
38 | |||
39 | struct platform_device s3c_device_i2c7 = { | ||
40 | .name = "s3c2440-i2c", | ||
41 | .id = 7, | ||
42 | .num_resources = ARRAY_SIZE(s3c_i2c_resource), | ||
43 | .resource = s3c_i2c_resource, | ||
44 | }; | ||
45 | |||
46 | static 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 | |||
54 | void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd) | ||
55 | { | ||
56 | struct s3c2410_platform_i2c *npd; | ||
57 | |||
58 | if (!pd) | ||
59 | pd = &default_i2c_data7; | ||
60 | |||
61 | npd = kmemdup(pd, sizeof(struct s3c2410_platform_i2c), GFP_KERNEL); | ||
62 | if (!npd) | ||
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 | |||
67 | s3c_device_i2c7.dev.platform_data = npd; | ||
68 | } | ||
diff --git a/arch/arm/plat-samsung/gpio-config.c b/arch/arm/plat-samsung/gpio-config.c index e3d41eaed1ff..b732b773b9af 100644 --- a/arch/arm/plat-samsung/gpio-config.c +++ b/arch/arm/plat-samsung/gpio-config.c | |||
@@ -41,6 +41,37 @@ int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) | |||
41 | } | 41 | } |
42 | EXPORT_SYMBOL(s3c_gpio_cfgpin); | 42 | EXPORT_SYMBOL(s3c_gpio_cfgpin); |
43 | 43 | ||
44 | int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, | ||
45 | unsigned int cfg) | ||
46 | { | ||
47 | int ret; | ||
48 | |||
49 | for (; nr > 0; nr--, start++) { | ||
50 | ret = s3c_gpio_cfgpin(start, cfg); | ||
51 | if (ret != 0) | ||
52 | return ret; | ||
53 | } | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | EXPORT_SYMBOL_GPL(s3c_gpio_cfgpin_range); | ||
58 | |||
59 | int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, | ||
60 | unsigned int cfg, s3c_gpio_pull_t pull) | ||
61 | { | ||
62 | int ret; | ||
63 | |||
64 | for (; nr > 0; nr--, start++) { | ||
65 | s3c_gpio_setpull(start, pull); | ||
66 | ret = s3c_gpio_cfgpin(start, cfg); | ||
67 | if (ret != 0) | ||
68 | return ret; | ||
69 | } | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(s3c_gpio_cfgall_range); | ||
74 | |||
44 | unsigned s3c_gpio_getcfg(unsigned int pin) | 75 | unsigned s3c_gpio_getcfg(unsigned int pin) |
45 | { | 76 | { |
46 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); | 77 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); |
@@ -80,6 +111,25 @@ int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull) | |||
80 | } | 111 | } |
81 | EXPORT_SYMBOL(s3c_gpio_setpull); | 112 | EXPORT_SYMBOL(s3c_gpio_setpull); |
82 | 113 | ||
114 | s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin) | ||
115 | { | ||
116 | struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin); | ||
117 | unsigned long flags; | ||
118 | int offset; | ||
119 | u32 pup = 0; | ||
120 | |||
121 | if (chip) { | ||
122 | offset = pin - chip->chip.base; | ||
123 | |||
124 | s3c_gpio_lock(chip, flags); | ||
125 | pup = s3c_gpio_do_getpull(chip, offset); | ||
126 | s3c_gpio_unlock(chip, flags); | ||
127 | } | ||
128 | |||
129 | return (__force s3c_gpio_pull_t)pup; | ||
130 | } | ||
131 | EXPORT_SYMBOL(s3c_gpio_getpull); | ||
132 | |||
83 | #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX | 133 | #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX |
84 | int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip, | 134 | int s3c_gpio_setcfg_s3c24xx_a(struct s3c_gpio_chip *chip, |
85 | unsigned int off, unsigned int cfg) | 135 | unsigned int off, unsigned int cfg) |
diff --git a/arch/arm/plat-samsung/gpio.c b/arch/arm/plat-samsung/gpio.c index b83a83351cea..7743c4b8b2fb 100644 --- a/arch/arm/plat-samsung/gpio.c +++ b/arch/arm/plat-samsung/gpio.c | |||
@@ -157,3 +157,11 @@ __init void s3c_gpiolib_add(struct s3c_gpio_chip *chip) | |||
157 | if (ret >= 0) | 157 | if (ret >= 0) |
158 | s3c_gpiolib_track(chip); | 158 | s3c_gpiolib_track(chip); |
159 | } | 159 | } |
160 | |||
161 | int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset) | ||
162 | { | ||
163 | struct s3c_gpio_chip *s3c_chip = container_of(chip, | ||
164 | struct s3c_gpio_chip, chip); | ||
165 | |||
166 | return s3c_chip->irq_base + offset; | ||
167 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/audio.h b/arch/arm/plat-samsung/include/plat/audio.h index e32f9edfd4b7..7712ff6336f4 100644 --- a/arch/arm/plat-samsung/include/plat/audio.h +++ b/arch/arm/plat-samsung/include/plat/audio.h | |||
@@ -16,6 +16,15 @@ | |||
16 | #define S3C64XX_AC97_GPE 1 | 16 | #define S3C64XX_AC97_GPE 1 |
17 | extern void s3c64xx_ac97_setup_gpio(int); | 17 | extern void s3c64xx_ac97_setup_gpio(int); |
18 | 18 | ||
19 | /* | ||
20 | * The machine init code calls s5p*_spdif_setup_gpio with | ||
21 | * one of these defines in order to select appropriate bank | ||
22 | * of GPIO for S/PDIF pins | ||
23 | */ | ||
24 | #define S5PC100_SPDIF_GPD 0 | ||
25 | #define S5PC100_SPDIF_GPG3 1 | ||
26 | extern void s5pc100_spdif_setup_gpio(int); | ||
27 | |||
19 | /** | 28 | /** |
20 | * struct s3c_audio_pdata - common platform data for audio device drivers | 29 | * struct s3c_audio_pdata - common platform data for audio device drivers |
21 | * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode | 30 | * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode |
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h index c8b94279bad1..2d82a6cb1444 100644 --- a/arch/arm/plat-samsung/include/plat/devs.h +++ b/arch/arm/plat-samsung/include/plat/devs.h | |||
@@ -48,6 +48,11 @@ extern struct platform_device s3c_device_wdt; | |||
48 | extern struct platform_device s3c_device_i2c0; | 48 | extern struct platform_device s3c_device_i2c0; |
49 | extern struct platform_device s3c_device_i2c1; | 49 | extern struct platform_device s3c_device_i2c1; |
50 | extern struct platform_device s3c_device_i2c2; | 50 | extern struct platform_device s3c_device_i2c2; |
51 | extern struct platform_device s3c_device_i2c3; | ||
52 | extern struct platform_device s3c_device_i2c4; | ||
53 | extern struct platform_device s3c_device_i2c5; | ||
54 | extern struct platform_device s3c_device_i2c6; | ||
55 | extern struct platform_device s3c_device_i2c7; | ||
51 | extern struct platform_device s3c_device_rtc; | 56 | extern struct platform_device s3c_device_rtc; |
52 | extern struct platform_device s3c_device_adc; | 57 | extern struct platform_device s3c_device_adc; |
53 | extern struct platform_device s3c_device_sdi; | 58 | extern struct platform_device s3c_device_sdi; |
@@ -89,6 +94,7 @@ extern struct platform_device s5pv210_device_pcm2; | |||
89 | extern struct platform_device s5pv210_device_iis0; | 94 | extern struct platform_device s5pv210_device_iis0; |
90 | extern struct platform_device s5pv210_device_iis1; | 95 | extern struct platform_device s5pv210_device_iis1; |
91 | extern struct platform_device s5pv210_device_iis2; | 96 | extern struct platform_device s5pv210_device_iis2; |
97 | extern struct platform_device s5pv210_device_spdif; | ||
92 | 98 | ||
93 | extern struct platform_device s5p6442_device_pcm0; | 99 | extern struct platform_device s5p6442_device_pcm0; |
94 | extern struct platform_device s5p6442_device_pcm1; | 100 | extern struct platform_device s5p6442_device_pcm1; |
@@ -108,6 +114,7 @@ extern struct platform_device s5pc100_device_pcm1; | |||
108 | extern struct platform_device s5pc100_device_iis0; | 114 | extern struct platform_device s5pc100_device_iis0; |
109 | extern struct platform_device s5pc100_device_iis1; | 115 | extern struct platform_device s5pc100_device_iis1; |
110 | extern struct platform_device s5pc100_device_iis2; | 116 | extern struct platform_device s5pc100_device_iis2; |
117 | extern struct platform_device s5pc100_device_spdif; | ||
111 | 118 | ||
112 | extern struct platform_device samsung_device_keypad; | 119 | extern struct platform_device samsung_device_keypad; |
113 | 120 | ||
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 3e21c75feefa..8fd65d8b5863 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h | |||
@@ -42,6 +42,12 @@ static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip, | |||
42 | return (chip->config->set_pull)(chip, off, pull); | 42 | return (chip->config->set_pull)(chip, off, pull); |
43 | } | 43 | } |
44 | 44 | ||
45 | static inline s3c_gpio_pull_t s3c_gpio_do_getpull(struct s3c_gpio_chip *chip, | ||
46 | unsigned int off) | ||
47 | { | ||
48 | return chip->config->get_pull(chip, off); | ||
49 | } | ||
50 | |||
45 | /** | 51 | /** |
46 | * s3c_gpio_setcfg_s3c24xx - S3C24XX style GPIO configuration. | 52 | * s3c_gpio_setcfg_s3c24xx - S3C24XX style GPIO configuration. |
47 | * @chip: The gpio chip that is being configured. | 53 | * @chip: The gpio chip that is being configured. |
diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg.h b/arch/arm/plat-samsung/include/plat/gpio-cfg.h index 1c6b92947c5d..e4b5cf126fa9 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-cfg.h +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg.h | |||
@@ -108,6 +108,19 @@ extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to); | |||
108 | */ | 108 | */ |
109 | extern unsigned s3c_gpio_getcfg(unsigned int pin); | 109 | extern unsigned s3c_gpio_getcfg(unsigned int pin); |
110 | 110 | ||
111 | /** | ||
112 | * s3c_gpio_cfgpin_range() - Change the GPIO function for configuring pin range | ||
113 | * @start: The pin number to start at | ||
114 | * @nr: The number of pins to configure from @start. | ||
115 | * @cfg: The configuration for the pin's function | ||
116 | * | ||
117 | * Call s3c_gpio_cfgpin() for the @nr pins starting at @start. | ||
118 | * | ||
119 | * @sa s3c_gpio_cfgpin. | ||
120 | */ | ||
121 | extern int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, | ||
122 | unsigned int cfg); | ||
123 | |||
111 | /* Define values for the pull-{up,down} available for each gpio pin. | 124 | /* Define values for the pull-{up,down} available for each gpio pin. |
112 | * | 125 | * |
113 | * These values control the state of the weak pull-{up,down} resistors | 126 | * These values control the state of the weak pull-{up,down} resistors |
@@ -140,6 +153,31 @@ extern int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull); | |||
140 | */ | 153 | */ |
141 | extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin); | 154 | extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin); |
142 | 155 | ||
156 | /* configure `all` aspects of an gpio */ | ||
157 | |||
158 | /** | ||
159 | * s3c_gpio_cfgall_range() - configure range of gpio functtion and pull. | ||
160 | * @start: The gpio number to start at. | ||
161 | * @nr: The number of gpio to configure from @start. | ||
162 | * @cfg: The configuration to use | ||
163 | * @pull: The pull setting to use. | ||
164 | * | ||
165 | * Run s3c_gpio_cfgpin() and s3c_gpio_setpull() over the gpio range starting | ||
166 | * @gpio and running for @size. | ||
167 | * | ||
168 | * @sa s3c_gpio_cfgpin | ||
169 | * @sa s3c_gpio_setpull | ||
170 | * @sa s3c_gpio_cfgpin_range | ||
171 | */ | ||
172 | extern int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, | ||
173 | unsigned int cfg, s3c_gpio_pull_t pull); | ||
174 | |||
175 | static inline int s3c_gpio_cfgrange_nopull(unsigned int pin, unsigned int size, | ||
176 | unsigned int cfg) | ||
177 | { | ||
178 | return s3c_gpio_cfgall_range(pin, size, cfg, S3C_GPIO_PULL_NONE); | ||
179 | } | ||
180 | |||
143 | /* Define values for the drvstr available for each gpio pin. | 181 | /* Define values for the drvstr available for each gpio pin. |
144 | * | 182 | * |
145 | * These values control the value of the output signal driver strength, | 183 | * These values control the value of the output signal driver strength, |
@@ -169,4 +207,22 @@ extern s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin); | |||
169 | */ | 207 | */ |
170 | extern int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr); | 208 | extern int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr); |
171 | 209 | ||
210 | /** | ||
211 | * s5p_register_gpio_interrupt() - register interrupt support for a gpio group | ||
212 | * @pin: The pin number from the group to be registered | ||
213 | * | ||
214 | * This function registers gpio interrupt support for the group that the | ||
215 | * specified pin belongs to. | ||
216 | * | ||
217 | * The total number of gpio pins is quite large ob s5p series. Registering | ||
218 | * irq support for all of them would be a resource waste. Because of that the | ||
219 | * interrupt support for standard gpio pins is registered dynamically. | ||
220 | * | ||
221 | * It will return the irq number of the interrupt that has been registered | ||
222 | * or -ENOMEM if no more gpio interrupts can be registered. It is allowed | ||
223 | * to call this function more than once for the same gpio group (the group | ||
224 | * will be registered only once). | ||
225 | */ | ||
226 | extern int s5p_register_gpio_interrupt(int pin); | ||
227 | |||
172 | #endif /* __PLAT_GPIO_CFG_H */ | 228 | #endif /* __PLAT_GPIO_CFG_H */ |
diff --git a/arch/arm/plat-samsung/include/plat/gpio-core.h b/arch/arm/plat-samsung/include/plat/gpio-core.h index e358c7da8480..13a22b8861ef 100644 --- a/arch/arm/plat-samsung/include/plat/gpio-core.h +++ b/arch/arm/plat-samsung/include/plat/gpio-core.h | |||
@@ -43,6 +43,8 @@ struct s3c_gpio_cfg; | |||
43 | * struct s3c_gpio_chip - wrapper for specific implementation of gpio | 43 | * struct s3c_gpio_chip - wrapper for specific implementation of gpio |
44 | * @chip: The chip structure to be exported via gpiolib. | 44 | * @chip: The chip structure to be exported via gpiolib. |
45 | * @base: The base pointer to the gpio configuration registers. | 45 | * @base: The base pointer to the gpio configuration registers. |
46 | * @group: The group register number for gpio interrupt support. | ||
47 | * @irq_base: The base irq number. | ||
46 | * @config: special function and pull-resistor control information. | 48 | * @config: special function and pull-resistor control information. |
47 | * @lock: Lock for exclusive access to this gpio bank. | 49 | * @lock: Lock for exclusive access to this gpio bank. |
48 | * @pm_save: Save information for suspend/resume support. | 50 | * @pm_save: Save information for suspend/resume support. |
@@ -63,6 +65,8 @@ struct s3c_gpio_chip { | |||
63 | struct s3c_gpio_cfg *config; | 65 | struct s3c_gpio_cfg *config; |
64 | struct s3c_gpio_pm *pm; | 66 | struct s3c_gpio_pm *pm; |
65 | void __iomem *base; | 67 | void __iomem *base; |
68 | int irq_base; | ||
69 | int group; | ||
66 | spinlock_t lock; | 70 | spinlock_t lock; |
67 | #ifdef CONFIG_PM | 71 | #ifdef CONFIG_PM |
68 | u32 pm_save[4]; | 72 | u32 pm_save[4]; |
@@ -118,6 +122,17 @@ extern void samsung_gpiolib_add_4bit2_chips(struct s3c_gpio_chip *chip, | |||
118 | extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip); | 122 | extern void samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip); |
119 | extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip); | 123 | extern void samsung_gpiolib_add_4bit2(struct s3c_gpio_chip *chip); |
120 | 124 | ||
125 | |||
126 | /** | ||
127 | * samsung_gpiolib_to_irq - convert gpio pin to irq number | ||
128 | * @chip: The gpio chip that the pin belongs to. | ||
129 | * @offset: The offset of the pin in the chip. | ||
130 | * | ||
131 | * This helper returns the irq number calculated from the chip->irq_base and | ||
132 | * the provided offset. | ||
133 | */ | ||
134 | extern int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset); | ||
135 | |||
121 | /* exported for core SoC support to change */ | 136 | /* exported for core SoC support to change */ |
122 | extern struct s3c_gpio_cfg s3c24xx_gpiocfg_default; | 137 | extern struct s3c_gpio_cfg s3c24xx_gpiocfg_default; |
123 | 138 | ||
diff --git a/arch/arm/plat-samsung/include/plat/iic.h b/arch/arm/plat-samsung/include/plat/iic.h index 133308bf595d..1543da8f85c1 100644 --- a/arch/arm/plat-samsung/include/plat/iic.h +++ b/arch/arm/plat-samsung/include/plat/iic.h | |||
@@ -55,10 +55,20 @@ struct s3c2410_platform_i2c { | |||
55 | extern void s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *i2c); | 55 | extern void s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *i2c); |
56 | extern void s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *i2c); | 56 | extern void s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *i2c); |
57 | extern void s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *i2c); | 57 | extern void s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *i2c); |
58 | extern void s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
59 | extern void s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
60 | extern void s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
61 | extern void s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
62 | extern void s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *i2c); | ||
58 | 63 | ||
59 | /* defined by architecture to configure gpio */ | 64 | /* defined by architecture to configure gpio */ |
60 | extern void s3c_i2c0_cfg_gpio(struct platform_device *dev); | 65 | extern void s3c_i2c0_cfg_gpio(struct platform_device *dev); |
61 | extern void s3c_i2c1_cfg_gpio(struct platform_device *dev); | 66 | extern void s3c_i2c1_cfg_gpio(struct platform_device *dev); |
62 | extern void s3c_i2c2_cfg_gpio(struct platform_device *dev); | 67 | extern void s3c_i2c2_cfg_gpio(struct platform_device *dev); |
68 | extern void s3c_i2c3_cfg_gpio(struct platform_device *dev); | ||
69 | extern void s3c_i2c4_cfg_gpio(struct platform_device *dev); | ||
70 | extern void s3c_i2c5_cfg_gpio(struct platform_device *dev); | ||
71 | extern void s3c_i2c6_cfg_gpio(struct platform_device *dev); | ||
72 | extern void s3c_i2c7_cfg_gpio(struct platform_device *dev); | ||
63 | 73 | ||
64 | #endif /* __ASM_ARCH_IIC_H */ | 74 | #endif /* __ASM_ARCH_IIC_H */ |
diff --git a/arch/arm/plat-samsung/include/plat/map-base.h b/arch/arm/plat-samsung/include/plat/map-base.h index 250be311c85b..3ffac4d2e4f0 100644 --- a/arch/arm/plat-samsung/include/plat/map-base.h +++ b/arch/arm/plat-samsung/include/plat/map-base.h | |||
@@ -14,7 +14,7 @@ | |||
14 | #ifndef __ASM_PLAT_MAP_H | 14 | #ifndef __ASM_PLAT_MAP_H |
15 | #define __ASM_PLAT_MAP_H __FILE__ | 15 | #define __ASM_PLAT_MAP_H __FILE__ |
16 | 16 | ||
17 | /* Fit all our registers in at 0xF4000000 upwards, trying to use as | 17 | /* Fit all our registers in at 0xF6000000 upwards, trying to use as |
18 | * little of the VA space as possible so vmalloc and friends have a | 18 | * little of the VA space as possible so vmalloc and friends have a |
19 | * better chance of getting memory. | 19 | * better chance of getting memory. |
20 | * | 20 | * |
@@ -22,7 +22,7 @@ | |||
22 | * an single MOVS instruction (ie, only 8 bits of set data) | 22 | * an single MOVS instruction (ie, only 8 bits of set data) |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #define S3C_ADDR_BASE (0xF4000000) | 25 | #define S3C_ADDR_BASE 0xF6000000 |
26 | 26 | ||
27 | #ifndef __ASSEMBLY__ | 27 | #ifndef __ASSEMBLY__ |
28 | #define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x)) | 28 | #define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x)) |
diff --git a/arch/arm/plat-samsung/include/plat/nand-core.h b/arch/arm/plat-samsung/include/plat/nand-core.h new file mode 100644 index 000000000000..6de20789a95e --- /dev/null +++ b/arch/arm/plat-samsung/include/plat/nand-core.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* arch/arm/plat-samsung/include/plat/nand-core.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com/ | ||
5 | * | ||
6 | * S3C - Nand Controller core functions | ||
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_NAND_CORE_H | ||
14 | #define __ASM_ARCH_NAND_CORE_H __FILE__ | ||
15 | |||
16 | /* These functions are only for use with the core support code, such as | ||
17 | * the cpu specific initialisation code | ||
18 | */ | ||
19 | |||
20 | /* re-define device name depending on support. */ | ||
21 | static inline void s3c_nand_setname(char *name) | ||
22 | { | ||
23 | #ifdef CONFIG_S3C_DEV_NAND | ||
24 | s3c_device_nand.name = name; | ||
25 | #endif | ||
26 | } | ||
27 | |||
28 | #endif /* __ASM_ARCH_NAND_CORE_H */ | ||
diff --git a/arch/arm/plat-samsung/include/plat/sdhci.h b/arch/arm/plat-samsung/include/plat/sdhci.h index 30844c263d03..85853f8c4c5d 100644 --- a/arch/arm/plat-samsung/include/plat/sdhci.h +++ b/arch/arm/plat-samsung/include/plat/sdhci.h | |||
@@ -28,11 +28,17 @@ enum cd_types { | |||
28 | S3C_SDHCI_CD_PERMANENT, /* no CD line, card permanently wired to host */ | 28 | S3C_SDHCI_CD_PERMANENT, /* no CD line, card permanently wired to host */ |
29 | }; | 29 | }; |
30 | 30 | ||
31 | enum clk_types { | ||
32 | S3C_SDHCI_CLK_DIV_INTERNAL, /* use mmc internal clock divider */ | ||
33 | S3C_SDHCI_CLK_DIV_EXTERNAL, /* use external clock divider */ | ||
34 | }; | ||
35 | |||
31 | /** | 36 | /** |
32 | * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI | 37 | * struct s3c_sdhci_platdata() - Platform device data for Samsung SDHCI |
33 | * @max_width: The maximum number of data bits supported. | 38 | * @max_width: The maximum number of data bits supported. |
34 | * @host_caps: Standard MMC host capabilities bit field. | 39 | * @host_caps: Standard MMC host capabilities bit field. |
35 | * @cd_type: Type of Card Detection method (see cd_types enum above) | 40 | * @cd_type: Type of Card Detection method (see cd_types enum above) |
41 | * @clk_type: Type of clock divider method (see clk_types enum above) | ||
36 | * @ext_cd_init: Initialize external card detect subsystem. Called on | 42 | * @ext_cd_init: Initialize external card detect subsystem. Called on |
37 | * sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL. | 43 | * sdhci-s3c driver probe when cd_type == S3C_SDHCI_CD_EXTERNAL. |
38 | * notify_func argument is a callback to the sdhci-s3c driver | 44 | * notify_func argument is a callback to the sdhci-s3c driver |
@@ -59,6 +65,7 @@ struct s3c_sdhci_platdata { | |||
59 | unsigned int max_width; | 65 | unsigned int max_width; |
60 | unsigned int host_caps; | 66 | unsigned int host_caps; |
61 | enum cd_types cd_type; | 67 | enum cd_types cd_type; |
68 | enum clk_types clk_type; | ||
62 | 69 | ||
63 | char **clocks; /* set of clock sources */ | 70 | char **clocks; /* set of clock sources */ |
64 | 71 | ||
@@ -110,6 +117,10 @@ extern void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | |||
110 | extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | 117 | extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w); |
111 | extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w); | 118 | extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w); |
112 | extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w); | 119 | extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w); |
120 | extern void s5pv310_setup_sdhci0_cfg_gpio(struct platform_device *, int w); | ||
121 | extern void s5pv310_setup_sdhci1_cfg_gpio(struct platform_device *, int w); | ||
122 | extern void s5pv310_setup_sdhci2_cfg_gpio(struct platform_device *, int w); | ||
123 | extern void s5pv310_setup_sdhci3_cfg_gpio(struct platform_device *, int w); | ||
113 | 124 | ||
114 | /* S3C64XX SDHCI setup */ | 125 | /* S3C64XX SDHCI setup */ |
115 | 126 | ||
@@ -288,4 +299,57 @@ static inline void s5pv210_default_sdhci3(void) { } | |||
288 | 299 | ||
289 | #endif /* CONFIG_S5PV210_SETUP_SDHCI */ | 300 | #endif /* CONFIG_S5PV210_SETUP_SDHCI */ |
290 | 301 | ||
302 | /* S5PV310 SDHCI setup */ | ||
303 | #ifdef CONFIG_S5PV310_SETUP_SDHCI | ||
304 | extern char *s5pv310_hsmmc_clksrcs[4]; | ||
305 | |||
306 | extern void s5pv310_setup_sdhci_cfg_card(struct platform_device *dev, | ||
307 | void __iomem *r, | ||
308 | struct mmc_ios *ios, | ||
309 | struct mmc_card *card); | ||
310 | |||
311 | static inline void s5pv310_default_sdhci0(void) | ||
312 | { | ||
313 | #ifdef CONFIG_S3C_DEV_HSMMC | ||
314 | s3c_hsmmc0_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
315 | s3c_hsmmc0_def_platdata.cfg_gpio = s5pv310_setup_sdhci0_cfg_gpio; | ||
316 | s3c_hsmmc0_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
317 | #endif | ||
318 | } | ||
319 | |||
320 | static inline void s5pv310_default_sdhci1(void) | ||
321 | { | ||
322 | #ifdef CONFIG_S3C_DEV_HSMMC1 | ||
323 | s3c_hsmmc1_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
324 | s3c_hsmmc1_def_platdata.cfg_gpio = s5pv310_setup_sdhci1_cfg_gpio; | ||
325 | s3c_hsmmc1_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
326 | #endif | ||
327 | } | ||
328 | |||
329 | static inline void s5pv310_default_sdhci2(void) | ||
330 | { | ||
331 | #ifdef CONFIG_S3C_DEV_HSMMC2 | ||
332 | s3c_hsmmc2_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
333 | s3c_hsmmc2_def_platdata.cfg_gpio = s5pv310_setup_sdhci2_cfg_gpio; | ||
334 | s3c_hsmmc2_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
335 | #endif | ||
336 | } | ||
337 | |||
338 | static inline void s5pv310_default_sdhci3(void) | ||
339 | { | ||
340 | #ifdef CONFIG_S3C_DEV_HSMMC3 | ||
341 | s3c_hsmmc3_def_platdata.clocks = s5pv310_hsmmc_clksrcs; | ||
342 | s3c_hsmmc3_def_platdata.cfg_gpio = s5pv310_setup_sdhci3_cfg_gpio; | ||
343 | s3c_hsmmc3_def_platdata.cfg_card = s5pv310_setup_sdhci_cfg_card; | ||
344 | #endif | ||
345 | } | ||
346 | |||
347 | #else | ||
348 | static inline void s5pv310_default_sdhci0(void) { } | ||
349 | static inline void s5pv310_default_sdhci1(void) { } | ||
350 | static inline void s5pv310_default_sdhci2(void) { } | ||
351 | static inline void s5pv310_default_sdhci3(void) { } | ||
352 | |||
353 | #endif /* CONFIG_S5PV310_SETUP_SDHCI */ | ||
354 | |||
291 | #endif /* __PLAT_S3C_SDHCI_H */ | 355 | #endif /* __PLAT_S3C_SDHCI_H */ |
diff --git a/arch/arm/plat-samsung/pm-gpio.c b/arch/arm/plat-samsung/pm-gpio.c index 7df03f87fbfa..96528200eb79 100644 --- a/arch/arm/plat-samsung/pm-gpio.c +++ b/arch/arm/plat-samsung/pm-gpio.c | |||
@@ -192,7 +192,7 @@ struct s3c_gpio_pm s3c_gpio_pm_2bit = { | |||
192 | .resume = s3c_gpio_pm_2bit_resume, | 192 | .resume = s3c_gpio_pm_2bit_resume, |
193 | }; | 193 | }; |
194 | 194 | ||
195 | #ifdef CONFIG_ARCH_S3C64XX | 195 | #if defined(CONFIG_ARCH_S3C64XX) || defined(CONFIG_PLAT_S5P) |
196 | static void s3c_gpio_pm_4bit_save(struct s3c_gpio_chip *chip) | 196 | static void s3c_gpio_pm_4bit_save(struct s3c_gpio_chip *chip) |
197 | { | 197 | { |
198 | chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON); | 198 | chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON); |
@@ -302,7 +302,7 @@ struct s3c_gpio_pm s3c_gpio_pm_4bit = { | |||
302 | .save = s3c_gpio_pm_4bit_save, | 302 | .save = s3c_gpio_pm_4bit_save, |
303 | .resume = s3c_gpio_pm_4bit_resume, | 303 | .resume = s3c_gpio_pm_4bit_resume, |
304 | }; | 304 | }; |
305 | #endif /* CONFIG_ARCH_S3C64XX */ | 305 | #endif /* CONFIG_ARCH_S3C64XX || CONFIG_PLAT_S5P */ |
306 | 306 | ||
307 | /** | 307 | /** |
308 | * s3c_pm_save_gpio() - save gpio chip data for suspend | 308 | * s3c_pm_save_gpio() - save gpio chip data for suspend |
diff --git a/arch/arm/plat-samsung/s3c-pl330.c b/arch/arm/plat-samsung/s3c-pl330.c index a91305a60aed..b4ff8d74ac40 100644 --- a/arch/arm/plat-samsung/s3c-pl330.c +++ b/arch/arm/plat-samsung/s3c-pl330.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/clk.h> | ||
19 | #include <linux/err.h> | ||
18 | 20 | ||
19 | #include <asm/hardware/pl330.h> | 21 | #include <asm/hardware/pl330.h> |
20 | 22 | ||
@@ -27,6 +29,7 @@ | |||
27 | * @node: To attach to the global list of DMACs. | 29 | * @node: To attach to the global list of DMACs. |
28 | * @pi: PL330 configuration info for the DMAC. | 30 | * @pi: PL330 configuration info for the DMAC. |
29 | * @kmcache: Pool to quickly allocate xfers for all channels in the dmac. | 31 | * @kmcache: Pool to quickly allocate xfers for all channels in the dmac. |
32 | * @clk: Pointer of DMAC operation clock. | ||
30 | */ | 33 | */ |
31 | struct s3c_pl330_dmac { | 34 | struct s3c_pl330_dmac { |
32 | unsigned busy_chan; | 35 | unsigned busy_chan; |
@@ -34,6 +37,7 @@ struct s3c_pl330_dmac { | |||
34 | struct list_head node; | 37 | struct list_head node; |
35 | struct pl330_info *pi; | 38 | struct pl330_info *pi; |
36 | struct kmem_cache *kmcache; | 39 | struct kmem_cache *kmcache; |
40 | struct clk *clk; | ||
37 | }; | 41 | }; |
38 | 42 | ||
39 | /** | 43 | /** |
@@ -1072,16 +1076,25 @@ static int pl330_probe(struct platform_device *pdev) | |||
1072 | if (ret) | 1076 | if (ret) |
1073 | goto probe_err4; | 1077 | goto probe_err4; |
1074 | 1078 | ||
1075 | ret = pl330_add(pl330_info); | ||
1076 | if (ret) | ||
1077 | goto probe_err5; | ||
1078 | |||
1079 | /* Allocate a new DMAC */ | 1079 | /* Allocate a new DMAC */ |
1080 | s3c_pl330_dmac = kmalloc(sizeof(*s3c_pl330_dmac), GFP_KERNEL); | 1080 | s3c_pl330_dmac = kmalloc(sizeof(*s3c_pl330_dmac), GFP_KERNEL); |
1081 | if (!s3c_pl330_dmac) { | 1081 | if (!s3c_pl330_dmac) { |
1082 | ret = -ENOMEM; | 1082 | ret = -ENOMEM; |
1083 | goto probe_err5; | ||
1084 | } | ||
1085 | |||
1086 | /* Get operation clock and enable it */ | ||
1087 | s3c_pl330_dmac->clk = clk_get(&pdev->dev, "pdma"); | ||
1088 | if (IS_ERR(s3c_pl330_dmac->clk)) { | ||
1089 | dev_err(&pdev->dev, "Cannot get operation clock.\n"); | ||
1090 | ret = -EINVAL; | ||
1083 | goto probe_err6; | 1091 | goto probe_err6; |
1084 | } | 1092 | } |
1093 | clk_enable(s3c_pl330_dmac->clk); | ||
1094 | |||
1095 | ret = pl330_add(pl330_info); | ||
1096 | if (ret) | ||
1097 | goto probe_err7; | ||
1085 | 1098 | ||
1086 | /* Hook the info */ | 1099 | /* Hook the info */ |
1087 | s3c_pl330_dmac->pi = pl330_info; | 1100 | s3c_pl330_dmac->pi = pl330_info; |
@@ -1094,7 +1107,7 @@ static int pl330_probe(struct platform_device *pdev) | |||
1094 | 1107 | ||
1095 | if (!s3c_pl330_dmac->kmcache) { | 1108 | if (!s3c_pl330_dmac->kmcache) { |
1096 | ret = -ENOMEM; | 1109 | ret = -ENOMEM; |
1097 | goto probe_err7; | 1110 | goto probe_err8; |
1098 | } | 1111 | } |
1099 | 1112 | ||
1100 | /* Get the list of peripherals */ | 1113 | /* Get the list of peripherals */ |
@@ -1120,10 +1133,13 @@ static int pl330_probe(struct platform_device *pdev) | |||
1120 | 1133 | ||
1121 | return 0; | 1134 | return 0; |
1122 | 1135 | ||
1136 | probe_err8: | ||
1137 | pl330_del(pl330_info); | ||
1123 | probe_err7: | 1138 | probe_err7: |
1124 | kfree(s3c_pl330_dmac); | 1139 | clk_disable(s3c_pl330_dmac->clk); |
1140 | clk_put(s3c_pl330_dmac->clk); | ||
1125 | probe_err6: | 1141 | probe_err6: |
1126 | pl330_del(pl330_info); | 1142 | kfree(s3c_pl330_dmac); |
1127 | probe_err5: | 1143 | probe_err5: |
1128 | free_irq(irq, pl330_info); | 1144 | free_irq(irq, pl330_info); |
1129 | probe_err4: | 1145 | probe_err4: |
@@ -1188,6 +1204,10 @@ static int pl330_remove(struct platform_device *pdev) | |||
1188 | } | 1204 | } |
1189 | } | 1205 | } |
1190 | 1206 | ||
1207 | /* Disable operation clock */ | ||
1208 | clk_disable(dmac->clk); | ||
1209 | clk_put(dmac->clk); | ||
1210 | |||
1191 | /* Remove the DMAC */ | 1211 | /* Remove the DMAC */ |
1192 | list_del(&dmac->node); | 1212 | list_del(&dmac->node); |
1193 | kfree(dmac); | 1213 | kfree(dmac); |