diff options
Diffstat (limited to 'drivers')
31 files changed, 610 insertions, 346 deletions
diff --git a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c index 408da30594c4..1f18ad9e4fe1 100644 --- a/drivers/ata/pata_of_platform.c +++ b/drivers/ata/pata_of_platform.c | |||
@@ -52,7 +52,7 @@ static int __devinit pata_of_platform_probe(struct of_device *ofdev, | |||
52 | 52 | ||
53 | ret = of_irq_to_resource(dn, 0, &irq_res); | 53 | ret = of_irq_to_resource(dn, 0, &irq_res); |
54 | if (ret == NO_IRQ) | 54 | if (ret == NO_IRQ) |
55 | irq_res.start = irq_res.end = -1; | 55 | irq_res.start = irq_res.end = 0; |
56 | else | 56 | else |
57 | irq_res.flags = 0; | 57 | irq_res.flags = 0; |
58 | 58 | ||
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index cf64ddf5d839..2cea27aba9a0 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -4172,7 +4172,7 @@ static int __init floppy_init(void) | |||
4172 | int i, unit, drive; | 4172 | int i, unit, drive; |
4173 | int err, dr; | 4173 | int err, dr; |
4174 | 4174 | ||
4175 | #if defined(CONFIG_PPC_MERGE) | 4175 | #if defined(CONFIG_PPC) |
4176 | if (check_legacy_ioport(FDC1)) | 4176 | if (check_legacy_ioport(FDC1)) |
4177 | return -ENODEV; | 4177 | return -ENODEV; |
4178 | #endif | 4178 | #endif |
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index f1c8feb5510b..1730d29e6044 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c | |||
@@ -249,7 +249,6 @@ static int send_request(struct request *req) | |||
249 | struct HvLpEvent *hev; | 249 | struct HvLpEvent *hev; |
250 | struct scatterlist sg[VIOMAXBLOCKDMA]; | 250 | struct scatterlist sg[VIOMAXBLOCKDMA]; |
251 | int sgindex; | 251 | int sgindex; |
252 | int statindex; | ||
253 | struct viodasd_device *d; | 252 | struct viodasd_device *d; |
254 | unsigned long flags; | 253 | unsigned long flags; |
255 | 254 | ||
@@ -258,11 +257,9 @@ static int send_request(struct request *req) | |||
258 | if (rq_data_dir(req) == READ) { | 257 | if (rq_data_dir(req) == READ) { |
259 | direction = DMA_FROM_DEVICE; | 258 | direction = DMA_FROM_DEVICE; |
260 | viocmd = viomajorsubtype_blockio | vioblockread; | 259 | viocmd = viomajorsubtype_blockio | vioblockread; |
261 | statindex = 0; | ||
262 | } else { | 260 | } else { |
263 | direction = DMA_TO_DEVICE; | 261 | direction = DMA_TO_DEVICE; |
264 | viocmd = viomajorsubtype_blockio | vioblockwrite; | 262 | viocmd = viomajorsubtype_blockio | vioblockwrite; |
265 | statindex = 1; | ||
266 | } | 263 | } |
267 | 264 | ||
268 | d = req->rq_disk->private_data; | 265 | d = req->rq_disk->private_data; |
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index ec7aded0a2df..bf70450a49cc 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
@@ -367,13 +367,13 @@ static void hvc_close(struct tty_struct *tty, struct file * filp) | |||
367 | spin_lock_irqsave(&hp->lock, flags); | 367 | spin_lock_irqsave(&hp->lock, flags); |
368 | 368 | ||
369 | if (--hp->count == 0) { | 369 | if (--hp->count == 0) { |
370 | if (hp->ops->notifier_del) | ||
371 | hp->ops->notifier_del(hp, hp->data); | ||
372 | |||
373 | /* We are done with the tty pointer now. */ | 370 | /* We are done with the tty pointer now. */ |
374 | hp->tty = NULL; | 371 | hp->tty = NULL; |
375 | spin_unlock_irqrestore(&hp->lock, flags); | 372 | spin_unlock_irqrestore(&hp->lock, flags); |
376 | 373 | ||
374 | if (hp->ops->notifier_del) | ||
375 | hp->ops->notifier_del(hp, hp->data); | ||
376 | |||
377 | /* | 377 | /* |
378 | * Chain calls chars_in_buffer() and returns immediately if | 378 | * Chain calls chars_in_buffer() and returns immediately if |
379 | * there is no buffered data otherwise sleeps on a wait queue | 379 | * there is no buffered data otherwise sleeps on a wait queue |
@@ -416,11 +416,11 @@ static void hvc_hangup(struct tty_struct *tty) | |||
416 | hp->n_outbuf = 0; | 416 | hp->n_outbuf = 0; |
417 | hp->tty = NULL; | 417 | hp->tty = NULL; |
418 | 418 | ||
419 | spin_unlock_irqrestore(&hp->lock, flags); | ||
420 | |||
419 | if (hp->ops->notifier_del) | 421 | if (hp->ops->notifier_del) |
420 | hp->ops->notifier_del(hp, hp->data); | 422 | hp->ops->notifier_del(hp, hp->data); |
421 | 423 | ||
422 | spin_unlock_irqrestore(&hp->lock, flags); | ||
423 | |||
424 | while(temp_open_count) { | 424 | while(temp_open_count) { |
425 | --temp_open_count; | 425 | --temp_open_count; |
426 | kref_put(&hp->kref, destroy_hvc_struct); | 426 | kref_put(&hp->kref, destroy_hvc_struct); |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 8e8afb6141f9..3123bf57ad91 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -2695,7 +2695,7 @@ static __devinit void default_find_bmc(void) | |||
2695 | for (i = 0; ; i++) { | 2695 | for (i = 0; ; i++) { |
2696 | if (!ipmi_defaults[i].port) | 2696 | if (!ipmi_defaults[i].port) |
2697 | break; | 2697 | break; |
2698 | #ifdef CONFIG_PPC_MERGE | 2698 | #ifdef CONFIG_PPC |
2699 | if (check_legacy_ioport(ipmi_defaults[i].port)) | 2699 | if (check_legacy_ioport(ipmi_defaults[i].port)) |
2700 | continue; | 2700 | continue; |
2701 | #endif | 2701 | #endif |
diff --git a/drivers/hwmon/ams/ams.h b/drivers/hwmon/ams/ams.h index a6221e5dd984..221ef6915a5f 100644 --- a/drivers/hwmon/ams/ams.h +++ b/drivers/hwmon/ams/ams.h | |||
@@ -4,7 +4,7 @@ | |||
4 | #include <linux/mutex.h> | 4 | #include <linux/mutex.h> |
5 | #include <linux/spinlock.h> | 5 | #include <linux/spinlock.h> |
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <asm/of_device.h> | 7 | #include <linux/of_device.h> |
8 | 8 | ||
9 | enum ams_irq { | 9 | enum ams_irq { |
10 | AMS_IRQ_FREEFALL = 0x01, | 10 | AMS_IRQ_FREEFALL = 0x01, |
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 27443f073bc9..a9a45fcc8544 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
@@ -312,7 +312,6 @@ static struct i2c_adapter mpc_ops = { | |||
312 | .name = "MPC adapter", | 312 | .name = "MPC adapter", |
313 | .id = I2C_HW_MPC107, | 313 | .id = I2C_HW_MPC107, |
314 | .algo = &mpc_algo, | 314 | .algo = &mpc_algo, |
315 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD, | ||
316 | .timeout = 1, | 315 | .timeout = 1, |
317 | }; | 316 | }; |
318 | 317 | ||
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c index f80df9ae5054..9eb76268ec78 100644 --- a/drivers/i2c/busses/i2c-pca-isa.c +++ b/drivers/i2c/busses/i2c-pca-isa.c | |||
@@ -126,7 +126,7 @@ static int __devinit pca_isa_probe(struct device *dev, unsigned int id) | |||
126 | 126 | ||
127 | dev_info(dev, "i/o base %#08lx. irq %d\n", base, irq); | 127 | dev_info(dev, "i/o base %#08lx. irq %d\n", base, irq); |
128 | 128 | ||
129 | #ifdef CONFIG_PPC_MERGE | 129 | #ifdef CONFIG_PPC |
130 | if (check_legacy_ioport(base)) { | 130 | if (check_legacy_ioport(base)) { |
131 | dev_err(dev, "I/O address %#08lx is not available\n", base); | 131 | dev_err(dev, "I/O address %#08lx is not available\n", base); |
132 | goto out; | 132 | goto out; |
diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig index a95cb9465d65..17356827b93d 100644 --- a/drivers/i2c/chips/Kconfig +++ b/drivers/i2c/chips/Kconfig | |||
@@ -172,4 +172,15 @@ config MENELAUS | |||
172 | and other features that are often used in portable devices like | 172 | and other features that are often used in portable devices like |
173 | cell phones and PDAs. | 173 | cell phones and PDAs. |
174 | 174 | ||
175 | config MCU_MPC8349EMITX | ||
176 | tristate "MPC8349E-mITX MCU driver" | ||
177 | depends on I2C && PPC_83xx | ||
178 | select GENERIC_GPIO | ||
179 | select ARCH_REQUIRE_GPIOLIB | ||
180 | help | ||
181 | Say Y here to enable soft power-off functionality on the Freescale | ||
182 | boards with the MPC8349E-mITX-compatible MCU chips. This driver will | ||
183 | also register MCU GPIOs with the generic GPIO API, so you'll able | ||
184 | to use MCU pins as GPIOs. | ||
185 | |||
175 | endmenu | 186 | endmenu |
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index 39e3e69ed125..ca520fa143d6 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile | |||
@@ -21,6 +21,7 @@ obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o | |||
21 | obj-$(CONFIG_TPS65010) += tps65010.o | 21 | obj-$(CONFIG_TPS65010) += tps65010.o |
22 | obj-$(CONFIG_MENELAUS) += menelaus.o | 22 | obj-$(CONFIG_MENELAUS) += menelaus.o |
23 | obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o | 23 | obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o |
24 | obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o | ||
24 | 25 | ||
25 | ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) | 26 | ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) |
26 | EXTRA_CFLAGS += -DDEBUG | 27 | EXTRA_CFLAGS += -DDEBUG |
diff --git a/drivers/i2c/chips/mcu_mpc8349emitx.c b/drivers/i2c/chips/mcu_mpc8349emitx.c new file mode 100644 index 000000000000..82a9bcb858b6 --- /dev/null +++ b/drivers/i2c/chips/mcu_mpc8349emitx.c | |||
@@ -0,0 +1,209 @@ | |||
1 | /* | ||
2 | * Power Management and GPIO expander driver for MPC8349E-mITX-compatible MCU | ||
3 | * | ||
4 | * Copyright (c) 2008 MontaVista Software, Inc. | ||
5 | * | ||
6 | * Author: Anton Vorontsov <avorontsov@ru.mvista.com> | ||
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 as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/device.h> | ||
18 | #include <linux/mutex.h> | ||
19 | #include <linux/i2c.h> | ||
20 | #include <linux/gpio.h> | ||
21 | #include <linux/of.h> | ||
22 | #include <linux/of_gpio.h> | ||
23 | #include <asm/prom.h> | ||
24 | #include <asm/machdep.h> | ||
25 | |||
26 | /* | ||
27 | * I don't have specifications for the MCU firmware, I found this register | ||
28 | * and bits positions by the trial&error method. | ||
29 | */ | ||
30 | #define MCU_REG_CTRL 0x20 | ||
31 | #define MCU_CTRL_POFF 0x40 | ||
32 | |||
33 | #define MCU_NUM_GPIO 2 | ||
34 | |||
35 | struct mcu { | ||
36 | struct mutex lock; | ||
37 | struct device_node *np; | ||
38 | struct i2c_client *client; | ||
39 | struct of_gpio_chip of_gc; | ||
40 | u8 reg_ctrl; | ||
41 | }; | ||
42 | |||
43 | static struct mcu *glob_mcu; | ||
44 | |||
45 | static void mcu_power_off(void) | ||
46 | { | ||
47 | struct mcu *mcu = glob_mcu; | ||
48 | |||
49 | pr_info("Sending power-off request to the MCU...\n"); | ||
50 | mutex_lock(&mcu->lock); | ||
51 | i2c_smbus_write_byte_data(glob_mcu->client, MCU_REG_CTRL, | ||
52 | mcu->reg_ctrl | MCU_CTRL_POFF); | ||
53 | mutex_unlock(&mcu->lock); | ||
54 | } | ||
55 | |||
56 | static void mcu_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val) | ||
57 | { | ||
58 | struct of_gpio_chip *of_gc = to_of_gpio_chip(gc); | ||
59 | struct mcu *mcu = container_of(of_gc, struct mcu, of_gc); | ||
60 | u8 bit = 1 << (4 + gpio); | ||
61 | |||
62 | mutex_lock(&mcu->lock); | ||
63 | if (val) | ||
64 | mcu->reg_ctrl &= ~bit; | ||
65 | else | ||
66 | mcu->reg_ctrl |= bit; | ||
67 | |||
68 | i2c_smbus_write_byte_data(mcu->client, MCU_REG_CTRL, mcu->reg_ctrl); | ||
69 | mutex_unlock(&mcu->lock); | ||
70 | } | ||
71 | |||
72 | static int mcu_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
73 | { | ||
74 | mcu_gpio_set(gc, gpio, val); | ||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | static int mcu_gpiochip_add(struct mcu *mcu) | ||
79 | { | ||
80 | struct device_node *np; | ||
81 | struct of_gpio_chip *of_gc = &mcu->of_gc; | ||
82 | struct gpio_chip *gc = &of_gc->gc; | ||
83 | int ret; | ||
84 | |||
85 | np = of_find_compatible_node(NULL, NULL, "fsl,mcu-mpc8349emitx"); | ||
86 | if (!np) | ||
87 | return -ENODEV; | ||
88 | |||
89 | gc->owner = THIS_MODULE; | ||
90 | gc->label = np->full_name; | ||
91 | gc->can_sleep = 1; | ||
92 | gc->ngpio = MCU_NUM_GPIO; | ||
93 | gc->base = -1; | ||
94 | gc->set = mcu_gpio_set; | ||
95 | gc->direction_output = mcu_gpio_dir_out; | ||
96 | of_gc->gpio_cells = 2; | ||
97 | of_gc->xlate = of_gpio_simple_xlate; | ||
98 | |||
99 | np->data = of_gc; | ||
100 | mcu->np = np; | ||
101 | |||
102 | /* | ||
103 | * We don't want to lose the node, its ->data and ->full_name... | ||
104 | * So, if succeeded, we don't put the node here. | ||
105 | */ | ||
106 | ret = gpiochip_add(gc); | ||
107 | if (ret) | ||
108 | of_node_put(np); | ||
109 | return ret; | ||
110 | } | ||
111 | |||
112 | static int mcu_gpiochip_remove(struct mcu *mcu) | ||
113 | { | ||
114 | int ret; | ||
115 | |||
116 | ret = gpiochip_remove(&mcu->of_gc.gc); | ||
117 | if (ret) | ||
118 | return ret; | ||
119 | of_node_put(mcu->np); | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | static int __devinit mcu_probe(struct i2c_client *client, | ||
125 | const struct i2c_device_id *id) | ||
126 | { | ||
127 | struct mcu *mcu; | ||
128 | int ret; | ||
129 | |||
130 | mcu = kzalloc(sizeof(*mcu), GFP_KERNEL); | ||
131 | if (!mcu) | ||
132 | return -ENOMEM; | ||
133 | |||
134 | mutex_init(&mcu->lock); | ||
135 | mcu->client = client; | ||
136 | i2c_set_clientdata(client, mcu); | ||
137 | |||
138 | ret = i2c_smbus_read_byte_data(mcu->client, MCU_REG_CTRL); | ||
139 | if (ret < 0) | ||
140 | goto err; | ||
141 | mcu->reg_ctrl = ret; | ||
142 | |||
143 | ret = mcu_gpiochip_add(mcu); | ||
144 | if (ret) | ||
145 | goto err; | ||
146 | |||
147 | /* XXX: this is potentially racy, but there is no lock for ppc_md */ | ||
148 | if (!ppc_md.power_off) { | ||
149 | glob_mcu = mcu; | ||
150 | ppc_md.power_off = mcu_power_off; | ||
151 | dev_info(&client->dev, "will provide power-off service\n"); | ||
152 | } | ||
153 | |||
154 | return 0; | ||
155 | err: | ||
156 | kfree(mcu); | ||
157 | return ret; | ||
158 | } | ||
159 | |||
160 | static int __devexit mcu_remove(struct i2c_client *client) | ||
161 | { | ||
162 | struct mcu *mcu = i2c_get_clientdata(client); | ||
163 | int ret; | ||
164 | |||
165 | if (glob_mcu == mcu) { | ||
166 | ppc_md.power_off = NULL; | ||
167 | glob_mcu = NULL; | ||
168 | } | ||
169 | |||
170 | ret = mcu_gpiochip_remove(mcu); | ||
171 | if (ret) | ||
172 | return ret; | ||
173 | i2c_set_clientdata(client, NULL); | ||
174 | kfree(mcu); | ||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | static const struct i2c_device_id mcu_ids[] = { | ||
179 | { "mcu-mpc8349emitx", }, | ||
180 | {}, | ||
181 | }; | ||
182 | MODULE_DEVICE_TABLE(i2c, mcu_ids); | ||
183 | |||
184 | static struct i2c_driver mcu_driver = { | ||
185 | .driver = { | ||
186 | .name = "mcu-mpc8349emitx", | ||
187 | .owner = THIS_MODULE, | ||
188 | }, | ||
189 | .probe = mcu_probe, | ||
190 | .remove = __devexit_p(mcu_remove), | ||
191 | .id_table = mcu_ids, | ||
192 | }; | ||
193 | |||
194 | static int __init mcu_init(void) | ||
195 | { | ||
196 | return i2c_add_driver(&mcu_driver); | ||
197 | } | ||
198 | module_init(mcu_init); | ||
199 | |||
200 | static void __exit mcu_exit(void) | ||
201 | { | ||
202 | i2c_del_driver(&mcu_driver); | ||
203 | } | ||
204 | module_exit(mcu_exit); | ||
205 | |||
206 | MODULE_DESCRIPTION("Power Management and GPIO expander driver for " | ||
207 | "MPC8349E-mITX-compatible MCU"); | ||
208 | MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>"); | ||
209 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index f451c7351a9d..847f4aad7ed5 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h | |||
@@ -67,7 +67,7 @@ static inline int i8042_platform_init(void) | |||
67 | * On some platforms touching the i8042 data register region can do really | 67 | * On some platforms touching the i8042 data register region can do really |
68 | * bad things. Because of this the region is always reserved on such boxes. | 68 | * bad things. Because of this the region is always reserved on such boxes. |
69 | */ | 69 | */ |
70 | #if defined(CONFIG_PPC_MERGE) | 70 | #if defined(CONFIG_PPC) |
71 | if (check_legacy_ioport(I8042_DATA_REG)) | 71 | if (check_legacy_ioport(I8042_DATA_REG)) |
72 | return -ENODEV; | 72 | return -ENODEV; |
73 | #endif | 73 | #endif |
diff --git a/drivers/net/ibm_newemac/Kconfig b/drivers/net/ibm_newemac/Kconfig index bcec7320895c..78a1628c9892 100644 --- a/drivers/net/ibm_newemac/Kconfig +++ b/drivers/net/ibm_newemac/Kconfig | |||
@@ -62,3 +62,15 @@ config IBM_NEW_EMAC_TAH | |||
62 | config IBM_NEW_EMAC_EMAC4 | 62 | config IBM_NEW_EMAC_EMAC4 |
63 | bool | 63 | bool |
64 | default n | 64 | default n |
65 | |||
66 | config IBM_NEW_EMAC_NO_FLOW_CTRL | ||
67 | bool | ||
68 | default n | ||
69 | |||
70 | config IBM_NEW_EMAC_MAL_CLR_ICINTSTAT | ||
71 | bool | ||
72 | default n | ||
73 | |||
74 | config IBM_NEW_EMAC_MAL_COMMON_ERR | ||
75 | bool | ||
76 | default n | ||
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 58dfd32ccca8..efcf21c9f5c7 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
@@ -202,13 +202,15 @@ static inline int emac_phy_supports_gige(int phy_mode) | |||
202 | { | 202 | { |
203 | return phy_mode == PHY_MODE_GMII || | 203 | return phy_mode == PHY_MODE_GMII || |
204 | phy_mode == PHY_MODE_RGMII || | 204 | phy_mode == PHY_MODE_RGMII || |
205 | phy_mode == PHY_MODE_SGMII || | ||
205 | phy_mode == PHY_MODE_TBI || | 206 | phy_mode == PHY_MODE_TBI || |
206 | phy_mode == PHY_MODE_RTBI; | 207 | phy_mode == PHY_MODE_RTBI; |
207 | } | 208 | } |
208 | 209 | ||
209 | static inline int emac_phy_gpcs(int phy_mode) | 210 | static inline int emac_phy_gpcs(int phy_mode) |
210 | { | 211 | { |
211 | return phy_mode == PHY_MODE_TBI || | 212 | return phy_mode == PHY_MODE_SGMII || |
213 | phy_mode == PHY_MODE_TBI || | ||
212 | phy_mode == PHY_MODE_RTBI; | 214 | phy_mode == PHY_MODE_RTBI; |
213 | } | 215 | } |
214 | 216 | ||
@@ -562,8 +564,9 @@ static int emac_configure(struct emac_instance *dev) | |||
562 | switch (dev->phy.speed) { | 564 | switch (dev->phy.speed) { |
563 | case SPEED_1000: | 565 | case SPEED_1000: |
564 | if (emac_phy_gpcs(dev->phy.mode)) { | 566 | if (emac_phy_gpcs(dev->phy.mode)) { |
565 | mr1 |= EMAC_MR1_MF_1000GPCS | | 567 | mr1 |= EMAC_MR1_MF_1000GPCS | EMAC_MR1_MF_IPPA( |
566 | EMAC_MR1_MF_IPPA(dev->phy.address); | 568 | (dev->phy.gpcs_address != 0xffffffff) ? |
569 | dev->phy.gpcs_address : dev->phy.address); | ||
567 | 570 | ||
568 | /* Put some arbitrary OUI, Manuf & Rev IDs so we can | 571 | /* Put some arbitrary OUI, Manuf & Rev IDs so we can |
569 | * identify this GPCS PHY later. | 572 | * identify this GPCS PHY later. |
@@ -675,8 +678,12 @@ static int emac_configure(struct emac_instance *dev) | |||
675 | out_be32(&p->iser, r); | 678 | out_be32(&p->iser, r); |
676 | 679 | ||
677 | /* We need to take GPCS PHY out of isolate mode after EMAC reset */ | 680 | /* We need to take GPCS PHY out of isolate mode after EMAC reset */ |
678 | if (emac_phy_gpcs(dev->phy.mode)) | 681 | if (emac_phy_gpcs(dev->phy.mode)) { |
679 | emac_mii_reset_phy(&dev->phy); | 682 | if (dev->phy.gpcs_address != 0xffffffff) |
683 | emac_mii_reset_gpcs(&dev->phy); | ||
684 | else | ||
685 | emac_mii_reset_phy(&dev->phy); | ||
686 | } | ||
680 | 687 | ||
681 | return 0; | 688 | return 0; |
682 | } | 689 | } |
@@ -881,7 +888,9 @@ static int emac_mdio_read(struct net_device *ndev, int id, int reg) | |||
881 | struct emac_instance *dev = netdev_priv(ndev); | 888 | struct emac_instance *dev = netdev_priv(ndev); |
882 | int res; | 889 | int res; |
883 | 890 | ||
884 | res = __emac_mdio_read(dev->mdio_instance ? dev->mdio_instance : dev, | 891 | res = __emac_mdio_read((dev->mdio_instance && |
892 | dev->phy.gpcs_address != id) ? | ||
893 | dev->mdio_instance : dev, | ||
885 | (u8) id, (u8) reg); | 894 | (u8) id, (u8) reg); |
886 | return res; | 895 | return res; |
887 | } | 896 | } |
@@ -890,7 +899,9 @@ static void emac_mdio_write(struct net_device *ndev, int id, int reg, int val) | |||
890 | { | 899 | { |
891 | struct emac_instance *dev = netdev_priv(ndev); | 900 | struct emac_instance *dev = netdev_priv(ndev); |
892 | 901 | ||
893 | __emac_mdio_write(dev->mdio_instance ? dev->mdio_instance : dev, | 902 | __emac_mdio_write((dev->mdio_instance && |
903 | dev->phy.gpcs_address != id) ? | ||
904 | dev->mdio_instance : dev, | ||
894 | (u8) id, (u8) reg, (u16) val); | 905 | (u8) id, (u8) reg, (u16) val); |
895 | } | 906 | } |
896 | 907 | ||
@@ -2382,7 +2393,11 @@ static int __devinit emac_init_phy(struct emac_instance *dev) | |||
2382 | * XXX I probably should move these settings to the dev tree | 2393 | * XXX I probably should move these settings to the dev tree |
2383 | */ | 2394 | */ |
2384 | dev->phy.address = -1; | 2395 | dev->phy.address = -1; |
2385 | dev->phy.features = SUPPORTED_100baseT_Full | SUPPORTED_MII; | 2396 | dev->phy.features = SUPPORTED_MII; |
2397 | if (emac_phy_supports_gige(dev->phy_mode)) | ||
2398 | dev->phy.features |= SUPPORTED_1000baseT_Full; | ||
2399 | else | ||
2400 | dev->phy.features |= SUPPORTED_100baseT_Full; | ||
2386 | dev->phy.pause = 1; | 2401 | dev->phy.pause = 1; |
2387 | 2402 | ||
2388 | return 0; | 2403 | return 0; |
@@ -2421,7 +2436,9 @@ static int __devinit emac_init_phy(struct emac_instance *dev) | |||
2421 | * Note that the busy_phy_map is currently global | 2436 | * Note that the busy_phy_map is currently global |
2422 | * while it should probably be per-ASIC... | 2437 | * while it should probably be per-ASIC... |
2423 | */ | 2438 | */ |
2424 | dev->phy.address = dev->cell_index; | 2439 | dev->phy.gpcs_address = dev->gpcs_address; |
2440 | if (dev->phy.gpcs_address == 0xffffffff) | ||
2441 | dev->phy.address = dev->cell_index; | ||
2425 | } | 2442 | } |
2426 | 2443 | ||
2427 | emac_configure(dev); | 2444 | emac_configure(dev); |
@@ -2531,6 +2548,8 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
2531 | dev->phy_address = 0xffffffff; | 2548 | dev->phy_address = 0xffffffff; |
2532 | if (emac_read_uint_prop(np, "phy-map", &dev->phy_map, 0)) | 2549 | if (emac_read_uint_prop(np, "phy-map", &dev->phy_map, 0)) |
2533 | dev->phy_map = 0xffffffff; | 2550 | dev->phy_map = 0xffffffff; |
2551 | if (emac_read_uint_prop(np, "gpcs-address", &dev->gpcs_address, 0)) | ||
2552 | dev->gpcs_address = 0xffffffff; | ||
2534 | if (emac_read_uint_prop(np->parent, "clock-frequency", &dev->opb_bus_freq, 1)) | 2553 | if (emac_read_uint_prop(np->parent, "clock-frequency", &dev->opb_bus_freq, 1)) |
2535 | return -ENXIO; | 2554 | return -ENXIO; |
2536 | if (emac_read_uint_prop(np, "tah-device", &dev->tah_ph, 0)) | 2555 | if (emac_read_uint_prop(np, "tah-device", &dev->tah_ph, 0)) |
@@ -2585,6 +2604,8 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
2585 | if (of_device_is_compatible(np, "ibm,emac-440ep") || | 2604 | if (of_device_is_compatible(np, "ibm,emac-440ep") || |
2586 | of_device_is_compatible(np, "ibm,emac-440gr")) | 2605 | of_device_is_compatible(np, "ibm,emac-440gr")) |
2587 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; | 2606 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; |
2607 | if (of_device_is_compatible(np, "ibm,emac-405ez")) | ||
2608 | dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; | ||
2588 | } | 2609 | } |
2589 | 2610 | ||
2590 | /* Fixup some feature bits based on the device tree */ | 2611 | /* Fixup some feature bits based on the device tree */ |
@@ -2842,6 +2863,9 @@ static int __devinit emac_probe(struct of_device *ofdev, | |||
2842 | ndev->dev_addr[0], ndev->dev_addr[1], ndev->dev_addr[2], | 2863 | ndev->dev_addr[0], ndev->dev_addr[1], ndev->dev_addr[2], |
2843 | ndev->dev_addr[3], ndev->dev_addr[4], ndev->dev_addr[5]); | 2864 | ndev->dev_addr[3], ndev->dev_addr[4], ndev->dev_addr[5]); |
2844 | 2865 | ||
2866 | if (dev->phy_mode == PHY_MODE_SGMII) | ||
2867 | printk(KERN_NOTICE "%s: in SGMII mode\n", ndev->name); | ||
2868 | |||
2845 | if (dev->phy.address >= 0) | 2869 | if (dev->phy.address >= 0) |
2846 | printk("%s: found %s PHY (0x%02x)\n", ndev->name, | 2870 | printk("%s: found %s PHY (0x%02x)\n", ndev->name, |
2847 | dev->phy.def->name, dev->phy.address); | 2871 | dev->phy.def->name, dev->phy.address); |
diff --git a/drivers/net/ibm_newemac/core.h b/drivers/net/ibm_newemac/core.h index 5ca70e55b6c5..18d56c6c4238 100644 --- a/drivers/net/ibm_newemac/core.h +++ b/drivers/net/ibm_newemac/core.h | |||
@@ -190,6 +190,9 @@ struct emac_instance { | |||
190 | struct delayed_work link_work; | 190 | struct delayed_work link_work; |
191 | int link_polling; | 191 | int link_polling; |
192 | 192 | ||
193 | /* GPCS PHY infos */ | ||
194 | u32 gpcs_address; | ||
195 | |||
193 | /* Shared MDIO if any */ | 196 | /* Shared MDIO if any */ |
194 | u32 mdio_ph; | 197 | u32 mdio_ph; |
195 | struct of_device *mdio_dev; | 198 | struct of_device *mdio_dev; |
@@ -345,6 +348,9 @@ enum { | |||
345 | #ifdef CONFIG_IBM_NEW_EMAC_RGMII | 348 | #ifdef CONFIG_IBM_NEW_EMAC_RGMII |
346 | EMAC_FTR_HAS_RGMII | | 349 | EMAC_FTR_HAS_RGMII | |
347 | #endif | 350 | #endif |
351 | #ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL | ||
352 | EMAC_FTR_NO_FLOW_CONTROL_40x | | ||
353 | #endif | ||
348 | EMAC_FTR_460EX_PHY_CLK_FIX | | 354 | EMAC_FTR_460EX_PHY_CLK_FIX | |
349 | EMAC_FTR_440EP_PHY_CLK_FIX, | 355 | EMAC_FTR_440EP_PHY_CLK_FIX, |
350 | }; | 356 | }; |
diff --git a/drivers/net/ibm_newemac/mal.c b/drivers/net/ibm_newemac/mal.c index 10c267b2b961..1839d3f154a3 100644 --- a/drivers/net/ibm_newemac/mal.c +++ b/drivers/net/ibm_newemac/mal.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
29 | 29 | ||
30 | #include "core.h" | 30 | #include "core.h" |
31 | #include <asm/dcr-regs.h> | ||
31 | 32 | ||
32 | static int mal_count; | 33 | static int mal_count; |
33 | 34 | ||
@@ -279,6 +280,10 @@ static irqreturn_t mal_txeob(int irq, void *dev_instance) | |||
279 | mal_schedule_poll(mal); | 280 | mal_schedule_poll(mal); |
280 | set_mal_dcrn(mal, MAL_TXEOBISR, r); | 281 | set_mal_dcrn(mal, MAL_TXEOBISR, r); |
281 | 282 | ||
283 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) | ||
284 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, | ||
285 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICTX)); | ||
286 | |||
282 | return IRQ_HANDLED; | 287 | return IRQ_HANDLED; |
283 | } | 288 | } |
284 | 289 | ||
@@ -293,6 +298,10 @@ static irqreturn_t mal_rxeob(int irq, void *dev_instance) | |||
293 | mal_schedule_poll(mal); | 298 | mal_schedule_poll(mal); |
294 | set_mal_dcrn(mal, MAL_RXEOBISR, r); | 299 | set_mal_dcrn(mal, MAL_RXEOBISR, r); |
295 | 300 | ||
301 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) | ||
302 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, | ||
303 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICRX)); | ||
304 | |||
296 | return IRQ_HANDLED; | 305 | return IRQ_HANDLED; |
297 | } | 306 | } |
298 | 307 | ||
@@ -336,6 +345,25 @@ static irqreturn_t mal_rxde(int irq, void *dev_instance) | |||
336 | return IRQ_HANDLED; | 345 | return IRQ_HANDLED; |
337 | } | 346 | } |
338 | 347 | ||
348 | static irqreturn_t mal_int(int irq, void *dev_instance) | ||
349 | { | ||
350 | struct mal_instance *mal = dev_instance; | ||
351 | u32 esr = get_mal_dcrn(mal, MAL_ESR); | ||
352 | |||
353 | if (esr & MAL_ESR_EVB) { | ||
354 | /* descriptor error */ | ||
355 | if (esr & MAL_ESR_DE) { | ||
356 | if (esr & MAL_ESR_CIDT) | ||
357 | return mal_rxde(irq, dev_instance); | ||
358 | else | ||
359 | return mal_txde(irq, dev_instance); | ||
360 | } else { /* SERR */ | ||
361 | return mal_serr(irq, dev_instance); | ||
362 | } | ||
363 | } | ||
364 | return IRQ_HANDLED; | ||
365 | } | ||
366 | |||
339 | void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac) | 367 | void mal_poll_disable(struct mal_instance *mal, struct mal_commac *commac) |
340 | { | 368 | { |
341 | /* Spinlock-type semantics: only one caller disable poll at a time */ | 369 | /* Spinlock-type semantics: only one caller disable poll at a time */ |
@@ -493,6 +521,8 @@ static int __devinit mal_probe(struct of_device *ofdev, | |||
493 | unsigned int dcr_base; | 521 | unsigned int dcr_base; |
494 | const u32 *prop; | 522 | const u32 *prop; |
495 | u32 cfg; | 523 | u32 cfg; |
524 | unsigned long irqflags; | ||
525 | irq_handler_t hdlr_serr, hdlr_txde, hdlr_rxde; | ||
496 | 526 | ||
497 | mal = kzalloc(sizeof(struct mal_instance), GFP_KERNEL); | 527 | mal = kzalloc(sizeof(struct mal_instance), GFP_KERNEL); |
498 | if (!mal) { | 528 | if (!mal) { |
@@ -542,11 +572,21 @@ static int __devinit mal_probe(struct of_device *ofdev, | |||
542 | goto fail; | 572 | goto fail; |
543 | } | 573 | } |
544 | 574 | ||
575 | if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez")) | ||
576 | mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | | ||
577 | MAL_FTR_COMMON_ERR_INT); | ||
578 | |||
545 | mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0); | 579 | mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0); |
546 | mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1); | 580 | mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1); |
547 | mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2); | 581 | mal->serr_irq = irq_of_parse_and_map(ofdev->node, 2); |
548 | mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3); | 582 | |
549 | mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4); | 583 | if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) { |
584 | mal->txde_irq = mal->rxde_irq = mal->serr_irq; | ||
585 | } else { | ||
586 | mal->txde_irq = irq_of_parse_and_map(ofdev->node, 3); | ||
587 | mal->rxde_irq = irq_of_parse_and_map(ofdev->node, 4); | ||
588 | } | ||
589 | |||
550 | if (mal->txeob_irq == NO_IRQ || mal->rxeob_irq == NO_IRQ || | 590 | if (mal->txeob_irq == NO_IRQ || mal->rxeob_irq == NO_IRQ || |
551 | mal->serr_irq == NO_IRQ || mal->txde_irq == NO_IRQ || | 591 | mal->serr_irq == NO_IRQ || mal->txde_irq == NO_IRQ || |
552 | mal->rxde_irq == NO_IRQ) { | 592 | mal->rxde_irq == NO_IRQ) { |
@@ -608,16 +648,26 @@ static int __devinit mal_probe(struct of_device *ofdev, | |||
608 | sizeof(struct mal_descriptor) * | 648 | sizeof(struct mal_descriptor) * |
609 | mal_rx_bd_offset(mal, i)); | 649 | mal_rx_bd_offset(mal, i)); |
610 | 650 | ||
611 | err = request_irq(mal->serr_irq, mal_serr, 0, "MAL SERR", mal); | 651 | if (mal_has_feature(mal, MAL_FTR_COMMON_ERR_INT)) { |
652 | irqflags = IRQF_SHARED; | ||
653 | hdlr_serr = hdlr_txde = hdlr_rxde = mal_int; | ||
654 | } else { | ||
655 | irqflags = 0; | ||
656 | hdlr_serr = mal_serr; | ||
657 | hdlr_txde = mal_txde; | ||
658 | hdlr_rxde = mal_rxde; | ||
659 | } | ||
660 | |||
661 | err = request_irq(mal->serr_irq, hdlr_serr, irqflags, "MAL SERR", mal); | ||
612 | if (err) | 662 | if (err) |
613 | goto fail2; | 663 | goto fail2; |
614 | err = request_irq(mal->txde_irq, mal_txde, 0, "MAL TX DE", mal); | 664 | err = request_irq(mal->txde_irq, hdlr_txde, irqflags, "MAL TX DE", mal); |
615 | if (err) | 665 | if (err) |
616 | goto fail3; | 666 | goto fail3; |
617 | err = request_irq(mal->txeob_irq, mal_txeob, 0, "MAL TX EOB", mal); | 667 | err = request_irq(mal->txeob_irq, mal_txeob, 0, "MAL TX EOB", mal); |
618 | if (err) | 668 | if (err) |
619 | goto fail4; | 669 | goto fail4; |
620 | err = request_irq(mal->rxde_irq, mal_rxde, 0, "MAL RX DE", mal); | 670 | err = request_irq(mal->rxde_irq, hdlr_rxde, irqflags, "MAL RX DE", mal); |
621 | if (err) | 671 | if (err) |
622 | goto fail5; | 672 | goto fail5; |
623 | err = request_irq(mal->rxeob_irq, mal_rxeob, 0, "MAL RX EOB", mal); | 673 | err = request_irq(mal->rxeob_irq, mal_rxeob, 0, "MAL RX EOB", mal); |
diff --git a/drivers/net/ibm_newemac/mal.h b/drivers/net/ibm_newemac/mal.h index 717dc38b6858..2f0a87360844 100644 --- a/drivers/net/ibm_newemac/mal.h +++ b/drivers/net/ibm_newemac/mal.h | |||
@@ -213,6 +213,8 @@ struct mal_instance { | |||
213 | struct of_device *ofdev; | 213 | struct of_device *ofdev; |
214 | int index; | 214 | int index; |
215 | spinlock_t lock; | 215 | spinlock_t lock; |
216 | |||
217 | unsigned int features; | ||
216 | }; | 218 | }; |
217 | 219 | ||
218 | static inline u32 get_mal_dcrn(struct mal_instance *mal, int reg) | 220 | static inline u32 get_mal_dcrn(struct mal_instance *mal, int reg) |
@@ -225,6 +227,38 @@ static inline void set_mal_dcrn(struct mal_instance *mal, int reg, u32 val) | |||
225 | dcr_write(mal->dcr_host, reg, val); | 227 | dcr_write(mal->dcr_host, reg, val); |
226 | } | 228 | } |
227 | 229 | ||
230 | /* Features of various MAL implementations */ | ||
231 | |||
232 | /* Set if you have interrupt coalescing and you have to clear the SDR | ||
233 | * register for TXEOB and RXEOB interrupts to work | ||
234 | */ | ||
235 | #define MAL_FTR_CLEAR_ICINTSTAT 0x00000001 | ||
236 | |||
237 | /* Set if your MAL has SERR, TXDE, and RXDE OR'd into a single UIC | ||
238 | * interrupt | ||
239 | */ | ||
240 | #define MAL_FTR_COMMON_ERR_INT 0x00000002 | ||
241 | |||
242 | enum { | ||
243 | MAL_FTRS_ALWAYS = 0, | ||
244 | |||
245 | MAL_FTRS_POSSIBLE = | ||
246 | #ifdef CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT | ||
247 | MAL_FTR_CLEAR_ICINTSTAT | | ||
248 | #endif | ||
249 | #ifdef CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR | ||
250 | MAL_FTR_COMMON_ERR_INT | | ||
251 | #endif | ||
252 | 0, | ||
253 | }; | ||
254 | |||
255 | static inline int mal_has_feature(struct mal_instance *dev, | ||
256 | unsigned long feature) | ||
257 | { | ||
258 | return (MAL_FTRS_ALWAYS & feature) || | ||
259 | (MAL_FTRS_POSSIBLE & dev->features & feature); | ||
260 | } | ||
261 | |||
228 | /* Register MAL devices */ | 262 | /* Register MAL devices */ |
229 | int mal_init(void); | 263 | int mal_init(void); |
230 | void mal_exit(void); | 264 | void mal_exit(void); |
diff --git a/drivers/net/ibm_newemac/phy.c b/drivers/net/ibm_newemac/phy.c index 9164abb72d9b..c40cd8df2212 100644 --- a/drivers/net/ibm_newemac/phy.c +++ b/drivers/net/ibm_newemac/phy.c | |||
@@ -38,6 +38,16 @@ static inline void phy_write(struct mii_phy *phy, int reg, int val) | |||
38 | phy->mdio_write(phy->dev, phy->address, reg, val); | 38 | phy->mdio_write(phy->dev, phy->address, reg, val); |
39 | } | 39 | } |
40 | 40 | ||
41 | static inline int gpcs_phy_read(struct mii_phy *phy, int reg) | ||
42 | { | ||
43 | return phy->mdio_read(phy->dev, phy->gpcs_address, reg); | ||
44 | } | ||
45 | |||
46 | static inline void gpcs_phy_write(struct mii_phy *phy, int reg, int val) | ||
47 | { | ||
48 | phy->mdio_write(phy->dev, phy->gpcs_address, reg, val); | ||
49 | } | ||
50 | |||
41 | int emac_mii_reset_phy(struct mii_phy *phy) | 51 | int emac_mii_reset_phy(struct mii_phy *phy) |
42 | { | 52 | { |
43 | int val; | 53 | int val; |
@@ -62,6 +72,37 @@ int emac_mii_reset_phy(struct mii_phy *phy) | |||
62 | return limit <= 0; | 72 | return limit <= 0; |
63 | } | 73 | } |
64 | 74 | ||
75 | int emac_mii_reset_gpcs(struct mii_phy *phy) | ||
76 | { | ||
77 | int val; | ||
78 | int limit = 10000; | ||
79 | |||
80 | val = gpcs_phy_read(phy, MII_BMCR); | ||
81 | val &= ~(BMCR_ISOLATE | BMCR_ANENABLE); | ||
82 | val |= BMCR_RESET; | ||
83 | gpcs_phy_write(phy, MII_BMCR, val); | ||
84 | |||
85 | udelay(300); | ||
86 | |||
87 | while (limit--) { | ||
88 | val = gpcs_phy_read(phy, MII_BMCR); | ||
89 | if (val >= 0 && (val & BMCR_RESET) == 0) | ||
90 | break; | ||
91 | udelay(10); | ||
92 | } | ||
93 | if ((val & BMCR_ISOLATE) && limit > 0) | ||
94 | gpcs_phy_write(phy, MII_BMCR, val & ~BMCR_ISOLATE); | ||
95 | |||
96 | if (limit > 0 && phy->mode == PHY_MODE_SGMII) { | ||
97 | /* Configure GPCS interface to recommended setting for SGMII */ | ||
98 | gpcs_phy_write(phy, 0x04, 0x8120); /* AsymPause, FDX */ | ||
99 | gpcs_phy_write(phy, 0x07, 0x2801); /* msg_pg, toggle */ | ||
100 | gpcs_phy_write(phy, 0x00, 0x0140); /* 1Gbps, FDX */ | ||
101 | } | ||
102 | |||
103 | return limit <= 0; | ||
104 | } | ||
105 | |||
65 | static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) | 106 | static int genmii_setup_aneg(struct mii_phy *phy, u32 advertise) |
66 | { | 107 | { |
67 | int ctl, adv; | 108 | int ctl, adv; |
@@ -332,6 +373,33 @@ static int m88e1111_init(struct mii_phy *phy) | |||
332 | return 0; | 373 | return 0; |
333 | } | 374 | } |
334 | 375 | ||
376 | static int m88e1112_init(struct mii_phy *phy) | ||
377 | { | ||
378 | /* | ||
379 | * Marvell 88E1112 PHY needs to have the SGMII MAC | ||
380 | * interace (page 2) properly configured to | ||
381 | * communicate with the 460EX/GT GPCS interface. | ||
382 | */ | ||
383 | |||
384 | u16 reg_short; | ||
385 | |||
386 | pr_debug("%s: Marvell 88E1112 Ethernet\n", __func__); | ||
387 | |||
388 | /* Set access to Page 2 */ | ||
389 | phy_write(phy, 0x16, 0x0002); | ||
390 | |||
391 | phy_write(phy, 0x00, 0x0040); /* 1Gbps */ | ||
392 | reg_short = (u16)(phy_read(phy, 0x1a)); | ||
393 | reg_short |= 0x8000; /* bypass Auto-Negotiation */ | ||
394 | phy_write(phy, 0x1a, reg_short); | ||
395 | emac_mii_reset_phy(phy); /* reset MAC interface */ | ||
396 | |||
397 | /* Reset access to Page 0 */ | ||
398 | phy_write(phy, 0x16, 0x0000); | ||
399 | |||
400 | return 0; | ||
401 | } | ||
402 | |||
335 | static int et1011c_init(struct mii_phy *phy) | 403 | static int et1011c_init(struct mii_phy *phy) |
336 | { | 404 | { |
337 | u16 reg_short; | 405 | u16 reg_short; |
@@ -384,11 +452,27 @@ static struct mii_phy_def m88e1111_phy_def = { | |||
384 | .ops = &m88e1111_phy_ops, | 452 | .ops = &m88e1111_phy_ops, |
385 | }; | 453 | }; |
386 | 454 | ||
455 | static struct mii_phy_ops m88e1112_phy_ops = { | ||
456 | .init = m88e1112_init, | ||
457 | .setup_aneg = genmii_setup_aneg, | ||
458 | .setup_forced = genmii_setup_forced, | ||
459 | .poll_link = genmii_poll_link, | ||
460 | .read_link = genmii_read_link | ||
461 | }; | ||
462 | |||
463 | static struct mii_phy_def m88e1112_phy_def = { | ||
464 | .phy_id = 0x01410C90, | ||
465 | .phy_id_mask = 0x0ffffff0, | ||
466 | .name = "Marvell 88E1112 Ethernet", | ||
467 | .ops = &m88e1112_phy_ops, | ||
468 | }; | ||
469 | |||
387 | static struct mii_phy_def *mii_phy_table[] = { | 470 | static struct mii_phy_def *mii_phy_table[] = { |
388 | &et1011c_phy_def, | 471 | &et1011c_phy_def, |
389 | &cis8201_phy_def, | 472 | &cis8201_phy_def, |
390 | &bcm5248_phy_def, | 473 | &bcm5248_phy_def, |
391 | &m88e1111_phy_def, | 474 | &m88e1111_phy_def, |
475 | &m88e1112_phy_def, | ||
392 | &genmii_phy_def, | 476 | &genmii_phy_def, |
393 | NULL | 477 | NULL |
394 | }; | 478 | }; |
diff --git a/drivers/net/ibm_newemac/phy.h b/drivers/net/ibm_newemac/phy.h index 1b65c81f6557..5d2bf4cbe50b 100644 --- a/drivers/net/ibm_newemac/phy.h +++ b/drivers/net/ibm_newemac/phy.h | |||
@@ -57,6 +57,7 @@ struct mii_phy { | |||
57 | or determined automaticaly */ | 57 | or determined automaticaly */ |
58 | int address; /* PHY address */ | 58 | int address; /* PHY address */ |
59 | int mode; /* PHY mode */ | 59 | int mode; /* PHY mode */ |
60 | int gpcs_address; /* GPCS PHY address */ | ||
60 | 61 | ||
61 | /* 1: autoneg enabled, 0: disabled */ | 62 | /* 1: autoneg enabled, 0: disabled */ |
62 | int autoneg; | 63 | int autoneg; |
@@ -81,5 +82,6 @@ struct mii_phy { | |||
81 | */ | 82 | */ |
82 | int emac_mii_phy_probe(struct mii_phy *phy, int address); | 83 | int emac_mii_phy_probe(struct mii_phy *phy, int address); |
83 | int emac_mii_reset_phy(struct mii_phy *phy); | 84 | int emac_mii_reset_phy(struct mii_phy *phy); |
85 | int emac_mii_reset_gpcs(struct mii_phy *phy); | ||
84 | 86 | ||
85 | #endif /* __IBM_NEWEMAC_PHY_H */ | 87 | #endif /* __IBM_NEWEMAC_PHY_H */ |
diff --git a/drivers/of/base.c b/drivers/of/base.c index ad8ac1a8af28..7c79e94a35ea 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
@@ -410,7 +410,7 @@ struct of_modalias_table { | |||
410 | char *modalias; | 410 | char *modalias; |
411 | }; | 411 | }; |
412 | static struct of_modalias_table of_modalias_table[] = { | 412 | static struct of_modalias_table of_modalias_table[] = { |
413 | /* Empty for now; add entries as needed */ | 413 | { "fsl,mcu-mpc8349emitx", "mcu-mpc8349emitx" }, |
414 | }; | 414 | }; |
415 | 415 | ||
416 | /** | 416 | /** |
@@ -420,13 +420,12 @@ static struct of_modalias_table of_modalias_table[] = { | |||
420 | * @len: Length of modalias value | 420 | * @len: Length of modalias value |
421 | * | 421 | * |
422 | * Based on the value of the compatible property, this routine will determine | 422 | * Based on the value of the compatible property, this routine will determine |
423 | * an appropriate modalias value for a particular device tree node. Three | 423 | * an appropriate modalias value for a particular device tree node. Two |
424 | * separate methods are used to derive a modalias value. | 424 | * separate methods are attempted to derive a modalias value. |
425 | * | 425 | * |
426 | * First method is to lookup the compatible value in of_modalias_table. | 426 | * First method is to lookup the compatible value in of_modalias_table. |
427 | * Second is to look for a "linux,<modalias>" entry in the compatible list | 427 | * Second is to strip off the manufacturer prefix from the first |
428 | * and used that for modalias. Third is to strip off the manufacturer | 428 | * compatible entry and use the remainder as modalias |
429 | * prefix from the first compatible entry and use the remainder as modalias | ||
430 | * | 429 | * |
431 | * This routine returns 0 on success | 430 | * This routine returns 0 on success |
432 | */ | 431 | */ |
@@ -449,21 +448,7 @@ int of_modalias_node(struct device_node *node, char *modalias, int len) | |||
449 | if (!compatible) | 448 | if (!compatible) |
450 | return -ENODEV; | 449 | return -ENODEV; |
451 | 450 | ||
452 | /* 2. search for linux,<modalias> entry */ | 451 | /* 2. take first compatible entry and strip manufacturer */ |
453 | p = compatible; | ||
454 | while (cplen > 0) { | ||
455 | if (!strncmp(p, "linux,", 6)) { | ||
456 | p += 6; | ||
457 | strlcpy(modalias, p, len); | ||
458 | return 0; | ||
459 | } | ||
460 | |||
461 | i = strlen(p) + 1; | ||
462 | p += i; | ||
463 | cplen -= i; | ||
464 | } | ||
465 | |||
466 | /* 3. take first compatible entry and strip manufacturer */ | ||
467 | p = strchr(compatible, ','); | 452 | p = strchr(compatible, ','); |
468 | if (!p) | 453 | if (!p) |
469 | return -ENODEV; | 454 | return -ENODEV; |
@@ -473,3 +458,112 @@ int of_modalias_node(struct device_node *node, char *modalias, int len) | |||
473 | } | 458 | } |
474 | EXPORT_SYMBOL_GPL(of_modalias_node); | 459 | EXPORT_SYMBOL_GPL(of_modalias_node); |
475 | 460 | ||
461 | /** | ||
462 | * of_parse_phandles_with_args - Find a node pointed by phandle in a list | ||
463 | * @np: pointer to a device tree node containing a list | ||
464 | * @list_name: property name that contains a list | ||
465 | * @cells_name: property name that specifies phandles' arguments count | ||
466 | * @index: index of a phandle to parse out | ||
467 | * @out_node: pointer to device_node struct pointer (will be filled) | ||
468 | * @out_args: pointer to arguments pointer (will be filled) | ||
469 | * | ||
470 | * This function is useful to parse lists of phandles and their arguments. | ||
471 | * Returns 0 on success and fills out_node and out_args, on error returns | ||
472 | * appropriate errno value. | ||
473 | * | ||
474 | * Example: | ||
475 | * | ||
476 | * phandle1: node1 { | ||
477 | * #list-cells = <2>; | ||
478 | * } | ||
479 | * | ||
480 | * phandle2: node2 { | ||
481 | * #list-cells = <1>; | ||
482 | * } | ||
483 | * | ||
484 | * node3 { | ||
485 | * list = <&phandle1 1 2 &phandle2 3>; | ||
486 | * } | ||
487 | * | ||
488 | * To get a device_node of the `node2' node you may call this: | ||
489 | * of_parse_phandles_with_args(node3, "list", "#list-cells", 2, &node2, &args); | ||
490 | */ | ||
491 | int of_parse_phandles_with_args(struct device_node *np, const char *list_name, | ||
492 | const char *cells_name, int index, | ||
493 | struct device_node **out_node, | ||
494 | const void **out_args) | ||
495 | { | ||
496 | int ret = -EINVAL; | ||
497 | const u32 *list; | ||
498 | const u32 *list_end; | ||
499 | int size; | ||
500 | int cur_index = 0; | ||
501 | struct device_node *node = NULL; | ||
502 | const void *args; | ||
503 | |||
504 | list = of_get_property(np, list_name, &size); | ||
505 | if (!list) { | ||
506 | ret = -ENOENT; | ||
507 | goto err0; | ||
508 | } | ||
509 | list_end = list + size / sizeof(*list); | ||
510 | |||
511 | while (list < list_end) { | ||
512 | const u32 *cells; | ||
513 | const phandle *phandle; | ||
514 | |||
515 | phandle = list; | ||
516 | args = list + 1; | ||
517 | |||
518 | /* one cell hole in the list = <>; */ | ||
519 | if (!*phandle) { | ||
520 | list++; | ||
521 | goto next; | ||
522 | } | ||
523 | |||
524 | node = of_find_node_by_phandle(*phandle); | ||
525 | if (!node) { | ||
526 | pr_debug("%s: could not find phandle\n", | ||
527 | np->full_name); | ||
528 | goto err0; | ||
529 | } | ||
530 | |||
531 | cells = of_get_property(node, cells_name, &size); | ||
532 | if (!cells || size != sizeof(*cells)) { | ||
533 | pr_debug("%s: could not get %s for %s\n", | ||
534 | np->full_name, cells_name, node->full_name); | ||
535 | goto err1; | ||
536 | } | ||
537 | |||
538 | /* Next phandle is at offset of one phandle cell + #cells */ | ||
539 | list += 1 + *cells; | ||
540 | if (list > list_end) { | ||
541 | pr_debug("%s: insufficient arguments length\n", | ||
542 | np->full_name); | ||
543 | goto err1; | ||
544 | } | ||
545 | next: | ||
546 | if (cur_index == index) | ||
547 | break; | ||
548 | |||
549 | of_node_put(node); | ||
550 | node = NULL; | ||
551 | cur_index++; | ||
552 | } | ||
553 | |||
554 | if (!node) { | ||
555 | ret = -ENOENT; | ||
556 | goto err0; | ||
557 | } | ||
558 | |||
559 | *out_node = node; | ||
560 | *out_args = args; | ||
561 | |||
562 | return 0; | ||
563 | err1: | ||
564 | of_node_put(node); | ||
565 | err0: | ||
566 | pr_debug("%s failed with status %d\n", __func__, ret); | ||
567 | return ret; | ||
568 | } | ||
569 | EXPORT_SYMBOL(of_parse_phandles_with_args); | ||
diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c index 1c9cab844f10..7cd7301b5839 100644 --- a/drivers/of/gpio.c +++ b/drivers/of/gpio.c | |||
@@ -28,78 +28,35 @@ | |||
28 | */ | 28 | */ |
29 | int of_get_gpio(struct device_node *np, int index) | 29 | int of_get_gpio(struct device_node *np, int index) |
30 | { | 30 | { |
31 | int ret = -EINVAL; | 31 | int ret; |
32 | struct device_node *gc; | 32 | struct device_node *gc; |
33 | struct of_gpio_chip *of_gc = NULL; | 33 | struct of_gpio_chip *of_gc = NULL; |
34 | int size; | 34 | int size; |
35 | const u32 *gpios; | ||
36 | u32 nr_cells; | ||
37 | int i; | ||
38 | const void *gpio_spec; | 35 | const void *gpio_spec; |
39 | const u32 *gpio_cells; | 36 | const u32 *gpio_cells; |
40 | int gpio_index = 0; | ||
41 | 37 | ||
42 | gpios = of_get_property(np, "gpios", &size); | 38 | ret = of_parse_phandles_with_args(np, "gpios", "#gpio-cells", index, |
43 | if (!gpios) { | 39 | &gc, &gpio_spec); |
44 | ret = -ENOENT; | 40 | if (ret) { |
41 | pr_debug("%s: can't parse gpios property\n", __func__); | ||
45 | goto err0; | 42 | goto err0; |
46 | } | 43 | } |
47 | nr_cells = size / sizeof(u32); | ||
48 | |||
49 | for (i = 0; i < nr_cells; gpio_index++) { | ||
50 | const phandle *gpio_phandle; | ||
51 | |||
52 | gpio_phandle = gpios + i; | ||
53 | gpio_spec = gpio_phandle + 1; | ||
54 | |||
55 | /* one cell hole in the gpios = <>; */ | ||
56 | if (!*gpio_phandle) { | ||
57 | if (gpio_index == index) | ||
58 | return -ENOENT; | ||
59 | i++; | ||
60 | continue; | ||
61 | } | ||
62 | |||
63 | gc = of_find_node_by_phandle(*gpio_phandle); | ||
64 | if (!gc) { | ||
65 | pr_debug("%s: could not find phandle for gpios\n", | ||
66 | np->full_name); | ||
67 | goto err0; | ||
68 | } | ||
69 | |||
70 | of_gc = gc->data; | ||
71 | if (!of_gc) { | ||
72 | pr_debug("%s: gpio controller %s isn't registered\n", | ||
73 | np->full_name, gc->full_name); | ||
74 | goto err1; | ||
75 | } | ||
76 | |||
77 | gpio_cells = of_get_property(gc, "#gpio-cells", &size); | ||
78 | if (!gpio_cells || size != sizeof(*gpio_cells) || | ||
79 | *gpio_cells != of_gc->gpio_cells) { | ||
80 | pr_debug("%s: wrong #gpio-cells for %s\n", | ||
81 | np->full_name, gc->full_name); | ||
82 | goto err1; | ||
83 | } | ||
84 | |||
85 | /* Next phandle is at phandle cells + #gpio-cells */ | ||
86 | i += sizeof(*gpio_phandle) / sizeof(u32) + *gpio_cells; | ||
87 | if (i >= nr_cells + 1) { | ||
88 | pr_debug("%s: insufficient gpio-spec length\n", | ||
89 | np->full_name); | ||
90 | goto err1; | ||
91 | } | ||
92 | |||
93 | if (gpio_index == index) | ||
94 | break; | ||
95 | |||
96 | of_gc = NULL; | ||
97 | of_node_put(gc); | ||
98 | } | ||
99 | 44 | ||
45 | of_gc = gc->data; | ||
100 | if (!of_gc) { | 46 | if (!of_gc) { |
101 | ret = -ENOENT; | 47 | pr_debug("%s: gpio controller %s isn't registered\n", |
102 | goto err0; | 48 | np->full_name, gc->full_name); |
49 | ret = -ENODEV; | ||
50 | goto err1; | ||
51 | } | ||
52 | |||
53 | gpio_cells = of_get_property(gc, "#gpio-cells", &size); | ||
54 | if (!gpio_cells || size != sizeof(*gpio_cells) || | ||
55 | *gpio_cells != of_gc->gpio_cells) { | ||
56 | pr_debug("%s: wrong #gpio-cells for %s\n", | ||
57 | np->full_name, gc->full_name); | ||
58 | ret = -EINVAL; | ||
59 | goto err1; | ||
103 | } | 60 | } |
104 | 61 | ||
105 | ret = of_gc->xlate(of_gc, np, gpio_spec); | 62 | ret = of_gc->xlate(of_gc, np, gpio_spec); |
diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c index 9b714ea93d20..50884507b8be 100644 --- a/drivers/pci/hotplug/rpaphp_slot.c +++ b/drivers/pci/hotplug/rpaphp_slot.c | |||
@@ -147,9 +147,5 @@ int rpaphp_register_slot(struct slot *slot) | |||
147 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); | 147 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); |
148 | info("Slot [%s] registered\n", slot->name); | 148 | info("Slot [%s] registered\n", slot->name); |
149 | return 0; | 149 | return 0; |
150 | |||
151 | sysfs_fail: | ||
152 | pci_hp_deregister(php_slot); | ||
153 | return retval; | ||
154 | } | 150 | } |
155 | 151 | ||
diff --git a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c index 101a835e8759..46455fbab6d5 100644 --- a/drivers/pnp/isapnp/core.c +++ b/drivers/pnp/isapnp/core.c | |||
@@ -1012,7 +1012,7 @@ static int __init isapnp_init(void) | |||
1012 | printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n"); | 1012 | printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n"); |
1013 | return 0; | 1013 | return 0; |
1014 | } | 1014 | } |
1015 | #ifdef CONFIG_PPC_MERGE | 1015 | #ifdef CONFIG_PPC |
1016 | if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP)) | 1016 | if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP)) |
1017 | return -EINVAL; | 1017 | return -EINVAL; |
1018 | #endif | 1018 | #endif |
diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c index 662dfcddedc6..2bfe13369df5 100644 --- a/drivers/pnp/pnpbios/core.c +++ b/drivers/pnp/pnpbios/core.c | |||
@@ -519,7 +519,7 @@ static int __init pnpbios_init(void) | |||
519 | { | 519 | { |
520 | int ret; | 520 | int ret; |
521 | 521 | ||
522 | #if defined(CONFIG_PPC_MERGE) | 522 | #if defined(CONFIG_PPC) |
523 | if (check_legacy_ioport(PNPBIOS_BASE)) | 523 | if (check_legacy_ioport(PNPBIOS_BASE)) |
524 | return -ENODEV; | 524 | return -ENODEV; |
525 | #endif | 525 | #endif |
@@ -577,7 +577,7 @@ static int __init pnpbios_thread_init(void) | |||
577 | { | 577 | { |
578 | struct task_struct *task; | 578 | struct task_struct *task; |
579 | 579 | ||
580 | #if defined(CONFIG_PPC_MERGE) | 580 | #if defined(CONFIG_PPC) |
581 | if (check_legacy_ioport(PNPBIOS_BASE)) | 581 | if (check_legacy_ioport(PNPBIOS_BASE)) |
582 | return 0; | 582 | return 0; |
583 | #endif | 583 | #endif |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 31786b3b0a68..db783b77a881 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -1123,42 +1123,6 @@ config SERIAL_CPM_CONSOLE | |||
1123 | your boot loader (lilo or loadlin) about how to pass options to the | 1123 | your boot loader (lilo or loadlin) about how to pass options to the |
1124 | kernel at boot time.) | 1124 | kernel at boot time.) |
1125 | 1125 | ||
1126 | config SERIAL_CPM_SCC1 | ||
1127 | bool "Support for SCC1 serial port" | ||
1128 | depends on SERIAL_CPM=y | ||
1129 | help | ||
1130 | Select this option to use SCC1 as a serial port | ||
1131 | |||
1132 | config SERIAL_CPM_SCC2 | ||
1133 | bool "Support for SCC2 serial port" | ||
1134 | depends on SERIAL_CPM=y | ||
1135 | help | ||
1136 | Select this option to use SCC2 as a serial port | ||
1137 | |||
1138 | config SERIAL_CPM_SCC3 | ||
1139 | bool "Support for SCC3 serial port" | ||
1140 | depends on SERIAL_CPM=y | ||
1141 | help | ||
1142 | Select this option to use SCC3 as a serial port | ||
1143 | |||
1144 | config SERIAL_CPM_SCC4 | ||
1145 | bool "Support for SCC4 serial port" | ||
1146 | depends on SERIAL_CPM=y | ||
1147 | help | ||
1148 | Select this option to use SCC4 as a serial port | ||
1149 | |||
1150 | config SERIAL_CPM_SMC1 | ||
1151 | bool "Support for SMC1 serial port" | ||
1152 | depends on SERIAL_CPM=y | ||
1153 | help | ||
1154 | Select this option to use SMC1 as a serial port | ||
1155 | |||
1156 | config SERIAL_CPM_SMC2 | ||
1157 | bool "Support for SMC2 serial port" | ||
1158 | depends on SERIAL_CPM=y | ||
1159 | help | ||
1160 | Select this option to use SMC2 as a serial port | ||
1161 | |||
1162 | config SERIAL_SGI_L1_CONSOLE | 1126 | config SERIAL_SGI_L1_CONSOLE |
1163 | bool "SGI Altix L1 serial console support" | 1127 | bool "SGI Altix L1 serial console support" |
1164 | depends on IA64_GENERIC || IA64_SGI_SN2 | 1128 | depends on IA64_GENERIC || IA64_SGI_SN2 |
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index 25efca5a7a1f..a6c4d744495e 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
@@ -1333,6 +1333,9 @@ static int __devinit cpm_uart_probe(struct of_device *ofdev, | |||
1333 | if (ret) | 1333 | if (ret) |
1334 | return ret; | 1334 | return ret; |
1335 | 1335 | ||
1336 | /* initialize the device pointer for the port */ | ||
1337 | pinfo->port.dev = &ofdev->dev; | ||
1338 | |||
1336 | return uart_add_one_port(&cpm_reg, &pinfo->port); | 1339 | return uart_add_one_port(&cpm_reg, &pinfo->port); |
1337 | } | 1340 | } |
1338 | 1341 | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.c b/drivers/serial/cpm_uart/cpm_uart_cpm1.c index 0f0aff06c596..1b94c56ec239 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c | |||
@@ -100,7 +100,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) | |||
100 | mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8)); | 100 | mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8)); |
101 | dma_addr = (u32)cpm_dpram_phys(mem_addr); | 101 | dma_addr = (u32)cpm_dpram_phys(mem_addr); |
102 | } else | 102 | } else |
103 | mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, | 103 | mem_addr = dma_alloc_coherent(pinfo->port.dev, memsz, &dma_addr, |
104 | GFP_KERNEL); | 104 | GFP_KERNEL); |
105 | 105 | ||
106 | if (mem_addr == NULL) { | 106 | if (mem_addr == NULL) { |
@@ -127,8 +127,8 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) | |||
127 | 127 | ||
128 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo) | 128 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo) |
129 | { | 129 | { |
130 | dma_free_coherent(NULL, L1_CACHE_ALIGN(pinfo->rx_nrfifos * | 130 | dma_free_coherent(pinfo->port.dev, L1_CACHE_ALIGN(pinfo->rx_nrfifos * |
131 | pinfo->rx_fifosize) + | 131 | pinfo->rx_fifosize) + |
132 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * | 132 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * |
133 | pinfo->tx_fifosize), pinfo->mem_addr, | 133 | pinfo->tx_fifosize), pinfo->mem_addr, |
134 | pinfo->dma_addr); | 134 | pinfo->dma_addr); |
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm2.c b/drivers/serial/cpm_uart/cpm_uart_cpm2.c index b8db4d3eed36..141c0a3333ad 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c | |||
@@ -136,7 +136,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) | |||
136 | dma_addr = virt_to_bus(mem_addr); | 136 | dma_addr = virt_to_bus(mem_addr); |
137 | } | 137 | } |
138 | else | 138 | else |
139 | mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, | 139 | mem_addr = dma_alloc_coherent(pinfo->port.dev, memsz, &dma_addr, |
140 | GFP_KERNEL); | 140 | GFP_KERNEL); |
141 | 141 | ||
142 | if (mem_addr == NULL) { | 142 | if (mem_addr == NULL) { |
@@ -163,8 +163,8 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) | |||
163 | 163 | ||
164 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo) | 164 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo) |
165 | { | 165 | { |
166 | dma_free_coherent(NULL, L1_CACHE_ALIGN(pinfo->rx_nrfifos * | 166 | dma_free_coherent(pinfo->port.dev, L1_CACHE_ALIGN(pinfo->rx_nrfifos * |
167 | pinfo->rx_fifosize) + | 167 | pinfo->rx_fifosize) + |
168 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * | 168 | L1_CACHE_ALIGN(pinfo->tx_nrfifos * |
169 | pinfo->tx_fifosize), (void __force *)pinfo->mem_addr, | 169 | pinfo->tx_fifosize), (void __force *)pinfo->mem_addr, |
170 | pinfo->dma_addr); | 170 | pinfo->dma_addr); |
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 36126070d9af..6117d3db0b66 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
@@ -72,13 +72,8 @@ | |||
72 | #include <linux/console.h> | 72 | #include <linux/console.h> |
73 | #include <linux/delay.h> | 73 | #include <linux/delay.h> |
74 | #include <linux/io.h> | 74 | #include <linux/io.h> |
75 | |||
76 | #if defined(CONFIG_PPC_MERGE) | ||
77 | #include <linux/of.h> | 75 | #include <linux/of.h> |
78 | #include <linux/of_platform.h> | 76 | #include <linux/of_platform.h> |
79 | #else | ||
80 | #include <linux/platform_device.h> | ||
81 | #endif | ||
82 | 77 | ||
83 | #include <asm/mpc52xx.h> | 78 | #include <asm/mpc52xx.h> |
84 | #include <asm/mpc512x.h> | 79 | #include <asm/mpc512x.h> |
@@ -107,12 +102,11 @@ static struct uart_port mpc52xx_uart_ports[MPC52xx_PSC_MAXNUM]; | |||
107 | * it's cleared, then a memset(...,0,...) should be added to | 102 | * it's cleared, then a memset(...,0,...) should be added to |
108 | * the console_init | 103 | * the console_init |
109 | */ | 104 | */ |
110 | #if defined(CONFIG_PPC_MERGE) | 105 | |
111 | /* lookup table for matching device nodes to index numbers */ | 106 | /* lookup table for matching device nodes to index numbers */ |
112 | static struct device_node *mpc52xx_uart_nodes[MPC52xx_PSC_MAXNUM]; | 107 | static struct device_node *mpc52xx_uart_nodes[MPC52xx_PSC_MAXNUM]; |
113 | 108 | ||
114 | static void mpc52xx_uart_of_enumerate(void); | 109 | static void mpc52xx_uart_of_enumerate(void); |
115 | #endif | ||
116 | 110 | ||
117 | 111 | ||
118 | #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase)) | 112 | #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase)) |
@@ -255,17 +249,12 @@ static void mpc52xx_psc_cw_restore_ints(struct uart_port *port) | |||
255 | /* Search for bus-frequency property in this node or a parent */ | 249 | /* Search for bus-frequency property in this node or a parent */ |
256 | static unsigned long mpc52xx_getuartclk(void *p) | 250 | static unsigned long mpc52xx_getuartclk(void *p) |
257 | { | 251 | { |
258 | #if defined(CONFIG_PPC_MERGE) | ||
259 | /* | 252 | /* |
260 | * 5200 UARTs have a / 32 prescaler | 253 | * 5200 UARTs have a / 32 prescaler |
261 | * but the generic serial code assumes 16 | 254 | * but the generic serial code assumes 16 |
262 | * so return ipb freq / 2 | 255 | * so return ipb freq / 2 |
263 | */ | 256 | */ |
264 | return mpc52xx_find_ipb_freq(p) / 2; | 257 | return mpc52xx_find_ipb_freq(p) / 2; |
265 | #else | ||
266 | pr_debug("unexpected call to mpc52xx_getuartclk with arch/ppc\n"); | ||
267 | return NULL; | ||
268 | #endif | ||
269 | } | 258 | } |
270 | 259 | ||
271 | static struct psc_ops mpc52xx_psc_ops = { | 260 | static struct psc_ops mpc52xx_psc_ops = { |
@@ -886,10 +875,6 @@ mpc52xx_console_get_options(struct uart_port *port, | |||
886 | 875 | ||
887 | /* CT{U,L}R are write-only ! */ | 876 | /* CT{U,L}R are write-only ! */ |
888 | *baud = CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD; | 877 | *baud = CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD; |
889 | #if !defined(CONFIG_PPC_MERGE) | ||
890 | if (__res.bi_baudrate) | ||
891 | *baud = __res.bi_baudrate; | ||
892 | #endif | ||
893 | 878 | ||
894 | /* Parse them */ | 879 | /* Parse them */ |
895 | switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) { | 880 | switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) { |
@@ -946,42 +931,6 @@ mpc52xx_console_write(struct console *co, const char *s, unsigned int count) | |||
946 | psc_ops->cw_restore_ints(port); | 931 | psc_ops->cw_restore_ints(port); |
947 | } | 932 | } |
948 | 933 | ||
949 | #if !defined(CONFIG_PPC_MERGE) | ||
950 | static int __init | ||
951 | mpc52xx_console_setup(struct console *co, char *options) | ||
952 | { | ||
953 | struct uart_port *port = &mpc52xx_uart_ports[co->index]; | ||
954 | |||
955 | int baud = CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD; | ||
956 | int bits = 8; | ||
957 | int parity = 'n'; | ||
958 | int flow = 'n'; | ||
959 | |||
960 | if (co->index < 0 || co->index >= MPC52xx_PSC_MAXNUM) | ||
961 | return -EINVAL; | ||
962 | |||
963 | /* Basic port init. Needed since we use some uart_??? func before | ||
964 | * real init for early access */ | ||
965 | spin_lock_init(&port->lock); | ||
966 | port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */ | ||
967 | port->ops = &mpc52xx_uart_ops; | ||
968 | port->mapbase = MPC52xx_PA(MPC52xx_PSCx_OFFSET(co->index+1)); | ||
969 | |||
970 | /* We ioremap ourself */ | ||
971 | port->membase = ioremap(port->mapbase, MPC52xx_PSC_SIZE); | ||
972 | if (port->membase == NULL) | ||
973 | return -EINVAL; | ||
974 | |||
975 | /* Setup the port parameters accoding to options */ | ||
976 | if (options) | ||
977 | uart_parse_options(options, &baud, &parity, &bits, &flow); | ||
978 | else | ||
979 | mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow); | ||
980 | |||
981 | return uart_set_options(port, co, baud, parity, bits, flow); | ||
982 | } | ||
983 | |||
984 | #else | ||
985 | 934 | ||
986 | static int __init | 935 | static int __init |
987 | mpc52xx_console_setup(struct console *co, char *options) | 936 | mpc52xx_console_setup(struct console *co, char *options) |
@@ -1053,7 +1002,6 @@ mpc52xx_console_setup(struct console *co, char *options) | |||
1053 | 1002 | ||
1054 | return uart_set_options(port, co, baud, parity, bits, flow); | 1003 | return uart_set_options(port, co, baud, parity, bits, flow); |
1055 | } | 1004 | } |
1056 | #endif /* defined(CONFIG_PPC_MERGE) */ | ||
1057 | 1005 | ||
1058 | 1006 | ||
1059 | static struct uart_driver mpc52xx_uart_driver; | 1007 | static struct uart_driver mpc52xx_uart_driver; |
@@ -1072,9 +1020,7 @@ static struct console mpc52xx_console = { | |||
1072 | static int __init | 1020 | static int __init |
1073 | mpc52xx_console_init(void) | 1021 | mpc52xx_console_init(void) |
1074 | { | 1022 | { |
1075 | #if defined(CONFIG_PPC_MERGE) | ||
1076 | mpc52xx_uart_of_enumerate(); | 1023 | mpc52xx_uart_of_enumerate(); |
1077 | #endif | ||
1078 | register_console(&mpc52xx_console); | 1024 | register_console(&mpc52xx_console); |
1079 | return 0; | 1025 | return 0; |
1080 | } | 1026 | } |
@@ -1100,115 +1046,6 @@ static struct uart_driver mpc52xx_uart_driver = { | |||
1100 | .cons = MPC52xx_PSC_CONSOLE, | 1046 | .cons = MPC52xx_PSC_CONSOLE, |
1101 | }; | 1047 | }; |
1102 | 1048 | ||
1103 | |||
1104 | #if !defined(CONFIG_PPC_MERGE) | ||
1105 | /* ======================================================================== */ | ||
1106 | /* Platform Driver */ | ||
1107 | /* ======================================================================== */ | ||
1108 | |||
1109 | static int __devinit | ||
1110 | mpc52xx_uart_probe(struct platform_device *dev) | ||
1111 | { | ||
1112 | struct resource *res = dev->resource; | ||
1113 | |||
1114 | struct uart_port *port = NULL; | ||
1115 | int i, idx, ret; | ||
1116 | |||
1117 | /* Check validity & presence */ | ||
1118 | idx = dev->id; | ||
1119 | if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM) | ||
1120 | return -EINVAL; | ||
1121 | |||
1122 | if (!mpc52xx_match_psc_function(idx, "uart")) | ||
1123 | return -ENODEV; | ||
1124 | |||
1125 | /* Init the port structure */ | ||
1126 | port = &mpc52xx_uart_ports[idx]; | ||
1127 | |||
1128 | spin_lock_init(&port->lock); | ||
1129 | port->uartclk = __res.bi_ipbfreq / 2; /* Look at CTLR doc */ | ||
1130 | port->fifosize = 512; | ||
1131 | port->iotype = UPIO_MEM; | ||
1132 | port->flags = UPF_BOOT_AUTOCONF | | ||
1133 | (uart_console(port) ? 0 : UPF_IOREMAP); | ||
1134 | port->line = idx; | ||
1135 | port->ops = &mpc52xx_uart_ops; | ||
1136 | port->dev = &dev->dev; | ||
1137 | |||
1138 | /* Search for IRQ and mapbase */ | ||
1139 | for (i = 0 ; i < dev->num_resources ; i++, res++) { | ||
1140 | if (res->flags & IORESOURCE_MEM) | ||
1141 | port->mapbase = res->start; | ||
1142 | else if (res->flags & IORESOURCE_IRQ) | ||
1143 | port->irq = res->start; | ||
1144 | } | ||
1145 | if (!port->irq || !port->mapbase) | ||
1146 | return -EINVAL; | ||
1147 | |||
1148 | /* Add the port to the uart sub-system */ | ||
1149 | ret = uart_add_one_port(&mpc52xx_uart_driver, port); | ||
1150 | if (!ret) | ||
1151 | platform_set_drvdata(dev, (void *)port); | ||
1152 | |||
1153 | return ret; | ||
1154 | } | ||
1155 | |||
1156 | static int | ||
1157 | mpc52xx_uart_remove(struct platform_device *dev) | ||
1158 | { | ||
1159 | struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); | ||
1160 | |||
1161 | platform_set_drvdata(dev, NULL); | ||
1162 | |||
1163 | if (port) | ||
1164 | uart_remove_one_port(&mpc52xx_uart_driver, port); | ||
1165 | |||
1166 | return 0; | ||
1167 | } | ||
1168 | |||
1169 | #ifdef CONFIG_PM | ||
1170 | static int | ||
1171 | mpc52xx_uart_suspend(struct platform_device *dev, pm_message_t state) | ||
1172 | { | ||
1173 | struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); | ||
1174 | |||
1175 | if (port) | ||
1176 | uart_suspend_port(&mpc52xx_uart_driver, port); | ||
1177 | |||
1178 | return 0; | ||
1179 | } | ||
1180 | |||
1181 | static int | ||
1182 | mpc52xx_uart_resume(struct platform_device *dev) | ||
1183 | { | ||
1184 | struct uart_port *port = (struct uart_port *) platform_get_drvdata(dev); | ||
1185 | |||
1186 | if (port) | ||
1187 | uart_resume_port(&mpc52xx_uart_driver, port); | ||
1188 | |||
1189 | return 0; | ||
1190 | } | ||
1191 | #endif | ||
1192 | |||
1193 | /* work with hotplug and coldplug */ | ||
1194 | MODULE_ALIAS("platform:mpc52xx-psc"); | ||
1195 | |||
1196 | static struct platform_driver mpc52xx_uart_platform_driver = { | ||
1197 | .probe = mpc52xx_uart_probe, | ||
1198 | .remove = mpc52xx_uart_remove, | ||
1199 | #ifdef CONFIG_PM | ||
1200 | .suspend = mpc52xx_uart_suspend, | ||
1201 | .resume = mpc52xx_uart_resume, | ||
1202 | #endif | ||
1203 | .driver = { | ||
1204 | .owner = THIS_MODULE, | ||
1205 | .name = "mpc52xx-psc", | ||
1206 | }, | ||
1207 | }; | ||
1208 | #endif /* !defined(CONFIG_PPC_MERGE) */ | ||
1209 | |||
1210 | |||
1211 | #if defined(CONFIG_PPC_MERGE) | ||
1212 | /* ======================================================================== */ | 1049 | /* ======================================================================== */ |
1213 | /* OF Platform Driver */ | 1050 | /* OF Platform Driver */ |
1214 | /* ======================================================================== */ | 1051 | /* ======================================================================== */ |
@@ -1402,7 +1239,6 @@ static struct of_platform_driver mpc52xx_uart_of_driver = { | |||
1402 | .name = "mpc52xx-psc-uart", | 1239 | .name = "mpc52xx-psc-uart", |
1403 | }, | 1240 | }, |
1404 | }; | 1241 | }; |
1405 | #endif /* defined(CONFIG_PPC_MERGE) */ | ||
1406 | 1242 | ||
1407 | 1243 | ||
1408 | /* ======================================================================== */ | 1244 | /* ======================================================================== */ |
@@ -1423,7 +1259,6 @@ mpc52xx_uart_init(void) | |||
1423 | return ret; | 1259 | return ret; |
1424 | } | 1260 | } |
1425 | 1261 | ||
1426 | #if defined(CONFIG_PPC_MERGE) | ||
1427 | mpc52xx_uart_of_enumerate(); | 1262 | mpc52xx_uart_of_enumerate(); |
1428 | 1263 | ||
1429 | ret = of_register_platform_driver(&mpc52xx_uart_of_driver); | 1264 | ret = of_register_platform_driver(&mpc52xx_uart_of_driver); |
@@ -1433,16 +1268,6 @@ mpc52xx_uart_init(void) | |||
1433 | uart_unregister_driver(&mpc52xx_uart_driver); | 1268 | uart_unregister_driver(&mpc52xx_uart_driver); |
1434 | return ret; | 1269 | return ret; |
1435 | } | 1270 | } |
1436 | #else | ||
1437 | psc_ops = &mpc52xx_psc_ops; | ||
1438 | ret = platform_driver_register(&mpc52xx_uart_platform_driver); | ||
1439 | if (ret) { | ||
1440 | printk(KERN_ERR "%s: platform_driver_register failed (%i)\n", | ||
1441 | __FILE__, ret); | ||
1442 | uart_unregister_driver(&mpc52xx_uart_driver); | ||
1443 | return ret; | ||
1444 | } | ||
1445 | #endif | ||
1446 | 1271 | ||
1447 | return 0; | 1272 | return 0; |
1448 | } | 1273 | } |
@@ -1450,11 +1275,7 @@ mpc52xx_uart_init(void) | |||
1450 | static void __exit | 1275 | static void __exit |
1451 | mpc52xx_uart_exit(void) | 1276 | mpc52xx_uart_exit(void) |
1452 | { | 1277 | { |
1453 | #if defined(CONFIG_PPC_MERGE) | ||
1454 | of_unregister_platform_driver(&mpc52xx_uart_of_driver); | 1278 | of_unregister_platform_driver(&mpc52xx_uart_of_driver); |
1455 | #else | ||
1456 | platform_driver_unregister(&mpc52xx_uart_platform_driver); | ||
1457 | #endif | ||
1458 | uart_unregister_driver(&mpc52xx_uart_driver); | 1279 | uart_unregister_driver(&mpc52xx_uart_driver); |
1459 | } | 1280 | } |
1460 | 1281 | ||
diff --git a/drivers/serial/ucc_uart.c b/drivers/serial/ucc_uart.c index 5c5d18dcb6ac..539c933b335f 100644 --- a/drivers/serial/ucc_uart.c +++ b/drivers/serial/ucc_uart.c | |||
@@ -1009,7 +1009,7 @@ static int qe_uart_request_port(struct uart_port *port) | |||
1009 | rx_size = L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize); | 1009 | rx_size = L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize); |
1010 | tx_size = L1_CACHE_ALIGN(qe_port->tx_nrfifos * qe_port->tx_fifosize); | 1010 | tx_size = L1_CACHE_ALIGN(qe_port->tx_nrfifos * qe_port->tx_fifosize); |
1011 | 1011 | ||
1012 | bd_virt = dma_alloc_coherent(NULL, rx_size + tx_size, &bd_dma_addr, | 1012 | bd_virt = dma_alloc_coherent(port->dev, rx_size + tx_size, &bd_dma_addr, |
1013 | GFP_KERNEL); | 1013 | GFP_KERNEL); |
1014 | if (!bd_virt) { | 1014 | if (!bd_virt) { |
1015 | dev_err(port->dev, "could not allocate buffer descriptors\n"); | 1015 | dev_err(port->dev, "could not allocate buffer descriptors\n"); |
@@ -1051,7 +1051,7 @@ static void qe_uart_release_port(struct uart_port *port) | |||
1051 | container_of(port, struct uart_qe_port, port); | 1051 | container_of(port, struct uart_qe_port, port); |
1052 | struct ucc_slow_private *uccs = qe_port->us_private; | 1052 | struct ucc_slow_private *uccs = qe_port->us_private; |
1053 | 1053 | ||
1054 | dma_free_coherent(NULL, qe_port->bd_size, qe_port->bd_virt, | 1054 | dma_free_coherent(port->dev, qe_port->bd_size, qe_port->bd_virt, |
1055 | qe_port->bd_dma_addr); | 1055 | qe_port->bd_dma_addr); |
1056 | 1056 | ||
1057 | ucc_slow_free(uccs); | 1057 | ucc_slow_free(uccs); |
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 25eda71f4bf4..cdb3d3191719 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
@@ -108,13 +108,13 @@ static void mpc52xx_psc_spi_activate_cs(struct spi_device *spi) | |||
108 | * Because psc->ccr is defined as 16bit register instead of 32bit | 108 | * Because psc->ccr is defined as 16bit register instead of 32bit |
109 | * just set the lower byte of BitClkDiv | 109 | * just set the lower byte of BitClkDiv |
110 | */ | 110 | */ |
111 | ccr = in_be16(&psc->ccr); | 111 | ccr = in_be16((u16 __iomem *)&psc->ccr); |
112 | ccr &= 0xFF00; | 112 | ccr &= 0xFF00; |
113 | if (cs->speed_hz) | 113 | if (cs->speed_hz) |
114 | ccr |= (MCLK / cs->speed_hz - 1) & 0xFF; | 114 | ccr |= (MCLK / cs->speed_hz - 1) & 0xFF; |
115 | else /* by default SPI Clk 1MHz */ | 115 | else /* by default SPI Clk 1MHz */ |
116 | ccr |= (MCLK / 1000000 - 1) & 0xFF; | 116 | ccr |= (MCLK / 1000000 - 1) & 0xFF; |
117 | out_be16(&psc->ccr, ccr); | 117 | out_be16((u16 __iomem *)&psc->ccr, ccr); |
118 | mps->bits_per_word = cs->bits_per_word; | 118 | mps->bits_per_word = cs->bits_per_word; |
119 | 119 | ||
120 | if (mps->activate_cs) | 120 | if (mps->activate_cs) |
@@ -347,7 +347,7 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps) | |||
347 | /* Configure 8bit codec mode as a SPI master and use EOF flags */ | 347 | /* Configure 8bit codec mode as a SPI master and use EOF flags */ |
348 | /* SICR_SIM_CODEC8|SICR_GENCLK|SICR_SPI|SICR_MSTR|SICR_USEEOF */ | 348 | /* SICR_SIM_CODEC8|SICR_GENCLK|SICR_SPI|SICR_MSTR|SICR_USEEOF */ |
349 | out_be32(&psc->sicr, 0x0180C800); | 349 | out_be32(&psc->sicr, 0x0180C800); |
350 | out_be16(&psc->ccr, 0x070F); /* by default SPI Clk 1MHz */ | 350 | out_be16((u16 __iomem *)&psc->ccr, 0x070F); /* default SPI Clk 1MHz */ |
351 | 351 | ||
352 | /* Set 2ms DTL delay */ | 352 | /* Set 2ms DTL delay */ |
353 | out_8(&psc->ctur, 0x00); | 353 | out_8(&psc->ctur, 0x00); |