aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-09-26 22:47:17 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-09-26 22:47:17 -0400
commit9aae341287f55d5fc71f8a884e671f9058ad3388 (patch)
tree974ce958e70c0afd0a81cdda6f30d9a037470a98
parentcaa1d631fc99940f866480c2bb88a6f5a235e7a2 (diff)
parent9d9fd8871b4136755160bf95a9abd0d23d738ddc (diff)
Merge remote-tracking branch 'agust/next' into next
mpc5xxx updates from Anatolij
-rw-r--r--Documentation/devicetree/bindings/misc/ifm-csi.txt41
-rw-r--r--arch/powerpc/boot/dts/o2d.dts47
-rw-r--r--arch/powerpc/boot/dts/o2d.dtsi139
-rw-r--r--arch/powerpc/boot/dts/o2d300.dts52
-rw-r--r--arch/powerpc/boot/dts/o2dnt2.dts48
-rw-r--r--arch/powerpc/boot/dts/o2i.dts33
-rw-r--r--arch/powerpc/boot/dts/o2mnt.dts33
-rw-r--r--arch/powerpc/boot/dts/o3dnt.dts48
-rw-r--r--arch/powerpc/include/asm/mpc52xx.h2
-rw-r--r--arch/powerpc/platforms/512x/Kconfig1
-rw-r--r--arch/powerpc/platforms/512x/clock.c6
-rw-r--r--arch/powerpc/platforms/512x/mpc512x_shared.c6
-rw-r--r--arch/powerpc/platforms/52xx/mpc5200_simple.c1
-rw-r--r--arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c35
14 files changed, 483 insertions, 9 deletions
diff --git a/Documentation/devicetree/bindings/misc/ifm-csi.txt b/Documentation/devicetree/bindings/misc/ifm-csi.txt
new file mode 100644
index 000000000000..5bdfffb0b9f7
--- /dev/null
+++ b/Documentation/devicetree/bindings/misc/ifm-csi.txt
@@ -0,0 +1,41 @@
1IFM camera sensor interface on mpc5200 LocalPlus bus
2
3Required properties:
4- compatible: "ifm,o2d-csi"
5- reg: specifies sensor chip select number and associated address range
6- interrupts: external interrupt line number and interrupt sense mode
7 of the interrupt line signaling frame valid events
8- gpios: three gpio-specifiers for "capture", "reset" and "master enable"
9 GPIOs (strictly in this order).
10- ifm,csi-clk-handle: the phandle to a node in the DT describing the sensor
11 clock generator. This node is usually a general purpose timer controller.
12- ifm,csi-addr-bus-width: address bus width (valid values are 16, 24, 25)
13- ifm,csi-data-bus-width: data bus width (valid values are 8 and 16)
14- ifm,csi-wait-cycles: sensor bus wait cycles
15
16Optional properties:
17- ifm,csi-byte-swap: if this property is present, the byte swapping on
18 the bus will be enabled.
19
20Example:
21
22 csi@3,0 {
23 compatible = "ifm,o2d-csi";
24 reg = <3 0 0x00100000>; /* CS 3, 1 MiB range */
25 interrupts = <1 1 2>; /* IRQ1, edge falling */
26
27 ifm,csi-clk-handle = <&timer7>;
28 gpios = <&gpio_simple 23 0 /* image_capture */
29 &gpio_simple 26 0 /* image_reset */
30 &gpio_simple 29 0>; /* image_master_en */
31
32 ifm,csi-addr-bus-width = <24>;
33 ifm,csi-data-bus-width = <8>;
34 ifm,csi-wait-cycles = <0>;
35 };
36
37The base address of the used chip select is specified in the
38ranges property of the parent localbus node, for example:
39
40 ranges = <0 0 0xff000000 0x01000000
41 3 0 0xe3000000 0x00100000>;
diff --git a/arch/powerpc/boot/dts/o2d.dts b/arch/powerpc/boot/dts/o2d.dts
new file mode 100644
index 000000000000..9f6dd4d889b3
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2d.dts
@@ -0,0 +1,47 @@
1/*
2 * O2D Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o2d";
17 compatible = "ifm,o2d";
18
19 memory {
20 reg = <0x00000000 0x08000000>; // 128MB
21 };
22
23 localbus {
24 ranges = <0 0 0xfc000000 0x02000000
25 3 0 0xe3000000 0x00100000>;
26
27 flash@0,0 {
28 compatible = "cfi-flash";
29 reg = <0 0 0x02000000>;
30 bank-width = <2>;
31 device-width = <2>;
32 #size-cells = <1>;
33 #address-cells = <1>;
34
35 partition@60000 {
36 label = "kernel";
37 reg = <0x00060000 0x00260000>;
38 read-only;
39 };
40 /* o2d specific partitions */
41 partition@2c0000 {
42 label = "o2d user defined";
43 reg = <0x002c0000 0x01d40000>;
44 };
45 };
46 };
47};
diff --git a/arch/powerpc/boot/dts/o2d.dtsi b/arch/powerpc/boot/dts/o2d.dtsi
new file mode 100644
index 000000000000..3444eb8f0ade
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2d.dtsi
@@ -0,0 +1,139 @@
1/*
2 * O2D base Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "mpc5200b.dtsi"
14
15/ {
16 model = "ifm,o2d";
17 compatible = "ifm,o2d";
18
19 memory {
20 reg = <0x00000000 0x04000000>; // 64MB
21 };
22
23 soc5200@f0000000 {
24
25 gpio_simple: gpio@b00 {
26 };
27
28 timer@600 { // General Purpose Timer
29 #gpio-cells = <2>;
30 gpio-controller;
31 fsl,has-wdt;
32 fsl,wdt-on-boot = <0>;
33 };
34
35 timer@610 {
36 #gpio-cells = <2>;
37 gpio-controller;
38 };
39
40 timer7: timer@670 {
41 };
42
43 rtc@800 {
44 status = "disabled";
45 };
46
47 psc@2000 { // PSC1
48 compatible = "fsl,mpc5200b-psc-spi","fsl,mpc5200-psc-spi";
49 #address-cells = <1>;
50 #size-cells = <0>;
51 cell-index = <0>;
52
53 spidev@0 {
54 compatible = "spidev";
55 spi-max-frequency = <250000>;
56 reg = <0>;
57 };
58 };
59
60 psc@2200 { // PSC2
61 status = "disabled";
62 };
63
64 psc@2400 { // PSC3
65 status = "disabled";
66 };
67
68 psc@2600 { // PSC4
69 compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";
70 };
71
72 psc@2800 { // PSC5
73 compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";
74 };
75
76 psc@2c00 { // PSC6
77 status = "disabled";
78 };
79
80 ethernet@3000 {
81 phy-handle = <&phy0>;
82 };
83
84 mdio@3000 {
85 phy0: ethernet-phy@0 {
86 reg = <0>;
87 };
88 };
89
90 sclpc@3c00 {
91 compatible = "fsl,mpc5200-lpbfifo";
92 reg = <0x3c00 0x60>;
93 interrupts = <3 23 0>;
94 };
95 };
96
97 localbus {
98 ranges = <0 0 0xff000000 0x01000000
99 3 0 0xe3000000 0x00100000>;
100
101 // flash device at LocalPlus Bus CS0
102 flash@0,0 {
103 compatible = "cfi-flash";
104 reg = <0 0 0x01000000>;
105 bank-width = <1>;
106 device-width = <2>;
107 #size-cells = <1>;
108 #address-cells = <1>;
109 no-unaligned-direct-access;
110
111 /* common layout for all machines */
112 partition@0 {
113 label = "u-boot";
114 reg = <0x00000000 0x00040000>;
115 read-only;
116 };
117 partition@40000 {
118 label = "env";
119 reg = <0x00040000 0x00020000>;
120 read-only;
121 };
122 };
123
124 csi@3,0 {
125 compatible = "ifm,o2d-csi";
126 reg = <3 0 0x00100000>;
127 ifm,csi-clk-handle = <&timer7>;
128 gpios = <&gpio_simple 23 0 /* imag_capture */
129 &gpio_simple 26 0 /* imag_reset */
130 &gpio_simple 29 0>; /* imag_master_en */
131
132 interrupts = <1 1 2>; /* IRQ1, edge falling */
133
134 ifm,csi-addr-bus-width = <24>;
135 ifm,csi-data-bus-width = <8>;
136 ifm,csi-wait-cycles = <0>;
137 };
138 };
139};
diff --git a/arch/powerpc/boot/dts/o2d300.dts b/arch/powerpc/boot/dts/o2d300.dts
new file mode 100644
index 000000000000..29affe0f0da3
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2d300.dts
@@ -0,0 +1,52 @@
1/*
2 * O2D300 Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o2d300";
17 compatible = "ifm,o2d";
18
19 localbus {
20 ranges = <0 0 0xfc000000 0x02000000
21 3 0 0xe3000000 0x00100000>;
22 flash@0,0 {
23 compatible = "cfi-flash";
24 reg = <0 0 0x02000000>;
25 bank-width = <2>;
26 device-width = <2>;
27 #size-cells = <1>;
28 #address-cells = <1>;
29
30 partition@40000 {
31 label = "env_1";
32 reg = <0x00040000 0x00020000>;
33 read-only;
34 };
35 partition@60000 {
36 label = "env_2";
37 reg = <0x00060000 0x00020000>;
38 read-only;
39 };
40 partition@80000 {
41 label = "kernel";
42 reg = <0x00080000 0x00260000>;
43 read-only;
44 };
45 /* o2d300 specific partitions */
46 partition@2e0000 {
47 label = "o2d300 user defined";
48 reg = <0x002e0000 0x01d20000>;
49 };
50 };
51 };
52};
diff --git a/arch/powerpc/boot/dts/o2dnt2.dts b/arch/powerpc/boot/dts/o2dnt2.dts
new file mode 100644
index 000000000000..a0f5b97a4f06
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2dnt2.dts
@@ -0,0 +1,48 @@
1/*
2 * O2DNT2 Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o2dnt2";
17 compatible = "ifm,o2d";
18
19 memory {
20 reg = <0x00000000 0x08000000>; // 128MB
21 };
22
23 localbus {
24 ranges = <0 0 0xfc000000 0x02000000
25 3 0 0xe3000000 0x00100000>;
26
27 flash@0,0 {
28 compatible = "cfi-flash";
29 reg = <0 0 0x02000000>;
30 bank-width = <2>;
31 device-width = <2>;
32 #size-cells = <1>;
33 #address-cells = <1>;
34
35 partition@60000 {
36 label = "kernel";
37 reg = <0x00060000 0x00260000>;
38 read-only;
39 };
40
41 /* o2dnt2 specific partitions */
42 partition@2c0000 {
43 label = "o2dnt2 user defined";
44 reg = <0x002c0000 0x01d40000>;
45 };
46 };
47 };
48};
diff --git a/arch/powerpc/boot/dts/o2i.dts b/arch/powerpc/boot/dts/o2i.dts
new file mode 100644
index 000000000000..e3cc99d1360b
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2i.dts
@@ -0,0 +1,33 @@
1/*
2 * O2I Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o2i";
17 compatible = "ifm,o2d";
18
19 localbus {
20 flash@0,0 {
21 partition@60000 {
22 label = "kernel";
23 reg = <0x00060000 0x00260000>;
24 read-only;
25 };
26 /* o2i specific partitions */
27 partition@2c0000 {
28 label = "o2i user defined";
29 reg = <0x002c0000 0x00d40000>;
30 };
31 };
32 };
33};
diff --git a/arch/powerpc/boot/dts/o2mnt.dts b/arch/powerpc/boot/dts/o2mnt.dts
new file mode 100644
index 000000000000..d91859a9e940
--- /dev/null
+++ b/arch/powerpc/boot/dts/o2mnt.dts
@@ -0,0 +1,33 @@
1/*
2 * O2MNT Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o2mnt";
17 compatible = "ifm,o2d";
18
19 localbus {
20 flash@0,0 {
21 partition@60000 {
22 label = "kernel";
23 reg = <0x00060000 0x00260000>;
24 read-only;
25 };
26 /* add o2mnt specific partitions */
27 partition@2c0000 {
28 label = "o2mnt user defined";
29 reg = <0x002c0000 0x00d40000>;
30 };
31 };
32 };
33};
diff --git a/arch/powerpc/boot/dts/o3dnt.dts b/arch/powerpc/boot/dts/o3dnt.dts
new file mode 100644
index 000000000000..acce49326491
--- /dev/null
+++ b/arch/powerpc/boot/dts/o3dnt.dts
@@ -0,0 +1,48 @@
1/*
2 * O3DNT Device Tree Source
3 *
4 * Copyright (C) 2012 DENX Software Engineering
5 * Anatolij Gustschin <agust@denx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13/include/ "o2d.dtsi"
14
15/ {
16 model = "ifm,o3dnt";
17 compatible = "ifm,o2d";
18
19 memory {
20 reg = <0x00000000 0x04000000>; // 64MB
21 };
22
23 localbus {
24 ranges = <0 0 0xfc000000 0x01000000
25 3 0 0xe3000000 0x00100000>;
26
27 flash@0,0 {
28 compatible = "cfi-flash";
29 reg = <0 0 0x01000000>;
30 bank-width = <2>;
31 device-width = <2>;
32 #size-cells = <1>;
33 #address-cells = <1>;
34
35 partition@60000 {
36 label = "kernel";
37 reg = <0x00060000 0x00260000>;
38 read-only;
39 };
40
41 /* o3dnt specific partitions */
42 partition@2c0000 {
43 label = "o3dnt user defined";
44 reg = <0x002c0000 0x00d40000>;
45 };
46 };
47 };
48};
diff --git a/arch/powerpc/include/asm/mpc52xx.h b/arch/powerpc/include/asm/mpc52xx.h
index 1f41382eda38..0acc7c7c28d1 100644
--- a/arch/powerpc/include/asm/mpc52xx.h
+++ b/arch/powerpc/include/asm/mpc52xx.h
@@ -307,6 +307,7 @@ struct mpc52xx_lpbfifo_request {
307 size_t size; 307 size_t size;
308 size_t pos; /* current position of transfer */ 308 size_t pos; /* current position of transfer */
309 int flags; 309 int flags;
310 int defer_xfer_start;
310 311
311 /* What to do when finished */ 312 /* What to do when finished */
312 void (*callback)(struct mpc52xx_lpbfifo_request *); 313 void (*callback)(struct mpc52xx_lpbfifo_request *);
@@ -323,6 +324,7 @@ struct mpc52xx_lpbfifo_request {
323extern int mpc52xx_lpbfifo_submit(struct mpc52xx_lpbfifo_request *req); 324extern int mpc52xx_lpbfifo_submit(struct mpc52xx_lpbfifo_request *req);
324extern void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req); 325extern void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req);
325extern void mpc52xx_lpbfifo_poll(void); 326extern void mpc52xx_lpbfifo_poll(void);
327extern int mpc52xx_lpbfifo_start_xfer(struct mpc52xx_lpbfifo_request *req);
326 328
327/* mpc52xx_pic.c */ 329/* mpc52xx_pic.c */
328extern void mpc52xx_init_irq(void); 330extern void mpc52xx_init_irq(void);
diff --git a/arch/powerpc/platforms/512x/Kconfig b/arch/powerpc/platforms/512x/Kconfig
index c16999802ecf..b62508b113db 100644
--- a/arch/powerpc/platforms/512x/Kconfig
+++ b/arch/powerpc/platforms/512x/Kconfig
@@ -2,6 +2,7 @@ config PPC_MPC512x
2 bool "512x-based boards" 2 bool "512x-based boards"
3 depends on 6xx 3 depends on 6xx
4 select FSL_SOC 4 select FSL_SOC
5 select FB_FSL_DIU
5 select IPIC 6 select IPIC
6 select PPC_CLOCK 7 select PPC_CLOCK
7 select PPC_PCI_CHOICE 8 select PPC_PCI_CHOICE
diff --git a/arch/powerpc/platforms/512x/clock.c b/arch/powerpc/platforms/512x/clock.c
index 1d8700ff60b0..9f771e05457c 100644
--- a/arch/powerpc/platforms/512x/clock.c
+++ b/arch/powerpc/platforms/512x/clock.c
@@ -54,14 +54,16 @@ static DEFINE_MUTEX(clocks_mutex);
54static struct clk *mpc5121_clk_get(struct device *dev, const char *id) 54static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
55{ 55{
56 struct clk *p, *clk = ERR_PTR(-ENOENT); 56 struct clk *p, *clk = ERR_PTR(-ENOENT);
57 int dev_match = 0; 57 int dev_match;
58 int id_match = 0; 58 int id_match;
59 59
60 if (dev == NULL || id == NULL) 60 if (dev == NULL || id == NULL)
61 return clk; 61 return clk;
62 62
63 mutex_lock(&clocks_mutex); 63 mutex_lock(&clocks_mutex);
64 list_for_each_entry(p, &clocks, node) { 64 list_for_each_entry(p, &clocks, node) {
65 dev_match = id_match = 0;
66
65 if (dev == p->dev) 67 if (dev == p->dev)
66 dev_match++; 68 dev_match++;
67 if (strcmp(id, p->name) == 0) 69 if (strcmp(id, p->name) == 0)
diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c
index cfe958e94e1e..1650e090ef3a 100644
--- a/arch/powerpc/platforms/512x/mpc512x_shared.c
+++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
@@ -191,8 +191,6 @@ mpc512x_valid_monitor_port(enum fsl_diu_monitor_port port)
191 191
192static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb; 192static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb;
193 193
194#if defined(CONFIG_FB_FSL_DIU) || \
195 defined(CONFIG_FB_FSL_DIU_MODULE)
196static inline void mpc512x_free_bootmem(struct page *page) 194static inline void mpc512x_free_bootmem(struct page *page)
197{ 195{
198 __ClearPageReserved(page); 196 __ClearPageReserved(page);
@@ -220,7 +218,6 @@ void mpc512x_release_bootmem(void)
220 } 218 }
221 diu_ops.release_bootmem = NULL; 219 diu_ops.release_bootmem = NULL;
222} 220}
223#endif
224 221
225/* 222/*
226 * Check if DIU was pre-initialized. If so, perform steps 223 * Check if DIU was pre-initialized. If so, perform steps
@@ -323,15 +320,12 @@ void __init mpc512x_setup_diu(void)
323 } 320 }
324 } 321 }
325 322
326#if defined(CONFIG_FB_FSL_DIU) || \
327 defined(CONFIG_FB_FSL_DIU_MODULE)
328 diu_ops.get_pixel_format = mpc512x_get_pixel_format; 323 diu_ops.get_pixel_format = mpc512x_get_pixel_format;
329 diu_ops.set_gamma_table = mpc512x_set_gamma_table; 324 diu_ops.set_gamma_table = mpc512x_set_gamma_table;
330 diu_ops.set_monitor_port = mpc512x_set_monitor_port; 325 diu_ops.set_monitor_port = mpc512x_set_monitor_port;
331 diu_ops.set_pixel_clock = mpc512x_set_pixel_clock; 326 diu_ops.set_pixel_clock = mpc512x_set_pixel_clock;
332 diu_ops.valid_monitor_port = mpc512x_valid_monitor_port; 327 diu_ops.valid_monitor_port = mpc512x_valid_monitor_port;
333 diu_ops.release_bootmem = mpc512x_release_bootmem; 328 diu_ops.release_bootmem = mpc512x_release_bootmem;
334#endif
335} 329}
336 330
337void __init mpc512x_init_IRQ(void) 331void __init mpc512x_init_IRQ(void)
diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c b/arch/powerpc/platforms/52xx/mpc5200_simple.c
index c0aa04068d69..9cf36020cf0d 100644
--- a/arch/powerpc/platforms/52xx/mpc5200_simple.c
+++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
@@ -52,6 +52,7 @@ static void __init mpc5200_simple_setup_arch(void)
52static const char *board[] __initdata = { 52static const char *board[] __initdata = {
53 "anonymous,a4m072", 53 "anonymous,a4m072",
54 "anon,charon", 54 "anon,charon",
55 "ifm,o2d",
55 "intercontrol,digsy-mtc", 56 "intercontrol,digsy-mtc",
56 "manroland,mucmc52", 57 "manroland,mucmc52",
57 "manroland,uc101", 58 "manroland,uc101",
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
index d61fb1c0c1a0..2351f9e0fb6f 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
@@ -170,7 +170,8 @@ static void mpc52xx_lpbfifo_kick(struct mpc52xx_lpbfifo_request *req)
170 out_be32(lpbfifo.regs + LPBFIFO_REG_CONTROL, bit_fields); 170 out_be32(lpbfifo.regs + LPBFIFO_REG_CONTROL, bit_fields);
171 171
172 /* Kick it off */ 172 /* Kick it off */
173 out_8(lpbfifo.regs + LPBFIFO_REG_PACKET_SIZE, 0x01); 173 if (!lpbfifo.req->defer_xfer_start)
174 out_8(lpbfifo.regs + LPBFIFO_REG_PACKET_SIZE, 0x01);
174 if (dma) 175 if (dma)
175 bcom_enable(lpbfifo.bcom_cur_task); 176 bcom_enable(lpbfifo.bcom_cur_task);
176} 177}
@@ -421,6 +422,38 @@ int mpc52xx_lpbfifo_submit(struct mpc52xx_lpbfifo_request *req)
421} 422}
422EXPORT_SYMBOL(mpc52xx_lpbfifo_submit); 423EXPORT_SYMBOL(mpc52xx_lpbfifo_submit);
423 424
425int mpc52xx_lpbfifo_start_xfer(struct mpc52xx_lpbfifo_request *req)
426{
427 unsigned long flags;
428
429 if (!lpbfifo.regs)
430 return -ENODEV;
431
432 spin_lock_irqsave(&lpbfifo.lock, flags);
433
434 /*
435 * If the req pointer is already set and a transfer was
436 * started on submit, then this transfer is in progress
437 */
438 if (lpbfifo.req && !lpbfifo.req->defer_xfer_start) {
439 spin_unlock_irqrestore(&lpbfifo.lock, flags);
440 return -EBUSY;
441 }
442
443 /*
444 * If the req was previously submitted but not
445 * started, start it now
446 */
447 if (lpbfifo.req && lpbfifo.req == req &&
448 lpbfifo.req->defer_xfer_start) {
449 out_8(lpbfifo.regs + LPBFIFO_REG_PACKET_SIZE, 0x01);
450 }
451
452 spin_unlock_irqrestore(&lpbfifo.lock, flags);
453 return 0;
454}
455EXPORT_SYMBOL(mpc52xx_lpbfifo_start_xfer);
456
424void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req) 457void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req)
425{ 458{
426 unsigned long flags; 459 unsigned long flags;