diff options
112 files changed, 3168 insertions, 1651 deletions
diff --git a/Documentation/devicetree/bindings/bus/ti-gpmc.txt b/Documentation/devicetree/bindings/bus/ti-gpmc.txt index 4b87ea1194e3..704be9306c9f 100644 --- a/Documentation/devicetree/bindings/bus/ti-gpmc.txt +++ b/Documentation/devicetree/bindings/bus/ti-gpmc.txt | |||
@@ -95,7 +95,6 @@ GPMC chip-select settings properties for child nodes. All are optional. | |||
95 | - gpmc,burst-wrap Enables wrap bursting | 95 | - gpmc,burst-wrap Enables wrap bursting |
96 | - gpmc,burst-read Enables read page/burst mode | 96 | - gpmc,burst-read Enables read page/burst mode |
97 | - gpmc,burst-write Enables write page/burst mode | 97 | - gpmc,burst-write Enables write page/burst mode |
98 | - gpmc,device-nand Device is NAND | ||
99 | - gpmc,device-width Total width of device(s) connected to a GPMC | 98 | - gpmc,device-width Total width of device(s) connected to a GPMC |
100 | chip-select in bytes. The GPMC supports 8-bit | 99 | chip-select in bytes. The GPMC supports 8-bit |
101 | and 16-bit devices and so this property must be | 100 | and 16-bit devices and so this property must be |
diff --git a/Documentation/devicetree/bindings/clock/clk-exynos-audss.txt b/Documentation/devicetree/bindings/clock/clk-exynos-audss.txt new file mode 100644 index 000000000000..a1201802f90d --- /dev/null +++ b/Documentation/devicetree/bindings/clock/clk-exynos-audss.txt | |||
@@ -0,0 +1,64 @@ | |||
1 | * Samsung Audio Subsystem Clock Controller | ||
2 | |||
3 | The Samsung Audio Subsystem clock controller generates and supplies clocks | ||
4 | to Audio Subsystem block available in the S5PV210 and Exynos SoCs. The clock | ||
5 | binding described here is applicable to all SoC's in Exynos family. | ||
6 | |||
7 | Required Properties: | ||
8 | |||
9 | - compatible: should be one of the following: | ||
10 | - "samsung,exynos4210-audss-clock" - controller compatible with all Exynos4 SoCs. | ||
11 | - "samsung,exynos5250-audss-clock" - controller compatible with all Exynos5 SoCs. | ||
12 | |||
13 | - reg: physical base address and length of the controller's register set. | ||
14 | |||
15 | - #clock-cells: should be 1. | ||
16 | |||
17 | The following is the list of clocks generated by the controller. Each clock is | ||
18 | assigned an identifier and client nodes use this identifier to specify the | ||
19 | clock which they consume. Some of the clocks are available only on a particular | ||
20 | Exynos4 SoC and this is specified where applicable. | ||
21 | |||
22 | Provided clocks: | ||
23 | |||
24 | Clock ID SoC (if specific) | ||
25 | ----------------------------------------------- | ||
26 | |||
27 | mout_audss 0 | ||
28 | mout_i2s 1 | ||
29 | dout_srp 2 | ||
30 | dout_aud_bus 3 | ||
31 | dout_i2s 4 | ||
32 | srp_clk 5 | ||
33 | i2s_bus 6 | ||
34 | sclk_i2s 7 | ||
35 | pcm_bus 8 | ||
36 | sclk_pcm 9 | ||
37 | |||
38 | Example 1: An example of a clock controller node is listed below. | ||
39 | |||
40 | clock_audss: audss-clock-controller@3810000 { | ||
41 | compatible = "samsung,exynos5250-audss-clock"; | ||
42 | reg = <0x03810000 0x0C>; | ||
43 | #clock-cells = <1>; | ||
44 | }; | ||
45 | |||
46 | Example 2: I2S controller node that consumes the clock generated by the clock | ||
47 | controller. Refer to the standard clock bindings for information | ||
48 | about 'clocks' and 'clock-names' property. | ||
49 | |||
50 | i2s0: i2s@03830000 { | ||
51 | compatible = "samsung,i2s-v5"; | ||
52 | reg = <0x03830000 0x100>; | ||
53 | dmas = <&pdma0 10 | ||
54 | &pdma0 9 | ||
55 | &pdma0 8>; | ||
56 | dma-names = "tx", "rx", "tx-sec"; | ||
57 | clocks = <&clock_audss EXYNOS_I2S_BUS>, | ||
58 | <&clock_audss EXYNOS_I2S_BUS>, | ||
59 | <&clock_audss EXYNOS_SCLK_I2S>, | ||
60 | <&clock_audss EXYNOS_MOUT_AUDSS>, | ||
61 | <&clock_audss EXYNOS_MOUT_I2S>; | ||
62 | clock-names = "iis", "i2s_opclk0", "i2s_opclk1", | ||
63 | "mout_audss", "mout_i2s"; | ||
64 | }; | ||
diff --git a/Documentation/devicetree/bindings/dma/ste-dma40.txt b/Documentation/devicetree/bindings/dma/ste-dma40.txt new file mode 100644 index 000000000000..bea5b73a7390 --- /dev/null +++ b/Documentation/devicetree/bindings/dma/ste-dma40.txt | |||
@@ -0,0 +1,66 @@ | |||
1 | * DMA40 DMA Controller | ||
2 | |||
3 | Required properties: | ||
4 | - compatible: "stericsson,dma40" | ||
5 | - reg: Address range of the DMAC registers | ||
6 | - reg-names: Names of the above areas to use during resource look-up | ||
7 | - interrupt: Should contain the DMAC interrupt number | ||
8 | - #dma-cells: must be <3> | ||
9 | - memcpy-channels: Channels to be used for memcpy | ||
10 | |||
11 | Optional properties: | ||
12 | - dma-channels: Number of channels supported by hardware - if not present | ||
13 | the driver will attempt to obtain the information from H/W | ||
14 | - disabled-channels: Channels which can not be used | ||
15 | |||
16 | Example: | ||
17 | |||
18 | dma: dma-controller@801C0000 { | ||
19 | compatible = "stericsson,db8500-dma40", "stericsson,dma40"; | ||
20 | reg = <0x801C0000 0x1000 0x40010000 0x800>; | ||
21 | reg-names = "base", "lcpa"; | ||
22 | interrupt-parent = <&intc>; | ||
23 | interrupts = <0 25 0x4>; | ||
24 | |||
25 | #dma-cells = <2>; | ||
26 | memcpy-channels = <56 57 58 59 60>; | ||
27 | disabled-channels = <12>; | ||
28 | dma-channels = <8>; | ||
29 | }; | ||
30 | |||
31 | Clients | ||
32 | Required properties: | ||
33 | - dmas: Comma separated list of dma channel requests | ||
34 | - dma-names: Names of the aforementioned requested channels | ||
35 | |||
36 | Each dmas request consists of 4 cells: | ||
37 | 1. A phandle pointing to the DMA controller | ||
38 | 2. Device Type | ||
39 | 3. The DMA request line number (only when 'use fixed channel' is set) | ||
40 | 4. A 32bit mask specifying; mode, direction and endianess [NB: This list will grow] | ||
41 | 0x00000001: Mode: | ||
42 | Logical channel when unset | ||
43 | Physical channel when set | ||
44 | 0x00000002: Direction: | ||
45 | Memory to Device when unset | ||
46 | Device to Memory when set | ||
47 | 0x00000004: Endianess: | ||
48 | Little endian when unset | ||
49 | Big endian when set | ||
50 | 0x00000008: Use fixed channel: | ||
51 | Use automatic channel selection when unset | ||
52 | Use DMA request line number when set | ||
53 | |||
54 | Example: | ||
55 | |||
56 | uart@80120000 { | ||
57 | compatible = "arm,pl011", "arm,primecell"; | ||
58 | reg = <0x80120000 0x1000>; | ||
59 | interrupts = <0 11 0x4>; | ||
60 | |||
61 | dmas = <&dma 13 0 0x2>, /* Logical - DevToMem */ | ||
62 | <&dma 13 0 0x0>; /* Logical - MemToDev */ | ||
63 | dma-names = "rx", "rx"; | ||
64 | |||
65 | status = "disabled"; | ||
66 | }; | ||
diff --git a/Documentation/devicetree/bindings/gpio/gpio-samsung.txt b/Documentation/devicetree/bindings/gpio/gpio-samsung.txt index f1e5dfecf55d..5375625e8cd2 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-samsung.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-samsung.txt | |||
@@ -39,46 +39,3 @@ Example: | |||
39 | #gpio-cells = <4>; | 39 | #gpio-cells = <4>; |
40 | gpio-controller; | 40 | gpio-controller; |
41 | }; | 41 | }; |
42 | |||
43 | |||
44 | Samsung S3C24XX GPIO Controller | ||
45 | |||
46 | Required properties: | ||
47 | - compatible: Compatible property value should be "samsung,s3c24xx-gpio". | ||
48 | |||
49 | - reg: Physical base address of the controller and length of memory mapped | ||
50 | region. | ||
51 | |||
52 | - #gpio-cells: Should be 3. The syntax of the gpio specifier used by client nodes | ||
53 | should be the following with values derived from the SoC user manual. | ||
54 | <[phandle of the gpio controller node] | ||
55 | [pin number within the gpio controller] | ||
56 | [mux function] | ||
57 | [flags and pull up/down] | ||
58 | |||
59 | Values for gpio specifier: | ||
60 | - Pin number: depending on the controller a number from 0 up to 15. | ||
61 | - Mux function: Depending on the SoC and the gpio bank the gpio can be set | ||
62 | as input, output or a special function | ||
63 | - Flags and Pull Up/Down: the values to use differ for the individual SoCs | ||
64 | example S3C2416/S3C2450: | ||
65 | 0 - Pull Up/Down Disabled. | ||
66 | 1 - Pull Down Enabled. | ||
67 | 2 - Pull Up Enabled. | ||
68 | Bit 16 (0x00010000) - Input is active low. | ||
69 | Consult the user manual for the correct values of Mux and Pull Up/Down. | ||
70 | |||
71 | - gpio-controller: Specifies that the node is a gpio controller. | ||
72 | - #address-cells: should be 1. | ||
73 | - #size-cells: should be 1. | ||
74 | |||
75 | Example: | ||
76 | |||
77 | gpa: gpio-controller@56000000 { | ||
78 | #address-cells = <1>; | ||
79 | #size-cells = <1>; | ||
80 | compatible = "samsung,s3c24xx-gpio"; | ||
81 | reg = <0x56000000 0x10>; | ||
82 | #gpio-cells = <3>; | ||
83 | gpio-controller; | ||
84 | }; | ||
diff --git a/Documentation/devicetree/bindings/gpio/renesas,gpio-rcar.txt b/Documentation/devicetree/bindings/gpio/renesas,gpio-rcar.txt new file mode 100644 index 000000000000..cb3dc7bcd8e6 --- /dev/null +++ b/Documentation/devicetree/bindings/gpio/renesas,gpio-rcar.txt | |||
@@ -0,0 +1,46 @@ | |||
1 | * Renesas R-Car GPIO Controller | ||
2 | |||
3 | Required Properties: | ||
4 | |||
5 | - compatible: should be one of the following. | ||
6 | - "renesas,gpio-r8a7778": for R8A7778 (R-Mobile M1) compatible GPIO controller. | ||
7 | - "renesas,gpio-r8a7779": for R8A7779 (R-Car H1) compatible GPIO controller. | ||
8 | - "renesas,gpio-r8a7790": for R8A7790 (R-Car H2) compatible GPIO controller. | ||
9 | - "renesas,gpio-rcar": for generic R-Car GPIO controller. | ||
10 | |||
11 | - reg: Base address and length of each memory resource used by the GPIO | ||
12 | controller hardware module. | ||
13 | |||
14 | - interrupt-parent: phandle of the parent interrupt controller. | ||
15 | - interrupts: Interrupt specifier for the controllers interrupt. | ||
16 | |||
17 | - gpio-controller: Marks the device node as a gpio controller. | ||
18 | - #gpio-cells: Should be 2. The first cell is the GPIO number and the second | ||
19 | cell specifies GPIO flags, as defined in <dt-bindings/gpio/gpio.h>. Only the | ||
20 | GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags are supported. | ||
21 | - gpio-ranges: Range of pins managed by the GPIO controller. | ||
22 | |||
23 | Please refer to gpio.txt in this directory for details of gpio-ranges property | ||
24 | and the common GPIO bindings used by client devices. | ||
25 | |||
26 | Example: R8A7779 (R-Car H1) GPIO controller nodes | ||
27 | |||
28 | gpio0: gpio@ffc40000 { | ||
29 | compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar"; | ||
30 | reg = <0xffc40000 0x2c>; | ||
31 | interrupt-parent = <&gic>; | ||
32 | interrupts = <0 141 0x4>; | ||
33 | #gpio-cells = <2>; | ||
34 | gpio-controller; | ||
35 | gpio-ranges = <&pfc 0 0 32>; | ||
36 | }; | ||
37 | ... | ||
38 | gpio6: gpio@ffc46000 { | ||
39 | compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar"; | ||
40 | reg = <0xffc46000 0x2c>; | ||
41 | interrupt-parent = <&gic>; | ||
42 | interrupts = <0 147 0x4>; | ||
43 | #gpio-cells = <2>; | ||
44 | gpio-controller; | ||
45 | gpio-ranges = <&pfc 0 192 9>; | ||
46 | }; | ||
diff --git a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt index 6a983c1d87cd..df338cb5059c 100644 --- a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt +++ b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt | |||
@@ -29,6 +29,13 @@ Optional properties: | |||
29 | "bch4" 4-bit BCH ecc code | 29 | "bch4" 4-bit BCH ecc code |
30 | "bch8" 8-bit BCH ecc code | 30 | "bch8" 8-bit BCH ecc code |
31 | 31 | ||
32 | - ti,nand-xfer-type: A string setting the data transfer type. One of: | ||
33 | |||
34 | "prefetch-polled" Prefetch polled mode (default) | ||
35 | "polled" Polled mode, without prefetch | ||
36 | "prefetch-dma" Prefetch enabled sDMA mode | ||
37 | "prefetch-irq" Prefetch enabled irq mode | ||
38 | |||
32 | - elm_id: Specifies elm device node. This is required to support BCH | 39 | - elm_id: Specifies elm device node. This is required to support BCH |
33 | error correction using ELM module. | 40 | error correction using ELM module. |
34 | 41 | ||
@@ -55,6 +62,7 @@ Example for an AM33xx board: | |||
55 | reg = <0 0 0>; /* CS0, offset 0 */ | 62 | reg = <0 0 0>; /* CS0, offset 0 */ |
56 | nand-bus-width = <16>; | 63 | nand-bus-width = <16>; |
57 | ti,nand-ecc-opt = "bch8"; | 64 | ti,nand-ecc-opt = "bch8"; |
65 | ti,nand-xfer-type = "polled"; | ||
58 | 66 | ||
59 | gpmc,sync-clk-ps = <0>; | 67 | gpmc,sync-clk-ps = <0>; |
60 | gpmc,cs-on-ns = <0>; | 68 | gpmc,cs-on-ns = <0>; |
diff --git a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt index e15cfc4bb39e..72e9cd1e89b7 100644 --- a/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt +++ b/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt | |||
@@ -7,6 +7,10 @@ on-chip controllers onto these pads. | |||
7 | 7 | ||
8 | Required Properties: | 8 | Required Properties: |
9 | - compatible: should be one of the following. | 9 | - compatible: should be one of the following. |
10 | - "samsung,s3c2412-pinctrl": for S3C2412-compatible pin-controller, | ||
11 | - "samsung,s3c2416-pinctrl": for S3C2416-compatible pin-controller, | ||
12 | - "samsung,s3c2440-pinctrl": for S3C2440-compatible pin-controller, | ||
13 | - "samsung,s3c2450-pinctrl": for S3C2450-compatible pin-controller, | ||
10 | - "samsung,s3c64xx-pinctrl": for S3C64xx-compatible pin-controller, | 14 | - "samsung,s3c64xx-pinctrl": for S3C64xx-compatible pin-controller, |
11 | - "samsung,exynos4210-pinctrl": for Exynos4210 compatible pin-controller. | 15 | - "samsung,exynos4210-pinctrl": for Exynos4210 compatible pin-controller. |
12 | - "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller. | 16 | - "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller. |
@@ -116,6 +120,10 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a | |||
116 | 120 | ||
117 | - compatible: identifies the type of the external wakeup interrupt controller | 121 | - compatible: identifies the type of the external wakeup interrupt controller |
118 | The possible values are: | 122 | The possible values are: |
123 | - samsung,s3c2410-wakeup-eint: represents wakeup interrupt controller | ||
124 | found on Samsung S3C24xx SoCs except S3C2412 and S3C2413, | ||
125 | - samsung,s3c2412-wakeup-eint: represents wakeup interrupt controller | ||
126 | found on Samsung S3C2412 and S3C2413 SoCs, | ||
119 | - samsung,s3c64xx-wakeup-eint: represents wakeup interrupt controller | 127 | - samsung,s3c64xx-wakeup-eint: represents wakeup interrupt controller |
120 | found on Samsung S3C64xx SoCs, | 128 | found on Samsung S3C64xx SoCs, |
121 | - samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller | 129 | - samsung,exynos4210-wakeup-eint: represents wakeup interrupt controller |
diff --git a/Documentation/devicetree/bindings/sound/samsung-i2s.txt b/Documentation/devicetree/bindings/sound/samsung-i2s.txt index 3070046da2e5..025e66b85a43 100644 --- a/Documentation/devicetree/bindings/sound/samsung-i2s.txt +++ b/Documentation/devicetree/bindings/sound/samsung-i2s.txt | |||
@@ -8,6 +8,16 @@ Required SoC Specific Properties: | |||
8 | - dmas: list of DMA controller phandle and DMA request line ordered pairs. | 8 | - dmas: list of DMA controller phandle and DMA request line ordered pairs. |
9 | - dma-names: identifier string for each DMA request line in the dmas property. | 9 | - dma-names: identifier string for each DMA request line in the dmas property. |
10 | These strings correspond 1:1 with the ordered pairs in dmas. | 10 | These strings correspond 1:1 with the ordered pairs in dmas. |
11 | - clocks: Handle to iis clock and RCLK source clk. | ||
12 | - clock-names: | ||
13 | i2s0 uses some base clks from CMU and some are from audio subsystem internal | ||
14 | clock controller. The clock names for i2s0 should be "iis", "i2s_opclk0" and | ||
15 | "i2s_opclk1" as shown in the example below. | ||
16 | i2s1 and i2s2 uses clocks from CMU. The clock names for i2s1 and i2s2 should | ||
17 | be "iis" and "i2s_opclk0". | ||
18 | "iis" is the i2s bus clock and i2s_opclk0, i2s_opclk1 are sources of the root | ||
19 | clk. i2s0 has internal mux to select the source of root clk and i2s1 and i2s2 | ||
20 | doesn't have any such mux. | ||
11 | 21 | ||
12 | Optional SoC Specific Properties: | 22 | Optional SoC Specific Properties: |
13 | 23 | ||
@@ -20,44 +30,26 @@ Optional SoC Specific Properties: | |||
20 | then this flag is enabled. | 30 | then this flag is enabled. |
21 | - samsung,idma-addr: Internal DMA register base address of the audio | 31 | - samsung,idma-addr: Internal DMA register base address of the audio |
22 | sub system(used in secondary sound source). | 32 | sub system(used in secondary sound source). |
23 | 33 | - pinctrl-0: Should specify pin control groups used for this controller. | |
24 | Required Board Specific Properties: | 34 | - pinctrl-names: Should contain only one value - "default". |
25 | |||
26 | - gpios: The gpio specifier for data out,data in, LRCLK, CDCLK and SCLK | ||
27 | interface lines. The format of the gpio specifier depends on the gpio | ||
28 | controller. | ||
29 | The syntax of samsung gpio specifier is | ||
30 | <[phandle of the gpio controller node] | ||
31 | [pin number within the gpio controller] | ||
32 | [mux function] | ||
33 | [flags and pull up/down] | ||
34 | [drive strength]> | ||
35 | 35 | ||
36 | Example: | 36 | Example: |
37 | 37 | ||
38 | - SoC Specific Portion: | 38 | i2s0: i2s@03830000 { |
39 | |||
40 | i2s@03830000 { | ||
41 | compatible = "samsung,i2s-v5"; | 39 | compatible = "samsung,i2s-v5"; |
42 | reg = <0x03830000 0x100>; | 40 | reg = <0x03830000 0x100>; |
43 | dmas = <&pdma0 10 | 41 | dmas = <&pdma0 10 |
44 | &pdma0 9 | 42 | &pdma0 9 |
45 | &pdma0 8>; | 43 | &pdma0 8>; |
46 | dma-names = "tx", "rx", "tx-sec"; | 44 | dma-names = "tx", "rx", "tx-sec"; |
45 | clocks = <&clock_audss EXYNOS_I2S_BUS>, | ||
46 | <&clock_audss EXYNOS_I2S_BUS>, | ||
47 | <&clock_audss EXYNOS_SCLK_I2S>; | ||
48 | clock-names = "iis", "i2s_opclk0", "i2s_opclk1"; | ||
47 | samsung,supports-6ch; | 49 | samsung,supports-6ch; |
48 | samsung,supports-rstclr; | 50 | samsung,supports-rstclr; |
49 | samsung,supports-secdai; | 51 | samsung,supports-secdai; |
50 | samsung,idma-addr = <0x03000000>; | 52 | samsung,idma-addr = <0x03000000>; |
51 | }; | 53 | pinctrl-names = "default"; |
52 | 54 | pinctrl-0 = <&i2s0_bus>; | |
53 | - Board Specific Portion: | ||
54 | |||
55 | i2s@03830000 { | ||
56 | gpios = <&gpz 0 2 0 0>, /* I2S_0_SCLK */ | ||
57 | <&gpz 1 2 0 0>, /* I2S_0_CDCLK */ | ||
58 | <&gpz 2 2 0 0>, /* I2S_0_LRCK */ | ||
59 | <&gpz 3 2 0 0>, /* I2S_0_SDI */ | ||
60 | <&gpz 4 2 0 0>, /* I2S_0_SDO[1] */ | ||
61 | <&gpz 5 2 0 0>, /* I2S_0_SDO[2] */ | ||
62 | <&gpz 6 2 0 0>; /* I2S_0_SDO[3] */ | ||
63 | }; | 55 | }; |
diff --git a/Documentation/devicetree/bindings/usb/atmel-usb.txt b/Documentation/devicetree/bindings/usb/atmel-usb.txt index 60bd2150a3e6..55f51af08bc7 100644 --- a/Documentation/devicetree/bindings/usb/atmel-usb.txt +++ b/Documentation/devicetree/bindings/usb/atmel-usb.txt | |||
@@ -47,3 +47,85 @@ usb1: gadget@fffa4000 { | |||
47 | interrupts = <10 4>; | 47 | interrupts = <10 4>; |
48 | atmel,vbus-gpio = <&pioC 5 0>; | 48 | atmel,vbus-gpio = <&pioC 5 0>; |
49 | }; | 49 | }; |
50 | |||
51 | Atmel High-Speed USB device controller | ||
52 | |||
53 | Required properties: | ||
54 | - compatible: Should be "atmel,at91sam9rl-udc" | ||
55 | - reg: Address and length of the register set for the device | ||
56 | - interrupts: Should contain usba interrupt | ||
57 | - ep childnode: To specify the number of endpoints and their properties. | ||
58 | |||
59 | Optional properties: | ||
60 | - atmel,vbus-gpio: If present, specifies a gpio that needs to be | ||
61 | activated for the bus to be powered. | ||
62 | |||
63 | Required child node properties: | ||
64 | - name: Name of the endpoint. | ||
65 | - reg: Num of the endpoint. | ||
66 | - atmel,fifo-size: Size of the fifo. | ||
67 | - atmel,nb-banks: Number of banks. | ||
68 | - atmel,can-dma: Boolean to specify if the endpoint support DMA. | ||
69 | - atmel,can-isoc: Boolean to specify if the endpoint support ISOC. | ||
70 | |||
71 | usb2: gadget@fff78000 { | ||
72 | #address-cells = <1>; | ||
73 | #size-cells = <0>; | ||
74 | compatible = "atmel,at91sam9rl-udc"; | ||
75 | reg = <0x00600000 0x80000 | ||
76 | 0xfff78000 0x400>; | ||
77 | interrupts = <27 4 0>; | ||
78 | atmel,vbus-gpio = <&pioB 19 0>; | ||
79 | |||
80 | ep0 { | ||
81 | reg = <0>; | ||
82 | atmel,fifo-size = <64>; | ||
83 | atmel,nb-banks = <1>; | ||
84 | }; | ||
85 | |||
86 | ep1 { | ||
87 | reg = <1>; | ||
88 | atmel,fifo-size = <1024>; | ||
89 | atmel,nb-banks = <2>; | ||
90 | atmel,can-dma; | ||
91 | atmel,can-isoc; | ||
92 | }; | ||
93 | |||
94 | ep2 { | ||
95 | reg = <2>; | ||
96 | atmel,fifo-size = <1024>; | ||
97 | atmel,nb-banks = <2>; | ||
98 | atmel,can-dma; | ||
99 | atmel,can-isoc; | ||
100 | }; | ||
101 | |||
102 | ep3 { | ||
103 | reg = <3>; | ||
104 | atmel,fifo-size = <1024>; | ||
105 | atmel,nb-banks = <3>; | ||
106 | atmel,can-dma; | ||
107 | }; | ||
108 | |||
109 | ep4 { | ||
110 | reg = <4>; | ||
111 | atmel,fifo-size = <1024>; | ||
112 | atmel,nb-banks = <3>; | ||
113 | atmel,can-dma; | ||
114 | }; | ||
115 | |||
116 | ep5 { | ||
117 | reg = <5>; | ||
118 | atmel,fifo-size = <1024>; | ||
119 | atmel,nb-banks = <3>; | ||
120 | atmel,can-dma; | ||
121 | atmel,can-isoc; | ||
122 | }; | ||
123 | |||
124 | ep6 { | ||
125 | reg = <6>; | ||
126 | atmel,fifo-size = <1024>; | ||
127 | atmel,nb-banks = <3>; | ||
128 | atmel,can-dma; | ||
129 | atmel,can-isoc; | ||
130 | }; | ||
131 | }; | ||
diff --git a/Documentation/devicetree/bindings/usb/ux500-usb.txt b/Documentation/devicetree/bindings/usb/ux500-usb.txt new file mode 100644 index 000000000000..330d6ec15401 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/ux500-usb.txt | |||
@@ -0,0 +1,50 @@ | |||
1 | Ux500 MUSB | ||
2 | |||
3 | Required properties: | ||
4 | - compatible : Should be "stericsson,db8500-musb" | ||
5 | - reg : Offset and length of registers | ||
6 | - interrupts : Interrupt; mode, number and trigger | ||
7 | - dr_mode : Dual-role; either host mode "host", peripheral mode "peripheral" | ||
8 | or both "otg" | ||
9 | |||
10 | Optional properties: | ||
11 | - dmas : A list of dma channels; | ||
12 | dma-controller, event-line, fixed-channel, flags | ||
13 | - dma-names : An ordered list of channel names affiliated to the above | ||
14 | |||
15 | Example: | ||
16 | |||
17 | usb_per5@a03e0000 { | ||
18 | compatible = "stericsson,db8500-musb", "mentor,musb"; | ||
19 | reg = <0xa03e0000 0x10000>; | ||
20 | interrupts = <0 23 0x4>; | ||
21 | interrupt-names = "mc"; | ||
22 | |||
23 | dr_mode = "otg"; | ||
24 | |||
25 | dmas = <&dma 38 0 0x2>, /* Logical - DevToMem */ | ||
26 | <&dma 38 0 0x0>, /* Logical - MemToDev */ | ||
27 | <&dma 37 0 0x2>, /* Logical - DevToMem */ | ||
28 | <&dma 37 0 0x0>, /* Logical - MemToDev */ | ||
29 | <&dma 36 0 0x2>, /* Logical - DevToMem */ | ||
30 | <&dma 36 0 0x0>, /* Logical - MemToDev */ | ||
31 | <&dma 19 0 0x2>, /* Logical - DevToMem */ | ||
32 | <&dma 19 0 0x0>, /* Logical - MemToDev */ | ||
33 | <&dma 18 0 0x2>, /* Logical - DevToMem */ | ||
34 | <&dma 18 0 0x0>, /* Logical - MemToDev */ | ||
35 | <&dma 17 0 0x2>, /* Logical - DevToMem */ | ||
36 | <&dma 17 0 0x0>, /* Logical - MemToDev */ | ||
37 | <&dma 16 0 0x2>, /* Logical - DevToMem */ | ||
38 | <&dma 16 0 0x0>, /* Logical - MemToDev */ | ||
39 | <&dma 39 0 0x2>, /* Logical - DevToMem */ | ||
40 | <&dma 39 0 0x0>; /* Logical - MemToDev */ | ||
41 | |||
42 | dma-names = "iep_1_9", "oep_1_9", | ||
43 | "iep_2_10", "oep_2_10", | ||
44 | "iep_3_11", "oep_3_11", | ||
45 | "iep_4_12", "oep_4_12", | ||
46 | "iep_5_13", "oep_5_13", | ||
47 | "iep_6_14", "oep_6_14", | ||
48 | "iep_7_15", "oep_7_15", | ||
49 | "iep_8", "oep_8"; | ||
50 | }; | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7a13c2cd7a86..49fdc432512f 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -2087,53 +2087,6 @@ menu "CPU Power Management" | |||
2087 | 2087 | ||
2088 | if ARCH_HAS_CPUFREQ | 2088 | if ARCH_HAS_CPUFREQ |
2089 | source "drivers/cpufreq/Kconfig" | 2089 | source "drivers/cpufreq/Kconfig" |
2090 | |||
2091 | config CPU_FREQ_S3C | ||
2092 | bool | ||
2093 | help | ||
2094 | Internal configuration node for common cpufreq on Samsung SoC | ||
2095 | |||
2096 | config CPU_FREQ_S3C24XX | ||
2097 | bool "CPUfreq driver for Samsung S3C24XX series CPUs (EXPERIMENTAL)" | ||
2098 | depends on ARCH_S3C24XX && CPU_FREQ | ||
2099 | select CPU_FREQ_S3C | ||
2100 | help | ||
2101 | This enables the CPUfreq driver for the Samsung S3C24XX family | ||
2102 | of CPUs. | ||
2103 | |||
2104 | For details, take a look at <file:Documentation/cpu-freq>. | ||
2105 | |||
2106 | If in doubt, say N. | ||
2107 | |||
2108 | config CPU_FREQ_S3C24XX_PLL | ||
2109 | bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)" | ||
2110 | depends on CPU_FREQ_S3C24XX | ||
2111 | help | ||
2112 | Compile in support for changing the PLL frequency from the | ||
2113 | S3C24XX series CPUfreq driver. The PLL takes time to settle | ||
2114 | after a frequency change, so by default it is not enabled. | ||
2115 | |||
2116 | This also means that the PLL tables for the selected CPU(s) will | ||
2117 | be built which may increase the size of the kernel image. | ||
2118 | |||
2119 | config CPU_FREQ_S3C24XX_DEBUG | ||
2120 | bool "Debug CPUfreq Samsung driver core" | ||
2121 | depends on CPU_FREQ_S3C24XX | ||
2122 | help | ||
2123 | Enable s3c_freq_dbg for the Samsung S3C CPUfreq core | ||
2124 | |||
2125 | config CPU_FREQ_S3C24XX_IODEBUG | ||
2126 | bool "Debug CPUfreq Samsung driver IO timing" | ||
2127 | depends on CPU_FREQ_S3C24XX | ||
2128 | help | ||
2129 | Enable s3c_freq_iodbg for the Samsung S3C CPUfreq core | ||
2130 | |||
2131 | config CPU_FREQ_S3C24XX_DEBUGFS | ||
2132 | bool "Export debugfs for CPUFreq" | ||
2133 | depends on CPU_FREQ_S3C24XX && DEBUG_FS | ||
2134 | help | ||
2135 | Export status information via debugfs. | ||
2136 | |||
2137 | endif | 2090 | endif |
2138 | 2091 | ||
2139 | source "drivers/cpuidle/Kconfig" | 2092 | source "drivers/cpuidle/Kconfig" |
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi index a082f0ba1ddb..a1529455f081 100644 --- a/arch/arm/boot/dts/dbx5x0.dtsi +++ b/arch/arm/boot/dts/dbx5x0.dtsi | |||
@@ -360,6 +360,11 @@ | |||
360 | interrupt-controller; | 360 | interrupt-controller; |
361 | #interrupt-cells = <2>; | 361 | #interrupt-cells = <2>; |
362 | 362 | ||
363 | ab8500_gpio: ab8500-gpio { | ||
364 | gpio-controller; | ||
365 | #gpio-cells = <2>; | ||
366 | }; | ||
367 | |||
363 | ab8500-rtc { | 368 | ab8500-rtc { |
364 | compatible = "stericsson,ab8500-rtc"; | 369 | compatible = "stericsson,ab8500-rtc"; |
365 | interrupts = <17 IRQ_TYPE_LEVEL_HIGH | 370 | interrupts = <17 IRQ_TYPE_LEVEL_HIGH |
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index bed40ee2e4f6..3f94fe8e3706 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi | |||
@@ -19,7 +19,7 @@ | |||
19 | * published by the Free Software Foundation. | 19 | * published by the Free Software Foundation. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /include/ "skeleton.dtsi" | 22 | #include "skeleton.dtsi" |
23 | 23 | ||
24 | / { | 24 | / { |
25 | interrupt-parent = <&gic>; | 25 | interrupt-parent = <&gic>; |
diff --git a/arch/arm/boot/dts/exynos4210-origen.dts b/arch/arm/boot/dts/exynos4210-origen.dts index 08609b8bdaf1..382d8c7e2906 100644 --- a/arch/arm/boot/dts/exynos4210-origen.dts +++ b/arch/arm/boot/dts/exynos4210-origen.dts | |||
@@ -15,7 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | /dts-v1/; | 17 | /dts-v1/; |
18 | /include/ "exynos4210.dtsi" | 18 | #include "exynos4210.dtsi" |
19 | 19 | ||
20 | / { | 20 | / { |
21 | model = "Insignal Origen evaluation board based on Exynos4210"; | 21 | model = "Insignal Origen evaluation board based on Exynos4210"; |
diff --git a/arch/arm/boot/dts/exynos4210-smdkv310.dts b/arch/arm/boot/dts/exynos4210-smdkv310.dts index 91332b72acf5..9c01b718d29d 100644 --- a/arch/arm/boot/dts/exynos4210-smdkv310.dts +++ b/arch/arm/boot/dts/exynos4210-smdkv310.dts | |||
@@ -15,7 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | /dts-v1/; | 17 | /dts-v1/; |
18 | /include/ "exynos4210.dtsi" | 18 | #include "exynos4210.dtsi" |
19 | 19 | ||
20 | / { | 20 | / { |
21 | model = "Samsung smdkv310 evaluation board based on Exynos4210"; | 21 | model = "Samsung smdkv310 evaluation board based on Exynos4210"; |
diff --git a/arch/arm/boot/dts/exynos4210-trats.dts b/arch/arm/boot/dts/exynos4210-trats.dts index 9a14484c7bb1..94eebffe3044 100644 --- a/arch/arm/boot/dts/exynos4210-trats.dts +++ b/arch/arm/boot/dts/exynos4210-trats.dts | |||
@@ -13,7 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | /dts-v1/; | 15 | /dts-v1/; |
16 | /include/ "exynos4210.dtsi" | 16 | #include "exynos4210.dtsi" |
17 | 17 | ||
18 | / { | 18 | / { |
19 | model = "Samsung Trats based on Exynos4210"; | 19 | model = "Samsung Trats based on Exynos4210"; |
diff --git a/arch/arm/boot/dts/exynos4210-universal_c210.dts b/arch/arm/boot/dts/exynos4210-universal_c210.dts index 345cdb51dcb7..889cdada1ce9 100644 --- a/arch/arm/boot/dts/exynos4210-universal_c210.dts +++ b/arch/arm/boot/dts/exynos4210-universal_c210.dts | |||
@@ -13,7 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | /dts-v1/; | 15 | /dts-v1/; |
16 | /include/ "exynos4210.dtsi" | 16 | #include "exynos4210.dtsi" |
17 | 17 | ||
18 | / { | 18 | / { |
19 | model = "Samsung Universal C210 based on Exynos4210 rev0"; | 19 | model = "Samsung Universal C210 based on Exynos4210 rev0"; |
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index d4f8067e89ba..b7f358a93bcb 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi | |||
@@ -19,8 +19,8 @@ | |||
19 | * published by the Free Software Foundation. | 19 | * published by the Free Software Foundation. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /include/ "exynos4.dtsi" | 22 | #include "exynos4.dtsi" |
23 | /include/ "exynos4210-pinctrl.dtsi" | 23 | #include "exynos4210-pinctrl.dtsi" |
24 | 24 | ||
25 | / { | 25 | / { |
26 | compatible = "samsung,exynos4210"; | 26 | compatible = "samsung,exynos4210"; |
diff --git a/arch/arm/boot/dts/exynos4212.dtsi b/arch/arm/boot/dts/exynos4212.dtsi index c0f60f49cea6..6f34d7f6ba7e 100644 --- a/arch/arm/boot/dts/exynos4212.dtsi +++ b/arch/arm/boot/dts/exynos4212.dtsi | |||
@@ -17,7 +17,7 @@ | |||
17 | * published by the Free Software Foundation. | 17 | * published by the Free Software Foundation. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /include/ "exynos4x12.dtsi" | 20 | #include "exynos4x12.dtsi" |
21 | 21 | ||
22 | / { | 22 | / { |
23 | compatible = "samsung,exynos4212"; | 23 | compatible = "samsung,exynos4212"; |
diff --git a/arch/arm/boot/dts/exynos4412-odroidx.dts b/arch/arm/boot/dts/exynos4412-odroidx.dts index 867d9452619b..46c678ee119c 100644 --- a/arch/arm/boot/dts/exynos4412-odroidx.dts +++ b/arch/arm/boot/dts/exynos4412-odroidx.dts | |||
@@ -12,7 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | /dts-v1/; | 14 | /dts-v1/; |
15 | /include/ "exynos4412.dtsi" | 15 | #include "exynos4412.dtsi" |
16 | 16 | ||
17 | / { | 17 | / { |
18 | model = "Hardkernel ODROID-X board based on Exynos4412"; | 18 | model = "Hardkernel ODROID-X board based on Exynos4412"; |
diff --git a/arch/arm/boot/dts/exynos4412-origen.dts b/arch/arm/boot/dts/exynos4412-origen.dts index ca73c42f77e1..7993641cb32a 100644 --- a/arch/arm/boot/dts/exynos4412-origen.dts +++ b/arch/arm/boot/dts/exynos4412-origen.dts | |||
@@ -13,7 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | /dts-v1/; | 15 | /dts-v1/; |
16 | /include/ "exynos4412.dtsi" | 16 | #include "exynos4412.dtsi" |
17 | 17 | ||
18 | / { | 18 | / { |
19 | model = "Insignal Origen evaluation board based on Exynos4412"; | 19 | model = "Insignal Origen evaluation board based on Exynos4412"; |
diff --git a/arch/arm/boot/dts/exynos4412-smdk4412.dts b/arch/arm/boot/dts/exynos4412-smdk4412.dts index a8ba195c41ac..ad316a1ee9e0 100644 --- a/arch/arm/boot/dts/exynos4412-smdk4412.dts +++ b/arch/arm/boot/dts/exynos4412-smdk4412.dts | |||
@@ -13,7 +13,7 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | /dts-v1/; | 15 | /dts-v1/; |
16 | /include/ "exynos4412.dtsi" | 16 | #include "exynos4412.dtsi" |
17 | 17 | ||
18 | / { | 18 | / { |
19 | model = "Samsung SMDK evaluation board based on Exynos4412"; | 19 | model = "Samsung SMDK evaluation board based on Exynos4412"; |
diff --git a/arch/arm/boot/dts/exynos4412.dtsi b/arch/arm/boot/dts/exynos4412.dtsi index 270b389e0a1b..e743e677a9e2 100644 --- a/arch/arm/boot/dts/exynos4412.dtsi +++ b/arch/arm/boot/dts/exynos4412.dtsi | |||
@@ -17,7 +17,7 @@ | |||
17 | * published by the Free Software Foundation. | 17 | * published by the Free Software Foundation. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /include/ "exynos4x12.dtsi" | 20 | #include "exynos4x12.dtsi" |
21 | 21 | ||
22 | / { | 22 | / { |
23 | compatible = "samsung,exynos4412"; | 23 | compatible = "samsung,exynos4412"; |
diff --git a/arch/arm/boot/dts/exynos4x12.dtsi b/arch/arm/boot/dts/exynos4x12.dtsi index 35cb2099d55e..01da194ba329 100644 --- a/arch/arm/boot/dts/exynos4x12.dtsi +++ b/arch/arm/boot/dts/exynos4x12.dtsi | |||
@@ -17,8 +17,8 @@ | |||
17 | * published by the Free Software Foundation. | 17 | * published by the Free Software Foundation. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /include/ "exynos4.dtsi" | 20 | #include "exynos4.dtsi" |
21 | /include/ "exynos4x12-pinctrl.dtsi" | 21 | #include "exynos4x12-pinctrl.dtsi" |
22 | 22 | ||
23 | / { | 23 | / { |
24 | aliases { | 24 | aliases { |
diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts index c6db281a3430..abc7272c7afd 100644 --- a/arch/arm/boot/dts/exynos5250-arndale.dts +++ b/arch/arm/boot/dts/exynos5250-arndale.dts | |||
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /dts-v1/; | 12 | /dts-v1/; |
13 | /include/ "exynos5250.dtsi" | 13 | #include "exynos5250.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "Insignal Arndale evaluation board based on EXYNOS5250"; | 16 | model = "Insignal Arndale evaluation board based on EXYNOS5250"; |
diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 1e21200b6d85..35a66dee4011 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts | |||
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /dts-v1/; | 12 | /dts-v1/; |
13 | /include/ "exynos5250.dtsi" | 13 | #include "exynos5250.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "SAMSUNG SMDK5250 board based on EXYNOS5250"; | 16 | model = "SAMSUNG SMDK5250 board based on EXYNOS5250"; |
diff --git a/arch/arm/boot/dts/exynos5250-snow.dts b/arch/arm/boot/dts/exynos5250-snow.dts index 05244f150dd9..e79331dba12d 100644 --- a/arch/arm/boot/dts/exynos5250-snow.dts +++ b/arch/arm/boot/dts/exynos5250-snow.dts | |||
@@ -9,8 +9,8 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | /dts-v1/; | 11 | /dts-v1/; |
12 | /include/ "exynos5250.dtsi" | 12 | #include "exynos5250.dtsi" |
13 | /include/ "cros5250-common.dtsi" | 13 | #include "cros5250-common.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "Google Snow"; | 16 | model = "Google Snow"; |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 54a35e64c781..964158c1844f 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
@@ -17,8 +17,10 @@ | |||
17 | * published by the Free Software Foundation. | 17 | * published by the Free Software Foundation. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /include/ "skeleton.dtsi" | 20 | #include "skeleton.dtsi" |
21 | /include/ "exynos5250-pinctrl.dtsi" | 21 | #include "exynos5250-pinctrl.dtsi" |
22 | |||
23 | #include <dt-bindings/clk/exynos-audss-clk.h> | ||
22 | 24 | ||
23 | / { | 25 | / { |
24 | compatible = "samsung,exynos5250"; | 26 | compatible = "samsung,exynos5250"; |
@@ -72,6 +74,12 @@ | |||
72 | #clock-cells = <1>; | 74 | #clock-cells = <1>; |
73 | }; | 75 | }; |
74 | 76 | ||
77 | clock_audss: audss-clock-controller@3810000 { | ||
78 | compatible = "samsung,exynos5250-audss-clock"; | ||
79 | reg = <0x03810000 0x0C>; | ||
80 | #clock-cells = <1>; | ||
81 | }; | ||
82 | |||
75 | gic:interrupt-controller@10481000 { | 83 | gic:interrupt-controller@10481000 { |
76 | compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; | 84 | compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic"; |
77 | #interrupt-cells = <3>; | 85 | #interrupt-cells = <3>; |
@@ -451,6 +459,10 @@ | |||
451 | &pdma0 9 | 459 | &pdma0 9 |
452 | &pdma0 8>; | 460 | &pdma0 8>; |
453 | dma-names = "tx", "rx", "tx-sec"; | 461 | dma-names = "tx", "rx", "tx-sec"; |
462 | clocks = <&clock_audss EXYNOS_I2S_BUS>, | ||
463 | <&clock_audss EXYNOS_I2S_BUS>, | ||
464 | <&clock_audss EXYNOS_SCLK_I2S>; | ||
465 | clock-names = "iis", "i2s_opclk0", "i2s_opclk1"; | ||
454 | samsung,supports-6ch; | 466 | samsung,supports-6ch; |
455 | samsung,supports-rstclr; | 467 | samsung,supports-rstclr; |
456 | samsung,supports-secdai; | 468 | samsung,supports-secdai; |
@@ -465,6 +477,8 @@ | |||
465 | dmas = <&pdma1 12 | 477 | dmas = <&pdma1 12 |
466 | &pdma1 11>; | 478 | &pdma1 11>; |
467 | dma-names = "tx", "rx"; | 479 | dma-names = "tx", "rx"; |
480 | clocks = <&clock 307>, <&clock 157>; | ||
481 | clock-names = "iis", "i2s_opclk0"; | ||
468 | pinctrl-names = "default"; | 482 | pinctrl-names = "default"; |
469 | pinctrl-0 = <&i2s1_bus>; | 483 | pinctrl-0 = <&i2s1_bus>; |
470 | }; | 484 | }; |
@@ -475,6 +489,8 @@ | |||
475 | dmas = <&pdma0 12 | 489 | dmas = <&pdma0 12 |
476 | &pdma0 11>; | 490 | &pdma0 11>; |
477 | dma-names = "tx", "rx"; | 491 | dma-names = "tx", "rx"; |
492 | clocks = <&clock 308>, <&clock 158>; | ||
493 | clock-names = "iis", "i2s_opclk0"; | ||
478 | pinctrl-names = "default"; | 494 | pinctrl-names = "default"; |
479 | pinctrl-0 = <&i2s2_bus>; | 495 | pinctrl-0 = <&i2s2_bus>; |
480 | }; | 496 | }; |
diff --git a/arch/arm/boot/dts/exynos5440-sd5v1.dts b/arch/arm/boot/dts/exynos5440-sd5v1.dts index f722a0263ac8..5b22508050da 100644 --- a/arch/arm/boot/dts/exynos5440-sd5v1.dts +++ b/arch/arm/boot/dts/exynos5440-sd5v1.dts | |||
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /dts-v1/; | 12 | /dts-v1/; |
13 | /include/ "exynos5440.dtsi" | 13 | #include "exynos5440.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "SAMSUNG SD5v1 board based on EXYNOS5440"; | 16 | model = "SAMSUNG SD5v1 board based on EXYNOS5440"; |
diff --git a/arch/arm/boot/dts/exynos5440-ssdk5440.dts b/arch/arm/boot/dts/exynos5440-ssdk5440.dts index ba88cfd2486f..ede772741f81 100644 --- a/arch/arm/boot/dts/exynos5440-ssdk5440.dts +++ b/arch/arm/boot/dts/exynos5440-ssdk5440.dts | |||
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /dts-v1/; | 12 | /dts-v1/; |
13 | /include/ "exynos5440.dtsi" | 13 | #include "exynos5440.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "SAMSUNG SSDK5440 board based on EXYNOS5440"; | 16 | model = "SAMSUNG SSDK5440 board based on EXYNOS5440"; |
diff --git a/arch/arm/boot/dts/exynos5440.dtsi b/arch/arm/boot/dts/exynos5440.dtsi index bfcb907b7e33..ff7f5d855845 100644 --- a/arch/arm/boot/dts/exynos5440.dtsi +++ b/arch/arm/boot/dts/exynos5440.dtsi | |||
@@ -9,7 +9,7 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | /include/ "skeleton.dtsi" | 12 | #include "skeleton.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | compatible = "samsung,exynos5440"; | 15 | compatible = "samsung,exynos5440"; |
diff --git a/arch/arm/boot/dts/omap3430-sdp.dts b/arch/arm/boot/dts/omap3430-sdp.dts index c4a1c0a97728..e2249bcc3e63 100644 --- a/arch/arm/boot/dts/omap3430-sdp.dts +++ b/arch/arm/boot/dts/omap3430-sdp.dts | |||
@@ -106,7 +106,6 @@ | |||
106 | nand-bus-width = <8>; | 106 | nand-bus-width = <8>; |
107 | 107 | ||
108 | ti,nand-ecc-opt = "sw"; | 108 | ti,nand-ecc-opt = "sw"; |
109 | gpmc,device-nand; | ||
110 | gpmc,cs-on-ns = <0>; | 109 | gpmc,cs-on-ns = <0>; |
111 | gpmc,cs-rd-off-ns = <36>; | 110 | gpmc,cs-rd-off-ns = <36>; |
112 | gpmc,cs-wr-off-ns = <36>; | 111 | gpmc,cs-wr-off-ns = <36>; |
diff --git a/arch/arm/boot/dts/s3c2416-smdk2416.dts b/arch/arm/boot/dts/s3c2416-smdk2416.dts index ad1dd09c10eb..59594cf15998 100644 --- a/arch/arm/boot/dts/s3c2416-smdk2416.dts +++ b/arch/arm/boot/dts/s3c2416-smdk2416.dts | |||
@@ -9,7 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | /dts-v1/; | 11 | /dts-v1/; |
12 | /include/ "s3c2416.dtsi" | 12 | #include "s3c2416.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | model = "SMDK2416"; | 15 | model = "SMDK2416"; |
diff --git a/arch/arm/boot/dts/s3c2416.dtsi b/arch/arm/boot/dts/s3c2416.dtsi index 6809324934a3..e6555bdd81b8 100644 --- a/arch/arm/boot/dts/s3c2416.dtsi +++ b/arch/arm/boot/dts/s3c2416.dtsi | |||
@@ -8,8 +8,8 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /include/ "s3c24xx.dtsi" | 11 | #include "s3c24xx.dtsi" |
12 | /include/ "s3c2416-pinctrl.dtsi" | 12 | #include "s3c2416-pinctrl.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | model = "Samsung S3C2416 SoC"; | 15 | model = "Samsung S3C2416 SoC"; |
diff --git a/arch/arm/boot/dts/s3c24xx.dtsi b/arch/arm/boot/dts/s3c24xx.dtsi index cab46ff5fb4d..2d1d7dc9418a 100644 --- a/arch/arm/boot/dts/s3c24xx.dtsi +++ b/arch/arm/boot/dts/s3c24xx.dtsi | |||
@@ -8,7 +8,7 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /include/ "skeleton.dtsi" | 11 | #include "skeleton.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | compatible = "samsung,s3c24xx"; | 14 | compatible = "samsung,s3c24xx"; |
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts index fb9dce529da6..49824be66845 100644 --- a/arch/arm/boot/dts/snowball.dts +++ b/arch/arm/boot/dts/snowball.dts | |||
@@ -22,12 +22,13 @@ | |||
22 | 22 | ||
23 | en_3v3_reg: en_3v3 { | 23 | en_3v3_reg: en_3v3 { |
24 | compatible = "regulator-fixed"; | 24 | compatible = "regulator-fixed"; |
25 | regulator-name = "en-3v3-fixed-supply"; | 25 | regulator-name = "en-3v3-fixed-supply"; |
26 | regulator-min-microvolt = <3300000>; | 26 | regulator-min-microvolt = <3300000>; |
27 | regulator-max-microvolt = <3300000>; | 27 | regulator-max-microvolt = <3300000>; |
28 | gpios = <&gpio0 26 0x4>; // 26 | 28 | /* AB8500 GPIOs start from 1 - offset 25 is GPIO26. */ |
29 | startup-delay-us = <5000>; | 29 | gpio = <&ab8500_gpio 25 0x4>; |
30 | enable-active-high; | 30 | startup-delay-us = <5000>; |
31 | enable-active-high; | ||
31 | }; | 32 | }; |
32 | 33 | ||
33 | gpio_keys { | 34 | gpio_keys { |
diff --git a/arch/arm/configs/omap1_defconfig b/arch/arm/configs/omap1_defconfig index 9940f7b4e438..d74edbad18fc 100644 --- a/arch/arm/configs/omap1_defconfig +++ b/arch/arm/configs/omap1_defconfig | |||
@@ -26,7 +26,8 @@ CONFIG_ARCH_OMAP=y | |||
26 | CONFIG_ARCH_OMAP1=y | 26 | CONFIG_ARCH_OMAP1=y |
27 | CONFIG_OMAP_RESET_CLOCKS=y | 27 | CONFIG_OMAP_RESET_CLOCKS=y |
28 | # CONFIG_OMAP_MUX is not set | 28 | # CONFIG_OMAP_MUX is not set |
29 | CONFIG_OMAP_MBOX_FWK=y | 29 | CONFIG_MAILBOX=y |
30 | CONFIG_OMAP1_MBOX=y | ||
30 | CONFIG_OMAP_32K_TIMER=y | 31 | CONFIG_OMAP_32K_TIMER=y |
31 | CONFIG_OMAP_DM_TIMER=y | 32 | CONFIG_OMAP_DM_TIMER=y |
32 | CONFIG_ARCH_OMAP730=y | 33 | CONFIG_ARCH_OMAP730=y |
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index 222d58c0ae76..3889b6cd211e 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile | |||
@@ -19,10 +19,6 @@ obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o | |||
19 | # Power Management | 19 | # Power Management |
20 | obj-$(CONFIG_PM) += pm.o sleep.o | 20 | obj-$(CONFIG_PM) += pm.o sleep.o |
21 | 21 | ||
22 | # DSP | ||
23 | obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o | ||
24 | mailbox_mach-objs := mailbox.o | ||
25 | |||
26 | i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o | 22 | i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o |
27 | obj-y += $(i2c-omap-m) $(i2c-omap-y) | 23 | obj-y += $(i2c-omap-m) $(i2c-omap-y) |
28 | 24 | ||
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 8e8c605ebefe..ea5a27ff9941 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -212,9 +212,6 @@ obj-$(CONFIG_SOC_OMAP5) += omap_hwmod_54xx_data.o | |||
212 | obj-$(CONFIG_OMAP3_EMU) += emu.o | 212 | obj-$(CONFIG_OMAP3_EMU) += emu.o |
213 | obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o | 213 | obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o |
214 | 214 | ||
215 | obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o | ||
216 | mailbox_mach-objs := mailbox.o | ||
217 | |||
218 | iommu-$(CONFIG_OMAP_IOMMU) := omap-iommu.o | 215 | iommu-$(CONFIG_OMAP_IOMMU) := omap-iommu.o |
219 | obj-y += $(iommu-m) $(iommu-y) | 216 | obj-y += $(iommu-m) $(iommu-y) |
220 | 217 | ||
diff --git a/arch/arm/mach-omap2/board-flash.c b/arch/arm/mach-omap2/board-flash.c index c33adea0247c..fc20a61f6b2a 100644 --- a/arch/arm/mach-omap2/board-flash.c +++ b/arch/arm/mach-omap2/board-flash.c | |||
@@ -112,6 +112,9 @@ struct gpmc_timings nand_default_timings[1] = { | |||
112 | .cs_rd_off = 36, | 112 | .cs_rd_off = 36, |
113 | .cs_wr_off = 36, | 113 | .cs_wr_off = 36, |
114 | 114 | ||
115 | .we_on = 6, | ||
116 | .oe_on = 6, | ||
117 | |||
115 | .adv_on = 6, | 118 | .adv_on = 6, |
116 | .adv_rd_off = 24, | 119 | .adv_rd_off = 24, |
117 | .adv_wr_off = 36, | 120 | .adv_wr_off = 36, |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 403c211e35d0..aef96e45cb20 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/pinctrl/machine.h> | 21 | #include <linux/pinctrl/machine.h> |
22 | #include <linux/platform_data/omap4-keypad.h> | 22 | #include <linux/platform_data/omap4-keypad.h> |
23 | #include <linux/wl12xx.h> | 23 | #include <linux/wl12xx.h> |
24 | #include <linux/platform_data/mailbox-omap.h> | ||
24 | 25 | ||
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
@@ -283,25 +284,31 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data | |||
283 | return 0; | 284 | return 0; |
284 | } | 285 | } |
285 | 286 | ||
286 | #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE) | 287 | #if defined(CONFIG_OMAP2PLUS_MBOX) || defined(CONFIG_OMAP2PLUS_MBOX_MODULE) |
287 | static inline void __init omap_init_mbox(void) | 288 | static inline void __init omap_init_mbox(void) |
288 | { | 289 | { |
289 | struct omap_hwmod *oh; | 290 | struct omap_hwmod *oh; |
290 | struct platform_device *pdev; | 291 | struct platform_device *pdev; |
292 | struct omap_mbox_pdata *pdata; | ||
291 | 293 | ||
292 | oh = omap_hwmod_lookup("mailbox"); | 294 | oh = omap_hwmod_lookup("mailbox"); |
293 | if (!oh) { | 295 | if (!oh) { |
294 | pr_err("%s: unable to find hwmod\n", __func__); | 296 | pr_err("%s: unable to find hwmod\n", __func__); |
295 | return; | 297 | return; |
296 | } | 298 | } |
299 | if (!oh->dev_attr) { | ||
300 | pr_err("%s: hwmod doesn't have valid attrs\n", __func__); | ||
301 | return; | ||
302 | } | ||
297 | 303 | ||
298 | pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0); | 304 | pdata = (struct omap_mbox_pdata *)oh->dev_attr; |
305 | pdev = omap_device_build("omap-mailbox", -1, oh, pdata, sizeof(*pdata)); | ||
299 | WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n", | 306 | WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n", |
300 | __func__, PTR_ERR(pdev)); | 307 | __func__, PTR_ERR(pdev)); |
301 | } | 308 | } |
302 | #else | 309 | #else |
303 | static inline void omap_init_mbox(void) { } | 310 | static inline void omap_init_mbox(void) { } |
304 | #endif /* CONFIG_OMAP_MBOX_FWK */ | 311 | #endif /* CONFIG_OMAP2PLUS_MBOX */ |
305 | 312 | ||
306 | static inline void omap_init_sti(void) {} | 313 | static inline void omap_init_sti(void) {} |
307 | 314 | ||
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c index d9c27195caf0..662c7fd633cc 100644 --- a/arch/arm/mach-omap2/gpmc-nand.c +++ b/arch/arm/mach-omap2/gpmc-nand.c | |||
@@ -43,44 +43,6 @@ static struct platform_device gpmc_nand_device = { | |||
43 | .resource = gpmc_nand_resource, | 43 | .resource = gpmc_nand_resource, |
44 | }; | 44 | }; |
45 | 45 | ||
46 | static int omap2_nand_gpmc_retime( | ||
47 | struct omap_nand_platform_data *gpmc_nand_data, | ||
48 | struct gpmc_timings *gpmc_t) | ||
49 | { | ||
50 | struct gpmc_timings t; | ||
51 | int err; | ||
52 | |||
53 | memset(&t, 0, sizeof(t)); | ||
54 | t.sync_clk = gpmc_t->sync_clk; | ||
55 | t.cs_on = gpmc_t->cs_on; | ||
56 | t.adv_on = gpmc_t->adv_on; | ||
57 | |||
58 | /* Read */ | ||
59 | t.adv_rd_off = gpmc_t->adv_rd_off; | ||
60 | t.oe_on = t.adv_on; | ||
61 | t.access = gpmc_t->access; | ||
62 | t.oe_off = gpmc_t->oe_off; | ||
63 | t.cs_rd_off = gpmc_t->cs_rd_off; | ||
64 | t.rd_cycle = gpmc_t->rd_cycle; | ||
65 | |||
66 | /* Write */ | ||
67 | t.adv_wr_off = gpmc_t->adv_wr_off; | ||
68 | t.we_on = t.oe_on; | ||
69 | if (cpu_is_omap34xx()) { | ||
70 | t.wr_data_mux_bus = gpmc_t->wr_data_mux_bus; | ||
71 | t.wr_access = gpmc_t->wr_access; | ||
72 | } | ||
73 | t.we_off = gpmc_t->we_off; | ||
74 | t.cs_wr_off = gpmc_t->cs_wr_off; | ||
75 | t.wr_cycle = gpmc_t->wr_cycle; | ||
76 | |||
77 | err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t); | ||
78 | if (err) | ||
79 | return err; | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) | 46 | static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) |
85 | { | 47 | { |
86 | /* support only OMAP3 class */ | 48 | /* support only OMAP3 class */ |
@@ -131,7 +93,7 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, | |||
131 | gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT); | 93 | gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT); |
132 | 94 | ||
133 | if (gpmc_t) { | 95 | if (gpmc_t) { |
134 | err = omap2_nand_gpmc_retime(gpmc_nand_data, gpmc_t); | 96 | err = gpmc_cs_set_timings(gpmc_nand_data->cs, gpmc_t); |
135 | if (err < 0) { | 97 | if (err < 0) { |
136 | dev_err(dev, "Unable to set gpmc timings: %d\n", err); | 98 | dev_err(dev, "Unable to set gpmc timings: %d\n", err); |
137 | return err; | 99 | return err; |
@@ -140,8 +102,6 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, | |||
140 | if (gpmc_nand_data->of_node) { | 102 | if (gpmc_nand_data->of_node) { |
141 | gpmc_read_settings_dt(gpmc_nand_data->of_node, &s); | 103 | gpmc_read_settings_dt(gpmc_nand_data->of_node, &s); |
142 | } else { | 104 | } else { |
143 | s.device_nand = true; | ||
144 | |||
145 | /* Enable RD PIN Monitoring Reg */ | 105 | /* Enable RD PIN Monitoring Reg */ |
146 | if (gpmc_nand_data->dev_ready) { | 106 | if (gpmc_nand_data->dev_ready) { |
147 | s.wait_on_read = true; | 107 | s.wait_on_read = true; |
@@ -149,6 +109,8 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, | |||
149 | } | 109 | } |
150 | } | 110 | } |
151 | 111 | ||
112 | s.device_nand = true; | ||
113 | |||
152 | if (gpmc_nand_data->devsize == NAND_BUSWIDTH_16) | 114 | if (gpmc_nand_data->devsize == NAND_BUSWIDTH_16) |
153 | s.device_width = GPMC_DEVWIDTH_16BIT; | 115 | s.device_width = GPMC_DEVWIDTH_16BIT; |
154 | else | 116 | else |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 6c4da1254f53..1c7969e965d7 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/of_mtd.h> | 30 | #include <linux/of_mtd.h> |
31 | #include <linux/of_device.h> | 31 | #include <linux/of_device.h> |
32 | #include <linux/mtd/nand.h> | 32 | #include <linux/mtd/nand.h> |
33 | #include <linux/pm_runtime.h> | ||
33 | 34 | ||
34 | #include <linux/platform_data/mtd-nand-omap2.h> | 35 | #include <linux/platform_data/mtd-nand-omap2.h> |
35 | 36 | ||
@@ -155,6 +156,7 @@ static struct resource gpmc_cs_mem[GPMC_CS_NUM]; | |||
155 | static DEFINE_SPINLOCK(gpmc_mem_lock); | 156 | static DEFINE_SPINLOCK(gpmc_mem_lock); |
156 | /* Define chip-selects as reserved by default until probe completes */ | 157 | /* Define chip-selects as reserved by default until probe completes */ |
157 | static unsigned int gpmc_cs_map = ((1 << GPMC_CS_NUM) - 1); | 158 | static unsigned int gpmc_cs_map = ((1 << GPMC_CS_NUM) - 1); |
159 | static unsigned int gpmc_cs_num = GPMC_CS_NUM; | ||
158 | static unsigned int gpmc_nr_waitpins; | 160 | static unsigned int gpmc_nr_waitpins; |
159 | static struct device *gpmc_dev; | 161 | static struct device *gpmc_dev; |
160 | static int gpmc_irq; | 162 | static int gpmc_irq; |
@@ -521,8 +523,10 @@ static int gpmc_cs_remap(int cs, u32 base) | |||
521 | int ret; | 523 | int ret; |
522 | u32 old_base, size; | 524 | u32 old_base, size; |
523 | 525 | ||
524 | if (cs > GPMC_CS_NUM) | 526 | if (cs > gpmc_cs_num) { |
527 | pr_err("%s: requested chip-select is disabled\n", __func__); | ||
525 | return -ENODEV; | 528 | return -ENODEV; |
529 | } | ||
526 | gpmc_cs_get_memconf(cs, &old_base, &size); | 530 | gpmc_cs_get_memconf(cs, &old_base, &size); |
527 | if (base == old_base) | 531 | if (base == old_base) |
528 | return 0; | 532 | return 0; |
@@ -545,9 +549,10 @@ int gpmc_cs_request(int cs, unsigned long size, unsigned long *base) | |||
545 | struct resource *res = &gpmc_cs_mem[cs]; | 549 | struct resource *res = &gpmc_cs_mem[cs]; |
546 | int r = -1; | 550 | int r = -1; |
547 | 551 | ||
548 | if (cs > GPMC_CS_NUM) | 552 | if (cs > gpmc_cs_num) { |
553 | pr_err("%s: requested chip-select is disabled\n", __func__); | ||
549 | return -ENODEV; | 554 | return -ENODEV; |
550 | 555 | } | |
551 | size = gpmc_mem_align(size); | 556 | size = gpmc_mem_align(size); |
552 | if (size > (1 << GPMC_SECTION_SHIFT)) | 557 | if (size > (1 << GPMC_SECTION_SHIFT)) |
553 | return -ENOMEM; | 558 | return -ENOMEM; |
@@ -582,7 +587,7 @@ EXPORT_SYMBOL(gpmc_cs_request); | |||
582 | void gpmc_cs_free(int cs) | 587 | void gpmc_cs_free(int cs) |
583 | { | 588 | { |
584 | spin_lock(&gpmc_mem_lock); | 589 | spin_lock(&gpmc_mem_lock); |
585 | if (cs >= GPMC_CS_NUM || cs < 0 || !gpmc_cs_reserved(cs)) { | 590 | if (cs >= gpmc_cs_num || cs < 0 || !gpmc_cs_reserved(cs)) { |
586 | printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); | 591 | printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); |
587 | BUG(); | 592 | BUG(); |
588 | spin_unlock(&gpmc_mem_lock); | 593 | spin_unlock(&gpmc_mem_lock); |
@@ -777,7 +782,7 @@ static void gpmc_mem_exit(void) | |||
777 | { | 782 | { |
778 | int cs; | 783 | int cs; |
779 | 784 | ||
780 | for (cs = 0; cs < GPMC_CS_NUM; cs++) { | 785 | for (cs = 0; cs < gpmc_cs_num; cs++) { |
781 | if (!gpmc_cs_mem_enabled(cs)) | 786 | if (!gpmc_cs_mem_enabled(cs)) |
782 | continue; | 787 | continue; |
783 | gpmc_cs_delete_mem(cs); | 788 | gpmc_cs_delete_mem(cs); |
@@ -798,7 +803,7 @@ static void gpmc_mem_init(void) | |||
798 | gpmc_mem_root.end = GPMC_MEM_END; | 803 | gpmc_mem_root.end = GPMC_MEM_END; |
799 | 804 | ||
800 | /* Reserve all regions that has been set up by bootloader */ | 805 | /* Reserve all regions that has been set up by bootloader */ |
801 | for (cs = 0; cs < GPMC_CS_NUM; cs++) { | 806 | for (cs = 0; cs < gpmc_cs_num; cs++) { |
802 | u32 base, size; | 807 | u32 base, size; |
803 | 808 | ||
804 | if (!gpmc_cs_mem_enabled(cs)) | 809 | if (!gpmc_cs_mem_enabled(cs)) |
@@ -1245,7 +1250,6 @@ void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p) | |||
1245 | 1250 | ||
1246 | p->sync_read = of_property_read_bool(np, "gpmc,sync-read"); | 1251 | p->sync_read = of_property_read_bool(np, "gpmc,sync-read"); |
1247 | p->sync_write = of_property_read_bool(np, "gpmc,sync-write"); | 1252 | p->sync_write = of_property_read_bool(np, "gpmc,sync-write"); |
1248 | p->device_nand = of_property_read_bool(np, "gpmc,device-nand"); | ||
1249 | of_property_read_u32(np, "gpmc,device-width", &p->device_width); | 1253 | of_property_read_u32(np, "gpmc,device-width", &p->device_width); |
1250 | of_property_read_u32(np, "gpmc,mux-add-data", &p->mux_add_data); | 1254 | of_property_read_u32(np, "gpmc,mux-add-data", &p->mux_add_data); |
1251 | 1255 | ||
@@ -1345,6 +1349,13 @@ static const char * const nand_ecc_opts[] = { | |||
1345 | [OMAP_ECC_BCH8_CODE_HW] = "bch8", | 1349 | [OMAP_ECC_BCH8_CODE_HW] = "bch8", |
1346 | }; | 1350 | }; |
1347 | 1351 | ||
1352 | static const char * const nand_xfer_types[] = { | ||
1353 | [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled", | ||
1354 | [NAND_OMAP_POLLED] = "polled", | ||
1355 | [NAND_OMAP_PREFETCH_DMA] = "prefetch-dma", | ||
1356 | [NAND_OMAP_PREFETCH_IRQ] = "prefetch-irq", | ||
1357 | }; | ||
1358 | |||
1348 | static int gpmc_probe_nand_child(struct platform_device *pdev, | 1359 | static int gpmc_probe_nand_child(struct platform_device *pdev, |
1349 | struct device_node *child) | 1360 | struct device_node *child) |
1350 | { | 1361 | { |
@@ -1374,6 +1385,13 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, | |||
1374 | break; | 1385 | break; |
1375 | } | 1386 | } |
1376 | 1387 | ||
1388 | if (!of_property_read_string(child, "ti,nand-xfer-type", &s)) | ||
1389 | for (val = 0; val < ARRAY_SIZE(nand_xfer_types); val++) | ||
1390 | if (!strcasecmp(s, nand_xfer_types[val])) { | ||
1391 | gpmc_nand_data->xfer_type = val; | ||
1392 | break; | ||
1393 | } | ||
1394 | |||
1377 | val = of_get_nand_bus_width(child); | 1395 | val = of_get_nand_bus_width(child); |
1378 | if (val == 16) | 1396 | if (val == 16) |
1379 | gpmc_nand_data->devsize = NAND_BUSWIDTH_16; | 1397 | gpmc_nand_data->devsize = NAND_BUSWIDTH_16; |
@@ -1513,6 +1531,20 @@ static int gpmc_probe_dt(struct platform_device *pdev) | |||
1513 | if (!of_id) | 1531 | if (!of_id) |
1514 | return 0; | 1532 | return 0; |
1515 | 1533 | ||
1534 | ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-cs", | ||
1535 | &gpmc_cs_num); | ||
1536 | if (ret < 0) { | ||
1537 | pr_err("%s: number of chip-selects not defined\n", __func__); | ||
1538 | return ret; | ||
1539 | } else if (gpmc_cs_num < 1) { | ||
1540 | pr_err("%s: all chip-selects are disabled\n", __func__); | ||
1541 | return -EINVAL; | ||
1542 | } else if (gpmc_cs_num > GPMC_CS_NUM) { | ||
1543 | pr_err("%s: number of supported chip-selects cannot be > %d\n", | ||
1544 | __func__, GPMC_CS_NUM); | ||
1545 | return -EINVAL; | ||
1546 | } | ||
1547 | |||
1516 | ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-waitpins", | 1548 | ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-waitpins", |
1517 | &gpmc_nr_waitpins); | 1549 | &gpmc_nr_waitpins); |
1518 | if (ret < 0) { | 1550 | if (ret < 0) { |
@@ -1577,7 +1609,8 @@ static int gpmc_probe(struct platform_device *pdev) | |||
1577 | return PTR_ERR(gpmc_l3_clk); | 1609 | return PTR_ERR(gpmc_l3_clk); |
1578 | } | 1610 | } |
1579 | 1611 | ||
1580 | clk_prepare_enable(gpmc_l3_clk); | 1612 | pm_runtime_enable(&pdev->dev); |
1613 | pm_runtime_get_sync(&pdev->dev); | ||
1581 | 1614 | ||
1582 | gpmc_dev = &pdev->dev; | 1615 | gpmc_dev = &pdev->dev; |
1583 | 1616 | ||
@@ -1610,12 +1643,14 @@ static int gpmc_probe(struct platform_device *pdev) | |||
1610 | /* Now the GPMC is initialised, unreserve the chip-selects */ | 1643 | /* Now the GPMC is initialised, unreserve the chip-selects */ |
1611 | gpmc_cs_map = 0; | 1644 | gpmc_cs_map = 0; |
1612 | 1645 | ||
1613 | if (!pdev->dev.of_node) | 1646 | if (!pdev->dev.of_node) { |
1647 | gpmc_cs_num = GPMC_CS_NUM; | ||
1614 | gpmc_nr_waitpins = GPMC_NR_WAITPINS; | 1648 | gpmc_nr_waitpins = GPMC_NR_WAITPINS; |
1649 | } | ||
1615 | 1650 | ||
1616 | rc = gpmc_probe_dt(pdev); | 1651 | rc = gpmc_probe_dt(pdev); |
1617 | if (rc < 0) { | 1652 | if (rc < 0) { |
1618 | clk_disable_unprepare(gpmc_l3_clk); | 1653 | pm_runtime_put_sync(&pdev->dev); |
1619 | clk_put(gpmc_l3_clk); | 1654 | clk_put(gpmc_l3_clk); |
1620 | dev_err(gpmc_dev, "failed to probe DT parameters\n"); | 1655 | dev_err(gpmc_dev, "failed to probe DT parameters\n"); |
1621 | return rc; | 1656 | return rc; |
@@ -1628,10 +1663,30 @@ static int gpmc_remove(struct platform_device *pdev) | |||
1628 | { | 1663 | { |
1629 | gpmc_free_irq(); | 1664 | gpmc_free_irq(); |
1630 | gpmc_mem_exit(); | 1665 | gpmc_mem_exit(); |
1666 | pm_runtime_put_sync(&pdev->dev); | ||
1667 | pm_runtime_disable(&pdev->dev); | ||
1631 | gpmc_dev = NULL; | 1668 | gpmc_dev = NULL; |
1632 | return 0; | 1669 | return 0; |
1633 | } | 1670 | } |
1634 | 1671 | ||
1672 | #ifdef CONFIG_PM_SLEEP | ||
1673 | static int gpmc_suspend(struct device *dev) | ||
1674 | { | ||
1675 | omap3_gpmc_save_context(); | ||
1676 | pm_runtime_put_sync(dev); | ||
1677 | return 0; | ||
1678 | } | ||
1679 | |||
1680 | static int gpmc_resume(struct device *dev) | ||
1681 | { | ||
1682 | pm_runtime_get_sync(dev); | ||
1683 | omap3_gpmc_restore_context(); | ||
1684 | return 0; | ||
1685 | } | ||
1686 | #endif | ||
1687 | |||
1688 | static SIMPLE_DEV_PM_OPS(gpmc_pm_ops, gpmc_suspend, gpmc_resume); | ||
1689 | |||
1635 | static struct platform_driver gpmc_driver = { | 1690 | static struct platform_driver gpmc_driver = { |
1636 | .probe = gpmc_probe, | 1691 | .probe = gpmc_probe, |
1637 | .remove = gpmc_remove, | 1692 | .remove = gpmc_remove, |
@@ -1639,6 +1694,7 @@ static struct platform_driver gpmc_driver = { | |||
1639 | .name = DEVICE_NAME, | 1694 | .name = DEVICE_NAME, |
1640 | .owner = THIS_MODULE, | 1695 | .owner = THIS_MODULE, |
1641 | .of_match_table = of_match_ptr(gpmc_dt_ids), | 1696 | .of_match_table = of_match_ptr(gpmc_dt_ids), |
1697 | .pm = &gpmc_pm_ops, | ||
1642 | }, | 1698 | }, |
1643 | }; | 1699 | }; |
1644 | 1700 | ||
@@ -1701,7 +1757,6 @@ static irqreturn_t gpmc_handle_irq(int irq, void *dev) | |||
1701 | return IRQ_HANDLED; | 1757 | return IRQ_HANDLED; |
1702 | } | 1758 | } |
1703 | 1759 | ||
1704 | #ifdef CONFIG_ARCH_OMAP3 | ||
1705 | static struct omap3_gpmc_regs gpmc_context; | 1760 | static struct omap3_gpmc_regs gpmc_context; |
1706 | 1761 | ||
1707 | void omap3_gpmc_save_context(void) | 1762 | void omap3_gpmc_save_context(void) |
@@ -1715,7 +1770,7 @@ void omap3_gpmc_save_context(void) | |||
1715 | gpmc_context.prefetch_config1 = gpmc_read_reg(GPMC_PREFETCH_CONFIG1); | 1770 | gpmc_context.prefetch_config1 = gpmc_read_reg(GPMC_PREFETCH_CONFIG1); |
1716 | gpmc_context.prefetch_config2 = gpmc_read_reg(GPMC_PREFETCH_CONFIG2); | 1771 | gpmc_context.prefetch_config2 = gpmc_read_reg(GPMC_PREFETCH_CONFIG2); |
1717 | gpmc_context.prefetch_control = gpmc_read_reg(GPMC_PREFETCH_CONTROL); | 1772 | gpmc_context.prefetch_control = gpmc_read_reg(GPMC_PREFETCH_CONTROL); |
1718 | for (i = 0; i < GPMC_CS_NUM; i++) { | 1773 | for (i = 0; i < gpmc_cs_num; i++) { |
1719 | gpmc_context.cs_context[i].is_valid = gpmc_cs_mem_enabled(i); | 1774 | gpmc_context.cs_context[i].is_valid = gpmc_cs_mem_enabled(i); |
1720 | if (gpmc_context.cs_context[i].is_valid) { | 1775 | if (gpmc_context.cs_context[i].is_valid) { |
1721 | gpmc_context.cs_context[i].config1 = | 1776 | gpmc_context.cs_context[i].config1 = |
@@ -1747,7 +1802,7 @@ void omap3_gpmc_restore_context(void) | |||
1747 | gpmc_write_reg(GPMC_PREFETCH_CONFIG1, gpmc_context.prefetch_config1); | 1802 | gpmc_write_reg(GPMC_PREFETCH_CONFIG1, gpmc_context.prefetch_config1); |
1748 | gpmc_write_reg(GPMC_PREFETCH_CONFIG2, gpmc_context.prefetch_config2); | 1803 | gpmc_write_reg(GPMC_PREFETCH_CONFIG2, gpmc_context.prefetch_config2); |
1749 | gpmc_write_reg(GPMC_PREFETCH_CONTROL, gpmc_context.prefetch_control); | 1804 | gpmc_write_reg(GPMC_PREFETCH_CONTROL, gpmc_context.prefetch_control); |
1750 | for (i = 0; i < GPMC_CS_NUM; i++) { | 1805 | for (i = 0; i < gpmc_cs_num; i++) { |
1751 | if (gpmc_context.cs_context[i].is_valid) { | 1806 | if (gpmc_context.cs_context[i].is_valid) { |
1752 | gpmc_cs_write_reg(i, GPMC_CS_CONFIG1, | 1807 | gpmc_cs_write_reg(i, GPMC_CS_CONFIG1, |
1753 | gpmc_context.cs_context[i].config1); | 1808 | gpmc_context.cs_context[i].config1); |
@@ -1766,4 +1821,3 @@ void omap3_gpmc_restore_context(void) | |||
1766 | } | 1821 | } |
1767 | } | 1822 | } |
1768 | } | 1823 | } |
1769 | #endif /* CONFIG_ARCH_OMAP3 */ | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index 5137cc84b504..d8b9d60f854f 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/i2c-omap.h> | 16 | #include <linux/i2c-omap.h> |
17 | #include <linux/platform_data/spi-omap2-mcspi.h> | 17 | #include <linux/platform_data/spi-omap2-mcspi.h> |
18 | #include <linux/omap-dma.h> | 18 | #include <linux/omap-dma.h> |
19 | #include <linux/platform_data/mailbox-omap.h> | ||
19 | #include <plat/dmtimer.h> | 20 | #include <plat/dmtimer.h> |
20 | 21 | ||
21 | #include "omap_hwmod.h" | 22 | #include "omap_hwmod.h" |
@@ -166,6 +167,18 @@ static struct omap_hwmod omap2420_dma_system_hwmod = { | |||
166 | }; | 167 | }; |
167 | 168 | ||
168 | /* mailbox */ | 169 | /* mailbox */ |
170 | static struct omap_mbox_dev_info omap2420_mailbox_info[] = { | ||
171 | { .name = "dsp", .tx_id = 0, .rx_id = 1, .irq_id = 0, .usr_id = 0 }, | ||
172 | { .name = "iva", .tx_id = 2, .rx_id = 3, .irq_id = 1, .usr_id = 3 }, | ||
173 | }; | ||
174 | |||
175 | static struct omap_mbox_pdata omap2420_mailbox_attrs = { | ||
176 | .num_users = 4, | ||
177 | .num_fifos = 6, | ||
178 | .info_cnt = ARRAY_SIZE(omap2420_mailbox_info), | ||
179 | .info = omap2420_mailbox_info, | ||
180 | }; | ||
181 | |||
169 | static struct omap_hwmod_irq_info omap2420_mailbox_irqs[] = { | 182 | static struct omap_hwmod_irq_info omap2420_mailbox_irqs[] = { |
170 | { .name = "dsp", .irq = 26 + OMAP_INTC_START, }, | 183 | { .name = "dsp", .irq = 26 + OMAP_INTC_START, }, |
171 | { .name = "iva", .irq = 34 + OMAP_INTC_START, }, | 184 | { .name = "iva", .irq = 34 + OMAP_INTC_START, }, |
@@ -186,6 +199,7 @@ static struct omap_hwmod omap2420_mailbox_hwmod = { | |||
186 | .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT, | 199 | .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT, |
187 | }, | 200 | }, |
188 | }, | 201 | }, |
202 | .dev_attr = &omap2420_mailbox_attrs, | ||
189 | }; | 203 | }; |
190 | 204 | ||
191 | /* | 205 | /* |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c index 4ce999ee3ee9..5b9083461dc5 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 17 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
18 | #include <linux/platform_data/spi-omap2-mcspi.h> | 18 | #include <linux/platform_data/spi-omap2-mcspi.h> |
19 | #include <linux/omap-dma.h> | 19 | #include <linux/omap-dma.h> |
20 | #include <linux/platform_data/mailbox-omap.h> | ||
20 | #include <plat/dmtimer.h> | 21 | #include <plat/dmtimer.h> |
21 | 22 | ||
22 | #include "omap_hwmod.h" | 23 | #include "omap_hwmod.h" |
@@ -170,6 +171,17 @@ static struct omap_hwmod omap2430_dma_system_hwmod = { | |||
170 | }; | 171 | }; |
171 | 172 | ||
172 | /* mailbox */ | 173 | /* mailbox */ |
174 | static struct omap_mbox_dev_info omap2430_mailbox_info[] = { | ||
175 | { .name = "dsp", .tx_id = 0, .rx_id = 1 }, | ||
176 | }; | ||
177 | |||
178 | static struct omap_mbox_pdata omap2430_mailbox_attrs = { | ||
179 | .num_users = 4, | ||
180 | .num_fifos = 6, | ||
181 | .info_cnt = ARRAY_SIZE(omap2430_mailbox_info), | ||
182 | .info = omap2430_mailbox_info, | ||
183 | }; | ||
184 | |||
173 | static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = { | 185 | static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = { |
174 | { .irq = 26 + OMAP_INTC_START, }, | 186 | { .irq = 26 + OMAP_INTC_START, }, |
175 | { .irq = -1 }, | 187 | { .irq = -1 }, |
@@ -189,6 +201,7 @@ static struct omap_hwmod omap2430_mailbox_hwmod = { | |||
189 | .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT, | 201 | .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT, |
190 | }, | 202 | }, |
191 | }, | 203 | }, |
204 | .dev_attr = &omap2430_mailbox_attrs, | ||
192 | }; | 205 | }; |
193 | 206 | ||
194 | /* mcspi3 */ | 207 | /* mcspi3 */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index fa9915411440..f7a3df2fb579 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 25 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
26 | #include <linux/platform_data/spi-omap2-mcspi.h> | 26 | #include <linux/platform_data/spi-omap2-mcspi.h> |
27 | #include <linux/platform_data/iommu-omap.h> | 27 | #include <linux/platform_data/iommu-omap.h> |
28 | #include <linux/platform_data/mailbox-omap.h> | ||
28 | #include <plat/dmtimer.h> | 29 | #include <plat/dmtimer.h> |
29 | 30 | ||
30 | #include "am35xx.h" | 31 | #include "am35xx.h" |
@@ -1504,6 +1505,17 @@ static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = { | |||
1504 | .sysc = &omap3xxx_mailbox_sysc, | 1505 | .sysc = &omap3xxx_mailbox_sysc, |
1505 | }; | 1506 | }; |
1506 | 1507 | ||
1508 | static struct omap_mbox_dev_info omap3xxx_mailbox_info[] = { | ||
1509 | { .name = "dsp", .tx_id = 0, .rx_id = 1 }, | ||
1510 | }; | ||
1511 | |||
1512 | static struct omap_mbox_pdata omap3xxx_mailbox_attrs = { | ||
1513 | .num_users = 2, | ||
1514 | .num_fifos = 2, | ||
1515 | .info_cnt = ARRAY_SIZE(omap3xxx_mailbox_info), | ||
1516 | .info = omap3xxx_mailbox_info, | ||
1517 | }; | ||
1518 | |||
1507 | static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = { | 1519 | static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = { |
1508 | { .irq = 26 + OMAP_INTC_START, }, | 1520 | { .irq = 26 + OMAP_INTC_START, }, |
1509 | { .irq = -1 }, | 1521 | { .irq = -1 }, |
@@ -1523,6 +1535,7 @@ static struct omap_hwmod omap3xxx_mailbox_hwmod = { | |||
1523 | .idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT, | 1535 | .idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT, |
1524 | }, | 1536 | }, |
1525 | }, | 1537 | }, |
1538 | .dev_attr = &omap3xxx_mailbox_attrs, | ||
1526 | }; | 1539 | }; |
1527 | 1540 | ||
1528 | /* | 1541 | /* |
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig index 0adb2b85f830..6d9252e081ce 100644 --- a/arch/arm/mach-s3c24xx/Kconfig +++ b/arch/arm/mach-s3c24xx/Kconfig | |||
@@ -28,7 +28,7 @@ config CPU_S3C2410 | |||
28 | select CPU_ARM920T | 28 | select CPU_ARM920T |
29 | select CPU_LLSERIAL_S3C2410 | 29 | select CPU_LLSERIAL_S3C2410 |
30 | select S3C2410_CLOCK | 30 | select S3C2410_CLOCK |
31 | select S3C2410_CPUFREQ if CPU_FREQ_S3C24XX | 31 | select ARM_S3C2410_CPUFREQ if ARM_S3C24XX_CPUFREQ |
32 | select S3C2410_PM if PM | 32 | select S3C2410_PM if PM |
33 | select SAMSUNG_HRT | 33 | select SAMSUNG_HRT |
34 | select SAMSUNG_WDT_RESET | 34 | select SAMSUNG_WDT_RESET |
@@ -206,27 +206,38 @@ config S3C24XX_GPIO_EXTRA128 | |||
206 | Add an extra 128 gpio numbers to the available GPIO pool. This is | 206 | Add an extra 128 gpio numbers to the available GPIO pool. This is |
207 | available for boards that need extra gpios for external devices. | 207 | available for boards that need extra gpios for external devices. |
208 | 208 | ||
209 | config S3C24XX_PLL | ||
210 | bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)" | ||
211 | depends on ARM_S3C24XX | ||
212 | help | ||
213 | Compile in support for changing the PLL frequency from the | ||
214 | S3C24XX series CPUfreq driver. The PLL takes time to settle | ||
215 | after a frequency change, so by default it is not enabled. | ||
216 | |||
217 | This also means that the PLL tables for the selected CPU(s) will | ||
218 | be built which may increase the size of the kernel image. | ||
219 | |||
209 | # cpu frequency items common between s3c2410 and s3c2440/s3c2442 | 220 | # cpu frequency items common between s3c2410 and s3c2440/s3c2442 |
210 | 221 | ||
211 | config S3C2410_IOTIMING | 222 | config S3C2410_IOTIMING |
212 | bool | 223 | bool |
213 | depends on CPU_FREQ_S3C24XX | 224 | depends on ARM_S3C24XX_CPUFREQ |
214 | help | 225 | help |
215 | Internal node to select io timing code that is common to the s3c2410 | 226 | Internal node to select io timing code that is common to the s3c2410 |
216 | and s3c2440/s3c2442 cpu frequency support. | 227 | and s3c2440/s3c2442 cpu frequency support. |
217 | 228 | ||
218 | config S3C2410_CPUFREQ_UTILS | 229 | config S3C2410_CPUFREQ_UTILS |
219 | bool | 230 | bool |
220 | depends on CPU_FREQ_S3C24XX | 231 | depends on ARM_S3C24XX_CPUFREQ |
221 | help | 232 | help |
222 | Internal node to select timing code that is common to the s3c2410 | 233 | Internal node to select timing code that is common to the s3c2410 |
223 | and s3c2440/s3c244 cpu frequency support. | 234 | and s3c2440/s3c244 cpu frequency support. |
224 | 235 | ||
225 | # cpu frequency support common to s3c2412, s3c2413 and s3c2442 | 236 | # cpu frequency support common to s3c2412, s3c2413 and s3c2442 |
226 | 237 | ||
227 | config S3C2412_IOTIMING | 238 | config S3C2412_IOTIMING |
228 | bool | 239 | bool |
229 | depends on CPU_FREQ_S3C24XX && (CPU_S3C2412 || CPU_S3C2443) | 240 | depends on ARM_S3C24XX_CPUFREQ && (CPU_S3C2412 || CPU_S3C2443) |
230 | help | 241 | help |
231 | Intel node to select io timing code that is common to the s3c2412 | 242 | Intel node to select io timing code that is common to the s3c2412 |
232 | and the s3c2443. | 243 | and the s3c2443. |
@@ -235,16 +246,9 @@ config S3C2412_IOTIMING | |||
235 | 246 | ||
236 | if CPU_S3C2410 | 247 | if CPU_S3C2410 |
237 | 248 | ||
238 | config S3C2410_CPUFREQ | ||
239 | bool | ||
240 | depends on CPU_FREQ_S3C24XX | ||
241 | select S3C2410_CPUFREQ_UTILS | ||
242 | help | ||
243 | CPU Frequency scaling support for S3C2410 | ||
244 | |||
245 | config S3C2410_PLL | 249 | config S3C2410_PLL |
246 | bool | 250 | bool |
247 | depends on S3C2410_CPUFREQ && CPU_FREQ_S3C24XX_PLL | 251 | depends on ARM_S3C2410_CPUFREQ && S3C24XX_PLL |
248 | default y | 252 | default y |
249 | help | 253 | help |
250 | Select the PLL table for the S3C2410 | 254 | Select the PLL table for the S3C2410 |
@@ -280,7 +284,7 @@ config ARCH_BAST | |||
280 | bool "Simtec Electronics BAST (EB2410ITX)" | 284 | bool "Simtec Electronics BAST (EB2410ITX)" |
281 | select ISA | 285 | select ISA |
282 | select MACH_BAST_IDE | 286 | select MACH_BAST_IDE |
283 | select S3C2410_IOTIMING if S3C2410_CPUFREQ | 287 | select S3C2410_IOTIMING if ARM_S3C2410_CPUFREQ |
284 | select S3C24XX_DCLK | 288 | select S3C24XX_DCLK |
285 | select S3C24XX_SIMTEC_NOR | 289 | select S3C24XX_SIMTEC_NOR |
286 | select S3C24XX_SIMTEC_PM if PM | 290 | select S3C24XX_SIMTEC_PM if PM |
@@ -387,14 +391,6 @@ config CPU_S3C2412_ONLY | |||
387 | !CPU_S3C2442 && !CPU_S3C2443 | 391 | !CPU_S3C2442 && !CPU_S3C2443 |
388 | default y | 392 | default y |
389 | 393 | ||
390 | config S3C2412_CPUFREQ | ||
391 | bool | ||
392 | depends on CPU_FREQ_S3C24XX | ||
393 | default y | ||
394 | select S3C2412_IOTIMING | ||
395 | help | ||
396 | CPU Frequency scaling support for S3C2412 and S3C2413 SoC CPUs. | ||
397 | |||
398 | config S3C2412_DMA | 394 | config S3C2412_DMA |
399 | bool | 395 | bool |
400 | help | 396 | help |
@@ -508,14 +504,6 @@ endif # CPU_S3C2416 | |||
508 | 504 | ||
509 | if CPU_S3C2440 | 505 | if CPU_S3C2440 |
510 | 506 | ||
511 | config S3C2440_CPUFREQ | ||
512 | bool "S3C2440/S3C2442 CPU Frequency scaling support" | ||
513 | depends on CPU_FREQ_S3C24XX && (CPU_S3C2440 || CPU_S3C2442) | ||
514 | default y | ||
515 | select S3C2410_CPUFREQ_UTILS | ||
516 | help | ||
517 | CPU Frequency scaling support for S3C2440 and S3C2442 SoC CPUs. | ||
518 | |||
519 | config S3C2440_DMA | 507 | config S3C2440_DMA |
520 | bool | 508 | bool |
521 | help | 509 | help |
@@ -535,15 +523,15 @@ config S3C2440_XTAL_16934400 | |||
535 | 523 | ||
536 | config S3C2440_PLL_12000000 | 524 | config S3C2440_PLL_12000000 |
537 | bool | 525 | bool |
538 | depends on S3C2440_CPUFREQ && S3C2440_XTAL_12000000 | 526 | depends on ARM_S3C2440_CPUFREQ && S3C2440_XTAL_12000000 |
539 | default y if CPU_FREQ_S3C24XX_PLL | 527 | default y if S3C24XX_PLL |
540 | help | 528 | help |
541 | PLL tables for S3C2440 or S3C2442 CPUs with 12MHz crystals. | 529 | PLL tables for S3C2440 or S3C2442 CPUs with 12MHz crystals. |
542 | 530 | ||
543 | config S3C2440_PLL_16934400 | 531 | config S3C2440_PLL_16934400 |
544 | bool | 532 | bool |
545 | depends on S3C2440_CPUFREQ && S3C2440_XTAL_16934400 | 533 | depends on ARM_S3C2440_CPUFREQ && S3C2440_XTAL_16934400 |
546 | default y if CPU_FREQ_S3C24XX_PLL | 534 | default y if S3C24XX_PLL |
547 | help | 535 | help |
548 | PLL tables for S3C2440 or S3C2442 CPUs with 16.934MHz crystals. | 536 | PLL tables for S3C2440 or S3C2442 CPUs with 16.934MHz crystals. |
549 | 537 | ||
@@ -597,7 +585,7 @@ config MACH_NEXCODER_2440 | |||
597 | 585 | ||
598 | config MACH_OSIRIS | 586 | config MACH_OSIRIS |
599 | bool "Simtec IM2440D20 (OSIRIS) module" | 587 | bool "Simtec IM2440D20 (OSIRIS) module" |
600 | select S3C2410_IOTIMING if S3C2440_CPUFREQ | 588 | select S3C2410_IOTIMING if ARM_S3C2440_CPUFREQ |
601 | select S3C2440_XTAL_12000000 | 589 | select S3C2440_XTAL_12000000 |
602 | select S3C24XX_DCLK | 590 | select S3C24XX_DCLK |
603 | select S3C24XX_GPIO_EXTRA128 | 591 | select S3C24XX_GPIO_EXTRA128 |
@@ -669,7 +657,7 @@ config MACH_RX1950 | |||
669 | bool "HP iPAQ rx1950" | 657 | bool "HP iPAQ rx1950" |
670 | select I2C | 658 | select I2C |
671 | select PM_H1940 if PM | 659 | select PM_H1940 if PM |
672 | select S3C2410_IOTIMING if S3C2440_CPUFREQ | 660 | select S3C2410_IOTIMING if ARM_S3C2440_CPUFREQ |
673 | select S3C2440_XTAL_16934400 | 661 | select S3C2440_XTAL_16934400 |
674 | select S3C24XX_DCLK | 662 | select S3C24XX_DCLK |
675 | select S3C24XX_PWM | 663 | select S3C24XX_PWM |
diff --git a/arch/arm/mach-s3c24xx/Makefile b/arch/arm/mach-s3c24xx/Makefile index 6de730bada4d..7f54e5b954ca 100644 --- a/arch/arm/mach-s3c24xx/Makefile +++ b/arch/arm/mach-s3c24xx/Makefile | |||
@@ -17,13 +17,11 @@ obj- := | |||
17 | obj-y += common.o | 17 | obj-y += common.o |
18 | 18 | ||
19 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o | 19 | obj-$(CONFIG_CPU_S3C2410) += s3c2410.o |
20 | obj-$(CONFIG_S3C2410_CPUFREQ) += cpufreq-s3c2410.o | ||
21 | obj-$(CONFIG_S3C2410_DMA) += dma-s3c2410.o | 20 | obj-$(CONFIG_S3C2410_DMA) += dma-s3c2410.o |
22 | obj-$(CONFIG_S3C2410_PLL) += pll-s3c2410.o | 21 | obj-$(CONFIG_S3C2410_PLL) += pll-s3c2410.o |
23 | obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o | 22 | obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o |
24 | 23 | ||
25 | obj-$(CONFIG_CPU_S3C2412) += s3c2412.o clock-s3c2412.o | 24 | obj-$(CONFIG_CPU_S3C2412) += s3c2412.o clock-s3c2412.o |
26 | obj-$(CONFIG_S3C2412_CPUFREQ) += cpufreq-s3c2412.o | ||
27 | obj-$(CONFIG_S3C2412_DMA) += dma-s3c2412.o | 25 | obj-$(CONFIG_S3C2412_DMA) += dma-s3c2412.o |
28 | obj-$(CONFIG_S3C2412_PM) += pm-s3c2412.o | 26 | obj-$(CONFIG_S3C2412_PM) += pm-s3c2412.o |
29 | obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep-s3c2412.o | 27 | obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep-s3c2412.o |
@@ -34,7 +32,6 @@ obj-$(CONFIG_S3C2416_PM) += pm-s3c2416.o | |||
34 | obj-$(CONFIG_CPU_S3C2440) += s3c2440.o clock-s3c2440.o | 32 | obj-$(CONFIG_CPU_S3C2440) += s3c2440.o clock-s3c2440.o |
35 | obj-$(CONFIG_CPU_S3C2442) += s3c2442.o | 33 | obj-$(CONFIG_CPU_S3C2442) += s3c2442.o |
36 | obj-$(CONFIG_CPU_S3C244X) += s3c244x.o clock-s3c244x.o | 34 | obj-$(CONFIG_CPU_S3C244X) += s3c244x.o clock-s3c244x.o |
37 | obj-$(CONFIG_S3C2440_CPUFREQ) += cpufreq-s3c2440.o | ||
38 | obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o | 35 | obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o |
39 | obj-$(CONFIG_S3C2440_PLL_12000000) += pll-s3c2440-12000000.o | 36 | obj-$(CONFIG_S3C2440_PLL_12000000) += pll-s3c2440-12000000.o |
40 | obj-$(CONFIG_S3C2440_PLL_16934400) += pll-s3c2440-16934400.o | 37 | obj-$(CONFIG_S3C2440_PLL_16934400) += pll-s3c2440-16934400.o |
@@ -59,9 +56,6 @@ obj-$(CONFIG_S3C2412_IOTIMING) += iotiming-s3c2412.o | |||
59 | obj-$(CONFIG_S3C2443_COMMON) += common-s3c2443.o | 56 | obj-$(CONFIG_S3C2443_COMMON) += common-s3c2443.o |
60 | obj-$(CONFIG_S3C2443_DMA) += dma-s3c2443.o | 57 | obj-$(CONFIG_S3C2443_DMA) += dma-s3c2443.o |
61 | 58 | ||
62 | obj-$(CONFIG_CPU_FREQ_S3C24XX) += cpufreq.o | ||
63 | obj-$(CONFIG_CPU_FREQ_S3C24XX_DEBUGFS) += cpufreq-debugfs.o | ||
64 | |||
65 | # | 59 | # |
66 | # machine support | 60 | # machine support |
67 | # following is ordered alphabetically by option text. | 61 | # following is ordered alphabetically by option text. |
diff --git a/arch/arm/mach-s3c24xx/s3c2412.h b/arch/arm/mach-s3c24xx/include/mach/s3c2412.h index 548ced42cbb7..548ced42cbb7 100644 --- a/arch/arm/mach-s3c24xx/s3c2412.h +++ b/arch/arm/mach-s3c24xx/include/mach/s3c2412.h | |||
diff --git a/arch/arm/mach-s3c24xx/iotiming-s3c2412.c b/arch/arm/mach-s3c24xx/iotiming-s3c2412.c index 663436d9db01..bd064c05c473 100644 --- a/arch/arm/mach-s3c24xx/iotiming-s3c2412.c +++ b/arch/arm/mach-s3c24xx/iotiming-s3c2412.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <plat/cpu-freq-core.h> | 31 | #include <plat/cpu-freq-core.h> |
32 | #include <plat/clock.h> | 32 | #include <plat/clock.h> |
33 | 33 | ||
34 | #include "s3c2412.h" | 34 | #include <mach/s3c2412.h> |
35 | 35 | ||
36 | #define print_ns(x) ((x) / 10), ((x) % 10) | 36 | #define print_ns(x) ((x) / 10), ((x) % 10) |
37 | 37 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c index aba9e5692958..bfe443daf4b0 100644 --- a/arch/arm/mach-ux500/board-mop500-audio.c +++ b/arch/arm/mach-ux500/board-mop500-audio.c | |||
@@ -21,28 +21,14 @@ | |||
21 | 21 | ||
22 | static struct stedma40_chan_cfg msp0_dma_rx = { | 22 | static struct stedma40_chan_cfg msp0_dma_rx = { |
23 | .high_priority = true, | 23 | .high_priority = true, |
24 | .dir = STEDMA40_PERIPH_TO_MEM, | 24 | .dir = DMA_DEV_TO_MEM, |
25 | 25 | .dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0, | |
26 | .src_dev_type = DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX, | ||
27 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
28 | |||
29 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
30 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
31 | |||
32 | /* data_width is set during configuration */ | ||
33 | }; | 26 | }; |
34 | 27 | ||
35 | static struct stedma40_chan_cfg msp0_dma_tx = { | 28 | static struct stedma40_chan_cfg msp0_dma_tx = { |
36 | .high_priority = true, | 29 | .high_priority = true, |
37 | .dir = STEDMA40_MEM_TO_PERIPH, | 30 | .dir = DMA_MEM_TO_DEV, |
38 | 31 | .dev_type = DB8500_DMA_DEV31_MSP0_SLIM0_CH0, | |
39 | .src_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
40 | .dst_dev_type = DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX, | ||
41 | |||
42 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
43 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
44 | |||
45 | /* data_width is set during configuration */ | ||
46 | }; | 32 | }; |
47 | 33 | ||
48 | struct msp_i2s_platform_data msp0_platform_data = { | 34 | struct msp_i2s_platform_data msp0_platform_data = { |
@@ -53,28 +39,14 @@ struct msp_i2s_platform_data msp0_platform_data = { | |||
53 | 39 | ||
54 | static struct stedma40_chan_cfg msp1_dma_rx = { | 40 | static struct stedma40_chan_cfg msp1_dma_rx = { |
55 | .high_priority = true, | 41 | .high_priority = true, |
56 | .dir = STEDMA40_PERIPH_TO_MEM, | 42 | .dir = DMA_DEV_TO_MEM, |
57 | 43 | .dev_type = DB8500_DMA_DEV30_MSP3, | |
58 | .src_dev_type = DB8500_DMA_DEV30_MSP3_RX, | ||
59 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
60 | |||
61 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
62 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
63 | |||
64 | /* data_width is set during configuration */ | ||
65 | }; | 44 | }; |
66 | 45 | ||
67 | static struct stedma40_chan_cfg msp1_dma_tx = { | 46 | static struct stedma40_chan_cfg msp1_dma_tx = { |
68 | .high_priority = true, | 47 | .high_priority = true, |
69 | .dir = STEDMA40_MEM_TO_PERIPH, | 48 | .dir = DMA_MEM_TO_DEV, |
70 | 49 | .dev_type = DB8500_DMA_DEV30_MSP1, | |
71 | .src_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
72 | .dst_dev_type = DB8500_DMA_DEV30_MSP1_TX, | ||
73 | |||
74 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
75 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
76 | |||
77 | /* data_width is set during configuration */ | ||
78 | }; | 50 | }; |
79 | 51 | ||
80 | struct msp_i2s_platform_data msp1_platform_data = { | 52 | struct msp_i2s_platform_data msp1_platform_data = { |
@@ -85,32 +57,16 @@ struct msp_i2s_platform_data msp1_platform_data = { | |||
85 | 57 | ||
86 | static struct stedma40_chan_cfg msp2_dma_rx = { | 58 | static struct stedma40_chan_cfg msp2_dma_rx = { |
87 | .high_priority = true, | 59 | .high_priority = true, |
88 | .dir = STEDMA40_PERIPH_TO_MEM, | 60 | .dir = DMA_DEV_TO_MEM, |
89 | 61 | .dev_type = DB8500_DMA_DEV14_MSP2, | |
90 | .src_dev_type = DB8500_DMA_DEV14_MSP2_RX, | ||
91 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
92 | |||
93 | /* MSP2 DMA doesn't work with PSIZE == 4 on DB8500v2 */ | ||
94 | .src_info.psize = STEDMA40_PSIZE_LOG_1, | ||
95 | .dst_info.psize = STEDMA40_PSIZE_LOG_1, | ||
96 | |||
97 | /* data_width is set during configuration */ | ||
98 | }; | 62 | }; |
99 | 63 | ||
100 | static struct stedma40_chan_cfg msp2_dma_tx = { | 64 | static struct stedma40_chan_cfg msp2_dma_tx = { |
101 | .high_priority = true, | 65 | .high_priority = true, |
102 | .dir = STEDMA40_MEM_TO_PERIPH, | 66 | .dir = DMA_MEM_TO_DEV, |
103 | 67 | .dev_type = DB8500_DMA_DEV14_MSP2, | |
104 | .src_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
105 | .dst_dev_type = DB8500_DMA_DEV14_MSP2_TX, | ||
106 | |||
107 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
108 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
109 | |||
110 | .use_fixed_channel = true, | 68 | .use_fixed_channel = true, |
111 | .phy_channel = 1, | 69 | .phy_channel = 1, |
112 | |||
113 | /* data_width is set during configuration */ | ||
114 | }; | 70 | }; |
115 | 71 | ||
116 | static struct platform_device *db8500_add_msp_i2s(struct device *parent, | 72 | static struct platform_device *db8500_add_msp_i2s(struct device *parent, |
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 43be3e0d4e30..b3e61a38e5c8 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
@@ -34,20 +34,14 @@ | |||
34 | #ifdef CONFIG_STE_DMA40 | 34 | #ifdef CONFIG_STE_DMA40 |
35 | struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = { | 35 | struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = { |
36 | .mode = STEDMA40_MODE_LOGICAL, | 36 | .mode = STEDMA40_MODE_LOGICAL, |
37 | .dir = STEDMA40_PERIPH_TO_MEM, | 37 | .dir = DMA_DEV_TO_MEM, |
38 | .src_dev_type = DB8500_DMA_DEV29_SD_MM0_RX, | 38 | .dev_type = DB8500_DMA_DEV29_SD_MM0, |
39 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
40 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
41 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
42 | }; | 39 | }; |
43 | 40 | ||
44 | static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = { | 41 | static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = { |
45 | .mode = STEDMA40_MODE_LOGICAL, | 42 | .mode = STEDMA40_MODE_LOGICAL, |
46 | .dir = STEDMA40_MEM_TO_PERIPH, | 43 | .dir = DMA_MEM_TO_DEV, |
47 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 44 | .dev_type = DB8500_DMA_DEV29_SD_MM0, |
48 | .dst_dev_type = DB8500_DMA_DEV29_SD_MM0_TX, | ||
49 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
50 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
51 | }; | 45 | }; |
52 | #endif | 46 | #endif |
53 | 47 | ||
@@ -89,20 +83,14 @@ void mop500_sdi_tc35892_init(struct device *parent) | |||
89 | #ifdef CONFIG_STE_DMA40 | 83 | #ifdef CONFIG_STE_DMA40 |
90 | static struct stedma40_chan_cfg sdi1_dma_cfg_rx = { | 84 | static struct stedma40_chan_cfg sdi1_dma_cfg_rx = { |
91 | .mode = STEDMA40_MODE_LOGICAL, | 85 | .mode = STEDMA40_MODE_LOGICAL, |
92 | .dir = STEDMA40_PERIPH_TO_MEM, | 86 | .dir = DMA_DEV_TO_MEM, |
93 | .src_dev_type = DB8500_DMA_DEV32_SD_MM1_RX, | 87 | .dev_type = DB8500_DMA_DEV32_SD_MM1, |
94 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
95 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
96 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
97 | }; | 88 | }; |
98 | 89 | ||
99 | static struct stedma40_chan_cfg sdi1_dma_cfg_tx = { | 90 | static struct stedma40_chan_cfg sdi1_dma_cfg_tx = { |
100 | .mode = STEDMA40_MODE_LOGICAL, | 91 | .mode = STEDMA40_MODE_LOGICAL, |
101 | .dir = STEDMA40_MEM_TO_PERIPH, | 92 | .dir = DMA_MEM_TO_DEV, |
102 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 93 | .dev_type = DB8500_DMA_DEV32_SD_MM1, |
103 | .dst_dev_type = DB8500_DMA_DEV32_SD_MM1_TX, | ||
104 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
105 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
106 | }; | 94 | }; |
107 | #endif | 95 | #endif |
108 | 96 | ||
@@ -127,20 +115,14 @@ struct mmci_platform_data mop500_sdi1_data = { | |||
127 | #ifdef CONFIG_STE_DMA40 | 115 | #ifdef CONFIG_STE_DMA40 |
128 | struct stedma40_chan_cfg mop500_sdi2_dma_cfg_rx = { | 116 | struct stedma40_chan_cfg mop500_sdi2_dma_cfg_rx = { |
129 | .mode = STEDMA40_MODE_LOGICAL, | 117 | .mode = STEDMA40_MODE_LOGICAL, |
130 | .dir = STEDMA40_PERIPH_TO_MEM, | 118 | .dir = DMA_DEV_TO_MEM, |
131 | .src_dev_type = DB8500_DMA_DEV28_SD_MM2_RX, | 119 | .dev_type = DB8500_DMA_DEV28_SD_MM2, |
132 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
133 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
134 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
135 | }; | 120 | }; |
136 | 121 | ||
137 | static struct stedma40_chan_cfg mop500_sdi2_dma_cfg_tx = { | 122 | static struct stedma40_chan_cfg mop500_sdi2_dma_cfg_tx = { |
138 | .mode = STEDMA40_MODE_LOGICAL, | 123 | .mode = STEDMA40_MODE_LOGICAL, |
139 | .dir = STEDMA40_MEM_TO_PERIPH, | 124 | .dir = DMA_MEM_TO_DEV, |
140 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 125 | .dev_type = DB8500_DMA_DEV28_SD_MM2, |
141 | .dst_dev_type = DB8500_DMA_DEV28_SD_MM2_TX, | ||
142 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
143 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
144 | }; | 126 | }; |
145 | #endif | 127 | #endif |
146 | 128 | ||
@@ -169,20 +151,14 @@ struct mmci_platform_data mop500_sdi2_data = { | |||
169 | #ifdef CONFIG_STE_DMA40 | 151 | #ifdef CONFIG_STE_DMA40 |
170 | struct stedma40_chan_cfg mop500_sdi4_dma_cfg_rx = { | 152 | struct stedma40_chan_cfg mop500_sdi4_dma_cfg_rx = { |
171 | .mode = STEDMA40_MODE_LOGICAL, | 153 | .mode = STEDMA40_MODE_LOGICAL, |
172 | .dir = STEDMA40_PERIPH_TO_MEM, | 154 | .dir = DMA_DEV_TO_MEM, |
173 | .src_dev_type = DB8500_DMA_DEV42_SD_MM4_RX, | 155 | .dev_type = DB8500_DMA_DEV42_SD_MM4, |
174 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
175 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
176 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
177 | }; | 156 | }; |
178 | 157 | ||
179 | static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = { | 158 | static struct stedma40_chan_cfg mop500_sdi4_dma_cfg_tx = { |
180 | .mode = STEDMA40_MODE_LOGICAL, | 159 | .mode = STEDMA40_MODE_LOGICAL, |
181 | .dir = STEDMA40_MEM_TO_PERIPH, | 160 | .dir = DMA_MEM_TO_DEV, |
182 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 161 | .dev_type = DB8500_DMA_DEV42_SD_MM4, |
183 | .dst_dev_type = DB8500_DMA_DEV42_SD_MM4_TX, | ||
184 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
185 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
186 | }; | 162 | }; |
187 | #endif | 163 | #endif |
188 | 164 | ||
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 78389de94dde..df5d27a532e9 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -413,47 +413,23 @@ static void mop500_prox_deactivate(struct device *dev) | |||
413 | regulator_put(prox_regulator); | 413 | regulator_put(prox_regulator); |
414 | } | 414 | } |
415 | 415 | ||
416 | void mop500_snowball_ethernet_clock_enable(void) | ||
417 | { | ||
418 | struct clk *clk; | ||
419 | |||
420 | clk = clk_get_sys("fsmc", NULL); | ||
421 | if (!IS_ERR(clk)) | ||
422 | clk_prepare_enable(clk); | ||
423 | } | ||
424 | |||
425 | static struct cryp_platform_data u8500_cryp1_platform_data = { | 416 | static struct cryp_platform_data u8500_cryp1_platform_data = { |
426 | .mem_to_engine = { | 417 | .mem_to_engine = { |
427 | .dir = STEDMA40_MEM_TO_PERIPH, | 418 | .dir = DMA_MEM_TO_DEV, |
428 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 419 | .dev_type = DB8500_DMA_DEV48_CAC1, |
429 | .dst_dev_type = DB8500_DMA_DEV48_CAC1_TX, | ||
430 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
431 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
432 | .mode = STEDMA40_MODE_LOGICAL, | 420 | .mode = STEDMA40_MODE_LOGICAL, |
433 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
434 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
435 | }, | 421 | }, |
436 | .engine_to_mem = { | 422 | .engine_to_mem = { |
437 | .dir = STEDMA40_PERIPH_TO_MEM, | 423 | .dir = DMA_DEV_TO_MEM, |
438 | .src_dev_type = DB8500_DMA_DEV48_CAC1_RX, | 424 | .dev_type = DB8500_DMA_DEV48_CAC1, |
439 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
440 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
441 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
442 | .mode = STEDMA40_MODE_LOGICAL, | 425 | .mode = STEDMA40_MODE_LOGICAL, |
443 | .src_info.psize = STEDMA40_PSIZE_LOG_4, | ||
444 | .dst_info.psize = STEDMA40_PSIZE_LOG_4, | ||
445 | } | 426 | } |
446 | }; | 427 | }; |
447 | 428 | ||
448 | static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = { | 429 | static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = { |
449 | .dir = STEDMA40_MEM_TO_PERIPH, | 430 | .dir = DMA_MEM_TO_DEV, |
450 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 431 | .dev_type = DB8500_DMA_DEV50_HAC1_TX, |
451 | .dst_dev_type = DB8500_DMA_DEV50_HAC1_TX, | ||
452 | .src_info.data_width = STEDMA40_WORD_WIDTH, | ||
453 | .dst_info.data_width = STEDMA40_WORD_WIDTH, | ||
454 | .mode = STEDMA40_MODE_LOGICAL, | 432 | .mode = STEDMA40_MODE_LOGICAL, |
455 | .src_info.psize = STEDMA40_PSIZE_LOG_16, | ||
456 | .dst_info.psize = STEDMA40_PSIZE_LOG_16, | ||
457 | }; | 433 | }; |
458 | 434 | ||
459 | static struct hash_platform_data u8500_hash1_platform_data = { | 435 | static struct hash_platform_data u8500_hash1_platform_data = { |
@@ -470,20 +446,14 @@ static struct platform_device *mop500_platform_devs[] __initdata = { | |||
470 | #ifdef CONFIG_STE_DMA40 | 446 | #ifdef CONFIG_STE_DMA40 |
471 | static struct stedma40_chan_cfg ssp0_dma_cfg_rx = { | 447 | static struct stedma40_chan_cfg ssp0_dma_cfg_rx = { |
472 | .mode = STEDMA40_MODE_LOGICAL, | 448 | .mode = STEDMA40_MODE_LOGICAL, |
473 | .dir = STEDMA40_PERIPH_TO_MEM, | 449 | .dir = DMA_DEV_TO_MEM, |
474 | .src_dev_type = DB8500_DMA_DEV8_SSP0_RX, | 450 | .dev_type = DB8500_DMA_DEV8_SSP0, |
475 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
476 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
477 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
478 | }; | 451 | }; |
479 | 452 | ||
480 | static struct stedma40_chan_cfg ssp0_dma_cfg_tx = { | 453 | static struct stedma40_chan_cfg ssp0_dma_cfg_tx = { |
481 | .mode = STEDMA40_MODE_LOGICAL, | 454 | .mode = STEDMA40_MODE_LOGICAL, |
482 | .dir = STEDMA40_MEM_TO_PERIPH, | 455 | .dir = DMA_MEM_TO_DEV, |
483 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 456 | .dev_type = DB8500_DMA_DEV8_SSP0, |
484 | .dst_dev_type = DB8500_DMA_DEV8_SSP0_TX, | ||
485 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
486 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
487 | }; | 457 | }; |
488 | #endif | 458 | #endif |
489 | 459 | ||
@@ -511,56 +481,38 @@ static void __init mop500_spi_init(struct device *parent) | |||
511 | #ifdef CONFIG_STE_DMA40 | 481 | #ifdef CONFIG_STE_DMA40 |
512 | static struct stedma40_chan_cfg uart0_dma_cfg_rx = { | 482 | static struct stedma40_chan_cfg uart0_dma_cfg_rx = { |
513 | .mode = STEDMA40_MODE_LOGICAL, | 483 | .mode = STEDMA40_MODE_LOGICAL, |
514 | .dir = STEDMA40_PERIPH_TO_MEM, | 484 | .dir = DMA_DEV_TO_MEM, |
515 | .src_dev_type = DB8500_DMA_DEV13_UART0_RX, | 485 | .dev_type = DB8500_DMA_DEV13_UART0, |
516 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
517 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
518 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
519 | }; | 486 | }; |
520 | 487 | ||
521 | static struct stedma40_chan_cfg uart0_dma_cfg_tx = { | 488 | static struct stedma40_chan_cfg uart0_dma_cfg_tx = { |
522 | .mode = STEDMA40_MODE_LOGICAL, | 489 | .mode = STEDMA40_MODE_LOGICAL, |
523 | .dir = STEDMA40_MEM_TO_PERIPH, | 490 | .dir = DMA_MEM_TO_DEV, |
524 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 491 | .dev_type = DB8500_DMA_DEV13_UART0, |
525 | .dst_dev_type = DB8500_DMA_DEV13_UART0_TX, | ||
526 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
527 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
528 | }; | 492 | }; |
529 | 493 | ||
530 | static struct stedma40_chan_cfg uart1_dma_cfg_rx = { | 494 | static struct stedma40_chan_cfg uart1_dma_cfg_rx = { |
531 | .mode = STEDMA40_MODE_LOGICAL, | 495 | .mode = STEDMA40_MODE_LOGICAL, |
532 | .dir = STEDMA40_PERIPH_TO_MEM, | 496 | .dir = DMA_DEV_TO_MEM, |
533 | .src_dev_type = DB8500_DMA_DEV12_UART1_RX, | 497 | .dev_type = DB8500_DMA_DEV12_UART1, |
534 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
535 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
536 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
537 | }; | 498 | }; |
538 | 499 | ||
539 | static struct stedma40_chan_cfg uart1_dma_cfg_tx = { | 500 | static struct stedma40_chan_cfg uart1_dma_cfg_tx = { |
540 | .mode = STEDMA40_MODE_LOGICAL, | 501 | .mode = STEDMA40_MODE_LOGICAL, |
541 | .dir = STEDMA40_MEM_TO_PERIPH, | 502 | .dir = DMA_MEM_TO_DEV, |
542 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 503 | .dev_type = DB8500_DMA_DEV12_UART1, |
543 | .dst_dev_type = DB8500_DMA_DEV12_UART1_TX, | ||
544 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
545 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
546 | }; | 504 | }; |
547 | 505 | ||
548 | static struct stedma40_chan_cfg uart2_dma_cfg_rx = { | 506 | static struct stedma40_chan_cfg uart2_dma_cfg_rx = { |
549 | .mode = STEDMA40_MODE_LOGICAL, | 507 | .mode = STEDMA40_MODE_LOGICAL, |
550 | .dir = STEDMA40_PERIPH_TO_MEM, | 508 | .dir = DMA_DEV_TO_MEM, |
551 | .src_dev_type = DB8500_DMA_DEV11_UART2_RX, | 509 | .dev_type = DB8500_DMA_DEV11_UART2, |
552 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, | ||
553 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
554 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
555 | }; | 510 | }; |
556 | 511 | ||
557 | static struct stedma40_chan_cfg uart2_dma_cfg_tx = { | 512 | static struct stedma40_chan_cfg uart2_dma_cfg_tx = { |
558 | .mode = STEDMA40_MODE_LOGICAL, | 513 | .mode = STEDMA40_MODE_LOGICAL, |
559 | .dir = STEDMA40_MEM_TO_PERIPH, | 514 | .dir = DMA_MEM_TO_DEV, |
560 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, | 515 | .dev_type = DB8500_DMA_DEV11_UART2, |
561 | .dst_dev_type = DB8500_DMA_DEV11_UART2_TX, | ||
562 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
563 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
564 | }; | 516 | }; |
565 | #endif | 517 | #endif |
566 | 518 | ||
@@ -674,7 +626,7 @@ static void __init snowball_init_machine(void) | |||
674 | mop500_audio_init(parent); | 626 | mop500_audio_init(parent); |
675 | mop500_uart_init(parent); | 627 | mop500_uart_init(parent); |
676 | 628 | ||
677 | mop500_snowball_ethernet_clock_enable(); | 629 | u8500_cryp1_hash1_init(parent); |
678 | 630 | ||
679 | /* This board has full regulator constraints */ | 631 | /* This board has full regulator constraints */ |
680 | regulator_has_full_constraints(); | 632 | regulator_has_full_constraints(); |
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h index 49514b825034..d6fab166cbf1 100644 --- a/arch/arm/mach-ux500/board-mop500.h +++ b/arch/arm/mach-ux500/board-mop500.h | |||
@@ -93,6 +93,7 @@ extern struct amba_pl011_data uart0_plat; | |||
93 | extern struct amba_pl011_data uart1_plat; | 93 | extern struct amba_pl011_data uart1_plat; |
94 | extern struct amba_pl011_data uart2_plat; | 94 | extern struct amba_pl011_data uart2_plat; |
95 | extern struct pl022_ssp_controller ssp0_plat; | 95 | extern struct pl022_ssp_controller ssp0_plat; |
96 | extern struct stedma40_platform_data dma40_plat_data; | ||
96 | 97 | ||
97 | extern void mop500_sdi_init(struct device *parent); | 98 | extern void mop500_sdi_init(struct device *parent); |
98 | extern void snowball_sdi_init(struct device *parent); | 99 | extern void snowball_sdi_init(struct device *parent); |
@@ -104,7 +105,6 @@ void __init mop500_pinmaps_init(void); | |||
104 | void __init snowball_pinmaps_init(void); | 105 | void __init snowball_pinmaps_init(void); |
105 | void __init hrefv60_pinmaps_init(void); | 106 | void __init hrefv60_pinmaps_init(void); |
106 | void mop500_audio_init(struct device *parent); | 107 | void mop500_audio_init(struct device *parent); |
107 | void mop500_snowball_ethernet_clock_enable(void); | ||
108 | 108 | ||
109 | int __init mop500_uib_init(void); | 109 | int __init mop500_uib_init(void); |
110 | void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, | 110 | void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 7669a49fb6fb..12eee8167525 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -162,26 +162,15 @@ static void __init db8500_add_gpios(struct device *parent) | |||
162 | dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); | 162 | dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); |
163 | } | 163 | } |
164 | 164 | ||
165 | static int usb_db8500_rx_dma_cfg[] = { | 165 | static int usb_db8500_dma_cfg[] = { |
166 | DB8500_DMA_DEV38_USB_OTG_IEP_1_9, | 166 | DB8500_DMA_DEV38_USB_OTG_IEP_AND_OEP_1_9, |
167 | DB8500_DMA_DEV37_USB_OTG_IEP_2_10, | 167 | DB8500_DMA_DEV37_USB_OTG_IEP_AND_OEP_2_10, |
168 | DB8500_DMA_DEV36_USB_OTG_IEP_3_11, | 168 | DB8500_DMA_DEV36_USB_OTG_IEP_AND_OEP_3_11, |
169 | DB8500_DMA_DEV19_USB_OTG_IEP_4_12, | 169 | DB8500_DMA_DEV19_USB_OTG_IEP_AND_OEP_4_12, |
170 | DB8500_DMA_DEV18_USB_OTG_IEP_5_13, | 170 | DB8500_DMA_DEV18_USB_OTG_IEP_AND_OEP_5_13, |
171 | DB8500_DMA_DEV17_USB_OTG_IEP_6_14, | 171 | DB8500_DMA_DEV17_USB_OTG_IEP_AND_OEP_6_14, |
172 | DB8500_DMA_DEV16_USB_OTG_IEP_7_15, | 172 | DB8500_DMA_DEV16_USB_OTG_IEP_AND_OEP_7_15, |
173 | DB8500_DMA_DEV39_USB_OTG_IEP_8 | 173 | DB8500_DMA_DEV39_USB_OTG_IEP_AND_OEP_8 |
174 | }; | ||
175 | |||
176 | static int usb_db8500_tx_dma_cfg[] = { | ||
177 | DB8500_DMA_DEV38_USB_OTG_OEP_1_9, | ||
178 | DB8500_DMA_DEV37_USB_OTG_OEP_2_10, | ||
179 | DB8500_DMA_DEV36_USB_OTG_OEP_3_11, | ||
180 | DB8500_DMA_DEV19_USB_OTG_OEP_4_12, | ||
181 | DB8500_DMA_DEV18_USB_OTG_OEP_5_13, | ||
182 | DB8500_DMA_DEV17_USB_OTG_OEP_6_14, | ||
183 | DB8500_DMA_DEV16_USB_OTG_OEP_7_15, | ||
184 | DB8500_DMA_DEV39_USB_OTG_OEP_8 | ||
185 | }; | 174 | }; |
186 | 175 | ||
187 | static const char *db8500_read_soc_id(void) | 176 | static const char *db8500_read_soc_id(void) |
@@ -215,7 +204,7 @@ struct device * __init u8500_init_devices(void) | |||
215 | 204 | ||
216 | db8500_add_rtc(parent); | 205 | db8500_add_rtc(parent); |
217 | db8500_add_gpios(parent); | 206 | db8500_add_gpios(parent); |
218 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 207 | db8500_add_usb(parent, usb_db8500_dma_cfg, usb_db8500_dma_cfg); |
219 | 208 | ||
220 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) | 209 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) |
221 | platform_devs[i]->dev.parent = parent; | 210 | platform_devs[i]->dev.parent = parent; |
@@ -226,34 +215,13 @@ struct device * __init u8500_init_devices(void) | |||
226 | } | 215 | } |
227 | 216 | ||
228 | #ifdef CONFIG_MACH_UX500_DT | 217 | #ifdef CONFIG_MACH_UX500_DT |
229 | |||
230 | /* TODO: Once all pieces are DT:ed, remove completely. */ | ||
231 | static struct device * __init u8500_of_init_devices(void) | ||
232 | { | ||
233 | struct device *parent = db8500_soc_device_init(); | ||
234 | |||
235 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | ||
236 | |||
237 | u8500_dma40_device.dev.parent = parent; | ||
238 | |||
239 | /* | ||
240 | * Devices to be DT:ed: | ||
241 | * u8500_dma40_device = todo | ||
242 | * db8500_pmu_device = done | ||
243 | * db8500_prcmu_device = done | ||
244 | */ | ||
245 | platform_device_register(&u8500_dma40_device); | ||
246 | |||
247 | return parent; | ||
248 | } | ||
249 | |||
250 | static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | 218 | static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { |
251 | /* Requires call-back bindings. */ | 219 | /* Requires call-back bindings. */ |
252 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), | 220 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), |
253 | /* Requires DMA bindings. */ | 221 | /* Requires DMA bindings. */ |
254 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), | 222 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", NULL), |
255 | OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), | 223 | OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", NULL), |
256 | OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), | 224 | OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", NULL), |
257 | OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), | 225 | OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), |
258 | OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), | 226 | OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), |
259 | OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), | 227 | OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), |
@@ -294,6 +262,8 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
294 | "ux500-msp-i2s.2", &msp2_platform_data), | 262 | "ux500-msp-i2s.2", &msp2_platform_data), |
295 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000, | 263 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000, |
296 | "ux500-msp-i2s.3", &msp3_platform_data), | 264 | "ux500-msp-i2s.3", &msp3_platform_data), |
265 | /* Requires clock name bindings and channel address lookup table. */ | ||
266 | OF_DEV_AUXDATA("stericsson,db8500-dma40", 0x801C0000, "dma40.0", NULL), | ||
297 | {}, | 267 | {}, |
298 | }; | 268 | }; |
299 | 269 | ||
@@ -317,22 +287,18 @@ static const struct of_device_id u8500_local_bus_nodes[] = { | |||
317 | 287 | ||
318 | static void __init u8500_init_machine(void) | 288 | static void __init u8500_init_machine(void) |
319 | { | 289 | { |
320 | struct device *parent = NULL; | 290 | struct device *parent = db8500_soc_device_init(); |
321 | 291 | ||
322 | /* Pinmaps must be in place before devices register */ | 292 | /* Pinmaps must be in place before devices register */ |
323 | if (of_machine_is_compatible("st-ericsson,mop500")) | 293 | if (of_machine_is_compatible("st-ericsson,mop500")) |
324 | mop500_pinmaps_init(); | 294 | mop500_pinmaps_init(); |
325 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { | 295 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { |
326 | snowball_pinmaps_init(); | 296 | snowball_pinmaps_init(); |
327 | mop500_snowball_ethernet_clock_enable(); | ||
328 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | 297 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) |
329 | hrefv60_pinmaps_init(); | 298 | hrefv60_pinmaps_init(); |
330 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} | 299 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} |
331 | /* TODO: Add pinmaps for ccu9540 board. */ | 300 | /* TODO: Add pinmaps for ccu9540 board. */ |
332 | 301 | ||
333 | /* TODO: Export SoC, USB, cpu-freq and DMA40 */ | ||
334 | parent = u8500_of_init_devices(); | ||
335 | |||
336 | /* automatically probe child nodes of dbx5x0 devices */ | 302 | /* automatically probe child nodes of dbx5x0 devices */ |
337 | if (of_machine_is_compatible("st-ericsson,u8540")) | 303 | if (of_machine_is_compatible("st-ericsson,u8540")) |
338 | of_platform_populate(NULL, u8500_local_bus_nodes, | 304 | of_platform_populate(NULL, u8500_local_bus_nodes, |
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c index ddbdcda8306a..516a6f57d159 100644 --- a/arch/arm/mach-ux500/devices-db8500.c +++ b/arch/arm/mach-ux500/devices-db8500.c | |||
@@ -42,128 +42,7 @@ static struct resource dma40_resources[] = { | |||
42 | } | 42 | } |
43 | }; | 43 | }; |
44 | 44 | ||
45 | /* Default configuration for physcial memcpy */ | 45 | struct stedma40_platform_data dma40_plat_data = { |
46 | struct stedma40_chan_cfg dma40_memcpy_conf_phy = { | ||
47 | .mode = STEDMA40_MODE_PHYSICAL, | ||
48 | .dir = STEDMA40_MEM_TO_MEM, | ||
49 | |||
50 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
51 | .src_info.psize = STEDMA40_PSIZE_PHY_1, | ||
52 | .src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
53 | |||
54 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
55 | .dst_info.psize = STEDMA40_PSIZE_PHY_1, | ||
56 | .dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
57 | }; | ||
58 | /* Default configuration for logical memcpy */ | ||
59 | struct stedma40_chan_cfg dma40_memcpy_conf_log = { | ||
60 | .dir = STEDMA40_MEM_TO_MEM, | ||
61 | |||
62 | .src_info.data_width = STEDMA40_BYTE_WIDTH, | ||
63 | .src_info.psize = STEDMA40_PSIZE_LOG_1, | ||
64 | .src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
65 | |||
66 | .dst_info.data_width = STEDMA40_BYTE_WIDTH, | ||
67 | .dst_info.psize = STEDMA40_PSIZE_LOG_1, | ||
68 | .dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
69 | }; | ||
70 | |||
71 | /* | ||
72 | * Mapping between destination event lines and physical device address. | ||
73 | * The event line is tied to a device and therefore the address is constant. | ||
74 | * When the address comes from a primecell it will be configured in runtime | ||
75 | * and we set the address to -1 as a placeholder. | ||
76 | */ | ||
77 | static const dma_addr_t dma40_tx_map[DB8500_DMA_NR_DEV] = { | ||
78 | /* MUSB - these will be runtime-reconfigured */ | ||
79 | [DB8500_DMA_DEV39_USB_OTG_OEP_8] = -1, | ||
80 | [DB8500_DMA_DEV16_USB_OTG_OEP_7_15] = -1, | ||
81 | [DB8500_DMA_DEV17_USB_OTG_OEP_6_14] = -1, | ||
82 | [DB8500_DMA_DEV18_USB_OTG_OEP_5_13] = -1, | ||
83 | [DB8500_DMA_DEV19_USB_OTG_OEP_4_12] = -1, | ||
84 | [DB8500_DMA_DEV36_USB_OTG_OEP_3_11] = -1, | ||
85 | [DB8500_DMA_DEV37_USB_OTG_OEP_2_10] = -1, | ||
86 | [DB8500_DMA_DEV38_USB_OTG_OEP_1_9] = -1, | ||
87 | /* PrimeCells - run-time configured */ | ||
88 | [DB8500_DMA_DEV0_SPI0_TX] = -1, | ||
89 | [DB8500_DMA_DEV1_SD_MMC0_TX] = -1, | ||
90 | [DB8500_DMA_DEV2_SD_MMC1_TX] = -1, | ||
91 | [DB8500_DMA_DEV3_SD_MMC2_TX] = -1, | ||
92 | [DB8500_DMA_DEV8_SSP0_TX] = -1, | ||
93 | [DB8500_DMA_DEV9_SSP1_TX] = -1, | ||
94 | [DB8500_DMA_DEV11_UART2_TX] = -1, | ||
95 | [DB8500_DMA_DEV12_UART1_TX] = -1, | ||
96 | [DB8500_DMA_DEV13_UART0_TX] = -1, | ||
97 | [DB8500_DMA_DEV28_SD_MM2_TX] = -1, | ||
98 | [DB8500_DMA_DEV29_SD_MM0_TX] = -1, | ||
99 | [DB8500_DMA_DEV32_SD_MM1_TX] = -1, | ||
100 | [DB8500_DMA_DEV33_SPI2_TX] = -1, | ||
101 | [DB8500_DMA_DEV35_SPI1_TX] = -1, | ||
102 | [DB8500_DMA_DEV40_SPI3_TX] = -1, | ||
103 | [DB8500_DMA_DEV41_SD_MM3_TX] = -1, | ||
104 | [DB8500_DMA_DEV42_SD_MM4_TX] = -1, | ||
105 | [DB8500_DMA_DEV43_SD_MM5_TX] = -1, | ||
106 | [DB8500_DMA_DEV14_MSP2_TX] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET, | ||
107 | [DB8500_DMA_DEV30_MSP1_TX] = U8500_MSP1_BASE + MSP_TX_RX_REG_OFFSET, | ||
108 | [DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET, | ||
109 | [DB8500_DMA_DEV48_CAC1_TX] = U8500_CRYP1_BASE + CRYP1_TX_REG_OFFSET, | ||
110 | [DB8500_DMA_DEV50_HAC1_TX] = U8500_HASH1_BASE + HASH1_TX_REG_OFFSET, | ||
111 | }; | ||
112 | |||
113 | /* Mapping between source event lines and physical device address */ | ||
114 | static const dma_addr_t dma40_rx_map[DB8500_DMA_NR_DEV] = { | ||
115 | /* MUSB - these will be runtime-reconfigured */ | ||
116 | [DB8500_DMA_DEV39_USB_OTG_IEP_8] = -1, | ||
117 | [DB8500_DMA_DEV16_USB_OTG_IEP_7_15] = -1, | ||
118 | [DB8500_DMA_DEV17_USB_OTG_IEP_6_14] = -1, | ||
119 | [DB8500_DMA_DEV18_USB_OTG_IEP_5_13] = -1, | ||
120 | [DB8500_DMA_DEV19_USB_OTG_IEP_4_12] = -1, | ||
121 | [DB8500_DMA_DEV36_USB_OTG_IEP_3_11] = -1, | ||
122 | [DB8500_DMA_DEV37_USB_OTG_IEP_2_10] = -1, | ||
123 | [DB8500_DMA_DEV38_USB_OTG_IEP_1_9] = -1, | ||
124 | /* PrimeCells */ | ||
125 | [DB8500_DMA_DEV0_SPI0_RX] = -1, | ||
126 | [DB8500_DMA_DEV1_SD_MMC0_RX] = -1, | ||
127 | [DB8500_DMA_DEV2_SD_MMC1_RX] = -1, | ||
128 | [DB8500_DMA_DEV3_SD_MMC2_RX] = -1, | ||
129 | [DB8500_DMA_DEV8_SSP0_RX] = -1, | ||
130 | [DB8500_DMA_DEV9_SSP1_RX] = -1, | ||
131 | [DB8500_DMA_DEV11_UART2_RX] = -1, | ||
132 | [DB8500_DMA_DEV12_UART1_RX] = -1, | ||
133 | [DB8500_DMA_DEV13_UART0_RX] = -1, | ||
134 | [DB8500_DMA_DEV28_SD_MM2_RX] = -1, | ||
135 | [DB8500_DMA_DEV29_SD_MM0_RX] = -1, | ||
136 | [DB8500_DMA_DEV32_SD_MM1_RX] = -1, | ||
137 | [DB8500_DMA_DEV33_SPI2_RX] = -1, | ||
138 | [DB8500_DMA_DEV35_SPI1_RX] = -1, | ||
139 | [DB8500_DMA_DEV40_SPI3_RX] = -1, | ||
140 | [DB8500_DMA_DEV41_SD_MM3_RX] = -1, | ||
141 | [DB8500_DMA_DEV42_SD_MM4_RX] = -1, | ||
142 | [DB8500_DMA_DEV43_SD_MM5_RX] = -1, | ||
143 | [DB8500_DMA_DEV14_MSP2_RX] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET, | ||
144 | [DB8500_DMA_DEV30_MSP3_RX] = U8500_MSP3_BASE + MSP_TX_RX_REG_OFFSET, | ||
145 | [DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET, | ||
146 | [DB8500_DMA_DEV48_CAC1_RX] = U8500_CRYP1_BASE + CRYP1_RX_REG_OFFSET, | ||
147 | }; | ||
148 | |||
149 | /* Reserved event lines for memcpy only */ | ||
150 | static int dma40_memcpy_event[] = { | ||
151 | DB8500_DMA_MEMCPY_TX_0, | ||
152 | DB8500_DMA_MEMCPY_TX_1, | ||
153 | DB8500_DMA_MEMCPY_TX_2, | ||
154 | DB8500_DMA_MEMCPY_TX_3, | ||
155 | DB8500_DMA_MEMCPY_TX_4, | ||
156 | DB8500_DMA_MEMCPY_TX_5, | ||
157 | }; | ||
158 | |||
159 | static struct stedma40_platform_data dma40_plat_data = { | ||
160 | .dev_len = DB8500_DMA_NR_DEV, | ||
161 | .dev_rx = dma40_rx_map, | ||
162 | .dev_tx = dma40_tx_map, | ||
163 | .memcpy = dma40_memcpy_event, | ||
164 | .memcpy_len = ARRAY_SIZE(dma40_memcpy_event), | ||
165 | .memcpy_conf_phy = &dma40_memcpy_conf_phy, | ||
166 | .memcpy_conf_log = &dma40_memcpy_conf_log, | ||
167 | .disabled_channels = {-1}, | 46 | .disabled_channels = {-1}, |
168 | }; | 47 | }; |
169 | 48 | ||
diff --git a/arch/arm/mach-ux500/ste-dma40-db8500.h b/arch/arm/mach-ux500/ste-dma40-db8500.h index a616419bea76..0296ae5b0fd9 100644 --- a/arch/arm/mach-ux500/ste-dma40-db8500.h +++ b/arch/arm/mach-ux500/ste-dma40-db8500.h | |||
@@ -12,133 +12,74 @@ | |||
12 | 12 | ||
13 | #define DB8500_DMA_NR_DEV 64 | 13 | #define DB8500_DMA_NR_DEV 64 |
14 | 14 | ||
15 | enum dma_src_dev_type { | 15 | /* |
16 | DB8500_DMA_DEV0_SPI0_RX = 0, | 16 | * Unless otherwise specified, all channels numbers are used for |
17 | DB8500_DMA_DEV1_SD_MMC0_RX = 1, | 17 | * TX & RX, and can be used for either source or destination |
18 | DB8500_DMA_DEV2_SD_MMC1_RX = 2, | 18 | * channels. |
19 | DB8500_DMA_DEV3_SD_MMC2_RX = 3, | 19 | */ |
20 | DB8500_DMA_DEV4_I2C1_RX = 4, | 20 | enum dma_dev_type { |
21 | DB8500_DMA_DEV5_I2C3_RX = 5, | 21 | DB8500_DMA_DEV0_SPI0 = 0, |
22 | DB8500_DMA_DEV6_I2C2_RX = 6, | 22 | DB8500_DMA_DEV1_SD_MMC0 = 1, |
23 | DB8500_DMA_DEV7_I2C4_RX = 7, /* Only on V1 and later */ | 23 | DB8500_DMA_DEV2_SD_MMC1 = 2, |
24 | DB8500_DMA_DEV8_SSP0_RX = 8, | 24 | DB8500_DMA_DEV3_SD_MMC2 = 3, |
25 | DB8500_DMA_DEV9_SSP1_RX = 9, | 25 | DB8500_DMA_DEV4_I2C1 = 4, |
26 | DB8500_DMA_DEV10_MCDE_RX = 10, | 26 | DB8500_DMA_DEV5_I2C3 = 5, |
27 | DB8500_DMA_DEV11_UART2_RX = 11, | 27 | DB8500_DMA_DEV6_I2C2 = 6, |
28 | DB8500_DMA_DEV12_UART1_RX = 12, | 28 | DB8500_DMA_DEV7_I2C4 = 7, /* Only on V1 and later */ |
29 | DB8500_DMA_DEV13_UART0_RX = 13, | 29 | DB8500_DMA_DEV8_SSP0 = 8, |
30 | DB8500_DMA_DEV14_MSP2_RX = 14, | 30 | DB8500_DMA_DEV9_SSP1 = 9, |
31 | DB8500_DMA_DEV15_I2C0_RX = 15, | 31 | DB8500_DMA_DEV10_MCDE_RX = 10, /* RX only */ |
32 | DB8500_DMA_DEV16_USB_OTG_IEP_7_15 = 16, | 32 | DB8500_DMA_DEV11_UART2 = 11, |
33 | DB8500_DMA_DEV17_USB_OTG_IEP_6_14 = 17, | 33 | DB8500_DMA_DEV12_UART1 = 12, |
34 | DB8500_DMA_DEV18_USB_OTG_IEP_5_13 = 18, | 34 | DB8500_DMA_DEV13_UART0 = 13, |
35 | DB8500_DMA_DEV19_USB_OTG_IEP_4_12 = 19, | 35 | DB8500_DMA_DEV14_MSP2 = 14, |
36 | DB8500_DMA_DEV20_SLIM0_CH0_RX_HSI_RX_CH0 = 20, | 36 | DB8500_DMA_DEV15_I2C0 = 15, |
37 | DB8500_DMA_DEV21_SLIM0_CH1_RX_HSI_RX_CH1 = 21, | 37 | DB8500_DMA_DEV16_USB_OTG_IEP_AND_OEP_7_15 = 16, |
38 | DB8500_DMA_DEV22_SLIM0_CH2_RX_HSI_RX_CH2 = 22, | 38 | DB8500_DMA_DEV17_USB_OTG_IEP_AND_OEP_6_14 = 17, |
39 | DB8500_DMA_DEV23_SLIM0_CH3_RX_HSI_RX_CH3 = 23, | 39 | DB8500_DMA_DEV18_USB_OTG_IEP_AND_OEP_5_13 = 18, |
40 | DB8500_DMA_DEV24_SRC_SXA0_RX_TX = 24, | 40 | DB8500_DMA_DEV19_USB_OTG_IEP_AND_OEP_4_12 = 19, |
41 | DB8500_DMA_DEV25_SRC_SXA1_RX_TX = 25, | 41 | DB8500_DMA_DEV20_SLIM0_CH0_HSI_CH0 = 20, |
42 | DB8500_DMA_DEV26_SRC_SXA2_RX_TX = 26, | 42 | DB8500_DMA_DEV21_SLIM0_CH1_HSI_CH1 = 21, |
43 | DB8500_DMA_DEV27_SRC_SXA3_RX_TX = 27, | 43 | DB8500_DMA_DEV22_SLIM0_CH2_HSI_CH2 = 22, |
44 | DB8500_DMA_DEV28_SD_MM2_RX = 28, | 44 | DB8500_DMA_DEV23_SLIM0_CH3_HSI_CH3 = 23, |
45 | DB8500_DMA_DEV29_SD_MM0_RX = 29, | 45 | DB8500_DMA_DEV24_SXA0 = 24, |
46 | DB8500_DMA_DEV30_MSP1_RX = 30, | 46 | DB8500_DMA_DEV25_SXA1 = 25, |
47 | DB8500_DMA_DEV26_SXA2 = 26, | ||
48 | DB8500_DMA_DEV27_SXA3 = 27, | ||
49 | DB8500_DMA_DEV28_SD_MM2 = 28, | ||
50 | DB8500_DMA_DEV29_SD_MM0 = 29, | ||
51 | DB8500_DMA_DEV30_MSP1 = 30, | ||
47 | /* On DB8500v2, MSP3 RX replaces MSP1 RX */ | 52 | /* On DB8500v2, MSP3 RX replaces MSP1 RX */ |
48 | DB8500_DMA_DEV30_MSP3_RX = 30, | 53 | DB8500_DMA_DEV30_MSP3 = 30, |
49 | DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX = 31, | 54 | DB8500_DMA_DEV31_MSP0_SLIM0_CH0 = 31, |
50 | DB8500_DMA_DEV32_SD_MM1_RX = 32, | 55 | DB8500_DMA_DEV32_SD_MM1 = 32, |
51 | DB8500_DMA_DEV33_SPI2_RX = 33, | 56 | DB8500_DMA_DEV33_SPI2 = 33, |
52 | DB8500_DMA_DEV34_I2C3_RX2 = 34, | 57 | DB8500_DMA_DEV34_I2C3_RX2_TX2 = 34, |
53 | DB8500_DMA_DEV35_SPI1_RX = 35, | 58 | DB8500_DMA_DEV35_SPI1 = 35, |
54 | DB8500_DMA_DEV36_USB_OTG_IEP_3_11 = 36, | 59 | DB8500_DMA_DEV36_USB_OTG_IEP_AND_OEP_3_11 = 36, |
55 | DB8500_DMA_DEV37_USB_OTG_IEP_2_10 = 37, | 60 | DB8500_DMA_DEV37_USB_OTG_IEP_AND_OEP_2_10 = 37, |
56 | DB8500_DMA_DEV38_USB_OTG_IEP_1_9 = 38, | 61 | DB8500_DMA_DEV38_USB_OTG_IEP_AND_OEP_1_9 = 38, |
57 | DB8500_DMA_DEV39_USB_OTG_IEP_8 = 39, | 62 | DB8500_DMA_DEV39_USB_OTG_IEP_AND_OEP_8 = 39, |
58 | DB8500_DMA_DEV40_SPI3_RX = 40, | 63 | DB8500_DMA_DEV40_SPI3 = 40, |
59 | DB8500_DMA_DEV41_SD_MM3_RX = 41, | 64 | DB8500_DMA_DEV41_SD_MM3 = 41, |
60 | DB8500_DMA_DEV42_SD_MM4_RX = 42, | 65 | DB8500_DMA_DEV42_SD_MM4 = 42, |
61 | DB8500_DMA_DEV43_SD_MM5_RX = 43, | 66 | DB8500_DMA_DEV43_SD_MM5 = 43, |
62 | DB8500_DMA_DEV44_SRC_SXA4_RX_TX = 44, | 67 | DB8500_DMA_DEV44_SXA4 = 44, |
63 | DB8500_DMA_DEV45_SRC_SXA5_RX_TX = 45, | 68 | DB8500_DMA_DEV45_SXA5 = 45, |
64 | DB8500_DMA_DEV46_SLIM0_CH8_RX_SRC_SXA6_RX_TX = 46, | 69 | DB8500_DMA_DEV46_SLIM0_CH8_SRC_SXA6 = 46, |
65 | DB8500_DMA_DEV47_SLIM0_CH9_RX_SRC_SXA7_RX_TX = 47, | 70 | DB8500_DMA_DEV47_SLIM0_CH9_SRC_SXA7 = 47, |
66 | DB8500_DMA_DEV48_CAC1_RX = 48, | 71 | DB8500_DMA_DEV48_CAC1 = 48, |
67 | /* 49, 50 and 51 are not used */ | 72 | DB8500_DMA_DEV49_CAC1_TX_HAC1_TX = 49, /* TX only */ |
68 | DB8500_DMA_DEV52_SLIM0_CH4_RX_HSI_RX_CH4 = 52, | 73 | DB8500_DMA_DEV50_HAC1_TX = 50, /* TX only */ |
69 | DB8500_DMA_DEV53_SLIM0_CH5_RX_HSI_RX_CH5 = 53, | 74 | DB8500_DMA_MEMCPY_TX_0 = 51, /* TX only */ |
70 | DB8500_DMA_DEV54_SLIM0_CH6_RX_HSI_RX_CH6 = 54, | 75 | DB8500_DMA_DEV52_SLIM0_CH4_HSI_CH4 = 52, |
71 | DB8500_DMA_DEV55_SLIM0_CH7_RX_HSI_RX_CH7 = 55, | 76 | DB8500_DMA_DEV53_SLIM0_CH5_HSI_CH5 = 53, |
72 | /* 56, 57, 58, 59 and 60 are not used */ | 77 | DB8500_DMA_DEV54_SLIM0_CH6_HSI_CH6 = 54, |
73 | DB8500_DMA_DEV61_CAC0_RX = 61, | 78 | DB8500_DMA_DEV55_SLIM0_CH7_HSI_CH7 = 55, |
74 | /* 62 and 63 are not used */ | 79 | /* 56 -> 60 are channels reserved for memcpy only */ |
75 | }; | 80 | DB8500_DMA_DEV61_CAC0 = 61, |
76 | 81 | DB8500_DMA_DEV62_CAC0_TX_HAC0_TX = 62, /* TX only */ | |
77 | enum dma_dest_dev_type { | 82 | DB8500_DMA_DEV63_HAC0_TX = 63, /* TX only */ |
78 | DB8500_DMA_DEV0_SPI0_TX = 0, | ||
79 | DB8500_DMA_DEV1_SD_MMC0_TX = 1, | ||
80 | DB8500_DMA_DEV2_SD_MMC1_TX = 2, | ||
81 | DB8500_DMA_DEV3_SD_MMC2_TX = 3, | ||
82 | DB8500_DMA_DEV4_I2C1_TX = 4, | ||
83 | DB8500_DMA_DEV5_I2C3_TX = 5, | ||
84 | DB8500_DMA_DEV6_I2C2_TX = 6, | ||
85 | DB8500_DMA_DEV7_I2C4_TX = 7, /* Only on V1 and later */ | ||
86 | DB8500_DMA_DEV8_SSP0_TX = 8, | ||
87 | DB8500_DMA_DEV9_SSP1_TX = 9, | ||
88 | /* 10 is not used*/ | ||
89 | DB8500_DMA_DEV11_UART2_TX = 11, | ||
90 | DB8500_DMA_DEV12_UART1_TX = 12, | ||
91 | DB8500_DMA_DEV13_UART0_TX = 13, | ||
92 | DB8500_DMA_DEV14_MSP2_TX = 14, | ||
93 | DB8500_DMA_DEV15_I2C0_TX = 15, | ||
94 | DB8500_DMA_DEV16_USB_OTG_OEP_7_15 = 16, | ||
95 | DB8500_DMA_DEV17_USB_OTG_OEP_6_14 = 17, | ||
96 | DB8500_DMA_DEV18_USB_OTG_OEP_5_13 = 18, | ||
97 | DB8500_DMA_DEV19_USB_OTG_OEP_4_12 = 19, | ||
98 | DB8500_DMA_DEV20_SLIM0_CH0_TX_HSI_TX_CH0 = 20, | ||
99 | DB8500_DMA_DEV21_SLIM0_CH1_TX_HSI_TX_CH1 = 21, | ||
100 | DB8500_DMA_DEV22_SLIM0_CH2_TX_HSI_TX_CH2 = 22, | ||
101 | DB8500_DMA_DEV23_SLIM0_CH3_TX_HSI_TX_CH3 = 23, | ||
102 | DB8500_DMA_DEV24_DST_SXA0_RX_TX = 24, | ||
103 | DB8500_DMA_DEV25_DST_SXA1_RX_TX = 25, | ||
104 | DB8500_DMA_DEV26_DST_SXA2_RX_TX = 26, | ||
105 | DB8500_DMA_DEV27_DST_SXA3_RX_TX = 27, | ||
106 | DB8500_DMA_DEV28_SD_MM2_TX = 28, | ||
107 | DB8500_DMA_DEV29_SD_MM0_TX = 29, | ||
108 | DB8500_DMA_DEV30_MSP1_TX = 30, | ||
109 | DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX = 31, | ||
110 | DB8500_DMA_DEV32_SD_MM1_TX = 32, | ||
111 | DB8500_DMA_DEV33_SPI2_TX = 33, | ||
112 | DB8500_DMA_DEV34_I2C3_TX2 = 34, | ||
113 | DB8500_DMA_DEV35_SPI1_TX = 35, | ||
114 | DB8500_DMA_DEV36_USB_OTG_OEP_3_11 = 36, | ||
115 | DB8500_DMA_DEV37_USB_OTG_OEP_2_10 = 37, | ||
116 | DB8500_DMA_DEV38_USB_OTG_OEP_1_9 = 38, | ||
117 | DB8500_DMA_DEV39_USB_OTG_OEP_8 = 39, | ||
118 | DB8500_DMA_DEV40_SPI3_TX = 40, | ||
119 | DB8500_DMA_DEV41_SD_MM3_TX = 41, | ||
120 | DB8500_DMA_DEV42_SD_MM4_TX = 42, | ||
121 | DB8500_DMA_DEV43_SD_MM5_TX = 43, | ||
122 | DB8500_DMA_DEV44_DST_SXA4_RX_TX = 44, | ||
123 | DB8500_DMA_DEV45_DST_SXA5_RX_TX = 45, | ||
124 | DB8500_DMA_DEV46_SLIM0_CH8_TX_DST_SXA6_RX_TX = 46, | ||
125 | DB8500_DMA_DEV47_SLIM0_CH9_TX_DST_SXA7_RX_TX = 47, | ||
126 | DB8500_DMA_DEV48_CAC1_TX = 48, | ||
127 | DB8500_DMA_DEV49_CAC1_TX_HAC1_TX = 49, | ||
128 | DB8500_DMA_DEV50_HAC1_TX = 50, | ||
129 | DB8500_DMA_MEMCPY_TX_0 = 51, | ||
130 | DB8500_DMA_DEV52_SLIM1_CH4_TX_HSI_TX_CH4 = 52, | ||
131 | DB8500_DMA_DEV53_SLIM1_CH5_TX_HSI_TX_CH5 = 53, | ||
132 | DB8500_DMA_DEV54_SLIM1_CH6_TX_HSI_TX_CH6 = 54, | ||
133 | DB8500_DMA_DEV55_SLIM1_CH7_TX_HSI_TX_CH7 = 55, | ||
134 | DB8500_DMA_MEMCPY_TX_1 = 56, | ||
135 | DB8500_DMA_MEMCPY_TX_2 = 57, | ||
136 | DB8500_DMA_MEMCPY_TX_3 = 58, | ||
137 | DB8500_DMA_MEMCPY_TX_4 = 59, | ||
138 | DB8500_DMA_MEMCPY_TX_5 = 60, | ||
139 | DB8500_DMA_DEV61_CAC0_TX = 61, | ||
140 | DB8500_DMA_DEV62_CAC0_TX_HAC0_TX = 62, | ||
141 | DB8500_DMA_DEV63_HAC0_TX = 63, | ||
142 | }; | 83 | }; |
143 | 84 | ||
144 | #endif | 85 | #endif |
diff --git a/arch/arm/mach-ux500/usb.c b/arch/arm/mach-ux500/usb.c index 2dfc72f7cd8a..b7bd8d3a5507 100644 --- a/arch/arm/mach-ux500/usb.c +++ b/arch/arm/mach-ux500/usb.c | |||
@@ -14,25 +14,15 @@ | |||
14 | 14 | ||
15 | #define MUSB_DMA40_RX_CH { \ | 15 | #define MUSB_DMA40_RX_CH { \ |
16 | .mode = STEDMA40_MODE_LOGICAL, \ | 16 | .mode = STEDMA40_MODE_LOGICAL, \ |
17 | .dir = STEDMA40_PERIPH_TO_MEM, \ | 17 | .dir = DMA_DEV_TO_MEM, \ |
18 | .dst_dev_type = STEDMA40_DEV_DST_MEMORY, \ | ||
19 | .src_info.data_width = STEDMA40_WORD_WIDTH, \ | ||
20 | .dst_info.data_width = STEDMA40_WORD_WIDTH, \ | ||
21 | .src_info.psize = STEDMA40_PSIZE_LOG_16, \ | ||
22 | .dst_info.psize = STEDMA40_PSIZE_LOG_16, \ | ||
23 | } | 18 | } |
24 | 19 | ||
25 | #define MUSB_DMA40_TX_CH { \ | 20 | #define MUSB_DMA40_TX_CH { \ |
26 | .mode = STEDMA40_MODE_LOGICAL, \ | 21 | .mode = STEDMA40_MODE_LOGICAL, \ |
27 | .dir = STEDMA40_MEM_TO_PERIPH, \ | 22 | .dir = DMA_MEM_TO_DEV, \ |
28 | .src_dev_type = STEDMA40_DEV_SRC_MEMORY, \ | ||
29 | .src_info.data_width = STEDMA40_WORD_WIDTH, \ | ||
30 | .dst_info.data_width = STEDMA40_WORD_WIDTH, \ | ||
31 | .src_info.psize = STEDMA40_PSIZE_LOG_16, \ | ||
32 | .dst_info.psize = STEDMA40_PSIZE_LOG_16, \ | ||
33 | } | 23 | } |
34 | 24 | ||
35 | static struct stedma40_chan_cfg musb_dma_rx_ch[UX500_MUSB_DMA_NUM_RX_CHANNELS] | 25 | static struct stedma40_chan_cfg musb_dma_rx_ch[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS] |
36 | = { | 26 | = { |
37 | MUSB_DMA40_RX_CH, | 27 | MUSB_DMA40_RX_CH, |
38 | MUSB_DMA40_RX_CH, | 28 | MUSB_DMA40_RX_CH, |
@@ -44,7 +34,7 @@ static struct stedma40_chan_cfg musb_dma_rx_ch[UX500_MUSB_DMA_NUM_RX_CHANNELS] | |||
44 | MUSB_DMA40_RX_CH | 34 | MUSB_DMA40_RX_CH |
45 | }; | 35 | }; |
46 | 36 | ||
47 | static struct stedma40_chan_cfg musb_dma_tx_ch[UX500_MUSB_DMA_NUM_TX_CHANNELS] | 37 | static struct stedma40_chan_cfg musb_dma_tx_ch[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS] |
48 | = { | 38 | = { |
49 | MUSB_DMA40_TX_CH, | 39 | MUSB_DMA40_TX_CH, |
50 | MUSB_DMA40_TX_CH, | 40 | MUSB_DMA40_TX_CH, |
@@ -56,7 +46,7 @@ static struct stedma40_chan_cfg musb_dma_tx_ch[UX500_MUSB_DMA_NUM_TX_CHANNELS] | |||
56 | MUSB_DMA40_TX_CH, | 46 | MUSB_DMA40_TX_CH, |
57 | }; | 47 | }; |
58 | 48 | ||
59 | static void *ux500_dma_rx_param_array[UX500_MUSB_DMA_NUM_RX_CHANNELS] = { | 49 | static void *ux500_dma_rx_param_array[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS] = { |
60 | &musb_dma_rx_ch[0], | 50 | &musb_dma_rx_ch[0], |
61 | &musb_dma_rx_ch[1], | 51 | &musb_dma_rx_ch[1], |
62 | &musb_dma_rx_ch[2], | 52 | &musb_dma_rx_ch[2], |
@@ -67,7 +57,7 @@ static void *ux500_dma_rx_param_array[UX500_MUSB_DMA_NUM_RX_CHANNELS] = { | |||
67 | &musb_dma_rx_ch[7] | 57 | &musb_dma_rx_ch[7] |
68 | }; | 58 | }; |
69 | 59 | ||
70 | static void *ux500_dma_tx_param_array[UX500_MUSB_DMA_NUM_TX_CHANNELS] = { | 60 | static void *ux500_dma_tx_param_array[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS] = { |
71 | &musb_dma_tx_ch[0], | 61 | &musb_dma_tx_ch[0], |
72 | &musb_dma_tx_ch[1], | 62 | &musb_dma_tx_ch[1], |
73 | &musb_dma_tx_ch[2], | 63 | &musb_dma_tx_ch[2], |
@@ -81,23 +71,11 @@ static void *ux500_dma_tx_param_array[UX500_MUSB_DMA_NUM_TX_CHANNELS] = { | |||
81 | static struct ux500_musb_board_data musb_board_data = { | 71 | static struct ux500_musb_board_data musb_board_data = { |
82 | .dma_rx_param_array = ux500_dma_rx_param_array, | 72 | .dma_rx_param_array = ux500_dma_rx_param_array, |
83 | .dma_tx_param_array = ux500_dma_tx_param_array, | 73 | .dma_tx_param_array = ux500_dma_tx_param_array, |
84 | .num_rx_channels = UX500_MUSB_DMA_NUM_RX_CHANNELS, | ||
85 | .num_tx_channels = UX500_MUSB_DMA_NUM_TX_CHANNELS, | ||
86 | .dma_filter = stedma40_filter, | 74 | .dma_filter = stedma40_filter, |
87 | }; | 75 | }; |
88 | 76 | ||
89 | static u64 ux500_musb_dmamask = DMA_BIT_MASK(32); | ||
90 | |||
91 | static struct musb_hdrc_config musb_hdrc_config = { | ||
92 | .multipoint = true, | ||
93 | .dyn_fifo = true, | ||
94 | .num_eps = 16, | ||
95 | .ram_bits = 16, | ||
96 | }; | ||
97 | |||
98 | static struct musb_hdrc_platform_data musb_platform_data = { | 77 | static struct musb_hdrc_platform_data musb_platform_data = { |
99 | .mode = MUSB_OTG, | 78 | .mode = MUSB_OTG, |
100 | .config = &musb_hdrc_config, | ||
101 | .board_data = &musb_board_data, | 79 | .board_data = &musb_board_data, |
102 | }; | 80 | }; |
103 | 81 | ||
@@ -118,27 +96,26 @@ struct platform_device ux500_musb_device = { | |||
118 | .id = 0, | 96 | .id = 0, |
119 | .dev = { | 97 | .dev = { |
120 | .platform_data = &musb_platform_data, | 98 | .platform_data = &musb_platform_data, |
121 | .dma_mask = &ux500_musb_dmamask, | ||
122 | .coherent_dma_mask = DMA_BIT_MASK(32), | 99 | .coherent_dma_mask = DMA_BIT_MASK(32), |
123 | }, | 100 | }, |
124 | .num_resources = ARRAY_SIZE(usb_resources), | 101 | .num_resources = ARRAY_SIZE(usb_resources), |
125 | .resource = usb_resources, | 102 | .resource = usb_resources, |
126 | }; | 103 | }; |
127 | 104 | ||
128 | static inline void ux500_usb_dma_update_rx_ch_config(int *src_dev_type) | 105 | static inline void ux500_usb_dma_update_rx_ch_config(int *dev_type) |
129 | { | 106 | { |
130 | u32 idx; | 107 | u32 idx; |
131 | 108 | ||
132 | for (idx = 0; idx < UX500_MUSB_DMA_NUM_RX_CHANNELS; idx++) | 109 | for (idx = 0; idx < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS; idx++) |
133 | musb_dma_rx_ch[idx].src_dev_type = src_dev_type[idx]; | 110 | musb_dma_rx_ch[idx].dev_type = dev_type[idx]; |
134 | } | 111 | } |
135 | 112 | ||
136 | static inline void ux500_usb_dma_update_tx_ch_config(int *dst_dev_type) | 113 | static inline void ux500_usb_dma_update_tx_ch_config(int *dev_type) |
137 | { | 114 | { |
138 | u32 idx; | 115 | u32 idx; |
139 | 116 | ||
140 | for (idx = 0; idx < UX500_MUSB_DMA_NUM_TX_CHANNELS; idx++) | 117 | for (idx = 0; idx < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS; idx++) |
141 | musb_dma_tx_ch[idx].dst_dev_type = dst_dev_type[idx]; | 118 | musb_dma_tx_ch[idx].dev_type = dev_type[idx]; |
142 | } | 119 | } |
143 | 120 | ||
144 | void ux500_add_usb(struct device *parent, resource_size_t base, int irq, | 121 | void ux500_add_usb(struct device *parent, resource_size_t base, int irq, |
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index ce66eb9be481..f82bae2171eb 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig | |||
@@ -86,22 +86,6 @@ config OMAP_MUX_WARNINGS | |||
86 | to change the pin multiplexing setup. When there are no warnings | 86 | to change the pin multiplexing setup. When there are no warnings |
87 | printed, it's safe to deselect OMAP_MUX for your product. | 87 | printed, it's safe to deselect OMAP_MUX for your product. |
88 | 88 | ||
89 | config OMAP_MBOX_FWK | ||
90 | tristate "Mailbox framework support" | ||
91 | depends on ARCH_OMAP && !ARCH_MULTIPLATFORM | ||
92 | help | ||
93 | Say Y here if you want to use OMAP Mailbox framework support for | ||
94 | DSP, IVA1.0 and IVA2 in OMAP1/2/3. | ||
95 | |||
96 | config OMAP_MBOX_KFIFO_SIZE | ||
97 | int "Mailbox kfifo default buffer size (bytes)" | ||
98 | depends on OMAP_MBOX_FWK | ||
99 | default 256 | ||
100 | help | ||
101 | Specify the default size of mailbox's kfifo buffers (bytes). | ||
102 | This can also be changed at runtime (via the mbox_kfifo_size | ||
103 | module parameter). | ||
104 | |||
105 | config OMAP_IOMMU_IVA2 | 89 | config OMAP_IOMMU_IVA2 |
106 | bool | 90 | bool |
107 | 91 | ||
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index 31199417b56a..0b01b68fd033 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile | |||
@@ -17,6 +17,3 @@ obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o | |||
17 | i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o | 17 | i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o |
18 | obj-y += $(i2c-omap-m) $(i2c-omap-y) | 18 | obj-y += $(i2c-omap-m) $(i2c-omap-y) |
19 | 19 | ||
20 | # OMAP mailbox framework | ||
21 | obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o | ||
22 | |||
diff --git a/arch/arm/plat-samsung/include/plat/cpu-freq-core.h b/arch/arm/plat-samsung/include/plat/cpu-freq-core.h index 95509d8eb140..d7e17150028a 100644 --- a/arch/arm/plat-samsung/include/plat/cpu-freq-core.h +++ b/arch/arm/plat-samsung/include/plat/cpu-freq-core.h | |||
@@ -202,7 +202,7 @@ extern int s3c_plltab_register(struct cpufreq_frequency_table *plls, | |||
202 | extern struct s3c_cpufreq_config *s3c_cpufreq_getconfig(void); | 202 | extern struct s3c_cpufreq_config *s3c_cpufreq_getconfig(void); |
203 | extern struct s3c_iotimings *s3c_cpufreq_getiotimings(void); | 203 | extern struct s3c_iotimings *s3c_cpufreq_getiotimings(void); |
204 | 204 | ||
205 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUGFS | 205 | #ifdef CONFIG_ARM_S3C24XX_CPUFREQ_DEBUGFS |
206 | #define s3c_cpufreq_debugfs_call(x) x | 206 | #define s3c_cpufreq_debugfs_call(x) x |
207 | #else | 207 | #else |
208 | #define s3c_cpufreq_debugfs_call(x) NULL | 208 | #define s3c_cpufreq_debugfs_call(x) NULL |
@@ -259,17 +259,17 @@ extern void s3c2412_iotiming_set(struct s3c_cpufreq_config *cfg, | |||
259 | #define s3c2412_iotiming_set NULL | 259 | #define s3c2412_iotiming_set NULL |
260 | #endif /* CONFIG_S3C2412_IOTIMING */ | 260 | #endif /* CONFIG_S3C2412_IOTIMING */ |
261 | 261 | ||
262 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUG | 262 | #ifdef CONFIG_ARM_S3C24XX_CPUFREQ_DEBUG |
263 | #define s3c_freq_dbg(x...) printk(KERN_INFO x) | 263 | #define s3c_freq_dbg(x...) printk(KERN_INFO x) |
264 | #else | 264 | #else |
265 | #define s3c_freq_dbg(x...) do { if (0) printk(x); } while (0) | 265 | #define s3c_freq_dbg(x...) do { if (0) printk(x); } while (0) |
266 | #endif /* CONFIG_CPU_FREQ_S3C24XX_DEBUG */ | 266 | #endif /* CONFIG_ARM_S3C24XX_CPUFREQ_DEBUG */ |
267 | 267 | ||
268 | #ifdef CONFIG_CPU_FREQ_S3C24XX_IODEBUG | 268 | #ifdef CONFIG_ARM_S3C24XX_CPUFREQ_IODEBUG |
269 | #define s3c_freq_iodbg(x...) printk(KERN_INFO x) | 269 | #define s3c_freq_iodbg(x...) printk(KERN_INFO x) |
270 | #else | 270 | #else |
271 | #define s3c_freq_iodbg(x...) do { if (0) printk(x); } while (0) | 271 | #define s3c_freq_iodbg(x...) do { if (0) printk(x); } while (0) |
272 | #endif /* CONFIG_CPU_FREQ_S3C24XX_IODEBUG */ | 272 | #endif /* CONFIG_ARM_S3C24XX_CPUFREQ_IODEBUG */ |
273 | 273 | ||
274 | static inline int s3c_cpufreq_addfreq(struct cpufreq_frequency_table *table, | 274 | static inline int s3c_cpufreq_addfreq(struct cpufreq_frequency_table *table, |
275 | int index, size_t table_size, | 275 | int index, size_t table_size, |
diff --git a/arch/arm/plat-samsung/include/plat/cpu-freq.h b/arch/arm/plat-samsung/include/plat/cpu-freq.h index 80c4a809c721..85517ab962ae 100644 --- a/arch/arm/plat-samsung/include/plat/cpu-freq.h +++ b/arch/arm/plat-samsung/include/plat/cpu-freq.h | |||
@@ -126,7 +126,7 @@ struct s3c_cpufreq_board { | |||
126 | }; | 126 | }; |
127 | 127 | ||
128 | /* Things depending on frequency scaling. */ | 128 | /* Things depending on frequency scaling. */ |
129 | #ifdef CONFIG_CPU_FREQ_S3C | 129 | #ifdef CONFIG_ARM_S3C_CPUFREQ |
130 | #define __init_or_cpufreq | 130 | #define __init_or_cpufreq |
131 | #else | 131 | #else |
132 | #define __init_or_cpufreq __init | 132 | #define __init_or_cpufreq __init |
@@ -134,7 +134,7 @@ struct s3c_cpufreq_board { | |||
134 | 134 | ||
135 | /* Board functions */ | 135 | /* Board functions */ |
136 | 136 | ||
137 | #ifdef CONFIG_CPU_FREQ_S3C | 137 | #ifdef CONFIG_ARM_S3C_CPUFREQ |
138 | extern int s3c_cpufreq_setboard(struct s3c_cpufreq_board *board); | 138 | extern int s3c_cpufreq_setboard(struct s3c_cpufreq_board *board); |
139 | #else | 139 | #else |
140 | 140 | ||
@@ -142,4 +142,4 @@ static inline int s3c_cpufreq_setboard(struct s3c_cpufreq_board *board) | |||
142 | { | 142 | { |
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | #endif /* CONFIG_CPU_FREQ_S3C */ | 145 | #endif /* CONFIG_ARM_S3C_CPUFREQ */ |
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile index b7c232e67425..187681013bdb 100644 --- a/drivers/clk/samsung/Makefile +++ b/drivers/clk/samsung/Makefile | |||
@@ -6,3 +6,4 @@ obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o | |||
6 | obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o | 6 | obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o |
7 | obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o | 7 | obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o |
8 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o | 8 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o |
9 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o | ||
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c new file mode 100644 index 000000000000..9b1bbd52fd1f --- /dev/null +++ b/drivers/clk/samsung/clk-exynos-audss.c | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Samsung Electronics Co., Ltd. | ||
3 | * Author: Padmavathi Venna <padma.v@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * Common Clock Framework support for Audio Subsystem Clock Controller. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clkdev.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/of_address.h> | ||
16 | #include <linux/syscore_ops.h> | ||
17 | |||
18 | #include <dt-bindings/clk/exynos-audss-clk.h> | ||
19 | |||
20 | static DEFINE_SPINLOCK(lock); | ||
21 | static struct clk **clk_table; | ||
22 | static void __iomem *reg_base; | ||
23 | static struct clk_onecell_data clk_data; | ||
24 | |||
25 | #define ASS_CLK_SRC 0x0 | ||
26 | #define ASS_CLK_DIV 0x4 | ||
27 | #define ASS_CLK_GATE 0x8 | ||
28 | |||
29 | static unsigned long reg_save[][2] = { | ||
30 | {ASS_CLK_SRC, 0}, | ||
31 | {ASS_CLK_DIV, 0}, | ||
32 | {ASS_CLK_GATE, 0}, | ||
33 | }; | ||
34 | |||
35 | /* list of all parent clock list */ | ||
36 | static const char *mout_audss_p[] = { "fin_pll", "fout_epll" }; | ||
37 | static const char *mout_i2s_p[] = { "mout_audss", "cdclk0", "sclk_audio0" }; | ||
38 | |||
39 | #ifdef CONFIG_PM_SLEEP | ||
40 | static int exynos_audss_clk_suspend(void) | ||
41 | { | ||
42 | int i; | ||
43 | |||
44 | for (i = 0; i < ARRAY_SIZE(reg_save); i++) | ||
45 | reg_save[i][1] = readl(reg_base + reg_save[i][0]); | ||
46 | |||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | static void exynos_audss_clk_resume(void) | ||
51 | { | ||
52 | int i; | ||
53 | |||
54 | for (i = 0; i < ARRAY_SIZE(reg_save); i++) | ||
55 | writel(reg_save[i][1], reg_base + reg_save[i][0]); | ||
56 | } | ||
57 | |||
58 | static struct syscore_ops exynos_audss_clk_syscore_ops = { | ||
59 | .suspend = exynos_audss_clk_suspend, | ||
60 | .resume = exynos_audss_clk_resume, | ||
61 | }; | ||
62 | #endif /* CONFIG_PM_SLEEP */ | ||
63 | |||
64 | /* register exynos_audss clocks */ | ||
65 | void __init exynos_audss_clk_init(struct device_node *np) | ||
66 | { | ||
67 | reg_base = of_iomap(np, 0); | ||
68 | if (!reg_base) { | ||
69 | pr_err("%s: failed to map audss registers\n", __func__); | ||
70 | return; | ||
71 | } | ||
72 | |||
73 | clk_table = kzalloc(sizeof(struct clk *) * EXYNOS_AUDSS_MAX_CLKS, | ||
74 | GFP_KERNEL); | ||
75 | if (!clk_table) { | ||
76 | pr_err("%s: could not allocate clk lookup table\n", __func__); | ||
77 | return; | ||
78 | } | ||
79 | |||
80 | clk_data.clks = clk_table; | ||
81 | clk_data.clk_num = EXYNOS_AUDSS_MAX_CLKS; | ||
82 | of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); | ||
83 | |||
84 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", | ||
85 | mout_audss_p, ARRAY_SIZE(mout_audss_p), 0, | ||
86 | reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); | ||
87 | |||
88 | clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", | ||
89 | mout_i2s_p, ARRAY_SIZE(mout_i2s_p), 0, | ||
90 | reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); | ||
91 | |||
92 | clk_table[EXYNOS_DOUT_SRP] = clk_register_divider(NULL, "dout_srp", | ||
93 | "mout_audss", 0, reg_base + ASS_CLK_DIV, 0, 4, | ||
94 | 0, &lock); | ||
95 | |||
96 | clk_table[EXYNOS_DOUT_AUD_BUS] = clk_register_divider(NULL, | ||
97 | "dout_aud_bus", "dout_srp", 0, | ||
98 | reg_base + ASS_CLK_DIV, 4, 4, 0, &lock); | ||
99 | |||
100 | clk_table[EXYNOS_DOUT_I2S] = clk_register_divider(NULL, "dout_i2s", | ||
101 | "mout_i2s", 0, reg_base + ASS_CLK_DIV, 8, 4, 0, | ||
102 | &lock); | ||
103 | |||
104 | clk_table[EXYNOS_SRP_CLK] = clk_register_gate(NULL, "srp_clk", | ||
105 | "dout_srp", CLK_SET_RATE_PARENT, | ||
106 | reg_base + ASS_CLK_GATE, 0, 0, &lock); | ||
107 | |||
108 | clk_table[EXYNOS_I2S_BUS] = clk_register_gate(NULL, "i2s_bus", | ||
109 | "dout_aud_bus", CLK_SET_RATE_PARENT, | ||
110 | reg_base + ASS_CLK_GATE, 2, 0, &lock); | ||
111 | |||
112 | clk_table[EXYNOS_SCLK_I2S] = clk_register_gate(NULL, "sclk_i2s", | ||
113 | "dout_i2s", CLK_SET_RATE_PARENT, | ||
114 | reg_base + ASS_CLK_GATE, 3, 0, &lock); | ||
115 | |||
116 | clk_table[EXYNOS_PCM_BUS] = clk_register_gate(NULL, "pcm_bus", | ||
117 | "sclk_pcm", CLK_SET_RATE_PARENT, | ||
118 | reg_base + ASS_CLK_GATE, 4, 0, &lock); | ||
119 | |||
120 | clk_table[EXYNOS_SCLK_PCM] = clk_register_gate(NULL, "sclk_pcm", | ||
121 | "div_pcm0", CLK_SET_RATE_PARENT, | ||
122 | reg_base + ASS_CLK_GATE, 5, 0, &lock); | ||
123 | |||
124 | #ifdef CONFIG_PM_SLEEP | ||
125 | register_syscore_ops(&exynos_audss_clk_syscore_ops); | ||
126 | #endif | ||
127 | |||
128 | pr_info("Exynos: Audss: clock setup completed\n"); | ||
129 | } | ||
130 | CLK_OF_DECLARE(exynos4210_audss_clk, "samsung,exynos4210-audss-clock", | ||
131 | exynos_audss_clk_init); | ||
132 | CLK_OF_DECLARE(exynos5250_audss_clk, "samsung,exynos5250-audss-clock", | ||
133 | exynos_audss_clk_init); | ||
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c index 22d7699e7ced..6f767c515ec7 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c | |||
@@ -87,6 +87,7 @@ enum exynos5250_clks { | |||
87 | sclk_mmc0, sclk_mmc1, sclk_mmc2, sclk_mmc3, sclk_sata, sclk_usb3, | 87 | sclk_mmc0, sclk_mmc1, sclk_mmc2, sclk_mmc3, sclk_sata, sclk_usb3, |
88 | sclk_jpeg, sclk_uart0, sclk_uart1, sclk_uart2, sclk_uart3, sclk_pwm, | 88 | sclk_jpeg, sclk_uart0, sclk_uart1, sclk_uart2, sclk_uart3, sclk_pwm, |
89 | sclk_audio1, sclk_audio2, sclk_spdif, sclk_spi0, sclk_spi1, sclk_spi2, | 89 | sclk_audio1, sclk_audio2, sclk_spdif, sclk_spi0, sclk_spi1, sclk_spi2, |
90 | div_i2s1, div_i2s2, | ||
90 | 91 | ||
91 | /* gate clocks */ | 92 | /* gate clocks */ |
92 | gscl0 = 256, gscl1, gscl2, gscl3, gscl_wa, gscl_wb, smmu_gscl0, | 93 | gscl0 = 256, gscl1, gscl2, gscl3, gscl_wa, gscl_wb, smmu_gscl0, |
@@ -291,8 +292,8 @@ struct samsung_div_clock exynos5250_div_clks[] __initdata = { | |||
291 | DIV(none, "div_pcm1", "sclk_audio1", DIV_PERIC4, 4, 8), | 292 | DIV(none, "div_pcm1", "sclk_audio1", DIV_PERIC4, 4, 8), |
292 | DIV(none, "div_audio2", "mout_audio2", DIV_PERIC4, 16, 4), | 293 | DIV(none, "div_audio2", "mout_audio2", DIV_PERIC4, 16, 4), |
293 | DIV(none, "div_pcm2", "sclk_audio2", DIV_PERIC4, 20, 8), | 294 | DIV(none, "div_pcm2", "sclk_audio2", DIV_PERIC4, 20, 8), |
294 | DIV(none, "div_i2s1", "sclk_audio1", DIV_PERIC5, 0, 6), | 295 | DIV(div_i2s1, "div_i2s1", "sclk_audio1", DIV_PERIC5, 0, 6), |
295 | DIV(none, "div_i2s2", "sclk_audio2", DIV_PERIC5, 8, 6), | 296 | DIV(div_i2s2, "div_i2s2", "sclk_audio2", DIV_PERIC5, 8, 6), |
296 | DIV(sclk_pixel, "div_hdmi_pixel", "sclk_vpll", DIV_DISP1_0, 28, 4), | 297 | DIV(sclk_pixel, "div_hdmi_pixel", "sclk_vpll", DIV_DISP1_0, 28, 4), |
297 | DIV_A(none, "armclk", "div_arm", DIV_CPU0, 28, 3, "armclk"), | 298 | DIV_A(none, "armclk", "div_arm", DIV_CPU0, 28, 3, "armclk"), |
298 | DIV_F(none, "div_mipi1_pre", "div_mipi1", | 299 | DIV_F(none, "div_mipi1_pre", "div_mipi1", |
diff --git a/drivers/clocksource/clksrc-dbx500-prcmu.c b/drivers/clocksource/clksrc-dbx500-prcmu.c index 54f3d119d99c..77398f8c19a0 100644 --- a/drivers/clocksource/clksrc-dbx500-prcmu.c +++ b/drivers/clocksource/clksrc-dbx500-prcmu.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * DBx500-PRCMU Timer | 10 | * DBx500-PRCMU Timer |
11 | * The PRCMU has 5 timers which are available in a always-on | 11 | * The PRCMU has 5 timers which are available in a always-on |
12 | * power domain. We use the Timer 4 for our always-on clock | 12 | * power domain. We use the Timer 4 for our always-on clock |
13 | * source on DB8500 and Timer 3 on DB5500. | 13 | * source on DB8500. |
14 | */ | 14 | */ |
15 | #include <linux/clockchips.h> | 15 | #include <linux/clockchips.h> |
16 | #include <linux/clksrc-dbx500-prcmu.h> | 16 | #include <linux/clksrc-dbx500-prcmu.h> |
@@ -30,15 +30,14 @@ | |||
30 | 30 | ||
31 | static void __iomem *clksrc_dbx500_timer_base; | 31 | static void __iomem *clksrc_dbx500_timer_base; |
32 | 32 | ||
33 | static cycle_t clksrc_dbx500_prcmu_read(struct clocksource *cs) | 33 | static cycle_t notrace clksrc_dbx500_prcmu_read(struct clocksource *cs) |
34 | { | 34 | { |
35 | void __iomem *base = clksrc_dbx500_timer_base; | ||
35 | u32 count, count2; | 36 | u32 count, count2; |
36 | 37 | ||
37 | do { | 38 | do { |
38 | count = readl(clksrc_dbx500_timer_base + | 39 | count = readl_relaxed(base + PRCMU_TIMER_DOWNCOUNT); |
39 | PRCMU_TIMER_DOWNCOUNT); | 40 | count2 = readl_relaxed(base + PRCMU_TIMER_DOWNCOUNT); |
40 | count2 = readl(clksrc_dbx500_timer_base + | ||
41 | PRCMU_TIMER_DOWNCOUNT); | ||
42 | } while (count2 != count); | 41 | } while (count2 != count); |
43 | 42 | ||
44 | /* Negate because the timer is a decrementing counter */ | 43 | /* Negate because the timer is a decrementing counter */ |
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 6e57543fe0b9..a92440896868 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
@@ -96,6 +96,56 @@ config ARM_OMAP2PLUS_CPUFREQ | |||
96 | default ARCH_OMAP2PLUS | 96 | default ARCH_OMAP2PLUS |
97 | select CPU_FREQ_TABLE | 97 | select CPU_FREQ_TABLE |
98 | 98 | ||
99 | config ARM_S3C_CPUFREQ | ||
100 | bool | ||
101 | help | ||
102 | Internal configuration node for common cpufreq on Samsung SoC | ||
103 | |||
104 | config ARM_S3C24XX_CPUFREQ | ||
105 | bool "CPUfreq driver for Samsung S3C24XX series CPUs (EXPERIMENTAL)" | ||
106 | depends on ARCH_S3C24XX | ||
107 | select ARM_S3C_CPUFREQ | ||
108 | help | ||
109 | This enables the CPUfreq driver for the Samsung S3C24XX family | ||
110 | of CPUs. | ||
111 | |||
112 | For details, take a look at <file:Documentation/cpu-freq>. | ||
113 | |||
114 | If in doubt, say N. | ||
115 | |||
116 | config ARM_S3C24XX_CPUFREQ_DEBUG | ||
117 | bool "Debug CPUfreq Samsung driver core" | ||
118 | depends on ARM_S3C24XX_CPUFREQ | ||
119 | help | ||
120 | Enable s3c_freq_dbg for the Samsung S3C CPUfreq core | ||
121 | |||
122 | config ARM_S3C24XX_CPUFREQ_IODEBUG | ||
123 | bool "Debug CPUfreq Samsung driver IO timing" | ||
124 | depends on ARM_S3C24XX_CPUFREQ | ||
125 | help | ||
126 | Enable s3c_freq_iodbg for the Samsung S3C CPUfreq core | ||
127 | |||
128 | config ARM_S3C24XX_CPUFREQ_DEBUGFS | ||
129 | bool "Export debugfs for CPUFreq" | ||
130 | depends on ARM_S3C24XX_CPUFREQ && DEBUG_FS | ||
131 | help | ||
132 | Export status information via debugfs. | ||
133 | |||
134 | config ARM_S3C2410_CPUFREQ | ||
135 | bool | ||
136 | depends on ARM_S3C24XX_CPUFREQ && CPU_S3C2410 | ||
137 | select S3C2410_CPUFREQ_UTILS | ||
138 | help | ||
139 | CPU Frequency scaling support for S3C2410 | ||
140 | |||
141 | config ARM_S3C2412_CPUFREQ | ||
142 | bool | ||
143 | depends on ARM_S3C24XX_CPUFREQ && CPU_S3C2412 | ||
144 | default y | ||
145 | select S3C2412_IOTIMING | ||
146 | help | ||
147 | CPU Frequency scaling support for S3C2412 and S3C2413 SoC CPUs. | ||
148 | |||
99 | config ARM_S3C2416_CPUFREQ | 149 | config ARM_S3C2416_CPUFREQ |
100 | bool "S3C2416 CPU Frequency scaling support" | 150 | bool "S3C2416 CPU Frequency scaling support" |
101 | depends on CPU_S3C2416 | 151 | depends on CPU_S3C2416 |
@@ -118,6 +168,14 @@ config ARM_S3C2416_CPUFREQ_VCORESCALE | |||
118 | 168 | ||
119 | If in doubt, say N. | 169 | If in doubt, say N. |
120 | 170 | ||
171 | config ARM_S3C2440_CPUFREQ | ||
172 | bool "S3C2440/S3C2442 CPU Frequency scaling support" | ||
173 | depends on ARM_S3C24XX_CPUFREQ && (CPU_S3C2440 || CPU_S3C2442) | ||
174 | select S3C2410_CPUFREQ_UTILS | ||
175 | default y | ||
176 | help | ||
177 | CPU Frequency scaling support for S3C2440 and S3C2442 SoC CPUs. | ||
178 | |||
121 | config ARM_S3C64XX_CPUFREQ | 179 | config ARM_S3C64XX_CPUFREQ |
122 | bool "Samsung S3C64XX" | 180 | bool "Samsung S3C64XX" |
123 | depends on CPU_S3C6410 | 181 | depends on CPU_S3C6410 |
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 315b9231feb1..6ad0b913ca17 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile | |||
@@ -65,7 +65,12 @@ obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ) += omap-cpufreq.o | |||
65 | obj-$(CONFIG_PXA25x) += pxa2xx-cpufreq.o | 65 | obj-$(CONFIG_PXA25x) += pxa2xx-cpufreq.o |
66 | obj-$(CONFIG_PXA27x) += pxa2xx-cpufreq.o | 66 | obj-$(CONFIG_PXA27x) += pxa2xx-cpufreq.o |
67 | obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o | 67 | obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o |
68 | obj-$(CONFIG_ARM_S3C24XX_CPUFREQ) += s3c24xx-cpufreq.o | ||
69 | obj-$(CONFIG_ARM_S3C24XX_CPUFREQ_DEBUGFS) += s3c24xx-cpufreq-debugfs.o | ||
70 | obj-$(CONFIG_ARM_S3C2410_CPUFREQ) += s3c2410-cpufreq.o | ||
71 | obj-$(CONFIG_ARM_S3C2412_CPUFREQ) += s3c2412-cpufreq.o | ||
68 | obj-$(CONFIG_ARM_S3C2416_CPUFREQ) += s3c2416-cpufreq.o | 72 | obj-$(CONFIG_ARM_S3C2416_CPUFREQ) += s3c2416-cpufreq.o |
73 | obj-$(CONFIG_ARM_S3C2440_CPUFREQ) += s3c2440-cpufreq.o | ||
69 | obj-$(CONFIG_ARM_S3C64XX_CPUFREQ) += s3c64xx-cpufreq.o | 74 | obj-$(CONFIG_ARM_S3C64XX_CPUFREQ) += s3c64xx-cpufreq.o |
70 | obj-$(CONFIG_ARM_S5PV210_CPUFREQ) += s5pv210-cpufreq.o | 75 | obj-$(CONFIG_ARM_S5PV210_CPUFREQ) += s5pv210-cpufreq.o |
71 | obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o | 76 | obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o |
diff --git a/arch/arm/mach-s3c24xx/cpufreq-s3c2410.c b/drivers/cpufreq/s3c2410-cpufreq.c index cfa0dd8723ec..cfa0dd8723ec 100644 --- a/arch/arm/mach-s3c24xx/cpufreq-s3c2410.c +++ b/drivers/cpufreq/s3c2410-cpufreq.c | |||
diff --git a/arch/arm/mach-s3c24xx/cpufreq-s3c2412.c b/drivers/cpufreq/s3c2412-cpufreq.c index 8bf0f3a77476..4645b4898996 100644 --- a/arch/arm/mach-s3c24xx/cpufreq-s3c2412.c +++ b/drivers/cpufreq/s3c2412-cpufreq.c | |||
@@ -25,13 +25,12 @@ | |||
25 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
26 | 26 | ||
27 | #include <mach/regs-clock.h> | 27 | #include <mach/regs-clock.h> |
28 | #include <mach/s3c2412.h> | ||
28 | 29 | ||
29 | #include <plat/cpu.h> | 30 | #include <plat/cpu.h> |
30 | #include <plat/clock.h> | 31 | #include <plat/clock.h> |
31 | #include <plat/cpu-freq-core.h> | 32 | #include <plat/cpu-freq-core.h> |
32 | 33 | ||
33 | #include "s3c2412.h" | ||
34 | |||
35 | /* our clock resources. */ | 34 | /* our clock resources. */ |
36 | static struct clk *xtal; | 35 | static struct clk *xtal; |
37 | static struct clk *fclk; | 36 | static struct clk *fclk; |
diff --git a/arch/arm/mach-s3c24xx/cpufreq-s3c2440.c b/drivers/cpufreq/s3c2440-cpufreq.c index 72b2cc8a5a85..72b2cc8a5a85 100644 --- a/arch/arm/mach-s3c24xx/cpufreq-s3c2440.c +++ b/drivers/cpufreq/s3c2440-cpufreq.c | |||
diff --git a/arch/arm/mach-s3c24xx/cpufreq-debugfs.c b/drivers/cpufreq/s3c24xx-cpufreq-debugfs.c index 9b7b4289d66c..9b7b4289d66c 100644 --- a/arch/arm/mach-s3c24xx/cpufreq-debugfs.c +++ b/drivers/cpufreq/s3c24xx-cpufreq-debugfs.c | |||
diff --git a/arch/arm/mach-s3c24xx/cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c index 3c0e78ede0da..3c0e78ede0da 100644 --- a/arch/arm/mach-s3c24xx/cpufreq.c +++ b/drivers/cpufreq/s3c24xx-cpufreq.c | |||
diff --git a/drivers/crypto/ux500/cryp/cryp.c b/drivers/crypto/ux500/cryp/cryp.c index 3eafa903ebcd..43a0c8a26ab0 100644 --- a/drivers/crypto/ux500/cryp/cryp.c +++ b/drivers/crypto/ux500/cryp/cryp.c | |||
@@ -291,7 +291,7 @@ void cryp_save_device_context(struct cryp_device_data *device_data, | |||
291 | int cryp_mode) | 291 | int cryp_mode) |
292 | { | 292 | { |
293 | enum cryp_algo_mode algomode; | 293 | enum cryp_algo_mode algomode; |
294 | struct cryp_register *src_reg = device_data->base; | 294 | struct cryp_register __iomem *src_reg = device_data->base; |
295 | struct cryp_config *config = | 295 | struct cryp_config *config = |
296 | (struct cryp_config *)device_data->current_ctx; | 296 | (struct cryp_config *)device_data->current_ctx; |
297 | 297 | ||
@@ -349,7 +349,7 @@ void cryp_save_device_context(struct cryp_device_data *device_data, | |||
349 | void cryp_restore_device_context(struct cryp_device_data *device_data, | 349 | void cryp_restore_device_context(struct cryp_device_data *device_data, |
350 | struct cryp_device_context *ctx) | 350 | struct cryp_device_context *ctx) |
351 | { | 351 | { |
352 | struct cryp_register *reg = device_data->base; | 352 | struct cryp_register __iomem *reg = device_data->base; |
353 | struct cryp_config *config = | 353 | struct cryp_config *config = |
354 | (struct cryp_config *)device_data->current_ctx; | 354 | (struct cryp_config *)device_data->current_ctx; |
355 | 355 | ||
diff --git a/drivers/crypto/ux500/cryp/cryp.h b/drivers/crypto/ux500/cryp/cryp.h index 14cfd05b777a..d1d6606fe56c 100644 --- a/drivers/crypto/ux500/cryp/cryp.h +++ b/drivers/crypto/ux500/cryp/cryp.h | |||
@@ -114,6 +114,9 @@ enum cryp_status_id { | |||
114 | }; | 114 | }; |
115 | 115 | ||
116 | /* Cryp DMA interface */ | 116 | /* Cryp DMA interface */ |
117 | #define CRYP_DMA_TX_FIFO 0x08 | ||
118 | #define CRYP_DMA_RX_FIFO 0x10 | ||
119 | |||
117 | enum cryp_dma_req_type { | 120 | enum cryp_dma_req_type { |
118 | CRYP_DMA_DISABLE_BOTH, | 121 | CRYP_DMA_DISABLE_BOTH, |
119 | CRYP_DMA_ENABLE_IN_DATA, | 122 | CRYP_DMA_ENABLE_IN_DATA, |
@@ -217,7 +220,8 @@ struct cryp_dma { | |||
217 | 220 | ||
218 | /** | 221 | /** |
219 | * struct cryp_device_data - structure for a cryp device. | 222 | * struct cryp_device_data - structure for a cryp device. |
220 | * @base: Pointer to the hardware base address. | 223 | * @base: Pointer to virtual base address of the cryp device. |
224 | * @phybase: Pointer to physical memory location of the cryp device. | ||
221 | * @dev: Pointer to the devices dev structure. | 225 | * @dev: Pointer to the devices dev structure. |
222 | * @clk: Pointer to the device's clock control. | 226 | * @clk: Pointer to the device's clock control. |
223 | * @pwr_regulator: Pointer to the device's power control. | 227 | * @pwr_regulator: Pointer to the device's power control. |
@@ -232,6 +236,7 @@ struct cryp_dma { | |||
232 | */ | 236 | */ |
233 | struct cryp_device_data { | 237 | struct cryp_device_data { |
234 | struct cryp_register __iomem *base; | 238 | struct cryp_register __iomem *base; |
239 | phys_addr_t phybase; | ||
235 | struct device *dev; | 240 | struct device *dev; |
236 | struct clk *clk; | 241 | struct clk *clk; |
237 | struct regulator *pwr_regulator; | 242 | struct regulator *pwr_regulator; |
diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c index 8c2777cf02f6..83d79b964d12 100644 --- a/drivers/crypto/ux500/cryp/cryp_core.c +++ b/drivers/crypto/ux500/cryp/cryp_core.c | |||
@@ -475,6 +475,19 @@ static int cryp_get_device_data(struct cryp_ctx *ctx, | |||
475 | static void cryp_dma_setup_channel(struct cryp_device_data *device_data, | 475 | static void cryp_dma_setup_channel(struct cryp_device_data *device_data, |
476 | struct device *dev) | 476 | struct device *dev) |
477 | { | 477 | { |
478 | struct dma_slave_config mem2cryp = { | ||
479 | .direction = DMA_MEM_TO_DEV, | ||
480 | .dst_addr = device_data->phybase + CRYP_DMA_TX_FIFO, | ||
481 | .dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES, | ||
482 | .dst_maxburst = 4, | ||
483 | }; | ||
484 | struct dma_slave_config cryp2mem = { | ||
485 | .direction = DMA_DEV_TO_MEM, | ||
486 | .src_addr = device_data->phybase + CRYP_DMA_RX_FIFO, | ||
487 | .src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES, | ||
488 | .src_maxburst = 4, | ||
489 | }; | ||
490 | |||
478 | dma_cap_zero(device_data->dma.mask); | 491 | dma_cap_zero(device_data->dma.mask); |
479 | dma_cap_set(DMA_SLAVE, device_data->dma.mask); | 492 | dma_cap_set(DMA_SLAVE, device_data->dma.mask); |
480 | 493 | ||
@@ -490,6 +503,9 @@ static void cryp_dma_setup_channel(struct cryp_device_data *device_data, | |||
490 | stedma40_filter, | 503 | stedma40_filter, |
491 | device_data->dma.cfg_cryp2mem); | 504 | device_data->dma.cfg_cryp2mem); |
492 | 505 | ||
506 | dmaengine_slave_config(device_data->dma.chan_mem2cryp, &mem2cryp); | ||
507 | dmaengine_slave_config(device_data->dma.chan_cryp2mem, &cryp2mem); | ||
508 | |||
493 | init_completion(&device_data->dma.cryp_dma_complete); | 509 | init_completion(&device_data->dma.cryp_dma_complete); |
494 | } | 510 | } |
495 | 511 | ||
@@ -537,10 +553,10 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx, | |||
537 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " | 553 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " |
538 | "(TO_DEVICE)", __func__); | 554 | "(TO_DEVICE)", __func__); |
539 | 555 | ||
540 | desc = channel->device->device_prep_slave_sg(channel, | 556 | desc = dmaengine_prep_slave_sg(channel, |
541 | ctx->device->dma.sg_src, | 557 | ctx->device->dma.sg_src, |
542 | ctx->device->dma.sg_src_len, | 558 | ctx->device->dma.sg_src_len, |
543 | direction, DMA_CTRL_ACK, NULL); | 559 | direction, DMA_CTRL_ACK); |
544 | break; | 560 | break; |
545 | 561 | ||
546 | case DMA_FROM_DEVICE: | 562 | case DMA_FROM_DEVICE: |
@@ -561,12 +577,12 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx, | |||
561 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " | 577 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " |
562 | "(FROM_DEVICE)", __func__); | 578 | "(FROM_DEVICE)", __func__); |
563 | 579 | ||
564 | desc = channel->device->device_prep_slave_sg(channel, | 580 | desc = dmaengine_prep_slave_sg(channel, |
565 | ctx->device->dma.sg_dst, | 581 | ctx->device->dma.sg_dst, |
566 | ctx->device->dma.sg_dst_len, | 582 | ctx->device->dma.sg_dst_len, |
567 | direction, | 583 | direction, |
568 | DMA_CTRL_ACK | | 584 | DMA_CTRL_ACK | |
569 | DMA_PREP_INTERRUPT, NULL); | 585 | DMA_PREP_INTERRUPT); |
570 | 586 | ||
571 | desc->callback = cryp_dma_out_callback; | 587 | desc->callback = cryp_dma_out_callback; |
572 | desc->callback_param = ctx; | 588 | desc->callback_param = ctx; |
@@ -578,7 +594,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx, | |||
578 | return -EFAULT; | 594 | return -EFAULT; |
579 | } | 595 | } |
580 | 596 | ||
581 | cookie = desc->tx_submit(desc); | 597 | cookie = dmaengine_submit(desc); |
582 | dma_async_issue_pending(channel); | 598 | dma_async_issue_pending(channel); |
583 | 599 | ||
584 | return 0; | 600 | return 0; |
@@ -591,12 +607,12 @@ static void cryp_dma_done(struct cryp_ctx *ctx) | |||
591 | dev_dbg(ctx->device->dev, "[%s]: ", __func__); | 607 | dev_dbg(ctx->device->dev, "[%s]: ", __func__); |
592 | 608 | ||
593 | chan = ctx->device->dma.chan_mem2cryp; | 609 | chan = ctx->device->dma.chan_mem2cryp; |
594 | chan->device->device_control(chan, DMA_TERMINATE_ALL, 0); | 610 | dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); |
595 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg_src, | 611 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg_src, |
596 | ctx->device->dma.sg_src_len, DMA_TO_DEVICE); | 612 | ctx->device->dma.sg_src_len, DMA_TO_DEVICE); |
597 | 613 | ||
598 | chan = ctx->device->dma.chan_cryp2mem; | 614 | chan = ctx->device->dma.chan_cryp2mem; |
599 | chan->device->device_control(chan, DMA_TERMINATE_ALL, 0); | 615 | dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); |
600 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg_dst, | 616 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg_dst, |
601 | ctx->device->dma.sg_dst_len, DMA_FROM_DEVICE); | 617 | ctx->device->dma.sg_dst_len, DMA_FROM_DEVICE); |
602 | } | 618 | } |
@@ -1431,6 +1447,7 @@ static int ux500_cryp_probe(struct platform_device *pdev) | |||
1431 | goto out_kfree; | 1447 | goto out_kfree; |
1432 | } | 1448 | } |
1433 | 1449 | ||
1450 | device_data->phybase = res->start; | ||
1434 | device_data->base = ioremap(res->start, resource_size(res)); | 1451 | device_data->base = ioremap(res->start, resource_size(res)); |
1435 | if (!device_data->base) { | 1452 | if (!device_data->base) { |
1436 | dev_err(dev, "[%s]: ioremap failed!", __func__); | 1453 | dev_err(dev, "[%s]: ioremap failed!", __func__); |
@@ -1458,11 +1475,17 @@ static int ux500_cryp_probe(struct platform_device *pdev) | |||
1458 | goto out_regulator; | 1475 | goto out_regulator; |
1459 | } | 1476 | } |
1460 | 1477 | ||
1478 | ret = clk_prepare(device_data->clk); | ||
1479 | if (ret) { | ||
1480 | dev_err(dev, "[%s]: clk_prepare() failed!", __func__); | ||
1481 | goto out_clk; | ||
1482 | } | ||
1483 | |||
1461 | /* Enable device power (and clock) */ | 1484 | /* Enable device power (and clock) */ |
1462 | ret = cryp_enable_power(device_data->dev, device_data, false); | 1485 | ret = cryp_enable_power(device_data->dev, device_data, false); |
1463 | if (ret) { | 1486 | if (ret) { |
1464 | dev_err(dev, "[%s]: cryp_enable_power() failed!", __func__); | 1487 | dev_err(dev, "[%s]: cryp_enable_power() failed!", __func__); |
1465 | goto out_clk; | 1488 | goto out_clk_unprepare; |
1466 | } | 1489 | } |
1467 | 1490 | ||
1468 | cryp_error = cryp_check(device_data); | 1491 | cryp_error = cryp_check(device_data); |
@@ -1518,11 +1541,16 @@ static int ux500_cryp_probe(struct platform_device *pdev) | |||
1518 | goto out_power; | 1541 | goto out_power; |
1519 | } | 1542 | } |
1520 | 1543 | ||
1544 | dev_info(dev, "successfully registered\n"); | ||
1545 | |||
1521 | return 0; | 1546 | return 0; |
1522 | 1547 | ||
1523 | out_power: | 1548 | out_power: |
1524 | cryp_disable_power(device_data->dev, device_data, false); | 1549 | cryp_disable_power(device_data->dev, device_data, false); |
1525 | 1550 | ||
1551 | out_clk_unprepare: | ||
1552 | clk_unprepare(device_data->clk); | ||
1553 | |||
1526 | out_clk: | 1554 | out_clk: |
1527 | clk_put(device_data->clk); | 1555 | clk_put(device_data->clk); |
1528 | 1556 | ||
@@ -1593,6 +1621,7 @@ static int ux500_cryp_remove(struct platform_device *pdev) | |||
1593 | dev_err(&pdev->dev, "[%s]: cryp_disable_power() failed", | 1621 | dev_err(&pdev->dev, "[%s]: cryp_disable_power() failed", |
1594 | __func__); | 1622 | __func__); |
1595 | 1623 | ||
1624 | clk_unprepare(device_data->clk); | ||
1596 | clk_put(device_data->clk); | 1625 | clk_put(device_data->clk); |
1597 | regulator_put(device_data->pwr_regulator); | 1626 | regulator_put(device_data->pwr_regulator); |
1598 | 1627 | ||
diff --git a/drivers/crypto/ux500/hash/hash_alg.h b/drivers/crypto/ux500/hash/hash_alg.h index cd9351cb24df..be6eb54da40f 100644 --- a/drivers/crypto/ux500/hash/hash_alg.h +++ b/drivers/crypto/ux500/hash/hash_alg.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/bitops.h> | 11 | #include <linux/bitops.h> |
12 | 12 | ||
13 | #define HASH_BLOCK_SIZE 64 | 13 | #define HASH_BLOCK_SIZE 64 |
14 | #define HASH_DMA_FIFO 4 | ||
14 | #define HASH_DMA_ALIGN_SIZE 4 | 15 | #define HASH_DMA_ALIGN_SIZE 4 |
15 | #define HASH_DMA_PERFORMANCE_MIN_SIZE 1024 | 16 | #define HASH_DMA_PERFORMANCE_MIN_SIZE 1024 |
16 | #define HASH_BYTES_PER_WORD 4 | 17 | #define HASH_BYTES_PER_WORD 4 |
@@ -347,7 +348,8 @@ struct hash_req_ctx { | |||
347 | 348 | ||
348 | /** | 349 | /** |
349 | * struct hash_device_data - structure for a hash device. | 350 | * struct hash_device_data - structure for a hash device. |
350 | * @base: Pointer to the hardware base address. | 351 | * @base: Pointer to virtual base address of the hash device. |
352 | * @phybase: Pointer to physical memory location of the hash device. | ||
351 | * @list_node: For inclusion in klist. | 353 | * @list_node: For inclusion in klist. |
352 | * @dev: Pointer to the device dev structure. | 354 | * @dev: Pointer to the device dev structure. |
353 | * @ctx_lock: Spinlock for current_ctx. | 355 | * @ctx_lock: Spinlock for current_ctx. |
@@ -361,6 +363,7 @@ struct hash_req_ctx { | |||
361 | */ | 363 | */ |
362 | struct hash_device_data { | 364 | struct hash_device_data { |
363 | struct hash_register __iomem *base; | 365 | struct hash_register __iomem *base; |
366 | phys_addr_t phybase; | ||
364 | struct klist_node list_node; | 367 | struct klist_node list_node; |
365 | struct device *dev; | 368 | struct device *dev; |
366 | struct spinlock ctx_lock; | 369 | struct spinlock ctx_lock; |
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c index 3b8f661d0edf..496ae6aae316 100644 --- a/drivers/crypto/ux500/hash/hash_core.c +++ b/drivers/crypto/ux500/hash/hash_core.c | |||
@@ -122,6 +122,13 @@ static void hash_dma_setup_channel(struct hash_device_data *device_data, | |||
122 | struct device *dev) | 122 | struct device *dev) |
123 | { | 123 | { |
124 | struct hash_platform_data *platform_data = dev->platform_data; | 124 | struct hash_platform_data *platform_data = dev->platform_data; |
125 | struct dma_slave_config conf = { | ||
126 | .direction = DMA_MEM_TO_DEV, | ||
127 | .dst_addr = device_data->phybase + HASH_DMA_FIFO, | ||
128 | .dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES, | ||
129 | .dst_maxburst = 16, | ||
130 | }; | ||
131 | |||
125 | dma_cap_zero(device_data->dma.mask); | 132 | dma_cap_zero(device_data->dma.mask); |
126 | dma_cap_set(DMA_SLAVE, device_data->dma.mask); | 133 | dma_cap_set(DMA_SLAVE, device_data->dma.mask); |
127 | 134 | ||
@@ -131,6 +138,8 @@ static void hash_dma_setup_channel(struct hash_device_data *device_data, | |||
131 | platform_data->dma_filter, | 138 | platform_data->dma_filter, |
132 | device_data->dma.cfg_mem2hash); | 139 | device_data->dma.cfg_mem2hash); |
133 | 140 | ||
141 | dmaengine_slave_config(device_data->dma.chan_mem2hash, &conf); | ||
142 | |||
134 | init_completion(&device_data->dma.complete); | 143 | init_completion(&device_data->dma.complete); |
135 | } | 144 | } |
136 | 145 | ||
@@ -171,9 +180,9 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, struct scatterlist *sg, | |||
171 | 180 | ||
172 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " | 181 | dev_dbg(ctx->device->dev, "[%s]: Setting up DMA for buffer " |
173 | "(TO_DEVICE)", __func__); | 182 | "(TO_DEVICE)", __func__); |
174 | desc = channel->device->device_prep_slave_sg(channel, | 183 | desc = dmaengine_prep_slave_sg(channel, |
175 | ctx->device->dma.sg, ctx->device->dma.sg_len, | 184 | ctx->device->dma.sg, ctx->device->dma.sg_len, |
176 | direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT, NULL); | 185 | direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT); |
177 | if (!desc) { | 186 | if (!desc) { |
178 | dev_err(ctx->device->dev, | 187 | dev_err(ctx->device->dev, |
179 | "[%s]: device_prep_slave_sg() failed!", __func__); | 188 | "[%s]: device_prep_slave_sg() failed!", __func__); |
@@ -183,7 +192,7 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, struct scatterlist *sg, | |||
183 | desc->callback = hash_dma_callback; | 192 | desc->callback = hash_dma_callback; |
184 | desc->callback_param = ctx; | 193 | desc->callback_param = ctx; |
185 | 194 | ||
186 | cookie = desc->tx_submit(desc); | 195 | cookie = dmaengine_submit(desc); |
187 | dma_async_issue_pending(channel); | 196 | dma_async_issue_pending(channel); |
188 | 197 | ||
189 | return 0; | 198 | return 0; |
@@ -194,7 +203,7 @@ static void hash_dma_done(struct hash_ctx *ctx) | |||
194 | struct dma_chan *chan; | 203 | struct dma_chan *chan; |
195 | 204 | ||
196 | chan = ctx->device->dma.chan_mem2hash; | 205 | chan = ctx->device->dma.chan_mem2hash; |
197 | chan->device->device_control(chan, DMA_TERMINATE_ALL, 0); | 206 | dmaengine_device_control(chan, DMA_TERMINATE_ALL, 0); |
198 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg, | 207 | dma_unmap_sg(chan->device->dev, ctx->device->dma.sg, |
199 | ctx->device->dma.sg_len, DMA_TO_DEVICE); | 208 | ctx->device->dma.sg_len, DMA_TO_DEVICE); |
200 | 209 | ||
@@ -464,12 +473,12 @@ static void hash_hw_write_key(struct hash_device_data *device_data, | |||
464 | HASH_SET_DIN(&word, nwords); | 473 | HASH_SET_DIN(&word, nwords); |
465 | } | 474 | } |
466 | 475 | ||
467 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 476 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
468 | cpu_relax(); | 477 | cpu_relax(); |
469 | 478 | ||
470 | HASH_SET_DCAL; | 479 | HASH_SET_DCAL; |
471 | 480 | ||
472 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 481 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
473 | cpu_relax(); | 482 | cpu_relax(); |
474 | } | 483 | } |
475 | 484 | ||
@@ -652,7 +661,7 @@ static void hash_messagepad(struct hash_device_data *device_data, | |||
652 | if (index_bytes) | 661 | if (index_bytes) |
653 | HASH_SET_DIN(message, nwords); | 662 | HASH_SET_DIN(message, nwords); |
654 | 663 | ||
655 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 664 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
656 | cpu_relax(); | 665 | cpu_relax(); |
657 | 666 | ||
658 | /* num_of_bytes == 0 => NBLW <- 0 (32 bits valid in DATAIN) */ | 667 | /* num_of_bytes == 0 => NBLW <- 0 (32 bits valid in DATAIN) */ |
@@ -667,7 +676,7 @@ static void hash_messagepad(struct hash_device_data *device_data, | |||
667 | (int)(readl_relaxed(&device_data->base->str) & | 676 | (int)(readl_relaxed(&device_data->base->str) & |
668 | HASH_STR_NBLW_MASK)); | 677 | HASH_STR_NBLW_MASK)); |
669 | 678 | ||
670 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 679 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
671 | cpu_relax(); | 680 | cpu_relax(); |
672 | } | 681 | } |
673 | 682 | ||
@@ -767,7 +776,7 @@ void hash_begin(struct hash_device_data *device_data, struct hash_ctx *ctx) | |||
767 | /* HW and SW initializations */ | 776 | /* HW and SW initializations */ |
768 | /* Note: there is no need to initialize buffer and digest members */ | 777 | /* Note: there is no need to initialize buffer and digest members */ |
769 | 778 | ||
770 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 779 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
771 | cpu_relax(); | 780 | cpu_relax(); |
772 | 781 | ||
773 | /* | 782 | /* |
@@ -783,8 +792,7 @@ void hash_begin(struct hash_device_data *device_data, struct hash_ctx *ctx) | |||
783 | HASH_CLEAR_BITS(&device_data->base->str, HASH_STR_NBLW_MASK); | 792 | HASH_CLEAR_BITS(&device_data->base->str, HASH_STR_NBLW_MASK); |
784 | } | 793 | } |
785 | 794 | ||
786 | int hash_process_data( | 795 | static int hash_process_data(struct hash_device_data *device_data, |
787 | struct hash_device_data *device_data, | ||
788 | struct hash_ctx *ctx, struct hash_req_ctx *req_ctx, | 796 | struct hash_ctx *ctx, struct hash_req_ctx *req_ctx, |
789 | int msg_length, u8 *data_buffer, u8 *buffer, u8 *index) | 797 | int msg_length, u8 *data_buffer, u8 *buffer, u8 *index) |
790 | { | 798 | { |
@@ -953,7 +961,7 @@ static int hash_dma_final(struct ahash_request *req) | |||
953 | wait_for_completion(&ctx->device->dma.complete); | 961 | wait_for_completion(&ctx->device->dma.complete); |
954 | hash_dma_done(ctx); | 962 | hash_dma_done(ctx); |
955 | 963 | ||
956 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 964 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
957 | cpu_relax(); | 965 | cpu_relax(); |
958 | 966 | ||
959 | if (ctx->config.oper_mode == HASH_OPER_MODE_HMAC && ctx->key) { | 967 | if (ctx->config.oper_mode == HASH_OPER_MODE_HMAC && ctx->key) { |
@@ -983,7 +991,7 @@ out: | |||
983 | * hash_hw_final - The final hash calculation function | 991 | * hash_hw_final - The final hash calculation function |
984 | * @req: The hash request for the job. | 992 | * @req: The hash request for the job. |
985 | */ | 993 | */ |
986 | int hash_hw_final(struct ahash_request *req) | 994 | static int hash_hw_final(struct ahash_request *req) |
987 | { | 995 | { |
988 | int ret = 0; | 996 | int ret = 0; |
989 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); | 997 | struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); |
@@ -1051,7 +1059,7 @@ int hash_hw_final(struct ahash_request *req) | |||
1051 | req_ctx->state.index); | 1059 | req_ctx->state.index); |
1052 | } else { | 1060 | } else { |
1053 | HASH_SET_DCAL; | 1061 | HASH_SET_DCAL; |
1054 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 1062 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
1055 | cpu_relax(); | 1063 | cpu_relax(); |
1056 | } | 1064 | } |
1057 | 1065 | ||
@@ -1180,7 +1188,7 @@ int hash_resume_state(struct hash_device_data *device_data, | |||
1180 | temp_cr = device_state->temp_cr; | 1188 | temp_cr = device_state->temp_cr; |
1181 | writel_relaxed(temp_cr & HASH_CR_RESUME_MASK, &device_data->base->cr); | 1189 | writel_relaxed(temp_cr & HASH_CR_RESUME_MASK, &device_data->base->cr); |
1182 | 1190 | ||
1183 | if (device_data->base->cr & HASH_CR_MODE_MASK) | 1191 | if (readl(&device_data->base->cr) & HASH_CR_MODE_MASK) |
1184 | hash_mode = HASH_OPER_MODE_HMAC; | 1192 | hash_mode = HASH_OPER_MODE_HMAC; |
1185 | else | 1193 | else |
1186 | hash_mode = HASH_OPER_MODE_HASH; | 1194 | hash_mode = HASH_OPER_MODE_HASH; |
@@ -1224,7 +1232,7 @@ int hash_save_state(struct hash_device_data *device_data, | |||
1224 | * actually makes sure that there isn't any ongoing calculation in the | 1232 | * actually makes sure that there isn't any ongoing calculation in the |
1225 | * hardware. | 1233 | * hardware. |
1226 | */ | 1234 | */ |
1227 | while (device_data->base->str & HASH_STR_DCAL_MASK) | 1235 | while (readl(&device_data->base->str) & HASH_STR_DCAL_MASK) |
1228 | cpu_relax(); | 1236 | cpu_relax(); |
1229 | 1237 | ||
1230 | temp_cr = readl_relaxed(&device_data->base->cr); | 1238 | temp_cr = readl_relaxed(&device_data->base->cr); |
@@ -1233,7 +1241,7 @@ int hash_save_state(struct hash_device_data *device_data, | |||
1233 | 1241 | ||
1234 | device_state->din_reg = readl_relaxed(&device_data->base->din); | 1242 | device_state->din_reg = readl_relaxed(&device_data->base->din); |
1235 | 1243 | ||
1236 | if (device_data->base->cr & HASH_CR_MODE_MASK) | 1244 | if (readl(&device_data->base->cr) & HASH_CR_MODE_MASK) |
1237 | hash_mode = HASH_OPER_MODE_HMAC; | 1245 | hash_mode = HASH_OPER_MODE_HMAC; |
1238 | else | 1246 | else |
1239 | hash_mode = HASH_OPER_MODE_HASH; | 1247 | hash_mode = HASH_OPER_MODE_HASH; |
@@ -1699,6 +1707,7 @@ static int ux500_hash_probe(struct platform_device *pdev) | |||
1699 | goto out_kfree; | 1707 | goto out_kfree; |
1700 | } | 1708 | } |
1701 | 1709 | ||
1710 | device_data->phybase = res->start; | ||
1702 | device_data->base = ioremap(res->start, resource_size(res)); | 1711 | device_data->base = ioremap(res->start, resource_size(res)); |
1703 | if (!device_data->base) { | 1712 | if (!device_data->base) { |
1704 | dev_err(dev, "[%s] ioremap() failed!", | 1713 | dev_err(dev, "[%s] ioremap() failed!", |
@@ -1726,11 +1735,17 @@ static int ux500_hash_probe(struct platform_device *pdev) | |||
1726 | goto out_regulator; | 1735 | goto out_regulator; |
1727 | } | 1736 | } |
1728 | 1737 | ||
1738 | ret = clk_prepare(device_data->clk); | ||
1739 | if (ret) { | ||
1740 | dev_err(dev, "[%s] clk_prepare() failed!", __func__); | ||
1741 | goto out_clk; | ||
1742 | } | ||
1743 | |||
1729 | /* Enable device power (and clock) */ | 1744 | /* Enable device power (and clock) */ |
1730 | ret = hash_enable_power(device_data, false); | 1745 | ret = hash_enable_power(device_data, false); |
1731 | if (ret) { | 1746 | if (ret) { |
1732 | dev_err(dev, "[%s]: hash_enable_power() failed!", __func__); | 1747 | dev_err(dev, "[%s]: hash_enable_power() failed!", __func__); |
1733 | goto out_clk; | 1748 | goto out_clk_unprepare; |
1734 | } | 1749 | } |
1735 | 1750 | ||
1736 | ret = hash_check_hw(device_data); | 1751 | ret = hash_check_hw(device_data); |
@@ -1756,12 +1771,15 @@ static int ux500_hash_probe(struct platform_device *pdev) | |||
1756 | goto out_power; | 1771 | goto out_power; |
1757 | } | 1772 | } |
1758 | 1773 | ||
1759 | dev_info(dev, "[%s] successfully probed\n", __func__); | 1774 | dev_info(dev, "successfully registered\n"); |
1760 | return 0; | 1775 | return 0; |
1761 | 1776 | ||
1762 | out_power: | 1777 | out_power: |
1763 | hash_disable_power(device_data, false); | 1778 | hash_disable_power(device_data, false); |
1764 | 1779 | ||
1780 | out_clk_unprepare: | ||
1781 | clk_unprepare(device_data->clk); | ||
1782 | |||
1765 | out_clk: | 1783 | out_clk: |
1766 | clk_put(device_data->clk); | 1784 | clk_put(device_data->clk); |
1767 | 1785 | ||
@@ -1826,6 +1844,7 @@ static int ux500_hash_remove(struct platform_device *pdev) | |||
1826 | dev_err(dev, "[%s]: hash_disable_power() failed", | 1844 | dev_err(dev, "[%s]: hash_disable_power() failed", |
1827 | __func__); | 1845 | __func__); |
1828 | 1846 | ||
1847 | clk_unprepare(device_data->clk); | ||
1829 | clk_put(device_data->clk); | 1848 | clk_put(device_data->clk); |
1830 | regulator_put(device_data->regulator); | 1849 | regulator_put(device_data->regulator); |
1831 | 1850 | ||
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 71bf4ec300ea..5ab5880d5c90 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/pm.h> | 17 | #include <linux/pm.h> |
18 | #include <linux/pm_runtime.h> | 18 | #include <linux/pm_runtime.h> |
19 | #include <linux/err.h> | 19 | #include <linux/err.h> |
20 | #include <linux/of.h> | ||
21 | #include <linux/of_dma.h> | ||
20 | #include <linux/amba/bus.h> | 22 | #include <linux/amba/bus.h> |
21 | #include <linux/regulator/consumer.h> | 23 | #include <linux/regulator/consumer.h> |
22 | #include <linux/platform_data/dma-ste-dma40.h> | 24 | #include <linux/platform_data/dma-ste-dma40.h> |
@@ -45,15 +47,63 @@ | |||
45 | #define D40_LCLA_LINK_PER_EVENT_GRP 128 | 47 | #define D40_LCLA_LINK_PER_EVENT_GRP 128 |
46 | #define D40_LCLA_END D40_LCLA_LINK_PER_EVENT_GRP | 48 | #define D40_LCLA_END D40_LCLA_LINK_PER_EVENT_GRP |
47 | 49 | ||
50 | /* Max number of logical channels per physical channel */ | ||
51 | #define D40_MAX_LOG_CHAN_PER_PHY 32 | ||
52 | |||
48 | /* Attempts before giving up to trying to get pages that are aligned */ | 53 | /* Attempts before giving up to trying to get pages that are aligned */ |
49 | #define MAX_LCLA_ALLOC_ATTEMPTS 256 | 54 | #define MAX_LCLA_ALLOC_ATTEMPTS 256 |
50 | 55 | ||
51 | /* Bit markings for allocation map */ | 56 | /* Bit markings for allocation map */ |
52 | #define D40_ALLOC_FREE (1 << 31) | 57 | #define D40_ALLOC_FREE BIT(31) |
53 | #define D40_ALLOC_PHY (1 << 30) | 58 | #define D40_ALLOC_PHY BIT(30) |
54 | #define D40_ALLOC_LOG_FREE 0 | 59 | #define D40_ALLOC_LOG_FREE 0 |
55 | 60 | ||
56 | #define MAX(a, b) (((a) < (b)) ? (b) : (a)) | 61 | #define D40_MEMCPY_MAX_CHANS 8 |
62 | |||
63 | /* Reserved event lines for memcpy only. */ | ||
64 | #define DB8500_DMA_MEMCPY_EV_0 51 | ||
65 | #define DB8500_DMA_MEMCPY_EV_1 56 | ||
66 | #define DB8500_DMA_MEMCPY_EV_2 57 | ||
67 | #define DB8500_DMA_MEMCPY_EV_3 58 | ||
68 | #define DB8500_DMA_MEMCPY_EV_4 59 | ||
69 | #define DB8500_DMA_MEMCPY_EV_5 60 | ||
70 | |||
71 | static int dma40_memcpy_channels[] = { | ||
72 | DB8500_DMA_MEMCPY_EV_0, | ||
73 | DB8500_DMA_MEMCPY_EV_1, | ||
74 | DB8500_DMA_MEMCPY_EV_2, | ||
75 | DB8500_DMA_MEMCPY_EV_3, | ||
76 | DB8500_DMA_MEMCPY_EV_4, | ||
77 | DB8500_DMA_MEMCPY_EV_5, | ||
78 | }; | ||
79 | |||
80 | /* Default configuration for physcial memcpy */ | ||
81 | static struct stedma40_chan_cfg dma40_memcpy_conf_phy = { | ||
82 | .mode = STEDMA40_MODE_PHYSICAL, | ||
83 | .dir = DMA_MEM_TO_MEM, | ||
84 | |||
85 | .src_info.data_width = DMA_SLAVE_BUSWIDTH_1_BYTE, | ||
86 | .src_info.psize = STEDMA40_PSIZE_PHY_1, | ||
87 | .src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
88 | |||
89 | .dst_info.data_width = DMA_SLAVE_BUSWIDTH_1_BYTE, | ||
90 | .dst_info.psize = STEDMA40_PSIZE_PHY_1, | ||
91 | .dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
92 | }; | ||
93 | |||
94 | /* Default configuration for logical memcpy */ | ||
95 | static struct stedma40_chan_cfg dma40_memcpy_conf_log = { | ||
96 | .mode = STEDMA40_MODE_LOGICAL, | ||
97 | .dir = DMA_MEM_TO_MEM, | ||
98 | |||
99 | .src_info.data_width = DMA_SLAVE_BUSWIDTH_1_BYTE, | ||
100 | .src_info.psize = STEDMA40_PSIZE_LOG_1, | ||
101 | .src_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
102 | |||
103 | .dst_info.data_width = DMA_SLAVE_BUSWIDTH_1_BYTE, | ||
104 | .dst_info.psize = STEDMA40_PSIZE_LOG_1, | ||
105 | .dst_info.flow_ctrl = STEDMA40_NO_FLOW_CTRL, | ||
106 | }; | ||
57 | 107 | ||
58 | /** | 108 | /** |
59 | * enum 40_command - The different commands and/or statuses. | 109 | * enum 40_command - The different commands and/or statuses. |
@@ -171,6 +221,9 @@ static u32 d40_backup_regs_chan[] = { | |||
171 | D40_CHAN_REG_SDLNK, | 221 | D40_CHAN_REG_SDLNK, |
172 | }; | 222 | }; |
173 | 223 | ||
224 | #define BACKUP_REGS_SZ_MAX ((BACKUP_REGS_SZ_V4A > BACKUP_REGS_SZ_V4B) ? \ | ||
225 | BACKUP_REGS_SZ_V4A : BACKUP_REGS_SZ_V4B) | ||
226 | |||
174 | /** | 227 | /** |
175 | * struct d40_interrupt_lookup - lookup table for interrupt handler | 228 | * struct d40_interrupt_lookup - lookup table for interrupt handler |
176 | * | 229 | * |
@@ -471,6 +524,8 @@ struct d40_gen_dmac { | |||
471 | * @phy_start: Physical memory start of the DMA registers. | 524 | * @phy_start: Physical memory start of the DMA registers. |
472 | * @phy_size: Size of the DMA register map. | 525 | * @phy_size: Size of the DMA register map. |
473 | * @irq: The IRQ number. | 526 | * @irq: The IRQ number. |
527 | * @num_memcpy_chans: The number of channels used for memcpy (mem-to-mem | ||
528 | * transfers). | ||
474 | * @num_phy_chans: The number of physical channels. Read from HW. This | 529 | * @num_phy_chans: The number of physical channels. Read from HW. This |
475 | * is the number of available channels for this driver, not counting "Secure | 530 | * is the number of available channels for this driver, not counting "Secure |
476 | * mode" allocated physical channels. | 531 | * mode" allocated physical channels. |
@@ -514,6 +569,7 @@ struct d40_base { | |||
514 | phys_addr_t phy_start; | 569 | phys_addr_t phy_start; |
515 | resource_size_t phy_size; | 570 | resource_size_t phy_size; |
516 | int irq; | 571 | int irq; |
572 | int num_memcpy_chans; | ||
517 | int num_phy_chans; | 573 | int num_phy_chans; |
518 | int num_log_chans; | 574 | int num_log_chans; |
519 | struct device_dma_parameters dma_parms; | 575 | struct device_dma_parameters dma_parms; |
@@ -534,7 +590,7 @@ struct d40_base { | |||
534 | resource_size_t lcpa_size; | 590 | resource_size_t lcpa_size; |
535 | struct kmem_cache *desc_slab; | 591 | struct kmem_cache *desc_slab; |
536 | u32 reg_val_backup[BACKUP_REGS_SZ]; | 592 | u32 reg_val_backup[BACKUP_REGS_SZ]; |
537 | u32 reg_val_backup_v4[MAX(BACKUP_REGS_SZ_V4A, BACKUP_REGS_SZ_V4B)]; | 593 | u32 reg_val_backup_v4[BACKUP_REGS_SZ_MAX]; |
538 | u32 *reg_val_backup_chan; | 594 | u32 *reg_val_backup_chan; |
539 | u16 gcc_pwr_off_mask; | 595 | u16 gcc_pwr_off_mask; |
540 | bool initialized; | 596 | bool initialized; |
@@ -792,7 +848,7 @@ static void d40_log_lli_to_lcxa(struct d40_chan *chan, struct d40_desc *desc) | |||
792 | * that uses linked lists. | 848 | * that uses linked lists. |
793 | */ | 849 | */ |
794 | if (!(chan->phy_chan->use_soft_lli && | 850 | if (!(chan->phy_chan->use_soft_lli && |
795 | chan->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM)) | 851 | chan->dma_cfg.dir == DMA_DEV_TO_MEM)) |
796 | curr_lcla = d40_lcla_alloc_one(chan, desc); | 852 | curr_lcla = d40_lcla_alloc_one(chan, desc); |
797 | 853 | ||
798 | first_lcla = curr_lcla; | 854 | first_lcla = curr_lcla; |
@@ -954,20 +1010,21 @@ static int d40_psize_2_burst_size(bool is_log, int psize) | |||
954 | 1010 | ||
955 | /* | 1011 | /* |
956 | * The dma only supports transmitting packages up to | 1012 | * The dma only supports transmitting packages up to |
957 | * STEDMA40_MAX_SEG_SIZE << data_width. Calculate the total number of | 1013 | * STEDMA40_MAX_SEG_SIZE * data_width, where data_width is stored in Bytes. |
958 | * dma elements required to send the entire sg list | 1014 | * |
1015 | * Calculate the total number of dma elements required to send the entire sg list. | ||
959 | */ | 1016 | */ |
960 | static int d40_size_2_dmalen(int size, u32 data_width1, u32 data_width2) | 1017 | static int d40_size_2_dmalen(int size, u32 data_width1, u32 data_width2) |
961 | { | 1018 | { |
962 | int dmalen; | 1019 | int dmalen; |
963 | u32 max_w = max(data_width1, data_width2); | 1020 | u32 max_w = max(data_width1, data_width2); |
964 | u32 min_w = min(data_width1, data_width2); | 1021 | u32 min_w = min(data_width1, data_width2); |
965 | u32 seg_max = ALIGN(STEDMA40_MAX_SEG_SIZE << min_w, 1 << max_w); | 1022 | u32 seg_max = ALIGN(STEDMA40_MAX_SEG_SIZE * min_w, max_w); |
966 | 1023 | ||
967 | if (seg_max > STEDMA40_MAX_SEG_SIZE) | 1024 | if (seg_max > STEDMA40_MAX_SEG_SIZE) |
968 | seg_max -= (1 << max_w); | 1025 | seg_max -= max_w; |
969 | 1026 | ||
970 | if (!IS_ALIGNED(size, 1 << max_w)) | 1027 | if (!IS_ALIGNED(size, max_w)) |
971 | return -EINVAL; | 1028 | return -EINVAL; |
972 | 1029 | ||
973 | if (size <= seg_max) | 1030 | if (size <= seg_max) |
@@ -1257,21 +1314,17 @@ static void __d40_config_set_event(struct d40_chan *d40c, | |||
1257 | static void d40_config_set_event(struct d40_chan *d40c, | 1314 | static void d40_config_set_event(struct d40_chan *d40c, |
1258 | enum d40_events event_type) | 1315 | enum d40_events event_type) |
1259 | { | 1316 | { |
1260 | /* Enable event line connected to device (or memcpy) */ | 1317 | u32 event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dev_type); |
1261 | if ((d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) || | ||
1262 | (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_PERIPH)) { | ||
1263 | u32 event = D40_TYPE_TO_EVENT(d40c->dma_cfg.src_dev_type); | ||
1264 | 1318 | ||
1319 | /* Enable event line connected to device (or memcpy) */ | ||
1320 | if ((d40c->dma_cfg.dir == DMA_DEV_TO_MEM) || | ||
1321 | (d40c->dma_cfg.dir == DMA_DEV_TO_DEV)) | ||
1265 | __d40_config_set_event(d40c, event_type, event, | 1322 | __d40_config_set_event(d40c, event_type, event, |
1266 | D40_CHAN_REG_SSLNK); | 1323 | D40_CHAN_REG_SSLNK); |
1267 | } | ||
1268 | |||
1269 | if (d40c->dma_cfg.dir != STEDMA40_PERIPH_TO_MEM) { | ||
1270 | u32 event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dst_dev_type); | ||
1271 | 1324 | ||
1325 | if (d40c->dma_cfg.dir != DMA_DEV_TO_MEM) | ||
1272 | __d40_config_set_event(d40c, event_type, event, | 1326 | __d40_config_set_event(d40c, event_type, event, |
1273 | D40_CHAN_REG_SDLNK); | 1327 | D40_CHAN_REG_SDLNK); |
1274 | } | ||
1275 | } | 1328 | } |
1276 | 1329 | ||
1277 | static u32 d40_chan_has_events(struct d40_chan *d40c) | 1330 | static u32 d40_chan_has_events(struct d40_chan *d40c) |
@@ -1417,7 +1470,7 @@ static u32 d40_residue(struct d40_chan *d40c) | |||
1417 | >> D40_SREG_ELEM_PHY_ECNT_POS; | 1470 | >> D40_SREG_ELEM_PHY_ECNT_POS; |
1418 | } | 1471 | } |
1419 | 1472 | ||
1420 | return num_elt * (1 << d40c->dma_cfg.dst_info.data_width); | 1473 | return num_elt * d40c->dma_cfg.dst_info.data_width; |
1421 | } | 1474 | } |
1422 | 1475 | ||
1423 | static bool d40_tx_is_linked(struct d40_chan *d40c) | 1476 | static bool d40_tx_is_linked(struct d40_chan *d40c) |
@@ -1693,7 +1746,7 @@ static irqreturn_t d40_handle_interrupt(int irq, void *data) | |||
1693 | } | 1746 | } |
1694 | 1747 | ||
1695 | /* ACK interrupt */ | 1748 | /* ACK interrupt */ |
1696 | writel(1 << idx, base->virtbase + il[row].clr); | 1749 | writel(BIT(idx), base->virtbase + il[row].clr); |
1697 | 1750 | ||
1698 | spin_lock(&d40c->lock); | 1751 | spin_lock(&d40c->lock); |
1699 | 1752 | ||
@@ -1715,8 +1768,6 @@ static int d40_validate_conf(struct d40_chan *d40c, | |||
1715 | struct stedma40_chan_cfg *conf) | 1768 | struct stedma40_chan_cfg *conf) |
1716 | { | 1769 | { |
1717 | int res = 0; | 1770 | int res = 0; |
1718 | u32 dst_event_group = D40_TYPE_TO_GROUP(conf->dst_dev_type); | ||
1719 | u32 src_event_group = D40_TYPE_TO_GROUP(conf->src_dev_type); | ||
1720 | bool is_log = conf->mode == STEDMA40_MODE_LOGICAL; | 1771 | bool is_log = conf->mode == STEDMA40_MODE_LOGICAL; |
1721 | 1772 | ||
1722 | if (!conf->dir) { | 1773 | if (!conf->dir) { |
@@ -1724,48 +1775,14 @@ static int d40_validate_conf(struct d40_chan *d40c, | |||
1724 | res = -EINVAL; | 1775 | res = -EINVAL; |
1725 | } | 1776 | } |
1726 | 1777 | ||
1727 | if (conf->dst_dev_type != STEDMA40_DEV_DST_MEMORY && | 1778 | if ((is_log && conf->dev_type > d40c->base->num_log_chans) || |
1728 | d40c->base->plat_data->dev_tx[conf->dst_dev_type] == 0 && | 1779 | (!is_log && conf->dev_type > d40c->base->num_phy_chans) || |
1729 | d40c->runtime_addr == 0) { | 1780 | (conf->dev_type < 0)) { |
1730 | 1781 | chan_err(d40c, "Invalid device type (%d)\n", conf->dev_type); | |
1731 | chan_err(d40c, "Invalid TX channel address (%d)\n", | ||
1732 | conf->dst_dev_type); | ||
1733 | res = -EINVAL; | ||
1734 | } | ||
1735 | |||
1736 | if (conf->src_dev_type != STEDMA40_DEV_SRC_MEMORY && | ||
1737 | d40c->base->plat_data->dev_rx[conf->src_dev_type] == 0 && | ||
1738 | d40c->runtime_addr == 0) { | ||
1739 | chan_err(d40c, "Invalid RX channel address (%d)\n", | ||
1740 | conf->src_dev_type); | ||
1741 | res = -EINVAL; | ||
1742 | } | ||
1743 | |||
1744 | if (conf->dir == STEDMA40_MEM_TO_PERIPH && | ||
1745 | dst_event_group == STEDMA40_DEV_DST_MEMORY) { | ||
1746 | chan_err(d40c, "Invalid dst\n"); | ||
1747 | res = -EINVAL; | 1782 | res = -EINVAL; |
1748 | } | 1783 | } |
1749 | 1784 | ||
1750 | if (conf->dir == STEDMA40_PERIPH_TO_MEM && | 1785 | if (conf->dir == DMA_DEV_TO_DEV) { |
1751 | src_event_group == STEDMA40_DEV_SRC_MEMORY) { | ||
1752 | chan_err(d40c, "Invalid src\n"); | ||
1753 | res = -EINVAL; | ||
1754 | } | ||
1755 | |||
1756 | if (src_event_group == STEDMA40_DEV_SRC_MEMORY && | ||
1757 | dst_event_group == STEDMA40_DEV_DST_MEMORY && is_log) { | ||
1758 | chan_err(d40c, "No event line\n"); | ||
1759 | res = -EINVAL; | ||
1760 | } | ||
1761 | |||
1762 | if (conf->dir == STEDMA40_PERIPH_TO_PERIPH && | ||
1763 | (src_event_group != dst_event_group)) { | ||
1764 | chan_err(d40c, "Invalid event group\n"); | ||
1765 | res = -EINVAL; | ||
1766 | } | ||
1767 | |||
1768 | if (conf->dir == STEDMA40_PERIPH_TO_PERIPH) { | ||
1769 | /* | 1786 | /* |
1770 | * DMAC HW supports it. Will be added to this driver, | 1787 | * DMAC HW supports it. Will be added to this driver, |
1771 | * in case any dma client requires it. | 1788 | * in case any dma client requires it. |
@@ -1775,9 +1792,9 @@ static int d40_validate_conf(struct d40_chan *d40c, | |||
1775 | } | 1792 | } |
1776 | 1793 | ||
1777 | if (d40_psize_2_burst_size(is_log, conf->src_info.psize) * | 1794 | if (d40_psize_2_burst_size(is_log, conf->src_info.psize) * |
1778 | (1 << conf->src_info.data_width) != | 1795 | conf->src_info.data_width != |
1779 | d40_psize_2_burst_size(is_log, conf->dst_info.psize) * | 1796 | d40_psize_2_burst_size(is_log, conf->dst_info.psize) * |
1780 | (1 << conf->dst_info.data_width)) { | 1797 | conf->dst_info.data_width) { |
1781 | /* | 1798 | /* |
1782 | * The DMAC hardware only supports | 1799 | * The DMAC hardware only supports |
1783 | * src (burst x width) == dst (burst x width) | 1800 | * src (burst x width) == dst (burst x width) |
@@ -1819,8 +1836,8 @@ static bool d40_alloc_mask_set(struct d40_phy_res *phy, | |||
1819 | if (phy->allocated_src == D40_ALLOC_FREE) | 1836 | if (phy->allocated_src == D40_ALLOC_FREE) |
1820 | phy->allocated_src = D40_ALLOC_LOG_FREE; | 1837 | phy->allocated_src = D40_ALLOC_LOG_FREE; |
1821 | 1838 | ||
1822 | if (!(phy->allocated_src & (1 << log_event_line))) { | 1839 | if (!(phy->allocated_src & BIT(log_event_line))) { |
1823 | phy->allocated_src |= 1 << log_event_line; | 1840 | phy->allocated_src |= BIT(log_event_line); |
1824 | goto found; | 1841 | goto found; |
1825 | } else | 1842 | } else |
1826 | goto not_found; | 1843 | goto not_found; |
@@ -1831,8 +1848,8 @@ static bool d40_alloc_mask_set(struct d40_phy_res *phy, | |||
1831 | if (phy->allocated_dst == D40_ALLOC_FREE) | 1848 | if (phy->allocated_dst == D40_ALLOC_FREE) |
1832 | phy->allocated_dst = D40_ALLOC_LOG_FREE; | 1849 | phy->allocated_dst = D40_ALLOC_LOG_FREE; |
1833 | 1850 | ||
1834 | if (!(phy->allocated_dst & (1 << log_event_line))) { | 1851 | if (!(phy->allocated_dst & BIT(log_event_line))) { |
1835 | phy->allocated_dst |= 1 << log_event_line; | 1852 | phy->allocated_dst |= BIT(log_event_line); |
1836 | goto found; | 1853 | goto found; |
1837 | } else | 1854 | } else |
1838 | goto not_found; | 1855 | goto not_found; |
@@ -1862,11 +1879,11 @@ static bool d40_alloc_mask_free(struct d40_phy_res *phy, bool is_src, | |||
1862 | 1879 | ||
1863 | /* Logical channel */ | 1880 | /* Logical channel */ |
1864 | if (is_src) { | 1881 | if (is_src) { |
1865 | phy->allocated_src &= ~(1 << log_event_line); | 1882 | phy->allocated_src &= ~BIT(log_event_line); |
1866 | if (phy->allocated_src == D40_ALLOC_LOG_FREE) | 1883 | if (phy->allocated_src == D40_ALLOC_LOG_FREE) |
1867 | phy->allocated_src = D40_ALLOC_FREE; | 1884 | phy->allocated_src = D40_ALLOC_FREE; |
1868 | } else { | 1885 | } else { |
1869 | phy->allocated_dst &= ~(1 << log_event_line); | 1886 | phy->allocated_dst &= ~BIT(log_event_line); |
1870 | if (phy->allocated_dst == D40_ALLOC_LOG_FREE) | 1887 | if (phy->allocated_dst == D40_ALLOC_LOG_FREE) |
1871 | phy->allocated_dst = D40_ALLOC_FREE; | 1888 | phy->allocated_dst = D40_ALLOC_FREE; |
1872 | } | 1889 | } |
@@ -1882,7 +1899,7 @@ out: | |||
1882 | 1899 | ||
1883 | static int d40_allocate_channel(struct d40_chan *d40c, bool *first_phy_user) | 1900 | static int d40_allocate_channel(struct d40_chan *d40c, bool *first_phy_user) |
1884 | { | 1901 | { |
1885 | int dev_type; | 1902 | int dev_type = d40c->dma_cfg.dev_type; |
1886 | int event_group; | 1903 | int event_group; |
1887 | int event_line; | 1904 | int event_line; |
1888 | struct d40_phy_res *phys; | 1905 | struct d40_phy_res *phys; |
@@ -1896,14 +1913,12 @@ static int d40_allocate_channel(struct d40_chan *d40c, bool *first_phy_user) | |||
1896 | phys = d40c->base->phy_res; | 1913 | phys = d40c->base->phy_res; |
1897 | num_phy_chans = d40c->base->num_phy_chans; | 1914 | num_phy_chans = d40c->base->num_phy_chans; |
1898 | 1915 | ||
1899 | if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) { | 1916 | if (d40c->dma_cfg.dir == DMA_DEV_TO_MEM) { |
1900 | dev_type = d40c->dma_cfg.src_dev_type; | ||
1901 | log_num = 2 * dev_type; | 1917 | log_num = 2 * dev_type; |
1902 | is_src = true; | 1918 | is_src = true; |
1903 | } else if (d40c->dma_cfg.dir == STEDMA40_MEM_TO_PERIPH || | 1919 | } else if (d40c->dma_cfg.dir == DMA_MEM_TO_DEV || |
1904 | d40c->dma_cfg.dir == STEDMA40_MEM_TO_MEM) { | 1920 | d40c->dma_cfg.dir == DMA_MEM_TO_MEM) { |
1905 | /* dst event lines are used for logical memcpy */ | 1921 | /* dst event lines are used for logical memcpy */ |
1906 | dev_type = d40c->dma_cfg.dst_dev_type; | ||
1907 | log_num = 2 * dev_type + 1; | 1922 | log_num = 2 * dev_type + 1; |
1908 | is_src = false; | 1923 | is_src = false; |
1909 | } else | 1924 | } else |
@@ -1913,7 +1928,7 @@ static int d40_allocate_channel(struct d40_chan *d40c, bool *first_phy_user) | |||
1913 | event_line = D40_TYPE_TO_EVENT(dev_type); | 1928 | event_line = D40_TYPE_TO_EVENT(dev_type); |
1914 | 1929 | ||
1915 | if (!is_log) { | 1930 | if (!is_log) { |
1916 | if (d40c->dma_cfg.dir == STEDMA40_MEM_TO_MEM) { | 1931 | if (d40c->dma_cfg.dir == DMA_MEM_TO_MEM) { |
1917 | /* Find physical half channel */ | 1932 | /* Find physical half channel */ |
1918 | if (d40c->dma_cfg.use_fixed_channel) { | 1933 | if (d40c->dma_cfg.use_fixed_channel) { |
1919 | i = d40c->dma_cfg.phy_channel; | 1934 | i = d40c->dma_cfg.phy_channel; |
@@ -2014,14 +2029,23 @@ static int d40_config_memcpy(struct d40_chan *d40c) | |||
2014 | dma_cap_mask_t cap = d40c->chan.device->cap_mask; | 2029 | dma_cap_mask_t cap = d40c->chan.device->cap_mask; |
2015 | 2030 | ||
2016 | if (dma_has_cap(DMA_MEMCPY, cap) && !dma_has_cap(DMA_SLAVE, cap)) { | 2031 | if (dma_has_cap(DMA_MEMCPY, cap) && !dma_has_cap(DMA_SLAVE, cap)) { |
2017 | d40c->dma_cfg = *d40c->base->plat_data->memcpy_conf_log; | 2032 | d40c->dma_cfg = dma40_memcpy_conf_log; |
2018 | d40c->dma_cfg.src_dev_type = STEDMA40_DEV_SRC_MEMORY; | 2033 | d40c->dma_cfg.dev_type = dma40_memcpy_channels[d40c->chan.chan_id]; |
2019 | d40c->dma_cfg.dst_dev_type = d40c->base->plat_data-> | 2034 | |
2020 | memcpy[d40c->chan.chan_id]; | 2035 | d40_log_cfg(&d40c->dma_cfg, |
2036 | &d40c->log_def.lcsp1, &d40c->log_def.lcsp3); | ||
2021 | 2037 | ||
2022 | } else if (dma_has_cap(DMA_MEMCPY, cap) && | 2038 | } else if (dma_has_cap(DMA_MEMCPY, cap) && |
2023 | dma_has_cap(DMA_SLAVE, cap)) { | 2039 | dma_has_cap(DMA_SLAVE, cap)) { |
2024 | d40c->dma_cfg = *d40c->base->plat_data->memcpy_conf_phy; | 2040 | d40c->dma_cfg = dma40_memcpy_conf_phy; |
2041 | |||
2042 | /* Generate interrrupt at end of transfer or relink. */ | ||
2043 | d40c->dst_def_cfg |= BIT(D40_SREG_CFG_TIM_POS); | ||
2044 | |||
2045 | /* Generate interrupt on error. */ | ||
2046 | d40c->src_def_cfg |= BIT(D40_SREG_CFG_EIM_POS); | ||
2047 | d40c->dst_def_cfg |= BIT(D40_SREG_CFG_EIM_POS); | ||
2048 | |||
2025 | } else { | 2049 | } else { |
2026 | chan_err(d40c, "No memcpy\n"); | 2050 | chan_err(d40c, "No memcpy\n"); |
2027 | return -EINVAL; | 2051 | return -EINVAL; |
@@ -2034,7 +2058,7 @@ static int d40_free_dma(struct d40_chan *d40c) | |||
2034 | { | 2058 | { |
2035 | 2059 | ||
2036 | int res = 0; | 2060 | int res = 0; |
2037 | u32 event; | 2061 | u32 event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dev_type); |
2038 | struct d40_phy_res *phy = d40c->phy_chan; | 2062 | struct d40_phy_res *phy = d40c->phy_chan; |
2039 | bool is_src; | 2063 | bool is_src; |
2040 | 2064 | ||
@@ -2052,14 +2076,12 @@ static int d40_free_dma(struct d40_chan *d40c) | |||
2052 | return -EINVAL; | 2076 | return -EINVAL; |
2053 | } | 2077 | } |
2054 | 2078 | ||
2055 | if (d40c->dma_cfg.dir == STEDMA40_MEM_TO_PERIPH || | 2079 | if (d40c->dma_cfg.dir == DMA_MEM_TO_DEV || |
2056 | d40c->dma_cfg.dir == STEDMA40_MEM_TO_MEM) { | 2080 | d40c->dma_cfg.dir == DMA_MEM_TO_MEM) |
2057 | event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dst_dev_type); | ||
2058 | is_src = false; | 2081 | is_src = false; |
2059 | } else if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) { | 2082 | else if (d40c->dma_cfg.dir == DMA_DEV_TO_MEM) |
2060 | event = D40_TYPE_TO_EVENT(d40c->dma_cfg.src_dev_type); | ||
2061 | is_src = true; | 2083 | is_src = true; |
2062 | } else { | 2084 | else { |
2063 | chan_err(d40c, "Unknown direction\n"); | 2085 | chan_err(d40c, "Unknown direction\n"); |
2064 | return -EINVAL; | 2086 | return -EINVAL; |
2065 | } | 2087 | } |
@@ -2100,7 +2122,7 @@ static bool d40_is_paused(struct d40_chan *d40c) | |||
2100 | unsigned long flags; | 2122 | unsigned long flags; |
2101 | void __iomem *active_reg; | 2123 | void __iomem *active_reg; |
2102 | u32 status; | 2124 | u32 status; |
2103 | u32 event; | 2125 | u32 event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dev_type); |
2104 | 2126 | ||
2105 | spin_lock_irqsave(&d40c->lock, flags); | 2127 | spin_lock_irqsave(&d40c->lock, flags); |
2106 | 2128 | ||
@@ -2119,12 +2141,10 @@ static bool d40_is_paused(struct d40_chan *d40c) | |||
2119 | goto _exit; | 2141 | goto _exit; |
2120 | } | 2142 | } |
2121 | 2143 | ||
2122 | if (d40c->dma_cfg.dir == STEDMA40_MEM_TO_PERIPH || | 2144 | if (d40c->dma_cfg.dir == DMA_MEM_TO_DEV || |
2123 | d40c->dma_cfg.dir == STEDMA40_MEM_TO_MEM) { | 2145 | d40c->dma_cfg.dir == DMA_MEM_TO_MEM) { |
2124 | event = D40_TYPE_TO_EVENT(d40c->dma_cfg.dst_dev_type); | ||
2125 | status = readl(chanbase + D40_CHAN_REG_SDLNK); | 2146 | status = readl(chanbase + D40_CHAN_REG_SDLNK); |
2126 | } else if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) { | 2147 | } else if (d40c->dma_cfg.dir == DMA_DEV_TO_MEM) { |
2127 | event = D40_TYPE_TO_EVENT(d40c->dma_cfg.src_dev_type); | ||
2128 | status = readl(chanbase + D40_CHAN_REG_SSLNK); | 2148 | status = readl(chanbase + D40_CHAN_REG_SSLNK); |
2129 | } else { | 2149 | } else { |
2130 | chan_err(d40c, "Unknown direction\n"); | 2150 | chan_err(d40c, "Unknown direction\n"); |
@@ -2255,24 +2275,6 @@ err: | |||
2255 | return NULL; | 2275 | return NULL; |
2256 | } | 2276 | } |
2257 | 2277 | ||
2258 | static dma_addr_t | ||
2259 | d40_get_dev_addr(struct d40_chan *chan, enum dma_transfer_direction direction) | ||
2260 | { | ||
2261 | struct stedma40_platform_data *plat = chan->base->plat_data; | ||
2262 | struct stedma40_chan_cfg *cfg = &chan->dma_cfg; | ||
2263 | dma_addr_t addr = 0; | ||
2264 | |||
2265 | if (chan->runtime_addr) | ||
2266 | return chan->runtime_addr; | ||
2267 | |||
2268 | if (direction == DMA_DEV_TO_MEM) | ||
2269 | addr = plat->dev_rx[cfg->src_dev_type]; | ||
2270 | else if (direction == DMA_MEM_TO_DEV) | ||
2271 | addr = plat->dev_tx[cfg->dst_dev_type]; | ||
2272 | |||
2273 | return addr; | ||
2274 | } | ||
2275 | |||
2276 | static struct dma_async_tx_descriptor * | 2278 | static struct dma_async_tx_descriptor * |
2277 | d40_prep_sg(struct dma_chan *dchan, struct scatterlist *sg_src, | 2279 | d40_prep_sg(struct dma_chan *dchan, struct scatterlist *sg_src, |
2278 | struct scatterlist *sg_dst, unsigned int sg_len, | 2280 | struct scatterlist *sg_dst, unsigned int sg_len, |
@@ -2299,14 +2301,10 @@ d40_prep_sg(struct dma_chan *dchan, struct scatterlist *sg_src, | |||
2299 | if (sg_next(&sg_src[sg_len - 1]) == sg_src) | 2301 | if (sg_next(&sg_src[sg_len - 1]) == sg_src) |
2300 | desc->cyclic = true; | 2302 | desc->cyclic = true; |
2301 | 2303 | ||
2302 | if (direction != DMA_TRANS_NONE) { | 2304 | if (direction == DMA_DEV_TO_MEM) |
2303 | dma_addr_t dev_addr = d40_get_dev_addr(chan, direction); | 2305 | src_dev_addr = chan->runtime_addr; |
2304 | 2306 | else if (direction == DMA_MEM_TO_DEV) | |
2305 | if (direction == DMA_DEV_TO_MEM) | 2307 | dst_dev_addr = chan->runtime_addr; |
2306 | src_dev_addr = dev_addr; | ||
2307 | else if (direction == DMA_MEM_TO_DEV) | ||
2308 | dst_dev_addr = dev_addr; | ||
2309 | } | ||
2310 | 2308 | ||
2311 | if (chan_is_logical(chan)) | 2309 | if (chan_is_logical(chan)) |
2312 | ret = d40_prep_sg_log(chan, desc, sg_src, sg_dst, | 2310 | ret = d40_prep_sg_log(chan, desc, sg_src, sg_dst, |
@@ -2366,7 +2364,7 @@ static void __d40_set_prio_rt(struct d40_chan *d40c, int dev_type, bool src) | |||
2366 | u32 rtreg; | 2364 | u32 rtreg; |
2367 | u32 event = D40_TYPE_TO_EVENT(dev_type); | 2365 | u32 event = D40_TYPE_TO_EVENT(dev_type); |
2368 | u32 group = D40_TYPE_TO_GROUP(dev_type); | 2366 | u32 group = D40_TYPE_TO_GROUP(dev_type); |
2369 | u32 bit = 1 << event; | 2367 | u32 bit = BIT(event); |
2370 | u32 prioreg; | 2368 | u32 prioreg; |
2371 | struct d40_gen_dmac *dmac = &d40c->base->gen_dmac; | 2369 | struct d40_gen_dmac *dmac = &d40c->base->gen_dmac; |
2372 | 2370 | ||
@@ -2397,13 +2395,57 @@ static void d40_set_prio_realtime(struct d40_chan *d40c) | |||
2397 | if (d40c->base->rev < 3) | 2395 | if (d40c->base->rev < 3) |
2398 | return; | 2396 | return; |
2399 | 2397 | ||
2400 | if ((d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) || | 2398 | if ((d40c->dma_cfg.dir == DMA_DEV_TO_MEM) || |
2401 | (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_PERIPH)) | 2399 | (d40c->dma_cfg.dir == DMA_DEV_TO_DEV)) |
2402 | __d40_set_prio_rt(d40c, d40c->dma_cfg.src_dev_type, true); | 2400 | __d40_set_prio_rt(d40c, d40c->dma_cfg.dev_type, true); |
2403 | 2401 | ||
2404 | if ((d40c->dma_cfg.dir == STEDMA40_MEM_TO_PERIPH) || | 2402 | if ((d40c->dma_cfg.dir == DMA_MEM_TO_DEV) || |
2405 | (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_PERIPH)) | 2403 | (d40c->dma_cfg.dir == DMA_DEV_TO_DEV)) |
2406 | __d40_set_prio_rt(d40c, d40c->dma_cfg.dst_dev_type, false); | 2404 | __d40_set_prio_rt(d40c, d40c->dma_cfg.dev_type, false); |
2405 | } | ||
2406 | |||
2407 | #define D40_DT_FLAGS_MODE(flags) ((flags >> 0) & 0x1) | ||
2408 | #define D40_DT_FLAGS_DIR(flags) ((flags >> 1) & 0x1) | ||
2409 | #define D40_DT_FLAGS_BIG_ENDIAN(flags) ((flags >> 2) & 0x1) | ||
2410 | #define D40_DT_FLAGS_FIXED_CHAN(flags) ((flags >> 3) & 0x1) | ||
2411 | |||
2412 | static struct dma_chan *d40_xlate(struct of_phandle_args *dma_spec, | ||
2413 | struct of_dma *ofdma) | ||
2414 | { | ||
2415 | struct stedma40_chan_cfg cfg; | ||
2416 | dma_cap_mask_t cap; | ||
2417 | u32 flags; | ||
2418 | |||
2419 | memset(&cfg, 0, sizeof(struct stedma40_chan_cfg)); | ||
2420 | |||
2421 | dma_cap_zero(cap); | ||
2422 | dma_cap_set(DMA_SLAVE, cap); | ||
2423 | |||
2424 | cfg.dev_type = dma_spec->args[0]; | ||
2425 | flags = dma_spec->args[2]; | ||
2426 | |||
2427 | switch (D40_DT_FLAGS_MODE(flags)) { | ||
2428 | case 0: cfg.mode = STEDMA40_MODE_LOGICAL; break; | ||
2429 | case 1: cfg.mode = STEDMA40_MODE_PHYSICAL; break; | ||
2430 | } | ||
2431 | |||
2432 | switch (D40_DT_FLAGS_DIR(flags)) { | ||
2433 | case 0: | ||
2434 | cfg.dir = DMA_MEM_TO_DEV; | ||
2435 | cfg.dst_info.big_endian = D40_DT_FLAGS_BIG_ENDIAN(flags); | ||
2436 | break; | ||
2437 | case 1: | ||
2438 | cfg.dir = DMA_DEV_TO_MEM; | ||
2439 | cfg.src_info.big_endian = D40_DT_FLAGS_BIG_ENDIAN(flags); | ||
2440 | break; | ||
2441 | } | ||
2442 | |||
2443 | if (D40_DT_FLAGS_FIXED_CHAN(flags)) { | ||
2444 | cfg.phy_channel = dma_spec->args[1]; | ||
2445 | cfg.use_fixed_channel = true; | ||
2446 | } | ||
2447 | |||
2448 | return dma_request_channel(cap, stedma40_filter, &cfg); | ||
2407 | } | 2449 | } |
2408 | 2450 | ||
2409 | /* DMA ENGINE functions */ | 2451 | /* DMA ENGINE functions */ |
@@ -2435,23 +2477,21 @@ static int d40_alloc_chan_resources(struct dma_chan *chan) | |||
2435 | } | 2477 | } |
2436 | 2478 | ||
2437 | pm_runtime_get_sync(d40c->base->dev); | 2479 | pm_runtime_get_sync(d40c->base->dev); |
2438 | /* Fill in basic CFG register values */ | ||
2439 | d40_phy_cfg(&d40c->dma_cfg, &d40c->src_def_cfg, | ||
2440 | &d40c->dst_def_cfg, chan_is_logical(d40c)); | ||
2441 | 2480 | ||
2442 | d40_set_prio_realtime(d40c); | 2481 | d40_set_prio_realtime(d40c); |
2443 | 2482 | ||
2444 | if (chan_is_logical(d40c)) { | 2483 | if (chan_is_logical(d40c)) { |
2445 | d40_log_cfg(&d40c->dma_cfg, | 2484 | if (d40c->dma_cfg.dir == DMA_DEV_TO_MEM) |
2446 | &d40c->log_def.lcsp1, &d40c->log_def.lcsp3); | ||
2447 | |||
2448 | if (d40c->dma_cfg.dir == STEDMA40_PERIPH_TO_MEM) | ||
2449 | d40c->lcpa = d40c->base->lcpa_base + | 2485 | d40c->lcpa = d40c->base->lcpa_base + |
2450 | d40c->dma_cfg.src_dev_type * D40_LCPA_CHAN_SIZE; | 2486 | d40c->dma_cfg.dev_type * D40_LCPA_CHAN_SIZE; |
2451 | else | 2487 | else |
2452 | d40c->lcpa = d40c->base->lcpa_base + | 2488 | d40c->lcpa = d40c->base->lcpa_base + |
2453 | d40c->dma_cfg.dst_dev_type * | 2489 | d40c->dma_cfg.dev_type * |
2454 | D40_LCPA_CHAN_SIZE + D40_LCPA_CHAN_DST_DELTA; | 2490 | D40_LCPA_CHAN_SIZE + D40_LCPA_CHAN_DST_DELTA; |
2491 | |||
2492 | /* Unmask the Global Interrupt Mask. */ | ||
2493 | d40c->src_def_cfg |= BIT(D40_SREG_CFG_LOG_GIM_POS); | ||
2494 | d40c->dst_def_cfg |= BIT(D40_SREG_CFG_LOG_GIM_POS); | ||
2455 | } | 2495 | } |
2456 | 2496 | ||
2457 | dev_dbg(chan2dev(d40c), "allocated %s channel (phy %d%s)\n", | 2497 | dev_dbg(chan2dev(d40c), "allocated %s channel (phy %d%s)\n", |
@@ -2641,33 +2681,10 @@ static void d40_terminate_all(struct dma_chan *chan) | |||
2641 | static int | 2681 | static int |
2642 | dma40_config_to_halfchannel(struct d40_chan *d40c, | 2682 | dma40_config_to_halfchannel(struct d40_chan *d40c, |
2643 | struct stedma40_half_channel_info *info, | 2683 | struct stedma40_half_channel_info *info, |
2644 | enum dma_slave_buswidth width, | ||
2645 | u32 maxburst) | 2684 | u32 maxburst) |
2646 | { | 2685 | { |
2647 | enum stedma40_periph_data_width addr_width; | ||
2648 | int psize; | 2686 | int psize; |
2649 | 2687 | ||
2650 | switch (width) { | ||
2651 | case DMA_SLAVE_BUSWIDTH_1_BYTE: | ||
2652 | addr_width = STEDMA40_BYTE_WIDTH; | ||
2653 | break; | ||
2654 | case DMA_SLAVE_BUSWIDTH_2_BYTES: | ||
2655 | addr_width = STEDMA40_HALFWORD_WIDTH; | ||
2656 | break; | ||
2657 | case DMA_SLAVE_BUSWIDTH_4_BYTES: | ||
2658 | addr_width = STEDMA40_WORD_WIDTH; | ||
2659 | break; | ||
2660 | case DMA_SLAVE_BUSWIDTH_8_BYTES: | ||
2661 | addr_width = STEDMA40_DOUBLEWORD_WIDTH; | ||
2662 | break; | ||
2663 | default: | ||
2664 | dev_err(d40c->base->dev, | ||
2665 | "illegal peripheral address width " | ||
2666 | "requested (%d)\n", | ||
2667 | width); | ||
2668 | return -EINVAL; | ||
2669 | } | ||
2670 | |||
2671 | if (chan_is_logical(d40c)) { | 2688 | if (chan_is_logical(d40c)) { |
2672 | if (maxburst >= 16) | 2689 | if (maxburst >= 16) |
2673 | psize = STEDMA40_PSIZE_LOG_16; | 2690 | psize = STEDMA40_PSIZE_LOG_16; |
@@ -2688,7 +2705,6 @@ dma40_config_to_halfchannel(struct d40_chan *d40c, | |||
2688 | psize = STEDMA40_PSIZE_PHY_1; | 2705 | psize = STEDMA40_PSIZE_PHY_1; |
2689 | } | 2706 | } |
2690 | 2707 | ||
2691 | info->data_width = addr_width; | ||
2692 | info->psize = psize; | 2708 | info->psize = psize; |
2693 | info->flow_ctrl = STEDMA40_NO_FLOW_CTRL; | 2709 | info->flow_ctrl = STEDMA40_NO_FLOW_CTRL; |
2694 | 2710 | ||
@@ -2712,21 +2728,14 @@ static int d40_set_runtime_config(struct dma_chan *chan, | |||
2712 | dst_maxburst = config->dst_maxburst; | 2728 | dst_maxburst = config->dst_maxburst; |
2713 | 2729 | ||
2714 | if (config->direction == DMA_DEV_TO_MEM) { | 2730 | if (config->direction == DMA_DEV_TO_MEM) { |
2715 | dma_addr_t dev_addr_rx = | ||
2716 | d40c->base->plat_data->dev_rx[cfg->src_dev_type]; | ||
2717 | |||
2718 | config_addr = config->src_addr; | 2731 | config_addr = config->src_addr; |
2719 | if (dev_addr_rx) | 2732 | |
2720 | dev_dbg(d40c->base->dev, | 2733 | if (cfg->dir != DMA_DEV_TO_MEM) |
2721 | "channel has a pre-wired RX address %08x " | ||
2722 | "overriding with %08x\n", | ||
2723 | dev_addr_rx, config_addr); | ||
2724 | if (cfg->dir != STEDMA40_PERIPH_TO_MEM) | ||
2725 | dev_dbg(d40c->base->dev, | 2734 | dev_dbg(d40c->base->dev, |
2726 | "channel was not configured for peripheral " | 2735 | "channel was not configured for peripheral " |
2727 | "to memory transfer (%d) overriding\n", | 2736 | "to memory transfer (%d) overriding\n", |
2728 | cfg->dir); | 2737 | cfg->dir); |
2729 | cfg->dir = STEDMA40_PERIPH_TO_MEM; | 2738 | cfg->dir = DMA_DEV_TO_MEM; |
2730 | 2739 | ||
2731 | /* Configure the memory side */ | 2740 | /* Configure the memory side */ |
2732 | if (dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) | 2741 | if (dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) |
@@ -2735,21 +2744,14 @@ static int d40_set_runtime_config(struct dma_chan *chan, | |||
2735 | dst_maxburst = src_maxburst; | 2744 | dst_maxburst = src_maxburst; |
2736 | 2745 | ||
2737 | } else if (config->direction == DMA_MEM_TO_DEV) { | 2746 | } else if (config->direction == DMA_MEM_TO_DEV) { |
2738 | dma_addr_t dev_addr_tx = | ||
2739 | d40c->base->plat_data->dev_tx[cfg->dst_dev_type]; | ||
2740 | |||
2741 | config_addr = config->dst_addr; | 2747 | config_addr = config->dst_addr; |
2742 | if (dev_addr_tx) | 2748 | |
2743 | dev_dbg(d40c->base->dev, | 2749 | if (cfg->dir != DMA_MEM_TO_DEV) |
2744 | "channel has a pre-wired TX address %08x " | ||
2745 | "overriding with %08x\n", | ||
2746 | dev_addr_tx, config_addr); | ||
2747 | if (cfg->dir != STEDMA40_MEM_TO_PERIPH) | ||
2748 | dev_dbg(d40c->base->dev, | 2750 | dev_dbg(d40c->base->dev, |
2749 | "channel was not configured for memory " | 2751 | "channel was not configured for memory " |
2750 | "to peripheral transfer (%d) overriding\n", | 2752 | "to peripheral transfer (%d) overriding\n", |
2751 | cfg->dir); | 2753 | cfg->dir); |
2752 | cfg->dir = STEDMA40_MEM_TO_PERIPH; | 2754 | cfg->dir = DMA_MEM_TO_DEV; |
2753 | 2755 | ||
2754 | /* Configure the memory side */ | 2756 | /* Configure the memory side */ |
2755 | if (src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) | 2757 | if (src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) |
@@ -2763,6 +2765,11 @@ static int d40_set_runtime_config(struct dma_chan *chan, | |||
2763 | return -EINVAL; | 2765 | return -EINVAL; |
2764 | } | 2766 | } |
2765 | 2767 | ||
2768 | if (config_addr <= 0) { | ||
2769 | dev_err(d40c->base->dev, "no address supplied\n"); | ||
2770 | return -EINVAL; | ||
2771 | } | ||
2772 | |||
2766 | if (src_maxburst * src_addr_width != dst_maxburst * dst_addr_width) { | 2773 | if (src_maxburst * src_addr_width != dst_maxburst * dst_addr_width) { |
2767 | dev_err(d40c->base->dev, | 2774 | dev_err(d40c->base->dev, |
2768 | "src/dst width/maxburst mismatch: %d*%d != %d*%d\n", | 2775 | "src/dst width/maxburst mismatch: %d*%d != %d*%d\n", |
@@ -2781,14 +2788,24 @@ static int d40_set_runtime_config(struct dma_chan *chan, | |||
2781 | src_maxburst = dst_maxburst * dst_addr_width / src_addr_width; | 2788 | src_maxburst = dst_maxburst * dst_addr_width / src_addr_width; |
2782 | } | 2789 | } |
2783 | 2790 | ||
2791 | /* Only valid widths are; 1, 2, 4 and 8. */ | ||
2792 | if (src_addr_width <= DMA_SLAVE_BUSWIDTH_UNDEFINED || | ||
2793 | src_addr_width > DMA_SLAVE_BUSWIDTH_8_BYTES || | ||
2794 | dst_addr_width <= DMA_SLAVE_BUSWIDTH_UNDEFINED || | ||
2795 | dst_addr_width > DMA_SLAVE_BUSWIDTH_8_BYTES || | ||
2796 | ((src_addr_width > 1) && (src_addr_width & 1)) || | ||
2797 | ((dst_addr_width > 1) && (dst_addr_width & 1))) | ||
2798 | return -EINVAL; | ||
2799 | |||
2800 | cfg->src_info.data_width = src_addr_width; | ||
2801 | cfg->dst_info.data_width = dst_addr_width; | ||
2802 | |||
2784 | ret = dma40_config_to_halfchannel(d40c, &cfg->src_info, | 2803 | ret = dma40_config_to_halfchannel(d40c, &cfg->src_info, |
2785 | src_addr_width, | ||
2786 | src_maxburst); | 2804 | src_maxburst); |
2787 | if (ret) | 2805 | if (ret) |
2788 | return ret; | 2806 | return ret; |
2789 | 2807 | ||
2790 | ret = dma40_config_to_halfchannel(d40c, &cfg->dst_info, | 2808 | ret = dma40_config_to_halfchannel(d40c, &cfg->dst_info, |
2791 | dst_addr_width, | ||
2792 | dst_maxburst); | 2809 | dst_maxburst); |
2793 | if (ret) | 2810 | if (ret) |
2794 | return ret; | 2811 | return ret; |
@@ -2797,8 +2814,7 @@ static int d40_set_runtime_config(struct dma_chan *chan, | |||
2797 | if (chan_is_logical(d40c)) | 2814 | if (chan_is_logical(d40c)) |
2798 | d40_log_cfg(cfg, &d40c->log_def.lcsp1, &d40c->log_def.lcsp3); | 2815 | d40_log_cfg(cfg, &d40c->log_def.lcsp1, &d40c->log_def.lcsp3); |
2799 | else | 2816 | else |
2800 | d40_phy_cfg(cfg, &d40c->src_def_cfg, | 2817 | d40_phy_cfg(cfg, &d40c->src_def_cfg, &d40c->dst_def_cfg); |
2801 | &d40c->dst_def_cfg, false); | ||
2802 | 2818 | ||
2803 | /* These settings will take precedence later */ | 2819 | /* These settings will take precedence later */ |
2804 | d40c->runtime_addr = config_addr; | 2820 | d40c->runtime_addr = config_addr; |
@@ -2929,7 +2945,7 @@ static int __init d40_dmaengine_init(struct d40_base *base, | |||
2929 | } | 2945 | } |
2930 | 2946 | ||
2931 | d40_chan_init(base, &base->dma_memcpy, base->log_chans, | 2947 | d40_chan_init(base, &base->dma_memcpy, base->log_chans, |
2932 | base->num_log_chans, base->plat_data->memcpy_len); | 2948 | base->num_log_chans, base->num_memcpy_chans); |
2933 | 2949 | ||
2934 | dma_cap_zero(base->dma_memcpy.cap_mask); | 2950 | dma_cap_zero(base->dma_memcpy.cap_mask); |
2935 | dma_cap_set(DMA_MEMCPY, base->dma_memcpy.cap_mask); | 2951 | dma_cap_set(DMA_MEMCPY, base->dma_memcpy.cap_mask); |
@@ -3123,13 +3139,14 @@ static int __init d40_phy_res_init(struct d40_base *base) | |||
3123 | 3139 | ||
3124 | static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) | 3140 | static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) |
3125 | { | 3141 | { |
3126 | struct stedma40_platform_data *plat_data; | 3142 | struct stedma40_platform_data *plat_data = pdev->dev.platform_data; |
3127 | struct clk *clk = NULL; | 3143 | struct clk *clk = NULL; |
3128 | void __iomem *virtbase = NULL; | 3144 | void __iomem *virtbase = NULL; |
3129 | struct resource *res = NULL; | 3145 | struct resource *res = NULL; |
3130 | struct d40_base *base = NULL; | 3146 | struct d40_base *base = NULL; |
3131 | int num_log_chans = 0; | 3147 | int num_log_chans = 0; |
3132 | int num_phy_chans; | 3148 | int num_phy_chans; |
3149 | int num_memcpy_chans; | ||
3133 | int clk_ret = -EINVAL; | 3150 | int clk_ret = -EINVAL; |
3134 | int i; | 3151 | int i; |
3135 | u32 pid; | 3152 | u32 pid; |
@@ -3189,8 +3206,10 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) | |||
3189 | * DB8540v1 has revision 4 | 3206 | * DB8540v1 has revision 4 |
3190 | */ | 3207 | */ |
3191 | rev = AMBA_REV_BITS(pid); | 3208 | rev = AMBA_REV_BITS(pid); |
3192 | 3209 | if (rev < 2) { | |
3193 | plat_data = pdev->dev.platform_data; | 3210 | d40_err(&pdev->dev, "hardware revision: %d is not supported", rev); |
3211 | goto failure; | ||
3212 | } | ||
3194 | 3213 | ||
3195 | /* The number of physical channels on this HW */ | 3214 | /* The number of physical channels on this HW */ |
3196 | if (plat_data->num_of_phy_chans) | 3215 | if (plat_data->num_of_phy_chans) |
@@ -3198,26 +3217,20 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) | |||
3198 | else | 3217 | else |
3199 | num_phy_chans = 4 * (readl(virtbase + D40_DREG_ICFG) & 0x7) + 4; | 3218 | num_phy_chans = 4 * (readl(virtbase + D40_DREG_ICFG) & 0x7) + 4; |
3200 | 3219 | ||
3201 | dev_info(&pdev->dev, "hardware revision: %d @ 0x%x with %d physical channels\n", | 3220 | /* The number of channels used for memcpy */ |
3202 | rev, res->start, num_phy_chans); | 3221 | if (plat_data->num_of_memcpy_chans) |
3203 | 3222 | num_memcpy_chans = plat_data->num_of_memcpy_chans; | |
3204 | if (rev < 2) { | 3223 | else |
3205 | d40_err(&pdev->dev, "hardware revision: %d is not supported", | 3224 | num_memcpy_chans = ARRAY_SIZE(dma40_memcpy_channels); |
3206 | rev); | ||
3207 | goto failure; | ||
3208 | } | ||
3209 | 3225 | ||
3210 | /* Count the number of logical channels in use */ | 3226 | num_log_chans = num_phy_chans * D40_MAX_LOG_CHAN_PER_PHY; |
3211 | for (i = 0; i < plat_data->dev_len; i++) | ||
3212 | if (plat_data->dev_rx[i] != 0) | ||
3213 | num_log_chans++; | ||
3214 | 3227 | ||
3215 | for (i = 0; i < plat_data->dev_len; i++) | 3228 | dev_info(&pdev->dev, |
3216 | if (plat_data->dev_tx[i] != 0) | 3229 | "hardware rev: %d @ 0x%x with %d physical and %d logical channels\n", |
3217 | num_log_chans++; | 3230 | rev, res->start, num_phy_chans, num_log_chans); |
3218 | 3231 | ||
3219 | base = kzalloc(ALIGN(sizeof(struct d40_base), 4) + | 3232 | base = kzalloc(ALIGN(sizeof(struct d40_base), 4) + |
3220 | (num_phy_chans + num_log_chans + plat_data->memcpy_len) * | 3233 | (num_phy_chans + num_log_chans + num_memcpy_chans) * |
3221 | sizeof(struct d40_chan), GFP_KERNEL); | 3234 | sizeof(struct d40_chan), GFP_KERNEL); |
3222 | 3235 | ||
3223 | if (base == NULL) { | 3236 | if (base == NULL) { |
@@ -3227,6 +3240,7 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) | |||
3227 | 3240 | ||
3228 | base->rev = rev; | 3241 | base->rev = rev; |
3229 | base->clk = clk; | 3242 | base->clk = clk; |
3243 | base->num_memcpy_chans = num_memcpy_chans; | ||
3230 | base->num_phy_chans = num_phy_chans; | 3244 | base->num_phy_chans = num_phy_chans; |
3231 | base->num_log_chans = num_log_chans; | 3245 | base->num_log_chans = num_log_chans; |
3232 | base->phy_start = res->start; | 3246 | base->phy_start = res->start; |
@@ -3278,17 +3292,11 @@ static struct d40_base * __init d40_hw_detect_init(struct platform_device *pdev) | |||
3278 | if (!base->lookup_phy_chans) | 3292 | if (!base->lookup_phy_chans) |
3279 | goto failure; | 3293 | goto failure; |
3280 | 3294 | ||
3281 | if (num_log_chans + plat_data->memcpy_len) { | 3295 | base->lookup_log_chans = kzalloc(num_log_chans * |
3282 | /* | 3296 | sizeof(struct d40_chan *), |
3283 | * The max number of logical channels are event lines for all | 3297 | GFP_KERNEL); |
3284 | * src devices and dst devices | 3298 | if (!base->lookup_log_chans) |
3285 | */ | 3299 | goto failure; |
3286 | base->lookup_log_chans = kzalloc(plat_data->dev_len * 2 * | ||
3287 | sizeof(struct d40_chan *), | ||
3288 | GFP_KERNEL); | ||
3289 | if (!base->lookup_log_chans) | ||
3290 | goto failure; | ||
3291 | } | ||
3292 | 3300 | ||
3293 | base->reg_val_backup_chan = kmalloc(base->num_phy_chans * | 3301 | base->reg_val_backup_chan = kmalloc(base->num_phy_chans * |
3294 | sizeof(d40_backup_regs_chan), | 3302 | sizeof(d40_backup_regs_chan), |
@@ -3472,17 +3480,82 @@ failure: | |||
3472 | return ret; | 3480 | return ret; |
3473 | } | 3481 | } |
3474 | 3482 | ||
3483 | static int __init d40_of_probe(struct platform_device *pdev, | ||
3484 | struct device_node *np) | ||
3485 | { | ||
3486 | struct stedma40_platform_data *pdata; | ||
3487 | int num_phy = 0, num_memcpy = 0, num_disabled = 0; | ||
3488 | const const __be32 *list; | ||
3489 | |||
3490 | pdata = devm_kzalloc(&pdev->dev, | ||
3491 | sizeof(struct stedma40_platform_data), | ||
3492 | GFP_KERNEL); | ||
3493 | if (!pdata) | ||
3494 | return -ENOMEM; | ||
3495 | |||
3496 | /* If absent this value will be obtained from h/w. */ | ||
3497 | of_property_read_u32(np, "dma-channels", &num_phy); | ||
3498 | if (num_phy > 0) | ||
3499 | pdata->num_of_phy_chans = num_phy; | ||
3500 | |||
3501 | list = of_get_property(np, "memcpy-channels", &num_memcpy); | ||
3502 | num_memcpy /= sizeof(*list); | ||
3503 | |||
3504 | if (num_memcpy > D40_MEMCPY_MAX_CHANS || num_memcpy <= 0) { | ||
3505 | d40_err(&pdev->dev, | ||
3506 | "Invalid number of memcpy channels specified (%d)\n", | ||
3507 | num_memcpy); | ||
3508 | return -EINVAL; | ||
3509 | } | ||
3510 | pdata->num_of_memcpy_chans = num_memcpy; | ||
3511 | |||
3512 | of_property_read_u32_array(np, "memcpy-channels", | ||
3513 | dma40_memcpy_channels, | ||
3514 | num_memcpy); | ||
3515 | |||
3516 | list = of_get_property(np, "disabled-channels", &num_disabled); | ||
3517 | num_disabled /= sizeof(*list); | ||
3518 | |||
3519 | if (num_disabled > STEDMA40_MAX_PHYS || num_disabled < 0) { | ||
3520 | d40_err(&pdev->dev, | ||
3521 | "Invalid number of disabled channels specified (%d)\n", | ||
3522 | num_disabled); | ||
3523 | return -EINVAL; | ||
3524 | } | ||
3525 | |||
3526 | of_property_read_u32_array(np, "disabled-channels", | ||
3527 | pdata->disabled_channels, | ||
3528 | num_disabled); | ||
3529 | pdata->disabled_channels[num_disabled] = -1; | ||
3530 | |||
3531 | pdev->dev.platform_data = pdata; | ||
3532 | |||
3533 | return 0; | ||
3534 | } | ||
3535 | |||
3475 | static int __init d40_probe(struct platform_device *pdev) | 3536 | static int __init d40_probe(struct platform_device *pdev) |
3476 | { | 3537 | { |
3477 | int err; | 3538 | struct stedma40_platform_data *plat_data = pdev->dev.platform_data; |
3539 | struct device_node *np = pdev->dev.of_node; | ||
3478 | int ret = -ENOENT; | 3540 | int ret = -ENOENT; |
3479 | struct d40_base *base; | 3541 | struct d40_base *base = NULL; |
3480 | struct resource *res = NULL; | 3542 | struct resource *res = NULL; |
3481 | int num_reserved_chans; | 3543 | int num_reserved_chans; |
3482 | u32 val; | 3544 | u32 val; |
3483 | 3545 | ||
3484 | base = d40_hw_detect_init(pdev); | 3546 | if (!plat_data) { |
3547 | if (np) { | ||
3548 | if(d40_of_probe(pdev, np)) { | ||
3549 | ret = -ENOMEM; | ||
3550 | goto failure; | ||
3551 | } | ||
3552 | } else { | ||
3553 | d40_err(&pdev->dev, "No pdata or Device Tree provided\n"); | ||
3554 | goto failure; | ||
3555 | } | ||
3556 | } | ||
3485 | 3557 | ||
3558 | base = d40_hw_detect_init(pdev); | ||
3486 | if (!base) | 3559 | if (!base) |
3487 | goto failure; | 3560 | goto failure; |
3488 | 3561 | ||
@@ -3575,6 +3648,7 @@ static int __init d40_probe(struct platform_device *pdev) | |||
3575 | base->lcpa_regulator = regulator_get(base->dev, "lcla_esram"); | 3648 | base->lcpa_regulator = regulator_get(base->dev, "lcla_esram"); |
3576 | if (IS_ERR(base->lcpa_regulator)) { | 3649 | if (IS_ERR(base->lcpa_regulator)) { |
3577 | d40_err(&pdev->dev, "Failed to get lcpa_regulator\n"); | 3650 | d40_err(&pdev->dev, "Failed to get lcpa_regulator\n"); |
3651 | ret = PTR_ERR(base->lcpa_regulator); | ||
3578 | base->lcpa_regulator = NULL; | 3652 | base->lcpa_regulator = NULL; |
3579 | goto failure; | 3653 | goto failure; |
3580 | } | 3654 | } |
@@ -3590,19 +3664,26 @@ static int __init d40_probe(struct platform_device *pdev) | |||
3590 | } | 3664 | } |
3591 | 3665 | ||
3592 | base->initialized = true; | 3666 | base->initialized = true; |
3593 | err = d40_dmaengine_init(base, num_reserved_chans); | 3667 | ret = d40_dmaengine_init(base, num_reserved_chans); |
3594 | if (err) | 3668 | if (ret) |
3595 | goto failure; | 3669 | goto failure; |
3596 | 3670 | ||
3597 | base->dev->dma_parms = &base->dma_parms; | 3671 | base->dev->dma_parms = &base->dma_parms; |
3598 | err = dma_set_max_seg_size(base->dev, STEDMA40_MAX_SEG_SIZE); | 3672 | ret = dma_set_max_seg_size(base->dev, STEDMA40_MAX_SEG_SIZE); |
3599 | if (err) { | 3673 | if (ret) { |
3600 | d40_err(&pdev->dev, "Failed to set dma max seg size\n"); | 3674 | d40_err(&pdev->dev, "Failed to set dma max seg size\n"); |
3601 | goto failure; | 3675 | goto failure; |
3602 | } | 3676 | } |
3603 | 3677 | ||
3604 | d40_hw_init(base); | 3678 | d40_hw_init(base); |
3605 | 3679 | ||
3680 | if (np) { | ||
3681 | ret = of_dma_controller_register(np, d40_xlate, NULL); | ||
3682 | if (ret) | ||
3683 | dev_err(&pdev->dev, | ||
3684 | "could not register of_dma_controller\n"); | ||
3685 | } | ||
3686 | |||
3606 | dev_info(base->dev, "initialized\n"); | 3687 | dev_info(base->dev, "initialized\n"); |
3607 | return 0; | 3688 | return 0; |
3608 | 3689 | ||
@@ -3656,11 +3737,17 @@ failure: | |||
3656 | return ret; | 3737 | return ret; |
3657 | } | 3738 | } |
3658 | 3739 | ||
3740 | static const struct of_device_id d40_match[] = { | ||
3741 | { .compatible = "stericsson,dma40", }, | ||
3742 | {} | ||
3743 | }; | ||
3744 | |||
3659 | static struct platform_driver d40_driver = { | 3745 | static struct platform_driver d40_driver = { |
3660 | .driver = { | 3746 | .driver = { |
3661 | .owner = THIS_MODULE, | 3747 | .owner = THIS_MODULE, |
3662 | .name = D40_NAME, | 3748 | .name = D40_NAME, |
3663 | .pm = DMA40_PM_OPS, | 3749 | .pm = DMA40_PM_OPS, |
3750 | .of_match_table = d40_match, | ||
3664 | }, | 3751 | }, |
3665 | }; | 3752 | }; |
3666 | 3753 | ||
diff --git a/drivers/dma/ste_dma40_ll.c b/drivers/dma/ste_dma40_ll.c index 7180e0d41722..27b818dee7c7 100644 --- a/drivers/dma/ste_dma40_ll.c +++ b/drivers/dma/ste_dma40_ll.c | |||
@@ -10,6 +10,18 @@ | |||
10 | 10 | ||
11 | #include "ste_dma40_ll.h" | 11 | #include "ste_dma40_ll.h" |
12 | 12 | ||
13 | u8 d40_width_to_bits(enum dma_slave_buswidth width) | ||
14 | { | ||
15 | if (width == DMA_SLAVE_BUSWIDTH_1_BYTE) | ||
16 | return STEDMA40_ESIZE_8_BIT; | ||
17 | else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES) | ||
18 | return STEDMA40_ESIZE_16_BIT; | ||
19 | else if (width == DMA_SLAVE_BUSWIDTH_8_BYTES) | ||
20 | return STEDMA40_ESIZE_64_BIT; | ||
21 | else | ||
22 | return STEDMA40_ESIZE_32_BIT; | ||
23 | } | ||
24 | |||
13 | /* Sets up proper LCSP1 and LCSP3 register for a logical channel */ | 25 | /* Sets up proper LCSP1 and LCSP3 register for a logical channel */ |
14 | void d40_log_cfg(struct stedma40_chan_cfg *cfg, | 26 | void d40_log_cfg(struct stedma40_chan_cfg *cfg, |
15 | u32 *lcsp1, u32 *lcsp3) | 27 | u32 *lcsp1, u32 *lcsp3) |
@@ -18,106 +30,100 @@ void d40_log_cfg(struct stedma40_chan_cfg *cfg, | |||
18 | u32 l1 = 0; /* src */ | 30 | u32 l1 = 0; /* src */ |
19 | 31 | ||
20 | /* src is mem? -> increase address pos */ | 32 | /* src is mem? -> increase address pos */ |
21 | if (cfg->dir == STEDMA40_MEM_TO_PERIPH || | 33 | if (cfg->dir == DMA_MEM_TO_DEV || |
22 | cfg->dir == STEDMA40_MEM_TO_MEM) | 34 | cfg->dir == DMA_MEM_TO_MEM) |
23 | l1 |= 1 << D40_MEM_LCSP1_SCFG_INCR_POS; | 35 | l1 |= BIT(D40_MEM_LCSP1_SCFG_INCR_POS); |
24 | 36 | ||
25 | /* dst is mem? -> increase address pos */ | 37 | /* dst is mem? -> increase address pos */ |
26 | if (cfg->dir == STEDMA40_PERIPH_TO_MEM || | 38 | if (cfg->dir == DMA_DEV_TO_MEM || |
27 | cfg->dir == STEDMA40_MEM_TO_MEM) | 39 | cfg->dir == DMA_MEM_TO_MEM) |
28 | l3 |= 1 << D40_MEM_LCSP3_DCFG_INCR_POS; | 40 | l3 |= BIT(D40_MEM_LCSP3_DCFG_INCR_POS); |
29 | 41 | ||
30 | /* src is hw? -> master port 1 */ | 42 | /* src is hw? -> master port 1 */ |
31 | if (cfg->dir == STEDMA40_PERIPH_TO_MEM || | 43 | if (cfg->dir == DMA_DEV_TO_MEM || |
32 | cfg->dir == STEDMA40_PERIPH_TO_PERIPH) | 44 | cfg->dir == DMA_DEV_TO_DEV) |
33 | l1 |= 1 << D40_MEM_LCSP1_SCFG_MST_POS; | 45 | l1 |= BIT(D40_MEM_LCSP1_SCFG_MST_POS); |
34 | 46 | ||
35 | /* dst is hw? -> master port 1 */ | 47 | /* dst is hw? -> master port 1 */ |
36 | if (cfg->dir == STEDMA40_MEM_TO_PERIPH || | 48 | if (cfg->dir == DMA_MEM_TO_DEV || |
37 | cfg->dir == STEDMA40_PERIPH_TO_PERIPH) | 49 | cfg->dir == DMA_DEV_TO_DEV) |
38 | l3 |= 1 << D40_MEM_LCSP3_DCFG_MST_POS; | 50 | l3 |= BIT(D40_MEM_LCSP3_DCFG_MST_POS); |
39 | 51 | ||
40 | l3 |= 1 << D40_MEM_LCSP3_DCFG_EIM_POS; | 52 | l3 |= BIT(D40_MEM_LCSP3_DCFG_EIM_POS); |
41 | l3 |= cfg->dst_info.psize << D40_MEM_LCSP3_DCFG_PSIZE_POS; | 53 | l3 |= cfg->dst_info.psize << D40_MEM_LCSP3_DCFG_PSIZE_POS; |
42 | l3 |= cfg->dst_info.data_width << D40_MEM_LCSP3_DCFG_ESIZE_POS; | 54 | l3 |= d40_width_to_bits(cfg->dst_info.data_width) |
55 | << D40_MEM_LCSP3_DCFG_ESIZE_POS; | ||
43 | 56 | ||
44 | l1 |= 1 << D40_MEM_LCSP1_SCFG_EIM_POS; | 57 | l1 |= BIT(D40_MEM_LCSP1_SCFG_EIM_POS); |
45 | l1 |= cfg->src_info.psize << D40_MEM_LCSP1_SCFG_PSIZE_POS; | 58 | l1 |= cfg->src_info.psize << D40_MEM_LCSP1_SCFG_PSIZE_POS; |
46 | l1 |= cfg->src_info.data_width << D40_MEM_LCSP1_SCFG_ESIZE_POS; | 59 | l1 |= d40_width_to_bits(cfg->src_info.data_width) |
60 | << D40_MEM_LCSP1_SCFG_ESIZE_POS; | ||
47 | 61 | ||
48 | *lcsp1 = l1; | 62 | *lcsp1 = l1; |
49 | *lcsp3 = l3; | 63 | *lcsp3 = l3; |
50 | 64 | ||
51 | } | 65 | } |
52 | 66 | ||
53 | /* Sets up SRC and DST CFG register for both logical and physical channels */ | 67 | void d40_phy_cfg(struct stedma40_chan_cfg *cfg, u32 *src_cfg, u32 *dst_cfg) |
54 | void d40_phy_cfg(struct stedma40_chan_cfg *cfg, | ||
55 | u32 *src_cfg, u32 *dst_cfg, bool is_log) | ||
56 | { | 68 | { |
57 | u32 src = 0; | 69 | u32 src = 0; |
58 | u32 dst = 0; | 70 | u32 dst = 0; |
59 | 71 | ||
60 | if (!is_log) { | 72 | if ((cfg->dir == DMA_DEV_TO_MEM) || |
61 | /* Physical channel */ | 73 | (cfg->dir == DMA_DEV_TO_DEV)) { |
62 | if ((cfg->dir == STEDMA40_PERIPH_TO_MEM) || | 74 | /* Set master port to 1 */ |
63 | (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) { | 75 | src |= BIT(D40_SREG_CFG_MST_POS); |
64 | /* Set master port to 1 */ | 76 | src |= D40_TYPE_TO_EVENT(cfg->dev_type); |
65 | src |= 1 << D40_SREG_CFG_MST_POS; | 77 | |
66 | src |= D40_TYPE_TO_EVENT(cfg->src_dev_type); | 78 | if (cfg->src_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL) |
67 | 79 | src |= BIT(D40_SREG_CFG_PHY_TM_POS); | |
68 | if (cfg->src_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL) | 80 | else |
69 | src |= 1 << D40_SREG_CFG_PHY_TM_POS; | 81 | src |= 3 << D40_SREG_CFG_PHY_TM_POS; |
70 | else | 82 | } |
71 | src |= 3 << D40_SREG_CFG_PHY_TM_POS; | 83 | if ((cfg->dir == DMA_MEM_TO_DEV) || |
72 | } | 84 | (cfg->dir == DMA_DEV_TO_DEV)) { |
73 | if ((cfg->dir == STEDMA40_MEM_TO_PERIPH) || | 85 | /* Set master port to 1 */ |
74 | (cfg->dir == STEDMA40_PERIPH_TO_PERIPH)) { | 86 | dst |= BIT(D40_SREG_CFG_MST_POS); |
75 | /* Set master port to 1 */ | 87 | dst |= D40_TYPE_TO_EVENT(cfg->dev_type); |
76 | dst |= 1 << D40_SREG_CFG_MST_POS; | 88 | |
77 | dst |= D40_TYPE_TO_EVENT(cfg->dst_dev_type); | 89 | if (cfg->dst_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL) |
78 | 90 | dst |= BIT(D40_SREG_CFG_PHY_TM_POS); | |
79 | if (cfg->dst_info.flow_ctrl == STEDMA40_NO_FLOW_CTRL) | 91 | else |
80 | dst |= 1 << D40_SREG_CFG_PHY_TM_POS; | 92 | dst |= 3 << D40_SREG_CFG_PHY_TM_POS; |
81 | else | 93 | } |
82 | dst |= 3 << D40_SREG_CFG_PHY_TM_POS; | 94 | /* Interrupt on end of transfer for destination */ |
83 | } | 95 | dst |= BIT(D40_SREG_CFG_TIM_POS); |
84 | /* Interrupt on end of transfer for destination */ | 96 | |
85 | dst |= 1 << D40_SREG_CFG_TIM_POS; | 97 | /* Generate interrupt on error */ |
86 | 98 | src |= BIT(D40_SREG_CFG_EIM_POS); | |
87 | /* Generate interrupt on error */ | 99 | dst |= BIT(D40_SREG_CFG_EIM_POS); |
88 | src |= 1 << D40_SREG_CFG_EIM_POS; | 100 | |
89 | dst |= 1 << D40_SREG_CFG_EIM_POS; | 101 | /* PSIZE */ |
90 | 102 | if (cfg->src_info.psize != STEDMA40_PSIZE_PHY_1) { | |
91 | /* PSIZE */ | 103 | src |= BIT(D40_SREG_CFG_PHY_PEN_POS); |
92 | if (cfg->src_info.psize != STEDMA40_PSIZE_PHY_1) { | 104 | src |= cfg->src_info.psize << D40_SREG_CFG_PSIZE_POS; |
93 | src |= 1 << D40_SREG_CFG_PHY_PEN_POS; | 105 | } |
94 | src |= cfg->src_info.psize << D40_SREG_CFG_PSIZE_POS; | 106 | if (cfg->dst_info.psize != STEDMA40_PSIZE_PHY_1) { |
95 | } | 107 | dst |= BIT(D40_SREG_CFG_PHY_PEN_POS); |
96 | if (cfg->dst_info.psize != STEDMA40_PSIZE_PHY_1) { | 108 | dst |= cfg->dst_info.psize << D40_SREG_CFG_PSIZE_POS; |
97 | dst |= 1 << D40_SREG_CFG_PHY_PEN_POS; | 109 | } |
98 | dst |= cfg->dst_info.psize << D40_SREG_CFG_PSIZE_POS; | 110 | |
99 | } | 111 | /* Element size */ |
100 | 112 | src |= d40_width_to_bits(cfg->src_info.data_width) | |
101 | /* Element size */ | 113 | << D40_SREG_CFG_ESIZE_POS; |
102 | src |= cfg->src_info.data_width << D40_SREG_CFG_ESIZE_POS; | 114 | dst |= d40_width_to_bits(cfg->dst_info.data_width) |
103 | dst |= cfg->dst_info.data_width << D40_SREG_CFG_ESIZE_POS; | 115 | << D40_SREG_CFG_ESIZE_POS; |
104 | 116 | ||
105 | /* Set the priority bit to high for the physical channel */ | 117 | /* Set the priority bit to high for the physical channel */ |
106 | if (cfg->high_priority) { | 118 | if (cfg->high_priority) { |
107 | src |= 1 << D40_SREG_CFG_PRI_POS; | 119 | src |= BIT(D40_SREG_CFG_PRI_POS); |
108 | dst |= 1 << D40_SREG_CFG_PRI_POS; | 120 | dst |= BIT(D40_SREG_CFG_PRI_POS); |
109 | } | ||
110 | |||
111 | } else { | ||
112 | /* Logical channel */ | ||
113 | dst |= 1 << D40_SREG_CFG_LOG_GIM_POS; | ||
114 | src |= 1 << D40_SREG_CFG_LOG_GIM_POS; | ||
115 | } | 121 | } |
116 | 122 | ||
117 | if (cfg->src_info.big_endian) | 123 | if (cfg->src_info.big_endian) |
118 | src |= 1 << D40_SREG_CFG_LBE_POS; | 124 | src |= BIT(D40_SREG_CFG_LBE_POS); |
119 | if (cfg->dst_info.big_endian) | 125 | if (cfg->dst_info.big_endian) |
120 | dst |= 1 << D40_SREG_CFG_LBE_POS; | 126 | dst |= BIT(D40_SREG_CFG_LBE_POS); |
121 | 127 | ||
122 | *src_cfg = src; | 128 | *src_cfg = src; |
123 | *dst_cfg = dst; | 129 | *dst_cfg = dst; |
@@ -143,23 +149,22 @@ static int d40_phy_fill_lli(struct d40_phy_lli *lli, | |||
143 | num_elems = 2 << psize; | 149 | num_elems = 2 << psize; |
144 | 150 | ||
145 | /* Must be aligned */ | 151 | /* Must be aligned */ |
146 | if (!IS_ALIGNED(data, 0x1 << data_width)) | 152 | if (!IS_ALIGNED(data, data_width)) |
147 | return -EINVAL; | 153 | return -EINVAL; |
148 | 154 | ||
149 | /* Transfer size can't be smaller than (num_elms * elem_size) */ | 155 | /* Transfer size can't be smaller than (num_elms * elem_size) */ |
150 | if (data_size < num_elems * (0x1 << data_width)) | 156 | if (data_size < num_elems * data_width) |
151 | return -EINVAL; | 157 | return -EINVAL; |
152 | 158 | ||
153 | /* The number of elements. IE now many chunks */ | 159 | /* The number of elements. IE now many chunks */ |
154 | lli->reg_elt = (data_size >> data_width) << D40_SREG_ELEM_PHY_ECNT_POS; | 160 | lli->reg_elt = (data_size / data_width) << D40_SREG_ELEM_PHY_ECNT_POS; |
155 | 161 | ||
156 | /* | 162 | /* |
157 | * Distance to next element sized entry. | 163 | * Distance to next element sized entry. |
158 | * Usually the size of the element unless you want gaps. | 164 | * Usually the size of the element unless you want gaps. |
159 | */ | 165 | */ |
160 | if (addr_inc) | 166 | if (addr_inc) |
161 | lli->reg_elt |= (0x1 << data_width) << | 167 | lli->reg_elt |= data_width << D40_SREG_ELEM_PHY_EIDX_POS; |
162 | D40_SREG_ELEM_PHY_EIDX_POS; | ||
163 | 168 | ||
164 | /* Where the data is */ | 169 | /* Where the data is */ |
165 | lli->reg_ptr = data; | 170 | lli->reg_ptr = data; |
@@ -167,18 +172,20 @@ static int d40_phy_fill_lli(struct d40_phy_lli *lli, | |||
167 | 172 | ||
168 | /* If this scatter list entry is the last one, no next link */ | 173 | /* If this scatter list entry is the last one, no next link */ |
169 | if (next_lli == 0) | 174 | if (next_lli == 0) |
170 | lli->reg_lnk = 0x1 << D40_SREG_LNK_PHY_TCP_POS; | 175 | lli->reg_lnk = BIT(D40_SREG_LNK_PHY_TCP_POS); |
171 | else | 176 | else |
172 | lli->reg_lnk = next_lli; | 177 | lli->reg_lnk = next_lli; |
173 | 178 | ||
174 | /* Set/clear interrupt generation on this link item.*/ | 179 | /* Set/clear interrupt generation on this link item.*/ |
175 | if (term_int) | 180 | if (term_int) |
176 | lli->reg_cfg |= 0x1 << D40_SREG_CFG_TIM_POS; | 181 | lli->reg_cfg |= BIT(D40_SREG_CFG_TIM_POS); |
177 | else | 182 | else |
178 | lli->reg_cfg &= ~(0x1 << D40_SREG_CFG_TIM_POS); | 183 | lli->reg_cfg &= ~BIT(D40_SREG_CFG_TIM_POS); |
179 | 184 | ||
180 | /* Post link */ | 185 | /* |
181 | lli->reg_lnk |= 0 << D40_SREG_LNK_PHY_PRE_POS; | 186 | * Post link - D40_SREG_LNK_PHY_PRE_POS = 0 |
187 | * Relink happens after transfer completion. | ||
188 | */ | ||
182 | 189 | ||
183 | return 0; | 190 | return 0; |
184 | } | 191 | } |
@@ -187,16 +194,16 @@ static int d40_seg_size(int size, int data_width1, int data_width2) | |||
187 | { | 194 | { |
188 | u32 max_w = max(data_width1, data_width2); | 195 | u32 max_w = max(data_width1, data_width2); |
189 | u32 min_w = min(data_width1, data_width2); | 196 | u32 min_w = min(data_width1, data_width2); |
190 | u32 seg_max = ALIGN(STEDMA40_MAX_SEG_SIZE << min_w, 1 << max_w); | 197 | u32 seg_max = ALIGN(STEDMA40_MAX_SEG_SIZE * min_w, max_w); |
191 | 198 | ||
192 | if (seg_max > STEDMA40_MAX_SEG_SIZE) | 199 | if (seg_max > STEDMA40_MAX_SEG_SIZE) |
193 | seg_max -= (1 << max_w); | 200 | seg_max -= max_w; |
194 | 201 | ||
195 | if (size <= seg_max) | 202 | if (size <= seg_max) |
196 | return size; | 203 | return size; |
197 | 204 | ||
198 | if (size <= 2 * seg_max) | 205 | if (size <= 2 * seg_max) |
199 | return ALIGN(size / 2, 1 << max_w); | 206 | return ALIGN(size / 2, max_w); |
200 | 207 | ||
201 | return seg_max; | 208 | return seg_max; |
202 | } | 209 | } |
@@ -362,10 +369,10 @@ static void d40_log_fill_lli(struct d40_log_lli *lli, | |||
362 | lli->lcsp13 = reg_cfg; | 369 | lli->lcsp13 = reg_cfg; |
363 | 370 | ||
364 | /* The number of elements to transfer */ | 371 | /* The number of elements to transfer */ |
365 | lli->lcsp02 = ((data_size >> data_width) << | 372 | lli->lcsp02 = ((data_size / data_width) << |
366 | D40_MEM_LCSP0_ECNT_POS) & D40_MEM_LCSP0_ECNT_MASK; | 373 | D40_MEM_LCSP0_ECNT_POS) & D40_MEM_LCSP0_ECNT_MASK; |
367 | 374 | ||
368 | BUG_ON((data_size >> data_width) > STEDMA40_MAX_SEG_SIZE); | 375 | BUG_ON((data_size / data_width) > STEDMA40_MAX_SEG_SIZE); |
369 | 376 | ||
370 | /* 16 LSBs address of the current element */ | 377 | /* 16 LSBs address of the current element */ |
371 | lli->lcsp02 |= data & D40_MEM_LCSP0_SPTR_MASK; | 378 | lli->lcsp02 |= data & D40_MEM_LCSP0_SPTR_MASK; |
diff --git a/drivers/dma/ste_dma40_ll.h b/drivers/dma/ste_dma40_ll.h index fdde8ef77542..1b47312bc574 100644 --- a/drivers/dma/ste_dma40_ll.h +++ b/drivers/dma/ste_dma40_ll.h | |||
@@ -432,8 +432,7 @@ enum d40_lli_flags { | |||
432 | 432 | ||
433 | void d40_phy_cfg(struct stedma40_chan_cfg *cfg, | 433 | void d40_phy_cfg(struct stedma40_chan_cfg *cfg, |
434 | u32 *src_cfg, | 434 | u32 *src_cfg, |
435 | u32 *dst_cfg, | 435 | u32 *dst_cfg); |
436 | bool is_log); | ||
437 | 436 | ||
438 | void d40_log_cfg(struct stedma40_chan_cfg *cfg, | 437 | void d40_log_cfg(struct stedma40_chan_cfg *cfg, |
439 | u32 *lcsp1, | 438 | u32 *lcsp1, |
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index d173d56dbb8c..6ec82f76f019 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c | |||
@@ -51,6 +51,8 @@ struct gpio_rcar_priv { | |||
51 | #define FILONOFF 0x28 | 51 | #define FILONOFF 0x28 |
52 | #define BOTHEDGE 0x4c | 52 | #define BOTHEDGE 0x4c |
53 | 53 | ||
54 | #define RCAR_MAX_GPIO_PER_BANK 32 | ||
55 | |||
54 | static inline u32 gpio_rcar_read(struct gpio_rcar_priv *p, int offs) | 56 | static inline u32 gpio_rcar_read(struct gpio_rcar_priv *p, int offs) |
55 | { | 57 | { |
56 | return ioread32(p->base + offs); | 58 | return ioread32(p->base + offs); |
@@ -274,9 +276,35 @@ static struct irq_domain_ops gpio_rcar_irq_domain_ops = { | |||
274 | .map = gpio_rcar_irq_domain_map, | 276 | .map = gpio_rcar_irq_domain_map, |
275 | }; | 277 | }; |
276 | 278 | ||
279 | static void gpio_rcar_parse_pdata(struct gpio_rcar_priv *p) | ||
280 | { | ||
281 | struct gpio_rcar_config *pdata = p->pdev->dev.platform_data; | ||
282 | struct device_node *np = p->pdev->dev.of_node; | ||
283 | struct of_phandle_args args; | ||
284 | int ret; | ||
285 | |||
286 | if (pdata) { | ||
287 | p->config = *pdata; | ||
288 | } else if (IS_ENABLED(CONFIG_OF) && np) { | ||
289 | ret = of_parse_phandle_with_args(np, "gpio-ranges", | ||
290 | "#gpio-range-cells", 0, &args); | ||
291 | p->config.number_of_pins = ret == 0 && args.args_count == 3 | ||
292 | ? args.args[2] | ||
293 | : RCAR_MAX_GPIO_PER_BANK; | ||
294 | p->config.gpio_base = -1; | ||
295 | } | ||
296 | |||
297 | if (p->config.number_of_pins == 0 || | ||
298 | p->config.number_of_pins > RCAR_MAX_GPIO_PER_BANK) { | ||
299 | dev_warn(&p->pdev->dev, | ||
300 | "Invalid number of gpio lines %u, using %u\n", | ||
301 | p->config.number_of_pins, RCAR_MAX_GPIO_PER_BANK); | ||
302 | p->config.number_of_pins = RCAR_MAX_GPIO_PER_BANK; | ||
303 | } | ||
304 | } | ||
305 | |||
277 | static int gpio_rcar_probe(struct platform_device *pdev) | 306 | static int gpio_rcar_probe(struct platform_device *pdev) |
278 | { | 307 | { |
279 | struct gpio_rcar_config *pdata = pdev->dev.platform_data; | ||
280 | struct gpio_rcar_priv *p; | 308 | struct gpio_rcar_priv *p; |
281 | struct resource *io, *irq; | 309 | struct resource *io, *irq; |
282 | struct gpio_chip *gpio_chip; | 310 | struct gpio_chip *gpio_chip; |
@@ -291,14 +319,14 @@ static int gpio_rcar_probe(struct platform_device *pdev) | |||
291 | goto err0; | 319 | goto err0; |
292 | } | 320 | } |
293 | 321 | ||
294 | /* deal with driver instance configuration */ | ||
295 | if (pdata) | ||
296 | p->config = *pdata; | ||
297 | |||
298 | p->pdev = pdev; | 322 | p->pdev = pdev; |
299 | platform_set_drvdata(pdev, p); | ||
300 | spin_lock_init(&p->lock); | 323 | spin_lock_init(&p->lock); |
301 | 324 | ||
325 | /* Get device configuration from DT node or platform data. */ | ||
326 | gpio_rcar_parse_pdata(p); | ||
327 | |||
328 | platform_set_drvdata(pdev, p); | ||
329 | |||
302 | io = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 330 | io = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
303 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 331 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
304 | 332 | ||
@@ -325,6 +353,7 @@ static int gpio_rcar_probe(struct platform_device *pdev) | |||
325 | gpio_chip->set = gpio_rcar_set; | 353 | gpio_chip->set = gpio_rcar_set; |
326 | gpio_chip->to_irq = gpio_rcar_to_irq; | 354 | gpio_chip->to_irq = gpio_rcar_to_irq; |
327 | gpio_chip->label = name; | 355 | gpio_chip->label = name; |
356 | gpio_chip->dev = &pdev->dev; | ||
328 | gpio_chip->owner = THIS_MODULE; | 357 | gpio_chip->owner = THIS_MODULE; |
329 | gpio_chip->base = p->config.gpio_base; | 358 | gpio_chip->base = p->config.gpio_base; |
330 | gpio_chip->ngpio = p->config.number_of_pins; | 359 | gpio_chip->ngpio = p->config.number_of_pins; |
@@ -371,10 +400,12 @@ static int gpio_rcar_probe(struct platform_device *pdev) | |||
371 | p->config.irq_base, ret); | 400 | p->config.irq_base, ret); |
372 | } | 401 | } |
373 | 402 | ||
374 | ret = gpiochip_add_pin_range(gpio_chip, p->config.pctl_name, 0, | 403 | if (p->config.pctl_name) { |
375 | gpio_chip->base, gpio_chip->ngpio); | 404 | ret = gpiochip_add_pin_range(gpio_chip, p->config.pctl_name, 0, |
376 | if (ret < 0) | 405 | gpio_chip->base, gpio_chip->ngpio); |
377 | dev_warn(&pdev->dev, "failed to add pin range\n"); | 406 | if (ret < 0) |
407 | dev_warn(&pdev->dev, "failed to add pin range\n"); | ||
408 | } | ||
378 | 409 | ||
379 | return 0; | 410 | return 0; |
380 | 411 | ||
@@ -397,11 +428,23 @@ static int gpio_rcar_remove(struct platform_device *pdev) | |||
397 | return 0; | 428 | return 0; |
398 | } | 429 | } |
399 | 430 | ||
431 | #ifdef CONFIG_OF | ||
432 | static const struct of_device_id gpio_rcar_of_table[] = { | ||
433 | { | ||
434 | .compatible = "renesas,gpio-rcar", | ||
435 | }, | ||
436 | { }, | ||
437 | }; | ||
438 | |||
439 | MODULE_DEVICE_TABLE(of, gpio_rcar_of_table); | ||
440 | #endif | ||
441 | |||
400 | static struct platform_driver gpio_rcar_device_driver = { | 442 | static struct platform_driver gpio_rcar_device_driver = { |
401 | .probe = gpio_rcar_probe, | 443 | .probe = gpio_rcar_probe, |
402 | .remove = gpio_rcar_remove, | 444 | .remove = gpio_rcar_remove, |
403 | .driver = { | 445 | .driver = { |
404 | .name = "gpio_rcar", | 446 | .name = "gpio_rcar", |
447 | .of_match_table = of_match_ptr(gpio_rcar_of_table), | ||
405 | } | 448 | } |
406 | }; | 449 | }; |
407 | 450 | ||
diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c index b22ca7933745..a1392f47bbda 100644 --- a/drivers/gpio/gpio-samsung.c +++ b/drivers/gpio/gpio-samsung.c | |||
@@ -933,67 +933,6 @@ static void __init samsung_gpiolib_add(struct samsung_gpio_chip *chip) | |||
933 | s3c_gpiolib_track(chip); | 933 | s3c_gpiolib_track(chip); |
934 | } | 934 | } |
935 | 935 | ||
936 | #if defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) | ||
937 | static int s3c24xx_gpio_xlate(struct gpio_chip *gc, | ||
938 | const struct of_phandle_args *gpiospec, u32 *flags) | ||
939 | { | ||
940 | unsigned int pin; | ||
941 | |||
942 | if (WARN_ON(gc->of_gpio_n_cells < 3)) | ||
943 | return -EINVAL; | ||
944 | |||
945 | if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells)) | ||
946 | return -EINVAL; | ||
947 | |||
948 | if (gpiospec->args[0] > gc->ngpio) | ||
949 | return -EINVAL; | ||
950 | |||
951 | pin = gc->base + gpiospec->args[0]; | ||
952 | |||
953 | if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1]))) | ||
954 | pr_warn("gpio_xlate: failed to set pin function\n"); | ||
955 | if (s3c_gpio_setpull(pin, gpiospec->args[2] & 0xffff)) | ||
956 | pr_warn("gpio_xlate: failed to set pin pull up/down\n"); | ||
957 | |||
958 | if (flags) | ||
959 | *flags = gpiospec->args[2] >> 16; | ||
960 | |||
961 | return gpiospec->args[0]; | ||
962 | } | ||
963 | |||
964 | static const struct of_device_id s3c24xx_gpio_dt_match[] __initdata = { | ||
965 | { .compatible = "samsung,s3c24xx-gpio", }, | ||
966 | {} | ||
967 | }; | ||
968 | |||
969 | static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, | ||
970 | u64 base, u64 offset) | ||
971 | { | ||
972 | struct gpio_chip *gc = &chip->chip; | ||
973 | u64 address; | ||
974 | |||
975 | if (!of_have_populated_dt()) | ||
976 | return; | ||
977 | |||
978 | address = chip->base ? base + ((u32)chip->base & 0xfff) : base + offset; | ||
979 | gc->of_node = of_find_matching_node_by_address(NULL, | ||
980 | s3c24xx_gpio_dt_match, address); | ||
981 | if (!gc->of_node) { | ||
982 | pr_info("gpio: device tree node not found for gpio controller" | ||
983 | " with base address %08llx\n", address); | ||
984 | return; | ||
985 | } | ||
986 | gc->of_gpio_n_cells = 3; | ||
987 | gc->of_xlate = s3c24xx_gpio_xlate; | ||
988 | } | ||
989 | #else | ||
990 | static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip, | ||
991 | u64 base, u64 offset) | ||
992 | { | ||
993 | return; | ||
994 | } | ||
995 | #endif /* defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) */ | ||
996 | |||
997 | static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip, | 936 | static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip, |
998 | int nr_chips, void __iomem *base) | 937 | int nr_chips, void __iomem *base) |
999 | { | 938 | { |
@@ -1018,8 +957,6 @@ static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip, | |||
1018 | gc->direction_output = samsung_gpiolib_2bit_output; | 957 | gc->direction_output = samsung_gpiolib_2bit_output; |
1019 | 958 | ||
1020 | samsung_gpiolib_add(chip); | 959 | samsung_gpiolib_add(chip); |
1021 | |||
1022 | s3c24xx_gpiolib_attach_ofnode(chip, S3C24XX_PA_GPIO, i * 0x10); | ||
1023 | } | 960 | } |
1024 | } | 961 | } |
1025 | 962 | ||
@@ -3026,6 +2963,10 @@ static __init int samsung_gpiolib_init(void) | |||
3026 | */ | 2963 | */ |
3027 | struct device_node *pctrl_np; | 2964 | struct device_node *pctrl_np; |
3028 | static const struct of_device_id exynos_pinctrl_ids[] = { | 2965 | static const struct of_device_id exynos_pinctrl_ids[] = { |
2966 | { .compatible = "samsung,s3c2412-pinctrl", }, | ||
2967 | { .compatible = "samsung,s3c2416-pinctrl", }, | ||
2968 | { .compatible = "samsung,s3c2440-pinctrl", }, | ||
2969 | { .compatible = "samsung,s3c2450-pinctrl", }, | ||
3029 | { .compatible = "samsung,exynos4210-pinctrl", }, | 2970 | { .compatible = "samsung,exynos4210-pinctrl", }, |
3030 | { .compatible = "samsung,exynos4x12-pinctrl", }, | 2971 | { .compatible = "samsung,exynos4x12-pinctrl", }, |
3031 | { .compatible = "samsung,exynos5250-pinctrl", }, | 2972 | { .compatible = "samsung,exynos5250-pinctrl", }, |
diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig index 9545c9f03809..c8b5c13bcd05 100644 --- a/drivers/mailbox/Kconfig +++ b/drivers/mailbox/Kconfig | |||
@@ -16,4 +16,38 @@ config PL320_MBOX | |||
16 | Management Engine, primarily for cpufreq. Say Y here if you want | 16 | Management Engine, primarily for cpufreq. Say Y here if you want |
17 | to use the PL320 IPCM support. | 17 | to use the PL320 IPCM support. |
18 | 18 | ||
19 | config OMAP_MBOX | ||
20 | tristate | ||
21 | help | ||
22 | This option is selected by any OMAP architecture specific mailbox | ||
23 | driver such as CONFIG_OMAP1_MBOX or CONFIG_OMAP2PLUS_MBOX. This | ||
24 | enables the common OMAP mailbox framework code. | ||
25 | |||
26 | config OMAP1_MBOX | ||
27 | tristate "OMAP1 Mailbox framework support" | ||
28 | depends on ARCH_OMAP1 | ||
29 | select OMAP_MBOX | ||
30 | help | ||
31 | Mailbox implementation for OMAP chips with hardware for | ||
32 | interprocessor communication involving DSP in OMAP1. Say Y here | ||
33 | if you want to use OMAP1 Mailbox framework support. | ||
34 | |||
35 | config OMAP2PLUS_MBOX | ||
36 | tristate "OMAP2+ Mailbox framework support" | ||
37 | depends on ARCH_OMAP2PLUS | ||
38 | select OMAP_MBOX | ||
39 | help | ||
40 | Mailbox implementation for OMAP family chips with hardware for | ||
41 | interprocessor communication involving DSP, IVA1.0 and IVA2 in | ||
42 | OMAP2/3; or IPU, IVA HD and DSP in OMAP4/5. Say Y here if you | ||
43 | want to use OMAP2+ Mailbox framework support. | ||
44 | |||
45 | config OMAP_MBOX_KFIFO_SIZE | ||
46 | int "Mailbox kfifo default buffer size (bytes)" | ||
47 | depends on OMAP2PLUS_MBOX || OMAP1_MBOX | ||
48 | default 256 | ||
49 | help | ||
50 | Specify the default size of mailbox's kfifo buffers (bytes). | ||
51 | This can also be changed at runtime (via the mbox_kfifo_size | ||
52 | module parameter). | ||
19 | endif | 53 | endif |
diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile index 543ad6a79505..e0facb34084a 100644 --- a/drivers/mailbox/Makefile +++ b/drivers/mailbox/Makefile | |||
@@ -1 +1,7 @@ | |||
1 | obj-$(CONFIG_PL320_MBOX) += pl320-ipc.o | 1 | obj-$(CONFIG_PL320_MBOX) += pl320-ipc.o |
2 | |||
3 | obj-$(CONFIG_OMAP_MBOX) += omap-mailbox.o | ||
4 | obj-$(CONFIG_OMAP1_MBOX) += mailbox_omap1.o | ||
5 | mailbox_omap1-objs := mailbox-omap1.o | ||
6 | obj-$(CONFIG_OMAP2PLUS_MBOX) += mailbox_omap2.o | ||
7 | mailbox_omap2-objs := mailbox-omap2.o | ||
diff --git a/arch/arm/mach-omap1/mailbox.c b/drivers/mailbox/mailbox-omap1.c index efc8f207f6fc..9001b7633f10 100644 --- a/arch/arm/mach-omap1/mailbox.c +++ b/drivers/mailbox/mailbox-omap1.c | |||
@@ -13,7 +13,8 @@ | |||
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <plat/mailbox.h> | 16 | |
17 | #include "omap-mbox.h" | ||
17 | 18 | ||
18 | #define MAILBOX_ARM2DSP1 0x00 | 19 | #define MAILBOX_ARM2DSP1 0x00 |
19 | #define MAILBOX_ARM2DSP1b 0x04 | 20 | #define MAILBOX_ARM2DSP1b 0x04 |
@@ -86,21 +87,21 @@ static int omap1_mbox_fifo_full(struct omap_mbox *mbox) | |||
86 | 87 | ||
87 | /* irq */ | 88 | /* irq */ |
88 | static void | 89 | static void |
89 | omap1_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_type_t irq) | 90 | omap1_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
90 | { | 91 | { |
91 | if (irq == IRQ_RX) | 92 | if (irq == IRQ_RX) |
92 | enable_irq(mbox->irq); | 93 | enable_irq(mbox->irq); |
93 | } | 94 | } |
94 | 95 | ||
95 | static void | 96 | static void |
96 | omap1_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_type_t irq) | 97 | omap1_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
97 | { | 98 | { |
98 | if (irq == IRQ_RX) | 99 | if (irq == IRQ_RX) |
99 | disable_irq(mbox->irq); | 100 | disable_irq(mbox->irq); |
100 | } | 101 | } |
101 | 102 | ||
102 | static int | 103 | static int |
103 | omap1_mbox_is_irq(struct omap_mbox *mbox, omap_mbox_type_t irq) | 104 | omap1_mbox_is_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
104 | { | 105 | { |
105 | if (irq == IRQ_TX) | 106 | if (irq == IRQ_TX) |
106 | return 0; | 107 | return 0; |
@@ -152,6 +153,9 @@ static int omap1_mbox_probe(struct platform_device *pdev) | |||
152 | list[0]->irq = platform_get_irq_byname(pdev, "dsp"); | 153 | list[0]->irq = platform_get_irq_byname(pdev, "dsp"); |
153 | 154 | ||
154 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 155 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
156 | if (!mem) | ||
157 | return -ENOENT; | ||
158 | |||
155 | mbox_base = ioremap(mem->start, resource_size(mem)); | 159 | mbox_base = ioremap(mem->start, resource_size(mem)); |
156 | if (!mbox_base) | 160 | if (!mbox_base) |
157 | return -ENOMEM; | 161 | return -ENOMEM; |
diff --git a/arch/arm/mach-omap2/mailbox.c b/drivers/mailbox/mailbox-omap2.c index 0b080267b7f6..eba380d7b17f 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/drivers/mailbox/mailbox-omap2.c | |||
@@ -11,15 +11,15 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/slab.h> | ||
14 | #include <linux/clk.h> | 15 | #include <linux/clk.h> |
15 | #include <linux/err.h> | 16 | #include <linux/err.h> |
16 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
17 | #include <linux/io.h> | 18 | #include <linux/io.h> |
18 | #include <linux/pm_runtime.h> | 19 | #include <linux/pm_runtime.h> |
20 | #include <linux/platform_data/mailbox-omap.h> | ||
19 | 21 | ||
20 | #include <plat/mailbox.h> | 22 | #include "omap-mbox.h" |
21 | |||
22 | #include "soc.h" | ||
23 | 23 | ||
24 | #define MAILBOX_REVISION 0x000 | 24 | #define MAILBOX_REVISION 0x000 |
25 | #define MAILBOX_MESSAGE(m) (0x040 + 4 * (m)) | 25 | #define MAILBOX_MESSAGE(m) (0x040 + 4 * (m)) |
@@ -59,11 +59,9 @@ struct omap_mbox2_priv { | |||
59 | u32 notfull_bit; | 59 | u32 notfull_bit; |
60 | u32 ctx[OMAP4_MBOX_NR_REGS]; | 60 | u32 ctx[OMAP4_MBOX_NR_REGS]; |
61 | unsigned long irqdisable; | 61 | unsigned long irqdisable; |
62 | u32 intr_type; | ||
62 | }; | 63 | }; |
63 | 64 | ||
64 | static void omap2_mbox_enable_irq(struct omap_mbox *mbox, | ||
65 | omap_mbox_type_t irq); | ||
66 | |||
67 | static inline unsigned int mbox_read_reg(size_t ofs) | 65 | static inline unsigned int mbox_read_reg(size_t ofs) |
68 | { | 66 | { |
69 | return __raw_readl(mbox_base + ofs); | 67 | return __raw_readl(mbox_base + ofs); |
@@ -124,8 +122,7 @@ static int omap2_mbox_fifo_full(struct omap_mbox *mbox) | |||
124 | } | 122 | } |
125 | 123 | ||
126 | /* Mailbox IRQ handle functions */ | 124 | /* Mailbox IRQ handle functions */ |
127 | static void omap2_mbox_enable_irq(struct omap_mbox *mbox, | 125 | static void omap2_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
128 | omap_mbox_type_t irq) | ||
129 | { | 126 | { |
130 | struct omap_mbox2_priv *p = mbox->priv; | 127 | struct omap_mbox2_priv *p = mbox->priv; |
131 | u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; | 128 | u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; |
@@ -135,20 +132,22 @@ static void omap2_mbox_enable_irq(struct omap_mbox *mbox, | |||
135 | mbox_write_reg(l, p->irqenable); | 132 | mbox_write_reg(l, p->irqenable); |
136 | } | 133 | } |
137 | 134 | ||
138 | static void omap2_mbox_disable_irq(struct omap_mbox *mbox, | 135 | static void omap2_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
139 | omap_mbox_type_t irq) | ||
140 | { | 136 | { |
141 | struct omap_mbox2_priv *p = mbox->priv; | 137 | struct omap_mbox2_priv *p = mbox->priv; |
142 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; | 138 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; |
143 | 139 | ||
144 | if (!cpu_is_omap44xx()) | 140 | /* |
141 | * Read and update the interrupt configuration register for pre-OMAP4. | ||
142 | * OMAP4 and later SoCs have a dedicated interrupt disabling register. | ||
143 | */ | ||
144 | if (!p->intr_type) | ||
145 | bit = mbox_read_reg(p->irqdisable) & ~bit; | 145 | bit = mbox_read_reg(p->irqdisable) & ~bit; |
146 | 146 | ||
147 | mbox_write_reg(bit, p->irqdisable); | 147 | mbox_write_reg(bit, p->irqdisable); |
148 | } | 148 | } |
149 | 149 | ||
150 | static void omap2_mbox_ack_irq(struct omap_mbox *mbox, | 150 | static void omap2_mbox_ack_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
151 | omap_mbox_type_t irq) | ||
152 | { | 151 | { |
153 | struct omap_mbox2_priv *p = mbox->priv; | 152 | struct omap_mbox2_priv *p = mbox->priv; |
154 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; | 153 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; |
@@ -159,8 +158,7 @@ static void omap2_mbox_ack_irq(struct omap_mbox *mbox, | |||
159 | mbox_read_reg(p->irqstatus); | 158 | mbox_read_reg(p->irqstatus); |
160 | } | 159 | } |
161 | 160 | ||
162 | static int omap2_mbox_is_irq(struct omap_mbox *mbox, | 161 | static int omap2_mbox_is_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) |
163 | omap_mbox_type_t irq) | ||
164 | { | 162 | { |
165 | struct omap_mbox2_priv *p = mbox->priv; | 163 | struct omap_mbox2_priv *p = mbox->priv; |
166 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; | 164 | u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; |
@@ -175,7 +173,8 @@ static void omap2_mbox_save_ctx(struct omap_mbox *mbox) | |||
175 | int i; | 173 | int i; |
176 | struct omap_mbox2_priv *p = mbox->priv; | 174 | struct omap_mbox2_priv *p = mbox->priv; |
177 | int nr_regs; | 175 | int nr_regs; |
178 | if (cpu_is_omap44xx()) | 176 | |
177 | if (p->intr_type) | ||
179 | nr_regs = OMAP4_MBOX_NR_REGS; | 178 | nr_regs = OMAP4_MBOX_NR_REGS; |
180 | else | 179 | else |
181 | nr_regs = MBOX_NR_REGS; | 180 | nr_regs = MBOX_NR_REGS; |
@@ -192,7 +191,8 @@ static void omap2_mbox_restore_ctx(struct omap_mbox *mbox) | |||
192 | int i; | 191 | int i; |
193 | struct omap_mbox2_priv *p = mbox->priv; | 192 | struct omap_mbox2_priv *p = mbox->priv; |
194 | int nr_regs; | 193 | int nr_regs; |
195 | if (cpu_is_omap44xx()) | 194 | |
195 | if (p->intr_type) | ||
196 | nr_regs = OMAP4_MBOX_NR_REGS; | 196 | nr_regs = OMAP4_MBOX_NR_REGS; |
197 | else | 197 | else |
198 | nr_regs = MBOX_NR_REGS; | 198 | nr_regs = MBOX_NR_REGS; |
@@ -220,192 +220,120 @@ static struct omap_mbox_ops omap2_mbox_ops = { | |||
220 | .restore_ctx = omap2_mbox_restore_ctx, | 220 | .restore_ctx = omap2_mbox_restore_ctx, |
221 | }; | 221 | }; |
222 | 222 | ||
223 | /* | ||
224 | * MAILBOX 0: ARM -> DSP, | ||
225 | * MAILBOX 1: ARM <- DSP. | ||
226 | * MAILBOX 2: ARM -> IVA, | ||
227 | * MAILBOX 3: ARM <- IVA. | ||
228 | */ | ||
229 | |||
230 | /* FIXME: the following structs should be filled automatically by the user id */ | ||
231 | |||
232 | #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP2) | ||
233 | /* DSP */ | ||
234 | static struct omap_mbox2_priv omap2_mbox_dsp_priv = { | ||
235 | .tx_fifo = { | ||
236 | .msg = MAILBOX_MESSAGE(0), | ||
237 | .fifo_stat = MAILBOX_FIFOSTATUS(0), | ||
238 | }, | ||
239 | .rx_fifo = { | ||
240 | .msg = MAILBOX_MESSAGE(1), | ||
241 | .msg_stat = MAILBOX_MSGSTATUS(1), | ||
242 | }, | ||
243 | .irqenable = MAILBOX_IRQENABLE(0), | ||
244 | .irqstatus = MAILBOX_IRQSTATUS(0), | ||
245 | .notfull_bit = MAILBOX_IRQ_NOTFULL(0), | ||
246 | .newmsg_bit = MAILBOX_IRQ_NEWMSG(1), | ||
247 | .irqdisable = MAILBOX_IRQENABLE(0), | ||
248 | }; | ||
249 | |||
250 | struct omap_mbox mbox_dsp_info = { | ||
251 | .name = "dsp", | ||
252 | .ops = &omap2_mbox_ops, | ||
253 | .priv = &omap2_mbox_dsp_priv, | ||
254 | }; | ||
255 | #endif | ||
256 | |||
257 | #if defined(CONFIG_ARCH_OMAP3) | ||
258 | struct omap_mbox *omap3_mboxes[] = { &mbox_dsp_info, NULL }; | ||
259 | #endif | ||
260 | |||
261 | #if defined(CONFIG_SOC_OMAP2420) | ||
262 | /* IVA */ | ||
263 | static struct omap_mbox2_priv omap2_mbox_iva_priv = { | ||
264 | .tx_fifo = { | ||
265 | .msg = MAILBOX_MESSAGE(2), | ||
266 | .fifo_stat = MAILBOX_FIFOSTATUS(2), | ||
267 | }, | ||
268 | .rx_fifo = { | ||
269 | .msg = MAILBOX_MESSAGE(3), | ||
270 | .msg_stat = MAILBOX_MSGSTATUS(3), | ||
271 | }, | ||
272 | .irqenable = MAILBOX_IRQENABLE(3), | ||
273 | .irqstatus = MAILBOX_IRQSTATUS(3), | ||
274 | .notfull_bit = MAILBOX_IRQ_NOTFULL(2), | ||
275 | .newmsg_bit = MAILBOX_IRQ_NEWMSG(3), | ||
276 | .irqdisable = MAILBOX_IRQENABLE(3), | ||
277 | }; | ||
278 | |||
279 | static struct omap_mbox mbox_iva_info = { | ||
280 | .name = "iva", | ||
281 | .ops = &omap2_mbox_ops, | ||
282 | .priv = &omap2_mbox_iva_priv, | ||
283 | }; | ||
284 | #endif | ||
285 | |||
286 | #ifdef CONFIG_ARCH_OMAP2 | ||
287 | struct omap_mbox *omap2_mboxes[] = { | ||
288 | &mbox_dsp_info, | ||
289 | #ifdef CONFIG_SOC_OMAP2420 | ||
290 | &mbox_iva_info, | ||
291 | #endif | ||
292 | NULL | ||
293 | }; | ||
294 | #endif | ||
295 | |||
296 | #if defined(CONFIG_ARCH_OMAP4) | ||
297 | /* OMAP4 */ | ||
298 | static struct omap_mbox2_priv omap2_mbox_1_priv = { | ||
299 | .tx_fifo = { | ||
300 | .msg = MAILBOX_MESSAGE(0), | ||
301 | .fifo_stat = MAILBOX_FIFOSTATUS(0), | ||
302 | }, | ||
303 | .rx_fifo = { | ||
304 | .msg = MAILBOX_MESSAGE(1), | ||
305 | .msg_stat = MAILBOX_MSGSTATUS(1), | ||
306 | }, | ||
307 | .irqenable = OMAP4_MAILBOX_IRQENABLE(0), | ||
308 | .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0), | ||
309 | .notfull_bit = MAILBOX_IRQ_NOTFULL(0), | ||
310 | .newmsg_bit = MAILBOX_IRQ_NEWMSG(1), | ||
311 | .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0), | ||
312 | }; | ||
313 | |||
314 | struct omap_mbox mbox_1_info = { | ||
315 | .name = "mailbox-1", | ||
316 | .ops = &omap2_mbox_ops, | ||
317 | .priv = &omap2_mbox_1_priv, | ||
318 | }; | ||
319 | |||
320 | static struct omap_mbox2_priv omap2_mbox_2_priv = { | ||
321 | .tx_fifo = { | ||
322 | .msg = MAILBOX_MESSAGE(3), | ||
323 | .fifo_stat = MAILBOX_FIFOSTATUS(3), | ||
324 | }, | ||
325 | .rx_fifo = { | ||
326 | .msg = MAILBOX_MESSAGE(2), | ||
327 | .msg_stat = MAILBOX_MSGSTATUS(2), | ||
328 | }, | ||
329 | .irqenable = OMAP4_MAILBOX_IRQENABLE(0), | ||
330 | .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0), | ||
331 | .notfull_bit = MAILBOX_IRQ_NOTFULL(3), | ||
332 | .newmsg_bit = MAILBOX_IRQ_NEWMSG(2), | ||
333 | .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0), | ||
334 | }; | ||
335 | |||
336 | struct omap_mbox mbox_2_info = { | ||
337 | .name = "mailbox-2", | ||
338 | .ops = &omap2_mbox_ops, | ||
339 | .priv = &omap2_mbox_2_priv, | ||
340 | }; | ||
341 | |||
342 | struct omap_mbox *omap4_mboxes[] = { &mbox_1_info, &mbox_2_info, NULL }; | ||
343 | #endif | ||
344 | |||
345 | static int omap2_mbox_probe(struct platform_device *pdev) | 223 | static int omap2_mbox_probe(struct platform_device *pdev) |
346 | { | 224 | { |
347 | struct resource *mem; | 225 | struct resource *mem; |
348 | int ret; | 226 | int ret; |
349 | struct omap_mbox **list; | 227 | struct omap_mbox **list, *mbox, *mboxblk; |
350 | 228 | struct omap_mbox2_priv *priv, *privblk; | |
351 | if (false) | 229 | struct omap_mbox_pdata *pdata = pdev->dev.platform_data; |
352 | ; | 230 | struct omap_mbox_dev_info *info; |
353 | #if defined(CONFIG_ARCH_OMAP3) | 231 | int i; |
354 | else if (cpu_is_omap34xx()) { | ||
355 | list = omap3_mboxes; | ||
356 | 232 | ||
357 | list[0]->irq = platform_get_irq(pdev, 0); | 233 | if (!pdata || !pdata->info_cnt || !pdata->info) { |
234 | pr_err("%s: platform not supported\n", __func__); | ||
235 | return -ENODEV; | ||
358 | } | 236 | } |
359 | #endif | ||
360 | #if defined(CONFIG_ARCH_OMAP2) | ||
361 | else if (cpu_is_omap2430()) { | ||
362 | list = omap2_mboxes; | ||
363 | 237 | ||
364 | list[0]->irq = platform_get_irq(pdev, 0); | 238 | /* allocate one extra for marking end of list */ |
365 | } else if (cpu_is_omap2420()) { | 239 | list = kzalloc((pdata->info_cnt + 1) * sizeof(*list), GFP_KERNEL); |
366 | list = omap2_mboxes; | 240 | if (!list) |
241 | return -ENOMEM; | ||
367 | 242 | ||
368 | list[0]->irq = platform_get_irq_byname(pdev, "dsp"); | 243 | mboxblk = mbox = kzalloc(pdata->info_cnt * sizeof(*mbox), GFP_KERNEL); |
369 | list[1]->irq = platform_get_irq_byname(pdev, "iva"); | 244 | if (!mboxblk) { |
245 | ret = -ENOMEM; | ||
246 | goto free_list; | ||
370 | } | 247 | } |
371 | #endif | ||
372 | #if defined(CONFIG_ARCH_OMAP4) | ||
373 | else if (cpu_is_omap44xx()) { | ||
374 | list = omap4_mboxes; | ||
375 | 248 | ||
376 | list[0]->irq = list[1]->irq = platform_get_irq(pdev, 0); | 249 | privblk = priv = kzalloc(pdata->info_cnt * sizeof(*priv), GFP_KERNEL); |
250 | if (!privblk) { | ||
251 | ret = -ENOMEM; | ||
252 | goto free_mboxblk; | ||
377 | } | 253 | } |
378 | #endif | 254 | |
379 | else { | 255 | info = pdata->info; |
380 | pr_err("%s: platform not supported\n", __func__); | 256 | for (i = 0; i < pdata->info_cnt; i++, info++, priv++) { |
381 | return -ENODEV; | 257 | priv->tx_fifo.msg = MAILBOX_MESSAGE(info->tx_id); |
258 | priv->tx_fifo.fifo_stat = MAILBOX_FIFOSTATUS(info->tx_id); | ||
259 | priv->rx_fifo.msg = MAILBOX_MESSAGE(info->rx_id); | ||
260 | priv->rx_fifo.msg_stat = MAILBOX_MSGSTATUS(info->rx_id); | ||
261 | priv->notfull_bit = MAILBOX_IRQ_NOTFULL(info->tx_id); | ||
262 | priv->newmsg_bit = MAILBOX_IRQ_NEWMSG(info->rx_id); | ||
263 | if (pdata->intr_type) { | ||
264 | priv->irqenable = OMAP4_MAILBOX_IRQENABLE(info->usr_id); | ||
265 | priv->irqstatus = OMAP4_MAILBOX_IRQSTATUS(info->usr_id); | ||
266 | priv->irqdisable = | ||
267 | OMAP4_MAILBOX_IRQENABLE_CLR(info->usr_id); | ||
268 | } else { | ||
269 | priv->irqenable = MAILBOX_IRQENABLE(info->usr_id); | ||
270 | priv->irqstatus = MAILBOX_IRQSTATUS(info->usr_id); | ||
271 | priv->irqdisable = MAILBOX_IRQENABLE(info->usr_id); | ||
272 | } | ||
273 | priv->intr_type = pdata->intr_type; | ||
274 | |||
275 | mbox->priv = priv; | ||
276 | mbox->name = info->name; | ||
277 | mbox->ops = &omap2_mbox_ops; | ||
278 | mbox->irq = platform_get_irq(pdev, info->irq_id); | ||
279 | if (mbox->irq < 0) { | ||
280 | ret = mbox->irq; | ||
281 | goto free_privblk; | ||
282 | } | ||
283 | list[i] = mbox++; | ||
382 | } | 284 | } |
383 | 285 | ||
384 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 286 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
287 | if (!mem) { | ||
288 | ret = -ENOENT; | ||
289 | goto free_privblk; | ||
290 | } | ||
291 | |||
385 | mbox_base = ioremap(mem->start, resource_size(mem)); | 292 | mbox_base = ioremap(mem->start, resource_size(mem)); |
386 | if (!mbox_base) | 293 | if (!mbox_base) { |
387 | return -ENOMEM; | 294 | ret = -ENOMEM; |
295 | goto free_privblk; | ||
296 | } | ||
388 | 297 | ||
389 | ret = omap_mbox_register(&pdev->dev, list); | 298 | ret = omap_mbox_register(&pdev->dev, list); |
390 | if (ret) { | 299 | if (ret) |
391 | iounmap(mbox_base); | 300 | goto unmap_mbox; |
392 | return ret; | 301 | platform_set_drvdata(pdev, list); |
393 | } | ||
394 | 302 | ||
395 | return 0; | 303 | return 0; |
304 | |||
305 | unmap_mbox: | ||
306 | iounmap(mbox_base); | ||
307 | free_privblk: | ||
308 | kfree(privblk); | ||
309 | free_mboxblk: | ||
310 | kfree(mboxblk); | ||
311 | free_list: | ||
312 | kfree(list); | ||
313 | return ret; | ||
396 | } | 314 | } |
397 | 315 | ||
398 | static int omap2_mbox_remove(struct platform_device *pdev) | 316 | static int omap2_mbox_remove(struct platform_device *pdev) |
399 | { | 317 | { |
318 | struct omap_mbox2_priv *privblk; | ||
319 | struct omap_mbox **list = platform_get_drvdata(pdev); | ||
320 | struct omap_mbox *mboxblk = list[0]; | ||
321 | |||
322 | privblk = mboxblk->priv; | ||
400 | omap_mbox_unregister(); | 323 | omap_mbox_unregister(); |
401 | iounmap(mbox_base); | 324 | iounmap(mbox_base); |
325 | kfree(privblk); | ||
326 | kfree(mboxblk); | ||
327 | kfree(list); | ||
328 | platform_set_drvdata(pdev, NULL); | ||
329 | |||
402 | return 0; | 330 | return 0; |
403 | } | 331 | } |
404 | 332 | ||
405 | static struct platform_driver omap2_mbox_driver = { | 333 | static struct platform_driver omap2_mbox_driver = { |
406 | .probe = omap2_mbox_probe, | 334 | .probe = omap2_mbox_probe, |
407 | .remove = omap2_mbox_remove, | 335 | .remove = omap2_mbox_remove, |
408 | .driver = { | 336 | .driver = { |
409 | .name = "omap-mailbox", | 337 | .name = "omap-mailbox", |
410 | }, | 338 | }, |
411 | }; | 339 | }; |
diff --git a/arch/arm/plat-omap/mailbox.c b/drivers/mailbox/omap-mailbox.c index 42377ef9ea3d..d79a646b9042 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/drivers/mailbox/omap-mailbox.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/notifier.h> | 31 | #include <linux/notifier.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | 33 | ||
34 | #include <plat/mailbox.h> | 34 | #include "omap-mbox.h" |
35 | 35 | ||
36 | static struct omap_mbox **mboxes; | 36 | static struct omap_mbox **mboxes; |
37 | 37 | ||
@@ -116,6 +116,40 @@ out: | |||
116 | } | 116 | } |
117 | EXPORT_SYMBOL(omap_mbox_msg_send); | 117 | EXPORT_SYMBOL(omap_mbox_msg_send); |
118 | 118 | ||
119 | void omap_mbox_save_ctx(struct omap_mbox *mbox) | ||
120 | { | ||
121 | if (!mbox->ops->save_ctx) { | ||
122 | dev_err(mbox->dev, "%s:\tno save\n", __func__); | ||
123 | return; | ||
124 | } | ||
125 | |||
126 | mbox->ops->save_ctx(mbox); | ||
127 | } | ||
128 | EXPORT_SYMBOL(omap_mbox_save_ctx); | ||
129 | |||
130 | void omap_mbox_restore_ctx(struct omap_mbox *mbox) | ||
131 | { | ||
132 | if (!mbox->ops->restore_ctx) { | ||
133 | dev_err(mbox->dev, "%s:\tno restore\n", __func__); | ||
134 | return; | ||
135 | } | ||
136 | |||
137 | mbox->ops->restore_ctx(mbox); | ||
138 | } | ||
139 | EXPORT_SYMBOL(omap_mbox_restore_ctx); | ||
140 | |||
141 | void omap_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | ||
142 | { | ||
143 | mbox->ops->enable_irq(mbox, irq); | ||
144 | } | ||
145 | EXPORT_SYMBOL(omap_mbox_enable_irq); | ||
146 | |||
147 | void omap_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) | ||
148 | { | ||
149 | mbox->ops->disable_irq(mbox, irq); | ||
150 | } | ||
151 | EXPORT_SYMBOL(omap_mbox_disable_irq); | ||
152 | |||
119 | static void mbox_tx_tasklet(unsigned long tx_data) | 153 | static void mbox_tx_tasklet(unsigned long tx_data) |
120 | { | 154 | { |
121 | struct omap_mbox *mbox = (struct omap_mbox *)tx_data; | 155 | struct omap_mbox *mbox = (struct omap_mbox *)tx_data; |
@@ -261,13 +295,6 @@ static int omap_mbox_startup(struct omap_mbox *mbox) | |||
261 | } | 295 | } |
262 | 296 | ||
263 | if (!mbox->use_count++) { | 297 | if (!mbox->use_count++) { |
264 | ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, | ||
265 | mbox->name, mbox); | ||
266 | if (unlikely(ret)) { | ||
267 | pr_err("failed to register mailbox interrupt:%d\n", | ||
268 | ret); | ||
269 | goto fail_request_irq; | ||
270 | } | ||
271 | mq = mbox_queue_alloc(mbox, NULL, mbox_tx_tasklet); | 298 | mq = mbox_queue_alloc(mbox, NULL, mbox_tx_tasklet); |
272 | if (!mq) { | 299 | if (!mq) { |
273 | ret = -ENOMEM; | 300 | ret = -ENOMEM; |
@@ -282,17 +309,24 @@ static int omap_mbox_startup(struct omap_mbox *mbox) | |||
282 | } | 309 | } |
283 | mbox->rxq = mq; | 310 | mbox->rxq = mq; |
284 | mq->mbox = mbox; | 311 | mq->mbox = mbox; |
312 | ret = request_irq(mbox->irq, mbox_interrupt, IRQF_SHARED, | ||
313 | mbox->name, mbox); | ||
314 | if (unlikely(ret)) { | ||
315 | pr_err("failed to register mailbox interrupt:%d\n", | ||
316 | ret); | ||
317 | goto fail_request_irq; | ||
318 | } | ||
285 | 319 | ||
286 | omap_mbox_enable_irq(mbox, IRQ_RX); | 320 | omap_mbox_enable_irq(mbox, IRQ_RX); |
287 | } | 321 | } |
288 | mutex_unlock(&mbox_configured_lock); | 322 | mutex_unlock(&mbox_configured_lock); |
289 | return 0; | 323 | return 0; |
290 | 324 | ||
325 | fail_request_irq: | ||
326 | mbox_queue_free(mbox->rxq); | ||
291 | fail_alloc_rxq: | 327 | fail_alloc_rxq: |
292 | mbox_queue_free(mbox->txq); | 328 | mbox_queue_free(mbox->txq); |
293 | fail_alloc_txq: | 329 | fail_alloc_txq: |
294 | free_irq(mbox->irq, mbox); | ||
295 | fail_request_irq: | ||
296 | if (mbox->ops->shutdown) | 330 | if (mbox->ops->shutdown) |
297 | mbox->ops->shutdown(mbox); | 331 | mbox->ops->shutdown(mbox); |
298 | mbox->use_count--; | 332 | mbox->use_count--; |
diff --git a/arch/arm/plat-omap/include/plat/mailbox.h b/drivers/mailbox/omap-mbox.h index cc3921e9059c..6cd38fc68599 100644 --- a/arch/arm/plat-omap/include/plat/mailbox.h +++ b/drivers/mailbox/omap-mbox.h | |||
@@ -1,20 +1,20 @@ | |||
1 | /* mailbox.h */ | 1 | /* |
2 | * omap-mbox.h: OMAP mailbox internal definitions | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
2 | 8 | ||
3 | #ifndef MAILBOX_H | 9 | #ifndef OMAP_MBOX_H |
4 | #define MAILBOX_H | 10 | #define OMAP_MBOX_H |
5 | 11 | ||
6 | #include <linux/spinlock.h> | ||
7 | #include <linux/workqueue.h> | ||
8 | #include <linux/interrupt.h> | ||
9 | #include <linux/device.h> | 12 | #include <linux/device.h> |
13 | #include <linux/interrupt.h> | ||
10 | #include <linux/kfifo.h> | 14 | #include <linux/kfifo.h> |
11 | 15 | #include <linux/spinlock.h> | |
12 | typedef u32 mbox_msg_t; | 16 | #include <linux/workqueue.h> |
13 | struct omap_mbox; | 17 | #include <linux/omap-mailbox.h> |
14 | |||
15 | typedef int __bitwise omap_mbox_irq_t; | ||
16 | #define IRQ_TX ((__force omap_mbox_irq_t) 1) | ||
17 | #define IRQ_RX ((__force omap_mbox_irq_t) 2) | ||
18 | 18 | ||
19 | typedef int __bitwise omap_mbox_type_t; | 19 | typedef int __bitwise omap_mbox_type_t; |
20 | #define OMAP_MBOX_TYPE1 ((__force omap_mbox_type_t) 1) | 20 | #define OMAP_MBOX_TYPE1 ((__force omap_mbox_type_t) 1) |
@@ -51,55 +51,17 @@ struct omap_mbox_queue { | |||
51 | }; | 51 | }; |
52 | 52 | ||
53 | struct omap_mbox { | 53 | struct omap_mbox { |
54 | char *name; | 54 | const char *name; |
55 | unsigned int irq; | 55 | unsigned int irq; |
56 | struct omap_mbox_queue *txq, *rxq; | 56 | struct omap_mbox_queue *txq, *rxq; |
57 | struct omap_mbox_ops *ops; | 57 | struct omap_mbox_ops *ops; |
58 | struct device *dev; | 58 | struct device *dev; |
59 | void *priv; | 59 | void *priv; |
60 | int use_count; | 60 | int use_count; |
61 | struct blocking_notifier_head notifier; | 61 | struct blocking_notifier_head notifier; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg); | ||
65 | void omap_mbox_init_seq(struct omap_mbox *); | ||
66 | |||
67 | struct omap_mbox *omap_mbox_get(const char *, struct notifier_block *nb); | ||
68 | void omap_mbox_put(struct omap_mbox *mbox, struct notifier_block *nb); | ||
69 | |||
70 | int omap_mbox_register(struct device *parent, struct omap_mbox **); | 64 | int omap_mbox_register(struct device *parent, struct omap_mbox **); |
71 | int omap_mbox_unregister(void); | 65 | int omap_mbox_unregister(void); |
72 | 66 | ||
73 | static inline void omap_mbox_save_ctx(struct omap_mbox *mbox) | 67 | #endif /* OMAP_MBOX_H */ |
74 | { | ||
75 | if (!mbox->ops->save_ctx) { | ||
76 | dev_err(mbox->dev, "%s:\tno save\n", __func__); | ||
77 | return; | ||
78 | } | ||
79 | |||
80 | mbox->ops->save_ctx(mbox); | ||
81 | } | ||
82 | |||
83 | static inline void omap_mbox_restore_ctx(struct omap_mbox *mbox) | ||
84 | { | ||
85 | if (!mbox->ops->restore_ctx) { | ||
86 | dev_err(mbox->dev, "%s:\tno restore\n", __func__); | ||
87 | return; | ||
88 | } | ||
89 | |||
90 | mbox->ops->restore_ctx(mbox); | ||
91 | } | ||
92 | |||
93 | static inline void omap_mbox_enable_irq(struct omap_mbox *mbox, | ||
94 | omap_mbox_irq_t irq) | ||
95 | { | ||
96 | mbox->ops->enable_irq(mbox, irq); | ||
97 | } | ||
98 | |||
99 | static inline void omap_mbox_disable_irq(struct omap_mbox *mbox, | ||
100 | omap_mbox_irq_t irq) | ||
101 | { | ||
102 | mbox->ops->disable_irq(mbox, irq); | ||
103 | } | ||
104 | |||
105 | #endif /* MAILBOX_H */ | ||
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index a1c6dd32e14b..901a388dbea7 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
@@ -217,6 +217,11 @@ config PINCTRL_EXYNOS5440 | |||
217 | select PINMUX | 217 | select PINMUX |
218 | select PINCONF | 218 | select PINCONF |
219 | 219 | ||
220 | config PINCTRL_S3C24XX | ||
221 | bool "Samsung S3C24XX SoC pinctrl driver" | ||
222 | depends on ARCH_S3C24XX | ||
223 | select PINCTRL_SAMSUNG | ||
224 | |||
220 | config PINCTRL_S3C64XX | 225 | config PINCTRL_S3C64XX |
221 | bool "Samsung S3C64XX SoC pinctrl driver" | 226 | bool "Samsung S3C64XX SoC pinctrl driver" |
222 | depends on ARCH_S3C64XX | 227 | depends on ARCH_S3C64XX |
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 9bdaeb8785ce..f90b645fb601 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
@@ -42,6 +42,7 @@ obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o | |||
42 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o | 42 | obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o |
43 | obj-$(CONFIG_PINCTRL_EXYNOS) += pinctrl-exynos.o | 43 | obj-$(CONFIG_PINCTRL_EXYNOS) += pinctrl-exynos.o |
44 | obj-$(CONFIG_PINCTRL_EXYNOS5440) += pinctrl-exynos5440.o | 44 | obj-$(CONFIG_PINCTRL_EXYNOS5440) += pinctrl-exynos5440.o |
45 | obj-$(CONFIG_PINCTRL_S3C24XX) += pinctrl-s3c24xx.o | ||
45 | obj-$(CONFIG_PINCTRL_S3C64XX) += pinctrl-s3c64xx.o | 46 | obj-$(CONFIG_PINCTRL_S3C64XX) += pinctrl-s3c64xx.o |
46 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o | 47 | obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o |
47 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o | 48 | obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o |
diff --git a/drivers/pinctrl/pinctrl-s3c24xx.c b/drivers/pinctrl/pinctrl-s3c24xx.c new file mode 100644 index 000000000000..24446daaad7d --- /dev/null +++ b/drivers/pinctrl/pinctrl-s3c24xx.c | |||
@@ -0,0 +1,651 @@ | |||
1 | /* | ||
2 | * S3C24XX specific support for Samsung pinctrl/gpiolib driver. | ||
3 | * | ||
4 | * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This file contains the SamsungS3C24XX specific information required by the | ||
12 | * Samsung pinctrl/gpiolib driver. It also includes the implementation of | ||
13 | * external gpio and wakeup interrupt support. | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/device.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/irqdomain.h> | ||
20 | #include <linux/irq.h> | ||
21 | #include <linux/of_irq.h> | ||
22 | #include <linux/irqchip/chained_irq.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <linux/slab.h> | ||
25 | #include <linux/err.h> | ||
26 | |||
27 | #include "pinctrl-samsung.h" | ||
28 | |||
29 | #define NUM_EINT 24 | ||
30 | #define NUM_EINT_IRQ 6 | ||
31 | #define EINT_MAX_PER_GROUP 8 | ||
32 | |||
33 | #define EINTPEND_REG 0xa8 | ||
34 | #define EINTMASK_REG 0xa4 | ||
35 | |||
36 | #define EINT_GROUP(i) ((int)((i) / EINT_MAX_PER_GROUP)) | ||
37 | #define EINT_REG(i) ((EINT_GROUP(i) * 4) + 0x88) | ||
38 | #define EINT_OFFS(i) ((i) % EINT_MAX_PER_GROUP * 4) | ||
39 | |||
40 | #define EINT_LEVEL_LOW 0 | ||
41 | #define EINT_LEVEL_HIGH 1 | ||
42 | #define EINT_EDGE_FALLING 2 | ||
43 | #define EINT_EDGE_RISING 4 | ||
44 | #define EINT_EDGE_BOTH 6 | ||
45 | #define EINT_MASK 0xf | ||
46 | |||
47 | static struct samsung_pin_bank_type bank_type_1bit = { | ||
48 | .fld_width = { 1, 1, }, | ||
49 | .reg_offset = { 0x00, 0x04, }, | ||
50 | }; | ||
51 | |||
52 | static struct samsung_pin_bank_type bank_type_2bit = { | ||
53 | .fld_width = { 2, 1, 2, }, | ||
54 | .reg_offset = { 0x00, 0x04, 0x08, }, | ||
55 | }; | ||
56 | |||
57 | #define PIN_BANK_A(pins, reg, id) \ | ||
58 | { \ | ||
59 | .type = &bank_type_1bit, \ | ||
60 | .pctl_offset = reg, \ | ||
61 | .nr_pins = pins, \ | ||
62 | .eint_type = EINT_TYPE_NONE, \ | ||
63 | .name = id \ | ||
64 | } | ||
65 | |||
66 | #define PIN_BANK_2BIT(pins, reg, id) \ | ||
67 | { \ | ||
68 | .type = &bank_type_2bit, \ | ||
69 | .pctl_offset = reg, \ | ||
70 | .nr_pins = pins, \ | ||
71 | .eint_type = EINT_TYPE_NONE, \ | ||
72 | .name = id \ | ||
73 | } | ||
74 | |||
75 | #define PIN_BANK_2BIT_EINTW(pins, reg, id, eoffs, emask)\ | ||
76 | { \ | ||
77 | .type = &bank_type_2bit, \ | ||
78 | .pctl_offset = reg, \ | ||
79 | .nr_pins = pins, \ | ||
80 | .eint_type = EINT_TYPE_WKUP, \ | ||
81 | .eint_func = 2, \ | ||
82 | .eint_mask = emask, \ | ||
83 | .eint_offset = eoffs, \ | ||
84 | .name = id \ | ||
85 | } | ||
86 | |||
87 | /** | ||
88 | * struct s3c24xx_eint_data: EINT common data | ||
89 | * @drvdata: pin controller driver data | ||
90 | * @domains: IRQ domains of particular EINT interrupts | ||
91 | * @parents: mapped parent irqs in the main interrupt controller | ||
92 | */ | ||
93 | struct s3c24xx_eint_data { | ||
94 | struct samsung_pinctrl_drv_data *drvdata; | ||
95 | struct irq_domain *domains[NUM_EINT]; | ||
96 | int parents[NUM_EINT_IRQ]; | ||
97 | }; | ||
98 | |||
99 | /** | ||
100 | * struct s3c24xx_eint_domain_data: per irq-domain data | ||
101 | * @bank: pin bank related to the domain | ||
102 | * @eint_data: common data | ||
103 | * eint0_3_parent_only: live eints 0-3 only in the main intc | ||
104 | */ | ||
105 | struct s3c24xx_eint_domain_data { | ||
106 | struct samsung_pin_bank *bank; | ||
107 | struct s3c24xx_eint_data *eint_data; | ||
108 | bool eint0_3_parent_only; | ||
109 | }; | ||
110 | |||
111 | static int s3c24xx_eint_get_trigger(unsigned int type) | ||
112 | { | ||
113 | switch (type) { | ||
114 | case IRQ_TYPE_EDGE_RISING: | ||
115 | return EINT_EDGE_RISING; | ||
116 | break; | ||
117 | case IRQ_TYPE_EDGE_FALLING: | ||
118 | return EINT_EDGE_FALLING; | ||
119 | break; | ||
120 | case IRQ_TYPE_EDGE_BOTH: | ||
121 | return EINT_EDGE_BOTH; | ||
122 | break; | ||
123 | case IRQ_TYPE_LEVEL_HIGH: | ||
124 | return EINT_LEVEL_HIGH; | ||
125 | break; | ||
126 | case IRQ_TYPE_LEVEL_LOW: | ||
127 | return EINT_LEVEL_LOW; | ||
128 | break; | ||
129 | default: | ||
130 | return -EINVAL; | ||
131 | } | ||
132 | } | ||
133 | |||
134 | static void s3c24xx_eint_set_handler(unsigned int irq, unsigned int type) | ||
135 | { | ||
136 | /* Edge- and level-triggered interrupts need different handlers */ | ||
137 | if (type & IRQ_TYPE_EDGE_BOTH) | ||
138 | __irq_set_handler_locked(irq, handle_edge_irq); | ||
139 | else | ||
140 | __irq_set_handler_locked(irq, handle_level_irq); | ||
141 | } | ||
142 | |||
143 | static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d, | ||
144 | struct samsung_pin_bank *bank, int pin) | ||
145 | { | ||
146 | struct samsung_pin_bank_type *bank_type = bank->type; | ||
147 | unsigned long flags; | ||
148 | void __iomem *reg; | ||
149 | u8 shift; | ||
150 | u32 mask; | ||
151 | u32 val; | ||
152 | |||
153 | /* Make sure that pin is configured as interrupt */ | ||
154 | reg = d->virt_base + bank->pctl_offset; | ||
155 | shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC]; | ||
156 | mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1; | ||
157 | |||
158 | spin_lock_irqsave(&bank->slock, flags); | ||
159 | |||
160 | val = readl(reg); | ||
161 | val &= ~(mask << shift); | ||
162 | val |= bank->eint_func << shift; | ||
163 | writel(val, reg); | ||
164 | |||
165 | spin_unlock_irqrestore(&bank->slock, flags); | ||
166 | } | ||
167 | |||
168 | static int s3c24xx_eint_type(struct irq_data *data, unsigned int type) | ||
169 | { | ||
170 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
171 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
172 | int index = bank->eint_offset + data->hwirq; | ||
173 | void __iomem *reg; | ||
174 | int trigger; | ||
175 | u8 shift; | ||
176 | u32 val; | ||
177 | |||
178 | trigger = s3c24xx_eint_get_trigger(type); | ||
179 | if (trigger < 0) { | ||
180 | dev_err(d->dev, "unsupported external interrupt type\n"); | ||
181 | return -EINVAL; | ||
182 | } | ||
183 | |||
184 | s3c24xx_eint_set_handler(data->irq, type); | ||
185 | |||
186 | /* Set up interrupt trigger */ | ||
187 | reg = d->virt_base + EINT_REG(index); | ||
188 | shift = EINT_OFFS(index); | ||
189 | |||
190 | val = readl(reg); | ||
191 | val &= ~(EINT_MASK << shift); | ||
192 | val |= trigger << shift; | ||
193 | writel(val, reg); | ||
194 | |||
195 | s3c24xx_eint_set_function(d, bank, data->hwirq); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | /* Handling of EINTs 0-3 on all except S3C2412 and S3C2413 */ | ||
201 | |||
202 | static void s3c2410_eint0_3_ack(struct irq_data *data) | ||
203 | { | ||
204 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
205 | struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data; | ||
206 | struct s3c24xx_eint_data *eint_data = ddata->eint_data; | ||
207 | int parent_irq = eint_data->parents[data->hwirq]; | ||
208 | struct irq_chip *parent_chip = irq_get_chip(parent_irq); | ||
209 | |||
210 | parent_chip->irq_ack(irq_get_irq_data(parent_irq)); | ||
211 | } | ||
212 | |||
213 | static void s3c2410_eint0_3_mask(struct irq_data *data) | ||
214 | { | ||
215 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
216 | struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data; | ||
217 | struct s3c24xx_eint_data *eint_data = ddata->eint_data; | ||
218 | int parent_irq = eint_data->parents[data->hwirq]; | ||
219 | struct irq_chip *parent_chip = irq_get_chip(parent_irq); | ||
220 | |||
221 | parent_chip->irq_mask(irq_get_irq_data(parent_irq)); | ||
222 | } | ||
223 | |||
224 | static void s3c2410_eint0_3_unmask(struct irq_data *data) | ||
225 | { | ||
226 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
227 | struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data; | ||
228 | struct s3c24xx_eint_data *eint_data = ddata->eint_data; | ||
229 | int parent_irq = eint_data->parents[data->hwirq]; | ||
230 | struct irq_chip *parent_chip = irq_get_chip(parent_irq); | ||
231 | |||
232 | parent_chip->irq_unmask(irq_get_irq_data(parent_irq)); | ||
233 | } | ||
234 | |||
235 | static struct irq_chip s3c2410_eint0_3_chip = { | ||
236 | .name = "s3c2410-eint0_3", | ||
237 | .irq_ack = s3c2410_eint0_3_ack, | ||
238 | .irq_mask = s3c2410_eint0_3_mask, | ||
239 | .irq_unmask = s3c2410_eint0_3_unmask, | ||
240 | .irq_set_type = s3c24xx_eint_type, | ||
241 | }; | ||
242 | |||
243 | static void s3c2410_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
244 | { | ||
245 | struct irq_data *data = irq_desc_get_irq_data(desc); | ||
246 | struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq); | ||
247 | unsigned int virq; | ||
248 | |||
249 | /* the first 4 eints have a simple 1 to 1 mapping */ | ||
250 | virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq); | ||
251 | /* Something must be really wrong if an unmapped EINT is unmasked */ | ||
252 | BUG_ON(!virq); | ||
253 | |||
254 | generic_handle_irq(virq); | ||
255 | } | ||
256 | |||
257 | /* Handling of EINTs 0-3 on S3C2412 and S3C2413 */ | ||
258 | |||
259 | static void s3c2412_eint0_3_ack(struct irq_data *data) | ||
260 | { | ||
261 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
262 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
263 | |||
264 | unsigned long bitval = 1UL << data->hwirq; | ||
265 | writel(bitval, d->virt_base + EINTPEND_REG); | ||
266 | } | ||
267 | |||
268 | static void s3c2412_eint0_3_mask(struct irq_data *data) | ||
269 | { | ||
270 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
271 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
272 | unsigned long mask; | ||
273 | |||
274 | mask = readl(d->virt_base + EINTMASK_REG); | ||
275 | mask |= (1UL << data->hwirq); | ||
276 | writel(mask, d->virt_base + EINTMASK_REG); | ||
277 | } | ||
278 | |||
279 | static void s3c2412_eint0_3_unmask(struct irq_data *data) | ||
280 | { | ||
281 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
282 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
283 | unsigned long mask; | ||
284 | |||
285 | mask = readl(d->virt_base + EINTMASK_REG); | ||
286 | mask &= ~(1UL << data->hwirq); | ||
287 | writel(mask, d->virt_base + EINTMASK_REG); | ||
288 | } | ||
289 | |||
290 | static struct irq_chip s3c2412_eint0_3_chip = { | ||
291 | .name = "s3c2412-eint0_3", | ||
292 | .irq_ack = s3c2412_eint0_3_ack, | ||
293 | .irq_mask = s3c2412_eint0_3_mask, | ||
294 | .irq_unmask = s3c2412_eint0_3_unmask, | ||
295 | .irq_set_type = s3c24xx_eint_type, | ||
296 | }; | ||
297 | |||
298 | static void s3c2412_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
299 | { | ||
300 | struct irq_chip *chip = irq_get_chip(irq); | ||
301 | struct irq_data *data = irq_desc_get_irq_data(desc); | ||
302 | struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq); | ||
303 | unsigned int virq; | ||
304 | |||
305 | chained_irq_enter(chip, desc); | ||
306 | |||
307 | /* the first 4 eints have a simple 1 to 1 mapping */ | ||
308 | virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq); | ||
309 | /* Something must be really wrong if an unmapped EINT is unmasked */ | ||
310 | BUG_ON(!virq); | ||
311 | |||
312 | generic_handle_irq(virq); | ||
313 | |||
314 | chained_irq_exit(chip, desc); | ||
315 | } | ||
316 | |||
317 | /* Handling of all other eints */ | ||
318 | |||
319 | static void s3c24xx_eint_ack(struct irq_data *data) | ||
320 | { | ||
321 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
322 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
323 | unsigned char index = bank->eint_offset + data->hwirq; | ||
324 | |||
325 | writel(1UL << index, d->virt_base + EINTPEND_REG); | ||
326 | } | ||
327 | |||
328 | static void s3c24xx_eint_mask(struct irq_data *data) | ||
329 | { | ||
330 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
331 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
332 | unsigned char index = bank->eint_offset + data->hwirq; | ||
333 | unsigned long mask; | ||
334 | |||
335 | mask = readl(d->virt_base + EINTMASK_REG); | ||
336 | mask |= (1UL << index); | ||
337 | writel(mask, d->virt_base + EINTMASK_REG); | ||
338 | } | ||
339 | |||
340 | static void s3c24xx_eint_unmask(struct irq_data *data) | ||
341 | { | ||
342 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data); | ||
343 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
344 | unsigned char index = bank->eint_offset + data->hwirq; | ||
345 | unsigned long mask; | ||
346 | |||
347 | mask = readl(d->virt_base + EINTMASK_REG); | ||
348 | mask &= ~(1UL << index); | ||
349 | writel(mask, d->virt_base + EINTMASK_REG); | ||
350 | } | ||
351 | |||
352 | static struct irq_chip s3c24xx_eint_chip = { | ||
353 | .name = "s3c-eint", | ||
354 | .irq_ack = s3c24xx_eint_ack, | ||
355 | .irq_mask = s3c24xx_eint_mask, | ||
356 | .irq_unmask = s3c24xx_eint_unmask, | ||
357 | .irq_set_type = s3c24xx_eint_type, | ||
358 | }; | ||
359 | |||
360 | static inline void s3c24xx_demux_eint(unsigned int irq, struct irq_desc *desc, | ||
361 | u32 offset, u32 range) | ||
362 | { | ||
363 | struct irq_chip *chip = irq_get_chip(irq); | ||
364 | struct s3c24xx_eint_data *data = irq_get_handler_data(irq); | ||
365 | struct samsung_pinctrl_drv_data *d = data->drvdata; | ||
366 | unsigned int pend, mask; | ||
367 | |||
368 | chained_irq_enter(chip, desc); | ||
369 | |||
370 | pend = readl(d->virt_base + EINTPEND_REG); | ||
371 | mask = readl(d->virt_base + EINTMASK_REG); | ||
372 | |||
373 | pend &= ~mask; | ||
374 | pend &= range; | ||
375 | |||
376 | while (pend) { | ||
377 | unsigned int virq; | ||
378 | |||
379 | irq = __ffs(pend); | ||
380 | pend &= ~(1 << irq); | ||
381 | virq = irq_linear_revmap(data->domains[irq], irq - offset); | ||
382 | /* Something is really wrong if an unmapped EINT is unmasked */ | ||
383 | BUG_ON(!virq); | ||
384 | |||
385 | generic_handle_irq(virq); | ||
386 | } | ||
387 | |||
388 | chained_irq_exit(chip, desc); | ||
389 | } | ||
390 | |||
391 | static void s3c24xx_demux_eint4_7(unsigned int irq, struct irq_desc *desc) | ||
392 | { | ||
393 | s3c24xx_demux_eint(irq, desc, 0, 0xf0); | ||
394 | } | ||
395 | |||
396 | static void s3c24xx_demux_eint8_23(unsigned int irq, struct irq_desc *desc) | ||
397 | { | ||
398 | s3c24xx_demux_eint(irq, desc, 8, 0xffff00); | ||
399 | } | ||
400 | |||
401 | static irq_flow_handler_t s3c2410_eint_handlers[NUM_EINT_IRQ] = { | ||
402 | s3c2410_demux_eint0_3, | ||
403 | s3c2410_demux_eint0_3, | ||
404 | s3c2410_demux_eint0_3, | ||
405 | s3c2410_demux_eint0_3, | ||
406 | s3c24xx_demux_eint4_7, | ||
407 | s3c24xx_demux_eint8_23, | ||
408 | }; | ||
409 | |||
410 | static irq_flow_handler_t s3c2412_eint_handlers[NUM_EINT_IRQ] = { | ||
411 | s3c2412_demux_eint0_3, | ||
412 | s3c2412_demux_eint0_3, | ||
413 | s3c2412_demux_eint0_3, | ||
414 | s3c2412_demux_eint0_3, | ||
415 | s3c24xx_demux_eint4_7, | ||
416 | s3c24xx_demux_eint8_23, | ||
417 | }; | ||
418 | |||
419 | static int s3c24xx_gpf_irq_map(struct irq_domain *h, unsigned int virq, | ||
420 | irq_hw_number_t hw) | ||
421 | { | ||
422 | struct s3c24xx_eint_domain_data *ddata = h->host_data; | ||
423 | struct samsung_pin_bank *bank = ddata->bank; | ||
424 | |||
425 | if (!(bank->eint_mask & (1 << (bank->eint_offset + hw)))) | ||
426 | return -EINVAL; | ||
427 | |||
428 | if (hw <= 3) { | ||
429 | if (ddata->eint0_3_parent_only) | ||
430 | irq_set_chip_and_handler(virq, &s3c2410_eint0_3_chip, | ||
431 | handle_edge_irq); | ||
432 | else | ||
433 | irq_set_chip_and_handler(virq, &s3c2412_eint0_3_chip, | ||
434 | handle_edge_irq); | ||
435 | } else { | ||
436 | irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, | ||
437 | handle_edge_irq); | ||
438 | } | ||
439 | irq_set_chip_data(virq, bank); | ||
440 | set_irq_flags(virq, IRQF_VALID); | ||
441 | return 0; | ||
442 | } | ||
443 | |||
444 | static const struct irq_domain_ops s3c24xx_gpf_irq_ops = { | ||
445 | .map = s3c24xx_gpf_irq_map, | ||
446 | .xlate = irq_domain_xlate_twocell, | ||
447 | }; | ||
448 | |||
449 | static int s3c24xx_gpg_irq_map(struct irq_domain *h, unsigned int virq, | ||
450 | irq_hw_number_t hw) | ||
451 | { | ||
452 | struct s3c24xx_eint_domain_data *ddata = h->host_data; | ||
453 | struct samsung_pin_bank *bank = ddata->bank; | ||
454 | |||
455 | if (!(bank->eint_mask & (1 << (bank->eint_offset + hw)))) | ||
456 | return -EINVAL; | ||
457 | |||
458 | irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, handle_edge_irq); | ||
459 | irq_set_chip_data(virq, bank); | ||
460 | set_irq_flags(virq, IRQF_VALID); | ||
461 | return 0; | ||
462 | } | ||
463 | |||
464 | static const struct irq_domain_ops s3c24xx_gpg_irq_ops = { | ||
465 | .map = s3c24xx_gpg_irq_map, | ||
466 | .xlate = irq_domain_xlate_twocell, | ||
467 | }; | ||
468 | |||
469 | static const struct of_device_id s3c24xx_eint_irq_ids[] = { | ||
470 | { .compatible = "samsung,s3c2410-wakeup-eint", .data = (void *)1 }, | ||
471 | { .compatible = "samsung,s3c2412-wakeup-eint", .data = (void *)0 }, | ||
472 | { } | ||
473 | }; | ||
474 | |||
475 | static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) | ||
476 | { | ||
477 | struct device *dev = d->dev; | ||
478 | const struct of_device_id *match; | ||
479 | struct device_node *eint_np = NULL; | ||
480 | struct device_node *np; | ||
481 | struct samsung_pin_bank *bank; | ||
482 | struct s3c24xx_eint_data *eint_data; | ||
483 | const struct irq_domain_ops *ops; | ||
484 | unsigned int i; | ||
485 | bool eint0_3_parent_only; | ||
486 | irq_flow_handler_t *handlers; | ||
487 | |||
488 | for_each_child_of_node(dev->of_node, np) { | ||
489 | match = of_match_node(s3c24xx_eint_irq_ids, np); | ||
490 | if (match) { | ||
491 | eint_np = np; | ||
492 | eint0_3_parent_only = (bool)match->data; | ||
493 | break; | ||
494 | } | ||
495 | } | ||
496 | if (!eint_np) | ||
497 | return -ENODEV; | ||
498 | |||
499 | eint_data = devm_kzalloc(dev, sizeof(*eint_data), GFP_KERNEL); | ||
500 | if (!eint_data) | ||
501 | return -ENOMEM; | ||
502 | |||
503 | eint_data->drvdata = d; | ||
504 | |||
505 | handlers = eint0_3_parent_only ? s3c2410_eint_handlers | ||
506 | : s3c2412_eint_handlers; | ||
507 | for (i = 0; i < NUM_EINT_IRQ; ++i) { | ||
508 | unsigned int irq; | ||
509 | |||
510 | irq = irq_of_parse_and_map(eint_np, i); | ||
511 | if (!irq) { | ||
512 | dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i); | ||
513 | return -ENXIO; | ||
514 | } | ||
515 | |||
516 | eint_data->parents[i] = irq; | ||
517 | irq_set_chained_handler(irq, handlers[i]); | ||
518 | irq_set_handler_data(irq, eint_data); | ||
519 | } | ||
520 | |||
521 | bank = d->ctrl->pin_banks; | ||
522 | for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) { | ||
523 | struct s3c24xx_eint_domain_data *ddata; | ||
524 | unsigned int mask; | ||
525 | unsigned int irq; | ||
526 | unsigned int pin; | ||
527 | |||
528 | if (bank->eint_type != EINT_TYPE_WKUP) | ||
529 | continue; | ||
530 | |||
531 | ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); | ||
532 | if (!ddata) | ||
533 | return -ENOMEM; | ||
534 | |||
535 | ddata->bank = bank; | ||
536 | ddata->eint_data = eint_data; | ||
537 | ddata->eint0_3_parent_only = eint0_3_parent_only; | ||
538 | |||
539 | ops = (bank->eint_offset == 0) ? &s3c24xx_gpf_irq_ops | ||
540 | : &s3c24xx_gpg_irq_ops; | ||
541 | |||
542 | bank->irq_domain = irq_domain_add_linear(bank->of_node, | ||
543 | bank->nr_pins, ops, ddata); | ||
544 | if (!bank->irq_domain) { | ||
545 | dev_err(dev, "wkup irq domain add failed\n"); | ||
546 | return -ENXIO; | ||
547 | } | ||
548 | |||
549 | irq = bank->eint_offset; | ||
550 | mask = bank->eint_mask; | ||
551 | for (pin = 0; mask; ++pin, mask >>= 1) { | ||
552 | if (irq > NUM_EINT) | ||
553 | break; | ||
554 | if (!(mask & 1)) | ||
555 | continue; | ||
556 | eint_data->domains[irq] = bank->irq_domain; | ||
557 | ++irq; | ||
558 | } | ||
559 | } | ||
560 | |||
561 | return 0; | ||
562 | } | ||
563 | |||
564 | static struct samsung_pin_bank s3c2412_pin_banks[] = { | ||
565 | PIN_BANK_A(23, 0x000, "gpa"), | ||
566 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
567 | PIN_BANK_2BIT(16, 0x020, "gpc"), | ||
568 | PIN_BANK_2BIT(16, 0x030, "gpd"), | ||
569 | PIN_BANK_2BIT(16, 0x040, "gpe"), | ||
570 | PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff), | ||
571 | PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00), | ||
572 | PIN_BANK_2BIT(11, 0x070, "gph"), | ||
573 | PIN_BANK_2BIT(13, 0x080, "gpj"), | ||
574 | }; | ||
575 | |||
576 | struct samsung_pin_ctrl s3c2412_pin_ctrl[] = { | ||
577 | { | ||
578 | .pin_banks = s3c2412_pin_banks, | ||
579 | .nr_banks = ARRAY_SIZE(s3c2412_pin_banks), | ||
580 | .eint_wkup_init = s3c24xx_eint_init, | ||
581 | .label = "S3C2412-GPIO", | ||
582 | }, | ||
583 | }; | ||
584 | |||
585 | static struct samsung_pin_bank s3c2416_pin_banks[] = { | ||
586 | PIN_BANK_A(27, 0x000, "gpa"), | ||
587 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
588 | PIN_BANK_2BIT(16, 0x020, "gpc"), | ||
589 | PIN_BANK_2BIT(16, 0x030, "gpd"), | ||
590 | PIN_BANK_2BIT(16, 0x040, "gpe"), | ||
591 | PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff), | ||
592 | PIN_BANK_2BIT_EINTW(8, 0x060, "gpg", 8, 0xff00), | ||
593 | PIN_BANK_2BIT(15, 0x070, "gph"), | ||
594 | PIN_BANK_2BIT(16, 0x0e0, "gpk"), | ||
595 | PIN_BANK_2BIT(14, 0x0f0, "gpl"), | ||
596 | PIN_BANK_2BIT(2, 0x100, "gpm"), | ||
597 | }; | ||
598 | |||
599 | struct samsung_pin_ctrl s3c2416_pin_ctrl[] = { | ||
600 | { | ||
601 | .pin_banks = s3c2416_pin_banks, | ||
602 | .nr_banks = ARRAY_SIZE(s3c2416_pin_banks), | ||
603 | .eint_wkup_init = s3c24xx_eint_init, | ||
604 | .label = "S3C2416-GPIO", | ||
605 | }, | ||
606 | }; | ||
607 | |||
608 | static struct samsung_pin_bank s3c2440_pin_banks[] = { | ||
609 | PIN_BANK_A(25, 0x000, "gpa"), | ||
610 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
611 | PIN_BANK_2BIT(16, 0x020, "gpc"), | ||
612 | PIN_BANK_2BIT(16, 0x030, "gpd"), | ||
613 | PIN_BANK_2BIT(16, 0x040, "gpe"), | ||
614 | PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff), | ||
615 | PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00), | ||
616 | PIN_BANK_2BIT(11, 0x070, "gph"), | ||
617 | PIN_BANK_2BIT(13, 0x0d0, "gpj"), | ||
618 | }; | ||
619 | |||
620 | struct samsung_pin_ctrl s3c2440_pin_ctrl[] = { | ||
621 | { | ||
622 | .pin_banks = s3c2440_pin_banks, | ||
623 | .nr_banks = ARRAY_SIZE(s3c2440_pin_banks), | ||
624 | .eint_wkup_init = s3c24xx_eint_init, | ||
625 | .label = "S3C2440-GPIO", | ||
626 | }, | ||
627 | }; | ||
628 | |||
629 | static struct samsung_pin_bank s3c2450_pin_banks[] = { | ||
630 | PIN_BANK_A(28, 0x000, "gpa"), | ||
631 | PIN_BANK_2BIT(11, 0x010, "gpb"), | ||
632 | PIN_BANK_2BIT(16, 0x020, "gpc"), | ||
633 | PIN_BANK_2BIT(16, 0x030, "gpd"), | ||
634 | PIN_BANK_2BIT(16, 0x040, "gpe"), | ||
635 | PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff), | ||
636 | PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00), | ||
637 | PIN_BANK_2BIT(15, 0x070, "gph"), | ||
638 | PIN_BANK_2BIT(16, 0x0d0, "gpj"), | ||
639 | PIN_BANK_2BIT(16, 0x0e0, "gpk"), | ||
640 | PIN_BANK_2BIT(15, 0x0f0, "gpl"), | ||
641 | PIN_BANK_2BIT(2, 0x100, "gpm"), | ||
642 | }; | ||
643 | |||
644 | struct samsung_pin_ctrl s3c2450_pin_ctrl[] = { | ||
645 | { | ||
646 | .pin_banks = s3c2450_pin_banks, | ||
647 | .nr_banks = ARRAY_SIZE(s3c2450_pin_banks), | ||
648 | .eint_wkup_init = s3c24xx_eint_init, | ||
649 | .label = "S3C2450-GPIO", | ||
650 | }, | ||
651 | }; | ||
diff --git a/drivers/pinctrl/pinctrl-samsung.c b/drivers/pinctrl/pinctrl-samsung.c index 63ac22e89678..e67ff1b8042c 100644 --- a/drivers/pinctrl/pinctrl-samsung.c +++ b/drivers/pinctrl/pinctrl-samsung.c | |||
@@ -1118,6 +1118,16 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = { | |||
1118 | { .compatible = "samsung,s3c64xx-pinctrl", | 1118 | { .compatible = "samsung,s3c64xx-pinctrl", |
1119 | .data = s3c64xx_pin_ctrl }, | 1119 | .data = s3c64xx_pin_ctrl }, |
1120 | #endif | 1120 | #endif |
1121 | #ifdef CONFIG_PINCTRL_S3C24XX | ||
1122 | { .compatible = "samsung,s3c2412-pinctrl", | ||
1123 | .data = s3c2412_pin_ctrl }, | ||
1124 | { .compatible = "samsung,s3c2416-pinctrl", | ||
1125 | .data = s3c2416_pin_ctrl }, | ||
1126 | { .compatible = "samsung,s3c2440-pinctrl", | ||
1127 | .data = s3c2440_pin_ctrl }, | ||
1128 | { .compatible = "samsung,s3c2450-pinctrl", | ||
1129 | .data = s3c2450_pin_ctrl }, | ||
1130 | #endif | ||
1121 | {}, | 1131 | {}, |
1122 | }; | 1132 | }; |
1123 | MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); | 1133 | MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); |
diff --git a/drivers/pinctrl/pinctrl-samsung.h b/drivers/pinctrl/pinctrl-samsung.h index 26d3519240c9..79fcc2076c00 100644 --- a/drivers/pinctrl/pinctrl-samsung.h +++ b/drivers/pinctrl/pinctrl-samsung.h | |||
@@ -255,5 +255,9 @@ extern struct samsung_pin_ctrl exynos4210_pin_ctrl[]; | |||
255 | extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[]; | 255 | extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[]; |
256 | extern struct samsung_pin_ctrl exynos5250_pin_ctrl[]; | 256 | extern struct samsung_pin_ctrl exynos5250_pin_ctrl[]; |
257 | extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[]; | 257 | extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[]; |
258 | extern struct samsung_pin_ctrl s3c2412_pin_ctrl[]; | ||
259 | extern struct samsung_pin_ctrl s3c2416_pin_ctrl[]; | ||
260 | extern struct samsung_pin_ctrl s3c2440_pin_ctrl[]; | ||
261 | extern struct samsung_pin_ctrl s3c2450_pin_ctrl[]; | ||
258 | 262 | ||
259 | #endif /* __PINCTRL_SAMSUNG_H */ | 263 | #endif /* __PINCTRL_SAMSUNG_H */ |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c b/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c index bbff5596e922..82bf6aba0074 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c | |||
@@ -1488,6 +1488,66 @@ IRQC_PINS_MUX(326, 54); | |||
1488 | IRQC_PINS_MUX(327, 55); | 1488 | IRQC_PINS_MUX(327, 55); |
1489 | IRQC_PINS_MUX(328, 56); | 1489 | IRQC_PINS_MUX(328, 56); |
1490 | IRQC_PINS_MUX(329, 57); | 1490 | IRQC_PINS_MUX(329, 57); |
1491 | /* - MMCIF0 ----------------------------------------------------------------- */ | ||
1492 | static const unsigned int mmc0_data1_pins[] = { | ||
1493 | /* D[0] */ | ||
1494 | 164, | ||
1495 | }; | ||
1496 | static const unsigned int mmc0_data1_mux[] = { | ||
1497 | MMCD0_0_MARK, | ||
1498 | }; | ||
1499 | static const unsigned int mmc0_data4_pins[] = { | ||
1500 | /* D[0:3] */ | ||
1501 | 164, 165, 166, 167, | ||
1502 | }; | ||
1503 | static const unsigned int mmc0_data4_mux[] = { | ||
1504 | MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK, | ||
1505 | }; | ||
1506 | static const unsigned int mmc0_data8_pins[] = { | ||
1507 | /* D[0:7] */ | ||
1508 | 164, 165, 166, 167, 168, 169, 170, 171, | ||
1509 | }; | ||
1510 | static const unsigned int mmc0_data8_mux[] = { | ||
1511 | MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK, | ||
1512 | MMCD0_4_MARK, MMCD0_5_MARK, MMCD0_6_MARK, MMCD0_7_MARK, | ||
1513 | }; | ||
1514 | static const unsigned int mmc0_ctrl_pins[] = { | ||
1515 | /* CMD, CLK */ | ||
1516 | 172, 173, | ||
1517 | }; | ||
1518 | static const unsigned int mmc0_ctrl_mux[] = { | ||
1519 | MMCCMD0_MARK, MMCCLK0_MARK, | ||
1520 | }; | ||
1521 | /* - MMCIF1 ----------------------------------------------------------------- */ | ||
1522 | static const unsigned int mmc1_data1_pins[] = { | ||
1523 | /* D[0] */ | ||
1524 | 199, | ||
1525 | }; | ||
1526 | static const unsigned int mmc1_data1_mux[] = { | ||
1527 | MMCD1_0_MARK, | ||
1528 | }; | ||
1529 | static const unsigned int mmc1_data4_pins[] = { | ||
1530 | /* D[0:3] */ | ||
1531 | 199, 198, 197, 196, | ||
1532 | }; | ||
1533 | static const unsigned int mmc1_data4_mux[] = { | ||
1534 | MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK, | ||
1535 | }; | ||
1536 | static const unsigned int mmc1_data8_pins[] = { | ||
1537 | /* D[0:7] */ | ||
1538 | 199, 198, 197, 196, 195, 194, 193, 192, | ||
1539 | }; | ||
1540 | static const unsigned int mmc1_data8_mux[] = { | ||
1541 | MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK, | ||
1542 | MMCD1_4_MARK, MMCD1_5_MARK, MMCD1_6_MARK, MMCD1_7_MARK, | ||
1543 | }; | ||
1544 | static const unsigned int mmc1_ctrl_pins[] = { | ||
1545 | /* CMD, CLK */ | ||
1546 | 200, 203, | ||
1547 | }; | ||
1548 | static const unsigned int mmc1_ctrl_mux[] = { | ||
1549 | MMCCMD1_MARK, MMCCLK1_MARK, | ||
1550 | }; | ||
1491 | /* - SCIFA0 ----------------------------------------------------------------- */ | 1551 | /* - SCIFA0 ----------------------------------------------------------------- */ |
1492 | static const unsigned int scifa0_data_pins[] = { | 1552 | static const unsigned int scifa0_data_pins[] = { |
1493 | /* SCIFA0_RXD, SCIFA0_TXD */ | 1553 | /* SCIFA0_RXD, SCIFA0_TXD */ |
@@ -1683,6 +1743,86 @@ static const unsigned int scifb3_ctrl_b_pins[] = { | |||
1683 | static const unsigned int scifb3_ctrl_b_mux[] = { | 1743 | static const unsigned int scifb3_ctrl_b_mux[] = { |
1684 | SCIFB3_RTS_38_MARK, SCIFB3_CTS_39_MARK, | 1744 | SCIFB3_RTS_38_MARK, SCIFB3_CTS_39_MARK, |
1685 | }; | 1745 | }; |
1746 | /* - SDHI0 ------------------------------------------------------------------ */ | ||
1747 | static const unsigned int sdhi0_data1_pins[] = { | ||
1748 | /* D0 */ | ||
1749 | 302, | ||
1750 | }; | ||
1751 | static const unsigned int sdhi0_data1_mux[] = { | ||
1752 | SDHID0_0_MARK, | ||
1753 | }; | ||
1754 | static const unsigned int sdhi0_data4_pins[] = { | ||
1755 | /* D[0:3] */ | ||
1756 | 302, 303, 304, 305, | ||
1757 | }; | ||
1758 | static const unsigned int sdhi0_data4_mux[] = { | ||
1759 | SDHID0_0_MARK, SDHID0_1_MARK, SDHID0_2_MARK, SDHID0_3_MARK, | ||
1760 | }; | ||
1761 | static const unsigned int sdhi0_ctrl_pins[] = { | ||
1762 | /* CLK, CMD */ | ||
1763 | 308, 306, | ||
1764 | }; | ||
1765 | static const unsigned int sdhi0_ctrl_mux[] = { | ||
1766 | SDHICLK0_MARK, SDHICMD0_MARK, | ||
1767 | }; | ||
1768 | static const unsigned int sdhi0_cd_pins[] = { | ||
1769 | /* CD */ | ||
1770 | 301, | ||
1771 | }; | ||
1772 | static const unsigned int sdhi0_cd_mux[] = { | ||
1773 | SDHICD0_MARK, | ||
1774 | }; | ||
1775 | static const unsigned int sdhi0_wp_pins[] = { | ||
1776 | /* WP */ | ||
1777 | 307, | ||
1778 | }; | ||
1779 | static const unsigned int sdhi0_wp_mux[] = { | ||
1780 | SDHIWP0_MARK, | ||
1781 | }; | ||
1782 | /* - SDHI1 ------------------------------------------------------------------ */ | ||
1783 | static const unsigned int sdhi1_data1_pins[] = { | ||
1784 | /* D0 */ | ||
1785 | 289, | ||
1786 | }; | ||
1787 | static const unsigned int sdhi1_data1_mux[] = { | ||
1788 | SDHID1_0_MARK, | ||
1789 | }; | ||
1790 | static const unsigned int sdhi1_data4_pins[] = { | ||
1791 | /* D[0:3] */ | ||
1792 | 289, 290, 291, 292, | ||
1793 | }; | ||
1794 | static const unsigned int sdhi1_data4_mux[] = { | ||
1795 | SDHID1_0_MARK, SDHID1_1_MARK, SDHID1_2_MARK, SDHID1_3_MARK, | ||
1796 | }; | ||
1797 | static const unsigned int sdhi1_ctrl_pins[] = { | ||
1798 | /* CLK, CMD */ | ||
1799 | 293, 294, | ||
1800 | }; | ||
1801 | static const unsigned int sdhi1_ctrl_mux[] = { | ||
1802 | SDHICLK1_MARK, SDHICMD1_MARK, | ||
1803 | }; | ||
1804 | /* - SDHI2 ------------------------------------------------------------------ */ | ||
1805 | static const unsigned int sdhi2_data1_pins[] = { | ||
1806 | /* D0 */ | ||
1807 | 295, | ||
1808 | }; | ||
1809 | static const unsigned int sdhi2_data1_mux[] = { | ||
1810 | SDHID2_0_MARK, | ||
1811 | }; | ||
1812 | static const unsigned int sdhi2_data4_pins[] = { | ||
1813 | /* D[0:3] */ | ||
1814 | 295, 296, 297, 298, | ||
1815 | }; | ||
1816 | static const unsigned int sdhi2_data4_mux[] = { | ||
1817 | SDHID2_0_MARK, SDHID2_1_MARK, SDHID2_2_MARK, SDHID2_3_MARK, | ||
1818 | }; | ||
1819 | static const unsigned int sdhi2_ctrl_pins[] = { | ||
1820 | /* CLK, CMD */ | ||
1821 | 299, 300, | ||
1822 | }; | ||
1823 | static const unsigned int sdhi2_ctrl_mux[] = { | ||
1824 | SDHICLK2_MARK, SDHICMD2_MARK, | ||
1825 | }; | ||
1686 | 1826 | ||
1687 | static const struct sh_pfc_pin_group pinmux_groups[] = { | 1827 | static const struct sh_pfc_pin_group pinmux_groups[] = { |
1688 | SH_PFC_PIN_GROUP(irqc_irq0), | 1828 | SH_PFC_PIN_GROUP(irqc_irq0), |
@@ -1743,6 +1883,14 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
1743 | SH_PFC_PIN_GROUP(irqc_irq55), | 1883 | SH_PFC_PIN_GROUP(irqc_irq55), |
1744 | SH_PFC_PIN_GROUP(irqc_irq56), | 1884 | SH_PFC_PIN_GROUP(irqc_irq56), |
1745 | SH_PFC_PIN_GROUP(irqc_irq57), | 1885 | SH_PFC_PIN_GROUP(irqc_irq57), |
1886 | SH_PFC_PIN_GROUP(mmc0_data1), | ||
1887 | SH_PFC_PIN_GROUP(mmc0_data4), | ||
1888 | SH_PFC_PIN_GROUP(mmc0_data8), | ||
1889 | SH_PFC_PIN_GROUP(mmc0_ctrl), | ||
1890 | SH_PFC_PIN_GROUP(mmc1_data1), | ||
1891 | SH_PFC_PIN_GROUP(mmc1_data4), | ||
1892 | SH_PFC_PIN_GROUP(mmc1_data8), | ||
1893 | SH_PFC_PIN_GROUP(mmc1_ctrl), | ||
1746 | SH_PFC_PIN_GROUP(scifa0_data), | 1894 | SH_PFC_PIN_GROUP(scifa0_data), |
1747 | SH_PFC_PIN_GROUP(scifa0_clk), | 1895 | SH_PFC_PIN_GROUP(scifa0_clk), |
1748 | SH_PFC_PIN_GROUP(scifa0_ctrl), | 1896 | SH_PFC_PIN_GROUP(scifa0_ctrl), |
@@ -1770,6 +1918,17 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
1770 | SH_PFC_PIN_GROUP(scifb3_data_b), | 1918 | SH_PFC_PIN_GROUP(scifb3_data_b), |
1771 | SH_PFC_PIN_GROUP(scifb3_clk_b), | 1919 | SH_PFC_PIN_GROUP(scifb3_clk_b), |
1772 | SH_PFC_PIN_GROUP(scifb3_ctrl_b), | 1920 | SH_PFC_PIN_GROUP(scifb3_ctrl_b), |
1921 | SH_PFC_PIN_GROUP(sdhi0_data1), | ||
1922 | SH_PFC_PIN_GROUP(sdhi0_data4), | ||
1923 | SH_PFC_PIN_GROUP(sdhi0_ctrl), | ||
1924 | SH_PFC_PIN_GROUP(sdhi0_cd), | ||
1925 | SH_PFC_PIN_GROUP(sdhi0_wp), | ||
1926 | SH_PFC_PIN_GROUP(sdhi1_data1), | ||
1927 | SH_PFC_PIN_GROUP(sdhi1_data4), | ||
1928 | SH_PFC_PIN_GROUP(sdhi1_ctrl), | ||
1929 | SH_PFC_PIN_GROUP(sdhi2_data1), | ||
1930 | SH_PFC_PIN_GROUP(sdhi2_data4), | ||
1931 | SH_PFC_PIN_GROUP(sdhi2_ctrl), | ||
1773 | }; | 1932 | }; |
1774 | 1933 | ||
1775 | static const char * const irqc_groups[] = { | 1934 | static const char * const irqc_groups[] = { |
@@ -1833,6 +1992,20 @@ static const char * const irqc_groups[] = { | |||
1833 | "irqc_irq57", | 1992 | "irqc_irq57", |
1834 | }; | 1993 | }; |
1835 | 1994 | ||
1995 | static const char * const mmc0_groups[] = { | ||
1996 | "mmc0_data1", | ||
1997 | "mmc0_data4", | ||
1998 | "mmc0_data8", | ||
1999 | "mmc0_ctrl", | ||
2000 | }; | ||
2001 | |||
2002 | static const char * const mmc1_groups[] = { | ||
2003 | "mmc1_data1", | ||
2004 | "mmc1_data4", | ||
2005 | "mmc1_data8", | ||
2006 | "mmc1_ctrl", | ||
2007 | }; | ||
2008 | |||
1836 | static const char * const scifa0_groups[] = { | 2009 | static const char * const scifa0_groups[] = { |
1837 | "scifa0_data", | 2010 | "scifa0_data", |
1838 | "scifa0_clk", | 2011 | "scifa0_clk", |
@@ -1878,14 +2051,39 @@ static const char * const scifb3_groups[] = { | |||
1878 | "scifb3_ctrl_b", | 2051 | "scifb3_ctrl_b", |
1879 | }; | 2052 | }; |
1880 | 2053 | ||
2054 | static const char * const sdhi0_groups[] = { | ||
2055 | "sdhi0_data1", | ||
2056 | "sdhi0_data4", | ||
2057 | "sdhi0_ctrl", | ||
2058 | "sdhi0_cd", | ||
2059 | "sdhi0_wp", | ||
2060 | }; | ||
2061 | |||
2062 | static const char * const sdhi1_groups[] = { | ||
2063 | "sdhi1_data1", | ||
2064 | "sdhi1_data4", | ||
2065 | "sdhi1_ctrl", | ||
2066 | }; | ||
2067 | |||
2068 | static const char * const sdhi2_groups[] = { | ||
2069 | "sdhi2_data1", | ||
2070 | "sdhi2_data4", | ||
2071 | "sdhi2_ctrl", | ||
2072 | }; | ||
2073 | |||
1881 | static const struct sh_pfc_function pinmux_functions[] = { | 2074 | static const struct sh_pfc_function pinmux_functions[] = { |
1882 | SH_PFC_FUNCTION(irqc), | 2075 | SH_PFC_FUNCTION(irqc), |
2076 | SH_PFC_FUNCTION(mmc0), | ||
2077 | SH_PFC_FUNCTION(mmc1), | ||
1883 | SH_PFC_FUNCTION(scifa0), | 2078 | SH_PFC_FUNCTION(scifa0), |
1884 | SH_PFC_FUNCTION(scifa1), | 2079 | SH_PFC_FUNCTION(scifa1), |
1885 | SH_PFC_FUNCTION(scifb0), | 2080 | SH_PFC_FUNCTION(scifb0), |
1886 | SH_PFC_FUNCTION(scifb1), | 2081 | SH_PFC_FUNCTION(scifb1), |
1887 | SH_PFC_FUNCTION(scifb2), | 2082 | SH_PFC_FUNCTION(scifb2), |
1888 | SH_PFC_FUNCTION(scifb3), | 2083 | SH_PFC_FUNCTION(scifb3), |
2084 | SH_PFC_FUNCTION(sdhi0), | ||
2085 | SH_PFC_FUNCTION(sdhi1), | ||
2086 | SH_PFC_FUNCTION(sdhi2), | ||
1889 | }; | 2087 | }; |
1890 | 2088 | ||
1891 | #undef PORTCR | 2089 | #undef PORTCR |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c index 1dcbabcd7b3c..f9039102bb43 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c | |||
@@ -1447,11 +1447,11 @@ MMC_PFC_PINS(mmc_ctrl, RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6)); | |||
1447 | MMC_PFC_CTRL(mmc_ctrl, MMC_CLK, MMC_CMD); | 1447 | MMC_PFC_CTRL(mmc_ctrl, MMC_CLK, MMC_CMD); |
1448 | MMC_PFC_PINS(mmc_data1, RCAR_GP_PIN(1, 7)); | 1448 | MMC_PFC_PINS(mmc_data1, RCAR_GP_PIN(1, 7)); |
1449 | MMC_PFC_DAT1(mmc_data1, MMC_D0); | 1449 | MMC_PFC_DAT1(mmc_data1, MMC_D0); |
1450 | MMC_PFC_PINS(mmc_data4, RCAR_GP_PIN(1, 7), RCAR_GP_PIN(2, 8), | 1450 | MMC_PFC_PINS(mmc_data4, RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 8), |
1451 | RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 6)); | 1451 | RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 6)); |
1452 | MMC_PFC_DAT4(mmc_data4, MMC_D0, MMC_D1, | 1452 | MMC_PFC_DAT4(mmc_data4, MMC_D0, MMC_D1, |
1453 | MMC_D2, MMC_D3); | 1453 | MMC_D2, MMC_D3); |
1454 | MMC_PFC_PINS(mmc_data8, RCAR_GP_PIN(1, 7), RCAR_GP_PIN(2, 8), | 1454 | MMC_PFC_PINS(mmc_data8, RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 8), |
1455 | RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 6), | 1455 | RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 6), |
1456 | RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 0), | 1456 | RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 0), |
1457 | RCAR_GP_PIN(0, 30), RCAR_GP_PIN(0, 31)); | 1457 | RCAR_GP_PIN(0, 30), RCAR_GP_PIN(0, 31)); |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c index 85d77a417c0e..14f3ec267e1f 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c | |||
@@ -1979,6 +1979,141 @@ static const unsigned int scif1_clk_e_pins[] = { | |||
1979 | static const unsigned int scif1_clk_e_mux[] = { | 1979 | static const unsigned int scif1_clk_e_mux[] = { |
1980 | SCK1_E_MARK, | 1980 | SCK1_E_MARK, |
1981 | }; | 1981 | }; |
1982 | /* - HSCIF0 ----------------------------------------------------------------- */ | ||
1983 | static const unsigned int hscif0_data_pins[] = { | ||
1984 | /* RX, TX */ | ||
1985 | RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 9), | ||
1986 | }; | ||
1987 | static const unsigned int hscif0_data_mux[] = { | ||
1988 | HRX0_MARK, HTX0_MARK, | ||
1989 | }; | ||
1990 | static const unsigned int hscif0_clk_pins[] = { | ||
1991 | /* SCK */ | ||
1992 | RCAR_GP_PIN(5, 7), | ||
1993 | }; | ||
1994 | static const unsigned int hscif0_clk_mux[] = { | ||
1995 | HSCK0_MARK, | ||
1996 | }; | ||
1997 | static const unsigned int hscif0_ctrl_pins[] = { | ||
1998 | /* RTS, CTS */ | ||
1999 | RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 10), | ||
2000 | }; | ||
2001 | static const unsigned int hscif0_ctrl_mux[] = { | ||
2002 | HRTS0_N_MARK, HCTS0_N_MARK, | ||
2003 | }; | ||
2004 | static const unsigned int hscif0_data_b_pins[] = { | ||
2005 | /* RX, TX */ | ||
2006 | RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 12), | ||
2007 | }; | ||
2008 | static const unsigned int hscif0_data_b_mux[] = { | ||
2009 | HRX0_B_MARK, HTX0_B_MARK, | ||
2010 | }; | ||
2011 | static const unsigned int hscif0_ctrl_b_pins[] = { | ||
2012 | /* RTS, CTS */ | ||
2013 | RCAR_GP_PIN(1, 29), RCAR_GP_PIN(1, 28), | ||
2014 | }; | ||
2015 | static const unsigned int hscif0_ctrl_b_mux[] = { | ||
2016 | HRTS0_N_B_MARK, HCTS0_N_B_MARK, | ||
2017 | }; | ||
2018 | static const unsigned int hscif0_data_c_pins[] = { | ||
2019 | /* RX, TX */ | ||
2020 | RCAR_GP_PIN(5, 13), RCAR_GP_PIN(5, 16), | ||
2021 | }; | ||
2022 | static const unsigned int hscif0_data_c_mux[] = { | ||
2023 | HRX0_C_MARK, HTX0_C_MARK, | ||
2024 | }; | ||
2025 | static const unsigned int hscif0_ctrl_c_pins[] = { | ||
2026 | /* RTS, CTS */ | ||
2027 | RCAR_GP_PIN(5, 3), RCAR_GP_PIN(5, 7), | ||
2028 | }; | ||
2029 | static const unsigned int hscif0_ctrl_c_mux[] = { | ||
2030 | HRTS0_N_C_MARK, HCTS0_N_C_MARK, | ||
2031 | }; | ||
2032 | static const unsigned int hscif0_data_d_pins[] = { | ||
2033 | /* RX, TX */ | ||
2034 | RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 21), | ||
2035 | }; | ||
2036 | static const unsigned int hscif0_data_d_mux[] = { | ||
2037 | HRX0_D_MARK, HTX0_D_MARK, | ||
2038 | }; | ||
2039 | static const unsigned int hscif0_ctrl_d_pins[] = { | ||
2040 | /* RTS, CTS */ | ||
2041 | RCAR_GP_PIN(3, 23), RCAR_GP_PIN(3, 22), | ||
2042 | }; | ||
2043 | static const unsigned int hscif0_ctrl_d_mux[] = { | ||
2044 | HRTS0_N_D_MARK, HCTS0_N_D_MARK, | ||
2045 | }; | ||
2046 | static const unsigned int hscif0_data_e_pins[] = { | ||
2047 | /* RX, TX */ | ||
2048 | RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 22), | ||
2049 | }; | ||
2050 | static const unsigned int hscif0_data_e_mux[] = { | ||
2051 | HRX0_E_MARK, HTX0_E_MARK, | ||
2052 | }; | ||
2053 | static const unsigned int hscif0_ctrl_e_pins[] = { | ||
2054 | /* RTS, CTS */ | ||
2055 | RCAR_GP_PIN(2, 24), RCAR_GP_PIN(2, 23), | ||
2056 | }; | ||
2057 | static const unsigned int hscif0_ctrl_e_mux[] = { | ||
2058 | HRTS0_N_E_MARK, HCTS0_N_E_MARK, | ||
2059 | }; | ||
2060 | static const unsigned int hscif0_data_f_pins[] = { | ||
2061 | /* RX, TX */ | ||
2062 | RCAR_GP_PIN(2, 23), RCAR_GP_PIN(2, 25), | ||
2063 | }; | ||
2064 | static const unsigned int hscif0_data_f_mux[] = { | ||
2065 | HRX0_F_MARK, HTX0_F_MARK, | ||
2066 | }; | ||
2067 | static const unsigned int hscif0_ctrl_f_pins[] = { | ||
2068 | /* RTS, CTS */ | ||
2069 | RCAR_GP_PIN(2, 26), RCAR_GP_PIN(2, 24), | ||
2070 | }; | ||
2071 | static const unsigned int hscif0_ctrl_f_mux[] = { | ||
2072 | HRTS0_N_F_MARK, HCTS0_N_F_MARK, | ||
2073 | }; | ||
2074 | /* - HSCIF1 ----------------------------------------------------------------- */ | ||
2075 | static const unsigned int hscif1_data_pins[] = { | ||
2076 | /* RX, TX */ | ||
2077 | RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 29), | ||
2078 | }; | ||
2079 | static const unsigned int hscif1_data_mux[] = { | ||
2080 | HRX1_MARK, HTX1_MARK, | ||
2081 | }; | ||
2082 | static const unsigned int hscif1_clk_pins[] = { | ||
2083 | /* SCK */ | ||
2084 | RCAR_GP_PIN(4, 27), | ||
2085 | }; | ||
2086 | static const unsigned int hscif1_clk_mux[] = { | ||
2087 | HSCK1_MARK, | ||
2088 | }; | ||
2089 | static const unsigned int hscif1_ctrl_pins[] = { | ||
2090 | /* RTS, CTS */ | ||
2091 | RCAR_GP_PIN(4, 31), RCAR_GP_PIN(4, 30), | ||
2092 | }; | ||
2093 | static const unsigned int hscif1_ctrl_mux[] = { | ||
2094 | HRTS1_N_MARK, HCTS1_N_MARK, | ||
2095 | }; | ||
2096 | static const unsigned int hscif1_data_b_pins[] = { | ||
2097 | /* RX, TX */ | ||
2098 | RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 18), | ||
2099 | }; | ||
2100 | static const unsigned int hscif1_data_b_mux[] = { | ||
2101 | HRX1_B_MARK, HTX1_B_MARK, | ||
2102 | }; | ||
2103 | static const unsigned int hscif1_clk_b_pins[] = { | ||
2104 | /* SCK */ | ||
2105 | RCAR_GP_PIN(1, 28), | ||
2106 | }; | ||
2107 | static const unsigned int hscif1_clk_b_mux[] = { | ||
2108 | HSCK1_B_MARK, | ||
2109 | }; | ||
2110 | static const unsigned int hscif1_ctrl_b_pins[] = { | ||
2111 | /* RTS, CTS */ | ||
2112 | RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13), | ||
2113 | }; | ||
2114 | static const unsigned int hscif1_ctrl_b_mux[] = { | ||
2115 | HRTS1_N_B_MARK, HCTS1_N_B_MARK, | ||
2116 | }; | ||
1982 | /* - SCIFA0 ----------------------------------------------------------------- */ | 2117 | /* - SCIFA0 ----------------------------------------------------------------- */ |
1983 | static const unsigned int scifa0_data_pins[] = { | 2118 | static const unsigned int scifa0_data_pins[] = { |
1984 | /* RXD, TXD */ | 2119 | /* RXD, TXD */ |
@@ -2371,8 +2506,7 @@ static const unsigned int tpu0_to3_pins[] = { | |||
2371 | static const unsigned int tpu0_to3_mux[] = { | 2506 | static const unsigned int tpu0_to3_mux[] = { |
2372 | TPU0TO3_MARK, | 2507 | TPU0TO3_MARK, |
2373 | }; | 2508 | }; |
2374 | 2509 | /* - MMCIF0 ----------------------------------------------------------------- */ | |
2375 | /* - MMCIF ------------------------------------------------------------------ */ | ||
2376 | static const unsigned int mmc0_data1_pins[] = { | 2510 | static const unsigned int mmc0_data1_pins[] = { |
2377 | /* D[0] */ | 2511 | /* D[0] */ |
2378 | RCAR_GP_PIN(3, 18), | 2512 | RCAR_GP_PIN(3, 18), |
@@ -2406,7 +2540,7 @@ static const unsigned int mmc0_ctrl_pins[] = { | |||
2406 | static const unsigned int mmc0_ctrl_mux[] = { | 2540 | static const unsigned int mmc0_ctrl_mux[] = { |
2407 | MMC0_CLK_MARK, MMC0_CMD_MARK, | 2541 | MMC0_CLK_MARK, MMC0_CMD_MARK, |
2408 | }; | 2542 | }; |
2409 | 2543 | /* - MMCIF1 ----------------------------------------------------------------- */ | |
2410 | static const unsigned int mmc1_data1_pins[] = { | 2544 | static const unsigned int mmc1_data1_pins[] = { |
2411 | /* D[0] */ | 2545 | /* D[0] */ |
2412 | RCAR_GP_PIN(3, 26), | 2546 | RCAR_GP_PIN(3, 26), |
@@ -2427,7 +2561,7 @@ static const unsigned int mmc1_data8_pins[] = { | |||
2427 | RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 27), | 2561 | RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 27), |
2428 | RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 29), | 2562 | RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 29), |
2429 | RCAR_GP_PIN(3, 30), RCAR_GP_PIN(3, 31), | 2563 | RCAR_GP_PIN(3, 30), RCAR_GP_PIN(3, 31), |
2430 | RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14), | 2564 | RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15), |
2431 | }; | 2565 | }; |
2432 | static const unsigned int mmc1_data8_mux[] = { | 2566 | static const unsigned int mmc1_data8_mux[] = { |
2433 | MMC1_D0_MARK, MMC1_D1_MARK, MMC1_D2_MARK, MMC1_D3_MARK, | 2567 | MMC1_D0_MARK, MMC1_D1_MARK, MMC1_D2_MARK, MMC1_D3_MARK, |
@@ -2440,8 +2574,7 @@ static const unsigned int mmc1_ctrl_pins[] = { | |||
2440 | static const unsigned int mmc1_ctrl_mux[] = { | 2574 | static const unsigned int mmc1_ctrl_mux[] = { |
2441 | MMC1_CLK_MARK, MMC1_CMD_MARK, | 2575 | MMC1_CLK_MARK, MMC1_CMD_MARK, |
2442 | }; | 2576 | }; |
2443 | 2577 | /* - SDHI0 ------------------------------------------------------------------ */ | |
2444 | /* - SDHI ------------------------------------------------------------------- */ | ||
2445 | static const unsigned int sdhi0_data1_pins[] = { | 2578 | static const unsigned int sdhi0_data1_pins[] = { |
2446 | /* D0 */ | 2579 | /* D0 */ |
2447 | RCAR_GP_PIN(3, 2), | 2580 | RCAR_GP_PIN(3, 2), |
@@ -2477,7 +2610,7 @@ static const unsigned int sdhi0_wp_pins[] = { | |||
2477 | static const unsigned int sdhi0_wp_mux[] = { | 2610 | static const unsigned int sdhi0_wp_mux[] = { |
2478 | SD0_WP_MARK, | 2611 | SD0_WP_MARK, |
2479 | }; | 2612 | }; |
2480 | 2613 | /* - SDHI1 ------------------------------------------------------------------ */ | |
2481 | static const unsigned int sdhi1_data1_pins[] = { | 2614 | static const unsigned int sdhi1_data1_pins[] = { |
2482 | /* D0 */ | 2615 | /* D0 */ |
2483 | RCAR_GP_PIN(3, 10), | 2616 | RCAR_GP_PIN(3, 10), |
@@ -2513,7 +2646,7 @@ static const unsigned int sdhi1_wp_pins[] = { | |||
2513 | static const unsigned int sdhi1_wp_mux[] = { | 2646 | static const unsigned int sdhi1_wp_mux[] = { |
2514 | SD1_WP_MARK, | 2647 | SD1_WP_MARK, |
2515 | }; | 2648 | }; |
2516 | 2649 | /* - SDHI2 ------------------------------------------------------------------ */ | |
2517 | static const unsigned int sdhi2_data1_pins[] = { | 2650 | static const unsigned int sdhi2_data1_pins[] = { |
2518 | /* D0 */ | 2651 | /* D0 */ |
2519 | RCAR_GP_PIN(3, 18), | 2652 | RCAR_GP_PIN(3, 18), |
@@ -2549,7 +2682,7 @@ static const unsigned int sdhi2_wp_pins[] = { | |||
2549 | static const unsigned int sdhi2_wp_mux[] = { | 2682 | static const unsigned int sdhi2_wp_mux[] = { |
2550 | SD2_WP_MARK, | 2683 | SD2_WP_MARK, |
2551 | }; | 2684 | }; |
2552 | 2685 | /* - SDHI3 ------------------------------------------------------------------ */ | |
2553 | static const unsigned int sdhi3_data1_pins[] = { | 2686 | static const unsigned int sdhi3_data1_pins[] = { |
2554 | /* D0 */ | 2687 | /* D0 */ |
2555 | RCAR_GP_PIN(3, 26), | 2688 | RCAR_GP_PIN(3, 26), |
@@ -2591,10 +2724,37 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
2591 | SH_PFC_PIN_GROUP(eth_magic), | 2724 | SH_PFC_PIN_GROUP(eth_magic), |
2592 | SH_PFC_PIN_GROUP(eth_mdio), | 2725 | SH_PFC_PIN_GROUP(eth_mdio), |
2593 | SH_PFC_PIN_GROUP(eth_rmii), | 2726 | SH_PFC_PIN_GROUP(eth_rmii), |
2727 | SH_PFC_PIN_GROUP(hscif0_data), | ||
2728 | SH_PFC_PIN_GROUP(hscif0_clk), | ||
2729 | SH_PFC_PIN_GROUP(hscif0_ctrl), | ||
2730 | SH_PFC_PIN_GROUP(hscif0_data_b), | ||
2731 | SH_PFC_PIN_GROUP(hscif0_ctrl_b), | ||
2732 | SH_PFC_PIN_GROUP(hscif0_data_c), | ||
2733 | SH_PFC_PIN_GROUP(hscif0_ctrl_c), | ||
2734 | SH_PFC_PIN_GROUP(hscif0_data_d), | ||
2735 | SH_PFC_PIN_GROUP(hscif0_ctrl_d), | ||
2736 | SH_PFC_PIN_GROUP(hscif0_data_e), | ||
2737 | SH_PFC_PIN_GROUP(hscif0_ctrl_e), | ||
2738 | SH_PFC_PIN_GROUP(hscif0_data_f), | ||
2739 | SH_PFC_PIN_GROUP(hscif0_ctrl_f), | ||
2740 | SH_PFC_PIN_GROUP(hscif1_data), | ||
2741 | SH_PFC_PIN_GROUP(hscif1_clk), | ||
2742 | SH_PFC_PIN_GROUP(hscif1_ctrl), | ||
2743 | SH_PFC_PIN_GROUP(hscif1_data_b), | ||
2744 | SH_PFC_PIN_GROUP(hscif1_clk_b), | ||
2745 | SH_PFC_PIN_GROUP(hscif1_ctrl_b), | ||
2594 | SH_PFC_PIN_GROUP(intc_irq0), | 2746 | SH_PFC_PIN_GROUP(intc_irq0), |
2595 | SH_PFC_PIN_GROUP(intc_irq1), | 2747 | SH_PFC_PIN_GROUP(intc_irq1), |
2596 | SH_PFC_PIN_GROUP(intc_irq2), | 2748 | SH_PFC_PIN_GROUP(intc_irq2), |
2597 | SH_PFC_PIN_GROUP(intc_irq3), | 2749 | SH_PFC_PIN_GROUP(intc_irq3), |
2750 | SH_PFC_PIN_GROUP(mmc0_data1), | ||
2751 | SH_PFC_PIN_GROUP(mmc0_data4), | ||
2752 | SH_PFC_PIN_GROUP(mmc0_data8), | ||
2753 | SH_PFC_PIN_GROUP(mmc0_ctrl), | ||
2754 | SH_PFC_PIN_GROUP(mmc1_data1), | ||
2755 | SH_PFC_PIN_GROUP(mmc1_data4), | ||
2756 | SH_PFC_PIN_GROUP(mmc1_data8), | ||
2757 | SH_PFC_PIN_GROUP(mmc1_ctrl), | ||
2598 | SH_PFC_PIN_GROUP(scif0_data), | 2758 | SH_PFC_PIN_GROUP(scif0_data), |
2599 | SH_PFC_PIN_GROUP(scif0_clk), | 2759 | SH_PFC_PIN_GROUP(scif0_clk), |
2600 | SH_PFC_PIN_GROUP(scif0_ctrl), | 2760 | SH_PFC_PIN_GROUP(scif0_ctrl), |
@@ -2659,18 +2819,6 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
2659 | SH_PFC_PIN_GROUP(scifb2_clk_b), | 2819 | SH_PFC_PIN_GROUP(scifb2_clk_b), |
2660 | SH_PFC_PIN_GROUP(scifb2_ctrl_b), | 2820 | SH_PFC_PIN_GROUP(scifb2_ctrl_b), |
2661 | SH_PFC_PIN_GROUP(scifb2_data_c), | 2821 | SH_PFC_PIN_GROUP(scifb2_data_c), |
2662 | SH_PFC_PIN_GROUP(tpu0_to0), | ||
2663 | SH_PFC_PIN_GROUP(tpu0_to1), | ||
2664 | SH_PFC_PIN_GROUP(tpu0_to2), | ||
2665 | SH_PFC_PIN_GROUP(tpu0_to3), | ||
2666 | SH_PFC_PIN_GROUP(mmc0_data1), | ||
2667 | SH_PFC_PIN_GROUP(mmc0_data4), | ||
2668 | SH_PFC_PIN_GROUP(mmc0_data8), | ||
2669 | SH_PFC_PIN_GROUP(mmc0_ctrl), | ||
2670 | SH_PFC_PIN_GROUP(mmc1_data1), | ||
2671 | SH_PFC_PIN_GROUP(mmc1_data4), | ||
2672 | SH_PFC_PIN_GROUP(mmc1_data8), | ||
2673 | SH_PFC_PIN_GROUP(mmc1_ctrl), | ||
2674 | SH_PFC_PIN_GROUP(sdhi0_data1), | 2822 | SH_PFC_PIN_GROUP(sdhi0_data1), |
2675 | SH_PFC_PIN_GROUP(sdhi0_data4), | 2823 | SH_PFC_PIN_GROUP(sdhi0_data4), |
2676 | SH_PFC_PIN_GROUP(sdhi0_ctrl), | 2824 | SH_PFC_PIN_GROUP(sdhi0_ctrl), |
@@ -2691,6 +2839,10 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
2691 | SH_PFC_PIN_GROUP(sdhi3_ctrl), | 2839 | SH_PFC_PIN_GROUP(sdhi3_ctrl), |
2692 | SH_PFC_PIN_GROUP(sdhi3_cd), | 2840 | SH_PFC_PIN_GROUP(sdhi3_cd), |
2693 | SH_PFC_PIN_GROUP(sdhi3_wp), | 2841 | SH_PFC_PIN_GROUP(sdhi3_wp), |
2842 | SH_PFC_PIN_GROUP(tpu0_to0), | ||
2843 | SH_PFC_PIN_GROUP(tpu0_to1), | ||
2844 | SH_PFC_PIN_GROUP(tpu0_to2), | ||
2845 | SH_PFC_PIN_GROUP(tpu0_to3), | ||
2694 | }; | 2846 | }; |
2695 | 2847 | ||
2696 | static const char * const eth_groups[] = { | 2848 | static const char * const eth_groups[] = { |
@@ -2726,6 +2878,31 @@ static const char * const scif1_groups[] = { | |||
2726 | "scif1_clk_e", | 2878 | "scif1_clk_e", |
2727 | }; | 2879 | }; |
2728 | 2880 | ||
2881 | static const char * const hscif0_groups[] = { | ||
2882 | "hscif0_data", | ||
2883 | "hscif0_clk", | ||
2884 | "hscif0_ctrl", | ||
2885 | "hscif0_data_b", | ||
2886 | "hscif0_ctrl_b", | ||
2887 | "hscif0_data_c", | ||
2888 | "hscif0_ctrl_c", | ||
2889 | "hscif0_data_d", | ||
2890 | "hscif0_ctrl_d", | ||
2891 | "hscif0_data_e", | ||
2892 | "hscif0_ctrl_e", | ||
2893 | "hscif0_data_f", | ||
2894 | "hscif0_ctrl_f", | ||
2895 | }; | ||
2896 | |||
2897 | static const char * const hscif1_groups[] = { | ||
2898 | "hscif1_data", | ||
2899 | "hscif1_clk", | ||
2900 | "hscif1_ctrl", | ||
2901 | "hscif1_data_b", | ||
2902 | "hscif1_clk_b", | ||
2903 | "hscif1_ctrl_b", | ||
2904 | }; | ||
2905 | |||
2729 | static const char * const scifa0_groups[] = { | 2906 | static const char * const scifa0_groups[] = { |
2730 | "scifa0_data", | 2907 | "scifa0_data", |
2731 | "scifa0_clk", | 2908 | "scifa0_clk", |
@@ -2850,7 +3027,11 @@ static const char * const sdhi3_groups[] = { | |||
2850 | 3027 | ||
2851 | static const struct sh_pfc_function pinmux_functions[] = { | 3028 | static const struct sh_pfc_function pinmux_functions[] = { |
2852 | SH_PFC_FUNCTION(eth), | 3029 | SH_PFC_FUNCTION(eth), |
3030 | SH_PFC_FUNCTION(hscif0), | ||
3031 | SH_PFC_FUNCTION(hscif1), | ||
2853 | SH_PFC_FUNCTION(intc), | 3032 | SH_PFC_FUNCTION(intc), |
3033 | SH_PFC_FUNCTION(mmc0), | ||
3034 | SH_PFC_FUNCTION(mmc1), | ||
2854 | SH_PFC_FUNCTION(scif0), | 3035 | SH_PFC_FUNCTION(scif0), |
2855 | SH_PFC_FUNCTION(scif1), | 3036 | SH_PFC_FUNCTION(scif1), |
2856 | SH_PFC_FUNCTION(scifa0), | 3037 | SH_PFC_FUNCTION(scifa0), |
@@ -2859,13 +3040,11 @@ static const struct sh_pfc_function pinmux_functions[] = { | |||
2859 | SH_PFC_FUNCTION(scifb0), | 3040 | SH_PFC_FUNCTION(scifb0), |
2860 | SH_PFC_FUNCTION(scifb1), | 3041 | SH_PFC_FUNCTION(scifb1), |
2861 | SH_PFC_FUNCTION(scifb2), | 3042 | SH_PFC_FUNCTION(scifb2), |
2862 | SH_PFC_FUNCTION(tpu0), | ||
2863 | SH_PFC_FUNCTION(mmc0), | ||
2864 | SH_PFC_FUNCTION(mmc1), | ||
2865 | SH_PFC_FUNCTION(sdhi0), | 3043 | SH_PFC_FUNCTION(sdhi0), |
2866 | SH_PFC_FUNCTION(sdhi1), | 3044 | SH_PFC_FUNCTION(sdhi1), |
2867 | SH_PFC_FUNCTION(sdhi2), | 3045 | SH_PFC_FUNCTION(sdhi2), |
2868 | SH_PFC_FUNCTION(sdhi3), | 3046 | SH_PFC_FUNCTION(sdhi3), |
3047 | SH_PFC_FUNCTION(tpu0), | ||
2869 | }; | 3048 | }; |
2870 | 3049 | ||
2871 | static struct pinmux_cfg_reg pinmux_config_regs[] = { | 3050 | static struct pinmux_cfg_reg pinmux_config_regs[] = { |
diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index d4d377c40ec9..ce1743d0b679 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig | |||
@@ -14,8 +14,9 @@ config OMAP_REMOTEPROC | |||
14 | depends on HAS_DMA | 14 | depends on HAS_DMA |
15 | depends on ARCH_OMAP4 || SOC_OMAP5 | 15 | depends on ARCH_OMAP4 || SOC_OMAP5 |
16 | depends on OMAP_IOMMU | 16 | depends on OMAP_IOMMU |
17 | depends on OMAP_MBOX_FWK | ||
18 | select REMOTEPROC | 17 | select REMOTEPROC |
18 | select MAILBOX | ||
19 | select OMAP2PLUS_MBOX | ||
19 | select RPMSG | 20 | select RPMSG |
20 | help | 21 | help |
21 | Say y here to support OMAP's remote processors (dual M3 | 22 | Say y here to support OMAP's remote processors (dual M3 |
diff --git a/drivers/remoteproc/omap_remoteproc.c b/drivers/remoteproc/omap_remoteproc.c index 0e396c155b3b..51689721ea7a 100644 --- a/drivers/remoteproc/omap_remoteproc.c +++ b/drivers/remoteproc/omap_remoteproc.c | |||
@@ -27,8 +27,8 @@ | |||
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
29 | #include <linux/remoteproc.h> | 29 | #include <linux/remoteproc.h> |
30 | #include <linux/omap-mailbox.h> | ||
30 | 31 | ||
31 | #include <plat/mailbox.h> | ||
32 | #include <linux/platform_data/remoteproc-omap.h> | 32 | #include <linux/platform_data/remoteproc-omap.h> |
33 | 33 | ||
34 | #include "omap_remoteproc.h" | 34 | #include "omap_remoteproc.h" |
diff --git a/drivers/staging/tidspbridge/Kconfig b/drivers/staging/tidspbridge/Kconfig index 60848f198b48..165b918b8171 100644 --- a/drivers/staging/tidspbridge/Kconfig +++ b/drivers/staging/tidspbridge/Kconfig | |||
@@ -5,7 +5,8 @@ | |||
5 | menuconfig TIDSPBRIDGE | 5 | menuconfig TIDSPBRIDGE |
6 | tristate "DSP Bridge driver" | 6 | tristate "DSP Bridge driver" |
7 | depends on ARCH_OMAP3 && !ARCH_MULTIPLATFORM | 7 | depends on ARCH_OMAP3 && !ARCH_MULTIPLATFORM |
8 | select OMAP_MBOX_FWK | 8 | select MAILBOX |
9 | select OMAP2PLUS_MBOX | ||
9 | help | 10 | help |
10 | DSP/BIOS Bridge is designed for platforms that contain a GPP and | 11 | DSP/BIOS Bridge is designed for platforms that contain a GPP and |
11 | one or more attached DSPs. The GPP is considered the master or | 12 | one or more attached DSPs. The GPP is considered the master or |
diff --git a/drivers/staging/tidspbridge/include/dspbridge/host_os.h b/drivers/staging/tidspbridge/include/dspbridge/host_os.h index 7f3a1db31619..d1441db469fc 100644 --- a/drivers/staging/tidspbridge/include/dspbridge/host_os.h +++ b/drivers/staging/tidspbridge/include/dspbridge/host_os.h | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/ioport.h> | 41 | #include <linux/ioport.h> |
42 | #include <linux/platform_device.h> | 42 | #include <linux/platform_device.h> |
43 | #include <linux/clk.h> | 43 | #include <linux/clk.h> |
44 | #include <plat/mailbox.h> | 44 | #include <linux/omap-mailbox.h> |
45 | #include <linux/pagemap.h> | 45 | #include <linux/pagemap.h> |
46 | #include <asm/cacheflush.h> | 46 | #include <asm/cacheflush.h> |
47 | #include <linux/dma-mapping.h> | 47 | #include <linux/dma-mapping.h> |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 01b8229fa862..62f6802f6e0f 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -155,7 +155,7 @@ config USB_LPC32XX | |||
155 | 155 | ||
156 | config USB_ATMEL_USBA | 156 | config USB_ATMEL_USBA |
157 | tristate "Atmel USBA" | 157 | tristate "Atmel USBA" |
158 | depends on AVR32 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45 | 158 | depends on AVR32 || ARCH_AT91 |
159 | help | 159 | help |
160 | USBA is the integrated high-speed USB Device controller on | 160 | USBA is the integrated high-speed USB Device controller on |
161 | the AT32AP700x, some AT91SAM9 and AT91CAP9 processors from Atmel. | 161 | the AT32AP700x, some AT91SAM9 and AT91CAP9 processors from Atmel. |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 5a5128a226f7..1d9722203ca6 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -22,15 +22,13 @@ | |||
22 | #include <linux/usb/atmel_usba_udc.h> | 22 | #include <linux/usb/atmel_usba_udc.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/platform_data/atmel.h> | 24 | #include <linux/platform_data/atmel.h> |
25 | #include <linux/of.h> | ||
26 | #include <linux/of_gpio.h> | ||
25 | 27 | ||
26 | #include <asm/gpio.h> | 28 | #include <asm/gpio.h> |
27 | 29 | ||
28 | #include "atmel_usba_udc.h" | 30 | #include "atmel_usba_udc.h" |
29 | 31 | ||
30 | |||
31 | static struct usba_udc the_udc; | ||
32 | static struct usba_ep *usba_ep; | ||
33 | |||
34 | #ifdef CONFIG_USB_GADGET_DEBUG_FS | 32 | #ifdef CONFIG_USB_GADGET_DEBUG_FS |
35 | #include <linux/debugfs.h> | 33 | #include <linux/debugfs.h> |
36 | #include <linux/uaccess.h> | 34 | #include <linux/uaccess.h> |
@@ -1014,16 +1012,13 @@ static void nop_release(struct device *dev) | |||
1014 | 1012 | ||
1015 | } | 1013 | } |
1016 | 1014 | ||
1017 | static struct usba_udc the_udc = { | 1015 | struct usb_gadget usba_gadget_template = { |
1018 | .gadget = { | 1016 | .ops = &usba_udc_ops, |
1019 | .ops = &usba_udc_ops, | 1017 | .max_speed = USB_SPEED_HIGH, |
1020 | .ep_list = LIST_HEAD_INIT(the_udc.gadget.ep_list), | 1018 | .name = "atmel_usba_udc", |
1021 | .max_speed = USB_SPEED_HIGH, | 1019 | .dev = { |
1022 | .name = "atmel_usba_udc", | 1020 | .init_name = "gadget", |
1023 | .dev = { | 1021 | .release = nop_release, |
1024 | .init_name = "gadget", | ||
1025 | .release = nop_release, | ||
1026 | }, | ||
1027 | }, | 1022 | }, |
1028 | }; | 1023 | }; |
1029 | 1024 | ||
@@ -1147,7 +1142,7 @@ static int do_test_mode(struct usba_udc *udc) | |||
1147 | * Test_SE0_NAK: Force high-speed mode and set up ep0 | 1142 | * Test_SE0_NAK: Force high-speed mode and set up ep0 |
1148 | * for Bulk IN transfers | 1143 | * for Bulk IN transfers |
1149 | */ | 1144 | */ |
1150 | ep = &usba_ep[0]; | 1145 | ep = &udc->usba_ep[0]; |
1151 | usba_writel(udc, TST, | 1146 | usba_writel(udc, TST, |
1152 | USBA_BF(SPEED_CFG, USBA_SPEED_CFG_FORCE_HIGH)); | 1147 | USBA_BF(SPEED_CFG, USBA_SPEED_CFG_FORCE_HIGH)); |
1153 | usba_ep_writel(ep, CFG, | 1148 | usba_ep_writel(ep, CFG, |
@@ -1165,7 +1160,7 @@ static int do_test_mode(struct usba_udc *udc) | |||
1165 | break; | 1160 | break; |
1166 | case 0x0400: | 1161 | case 0x0400: |
1167 | /* Test_Packet */ | 1162 | /* Test_Packet */ |
1168 | ep = &usba_ep[0]; | 1163 | ep = &udc->usba_ep[0]; |
1169 | usba_ep_writel(ep, CFG, | 1164 | usba_ep_writel(ep, CFG, |
1170 | USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64) | 1165 | USBA_BF(EPT_SIZE, USBA_EPT_SIZE_64) |
1171 | | USBA_EPT_DIR_IN | 1166 | | USBA_EPT_DIR_IN |
@@ -1668,7 +1663,7 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1668 | 1663 | ||
1669 | for (i = 1; i < USBA_NR_ENDPOINTS; i++) | 1664 | for (i = 1; i < USBA_NR_ENDPOINTS; i++) |
1670 | if (dma_status & (1 << i)) | 1665 | if (dma_status & (1 << i)) |
1671 | usba_dma_irq(udc, &usba_ep[i]); | 1666 | usba_dma_irq(udc, &udc->usba_ep[i]); |
1672 | } | 1667 | } |
1673 | 1668 | ||
1674 | ep_status = USBA_BFEXT(EPT_INT, status); | 1669 | ep_status = USBA_BFEXT(EPT_INT, status); |
@@ -1677,10 +1672,10 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1677 | 1672 | ||
1678 | for (i = 0; i < USBA_NR_ENDPOINTS; i++) | 1673 | for (i = 0; i < USBA_NR_ENDPOINTS; i++) |
1679 | if (ep_status & (1 << i)) { | 1674 | if (ep_status & (1 << i)) { |
1680 | if (ep_is_control(&usba_ep[i])) | 1675 | if (ep_is_control(&udc->usba_ep[i])) |
1681 | usba_control_irq(udc, &usba_ep[i]); | 1676 | usba_control_irq(udc, &udc->usba_ep[i]); |
1682 | else | 1677 | else |
1683 | usba_ep_irq(udc, &usba_ep[i]); | 1678 | usba_ep_irq(udc, &udc->usba_ep[i]); |
1684 | } | 1679 | } |
1685 | } | 1680 | } |
1686 | 1681 | ||
@@ -1705,7 +1700,7 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1705 | DBG(DBG_BUS, "%s bus reset detected\n", | 1700 | DBG(DBG_BUS, "%s bus reset detected\n", |
1706 | usb_speed_string(udc->gadget.speed)); | 1701 | usb_speed_string(udc->gadget.speed)); |
1707 | 1702 | ||
1708 | ep0 = &usba_ep[0]; | 1703 | ep0 = &udc->usba_ep[0]; |
1709 | ep0->ep.desc = &usba_ep0_desc; | 1704 | ep0->ep.desc = &usba_ep0_desc; |
1710 | ep0->state = WAIT_FOR_SETUP; | 1705 | ep0->state = WAIT_FOR_SETUP; |
1711 | usba_ep_writel(ep0, CFG, | 1706 | usba_ep_writel(ep0, CFG, |
@@ -1835,17 +1830,158 @@ static int atmel_usba_stop(struct usb_gadget *gadget, | |||
1835 | return 0; | 1830 | return 0; |
1836 | } | 1831 | } |
1837 | 1832 | ||
1838 | static int __init usba_udc_probe(struct platform_device *pdev) | 1833 | #ifdef CONFIG_OF |
1834 | static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, | ||
1835 | struct usba_udc *udc) | ||
1836 | { | ||
1837 | u32 val; | ||
1838 | const char *name; | ||
1839 | enum of_gpio_flags flags; | ||
1840 | struct device_node *np = pdev->dev.of_node; | ||
1841 | struct device_node *pp; | ||
1842 | int i, ret; | ||
1843 | struct usba_ep *eps, *ep; | ||
1844 | |||
1845 | udc->num_ep = 0; | ||
1846 | |||
1847 | udc->vbus_pin = of_get_named_gpio_flags(np, "atmel,vbus-gpio", 0, | ||
1848 | &flags); | ||
1849 | udc->vbus_pin_inverted = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; | ||
1850 | |||
1851 | pp = NULL; | ||
1852 | while ((pp = of_get_next_child(np, pp))) | ||
1853 | udc->num_ep++; | ||
1854 | |||
1855 | eps = devm_kzalloc(&pdev->dev, sizeof(struct usba_ep) * udc->num_ep, | ||
1856 | GFP_KERNEL); | ||
1857 | if (!eps) | ||
1858 | return ERR_PTR(-ENOMEM); | ||
1859 | |||
1860 | udc->gadget.ep0 = &eps[0].ep; | ||
1861 | |||
1862 | INIT_LIST_HEAD(&eps[0].ep.ep_list); | ||
1863 | |||
1864 | pp = NULL; | ||
1865 | i = 0; | ||
1866 | while ((pp = of_get_next_child(np, pp))) { | ||
1867 | ep = &eps[i]; | ||
1868 | |||
1869 | ret = of_property_read_u32(pp, "reg", &val); | ||
1870 | if (ret) { | ||
1871 | dev_err(&pdev->dev, "of_probe: reg error(%d)\n", ret); | ||
1872 | goto err; | ||
1873 | } | ||
1874 | ep->index = val; | ||
1875 | |||
1876 | ret = of_property_read_u32(pp, "atmel,fifo-size", &val); | ||
1877 | if (ret) { | ||
1878 | dev_err(&pdev->dev, "of_probe: fifo-size error(%d)\n", ret); | ||
1879 | goto err; | ||
1880 | } | ||
1881 | ep->fifo_size = val; | ||
1882 | |||
1883 | ret = of_property_read_u32(pp, "atmel,nb-banks", &val); | ||
1884 | if (ret) { | ||
1885 | dev_err(&pdev->dev, "of_probe: nb-banks error(%d)\n", ret); | ||
1886 | goto err; | ||
1887 | } | ||
1888 | ep->nr_banks = val; | ||
1889 | |||
1890 | ep->can_dma = of_property_read_bool(pp, "atmel,can-dma"); | ||
1891 | ep->can_isoc = of_property_read_bool(pp, "atmel,can-isoc"); | ||
1892 | |||
1893 | ret = of_property_read_string(pp, "name", &name); | ||
1894 | ep->ep.name = name; | ||
1895 | |||
1896 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); | ||
1897 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); | ||
1898 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); | ||
1899 | ep->ep.ops = &usba_ep_ops; | ||
1900 | ep->ep.maxpacket = ep->fifo_size; | ||
1901 | ep->udc = udc; | ||
1902 | INIT_LIST_HEAD(&ep->queue); | ||
1903 | |||
1904 | if (i) | ||
1905 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); | ||
1906 | |||
1907 | i++; | ||
1908 | } | ||
1909 | |||
1910 | return eps; | ||
1911 | err: | ||
1912 | return ERR_PTR(ret); | ||
1913 | } | ||
1914 | #else | ||
1915 | static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, | ||
1916 | struct usba_udc *udc) | ||
1917 | { | ||
1918 | return ERR_PTR(-ENOSYS); | ||
1919 | } | ||
1920 | #endif | ||
1921 | |||
1922 | static struct usba_ep * usba_udc_pdata(struct platform_device *pdev, | ||
1923 | struct usba_udc *udc) | ||
1839 | { | 1924 | { |
1840 | struct usba_platform_data *pdata = pdev->dev.platform_data; | 1925 | struct usba_platform_data *pdata = pdev->dev.platform_data; |
1926 | struct usba_ep *eps; | ||
1927 | int i; | ||
1928 | |||
1929 | if (!pdata) | ||
1930 | return ERR_PTR(-ENXIO); | ||
1931 | |||
1932 | eps = devm_kzalloc(&pdev->dev, sizeof(struct usba_ep) * pdata->num_ep, | ||
1933 | GFP_KERNEL); | ||
1934 | if (!eps) | ||
1935 | return ERR_PTR(-ENOMEM); | ||
1936 | |||
1937 | udc->gadget.ep0 = &eps[0].ep; | ||
1938 | |||
1939 | udc->vbus_pin = pdata->vbus_pin; | ||
1940 | udc->vbus_pin_inverted = pdata->vbus_pin_inverted; | ||
1941 | udc->num_ep = pdata->num_ep; | ||
1942 | |||
1943 | INIT_LIST_HEAD(&eps[0].ep.ep_list); | ||
1944 | |||
1945 | for (i = 0; i < pdata->num_ep; i++) { | ||
1946 | struct usba_ep *ep = &eps[i]; | ||
1947 | |||
1948 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); | ||
1949 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); | ||
1950 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); | ||
1951 | ep->ep.ops = &usba_ep_ops; | ||
1952 | ep->ep.name = pdata->ep[i].name; | ||
1953 | ep->fifo_size = ep->ep.maxpacket = pdata->ep[i].fifo_size; | ||
1954 | ep->udc = udc; | ||
1955 | INIT_LIST_HEAD(&ep->queue); | ||
1956 | ep->nr_banks = pdata->ep[i].nr_banks; | ||
1957 | ep->index = pdata->ep[i].index; | ||
1958 | ep->can_dma = pdata->ep[i].can_dma; | ||
1959 | ep->can_isoc = pdata->ep[i].can_isoc; | ||
1960 | |||
1961 | if (i) | ||
1962 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); | ||
1963 | } | ||
1964 | |||
1965 | return eps; | ||
1966 | } | ||
1967 | |||
1968 | static int __init usba_udc_probe(struct platform_device *pdev) | ||
1969 | { | ||
1841 | struct resource *regs, *fifo; | 1970 | struct resource *regs, *fifo; |
1842 | struct clk *pclk, *hclk; | 1971 | struct clk *pclk, *hclk; |
1843 | struct usba_udc *udc = &the_udc; | 1972 | struct usba_udc *udc; |
1844 | int irq, ret, i; | 1973 | int irq, ret, i; |
1845 | 1974 | ||
1975 | udc = devm_kzalloc(&pdev->dev, sizeof(*udc), GFP_KERNEL); | ||
1976 | if (!udc) | ||
1977 | return -ENOMEM; | ||
1978 | |||
1979 | udc->gadget = usba_gadget_template; | ||
1980 | INIT_LIST_HEAD(&udc->gadget.ep_list); | ||
1981 | |||
1846 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); | 1982 | regs = platform_get_resource(pdev, IORESOURCE_MEM, CTRL_IOMEM_ID); |
1847 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); | 1983 | fifo = platform_get_resource(pdev, IORESOURCE_MEM, FIFO_IOMEM_ID); |
1848 | if (!regs || !fifo || !pdata) | 1984 | if (!regs || !fifo) |
1849 | return -ENXIO; | 1985 | return -ENXIO; |
1850 | 1986 | ||
1851 | irq = platform_get_irq(pdev, 0); | 1987 | irq = platform_get_irq(pdev, 0); |
@@ -1891,46 +2027,14 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1891 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | 2027 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
1892 | clk_disable(pclk); | 2028 | clk_disable(pclk); |
1893 | 2029 | ||
1894 | usba_ep = kzalloc(sizeof(struct usba_ep) * pdata->num_ep, | 2030 | if (pdev->dev.of_node) |
1895 | GFP_KERNEL); | 2031 | udc->usba_ep = atmel_udc_of_init(pdev, udc); |
1896 | if (!usba_ep) | 2032 | else |
1897 | goto err_alloc_ep; | 2033 | udc->usba_ep = usba_udc_pdata(pdev, udc); |
1898 | |||
1899 | the_udc.gadget.ep0 = &usba_ep[0].ep; | ||
1900 | |||
1901 | INIT_LIST_HEAD(&usba_ep[0].ep.ep_list); | ||
1902 | usba_ep[0].ep_regs = udc->regs + USBA_EPT_BASE(0); | ||
1903 | usba_ep[0].dma_regs = udc->regs + USBA_DMA_BASE(0); | ||
1904 | usba_ep[0].fifo = udc->fifo + USBA_FIFO_BASE(0); | ||
1905 | usba_ep[0].ep.ops = &usba_ep_ops; | ||
1906 | usba_ep[0].ep.name = pdata->ep[0].name; | ||
1907 | usba_ep[0].ep.maxpacket = pdata->ep[0].fifo_size; | ||
1908 | usba_ep[0].udc = &the_udc; | ||
1909 | INIT_LIST_HEAD(&usba_ep[0].queue); | ||
1910 | usba_ep[0].fifo_size = pdata->ep[0].fifo_size; | ||
1911 | usba_ep[0].nr_banks = pdata->ep[0].nr_banks; | ||
1912 | usba_ep[0].index = pdata->ep[0].index; | ||
1913 | usba_ep[0].can_dma = pdata->ep[0].can_dma; | ||
1914 | usba_ep[0].can_isoc = pdata->ep[0].can_isoc; | ||
1915 | |||
1916 | for (i = 1; i < pdata->num_ep; i++) { | ||
1917 | struct usba_ep *ep = &usba_ep[i]; | ||
1918 | |||
1919 | ep->ep_regs = udc->regs + USBA_EPT_BASE(i); | ||
1920 | ep->dma_regs = udc->regs + USBA_DMA_BASE(i); | ||
1921 | ep->fifo = udc->fifo + USBA_FIFO_BASE(i); | ||
1922 | ep->ep.ops = &usba_ep_ops; | ||
1923 | ep->ep.name = pdata->ep[i].name; | ||
1924 | ep->ep.maxpacket = pdata->ep[i].fifo_size; | ||
1925 | ep->udc = &the_udc; | ||
1926 | INIT_LIST_HEAD(&ep->queue); | ||
1927 | ep->fifo_size = pdata->ep[i].fifo_size; | ||
1928 | ep->nr_banks = pdata->ep[i].nr_banks; | ||
1929 | ep->index = pdata->ep[i].index; | ||
1930 | ep->can_dma = pdata->ep[i].can_dma; | ||
1931 | ep->can_isoc = pdata->ep[i].can_isoc; | ||
1932 | 2034 | ||
1933 | list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); | 2035 | if (IS_ERR(udc->usba_ep)) { |
2036 | ret = PTR_ERR(udc->usba_ep); | ||
2037 | goto err_alloc_ep; | ||
1934 | } | 2038 | } |
1935 | 2039 | ||
1936 | ret = request_irq(irq, usba_udc_irq, 0, "atmel_usba_udc", udc); | 2040 | ret = request_irq(irq, usba_udc_irq, 0, "atmel_usba_udc", udc); |
@@ -1941,16 +2045,12 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1941 | } | 2045 | } |
1942 | udc->irq = irq; | 2046 | udc->irq = irq; |
1943 | 2047 | ||
1944 | if (gpio_is_valid(pdata->vbus_pin)) { | 2048 | if (gpio_is_valid(udc->vbus_pin)) { |
1945 | if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) { | 2049 | if (!devm_gpio_request(&pdev->dev, udc->vbus_pin, "atmel_usba_udc")) { |
1946 | udc->vbus_pin = pdata->vbus_pin; | ||
1947 | udc->vbus_pin_inverted = pdata->vbus_pin_inverted; | ||
1948 | |||
1949 | ret = request_irq(gpio_to_irq(udc->vbus_pin), | 2050 | ret = request_irq(gpio_to_irq(udc->vbus_pin), |
1950 | usba_vbus_irq, 0, | 2051 | usba_vbus_irq, 0, |
1951 | "atmel_usba_udc", udc); | 2052 | "atmel_usba_udc", udc); |
1952 | if (ret) { | 2053 | if (ret) { |
1953 | gpio_free(udc->vbus_pin); | ||
1954 | udc->vbus_pin = -ENODEV; | 2054 | udc->vbus_pin = -ENODEV; |
1955 | dev_warn(&udc->pdev->dev, | 2055 | dev_warn(&udc->pdev->dev, |
1956 | "failed to request vbus irq; " | 2056 | "failed to request vbus irq; " |
@@ -1969,20 +2069,17 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1969 | goto err_add_udc; | 2069 | goto err_add_udc; |
1970 | 2070 | ||
1971 | usba_init_debugfs(udc); | 2071 | usba_init_debugfs(udc); |
1972 | for (i = 1; i < pdata->num_ep; i++) | 2072 | for (i = 1; i < udc->num_ep; i++) |
1973 | usba_ep_init_debugfs(udc, &usba_ep[i]); | 2073 | usba_ep_init_debugfs(udc, &udc->usba_ep[i]); |
1974 | 2074 | ||
1975 | return 0; | 2075 | return 0; |
1976 | 2076 | ||
1977 | err_add_udc: | 2077 | err_add_udc: |
1978 | if (gpio_is_valid(pdata->vbus_pin)) { | 2078 | if (gpio_is_valid(udc->vbus_pin)) |
1979 | free_irq(gpio_to_irq(udc->vbus_pin), udc); | 2079 | free_irq(gpio_to_irq(udc->vbus_pin), udc); |
1980 | gpio_free(udc->vbus_pin); | ||
1981 | } | ||
1982 | 2080 | ||
1983 | free_irq(irq, udc); | 2081 | free_irq(irq, udc); |
1984 | err_request_irq: | 2082 | err_request_irq: |
1985 | kfree(usba_ep); | ||
1986 | err_alloc_ep: | 2083 | err_alloc_ep: |
1987 | iounmap(udc->fifo); | 2084 | iounmap(udc->fifo); |
1988 | err_map_fifo: | 2085 | err_map_fifo: |
@@ -1999,23 +2096,20 @@ static int __exit usba_udc_remove(struct platform_device *pdev) | |||
1999 | { | 2096 | { |
2000 | struct usba_udc *udc; | 2097 | struct usba_udc *udc; |
2001 | int i; | 2098 | int i; |
2002 | struct usba_platform_data *pdata = pdev->dev.platform_data; | ||
2003 | 2099 | ||
2004 | udc = platform_get_drvdata(pdev); | 2100 | udc = platform_get_drvdata(pdev); |
2005 | 2101 | ||
2006 | usb_del_gadget_udc(&udc->gadget); | 2102 | usb_del_gadget_udc(&udc->gadget); |
2007 | 2103 | ||
2008 | for (i = 1; i < pdata->num_ep; i++) | 2104 | for (i = 1; i < udc->num_ep; i++) |
2009 | usba_ep_cleanup_debugfs(&usba_ep[i]); | 2105 | usba_ep_cleanup_debugfs(&udc->usba_ep[i]); |
2010 | usba_cleanup_debugfs(udc); | 2106 | usba_cleanup_debugfs(udc); |
2011 | 2107 | ||
2012 | if (gpio_is_valid(udc->vbus_pin)) { | 2108 | if (gpio_is_valid(udc->vbus_pin)) { |
2013 | free_irq(gpio_to_irq(udc->vbus_pin), udc); | 2109 | free_irq(gpio_to_irq(udc->vbus_pin), udc); |
2014 | gpio_free(udc->vbus_pin); | ||
2015 | } | 2110 | } |
2016 | 2111 | ||
2017 | free_irq(udc->irq, udc); | 2112 | free_irq(udc->irq, udc); |
2018 | kfree(usba_ep); | ||
2019 | iounmap(udc->fifo); | 2113 | iounmap(udc->fifo); |
2020 | iounmap(udc->regs); | 2114 | iounmap(udc->regs); |
2021 | clk_put(udc->hclk); | 2115 | clk_put(udc->hclk); |
@@ -2024,11 +2118,21 @@ static int __exit usba_udc_remove(struct platform_device *pdev) | |||
2024 | return 0; | 2118 | return 0; |
2025 | } | 2119 | } |
2026 | 2120 | ||
2121 | #if defined(CONFIG_OF) | ||
2122 | static const struct of_device_id atmel_udc_dt_ids[] = { | ||
2123 | { .compatible = "atmel,at91sam9rl-udc" }, | ||
2124 | { /* sentinel */ } | ||
2125 | }; | ||
2126 | |||
2127 | MODULE_DEVICE_TABLE(of, atmel_udc_dt_ids); | ||
2128 | #endif | ||
2129 | |||
2027 | static struct platform_driver udc_driver = { | 2130 | static struct platform_driver udc_driver = { |
2028 | .remove = __exit_p(usba_udc_remove), | 2131 | .remove = __exit_p(usba_udc_remove), |
2029 | .driver = { | 2132 | .driver = { |
2030 | .name = "atmel_usba_udc", | 2133 | .name = "atmel_usba_udc", |
2031 | .owner = THIS_MODULE, | 2134 | .owner = THIS_MODULE, |
2135 | .of_match_table = of_match_ptr(atmel_udc_dt_ids), | ||
2032 | }, | 2136 | }, |
2033 | }; | 2137 | }; |
2034 | 2138 | ||
diff --git a/drivers/usb/gadget/atmel_usba_udc.h b/drivers/usb/gadget/atmel_usba_udc.h index d65a61851d3d..2922db50befe 100644 --- a/drivers/usb/gadget/atmel_usba_udc.h +++ b/drivers/usb/gadget/atmel_usba_udc.h | |||
@@ -317,8 +317,10 @@ struct usba_udc { | |||
317 | int irq; | 317 | int irq; |
318 | int vbus_pin; | 318 | int vbus_pin; |
319 | int vbus_pin_inverted; | 319 | int vbus_pin_inverted; |
320 | int num_ep; | ||
320 | struct clk *pclk; | 321 | struct clk *pclk; |
321 | struct clk *hclk; | 322 | struct clk *hclk; |
323 | struct usba_ep *usba_ep; | ||
322 | 324 | ||
323 | u16 devstatus; | 325 | u16 devstatus; |
324 | 326 | ||
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index 028ff4d07dc7..fce71b605936 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c | |||
@@ -25,11 +25,19 @@ | |||
25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
28 | #include <linux/of.h> | ||
28 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
29 | #include <linux/usb/musb-ux500.h> | 30 | #include <linux/usb/musb-ux500.h> |
30 | 31 | ||
31 | #include "musb_core.h" | 32 | #include "musb_core.h" |
32 | 33 | ||
34 | static struct musb_hdrc_config ux500_musb_hdrc_config = { | ||
35 | .multipoint = true, | ||
36 | .dyn_fifo = true, | ||
37 | .num_eps = 16, | ||
38 | .ram_bits = 16, | ||
39 | }; | ||
40 | |||
33 | struct ux500_glue { | 41 | struct ux500_glue { |
34 | struct device *dev; | 42 | struct device *dev; |
35 | struct platform_device *musb; | 43 | struct platform_device *musb; |
@@ -187,15 +195,58 @@ static const struct musb_platform_ops ux500_ops = { | |||
187 | .set_vbus = ux500_musb_set_vbus, | 195 | .set_vbus = ux500_musb_set_vbus, |
188 | }; | 196 | }; |
189 | 197 | ||
198 | static struct musb_hdrc_platform_data * | ||
199 | ux500_of_probe(struct platform_device *pdev, struct device_node *np) | ||
200 | { | ||
201 | struct musb_hdrc_platform_data *pdata; | ||
202 | const char *mode; | ||
203 | int strlen; | ||
204 | |||
205 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | ||
206 | if (!pdata) | ||
207 | return NULL; | ||
208 | |||
209 | mode = of_get_property(np, "dr_mode", &strlen); | ||
210 | if (!mode) { | ||
211 | dev_err(&pdev->dev, "No 'dr_mode' property found\n"); | ||
212 | return NULL; | ||
213 | } | ||
214 | |||
215 | if (strlen > 0) { | ||
216 | if (!strcmp(mode, "host")) | ||
217 | pdata->mode = MUSB_HOST; | ||
218 | if (!strcmp(mode, "otg")) | ||
219 | pdata->mode = MUSB_OTG; | ||
220 | if (!strcmp(mode, "peripheral")) | ||
221 | pdata->mode = MUSB_PERIPHERAL; | ||
222 | } | ||
223 | |||
224 | return pdata; | ||
225 | } | ||
226 | |||
190 | static int ux500_probe(struct platform_device *pdev) | 227 | static int ux500_probe(struct platform_device *pdev) |
191 | { | 228 | { |
192 | struct resource musb_resources[2]; | 229 | struct resource musb_resources[2]; |
193 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; | 230 | struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; |
231 | struct device_node *np = pdev->dev.of_node; | ||
194 | struct platform_device *musb; | 232 | struct platform_device *musb; |
195 | struct ux500_glue *glue; | 233 | struct ux500_glue *glue; |
196 | struct clk *clk; | 234 | struct clk *clk; |
197 | int ret = -ENOMEM; | 235 | int ret = -ENOMEM; |
198 | 236 | ||
237 | if (!pdata) { | ||
238 | if (np) { | ||
239 | pdata = ux500_of_probe(pdev, np); | ||
240 | if (!pdata) | ||
241 | goto err0; | ||
242 | |||
243 | pdev->dev.platform_data = pdata; | ||
244 | } else { | ||
245 | dev_err(&pdev->dev, "no pdata or device tree found\n"); | ||
246 | goto err0; | ||
247 | } | ||
248 | } | ||
249 | |||
199 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 250 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); |
200 | if (!glue) { | 251 | if (!glue) { |
201 | dev_err(&pdev->dev, "failed to allocate glue context\n"); | 252 | dev_err(&pdev->dev, "failed to allocate glue context\n"); |
@@ -222,14 +273,16 @@ static int ux500_probe(struct platform_device *pdev) | |||
222 | } | 273 | } |
223 | 274 | ||
224 | musb->dev.parent = &pdev->dev; | 275 | musb->dev.parent = &pdev->dev; |
225 | musb->dev.dma_mask = pdev->dev.dma_mask; | 276 | musb->dev.dma_mask = &pdev->dev.coherent_dma_mask; |
226 | musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; | 277 | musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; |
278 | musb->dev.of_node = pdev->dev.of_node; | ||
227 | 279 | ||
228 | glue->dev = &pdev->dev; | 280 | glue->dev = &pdev->dev; |
229 | glue->musb = musb; | 281 | glue->musb = musb; |
230 | glue->clk = clk; | 282 | glue->clk = clk; |
231 | 283 | ||
232 | pdata->platform_ops = &ux500_ops; | 284 | pdata->platform_ops = &ux500_ops; |
285 | pdata->config = &ux500_musb_hdrc_config; | ||
233 | 286 | ||
234 | platform_set_drvdata(pdev, glue); | 287 | platform_set_drvdata(pdev, glue); |
235 | 288 | ||
@@ -334,12 +387,18 @@ static const struct dev_pm_ops ux500_pm_ops = { | |||
334 | #define DEV_PM_OPS NULL | 387 | #define DEV_PM_OPS NULL |
335 | #endif | 388 | #endif |
336 | 389 | ||
390 | static const struct of_device_id ux500_match[] = { | ||
391 | { .compatible = "stericsson,db8500-musb", }, | ||
392 | {} | ||
393 | }; | ||
394 | |||
337 | static struct platform_driver ux500_driver = { | 395 | static struct platform_driver ux500_driver = { |
338 | .probe = ux500_probe, | 396 | .probe = ux500_probe, |
339 | .remove = ux500_remove, | 397 | .remove = ux500_remove, |
340 | .driver = { | 398 | .driver = { |
341 | .name = "musb-ux500", | 399 | .name = "musb-ux500", |
342 | .pm = DEV_PM_OPS, | 400 | .pm = DEV_PM_OPS, |
401 | .of_match_table = ux500_match, | ||
343 | }, | 402 | }, |
344 | }; | 403 | }; |
345 | 404 | ||
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index 63e7c8a6b125..bfb7a65d83cc 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c | |||
@@ -34,6 +34,11 @@ | |||
34 | #include <linux/platform_data/usb-musb-ux500.h> | 34 | #include <linux/platform_data/usb-musb-ux500.h> |
35 | #include "musb_core.h" | 35 | #include "musb_core.h" |
36 | 36 | ||
37 | static const char *iep_chan_names[] = { "iep_1_9", "iep_2_10", "iep_3_11", "iep_4_12", | ||
38 | "iep_5_13", "iep_6_14", "iep_7_15", "iep_8" }; | ||
39 | static const char *oep_chan_names[] = { "oep_1_9", "oep_2_10", "oep_3_11", "oep_4_12", | ||
40 | "oep_5_13", "oep_6_14", "oep_7_15", "oep_8" }; | ||
41 | |||
37 | struct ux500_dma_channel { | 42 | struct ux500_dma_channel { |
38 | struct dma_channel channel; | 43 | struct dma_channel channel; |
39 | struct ux500_dma_controller *controller; | 44 | struct ux500_dma_controller *controller; |
@@ -48,10 +53,8 @@ struct ux500_dma_channel { | |||
48 | 53 | ||
49 | struct ux500_dma_controller { | 54 | struct ux500_dma_controller { |
50 | struct dma_controller controller; | 55 | struct dma_controller controller; |
51 | struct ux500_dma_channel rx_channel[UX500_MUSB_DMA_NUM_RX_CHANNELS]; | 56 | struct ux500_dma_channel rx_channel[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS]; |
52 | struct ux500_dma_channel tx_channel[UX500_MUSB_DMA_NUM_TX_CHANNELS]; | 57 | struct ux500_dma_channel tx_channel[UX500_MUSB_DMA_NUM_RX_TX_CHANNELS]; |
53 | u32 num_rx_channels; | ||
54 | u32 num_tx_channels; | ||
55 | void *private_data; | 58 | void *private_data; |
56 | dma_addr_t phy_base; | 59 | dma_addr_t phy_base; |
57 | }; | 60 | }; |
@@ -143,19 +146,15 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c, | |||
143 | struct ux500_dma_channel *ux500_channel = NULL; | 146 | struct ux500_dma_channel *ux500_channel = NULL; |
144 | struct musb *musb = controller->private_data; | 147 | struct musb *musb = controller->private_data; |
145 | u8 ch_num = hw_ep->epnum - 1; | 148 | u8 ch_num = hw_ep->epnum - 1; |
146 | u32 max_ch; | ||
147 | 149 | ||
148 | /* Max 8 DMA channels (0 - 7). Each DMA channel can only be allocated | 150 | /* 8 DMA channels (0 - 7). Each DMA channel can only be allocated |
149 | * to specified hw_ep. For example DMA channel 0 can only be allocated | 151 | * to specified hw_ep. For example DMA channel 0 can only be allocated |
150 | * to hw_ep 1 and 9. | 152 | * to hw_ep 1 and 9. |
151 | */ | 153 | */ |
152 | if (ch_num > 7) | 154 | if (ch_num > 7) |
153 | ch_num -= 8; | 155 | ch_num -= 8; |
154 | 156 | ||
155 | max_ch = is_tx ? controller->num_tx_channels : | 157 | if (ch_num >= UX500_MUSB_DMA_NUM_RX_TX_CHANNELS) |
156 | controller->num_rx_channels; | ||
157 | |||
158 | if (ch_num >= max_ch) | ||
159 | return NULL; | 158 | return NULL; |
160 | 159 | ||
161 | ux500_channel = is_tx ? &(controller->tx_channel[ch_num]) : | 160 | ux500_channel = is_tx ? &(controller->tx_channel[ch_num]) : |
@@ -263,7 +262,7 @@ static int ux500_dma_controller_stop(struct dma_controller *c) | |||
263 | struct dma_channel *channel; | 262 | struct dma_channel *channel; |
264 | u8 ch_num; | 263 | u8 ch_num; |
265 | 264 | ||
266 | for (ch_num = 0; ch_num < controller->num_rx_channels; ch_num++) { | 265 | for (ch_num = 0; ch_num < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS; ch_num++) { |
267 | channel = &controller->rx_channel[ch_num].channel; | 266 | channel = &controller->rx_channel[ch_num].channel; |
268 | ux500_channel = channel->private_data; | 267 | ux500_channel = channel->private_data; |
269 | 268 | ||
@@ -273,7 +272,7 @@ static int ux500_dma_controller_stop(struct dma_controller *c) | |||
273 | dma_release_channel(ux500_channel->dma_chan); | 272 | dma_release_channel(ux500_channel->dma_chan); |
274 | } | 273 | } |
275 | 274 | ||
276 | for (ch_num = 0; ch_num < controller->num_tx_channels; ch_num++) { | 275 | for (ch_num = 0; ch_num < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS; ch_num++) { |
277 | channel = &controller->tx_channel[ch_num].channel; | 276 | channel = &controller->tx_channel[ch_num].channel; |
278 | ux500_channel = channel->private_data; | 277 | ux500_channel = channel->private_data; |
279 | 278 | ||
@@ -294,34 +293,36 @@ static int ux500_dma_controller_start(struct dma_controller *c) | |||
294 | struct musb *musb = controller->private_data; | 293 | struct musb *musb = controller->private_data; |
295 | struct device *dev = musb->controller; | 294 | struct device *dev = musb->controller; |
296 | struct musb_hdrc_platform_data *plat = dev->platform_data; | 295 | struct musb_hdrc_platform_data *plat = dev->platform_data; |
297 | struct ux500_musb_board_data *data = plat->board_data; | 296 | struct ux500_musb_board_data *data; |
298 | struct dma_channel *dma_channel = NULL; | 297 | struct dma_channel *dma_channel = NULL; |
298 | char **chan_names; | ||
299 | u32 ch_num; | 299 | u32 ch_num; |
300 | u8 dir; | 300 | u8 dir; |
301 | u8 is_tx = 0; | 301 | u8 is_tx = 0; |
302 | 302 | ||
303 | void **param_array; | 303 | void **param_array; |
304 | struct ux500_dma_channel *channel_array; | 304 | struct ux500_dma_channel *channel_array; |
305 | u32 ch_count; | ||
306 | dma_cap_mask_t mask; | 305 | dma_cap_mask_t mask; |
307 | 306 | ||
308 | if ((data->num_rx_channels > UX500_MUSB_DMA_NUM_RX_CHANNELS) || | 307 | if (!plat) { |
309 | (data->num_tx_channels > UX500_MUSB_DMA_NUM_TX_CHANNELS)) | 308 | dev_err(musb->controller, "No platform data\n"); |
310 | return -EINVAL; | 309 | return -EINVAL; |
310 | } | ||
311 | 311 | ||
312 | controller->num_rx_channels = data->num_rx_channels; | 312 | data = plat->board_data; |
313 | controller->num_tx_channels = data->num_tx_channels; | ||
314 | 313 | ||
315 | dma_cap_zero(mask); | 314 | dma_cap_zero(mask); |
316 | dma_cap_set(DMA_SLAVE, mask); | 315 | dma_cap_set(DMA_SLAVE, mask); |
317 | 316 | ||
318 | /* Prepare the loop for RX channels */ | 317 | /* Prepare the loop for RX channels */ |
319 | channel_array = controller->rx_channel; | 318 | channel_array = controller->rx_channel; |
320 | ch_count = data->num_rx_channels; | 319 | param_array = data ? data->dma_rx_param_array : NULL; |
321 | param_array = data->dma_rx_param_array; | 320 | chan_names = (char **)iep_chan_names; |
322 | 321 | ||
323 | for (dir = 0; dir < 2; dir++) { | 322 | for (dir = 0; dir < 2; dir++) { |
324 | for (ch_num = 0; ch_num < ch_count; ch_num++) { | 323 | for (ch_num = 0; |
324 | ch_num < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS; | ||
325 | ch_num++) { | ||
325 | ux500_channel = &channel_array[ch_num]; | 326 | ux500_channel = &channel_array[ch_num]; |
326 | ux500_channel->controller = controller; | 327 | ux500_channel->controller = controller; |
327 | ux500_channel->ch_num = ch_num; | 328 | ux500_channel->ch_num = ch_num; |
@@ -332,9 +333,15 @@ static int ux500_dma_controller_start(struct dma_controller *c) | |||
332 | dma_channel->status = MUSB_DMA_STATUS_FREE; | 333 | dma_channel->status = MUSB_DMA_STATUS_FREE; |
333 | dma_channel->max_len = SZ_16M; | 334 | dma_channel->max_len = SZ_16M; |
334 | 335 | ||
335 | ux500_channel->dma_chan = dma_request_channel(mask, | 336 | ux500_channel->dma_chan = |
336 | data->dma_filter, | 337 | dma_request_slave_channel(dev, chan_names[ch_num]); |
337 | param_array[ch_num]); | 338 | |
339 | if (!ux500_channel->dma_chan) | ||
340 | ux500_channel->dma_chan = | ||
341 | dma_request_channel(mask, | ||
342 | data->dma_filter, | ||
343 | param_array[ch_num]); | ||
344 | |||
338 | if (!ux500_channel->dma_chan) { | 345 | if (!ux500_channel->dma_chan) { |
339 | ERR("Dma pipe allocation error dir=%d ch=%d\n", | 346 | ERR("Dma pipe allocation error dir=%d ch=%d\n", |
340 | dir, ch_num); | 347 | dir, ch_num); |
@@ -349,8 +356,8 @@ static int ux500_dma_controller_start(struct dma_controller *c) | |||
349 | 356 | ||
350 | /* Prepare the loop for TX channels */ | 357 | /* Prepare the loop for TX channels */ |
351 | channel_array = controller->tx_channel; | 358 | channel_array = controller->tx_channel; |
352 | ch_count = data->num_tx_channels; | 359 | param_array = data ? data->dma_tx_param_array : NULL; |
353 | param_array = data->dma_tx_param_array; | 360 | chan_names = (char **)oep_chan_names; |
354 | is_tx = 1; | 361 | is_tx = 1; |
355 | } | 362 | } |
356 | 363 | ||
diff --git a/include/dt-bindings/clk/exynos-audss-clk.h b/include/dt-bindings/clk/exynos-audss-clk.h new file mode 100644 index 000000000000..8279f427c60f --- /dev/null +++ b/include/dt-bindings/clk/exynos-audss-clk.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * This header provides constants for Samsung audio subsystem | ||
3 | * clock controller. | ||
4 | * | ||
5 | * The constants defined in this header are being used in dts | ||
6 | * and exynos audss driver. | ||
7 | */ | ||
8 | |||
9 | #ifndef _DT_BINDINGS_CLK_EXYNOS_AUDSS_H | ||
10 | #define _DT_BINDINGS_CLK_EXYNOS_AUDSS_H | ||
11 | |||
12 | #define EXYNOS_MOUT_AUDSS 0 | ||
13 | #define EXYNOS_MOUT_I2S 1 | ||
14 | #define EXYNOS_DOUT_SRP 2 | ||
15 | #define EXYNOS_DOUT_AUD_BUS 3 | ||
16 | #define EXYNOS_DOUT_I2S 4 | ||
17 | #define EXYNOS_SRP_CLK 5 | ||
18 | #define EXYNOS_I2S_BUS 6 | ||
19 | #define EXYNOS_SCLK_I2S 7 | ||
20 | #define EXYNOS_PCM_BUS 8 | ||
21 | #define EXYNOS_SCLK_PCM 9 | ||
22 | |||
23 | #define EXYNOS_AUDSS_MAX_CLKS 10 | ||
24 | |||
25 | #endif | ||
diff --git a/include/linux/omap-mailbox.h b/include/linux/omap-mailbox.h new file mode 100644 index 000000000000..f8322d9cd235 --- /dev/null +++ b/include/linux/omap-mailbox.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* | ||
2 | * omap-mailbox: interprocessor communication module for OMAP | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #ifndef OMAP_MAILBOX_H | ||
10 | #define OMAP_MAILBOX_H | ||
11 | |||
12 | typedef u32 mbox_msg_t; | ||
13 | struct omap_mbox; | ||
14 | |||
15 | typedef int __bitwise omap_mbox_irq_t; | ||
16 | #define IRQ_TX ((__force omap_mbox_irq_t) 1) | ||
17 | #define IRQ_RX ((__force omap_mbox_irq_t) 2) | ||
18 | |||
19 | int omap_mbox_msg_send(struct omap_mbox *, mbox_msg_t msg); | ||
20 | |||
21 | struct omap_mbox *omap_mbox_get(const char *, struct notifier_block *nb); | ||
22 | void omap_mbox_put(struct omap_mbox *mbox, struct notifier_block *nb); | ||
23 | |||
24 | void omap_mbox_save_ctx(struct omap_mbox *mbox); | ||
25 | void omap_mbox_restore_ctx(struct omap_mbox *mbox); | ||
26 | void omap_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq); | ||
27 | void omap_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq); | ||
28 | |||
29 | #endif /* OMAP_MAILBOX_H */ | ||
diff --git a/include/linux/platform_data/dma-ste-dma40.h b/include/linux/platform_data/dma-ste-dma40.h index 4b781014b0a0..1bb9b1852256 100644 --- a/include/linux/platform_data/dma-ste-dma40.h +++ b/include/linux/platform_data/dma-ste-dma40.h | |||
@@ -70,23 +70,8 @@ enum stedma40_flow_ctrl { | |||
70 | STEDMA40_FLOW_CTRL, | 70 | STEDMA40_FLOW_CTRL, |
71 | }; | 71 | }; |
72 | 72 | ||
73 | enum stedma40_periph_data_width { | ||
74 | STEDMA40_BYTE_WIDTH = STEDMA40_ESIZE_8_BIT, | ||
75 | STEDMA40_HALFWORD_WIDTH = STEDMA40_ESIZE_16_BIT, | ||
76 | STEDMA40_WORD_WIDTH = STEDMA40_ESIZE_32_BIT, | ||
77 | STEDMA40_DOUBLEWORD_WIDTH = STEDMA40_ESIZE_64_BIT | ||
78 | }; | ||
79 | |||
80 | enum stedma40_xfer_dir { | ||
81 | STEDMA40_MEM_TO_MEM = 1, | ||
82 | STEDMA40_MEM_TO_PERIPH, | ||
83 | STEDMA40_PERIPH_TO_MEM, | ||
84 | STEDMA40_PERIPH_TO_PERIPH | ||
85 | }; | ||
86 | |||
87 | |||
88 | /** | 73 | /** |
89 | * struct stedma40_chan_cfg - dst/src channel configuration | 74 | * struct stedma40_half_channel_info - dst/src channel configuration |
90 | * | 75 | * |
91 | * @big_endian: true if the src/dst should be read as big endian | 76 | * @big_endian: true if the src/dst should be read as big endian |
92 | * @data_width: Data width of the src/dst hardware | 77 | * @data_width: Data width of the src/dst hardware |
@@ -95,7 +80,7 @@ enum stedma40_xfer_dir { | |||
95 | */ | 80 | */ |
96 | struct stedma40_half_channel_info { | 81 | struct stedma40_half_channel_info { |
97 | bool big_endian; | 82 | bool big_endian; |
98 | enum stedma40_periph_data_width data_width; | 83 | enum dma_slave_buswidth data_width; |
99 | int psize; | 84 | int psize; |
100 | enum stedma40_flow_ctrl flow_ctrl; | 85 | enum stedma40_flow_ctrl flow_ctrl; |
101 | }; | 86 | }; |
@@ -109,8 +94,7 @@ struct stedma40_half_channel_info { | |||
109 | * version 3+, i.e DB8500v2+ | 94 | * version 3+, i.e DB8500v2+ |
110 | * @mode: channel mode: physical, logical, or operation | 95 | * @mode: channel mode: physical, logical, or operation |
111 | * @mode_opt: options for the chosen channel mode | 96 | * @mode_opt: options for the chosen channel mode |
112 | * @src_dev_type: Src device type | 97 | * @dev_type: src/dst device type (driver uses dir to figure out which) |
113 | * @dst_dev_type: Dst device type | ||
114 | * @src_info: Parameters for dst half channel | 98 | * @src_info: Parameters for dst half channel |
115 | * @dst_info: Parameters for dst half channel | 99 | * @dst_info: Parameters for dst half channel |
116 | * @use_fixed_channel: if true, use physical channel specified by phy_channel | 100 | * @use_fixed_channel: if true, use physical channel specified by phy_channel |
@@ -121,13 +105,12 @@ struct stedma40_half_channel_info { | |||
121 | * | 105 | * |
122 | */ | 106 | */ |
123 | struct stedma40_chan_cfg { | 107 | struct stedma40_chan_cfg { |
124 | enum stedma40_xfer_dir dir; | 108 | enum dma_transfer_direction dir; |
125 | bool high_priority; | 109 | bool high_priority; |
126 | bool realtime; | 110 | bool realtime; |
127 | enum stedma40_mode mode; | 111 | enum stedma40_mode mode; |
128 | enum stedma40_mode_opt mode_opt; | 112 | enum stedma40_mode_opt mode_opt; |
129 | int src_dev_type; | 113 | int dev_type; |
130 | int dst_dev_type; | ||
131 | struct stedma40_half_channel_info src_info; | 114 | struct stedma40_half_channel_info src_info; |
132 | struct stedma40_half_channel_info dst_info; | 115 | struct stedma40_half_channel_info dst_info; |
133 | 116 | ||
@@ -138,13 +121,8 @@ struct stedma40_chan_cfg { | |||
138 | /** | 121 | /** |
139 | * struct stedma40_platform_data - Configuration struct for the dma device. | 122 | * struct stedma40_platform_data - Configuration struct for the dma device. |
140 | * | 123 | * |
141 | * @dev_len: length of dev_tx and dev_rx | ||
142 | * @dev_tx: mapping between destination event line and io address | 124 | * @dev_tx: mapping between destination event line and io address |
143 | * @dev_rx: mapping between source event line and io address | 125 | * @dev_rx: mapping between source event line and io address |
144 | * @memcpy: list of memcpy event lines | ||
145 | * @memcpy_len: length of memcpy | ||
146 | * @memcpy_conf_phy: default configuration of physical channel memcpy | ||
147 | * @memcpy_conf_log: default configuration of logical channel memcpy | ||
148 | * @disabled_channels: A vector, ending with -1, that marks physical channels | 126 | * @disabled_channels: A vector, ending with -1, that marks physical channels |
149 | * that are for different reasons not available for the driver. | 127 | * that are for different reasons not available for the driver. |
150 | * @soft_lli_chans: A vector, that marks physical channels will use LLI by SW | 128 | * @soft_lli_chans: A vector, that marks physical channels will use LLI by SW |
@@ -154,22 +132,17 @@ struct stedma40_chan_cfg { | |||
154 | * @num_of_soft_lli_chans: The number of channels that needs to be configured | 132 | * @num_of_soft_lli_chans: The number of channels that needs to be configured |
155 | * to use SoftLLI. | 133 | * to use SoftLLI. |
156 | * @use_esram_lcla: flag for mapping the lcla into esram region | 134 | * @use_esram_lcla: flag for mapping the lcla into esram region |
135 | * @num_of_memcpy_chans: The number of channels reserved for memcpy. | ||
157 | * @num_of_phy_chans: The number of physical channels implemented in HW. | 136 | * @num_of_phy_chans: The number of physical channels implemented in HW. |
158 | * 0 means reading the number of channels from DMA HW but this is only valid | 137 | * 0 means reading the number of channels from DMA HW but this is only valid |
159 | * for 'multiple of 4' channels, like 8. | 138 | * for 'multiple of 4' channels, like 8. |
160 | */ | 139 | */ |
161 | struct stedma40_platform_data { | 140 | struct stedma40_platform_data { |
162 | u32 dev_len; | ||
163 | const dma_addr_t *dev_tx; | ||
164 | const dma_addr_t *dev_rx; | ||
165 | int *memcpy; | ||
166 | u32 memcpy_len; | ||
167 | struct stedma40_chan_cfg *memcpy_conf_phy; | ||
168 | struct stedma40_chan_cfg *memcpy_conf_log; | ||
169 | int disabled_channels[STEDMA40_MAX_PHYS]; | 141 | int disabled_channels[STEDMA40_MAX_PHYS]; |
170 | int *soft_lli_chans; | 142 | int *soft_lli_chans; |
171 | int num_of_soft_lli_chans; | 143 | int num_of_soft_lli_chans; |
172 | bool use_esram_lcla; | 144 | bool use_esram_lcla; |
145 | int num_of_memcpy_chans; | ||
173 | int num_of_phy_chans; | 146 | int num_of_phy_chans; |
174 | }; | 147 | }; |
175 | 148 | ||
diff --git a/include/linux/platform_data/mailbox-omap.h b/include/linux/platform_data/mailbox-omap.h new file mode 100644 index 000000000000..4631dbb4255e --- /dev/null +++ b/include/linux/platform_data/mailbox-omap.h | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * mailbox-omap.h | ||
3 | * | ||
4 | * Copyright (C) 2013 Texas Instruments, Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * version 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef _PLAT_MAILBOX_H | ||
17 | #define _PLAT_MAILBOX_H | ||
18 | |||
19 | /* Interrupt register configuration types */ | ||
20 | #define MBOX_INTR_CFG_TYPE1 (0) | ||
21 | #define MBOX_INTR_CFG_TYPE2 (1) | ||
22 | |||
23 | /** | ||
24 | * struct omap_mbox_dev_info - OMAP mailbox device attribute info | ||
25 | * @name: name of the mailbox device | ||
26 | * @tx_id: mailbox queue id used for transmitting messages | ||
27 | * @rx_id: mailbox queue id on which messages are received | ||
28 | * @irq_id: irq identifier number to use from the hwmod data | ||
29 | * @usr_id: mailbox user id for identifying the interrupt into | ||
30 | * the MPU interrupt controller. | ||
31 | */ | ||
32 | struct omap_mbox_dev_info { | ||
33 | const char *name; | ||
34 | u32 tx_id; | ||
35 | u32 rx_id; | ||
36 | u32 irq_id; | ||
37 | u32 usr_id; | ||
38 | }; | ||
39 | |||
40 | /** | ||
41 | * struct omap_mbox_pdata - OMAP mailbox platform data | ||
42 | * @intr_type: type of interrupt configuration registers used | ||
43 | while programming mailbox queue interrupts | ||
44 | * @num_users: number of users (processor devices) that the mailbox | ||
45 | * h/w block can interrupt | ||
46 | * @num_fifos: number of h/w fifos within the mailbox h/w block | ||
47 | * @info_cnt: number of mailbox devices for the platform | ||
48 | * @info: array of mailbox device attributes | ||
49 | */ | ||
50 | struct omap_mbox_pdata { | ||
51 | u32 intr_type; | ||
52 | u32 num_users; | ||
53 | u32 num_fifos; | ||
54 | u32 info_cnt; | ||
55 | struct omap_mbox_dev_info *info; | ||
56 | }; | ||
57 | |||
58 | #endif /* _PLAT_MAILBOX_H */ | ||
diff --git a/include/linux/platform_data/usb-musb-ux500.h b/include/linux/platform_data/usb-musb-ux500.h index 4c1cc50a595a..dd9c83ac7de0 100644 --- a/include/linux/platform_data/usb-musb-ux500.h +++ b/include/linux/platform_data/usb-musb-ux500.h | |||
@@ -9,14 +9,11 @@ | |||
9 | 9 | ||
10 | #include <linux/dmaengine.h> | 10 | #include <linux/dmaengine.h> |
11 | 11 | ||
12 | #define UX500_MUSB_DMA_NUM_RX_CHANNELS 8 | 12 | #define UX500_MUSB_DMA_NUM_RX_TX_CHANNELS 8 |
13 | #define UX500_MUSB_DMA_NUM_TX_CHANNELS 8 | ||
14 | 13 | ||
15 | struct ux500_musb_board_data { | 14 | struct ux500_musb_board_data { |
16 | void **dma_rx_param_array; | 15 | void **dma_rx_param_array; |
17 | void **dma_tx_param_array; | 16 | void **dma_tx_param_array; |
18 | u32 num_rx_channels; | ||
19 | u32 num_tx_channels; | ||
20 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | 17 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); |
21 | }; | 18 | }; |
22 | 19 | ||
diff --git a/sound/soc/ux500/ux500_pcm.c b/sound/soc/ux500/ux500_pcm.c index b6e5ae277299..31f9bbc74521 100644 --- a/sound/soc/ux500/ux500_pcm.c +++ b/sound/soc/ux500/ux500_pcm.c | |||
@@ -76,20 +76,20 @@ static struct dma_chan *ux500_pcm_request_chan(struct snd_soc_pcm_runtime *rtd, | |||
76 | dma_params = snd_soc_dai_get_dma_data(dai, substream); | 76 | dma_params = snd_soc_dai_get_dma_data(dai, substream); |
77 | dma_cfg = dma_params->dma_cfg; | 77 | dma_cfg = dma_params->dma_cfg; |
78 | 78 | ||
79 | mem_data_width = STEDMA40_HALFWORD_WIDTH; | 79 | mem_data_width = DMA_SLAVE_BUSWIDTH_2_BYTES; |
80 | 80 | ||
81 | switch (dma_params->data_size) { | 81 | switch (dma_params->data_size) { |
82 | case 32: | 82 | case 32: |
83 | per_data_width = STEDMA40_WORD_WIDTH; | 83 | per_data_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
84 | break; | 84 | break; |
85 | case 16: | 85 | case 16: |
86 | per_data_width = STEDMA40_HALFWORD_WIDTH; | 86 | per_data_width = DMA_SLAVE_BUSWIDTH_2_BYTES; |
87 | break; | 87 | break; |
88 | case 8: | 88 | case 8: |
89 | per_data_width = STEDMA40_BYTE_WIDTH; | 89 | per_data_width = DMA_SLAVE_BUSWIDTH_1_BYTE; |
90 | break; | 90 | break; |
91 | default: | 91 | default: |
92 | per_data_width = STEDMA40_WORD_WIDTH; | 92 | per_data_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
93 | } | 93 | } |
94 | 94 | ||
95 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 95 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |