ARM: SoC fixes for 3.10-rc
We didn't have any fixes sent up for -rc2, so this is a slightly larger batch. A bit all over the place platform-wise; OMAP, at91, marvell, renesas, sunxi, ux500, etc. I tried to summarize highlights but there isn't a whole lot to point out. Lots of little things fixed all over. A couple of defconfig updates due to new/changing options. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJRn+66AAoJEIwa5zzehBx3f/4P/3sqK2z7u5SSa+tpkKYkxezO MykUOpUc4tuwrKiuUEeXPh89pjIrclQVzKYDqdaXIcezKB7IXFfQSyLNxDzGM7Y3 NrqrURvNpDmUi6F/xP89gXWkbvg2zr563mxSMpkF4G8HTYxvCv7sY0W/PDzb48Qg q3Efc/AfQsOGM0Zl8WXX9jZBdCNTquZYWd7YEFxCe9oVRGfmNlIYKirPOLnk9MAZ iIrbfFQG+cOos0NKrjM+tbtQNnPUBQeZdy3MvR7DtXCpKNdxs5EJL9EyHHqGGzPk Jd1CG3hNrPiuKVhmVSDkELNDYNT7J9+/rya1Mc33pwMrReAIKWUU/sitvsOkKypi PnTvlJkUv3UM2fOtoF8mOhQLTGdKSWfaF0BfHNmnCqJFDPs8vuQjx7O1WGKKUdC4 SbYZetUnL3AoMrEbza5EoMyqQwpTXiALWp4/6MunLhNyXo0OQvsqexvT6QIrhKyQ 0iExuSSbXDZAw2GXsqzOlCJecxHYG4qkGbf1DmeTW31GRQQ3nhpiu0GVAvHIEAhT SJGD57P0gbEXMpnSIKLNKIAYlLdFkGx6AhX1/Xb+AL7Jsod+UEwgz2ya4GMI4JI/ 0lUe8fPglU3ws8Up1y5FcIq4gjXTsvsEy317zeW/oq2vac0ACKBika2EVukdMD/5 SYr+m40EzQtVdTKuaZ+e =8tMi -----END PGP SIGNATURE----- Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc Pull ARM SoC fixes from Olof Johansson: "We didn't have any fixes sent up for -rc2, so this is a slightly larger batch. A bit all over the place platform-wise; OMAP, at91, marvell, renesas, sunxi, ux500, etc. I tried to summarize highlights but there isn't a whole lot to point out. Lots of little things fixed all over. A couple of defconfig updates due to new/changing options." * tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (44 commits) ARM: at91/sama5: fix incorrect PMC pcr div definition ARM: at91/dt: fix macb pinctrl_macb_rmii_mii_alt definition ARM: at91: at91sam9n12: move external irq declatation to DT ARM: shmobile: marzen: Use error values in usb_power_* ARM: tegra: defconfig fixes ARM: nomadik: fix IRQ assignment for SMC ethernet ARM: vt8500: Add missing NULL terminator in dt_compat clk: tegra: add ac97 controller clock clk: tegra: remove USB from clk init table ARM: dts: mvebu: Fix wrong the address reg value for the L2-cache node ARM: plat-orion: Fix num_resources and id for ge10 and ge11 ARM: OMAP2+: hwmod: Remove sysc slave idle and auto idle apis SERIAL: OMAP: Remove the slave idle handling from the driver ARM: OMAP2+: serial: Remove the un-used slave idle hooks ARM: OMAP2+: hwmod-data: UART IP needs software control to manage sidle modes ARM: OMAP2+: hwmod: Add a new flag to handle SIDLE in SWSUP only in active ARM: OMAP2+: hwmod: Fix sidle programming in _enable_sysc()/_idle_sysc() arm: mvebu: fix the 'ranges' property to handle PCIe ARM: mvebu: select ARCH_REQUIRE_GPIOLIB for mvebu platform ARM: AM33XX: Add missing .clkdm_name to clkdiv32k_ick clock ...
This commit is contained in:
commit
00cec111ac
|
@ -4,7 +4,7 @@ Required properties:
|
||||||
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
|
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
|
||||||
Use "cdns,at91sam9260-macb" Atmel at91sam9260 and at91sam9263 SoCs.
|
Use "cdns,at91sam9260-macb" Atmel at91sam9260 and at91sam9263 SoCs.
|
||||||
Use "cdns,at32ap7000-macb" for other 10/100 usage or use the generic form: "cdns,macb".
|
Use "cdns,at32ap7000-macb" for other 10/100 usage or use the generic form: "cdns,macb".
|
||||||
Use "cnds,pc302-gem" for Picochip picoXcell pc302 and later devices based on
|
Use "cdns,pc302-gem" for Picochip picoXcell pc302 and later devices based on
|
||||||
the Cadence GEM, or the generic form: "cdns,gem".
|
the Cadence GEM, or the generic form: "cdns,gem".
|
||||||
- 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 macb interrupt
|
- interrupts: Should contain macb interrupt
|
||||||
|
|
|
@ -177,7 +177,9 @@ dtb-$(CONFIG_ARCH_SPEAR3XX)+= spear300-evb.dtb \
|
||||||
spear320-evb.dtb \
|
spear320-evb.dtb \
|
||||||
spear320-hmi.dtb
|
spear320-hmi.dtb
|
||||||
dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb
|
dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb
|
||||||
dtb-$(CONFIG_ARCH_SUNXI) += sun4i-a10-cubieboard.dtb \
|
dtb-$(CONFIG_ARCH_SUNXI) += \
|
||||||
|
sun4i-a10-cubieboard.dtb \
|
||||||
|
sun4i-a10-mini-xplus.dtb \
|
||||||
sun4i-a10-hackberry.dtb \
|
sun4i-a10-hackberry.dtb \
|
||||||
sun5i-a13-olinuxino.dtb
|
sun5i-a13-olinuxino.dtb
|
||||||
dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
|
dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
ranges = <0 0 0xd0000000 0x100000>;
|
ranges = <0 0 0xd0000000 0x0100000 /* internal registers */
|
||||||
|
0xe0000000 0 0xe0000000 0x8100000 /* PCIe */>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
ranges = <0 0xd0000000 0x100000>;
|
ranges = <0 0xd0000000 0x0100000 /* internal registers */
|
||||||
|
0xe0000000 0xe0000000 0x8100000 /* PCIe */>;
|
||||||
internal-regs {
|
internal-regs {
|
||||||
system-controller@18200 {
|
system-controller@18200 {
|
||||||
compatible = "marvell,armada-370-xp-system-controller";
|
compatible = "marvell,armada-370-xp-system-controller";
|
||||||
|
@ -38,12 +39,12 @@
|
||||||
|
|
||||||
L2: l2-cache {
|
L2: l2-cache {
|
||||||
compatible = "marvell,aurora-outer-cache";
|
compatible = "marvell,aurora-outer-cache";
|
||||||
reg = <0xd0008000 0x1000>;
|
reg = <0x08000 0x1000>;
|
||||||
cache-id-part = <0x100>;
|
cache-id-part = <0x100>;
|
||||||
wt-override;
|
wt-override;
|
||||||
};
|
};
|
||||||
|
|
||||||
mpic: interrupt-controller@20000 {
|
interrupt-controller@20000 {
|
||||||
reg = <0x20a00 0x1d0>, <0x21870 0x58>;
|
reg = <0x20a00 0x1d0>, <0x21870 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
ranges = <0 0 0xd0000000 0x100000
|
||||||
|
0xf0000000 0 0xf0000000 0x1000000>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <250000000>;
|
clock-frequency = <250000000>;
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
ranges = <0 0 0xd0000000 0x100000
|
||||||
|
0xf0000000 0 0xf0000000 0x8000000>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <250000000>;
|
clock-frequency = <250000000>;
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
wt-override;
|
wt-override;
|
||||||
};
|
};
|
||||||
|
|
||||||
mpic: interrupt-controller@20000 {
|
interrupt-controller@20000 {
|
||||||
reg = <0x20a00 0x2d0>, <0x21070 0x58>;
|
reg = <0x20a00 0x2d0>, <0x21070 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -264,7 +264,7 @@
|
||||||
atmel,pins =
|
atmel,pins =
|
||||||
<0 10 0x2 0x0 /* PA10 periph B */
|
<0 10 0x2 0x0 /* PA10 periph B */
|
||||||
0 11 0x2 0x0 /* PA11 periph B */
|
0 11 0x2 0x0 /* PA11 periph B */
|
||||||
0 24 0x2 0x0 /* PA24 periph B */
|
0 22 0x2 0x0 /* PA22 periph B */
|
||||||
0 25 0x2 0x0 /* PA25 periph B */
|
0 25 0x2 0x0 /* PA25 periph B */
|
||||||
0 26 0x2 0x0 /* PA26 periph B */
|
0 26 0x2 0x0 /* PA26 periph B */
|
||||||
0 27 0x2 0x0 /* PA27 periph B */
|
0 27 0x2 0x0 /* PA27 periph B */
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
compatible = "atmel,at91rm9200-aic";
|
compatible = "atmel,at91rm9200-aic";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
reg = <0xfffff000 0x200>;
|
reg = <0xfffff000 0x200>;
|
||||||
|
atmel,external-irqs = <31>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ramc0: ramc@ffffe800 {
|
ramc0: ramc@ffffe800 {
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
/include/ "at91sam9x5ek.dtsi"
|
/include/ "at91sam9x5ek.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Atmel AT91SAM9G25-EK";
|
model = "Atmel AT91SAM9X25-EK";
|
||||||
compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
|
compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
|
||||||
|
|
||||||
ahb {
|
ahb {
|
||||||
|
|
|
@ -516,7 +516,7 @@
|
||||||
usb_otg_hs: usb_otg_hs@480ab000 {
|
usb_otg_hs: usb_otg_hs@480ab000 {
|
||||||
compatible = "ti,omap3-musb";
|
compatible = "ti,omap3-musb";
|
||||||
reg = <0x480ab000 0x1000>;
|
reg = <0x480ab000 0x1000>;
|
||||||
interrupts = <0 92 0x4>, <0 93 0x4>;
|
interrupts = <92>, <93>;
|
||||||
interrupt-names = "mc", "dma";
|
interrupt-names = "mc", "dma";
|
||||||
ti,hwmods = "usb_otg_hs";
|
ti,hwmods = "usb_otg_hs";
|
||||||
multipoint = <1>;
|
multipoint = <1>;
|
||||||
|
|
|
@ -75,11 +75,6 @@
|
||||||
compatible = "atmel,at91sam9x5-spi";
|
compatible = "atmel,at91sam9x5-spi";
|
||||||
reg = <0xf0004000 0x100>;
|
reg = <0xf0004000 0x100>;
|
||||||
interrupts = <24 4 3>;
|
interrupts = <24 4 3>;
|
||||||
cs-gpios = <&pioD 13 0
|
|
||||||
&pioD 14 0 /* conflicts with SCK0 and CANRX0 */
|
|
||||||
&pioD 15 0 /* conflicts with CTS0 and CANTX0 */
|
|
||||||
&pioD 16 0 /* conflicts with RTS0 and PWMFI3 */
|
|
||||||
>;
|
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_spi0>;
|
pinctrl-0 = <&pinctrl_spi0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -156,7 +151,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
macb0: ethernet@f0028000 {
|
macb0: ethernet@f0028000 {
|
||||||
compatible = "cnds,pc302-gem", "cdns,gem";
|
compatible = "cdns,pc302-gem", "cdns,gem";
|
||||||
reg = <0xf0028000 0x100>;
|
reg = <0xf0028000 0x100>;
|
||||||
interrupts = <34 4 3>;
|
interrupts = <34 4 3>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@ -203,11 +198,6 @@
|
||||||
compatible = "atmel,at91sam9x5-spi";
|
compatible = "atmel,at91sam9x5-spi";
|
||||||
reg = <0xf8008000 0x100>;
|
reg = <0xf8008000 0x100>;
|
||||||
interrupts = <25 4 3>;
|
interrupts = <25 4 3>;
|
||||||
cs-gpios = <&pioC 25 0
|
|
||||||
&pioC 26 0 /* conflitcs with TWD1 and ISI_D11 */
|
|
||||||
&pioC 27 0 /* conflitcs with TWCK1 and ISI_D10 */
|
|
||||||
&pioC 28 0 /* conflitcs with PWMFI0 and ISI_D9 */
|
|
||||||
>;
|
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_spi1>;
|
pinctrl-0 = <&pinctrl_spi1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -32,6 +32,10 @@
|
||||||
|
|
||||||
ahb {
|
ahb {
|
||||||
apb {
|
apb {
|
||||||
|
spi0: spi@f0004000 {
|
||||||
|
cs-gpios = <&pioD 13 0>, <0>, <0>, <0>;
|
||||||
|
};
|
||||||
|
|
||||||
macb0: ethernet@f0028000 {
|
macb0: ethernet@f0028000 {
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,13 +14,19 @@
|
||||||
bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
|
bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* This is where the interrupt is routed on the S8815 board */
|
||||||
|
external-bus@34000000 {
|
||||||
|
ethernet@300 {
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <8 0x1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/* Custom board node with GPIO pins to active etc */
|
/* Custom board node with GPIO pins to active etc */
|
||||||
usb-s8815 {
|
usb-s8815 {
|
||||||
/* The S8815 is using this very GPIO pin for the SMSC91x IRQs */
|
/* The S8815 is using this very GPIO pin for the SMSC91x IRQs */
|
||||||
ethernet-gpio {
|
ethernet-gpio {
|
||||||
gpios = <&gpio3 19 0x1>;
|
gpios = <&gpio3 8 0x1>;
|
||||||
interrupts = <19 0x1>;
|
|
||||||
interrupt-parent = <&gpio3>;
|
|
||||||
};
|
};
|
||||||
/* This will bias the MMC/SD card detect line */
|
/* This will bias the MMC/SD card detect line */
|
||||||
mmcsd-gpio {
|
mmcsd-gpio {
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
bootargs = "earlyprintk console=ttyS0,115200";
|
bootargs = "earlyprintk console=ttyS0,115200";
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc@01c20000 {
|
||||||
uart0: uart@01c28000 {
|
uart0: serial@01c28000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&uart0_pins_a>;
|
pinctrl-0 = <&uart0_pins_a>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -20,6 +20,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
|
CONFIG_ARCH_MULTI_V6=y
|
||||||
CONFIG_ARCH_OMAP2PLUS=y
|
CONFIG_ARCH_OMAP2PLUS=y
|
||||||
CONFIG_OMAP_RESET_CLOCKS=y
|
CONFIG_OMAP_RESET_CLOCKS=y
|
||||||
CONFIG_OMAP_MUX_DEBUG=y
|
CONFIG_OMAP_MUX_DEBUG=y
|
||||||
|
|
|
@ -153,6 +153,7 @@ CONFIG_MEDIA_CAMERA_SUPPORT=y
|
||||||
CONFIG_MEDIA_USB_SUPPORT=y
|
CONFIG_MEDIA_USB_SUPPORT=y
|
||||||
CONFIG_USB_VIDEO_CLASS=m
|
CONFIG_USB_VIDEO_CLASS=m
|
||||||
CONFIG_DRM=y
|
CONFIG_DRM=y
|
||||||
|
CONFIG_TEGRA_HOST1X=y
|
||||||
CONFIG_DRM_TEGRA=y
|
CONFIG_DRM_TEGRA=y
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
|
@ -202,7 +203,7 @@ CONFIG_TEGRA20_APB_DMA=y
|
||||||
CONFIG_STAGING=y
|
CONFIG_STAGING=y
|
||||||
CONFIG_SENSORS_ISL29018=y
|
CONFIG_SENSORS_ISL29018=y
|
||||||
CONFIG_SENSORS_ISL29028=y
|
CONFIG_SENSORS_ISL29028=y
|
||||||
CONFIG_SENSORS_AK8975=y
|
CONFIG_AK8975=y
|
||||||
CONFIG_MFD_NVEC=y
|
CONFIG_MFD_NVEC=y
|
||||||
CONFIG_KEYBOARD_NVEC=y
|
CONFIG_KEYBOARD_NVEC=y
|
||||||
CONFIG_SERIO_NVEC_PS2=y
|
CONFIG_SERIO_NVEC_PS2=y
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
#define U8500_UART0_PHYS_BASE (0x80120000)
|
#define U8500_UART0_PHYS_BASE (0x80120000)
|
||||||
#define U8500_UART1_PHYS_BASE (0x80121000)
|
#define U8500_UART1_PHYS_BASE (0x80121000)
|
||||||
#define U8500_UART2_PHYS_BASE (0x80007000)
|
#define U8500_UART2_PHYS_BASE (0x80007000)
|
||||||
#define U8500_UART0_VIRT_BASE (0xa8120000)
|
#define U8500_UART0_VIRT_BASE (0xf8120000)
|
||||||
#define U8500_UART1_VIRT_BASE (0xa8121000)
|
#define U8500_UART1_VIRT_BASE (0xf8121000)
|
||||||
#define U8500_UART2_VIRT_BASE (0xa8007000)
|
#define U8500_UART2_VIRT_BASE (0xf8007000)
|
||||||
#define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE
|
#define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE
|
||||||
#define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE
|
#define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -174,6 +174,7 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
|
||||||
static struct clock_event_device clkevt = {
|
static struct clock_event_device clkevt = {
|
||||||
.name = "at91_tick",
|
.name = "at91_tick",
|
||||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||||
|
.shift = 32,
|
||||||
.rating = 150,
|
.rating = 150,
|
||||||
.set_next_event = clkevt32k_next_event,
|
.set_next_event = clkevt32k_next_event,
|
||||||
.set_mode = clkevt32k_mode,
|
.set_mode = clkevt32k_mode,
|
||||||
|
@ -264,9 +265,11 @@ void __init at91rm9200_timer_init(void)
|
||||||
at91_st_write(AT91_ST_RTMR, 1);
|
at91_st_write(AT91_ST_RTMR, 1);
|
||||||
|
|
||||||
/* Setup timer clockevent, with minimum of two ticks (important!!) */
|
/* Setup timer clockevent, with minimum of two ticks (important!!) */
|
||||||
|
clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
|
||||||
|
clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt);
|
||||||
|
clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1;
|
||||||
clkevt.cpumask = cpumask_of(0);
|
clkevt.cpumask = cpumask_of(0);
|
||||||
clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK,
|
clockevents_register_device(&clkevt);
|
||||||
2, AT91_ST_ALMV);
|
|
||||||
|
|
||||||
/* register clocksource */
|
/* register clocksource */
|
||||||
clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);
|
clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);
|
||||||
|
|
|
@ -223,13 +223,7 @@ static void __init at91sam9n12_map_io(void)
|
||||||
at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
|
at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91sam9n12_initialize(void)
|
|
||||||
{
|
|
||||||
at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0);
|
|
||||||
}
|
|
||||||
|
|
||||||
AT91_SOC_START(at91sam9n12)
|
AT91_SOC_START(at91sam9n12)
|
||||||
.map_io = at91sam9n12_map_io,
|
.map_io = at91sam9n12_map_io,
|
||||||
.register_clocks = at91sam9n12_register_clocks,
|
.register_clocks = at91sam9n12_register_clocks,
|
||||||
.init = at91sam9n12_initialize,
|
|
||||||
AT91_SOC_END
|
AT91_SOC_END
|
||||||
|
|
|
@ -179,9 +179,9 @@ extern void __iomem *at91_pmc_base;
|
||||||
#define AT91_PMC_PCR_CMD (0x1 << 12) /* Command (read=0, write=1) */
|
#define AT91_PMC_PCR_CMD (0x1 << 12) /* Command (read=0, write=1) */
|
||||||
#define AT91_PMC_PCR_DIV(n) ((n) << 16) /* Divisor Value */
|
#define AT91_PMC_PCR_DIV(n) ((n) << 16) /* Divisor Value */
|
||||||
#define AT91_PMC_PCR_DIV0 0x0 /* Peripheral clock is MCK */
|
#define AT91_PMC_PCR_DIV0 0x0 /* Peripheral clock is MCK */
|
||||||
#define AT91_PMC_PCR_DIV2 0x2 /* Peripheral clock is MCK/2 */
|
#define AT91_PMC_PCR_DIV2 0x1 /* Peripheral clock is MCK/2 */
|
||||||
#define AT91_PMC_PCR_DIV4 0x4 /* Peripheral clock is MCK/4 */
|
#define AT91_PMC_PCR_DIV4 0x2 /* Peripheral clock is MCK/4 */
|
||||||
#define AT91_PMC_PCR_DIV8 0x8 /* Peripheral clock is MCK/8 */
|
#define AT91_PMC_PCR_DIV8 0x3 /* Peripheral clock is MCK/8 */
|
||||||
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
|
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -177,7 +177,8 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
|
||||||
static const char *step_sels[] = { "osc", "pll2_pfd2_396m", };
|
static const char *step_sels[] = { "osc", "pll2_pfd2_396m", };
|
||||||
static const char *pll1_sw_sels[] = { "pll1_sys", "step", };
|
static const char *pll1_sw_sels[] = { "pll1_sys", "step", };
|
||||||
static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", };
|
static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", };
|
||||||
static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", };
|
static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", };
|
||||||
|
static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", };
|
||||||
static const char *periph_sels[] = { "periph_pre", "periph_clk2", };
|
static const char *periph_sels[] = { "periph_pre", "periph_clk2", };
|
||||||
static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", };
|
static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", };
|
||||||
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||||
|
@ -185,7 +186,7 @@ static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd
|
||||||
static const char *gpu_axi_sels[] = { "axi", "ahb", };
|
static const char *gpu_axi_sels[] = { "axi", "ahb", };
|
||||||
static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };
|
static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };
|
||||||
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
||||||
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
|
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", };
|
||||||
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
||||||
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
||||||
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||||
|
@ -369,8 +370,8 @@ int __init mx6q_clocks_init(void)
|
||||||
clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels));
|
clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels));
|
||||||
clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
||||||
clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
||||||
clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
||||||
clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));
|
||||||
clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels));
|
clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels));
|
||||||
clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
||||||
clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
||||||
|
@ -498,7 +499,7 @@ int __init mx6q_clocks_init(void)
|
||||||
clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14);
|
clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14);
|
||||||
clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10);
|
clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10);
|
||||||
clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16);
|
clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16);
|
||||||
clk[mlb] = imx_clk_gate2("mlb", "pll8_mlb", base + 0x74, 18);
|
clk[mlb] = imx_clk_gate2("mlb", "axi", base + 0x74, 18);
|
||||||
clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20);
|
clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20);
|
||||||
clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22);
|
clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22);
|
||||||
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
|
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
|
||||||
|
|
|
@ -18,8 +18,20 @@
|
||||||
.section ".text.head", "ax"
|
.section ".text.head", "ax"
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
diag_reg_offset:
|
||||||
|
.word g_diag_reg - .
|
||||||
|
|
||||||
|
.macro set_diag_reg
|
||||||
|
adr r0, diag_reg_offset
|
||||||
|
ldr r1, [r0]
|
||||||
|
add r1, r1, r0 @ r1 = physical &g_diag_reg
|
||||||
|
ldr r0, [r1]
|
||||||
|
mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
|
||||||
|
.endm
|
||||||
|
|
||||||
ENTRY(v7_secondary_startup)
|
ENTRY(v7_secondary_startup)
|
||||||
bl v7_invalidate_l1
|
bl v7_invalidate_l1
|
||||||
|
set_diag_reg
|
||||||
b secondary_startup
|
b secondary_startup
|
||||||
ENDPROC(v7_secondary_startup)
|
ENDPROC(v7_secondary_startup)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
@ -21,6 +22,7 @@
|
||||||
|
|
||||||
#define SCU_STANDBY_ENABLE (1 << 5)
|
#define SCU_STANDBY_ENABLE (1 << 5)
|
||||||
|
|
||||||
|
u32 g_diag_reg;
|
||||||
static void __iomem *scu_base;
|
static void __iomem *scu_base;
|
||||||
|
|
||||||
static struct map_desc scu_io_desc __initdata = {
|
static struct map_desc scu_io_desc __initdata = {
|
||||||
|
@ -80,6 +82,18 @@ void imx_smp_prepare(void)
|
||||||
static void __init imx_smp_prepare_cpus(unsigned int max_cpus)
|
static void __init imx_smp_prepare_cpus(unsigned int max_cpus)
|
||||||
{
|
{
|
||||||
imx_smp_prepare();
|
imx_smp_prepare();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The diagnostic register holds the errata bits. Mostly bootloader
|
||||||
|
* does not bring up secondary cores, so that when errata bits are set
|
||||||
|
* in bootloader, they are set only for boot cpu. But on a SMP
|
||||||
|
* configuration, it should be equally done on every single core.
|
||||||
|
* Read the register from boot cpu here, and will replicate it into
|
||||||
|
* secondary cores when booting them.
|
||||||
|
*/
|
||||||
|
asm("mrc p15, 0, %0, c15, c0, 1" : "=r" (g_diag_reg) : : "cc");
|
||||||
|
__cpuc_flush_dcache_area(&g_diag_reg, sizeof(g_diag_reg));
|
||||||
|
outer_clean_range(__pa(&g_diag_reg), __pa(&g_diag_reg + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct smp_operations imx_smp_ops __initdata = {
|
struct smp_operations imx_smp_ops __initdata = {
|
||||||
|
|
|
@ -528,12 +528,6 @@ void __init kirkwood_init_early(void)
|
||||||
{
|
{
|
||||||
orion_time_set_base(TIMER_VIRT_BASE);
|
orion_time_set_base(TIMER_VIRT_BASE);
|
||||||
|
|
||||||
/*
|
|
||||||
* Some Kirkwood devices allocate their coherent buffers from atomic
|
|
||||||
* context. Increase size of atomic coherent pool to make sure such
|
|
||||||
* the allocations won't fail.
|
|
||||||
*/
|
|
||||||
init_dma_coherent_pool_size(SZ_1M);
|
|
||||||
mvebu_mbus_init("marvell,kirkwood-mbus",
|
mvebu_mbus_init("marvell,kirkwood-mbus",
|
||||||
BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
||||||
DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
|
DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
|
||||||
|
|
|
@ -124,7 +124,7 @@ static void __init qnap_ts219_init(void)
|
||||||
static int __init ts219_pci_init(void)
|
static int __init ts219_pci_init(void)
|
||||||
{
|
{
|
||||||
if (machine_is_ts219())
|
if (machine_is_ts219())
|
||||||
kirkwood_pcie_init(KW_PCIE0);
|
kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ config ARCH_MVEBU
|
||||||
select MVEBU_CLK_GATING
|
select MVEBU_CLK_GATING
|
||||||
select MVEBU_MBUS
|
select MVEBU_MBUS
|
||||||
select ZONE_DMA if ARM_LPAE
|
select ZONE_DMA if ARM_LPAE
|
||||||
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
|
|
||||||
if ARCH_MVEBU
|
if ARCH_MVEBU
|
||||||
|
|
||||||
|
|
|
@ -53,13 +53,6 @@ void __init armada_370_xp_init_early(void)
|
||||||
{
|
{
|
||||||
char *mbus_soc_name;
|
char *mbus_soc_name;
|
||||||
|
|
||||||
/*
|
|
||||||
* Some Armada 370/XP devices allocate their coherent buffers
|
|
||||||
* from atomic context. Increase size of atomic coherent pool
|
|
||||||
* to make sure such the allocations won't fail.
|
|
||||||
*/
|
|
||||||
init_dma_coherent_pool_size(SZ_1M);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This initialization will be replaced by a DT-based
|
* This initialization will be replaced by a DT-based
|
||||||
* initialization once the mvebu-mbus driver gains DT support.
|
* initialization once the mvebu-mbus driver gains DT support.
|
||||||
|
|
|
@ -345,6 +345,7 @@ static int __init omap1_system_dma_init(void)
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"%s: Memory allocation failed for d->chan!\n",
|
"%s: Memory allocation failed for d->chan!\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
ret = -ENOMEM;
|
||||||
goto exit_release_d;
|
goto exit_release_d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -454,9 +454,29 @@ DEFINE_CLK_GATE(cefuse_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0,
|
||||||
*/
|
*/
|
||||||
DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732);
|
DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732);
|
||||||
|
|
||||||
DEFINE_CLK_GATE(clkdiv32k_ick, "clkdiv32k_ck", &clkdiv32k_ck, 0x0,
|
static struct clk clkdiv32k_ick;
|
||||||
AM33XX_CM_PER_CLKDIV32K_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
|
||||||
0x0, NULL);
|
static const char *clkdiv32k_ick_parent_names[] = {
|
||||||
|
"clkdiv32k_ck",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_ops clkdiv32k_ick_ops = {
|
||||||
|
.enable = &omap2_dflt_clk_enable,
|
||||||
|
.disable = &omap2_dflt_clk_disable,
|
||||||
|
.is_enabled = &omap2_dflt_clk_is_enabled,
|
||||||
|
.init = &omap2_init_clk_clkdm,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_hw_omap clkdiv32k_ick_hw = {
|
||||||
|
.hw = {
|
||||||
|
.clk = &clkdiv32k_ick,
|
||||||
|
},
|
||||||
|
.enable_reg = AM33XX_CM_PER_CLKDIV32K_CLKCTRL,
|
||||||
|
.enable_bit = AM33XX_MODULEMODE_SWCTRL_SHIFT,
|
||||||
|
.clkdm_name = "clk_24mhz_clkdm",
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_STRUCT_CLK(clkdiv32k_ick, clkdiv32k_ick_parent_names, clkdiv32k_ick_ops);
|
||||||
|
|
||||||
/* "usbotg_fck" is an additional clock and not really a modulemode */
|
/* "usbotg_fck" is an additional clock and not really a modulemode */
|
||||||
DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0,
|
DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0,
|
||||||
|
|
|
@ -1356,13 +1356,27 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
||||||
|
|
||||||
clkdm = _get_clkdm(oh);
|
clkdm = _get_clkdm(oh);
|
||||||
if (sf & SYSC_HAS_SIDLEMODE) {
|
if (sf & SYSC_HAS_SIDLEMODE) {
|
||||||
|
if (oh->flags & HWMOD_SWSUP_SIDLE ||
|
||||||
|
oh->flags & HWMOD_SWSUP_SIDLE_ACT) {
|
||||||
|
idlemode = HWMOD_IDLEMODE_NO;
|
||||||
|
} else {
|
||||||
|
if (sf & SYSC_HAS_ENAWAKEUP)
|
||||||
|
_enable_wakeup(oh, &v);
|
||||||
|
if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
|
||||||
|
idlemode = HWMOD_IDLEMODE_SMART_WKUP;
|
||||||
|
else
|
||||||
|
idlemode = HWMOD_IDLEMODE_SMART;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is special handling for some IPs like
|
||||||
|
* 32k sync timer. Force them to idle!
|
||||||
|
*/
|
||||||
clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);
|
clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);
|
||||||
if (clkdm_act && !(oh->class->sysc->idlemodes &
|
if (clkdm_act && !(oh->class->sysc->idlemodes &
|
||||||
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
||||||
idlemode = HWMOD_IDLEMODE_FORCE;
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||||
else
|
|
||||||
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
|
|
||||||
HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
|
|
||||||
_set_slave_idlemode(oh, idlemode, &v);
|
_set_slave_idlemode(oh, idlemode, &v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1391,10 +1405,6 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
||||||
(sf & SYSC_HAS_CLOCKACTIVITY))
|
(sf & SYSC_HAS_CLOCKACTIVITY))
|
||||||
_set_clockactivity(oh, oh->class->sysc->clockact, &v);
|
_set_clockactivity(oh, oh->class->sysc->clockact, &v);
|
||||||
|
|
||||||
/* If slave is in SMARTIDLE, also enable wakeup */
|
|
||||||
if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
|
|
||||||
_enable_wakeup(oh, &v);
|
|
||||||
|
|
||||||
_write_sysconfig(v, oh);
|
_write_sysconfig(v, oh);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1430,13 +1440,16 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
||||||
sf = oh->class->sysc->sysc_flags;
|
sf = oh->class->sysc->sysc_flags;
|
||||||
|
|
||||||
if (sf & SYSC_HAS_SIDLEMODE) {
|
if (sf & SYSC_HAS_SIDLEMODE) {
|
||||||
/* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */
|
if (oh->flags & HWMOD_SWSUP_SIDLE) {
|
||||||
if (oh->flags & HWMOD_SWSUP_SIDLE ||
|
|
||||||
!(oh->class->sysc->idlemodes &
|
|
||||||
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
|
||||||
idlemode = HWMOD_IDLEMODE_FORCE;
|
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||||
else
|
} else {
|
||||||
idlemode = HWMOD_IDLEMODE_SMART;
|
if (sf & SYSC_HAS_ENAWAKEUP)
|
||||||
|
_enable_wakeup(oh, &v);
|
||||||
|
if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
|
||||||
|
idlemode = HWMOD_IDLEMODE_SMART_WKUP;
|
||||||
|
else
|
||||||
|
idlemode = HWMOD_IDLEMODE_SMART;
|
||||||
|
}
|
||||||
_set_slave_idlemode(oh, idlemode, &v);
|
_set_slave_idlemode(oh, idlemode, &v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1455,10 +1468,6 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
||||||
_set_master_standbymode(oh, idlemode, &v);
|
_set_master_standbymode(oh, idlemode, &v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If slave is in SMARTIDLE, also enable wakeup */
|
|
||||||
if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
|
|
||||||
_enable_wakeup(oh, &v);
|
|
||||||
|
|
||||||
_write_sysconfig(v, oh);
|
_write_sysconfig(v, oh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2065,7 +2074,7 @@ static int _omap4_get_context_lost(struct omap_hwmod *oh)
|
||||||
* do so is present in the hwmod data, then call it and pass along the
|
* do so is present in the hwmod data, then call it and pass along the
|
||||||
* return value; otherwise, return 0.
|
* return value; otherwise, return 0.
|
||||||
*/
|
*/
|
||||||
static int __init _enable_preprogram(struct omap_hwmod *oh)
|
static int _enable_preprogram(struct omap_hwmod *oh)
|
||||||
{
|
{
|
||||||
if (!oh->class->enable_preprogram)
|
if (!oh->class->enable_preprogram)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2245,42 +2254,6 @@ static int _idle(struct omap_hwmod *oh)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit
|
|
||||||
* @oh: struct omap_hwmod *
|
|
||||||
* @autoidle: desired AUTOIDLE bitfield value (0 or 1)
|
|
||||||
*
|
|
||||||
* Sets the IP block's OCP autoidle bit in hardware, and updates our
|
|
||||||
* local copy. Intended to be used by drivers that require
|
|
||||||
* direct manipulation of the AUTOIDLE bits.
|
|
||||||
* Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes
|
|
||||||
* along the return value from _set_module_autoidle().
|
|
||||||
*
|
|
||||||
* Any users of this function should be scrutinized carefully.
|
|
||||||
*/
|
|
||||||
int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle)
|
|
||||||
{
|
|
||||||
u32 v;
|
|
||||||
int retval = 0;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
if (!oh || oh->_state != _HWMOD_STATE_ENABLED)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&oh->_lock, flags);
|
|
||||||
|
|
||||||
v = oh->_sysc_cache;
|
|
||||||
|
|
||||||
retval = _set_module_autoidle(oh, autoidle, &v);
|
|
||||||
|
|
||||||
if (!retval)
|
|
||||||
_write_sysconfig(v, oh);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&oh->_lock, flags);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _shutdown - shutdown an omap_hwmod
|
* _shutdown - shutdown an omap_hwmod
|
||||||
* @oh: struct omap_hwmod *
|
* @oh: struct omap_hwmod *
|
||||||
|
@ -3179,38 +3152,6 @@ error:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode
|
|
||||||
* @oh: struct omap_hwmod *
|
|
||||||
* @idlemode: SIDLEMODE field bits (shifted to bit 0)
|
|
||||||
*
|
|
||||||
* Sets the IP block's OCP slave idlemode in hardware, and updates our
|
|
||||||
* local copy. Intended to be used by drivers that have some erratum
|
|
||||||
* that requires direct manipulation of the SIDLEMODE bits. Returns
|
|
||||||
* -EINVAL if @oh is null, or passes along the return value from
|
|
||||||
* _set_slave_idlemode().
|
|
||||||
*
|
|
||||||
* XXX Does this function have any current users? If not, we should
|
|
||||||
* remove it; it is better to let the rest of the hwmod code handle this.
|
|
||||||
* Any users of this function should be scrutinized carefully.
|
|
||||||
*/
|
|
||||||
int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode)
|
|
||||||
{
|
|
||||||
u32 v;
|
|
||||||
int retval = 0;
|
|
||||||
|
|
||||||
if (!oh)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
v = oh->_sysc_cache;
|
|
||||||
|
|
||||||
retval = _set_slave_idlemode(oh, idlemode, &v);
|
|
||||||
if (!retval)
|
|
||||||
_write_sysconfig(v, oh);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* omap_hwmod_lookup - look up a registered omap_hwmod by name
|
* omap_hwmod_lookup - look up a registered omap_hwmod by name
|
||||||
* @name: name of the omap_hwmod to look up
|
* @name: name of the omap_hwmod to look up
|
||||||
|
|
|
@ -463,6 +463,9 @@ struct omap_hwmod_omap4_prcm {
|
||||||
* is kept in force-standby mode. Failing to do so causes PM problems
|
* is kept in force-standby mode. Failing to do so causes PM problems
|
||||||
* with musb on OMAP3630 at least. Note that musb has a dedicated register
|
* with musb on OMAP3630 at least. Note that musb has a dedicated register
|
||||||
* to control MSTANDBY signal when MIDLEMODE is set to force-standby.
|
* to control MSTANDBY signal when MIDLEMODE is set to force-standby.
|
||||||
|
* HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module
|
||||||
|
* out of idle, but rely on smart-idle to the put it back in idle,
|
||||||
|
* so the wakeups are still functional (Only known case for now is UART)
|
||||||
*/
|
*/
|
||||||
#define HWMOD_SWSUP_SIDLE (1 << 0)
|
#define HWMOD_SWSUP_SIDLE (1 << 0)
|
||||||
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
|
#define HWMOD_SWSUP_MSTANDBY (1 << 1)
|
||||||
|
@ -476,6 +479,7 @@ struct omap_hwmod_omap4_prcm {
|
||||||
#define HWMOD_EXT_OPT_MAIN_CLK (1 << 9)
|
#define HWMOD_EXT_OPT_MAIN_CLK (1 << 9)
|
||||||
#define HWMOD_BLOCK_WFI (1 << 10)
|
#define HWMOD_BLOCK_WFI (1 << 10)
|
||||||
#define HWMOD_FORCE_MSTANDBY (1 << 11)
|
#define HWMOD_FORCE_MSTANDBY (1 << 11)
|
||||||
|
#define HWMOD_SWSUP_SIDLE_ACT (1 << 12)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* omap_hwmod._int_flags definitions
|
* omap_hwmod._int_flags definitions
|
||||||
|
@ -641,9 +645,6 @@ int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name);
|
||||||
int omap_hwmod_enable_clocks(struct omap_hwmod *oh);
|
int omap_hwmod_enable_clocks(struct omap_hwmod *oh);
|
||||||
int omap_hwmod_disable_clocks(struct omap_hwmod *oh);
|
int omap_hwmod_disable_clocks(struct omap_hwmod *oh);
|
||||||
|
|
||||||
int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode);
|
|
||||||
int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle);
|
|
||||||
|
|
||||||
int omap_hwmod_reset(struct omap_hwmod *oh);
|
int omap_hwmod_reset(struct omap_hwmod *oh);
|
||||||
void omap_hwmod_ocp_barrier(struct omap_hwmod *oh);
|
void omap_hwmod_ocp_barrier(struct omap_hwmod *oh);
|
||||||
|
|
||||||
|
|
|
@ -512,6 +512,7 @@ struct omap_hwmod omap2xxx_uart1_hwmod = {
|
||||||
.mpu_irqs = omap2_uart1_mpu_irqs,
|
.mpu_irqs = omap2_uart1_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart1_sdma_reqs,
|
.sdma_reqs = omap2_uart1_sdma_reqs,
|
||||||
.main_clk = "uart1_fck",
|
.main_clk = "uart1_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = CORE_MOD,
|
.module_offs = CORE_MOD,
|
||||||
|
@ -531,6 +532,7 @@ struct omap_hwmod omap2xxx_uart2_hwmod = {
|
||||||
.mpu_irqs = omap2_uart2_mpu_irqs,
|
.mpu_irqs = omap2_uart2_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart2_sdma_reqs,
|
.sdma_reqs = omap2_uart2_sdma_reqs,
|
||||||
.main_clk = "uart2_fck",
|
.main_clk = "uart2_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = CORE_MOD,
|
.module_offs = CORE_MOD,
|
||||||
|
@ -550,6 +552,7 @@ struct omap_hwmod omap2xxx_uart3_hwmod = {
|
||||||
.mpu_irqs = omap2_uart3_mpu_irqs,
|
.mpu_irqs = omap2_uart3_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart3_sdma_reqs,
|
.sdma_reqs = omap2_uart3_sdma_reqs,
|
||||||
.main_clk = "uart3_fck",
|
.main_clk = "uart3_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = CORE_MOD,
|
.module_offs = CORE_MOD,
|
||||||
|
|
|
@ -1995,6 +1995,7 @@ static struct omap_hwmod am33xx_uart1_hwmod = {
|
||||||
.name = "uart1",
|
.name = "uart1",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4_wkup_clkdm",
|
.clkdm_name = "l4_wkup_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart1_irqs,
|
.mpu_irqs = am33xx_uart1_irqs,
|
||||||
.sdma_reqs = uart1_edma_reqs,
|
.sdma_reqs = uart1_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_wkupdm_ck",
|
.main_clk = "dpll_per_m2_div4_wkupdm_ck",
|
||||||
|
@ -2015,6 +2016,7 @@ static struct omap_hwmod am33xx_uart2_hwmod = {
|
||||||
.name = "uart2",
|
.name = "uart2",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4ls_clkdm",
|
.clkdm_name = "l4ls_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart2_irqs,
|
.mpu_irqs = am33xx_uart2_irqs,
|
||||||
.sdma_reqs = uart1_edma_reqs,
|
.sdma_reqs = uart1_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_ck",
|
.main_clk = "dpll_per_m2_div4_ck",
|
||||||
|
@ -2042,6 +2044,7 @@ static struct omap_hwmod am33xx_uart3_hwmod = {
|
||||||
.name = "uart3",
|
.name = "uart3",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4ls_clkdm",
|
.clkdm_name = "l4ls_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart3_irqs,
|
.mpu_irqs = am33xx_uart3_irqs,
|
||||||
.sdma_reqs = uart3_edma_reqs,
|
.sdma_reqs = uart3_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_ck",
|
.main_clk = "dpll_per_m2_div4_ck",
|
||||||
|
@ -2062,6 +2065,7 @@ static struct omap_hwmod am33xx_uart4_hwmod = {
|
||||||
.name = "uart4",
|
.name = "uart4",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4ls_clkdm",
|
.clkdm_name = "l4ls_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart4_irqs,
|
.mpu_irqs = am33xx_uart4_irqs,
|
||||||
.sdma_reqs = uart1_edma_reqs,
|
.sdma_reqs = uart1_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_ck",
|
.main_clk = "dpll_per_m2_div4_ck",
|
||||||
|
@ -2082,6 +2086,7 @@ static struct omap_hwmod am33xx_uart5_hwmod = {
|
||||||
.name = "uart5",
|
.name = "uart5",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4ls_clkdm",
|
.clkdm_name = "l4ls_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart5_irqs,
|
.mpu_irqs = am33xx_uart5_irqs,
|
||||||
.sdma_reqs = uart1_edma_reqs,
|
.sdma_reqs = uart1_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_ck",
|
.main_clk = "dpll_per_m2_div4_ck",
|
||||||
|
@ -2102,6 +2107,7 @@ static struct omap_hwmod am33xx_uart6_hwmod = {
|
||||||
.name = "uart6",
|
.name = "uart6",
|
||||||
.class = &uart_class,
|
.class = &uart_class,
|
||||||
.clkdm_name = "l4ls_clkdm",
|
.clkdm_name = "l4ls_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = am33xx_uart6_irqs,
|
.mpu_irqs = am33xx_uart6_irqs,
|
||||||
.sdma_reqs = uart1_edma_reqs,
|
.sdma_reqs = uart1_edma_reqs,
|
||||||
.main_clk = "dpll_per_m2_div4_ck",
|
.main_clk = "dpll_per_m2_div4_ck",
|
||||||
|
|
|
@ -490,6 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = {
|
||||||
.mpu_irqs = omap2_uart1_mpu_irqs,
|
.mpu_irqs = omap2_uart1_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart1_sdma_reqs,
|
.sdma_reqs = omap2_uart1_sdma_reqs,
|
||||||
.main_clk = "uart1_fck",
|
.main_clk = "uart1_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = CORE_MOD,
|
.module_offs = CORE_MOD,
|
||||||
|
@ -508,6 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = {
|
||||||
.mpu_irqs = omap2_uart2_mpu_irqs,
|
.mpu_irqs = omap2_uart2_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart2_sdma_reqs,
|
.sdma_reqs = omap2_uart2_sdma_reqs,
|
||||||
.main_clk = "uart2_fck",
|
.main_clk = "uart2_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = CORE_MOD,
|
.module_offs = CORE_MOD,
|
||||||
|
@ -526,6 +528,7 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = {
|
||||||
.mpu_irqs = omap2_uart3_mpu_irqs,
|
.mpu_irqs = omap2_uart3_mpu_irqs,
|
||||||
.sdma_reqs = omap2_uart3_sdma_reqs,
|
.sdma_reqs = omap2_uart3_sdma_reqs,
|
||||||
.main_clk = "uart3_fck",
|
.main_clk = "uart3_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = OMAP3430_PER_MOD,
|
.module_offs = OMAP3430_PER_MOD,
|
||||||
|
@ -555,6 +558,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {
|
||||||
.mpu_irqs = uart4_mpu_irqs,
|
.mpu_irqs = uart4_mpu_irqs,
|
||||||
.sdma_reqs = uart4_sdma_reqs,
|
.sdma_reqs = uart4_sdma_reqs,
|
||||||
.main_clk = "uart4_fck",
|
.main_clk = "uart4_fck",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.prcm = {
|
.prcm = {
|
||||||
.omap2 = {
|
.omap2 = {
|
||||||
.module_offs = OMAP3430_PER_MOD,
|
.module_offs = OMAP3430_PER_MOD,
|
||||||
|
|
|
@ -3434,6 +3434,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = {
|
||||||
.name = "uart1",
|
.name = "uart1",
|
||||||
.class = &omap44xx_uart_hwmod_class,
|
.class = &omap44xx_uart_hwmod_class,
|
||||||
.clkdm_name = "l4_per_clkdm",
|
.clkdm_name = "l4_per_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = omap44xx_uart1_irqs,
|
.mpu_irqs = omap44xx_uart1_irqs,
|
||||||
.sdma_reqs = omap44xx_uart1_sdma_reqs,
|
.sdma_reqs = omap44xx_uart1_sdma_reqs,
|
||||||
.main_clk = "func_48m_fclk",
|
.main_clk = "func_48m_fclk",
|
||||||
|
@ -3462,6 +3463,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = {
|
||||||
.name = "uart2",
|
.name = "uart2",
|
||||||
.class = &omap44xx_uart_hwmod_class,
|
.class = &omap44xx_uart_hwmod_class,
|
||||||
.clkdm_name = "l4_per_clkdm",
|
.clkdm_name = "l4_per_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = omap44xx_uart2_irqs,
|
.mpu_irqs = omap44xx_uart2_irqs,
|
||||||
.sdma_reqs = omap44xx_uart2_sdma_reqs,
|
.sdma_reqs = omap44xx_uart2_sdma_reqs,
|
||||||
.main_clk = "func_48m_fclk",
|
.main_clk = "func_48m_fclk",
|
||||||
|
@ -3490,7 +3492,8 @@ static struct omap_hwmod omap44xx_uart3_hwmod = {
|
||||||
.name = "uart3",
|
.name = "uart3",
|
||||||
.class = &omap44xx_uart_hwmod_class,
|
.class = &omap44xx_uart_hwmod_class,
|
||||||
.clkdm_name = "l4_per_clkdm",
|
.clkdm_name = "l4_per_clkdm",
|
||||||
.flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
|
.flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET |
|
||||||
|
HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = omap44xx_uart3_irqs,
|
.mpu_irqs = omap44xx_uart3_irqs,
|
||||||
.sdma_reqs = omap44xx_uart3_sdma_reqs,
|
.sdma_reqs = omap44xx_uart3_sdma_reqs,
|
||||||
.main_clk = "func_48m_fclk",
|
.main_clk = "func_48m_fclk",
|
||||||
|
@ -3519,6 +3522,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = {
|
||||||
.name = "uart4",
|
.name = "uart4",
|
||||||
.class = &omap44xx_uart_hwmod_class,
|
.class = &omap44xx_uart_hwmod_class,
|
||||||
.clkdm_name = "l4_per_clkdm",
|
.clkdm_name = "l4_per_clkdm",
|
||||||
|
.flags = HWMOD_SWSUP_SIDLE_ACT,
|
||||||
.mpu_irqs = omap44xx_uart4_irqs,
|
.mpu_irqs = omap44xx_uart4_irqs,
|
||||||
.sdma_reqs = omap44xx_uart4_sdma_reqs,
|
.sdma_reqs = omap44xx_uart4_sdma_reqs,
|
||||||
.main_clk = "func_48m_fclk",
|
.main_clk = "func_48m_fclk",
|
||||||
|
|
|
@ -95,38 +95,9 @@ static void omap_uart_enable_wakeup(struct device *dev, bool enable)
|
||||||
omap_hwmod_disable_wakeup(od->hwmods[0]);
|
omap_hwmod_disable_wakeup(od->hwmods[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Errata i291: [UART]:Cannot Acknowledge Idle Requests
|
|
||||||
* in Smartidle Mode When Configured for DMA Operations.
|
|
||||||
* WA: configure uart in force idle mode.
|
|
||||||
*/
|
|
||||||
static void omap_uart_set_noidle(struct device *dev)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
|
||||||
struct omap_device *od = to_omap_device(pdev);
|
|
||||||
|
|
||||||
omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void omap_uart_set_smartidle(struct device *dev)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
|
||||||
struct omap_device *od = to_omap_device(pdev);
|
|
||||||
u8 idlemode;
|
|
||||||
|
|
||||||
if (od->hwmods[0]->class->sysc->idlemodes & SIDLE_SMART_WKUP)
|
|
||||||
idlemode = HWMOD_IDLEMODE_SMART_WKUP;
|
|
||||||
else
|
|
||||||
idlemode = HWMOD_IDLEMODE_SMART;
|
|
||||||
|
|
||||||
omap_hwmod_set_slave_idlemode(od->hwmods[0], idlemode);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
|
static void omap_uart_enable_wakeup(struct device *dev, bool enable)
|
||||||
{}
|
{}
|
||||||
static void omap_uart_set_noidle(struct device *dev) {}
|
|
||||||
static void omap_uart_set_smartidle(struct device *dev) {}
|
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
#ifdef CONFIG_OMAP_MUX
|
#ifdef CONFIG_OMAP_MUX
|
||||||
|
@ -299,8 +270,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
|
||||||
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
|
omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
|
||||||
omap_up.flags = UPF_BOOT_AUTOCONF;
|
omap_up.flags = UPF_BOOT_AUTOCONF;
|
||||||
omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
||||||
omap_up.set_forceidle = omap_uart_set_smartidle;
|
|
||||||
omap_up.set_noidle = omap_uart_set_noidle;
|
|
||||||
omap_up.enable_wakeup = omap_uart_enable_wakeup;
|
omap_up.enable_wakeup = omap_uart_enable_wakeup;
|
||||||
omap_up.dma_rx_buf_size = info->dma_rx_buf_size;
|
omap_up.dma_rx_buf_size = info->dma_rx_buf_size;
|
||||||
omap_up.dma_rx_timeout = info->dma_rx_timeout;
|
omap_up.dma_rx_timeout = info->dma_rx_timeout;
|
||||||
|
|
|
@ -199,13 +199,6 @@ void __init orion5x_init_early(void)
|
||||||
|
|
||||||
orion_time_set_base(TIMER_VIRT_BASE);
|
orion_time_set_base(TIMER_VIRT_BASE);
|
||||||
|
|
||||||
/*
|
|
||||||
* Some Orion5x devices allocate their coherent buffers from atomic
|
|
||||||
* context. Increase size of atomic coherent pool to make sure such
|
|
||||||
* the allocations won't fail.
|
|
||||||
*/
|
|
||||||
init_dma_coherent_pool_size(SZ_1M);
|
|
||||||
|
|
||||||
/* Initialize the MBUS driver */
|
/* Initialize the MBUS driver */
|
||||||
orion5x_pcie_id(&dev, &rev);
|
orion5x_pcie_id(&dev, &rev);
|
||||||
if (dev == MV88F5281_DEV_ID)
|
if (dev == MV88F5281_DEV_ID)
|
||||||
|
|
|
@ -212,8 +212,8 @@ static struct platform_device *marzen_devices[] __initdata = {
|
||||||
static struct usb_phy *phy;
|
static struct usb_phy *phy;
|
||||||
static int usb_power_on(struct platform_device *pdev)
|
static int usb_power_on(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
if (!phy)
|
if (IS_ERR(phy))
|
||||||
return -EIO;
|
return PTR_ERR(phy);
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
pm_runtime_enable(&pdev->dev);
|
||||||
pm_runtime_get_sync(&pdev->dev);
|
pm_runtime_get_sync(&pdev->dev);
|
||||||
|
@ -225,7 +225,7 @@ static int usb_power_on(struct platform_device *pdev)
|
||||||
|
|
||||||
static void usb_power_off(struct platform_device *pdev)
|
static void usb_power_off(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
if (!phy)
|
if (IS_ERR(phy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
usb_phy_shutdown(phy);
|
usb_phy_shutdown(phy);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
config ARCH_SUNXI
|
config ARCH_SUNXI
|
||||||
bool "Allwinner A1X SOCs" if ARCH_MULTI_V7
|
bool "Allwinner A1X SOCs" if ARCH_MULTI_V7
|
||||||
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select CLKSRC_OF
|
select CLKSRC_OF
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
|
|
|
@ -51,6 +51,7 @@ config MACH_MOP500
|
||||||
bool "U8500 Development platform, MOP500 versions"
|
bool "U8500 Development platform, MOP500 versions"
|
||||||
select I2C
|
select I2C
|
||||||
select I2C_NOMADIK
|
select I2C_NOMADIK
|
||||||
|
select REGULATOR
|
||||||
select REGULATOR_FIXED_VOLTAGE
|
select REGULATOR_FIXED_VOLTAGE
|
||||||
select SOC_BUS
|
select SOC_BUS
|
||||||
select UX500_SOC_DB8500
|
select UX500_SOC_DB8500
|
||||||
|
|
|
@ -623,7 +623,7 @@ static void __init mop500_init_machine(void)
|
||||||
sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL;
|
sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL;
|
||||||
|
|
||||||
mop500_pinmaps_init();
|
mop500_pinmaps_init();
|
||||||
parent = u8500_init_devices(&ab8500_platdata);
|
parent = u8500_init_devices();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
||||||
mop500_platform_devs[i]->dev.parent = parent;
|
mop500_platform_devs[i]->dev.parent = parent;
|
||||||
|
@ -660,7 +660,7 @@ static void __init snowball_init_machine(void)
|
||||||
sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO;
|
sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO;
|
||||||
|
|
||||||
snowball_pinmaps_init();
|
snowball_pinmaps_init();
|
||||||
parent = u8500_init_devices(&ab8500_platdata);
|
parent = u8500_init_devices();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
|
for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
|
||||||
snowball_platform_devs[i]->dev.parent = parent;
|
snowball_platform_devs[i]->dev.parent = parent;
|
||||||
|
@ -698,7 +698,7 @@ static void __init hrefv60_init_machine(void)
|
||||||
sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO;
|
sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO;
|
||||||
|
|
||||||
hrefv60_pinmaps_init();
|
hrefv60_pinmaps_init();
|
||||||
parent = u8500_init_devices(&ab8500_platdata);
|
parent = u8500_init_devices();
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
|
||||||
mop500_platform_devs[i]->dev.parent = parent;
|
mop500_platform_devs[i]->dev.parent = parent;
|
||||||
|
|
|
@ -206,7 +206,7 @@ static struct device * __init db8500_soc_device_init(void)
|
||||||
/*
|
/*
|
||||||
* This function is called from the board init
|
* This function is called from the board init
|
||||||
*/
|
*/
|
||||||
struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500)
|
struct device * __init u8500_init_devices(void)
|
||||||
{
|
{
|
||||||
struct device *parent;
|
struct device *parent;
|
||||||
int i;
|
int i;
|
||||||
|
@ -220,8 +220,6 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500)
|
||||||
for (i = 0; i < ARRAY_SIZE(platform_devs); i++)
|
for (i = 0; i < ARRAY_SIZE(platform_devs); i++)
|
||||||
platform_devs[i]->dev.parent = parent;
|
platform_devs[i]->dev.parent = parent;
|
||||||
|
|
||||||
db8500_prcmu_device.dev.platform_data = ab8500;
|
|
||||||
|
|
||||||
platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
|
platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
|
||||||
|
|
||||||
return parent;
|
return parent;
|
||||||
|
@ -278,7 +276,7 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
|
||||||
OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
|
OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
|
||||||
OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu",
|
OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu",
|
||||||
&db8500_prcmu_pdata),
|
&db8500_prcmu_pdata),
|
||||||
OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x", NULL),
|
OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x.0", NULL),
|
||||||
/* Requires device name bindings. */
|
/* Requires device name bindings. */
|
||||||
OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE,
|
OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE,
|
||||||
"pinctrl-db8500", NULL),
|
"pinctrl-db8500", NULL),
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
void __init ux500_map_io(void);
|
void __init ux500_map_io(void);
|
||||||
extern void __init u8500_map_io(void);
|
extern void __init u8500_map_io(void);
|
||||||
|
|
||||||
extern struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500);
|
extern struct device * __init u8500_init_devices(void);
|
||||||
|
|
||||||
extern void __init ux500_init_irq(void);
|
extern void __init ux500_init_irq(void);
|
||||||
extern void __init ux500_init_late(void);
|
extern void __init ux500_init_late(void);
|
||||||
|
|
|
@ -173,6 +173,7 @@ static const char * const vt8500_dt_compat[] = {
|
||||||
"wm,wm8505",
|
"wm,wm8505",
|
||||||
"wm,wm8750",
|
"wm,wm8750",
|
||||||
"wm,wm8850",
|
"wm,wm8850",
|
||||||
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)")
|
DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)")
|
||||||
|
|
|
@ -383,7 +383,7 @@ static struct resource orion_ge10_shared_resources[] = {
|
||||||
|
|
||||||
static struct platform_device orion_ge10_shared = {
|
static struct platform_device orion_ge10_shared = {
|
||||||
.name = MV643XX_ETH_SHARED_NAME,
|
.name = MV643XX_ETH_SHARED_NAME,
|
||||||
.id = 1,
|
.id = 2,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &orion_ge10_shared_data,
|
.platform_data = &orion_ge10_shared_data,
|
||||||
},
|
},
|
||||||
|
@ -398,8 +398,8 @@ static struct resource orion_ge10_resources[] = {
|
||||||
|
|
||||||
static struct platform_device orion_ge10 = {
|
static struct platform_device orion_ge10 = {
|
||||||
.name = MV643XX_ETH_NAME,
|
.name = MV643XX_ETH_NAME,
|
||||||
.id = 1,
|
.id = 2,
|
||||||
.num_resources = 2,
|
.num_resources = 1,
|
||||||
.resource = orion_ge10_resources,
|
.resource = orion_ge10_resources,
|
||||||
.dev = {
|
.dev = {
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
@ -432,7 +432,7 @@ static struct resource orion_ge11_shared_resources[] = {
|
||||||
|
|
||||||
static struct platform_device orion_ge11_shared = {
|
static struct platform_device orion_ge11_shared = {
|
||||||
.name = MV643XX_ETH_SHARED_NAME,
|
.name = MV643XX_ETH_SHARED_NAME,
|
||||||
.id = 1,
|
.id = 3,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &orion_ge11_shared_data,
|
.platform_data = &orion_ge11_shared_data,
|
||||||
},
|
},
|
||||||
|
@ -447,8 +447,8 @@ static struct resource orion_ge11_resources[] = {
|
||||||
|
|
||||||
static struct platform_device orion_ge11 = {
|
static struct platform_device orion_ge11 = {
|
||||||
.name = MV643XX_ETH_NAME,
|
.name = MV643XX_ETH_NAME,
|
||||||
.id = 1,
|
.id = 3,
|
||||||
.num_resources = 2,
|
.num_resources = 1,
|
||||||
.resource = orion_ge11_resources,
|
.resource = orion_ge11_resources,
|
||||||
.dev = {
|
.dev = {
|
||||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#ifndef __PLAT_COMMON_H
|
#ifndef __PLAT_COMMON_H
|
||||||
#include <linux/mv643xx_eth.h>
|
#include <linux/mv643xx_eth.h>
|
||||||
|
#include <linux/platform_data/usb-ehci-orion.h>
|
||||||
|
|
||||||
struct dsa_platform_data;
|
struct dsa_platform_data;
|
||||||
struct mv_sata_platform_data;
|
struct mv_sata_platform_data;
|
||||||
|
|
|
@ -872,6 +872,14 @@ static void __init tegra20_periph_clk_init(void)
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* ac97 */
|
||||||
|
clk = tegra_clk_register_periph_gate("ac97", "pll_a_out0",
|
||||||
|
TEGRA_PERIPH_ON_APB,
|
||||||
|
clk_base, 0, 3, &periph_l_regs,
|
||||||
|
periph_clk_enb_refcnt);
|
||||||
|
clk_register_clkdev(clk, NULL, "tegra20-ac97");
|
||||||
|
clks[ac97] = clk;
|
||||||
|
|
||||||
/* apbdma */
|
/* apbdma */
|
||||||
clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base,
|
clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base,
|
||||||
0, 34, &periph_h_regs,
|
0, 34, &periph_h_regs,
|
||||||
|
@ -1234,9 +1242,6 @@ static __initdata struct tegra_clk_init_table init_table[] = {
|
||||||
{uartc, pll_p, 0, 0},
|
{uartc, pll_p, 0, 0},
|
||||||
{uartd, pll_p, 0, 0},
|
{uartd, pll_p, 0, 0},
|
||||||
{uarte, pll_p, 0, 0},
|
{uarte, pll_p, 0, 0},
|
||||||
{usbd, clk_max, 12000000, 0},
|
|
||||||
{usb2, clk_max, 12000000, 0},
|
|
||||||
{usb3, clk_max, 12000000, 0},
|
|
||||||
{pll_a, clk_max, 56448000, 1},
|
{pll_a, clk_max, 56448000, 1},
|
||||||
{pll_a_out0, clk_max, 11289600, 1},
|
{pll_a_out0, clk_max, 11289600, 1},
|
||||||
{cdev1, clk_max, 0, 1},
|
{cdev1, clk_max, 0, 1},
|
||||||
|
|
|
@ -202,26 +202,6 @@ static int serial_omap_get_context_loss_count(struct uart_omap_port *up)
|
||||||
return pdata->get_context_loss_count(up->dev);
|
return pdata->get_context_loss_count(up->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void serial_omap_set_forceidle(struct uart_omap_port *up)
|
|
||||||
{
|
|
||||||
struct omap_uart_port_info *pdata = up->dev->platform_data;
|
|
||||||
|
|
||||||
if (!pdata || !pdata->set_forceidle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pdata->set_forceidle(up->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void serial_omap_set_noidle(struct uart_omap_port *up)
|
|
||||||
{
|
|
||||||
struct omap_uart_port_info *pdata = up->dev->platform_data;
|
|
||||||
|
|
||||||
if (!pdata || !pdata->set_noidle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pdata->set_noidle(up->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
|
static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
|
||||||
{
|
{
|
||||||
struct omap_uart_port_info *pdata = up->dev->platform_data;
|
struct omap_uart_port_info *pdata = up->dev->platform_data;
|
||||||
|
@ -298,8 +278,6 @@ static void serial_omap_stop_tx(struct uart_port *port)
|
||||||
serial_out(up, UART_IER, up->ier);
|
serial_out(up, UART_IER, up->ier);
|
||||||
}
|
}
|
||||||
|
|
||||||
serial_omap_set_forceidle(up);
|
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(up->dev);
|
pm_runtime_mark_last_busy(up->dev);
|
||||||
pm_runtime_put_autosuspend(up->dev);
|
pm_runtime_put_autosuspend(up->dev);
|
||||||
}
|
}
|
||||||
|
@ -364,7 +342,6 @@ static void serial_omap_start_tx(struct uart_port *port)
|
||||||
|
|
||||||
pm_runtime_get_sync(up->dev);
|
pm_runtime_get_sync(up->dev);
|
||||||
serial_omap_enable_ier_thri(up);
|
serial_omap_enable_ier_thri(up);
|
||||||
serial_omap_set_noidle(up);
|
|
||||||
pm_runtime_mark_last_busy(up->dev);
|
pm_runtime_mark_last_busy(up->dev);
|
||||||
pm_runtime_put_autosuspend(up->dev);
|
pm_runtime_put_autosuspend(up->dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,6 @@ struct omap_uart_port_info {
|
||||||
int DTR_present;
|
int DTR_present;
|
||||||
|
|
||||||
int (*get_context_loss_count)(struct device *);
|
int (*get_context_loss_count)(struct device *);
|
||||||
void (*set_forceidle)(struct device *);
|
|
||||||
void (*set_noidle)(struct device *);
|
|
||||||
void (*enable_wakeup)(struct device *, bool);
|
void (*enable_wakeup)(struct device *, bool);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue