Commit 83660b73 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull ARM SoC fixes from Kevin Hilman:
 "A collection of ARM SoC fixes for v3.14-rc1.

  Mostly a collection of Kconfig, device tree data and compilation fixes
  along with fix to drivers/phy that fixes a boot regression on some
  Marvell mvebu platforms"

* tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  dma: mv_xor: Silence a bunch of LPAE-related warnings
  ARM: ux500: disable msp2 device tree node
  ARM: zynq: Reserve not DMAable space in front of the kernel
  ARM: multi_v7_defconfig: Select CONFIG_SOC_DRA7XX
  ARM: imx6: Initialize low-power mode early again
  ARM: pxa: fix various compilation problems
  ARM: pxa: fix compilation problem on AM300EPD board
  ARM: at91: add Atmel's SAMA5D3 Xplained board
  spi/atmel: document clock properties
  mmc: atmel-mci: document clock properties
  ARM: at91: enable USB host on at91sam9n12ek board
  ARM: at91/dt: fix sama5d3 ohci hclk clock reference
  ARM: at91/dt: sam9263: fix compatibility string for the I2C
  ata: sata_mv: Fix probe failures with optional phys
  drivers: phy: Add support for optional phys
  drivers: phy: Make NULL a valid phy reference
  ARM: fix HAVE_ARM_TWD selection for OMAP and shmobile
  ARM: moxart: move DMA_OF selection to driver
  ARM: hisi: fix kconfig warning on HAVE_ARM_TWD
parents ca033390 31fd8f5b
...@@ -13,6 +13,9 @@ Required properties: ...@@ -13,6 +13,9 @@ Required properties:
- #address-cells: should be one. The cell is the slot id. - #address-cells: should be one. The cell is the slot id.
- #size-cells: should be zero. - #size-cells: should be zero.
- at least one slot node - at least one slot node
- clock-names: tuple listing input clock names.
Required elements: "mci_clk"
- clocks: phandles to input clocks.
The node contains child nodes for each slot that the platform uses The node contains child nodes for each slot that the platform uses
...@@ -24,6 +27,8 @@ mmc0: mmc@f0008000 { ...@@ -24,6 +27,8 @@ mmc0: mmc@f0008000 {
interrupts = <12 4>; interrupts = <12 4>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clock-names = "mci_clk";
clocks = <&mci0_clk>;
[ child node definitions...] [ child node definitions...]
}; };
......
...@@ -5,6 +5,9 @@ Required properties: ...@@ -5,6 +5,9 @@ Required properties:
- reg: Address and length of the register set for the device - reg: Address and length of the register set for the device
- interrupts: Should contain spi interrupt - interrupts: Should contain spi interrupt
- cs-gpios: chipselects - cs-gpios: chipselects
- clock-names: tuple listing input clock names.
Required elements: "spi_clk"
- clocks: phandles to input clocks.
Example: Example:
...@@ -14,6 +17,8 @@ spi1: spi@fffcc000 { ...@@ -14,6 +17,8 @@ spi1: spi@fffcc000 {
interrupts = <13 4 5>; interrupts = <13 4 5>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&spi1_clk>;
clock-names = "spi_clk";
cs-gpios = <&pioB 3 0>; cs-gpios = <&pioB 3 0>;
status = "okay"; status = "okay";
......
...@@ -75,14 +75,26 @@ Before the controller can make use of the PHY, it has to get a reference to ...@@ -75,14 +75,26 @@ Before the controller can make use of the PHY, it has to get a reference to
it. This framework provides the following APIs to get a reference to the PHY. it. This framework provides the following APIs to get a reference to the PHY.
struct phy *phy_get(struct device *dev, const char *string); struct phy *phy_get(struct device *dev, const char *string);
struct phy *phy_optional_get(struct device *dev, const char *string);
struct phy *devm_phy_get(struct device *dev, const char *string); struct phy *devm_phy_get(struct device *dev, const char *string);
struct phy *devm_phy_optional_get(struct device *dev, const char *string);
phy_get and devm_phy_get can be used to get the PHY. In the case of dt boot,
the string arguments should contain the phy name as given in the dt data and phy_get, phy_optional_get, devm_phy_get and devm_phy_optional_get can
in the case of non-dt boot, it should contain the label of the PHY. be used to get the PHY. In the case of dt boot, the string arguments
The only difference between the two APIs is that devm_phy_get associates the should contain the phy name as given in the dt data and in the case of
device with the PHY using devres on successful PHY get. On driver detach, non-dt boot, it should contain the label of the PHY. The two
release function is invoked on the the devres data and devres data is freed. devm_phy_get associates the device with the PHY using devres on
successful PHY get. On driver detach, release function is invoked on
the the devres data and devres data is freed. phy_optional_get and
devm_phy_optional_get should be used when the phy is optional. These
two functions will never return -ENODEV, but instead returns NULL when
the phy cannot be found.
It should be noted that NULL is a valid phy reference. All phy
consumer calls on the NULL phy become NOPs. That is the release calls,
the phy_init() and phy_exit() calls, and phy_power_on() and
phy_power_off() calls are all NOP when applied to a NULL phy. The NULL
phy is useful in devices for handling optional phy devices.
5. Releasing a reference to the PHY 5. Releasing a reference to the PHY
......
...@@ -38,6 +38,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91sam9g35ek.dtb ...@@ -38,6 +38,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91sam9g35ek.dtb
dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb
dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb
# sama5d3 # sama5d3
dtb-$(CONFIG_ARCH_AT91) += at91-sama5d3_xplained.dtb
dtb-$(CONFIG_ARCH_AT91) += sama5d31ek.dtb dtb-$(CONFIG_ARCH_AT91) += sama5d31ek.dtb
dtb-$(CONFIG_ARCH_AT91) += sama5d33ek.dtb dtb-$(CONFIG_ARCH_AT91) += sama5d33ek.dtb
dtb-$(CONFIG_ARCH_AT91) += sama5d34ek.dtb dtb-$(CONFIG_ARCH_AT91) += sama5d34ek.dtb
......
/*
* at91-sama5d3_xplained.dts - Device Tree file for the SAMA5D3 Xplained board
*
* Copyright (C) 2014 Atmel,
* 2014 Nicolas Ferre <nicolas.ferre@atmel.com>
*
* Licensed under GPLv2 or later.
*/
/dts-v1/;
#include "sama5d36.dtsi"
/ {
model = "SAMA5D3 Xplained";
compatible = "atmel,sama5d3-xplained", "atmel,sama5d3", "atmel,sama5";
chosen {
bootargs = "console=ttyS0,115200";
};
memory {
reg = <0x20000000 0x10000000>;
};
ahb {
apb {
mmc0: mmc@f0000000 {
pinctrl-0 = <&pinctrl_mmc0_clk_cmd_dat0 &pinctrl_mmc0_dat1_3 &pinctrl_mmc0_dat4_7 &pinctrl_mmc0_cd>;
status = "okay";
slot@0 {
reg = <0>;
bus-width = <8>;
cd-gpios = <&pioE 0 GPIO_ACTIVE_LOW>;
};
};
spi0: spi@f0004000 {
cs-gpios = <&pioD 13 0>;
status = "okay";
};
can0: can@f000c000 {
status = "okay";
};
i2c0: i2c@f0014000 {
status = "okay";
};
i2c1: i2c@f0018000 {
status = "okay";
};
macb0: ethernet@f0028000 {
phy-mode = "rgmii";
status = "okay";
};
usart0: serial@f001c000 {
status = "okay";
};
usart1: serial@f0020000 {
pinctrl-0 = <&pinctrl_usart1 &pinctrl_usart1_rts_cts>;
status = "okay";
};
uart0: serial@f0024000 {
status = "okay";
};
mmc1: mmc@f8000000 {
pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3 &pinctrl_mmc1_cd>;
status = "okay";
slot@0 {
reg = <0>;
bus-width = <4>;
cd-gpios = <&pioE 1 GPIO_ACTIVE_HIGH>;
};
};
spi1: spi@f8008000 {
cs-gpios = <&pioC 25 0>, <0>, <0>, <&pioD 16 0>;
status = "okay";
};
adc0: adc@f8018000 {
pinctrl-0 = <
&pinctrl_adc0_adtrg
&pinctrl_adc0_ad0
&pinctrl_adc0_ad1
&pinctrl_adc0_ad2
&pinctrl_adc0_ad3
&pinctrl_adc0_ad4
&pinctrl_adc0_ad5
&pinctrl_adc0_ad6
&pinctrl_adc0_ad7
&pinctrl_adc0_ad8
&pinctrl_adc0_ad9
>;
status = "okay";
};
i2c2: i2c@f801c000 {
dmas = <0>, <0>; /* Do not use DMA for i2c2 */
status = "okay";
};
macb1: ethernet@f802c000 {
phy-mode = "rmii";
status = "okay";
};
dbgu: serial@ffffee00 {
status = "okay";
};
pinctrl@fffff200 {
board {
pinctrl_mmc0_cd: mmc0_cd {
atmel,pins =
<AT91_PIOE 0 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
};
pinctrl_mmc1_cd: mmc1_cd {
atmel,pins =
<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
};
pinctrl_usba_vbus: usba_vbus {
atmel,pins =
<AT91_PIOE 9 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>; /* PE9, conflicts with A9 */
};
};
};
pmc: pmc@fffffc00 {
main: mainck {
clock-frequency = <12000000>;
};
};
};
nand0: nand@60000000 {
nand-bus-width = <8>;
nand-ecc-mode = "hw";
atmel,has-pmecc;
atmel,pmecc-cap = <4>;
atmel,pmecc-sector-size = <512>;
nand-on-flash-bbt;
status = "okay";
at91bootstrap@0 {
label = "at91bootstrap";
reg = <0x0 0x40000>;
};
bootloader@40000 {
label = "bootloader";
reg = <0x40000 0x80000>;
};
bootloaderenv@c0000 {
label = "bootloader env";
reg = <0xc0000 0xc0000>;
};
dtb@180000 {
label = "device tree";
reg = <0x180000 0x80000>;
};
kernel@200000 {
label = "kernel";
reg = <0x200000 0x600000>;
};
rootfs@800000 {
label = "rootfs";
reg = <0x800000 0x0f800000>;
};
};
usb0: gadget@00500000 {
atmel,vbus-gpio = <&pioE 9 GPIO_ACTIVE_HIGH>; /* PE9, conflicts with A9 */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usba_vbus>;
status = "okay";
};
usb1: ohci@00600000 {
num-ports = <3>;
atmel,vbus-gpio = <0
&pioE 3 GPIO_ACTIVE_LOW
&pioE 4 GPIO_ACTIVE_LOW
>;
status = "okay";
};
usb2: ehci@00700000 {
status = "okay";
};
};
gpio_keys {
compatible = "gpio-keys";
bp3 {
label = "PB_USER";
gpios = <&pioE 29 GPIO_ACTIVE_LOW>;
linux,code = <0x104>;
gpio-key,wakeup;
};
};
leds {
compatible = "gpio-leds";
d2 {
label = "d2";
gpios = <&pioE 23 GPIO_ACTIVE_LOW>; /* PE23, conflicts with A23, CTS2 */
linux,default-trigger = "heartbeat";
};
d3 {
label = "d3";
gpios = <&pioE 24 GPIO_ACTIVE_HIGH>;
};
};
};
...@@ -523,7 +523,7 @@ usb1: gadget@fff78000 { ...@@ -523,7 +523,7 @@ usb1: gadget@fff78000 {
}; };
i2c0: i2c@fff88000 { i2c0: i2c@fff88000 {
compatible = "atmel,at91sam9263-i2c"; compatible = "atmel,at91sam9260-i2c";
reg = <0xfff88000 0x100>; reg = <0xfff88000 0x100>;
interrupts = <13 IRQ_TYPE_LEVEL_HIGH 6>; interrupts = <13 IRQ_TYPE_LEVEL_HIGH 6>;
#address-cells = <1>; #address-cells = <1>;
......
...@@ -124,6 +124,10 @@ nand0: nand@40000000 { ...@@ -124,6 +124,10 @@ nand0: nand@40000000 {
nand-on-flash-bbt; nand-on-flash-bbt;
status = "okay"; status = "okay";
}; };
usb0: ohci@00500000 {
status = "okay";
};
}; };
leds { leds {
......
...@@ -1228,7 +1228,7 @@ usb1: ohci@00600000 { ...@@ -1228,7 +1228,7 @@ usb1: ohci@00600000 {
compatible = "atmel,at91rm9200-ohci", "usb-ohci"; compatible = "atmel,at91rm9200-ohci", "usb-ohci";
reg = <0x00600000 0x100000>; reg = <0x00600000 0x100000>;
interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>; interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>;
clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>, clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>,
<&uhpck>; <&uhpck>;
clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
status = "disabled"; status = "disabled";
......
...@@ -188,7 +188,6 @@ msp1: msp@80124000 { ...@@ -188,7 +188,6 @@ msp1: msp@80124000 {
msp2: msp@80117000 { msp2: msp@80117000 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&msp2_default_mode>; pinctrl-0 = <&msp2_default_mode>;
status = "okay";
}; };
msp3: msp@80125000 { msp3: msp@80125000 {
......
...@@ -29,6 +29,7 @@ CONFIG_ARCH_OMAP3=y ...@@ -29,6 +29,7 @@ CONFIG_ARCH_OMAP3=y
CONFIG_ARCH_OMAP4=y CONFIG_ARCH_OMAP4=y
CONFIG_SOC_OMAP5=y CONFIG_SOC_OMAP5=y
CONFIG_SOC_AM33XX=y CONFIG_SOC_AM33XX=y
CONFIG_SOC_DRA7XX=y
CONFIG_SOC_AM43XX=y CONFIG_SOC_AM43XX=y
CONFIG_ARCH_ROCKCHIP=y CONFIG_ARCH_ROCKCHIP=y
CONFIG_ARCH_SOCFPGA=y CONFIG_ARCH_SOCFPGA=y
......
...@@ -8,7 +8,7 @@ config ARCH_HI3xxx ...@@ -8,7 +8,7 @@ config ARCH_HI3xxx
select CLKSRC_OF select CLKSRC_OF
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_ARM_SCU select HAVE_ARM_SCU
select HAVE_ARM_TWD select HAVE_ARM_TWD if SMP
select HAVE_SMP select HAVE_SMP
select PINCTRL select PINCTRL
select PINCTRL_SINGLE select PINCTRL_SINGLE
......
...@@ -482,6 +482,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) ...@@ -482,6 +482,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
if (IS_ENABLED(CONFIG_PCI_IMX6)) if (IS_ENABLED(CONFIG_PCI_IMX6))
clk_set_parent(clk[lvds1_sel], clk[sata_ref]); clk_set_parent(clk[lvds1_sel], clk[sata_ref]);
/* Set initial power mode */
imx6q_set_lpm(WAIT_CLOCKED);
np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"); np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt");
base = of_iomap(np, 0); base = of_iomap(np, 0);
WARN_ON(!base); WARN_ON(!base);
......
...@@ -266,6 +266,9 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node) ...@@ -266,6 +266,9 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
/* Audio-related clocks configuration */ /* Audio-related clocks configuration */
clk_set_parent(clks[IMX6SL_CLK_SPDIF0_SEL], clks[IMX6SL_CLK_PLL3_PFD3]); clk_set_parent(clks[IMX6SL_CLK_SPDIF0_SEL], clks[IMX6SL_CLK_PLL3_PFD3]);
/* Set initial power mode */
imx6q_set_lpm(WAIT_CLOCKED);
np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt"); np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt");
base = of_iomap(np, 0); base = of_iomap(np, 0);
WARN_ON(!base); WARN_ON(!base);
......
...@@ -236,8 +236,6 @@ void __init imx6q_pm_init(void) ...@@ -236,8 +236,6 @@ void __init imx6q_pm_init(void)
regmap_update_bits(gpr, IOMUXC_GPR1, IMX6Q_GPR1_GINT, regmap_update_bits(gpr, IOMUXC_GPR1, IMX6Q_GPR1_GINT,
IMX6Q_GPR1_GINT); IMX6Q_GPR1_GINT);
/* Set initial power mode */
imx6q_set_lpm(WAIT_CLOCKED);
suspend_set_ops(&imx6q_pm_ops); suspend_set_ops(&imx6q_pm_ops);
} }
...@@ -2,7 +2,6 @@ config ARCH_MOXART ...@@ -2,7 +2,6 @@ config ARCH_MOXART
bool "MOXA ART SoC" if ARCH_MULTI_V4T bool "MOXA ART SoC" if ARCH_MULTI_V4T
select CPU_FA526 select CPU_FA526
select ARM_DMA_MEM_BUFFERABLE select ARM_DMA_MEM_BUFFERABLE
select DMA_OF
select USE_OF select USE_OF
select CLKSRC_OF select CLKSRC_OF
select CLKSRC_MMIO select CLKSRC_MMIO
......
...@@ -54,7 +54,7 @@ config SOC_OMAP5 ...@@ -54,7 +54,7 @@ config SOC_OMAP5
select ARM_GIC select ARM_GIC
select CPU_V7 select CPU_V7
select HAVE_ARM_SCU if SMP select HAVE_ARM_SCU if SMP
select HAVE_ARM_TWD if LOCAL_TIMERS select HAVE_ARM_TWD if SMP
select HAVE_SMP select HAVE_SMP
select HAVE_ARM_ARCH_TIMER select HAVE_ARM_ARCH_TIMER
select ARM_ERRATA_798181 if SMP select ARM_ERRATA_798181 if SMP
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <mach/gumstix.h> #include <mach/gumstix.h>
#include <mach/mfp-pxa25x.h> #include <mach/mfp-pxa25x.h>
#include <mach/irqs.h>
#include <linux/platform_data/video-pxafb.h> #include <linux/platform_data/video-pxafb.h>
#include "generic.h" #include "generic.h"
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#ifndef ASM_ARCH_BALLOON3_H #ifndef ASM_ARCH_BALLOON3_H
#define ASM_ARCH_BALLOON3_H #define ASM_ARCH_BALLOON3_H
#include "irqs.h" /* PXA_NR_BUILTIN_GPIO */
enum balloon3_features { enum balloon3_features {
BALLOON3_FEATURE_OHCI, BALLOON3_FEATURE_OHCI,
BALLOON3_FEATURE_MMC, BALLOON3_FEATURE_MMC,
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#ifndef __ASM_ARCH_CORGI_H #ifndef __ASM_ARCH_CORGI_H
#define __ASM_ARCH_CORGI_H 1 #define __ASM_ARCH_CORGI_H 1
#include "irqs.h" /* PXA_NR_BUILTIN_GPIO */
/* /*
* Corgi (Non Standard) GPIO Definitions * Corgi (Non Standard) GPIO Definitions
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#ifndef CSB726_H #ifndef CSB726_H
#define CSB726_H #define CSB726_H
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
#define CSB726_GPIO_IRQ_LAN 52 #define CSB726_GPIO_IRQ_LAN 52
#define CSB726_GPIO_IRQ_SM501 53 #define CSB726_GPIO_IRQ_SM501 53
#define CSB726_GPIO_MMC_DETECT 100 #define CSB726_GPIO_MMC_DETECT 100
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/* BTRESET - Reset line to Bluetooth module, active low signal. */ /* BTRESET - Reset line to Bluetooth module, active low signal. */
#define GPIO_GUMSTIX_BTRESET 7 #define GPIO_GUMSTIX_BTRESET 7
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* IDP hardware. * IDP hardware.
*/ */
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
#define IDP_FLASH_PHYS (PXA_CS0_PHYS) #define IDP_FLASH_PHYS (PXA_CS0_PHYS)
#define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS) #define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS)
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#ifndef _INCLUDE_PALMLD_H_ #ifndef _INCLUDE_PALMLD_H_
#define _INCLUDE_PALMLD_H_ #define _INCLUDE_PALMLD_H_
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/** HERE ARE GPIOs **/ /** HERE ARE GPIOs **/
/* GPIOs */ /* GPIOs */
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#ifndef _INCLUDE_PALMT5_H_ #ifndef _INCLUDE_PALMT5_H_
#define _INCLUDE_PALMT5_H_ #define _INCLUDE_PALMT5_H_
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/** HERE ARE GPIOs **/ /** HERE ARE GPIOs **/
/* GPIOs */ /* GPIOs */
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#ifndef _INCLUDE_PALMTC_H_ #ifndef _INCLUDE_PALMTC_H_
#define _INCLUDE_PALMTC_H_ #define _INCLUDE_PALMTC_H_
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/** HERE ARE GPIOs **/ /** HERE ARE GPIOs **/
/* GPIOs */ /* GPIOs */
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#ifndef _INCLUDE_PALMTX_H_ #ifndef _INCLUDE_PALMTX_H_
#define _INCLUDE_PALMTX_H_ #define _INCLUDE_PALMTX_H_
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/** HERE ARE GPIOs **/ /** HERE ARE GPIOs **/
/* GPIOs */ /* GPIOs */
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
* Definitions of CPU card resources only * Definitions of CPU card resources only
*/ */
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/* phyCORE-PXA270 (PCM027) Interrupts */ /* phyCORE-PXA270 (PCM027) Interrupts */
#define PCM027_IRQ(x) (IRQ_BOARD_START + (x)) #define PCM027_IRQ(x) (IRQ_BOARD_START + (x))
#define PCM027_BTDET_IRQ PCM027_IRQ(0) #define PCM027_BTDET_IRQ PCM027_IRQ(0)
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
*/ */
#include <mach/pcm027.h> #include <mach/pcm027.h>
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/* /*
* definitions relevant only when the PCM-990 * definitions relevant only when the PCM-990
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#ifndef __ASM_ARCH_POODLE_H #ifndef __ASM_ARCH_POODLE_H
#define __ASM_ARCH_POODLE_H 1 #define __ASM_ARCH_POODLE_H 1
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/* /*
* GPIOs * GPIOs
*/ */
......
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
#define __ASM_ARCH_SPITZ_H 1 #define __ASM_ARCH_SPITZ_H 1
#endif #endif
#include "irqs.h" /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/gpio.h>
/* Spitz/Akita GPIOs */ /* Spitz/Akita GPIOs */
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#ifndef _ASM_ARCH_TOSA_H_ #ifndef _ASM_ARCH_TOSA_H_
#define _ASM_ARCH_TOSA_H_ 1 #define _ASM_ARCH_TOSA_H_ 1
#include "irqs.h" /* PXA_NR_BUILTIN_GPIO */
/* TOSA Chip selects */ /* TOSA Chip selects */
#define TOSA_LCDC_PHYS PXA_CS4_PHYS #define TOSA_LCDC_PHYS PXA_CS4_PHYS
/* Internel Scoop */ /* Internel Scoop */
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#ifndef _TRIPEPS4_H_ #ifndef _TRIPEPS4_H_
#define _TRIPEPS4_H_ #define _TRIPEPS4_H_
#include "irqs.h" /* PXA_GPIO_TO_IRQ */
/* physical memory regions */ /* physical memory regions */
#define TRIZEPS4_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */ #define TRIZEPS4_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */
#define TRIZEPS4_DISK_PHYS (PXA_CS1_PHYS) /* Disk On Chip region */ #define TRIZEPS4_DISK_PHYS (PXA_CS1_PHYS) /* Disk On Chip region */
......
...@@ -8,7 +8,7 @@ config ARCH_SHMOBILE_MULTI ...@@ -8,7 +8,7 @@ config ARCH_SHMOBILE_MULTI
select CPU_V7 select CPU_V7
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_ARM_SCU if SMP select HAVE_ARM_SCU if SMP
select HAVE_ARM_TWD if LOCAL_TIMERS select HAVE_ARM_TWD if SMP
select HAVE_SMP select HAVE_SMP
select ARM_GIC select ARM_GIC
select MIGHT_HAVE_CACHE_L2X0 select MIGHT_HAVE_CACHE_L2X0
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/memblock.h>
#include <linux/irqchip.h> #include <linux/irqchip.h>
#include <linux/irqchip/arm-gic.h> #include <linux/irqchip/arm-gic.h>
...@@ -41,6 +42,18 @@ ...@@ -41,6 +42,18 @@
void __iomem *zynq_scu_base; void __iomem *zynq_scu_base;
/**
* zynq_memory_init - Initialize special memory
*
* We need to stop things allocating the low memory as DMA can't work in
* the 1st 512K of memory.
*/
static void __init zynq_memory_init(void)
{
if (!__pa(PAGE_OFFSET))
memblock_reserve(__pa(PAGE_OFFSET), __pa(swapper_pg_dir));
}
static struct platform_device zynq_cpuidle_device = { static struct platform_device zynq_cpuidle_device = {
.name = "cpuidle-zynq", .name = "cpuidle-zynq",
}; };
...@@ -117,5 +130,6 @@ DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") ...@@ -117,5 +130,6 @@ DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
.init_machine = zynq_init_machine, .init_machine = zynq_init_machine,
.init_time = zynq_timer_init, .init_time = zynq_timer_init,
.dt_compat = zynq_dt_match, .dt_compat = zynq_dt_match,
.reserve = zynq_memory_init,
.restart = zynq_system_reset, .restart = zynq_system_reset,
MACHINE_END MACHINE_END
...@@ -4126,12 +4126,14 @@ static int mv_platform_probe(struct platform_device *pdev) ...@@ -4126,12 +4126,14 @@ static int mv_platform_probe(struct platform_device *pdev)
clk_prepare_enable(hpriv->port_clks[port]); clk_prepare_enable(hpriv->port_clks[port]);
sprintf(port_number, "port%d", port); sprintf(port_number, "port%d", port);
hpriv->port_phys[port] = devm_phy_get(&pdev->dev, port_number); hpriv->port_phys[port] = devm_phy_optional_get(&pdev->dev,
port_number);
if (IS_ERR(hpriv->port_phys[port])) { if (IS_ERR(hpriv->port_phys[port])) {
rc = PTR_ERR(hpriv->port_phys[port]); rc = PTR_ERR(hpriv->port_phys[port]);
hpriv->port_phys[port] = NULL; hpriv->port_phys[port] = NULL;
if ((rc != -EPROBE_DEFER) && (rc != -ENODEV)) if (rc != -EPROBE_DEFER)
dev_warn(&pdev->dev, "error getting phy"); dev_warn(&pdev->dev, "error getting phy %d",
rc);
goto err; goto err;
} else } else
phy_power_on(hpriv->port_phys[port]); phy_power_on(hpriv->port_phys[port]);
......
...@@ -346,6 +346,7 @@ config MOXART_DMA ...@@ -346,6 +346,7 @@ config MOXART_DMA
tristate "MOXART DMA support" tristate "MOXART DMA support"
depends on ARCH_MOXART depends on ARCH_MOXART
select DMA_ENGINE select DMA_ENGINE
select DMA_OF
select DMA_VIRTUAL_CHANNELS select DMA_VIRTUAL_CHANNELS
help help
Enable support for the MOXA ART SoC DMA controller. Enable support for the MOXA ART SoC DMA controller.
......
...@@ -497,8 +497,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx) ...@@ -497,8 +497,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
if (!mv_can_chain(grp_start)) if (!mv_can_chain(grp_start))
goto submit_done; goto submit_done;
dev_dbg(mv_chan_to_devp(mv_chan), "Append to last desc %x\n", dev_dbg(mv_chan_to_devp(mv_chan), "Append to last desc %pa\n",
old_chain_tail->async_tx.phys); &old_chain_tail->async_tx.phys);
/* fix up the hardware chain */ /* fix up the hardware chain */
mv_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys); mv_desc_set_next_desc(old_chain_tail, grp_start->async_tx.phys);
...@@ -527,7 +527,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx) ...@@ -527,7 +527,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
/* returns the number of allocated descriptors */ /* returns the number of allocated descriptors */
static int mv_xor_alloc_chan_resources(struct dma_chan *chan) static int mv_xor_alloc_chan_resources(struct dma_chan *chan)
{ {
char *hw_desc; void *virt_desc;
dma_addr_t dma_desc;
int idx; int idx;
struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan); struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
struct mv_xor_desc_slot *slot = NULL; struct mv_xor_desc_slot *slot = NULL;
...@@ -542,17 +543,16 @@ static int mv_xor_alloc_chan_resources(struct dma_chan *chan) ...@@ -542,17 +543,16 @@ static int mv_xor_alloc_chan_resources(struct dma_chan *chan)
" %d descriptor slots", idx); " %d descriptor slots", idx);
break; break;
} }
hw_desc = (char *) mv_chan->dma_desc_pool_virt; virt_desc = mv_chan->dma_desc_pool_virt;
slot->hw_desc = (void *) &hw_desc[idx * MV_XOR_SLOT_SIZE]; slot->hw_desc = virt_desc + idx * MV_XOR_SLOT_SIZE;
dma_async_tx_descriptor_init(&slot->async_tx, chan); dma_async_tx_descriptor_init(&slot->async_tx, chan);
slot->async_tx.tx_submit = mv_xor_tx_submit; slot->async_tx.tx_submit = mv_xor_tx_submit;
INIT_LIST_HEAD(&slot->chain_node); INIT_LIST_HEAD(&slot->chain_node);
INIT_LIST_HEAD(&slot->slot_node); INIT_LIST_HEAD(&slot->slot_node);
INIT_LIST_HEAD(&slot->tx_list); INIT_LIST_HEAD(&slot->tx_list);
hw_desc = (char *) mv_chan->dma_desc_pool; dma_desc = mv_chan->dma_desc_pool;
slot->async_tx.phys = slot->async_tx.phys = dma_desc + idx * MV_XOR_SLOT_SIZE;
(dma_addr_t) &hw_desc[idx * MV_XOR_SLOT_SIZE];
slot->idx = idx++; slot->idx = idx++;
spin_lock_bh(&mv_chan->lock); spin_lock_bh(&mv_chan->lock);
...@@ -582,8 +582,8 @@ mv_xor_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, ...@@ -582,8 +582,8 @@ mv_xor_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
int slot_cnt; int slot_cnt;
dev_dbg(mv_chan_to_devp(mv_chan), dev_dbg(mv_chan_to_devp(mv_chan),
"%s dest: %x src %x len: %u flags: %ld\n", "%s dest: %pad src %pad len: %u flags: %ld\n",
__func__, dest, src, len, flags); __func__, &dest, &src, len, flags);
if (unlikely(len < MV_XOR_MIN_BYTE_COUNT)) if (unlikely(len < MV_XOR_MIN_BYTE_COUNT))
return NULL; return NULL;
...@@ -626,8 +626,8 @@ mv_xor_prep_dma_xor(struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src, ...@@ -626,8 +626,8 @@ mv_xor_prep_dma_xor(struct dma_chan *chan, dma_addr_t dest, dma_addr_t *src,
BUG_ON(len > MV_XOR_MAX_BYTE_COUNT); BUG_ON(len > MV_XOR_MAX_BYTE_COUNT);
dev_dbg(mv_chan_to_devp(mv_chan), dev_dbg(mv_chan_to_devp(mv_chan),
"%s src_cnt: %d len: dest %x %u flags: %ld\n", "%s src_cnt: %d len: %u dest %pad flags: %ld\n",
__func__, src_cnt, len, dest, flags); __func__, src_cnt, len, &dest, flags);
spin_lock_bh(&mv_chan->lock); spin_lock_bh(&mv_chan->lock);
slot_cnt = mv_chan_xor_slot_count(len, src_cnt); slot_cnt = mv_chan_xor_slot_count(len, src_cnt);
......
...@@ -162,6 +162,9 @@ int phy_init(struct phy *phy) ...@@ -162,6 +162,9 @@ int phy_init(struct phy *phy)
{ {
int ret; int ret;
if (!phy)
return 0;
ret = phy_pm_runtime_get_sync(phy); ret = phy_pm_runtime_get_sync(phy);
if (ret < 0 && ret != -ENOTSUPP) if (ret < 0 && ret != -ENOTSUPP)
return ret; return ret;
...@@ -187,6 +190,9 @@ int phy_exit(struct phy *phy) ...@@ -187,6 +190,9 @@ int phy_exit(struct phy *phy)
{ {
int ret; int ret;
if (!phy)
return 0;
ret = phy_pm_runtime_get_sync(phy); ret = phy_pm_runtime_get_sync(phy);
if (ret < 0 && ret != -ENOTSUPP) if (ret < 0 && ret != -ENOTSUPP)
return ret; return ret;
...@@ -212,6 +218,9 @@ int phy_power_on(struct phy *phy) ...@@ -212,6 +218,9 @@ int phy_power_on(struct phy *phy)
{ {
int ret; int ret;
if (!phy)
return 0;
ret = phy_pm_runtime_get_sync(phy); ret = phy_pm_runtime_get_sync(phy);
if (ret < 0 && ret != -ENOTSUPP) if (ret < 0 && ret != -ENOTSUPP)
return ret; return ret;
...@@ -240,6 +249,9 @@ int phy_power_off(struct phy *phy) ...@@ -240,6 +249,9 @@ int phy_power_off(struct phy *phy)
{ {
int ret; int ret;
if (!phy)
return 0;
mutex_lock(&phy->mutex); mutex_lock(&phy->mutex);
if (phy->power_count == 1 && phy->ops->power_off) { if (phy->power_count == 1 && phy->ops->power_off) {
ret = phy->ops->power_off(phy); ret = phy->ops->power_off(phy);
...@@ -308,7 +320,7 @@ static struct phy *of_phy_get(struct device *dev, int index) ...@@ -308,7 +320,7 @@ static struct phy *of_phy_get(struct device *dev, int index)
*/ */
void phy_put(struct phy *phy) void phy_put(struct phy *phy)
{ {
if (IS_ERR(phy)) if (!phy || IS_ERR(phy))
return; return;
module_put(phy->ops->owner); module_put(phy->ops->owner);
...@@ -328,6 +340,9 @@ void devm_phy_put(struct device *dev, struct phy *phy) ...@@ -328,6 +340,9 @@ void devm_phy_put(struct device *dev, struct phy *phy)
{ {
int r; int r;
if (!phy)
return;
r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy); r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy);
dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n"); dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
} }
...@@ -410,6 +425,27 @@ struct phy *phy_get(struct device *dev, const char *string) ...@@ -410,6 +425,27 @@ struct phy *phy_get(struct device *dev, const char *string)
} }
EXPORT_SYMBOL_GPL(phy_get); EXPORT_SYMBOL_GPL(phy_get);
/**
* phy_optional_get() - lookup and obtain a reference to an optional phy.
* @dev: device that requests this phy
* @string: the phy name as given in the dt data or the name of the controller
* port for non-dt case
*
* Returns the phy driver, after getting a refcount to it; or
* NULL if there is no such phy. The caller is responsible for
* calling phy_put() to release that count.
*/
struct phy *phy_optional_get(struct device *dev, const char *string)
{
struct phy *phy = phy_get(dev, string);
if (PTR_ERR(phy) == -ENODEV)
phy = NULL;
return phy;
}
EXPORT_SYMBOL_GPL(phy_optional_get);
/** /**
* devm_phy_get() - lookup and obtain a reference to a phy. * devm_phy_get() - lookup and obtain a reference to a phy.
* @dev: device that requests this phy * @dev: device that requests this phy
...@@ -440,6 +476,30 @@ struct phy *devm_phy_get(struct device *dev, const char *string) ...@@ -440,6 +476,30 @@ struct phy *devm_phy_get(struct device *dev, const char *string)
} }
EXPORT_SYMBOL_GPL(devm_phy_get); EXPORT_SYMBOL_GPL(devm_phy_get);
/**
* devm_phy_optional_get() - lookup and obtain a reference to an optional phy.
* @dev: device that requests this phy
* @string: the phy name as given in the dt data or phy device name
* for non-dt case
*
* Gets the phy using phy_get(), and associates a device with it using
* devres. On driver detach, release function is invoked on the devres
* data, then, devres data is freed. This differs to devm_phy_get() in
* that if the phy does not exist, it is not considered an error and
* -ENODEV will not be returned. Instead the NULL phy is returned,
* which can be passed to all other phy consumer calls.
*/
struct phy *devm_phy_optional_get(struct device *dev, const char *string)
{
struct phy *phy = devm_phy_get(dev, string);
if (PTR_ERR(phy) == -ENODEV)
phy = NULL;
return phy;
}
EXPORT_SYMBOL_GPL(devm_phy_optional_get);
/** /**
* phy_create() - create a new phy * phy_create() - create a new phy
* @dev: device that is creating the new phy * @dev: device that is creating the new phy
......
...@@ -146,7 +146,9 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width) ...@@ -146,7 +146,9 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width)
phy->attrs.bus_width = bus_width; phy->attrs.bus_width = bus_width;
} }
struct phy *phy_get(struct device *dev, const char *string); struct phy *phy_get(struct device *dev, const char *string);
struct phy *phy_optional_get(struct device *dev, const char *string);
struct phy *devm_phy_get(struct device *dev, const char *string); struct phy *devm_phy_get(struct device *dev, const char *string);
struct phy *devm_phy_optional_get(struct device *dev, const char *string);
void phy_put(struct phy *phy); void phy_put(struct phy *phy);
void devm_phy_put(struct device *dev, struct phy *phy); void devm_phy_put(struct device *dev, struct phy *phy);
struct phy *of_phy_simple_xlate(struct device *dev, struct phy *of_phy_simple_xlate(struct device *dev,
...@@ -232,11 +234,23 @@ static inline struct phy *phy_get(struct device *dev, const char *string) ...@@ -232,11 +234,23 @@ static inline struct phy *phy_get(struct device *dev, const char *string)
return ERR_PTR(-ENOSYS); return ERR_PTR(-ENOSYS);
} }
static inline struct phy *phy_optional_get(struct device *dev,
const char *string)
{
return ERR_PTR(-ENOSYS);
}
static inline struct phy *devm_phy_get(struct device *dev, const char *string) static inline struct phy *devm_phy_get(struct device *dev, const char *string)
{ {
return ERR_PTR(-ENOSYS); return ERR_PTR(-ENOSYS);
} }
static inline struct phy *devm_phy_optional_get(struct device *dev,
const char *string)
{
return ERR_PTR(-ENOSYS);
}
static inline void phy_put(struct phy *phy) static inline void phy_put(struct phy *phy)
{ {
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment