2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-16 17:23:55 +08:00

arm-soc: bug fixes for 3.9-rc5

After a quiet set of fixes for 3.9-rc4, a lot of people woke up and sent
 urgent fixes for 3.9. I pushed back on a number of them that got
 deferred to 3.10, but these are the ones that seemed important.
 
 Regression in 3.9:
 
 - Multiple regressions in OMAP2+ clock cleanup
 - SH-Mobile frame buffer bug fix that merged here because of maintainer MIA
 - ux500 prcmu changes broke DT booting
 - MMCI duplicated regulator setup on ux500
 - New ux500 clock driver broke ethernet on snowball
 - Local interrupt driver for mvebu broke ethernet
 - MVEBU GPIO driver did not get set up right on Orion DT
 - incorrect interrupt number on Orion crypto for DT
 
 Long-standing bugs, including candidates for stable:
 
 - Kirkwood MMC needs to disable invalid card detect pins
 - MV SDIO pinmux was wrong on Mirabox
 - GoFlex Net board file needs to set NAND chip delay
 - MSM timer restart race
 - ep93xx early debug code broke in 3.7
 - i.MX CPU hotplug race
 - Incorrect clock setup for OMAP1 USB
 - Workaround for bad clock setup by some old OMAP4 boot loaders
 - Static I/O mappings on cns3xxx since 3.2
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.12 (GNU/Linux)
 
 iQIVAwUAUVrxWGCrR//JCVInAQLsoQ/+IQKk3v3xOhsvLaPxYjpO1dZqwxmWHwCz
 ujmpnsUabYwuVfVL982k3RTSry5brgOB75CdztOyYsnckF1ZJ3zPjBN+TQM7G/aF
 1lpfUTdCEQFgWFb69G6Lr5ZIDk7co3nRJk1GFS/xi/EAlnmUY/tC1Epco2Y0z0g4
 dWz34sor22lxwWkUTdgXKwynoxmmjBzZIJOhtSOeednVPxN2qUe9IDAy9qk43U3a
 Xg8j4OQT59TTmAZgAB7DLlJ3BGpFvTFAeZ4sDwrCCnibmB5E9LiaYwS9vrk9SQB1
 D8CYIUqcP+cGKnftCCIzgjXHYvJw8fa7NKBUw9CzusIuk+c5AbE28KZRIL4D24Oq
 ImlFV4Neec3Iab6IWfD0+PQK6PkwqnvPd5IBSFO4zUv2adafl7sTASlMnNPZtWbo
 gV+GNVlCyab3l1KYBPo+CQGup3UpIAs5trQoCUh7BRf4HEsL+HILr/SFRQk3GQ6H
 B+3HgSleiipT8n81VDFiWY1o5KuXmjUd2qpbc0a45VtM6EFBONwqBaKew93NkDYa
 oIhI6yS8aIMYPXC6ZP5R2OvKUuL+mypKKXlt9BMCnDG9mrGMks8BLumcHco+Jmkt
 9p6DChibxsaH6QArAi16shFPm0VqFUI6cidgTUcY024bZSiXpBMF52mIu6SEf0/S
 agIwGxpuXFg=
 =oQbL
 -----END PGP SIGNATURE-----

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

Pull ARM SoC bug fixes from Arnd Bergmann:
 "After a quiet set of fixes for 3.9-rc4, a lot of people woke up and
  sent urgent fixes for 3.9.  I pushed back on a number of them that got
  deferred to 3.10, but these are the ones that seemed important.

  Regression in 3.9:

   - Multiple regressions in OMAP2+ clock cleanup
   - SH-Mobile frame buffer bug fix that merged here because of
     maintainer MIA
   - ux500 prcmu changes broke DT booting
   - MMCI duplicated regulator setup on ux500
   - New ux500 clock driver broke ethernet on snowball
   - Local interrupt driver for mvebu broke ethernet
   - MVEBU GPIO driver did not get set up right on Orion DT
   - incorrect interrupt number on Orion crypto for DT

  Long-standing bugs, including candidates for stable:

   - Kirkwood MMC needs to disable invalid card detect pins
   - MV SDIO pinmux was wrong on Mirabox
   - GoFlex Net board file needs to set NAND chip delay
   - MSM timer restart race
   - ep93xx early debug code broke in 3.7
   - i.MX CPU hotplug race
   - Incorrect clock setup for OMAP1 USB
   - Workaround for bad clock setup by some old OMAP4 boot loaders
   - Static I/O mappings on cns3xxx since 3.2"

* tag 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  ARM: cns3xxx: fix mapping of private memory region
  arm: mvebu: Fix pinctrl for Armada 370 Mirabox SDIO port.
  arm: orion5x: correct IRQ used in dtsi for mv_cesa
  arm: orion5x: fix orion5x.dtsi gpio parameters
  ARM: Kirkwood: fix unused mvsdio gpio pins
  arm: mvebu: Use local interrupt only for the timer 0
  ARM: kirkwood: Fix chip-delay for GoFlex Net
  ARM: ux500: Enable the clock controlling Ethernet on Snowball
  ARM: ux500: Stop passing ios_handler() as an MMCI power controlling call-back
  ARM: ux500: Apply the TCPM and TCDM locations and sizes to dbx5x0 DT
  fbdev: sh_mobile_lcdc: fixup B side hsync adjust settings
  ARM: OMAP: clocks: Delay clk inits atleast until slab is initialized
  ARM: imx: fix sync issue between imx_cpu_die and imx_cpu_kill
  ARM: msm: Stop counting before reprogramming clockevent
  ARM: ep93xx: Fix wait for UART FIFO to be empty
  ARM: OMAP4: PM: fix PM regression introduced by recent clock cleanup
  ARM: OMAP3: hwmod data: keep MIDLEMODE in force-standby for musb
  ARM: OMAP4: clock data: lock USB DPLL on boot
  ARM: OMAP1: fix USB host on 1710
This commit is contained in:
Linus Torvalds 2013-04-02 08:35:03 -07:00
commit 118c9a45fd
30 changed files with 155 additions and 58 deletions

View File

@ -54,7 +54,7 @@
}; };
mvsdio@d00d4000 { mvsdio@d00d4000 {
pinctrl-0 = <&sdio_pins2>; pinctrl-0 = <&sdio_pins3>;
pinctrl-names = "default"; pinctrl-names = "default";
status = "okay"; status = "okay";
/* /*

View File

@ -59,6 +59,12 @@
"mpp50", "mpp51", "mpp52"; "mpp50", "mpp51", "mpp52";
marvell,function = "sd0"; marvell,function = "sd0";
}; };
sdio_pins3: sdio-pins3 {
marvell,pins = "mpp48", "mpp49", "mpp50",
"mpp51", "mpp52", "mpp53";
marvell,function = "sd0";
};
}; };
gpio0: gpio@d0018100 { gpio0: gpio@d0018100 {

View File

@ -191,8 +191,8 @@
prcmu: prcmu@80157000 { prcmu: prcmu@80157000 {
compatible = "stericsson,db8500-prcmu"; compatible = "stericsson,db8500-prcmu";
reg = <0x80157000 0x1000>; reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>;
reg-names = "prcmu"; reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm";
interrupts = <0 47 0x4>; interrupts = <0 47 0x4>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;

View File

@ -77,6 +77,7 @@
}; };
nand@3000000 { nand@3000000 {
chip-delay = <40>;
status = "okay"; status = "okay";
partition@0 { partition@0 {

View File

@ -13,6 +13,9 @@
compatible = "marvell,orion5x"; compatible = "marvell,orion5x";
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
aliases {
gpio0 = &gpio0;
};
intc: interrupt-controller { intc: interrupt-controller {
compatible = "marvell,orion-intc", "marvell,intc"; compatible = "marvell,orion-intc", "marvell,intc";
interrupt-controller; interrupt-controller;
@ -32,7 +35,9 @@
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-controller; gpio-controller;
reg = <0x10100 0x40>; reg = <0x10100 0x40>;
ngpio = <32>; ngpios = <32>;
interrupt-controller;
#interrupt-cells = <2>;
interrupts = <6>, <7>, <8>, <9>; interrupts = <6>, <7>, <8>, <9>;
}; };
@ -91,7 +96,7 @@
reg = <0x90000 0x10000>, reg = <0x90000 0x10000>,
<0xf2200000 0x800>; <0xf2200000 0x800>;
reg-names = "regs", "sram"; reg-names = "regs", "sram";
interrupts = <22>; interrupts = <28>;
status = "okay"; status = "okay";
}; };
}; };

View File

@ -22,19 +22,9 @@
static struct map_desc cns3xxx_io_desc[] __initdata = { static struct map_desc cns3xxx_io_desc[] __initdata = {
{ {
.virtual = CNS3XXX_TC11MP_TWD_BASE_VIRT, .virtual = CNS3XXX_TC11MP_SCU_BASE_VIRT,
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE), .pfn = __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE),
.length = SZ_4K, .length = SZ_8K,
.type = MT_DEVICE,
}, {
.virtual = CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT,
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE),
.length = SZ_4K,
.type = MT_DEVICE,
}, {
.virtual = CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT,
.pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE),
.length = SZ_4K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, { }, {
.virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT, .virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT,

View File

@ -94,10 +94,10 @@
#define RTC_INTR_STS_OFFSET 0x34 #define RTC_INTR_STS_OFFSET 0x34
#define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */ #define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */
#define CNS3XXX_MISC_BASE_VIRT 0xFFF07000 /* Misc Control */ #define CNS3XXX_MISC_BASE_VIRT 0xFB000000 /* Misc Control */
#define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */ #define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */
#define CNS3XXX_PM_BASE_VIRT 0xFFF08000 #define CNS3XXX_PM_BASE_VIRT 0xFB001000
#define PM_CLK_GATE_OFFSET 0x00 #define PM_CLK_GATE_OFFSET 0x00
#define PM_SOFT_RST_OFFSET 0x04 #define PM_SOFT_RST_OFFSET 0x04
@ -109,7 +109,7 @@
#define PM_PLL_HM_PD_OFFSET 0x1C #define PM_PLL_HM_PD_OFFSET 0x1C
#define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */ #define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */
#define CNS3XXX_UART0_BASE_VIRT 0xFFF09000 #define CNS3XXX_UART0_BASE_VIRT 0xFB002000
#define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */ #define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */
#define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000 #define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000
@ -130,7 +130,7 @@
#define CNS3XXX_I2S_BASE_VIRT 0xFFF10000 #define CNS3XXX_I2S_BASE_VIRT 0xFFF10000
#define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */ #define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */
#define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFFF10800 #define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFB003000
#define TIMER1_COUNTER_OFFSET 0x00 #define TIMER1_COUNTER_OFFSET 0x00
#define TIMER1_AUTO_RELOAD_OFFSET 0x04 #define TIMER1_AUTO_RELOAD_OFFSET 0x04
@ -227,16 +227,16 @@
* Testchip peripheral and fpga gic regions * Testchip peripheral and fpga gic regions
*/ */
#define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */ #define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */
#define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFF000000 #define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFB004000
#define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */ #define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */
#define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT 0xFF000100 #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100)
#define CNS3XXX_TC11MP_TWD_BASE 0x90000600 #define CNS3XXX_TC11MP_TWD_BASE 0x90000600
#define CNS3XXX_TC11MP_TWD_BASE_VIRT 0xFF000600 #define CNS3XXX_TC11MP_TWD_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600)
#define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */ #define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */
#define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT 0xFF001000 #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000)
#define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */ #define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */
#define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000 #define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000

View File

@ -47,9 +47,13 @@ static void __raw_writel(unsigned int value, unsigned int ptr)
static inline void putc(int c) static inline void putc(int c)
{ {
/* Transmit fifo not full? */ int i;
while (__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF)
; for (i = 0; i < 10000; i++) {
/* Transmit fifo not full? */
if (!(__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF))
break;
}
__raw_writeb(c, PHYS_UART_DATA); __raw_writeb(c, PHYS_UART_DATA);
} }

View File

@ -110,6 +110,8 @@ void tzic_handle_irq(struct pt_regs *);
extern void imx_enable_cpu(int cpu, bool enable); extern void imx_enable_cpu(int cpu, bool enable);
extern void imx_set_cpu_jump(int cpu, void *jump_addr); extern void imx_set_cpu_jump(int cpu, void *jump_addr);
extern u32 imx_get_cpu_arg(int cpu);
extern void imx_set_cpu_arg(int cpu, u32 arg);
extern void v7_cpu_resume(void); extern void v7_cpu_resume(void);
extern u32 *pl310_get_save_ptr(void); extern u32 *pl310_get_save_ptr(void);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP

View File

@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void)
void imx_cpu_die(unsigned int cpu) void imx_cpu_die(unsigned int cpu)
{ {
cpu_enter_lowpower(); cpu_enter_lowpower();
/*
* We use the cpu jumping argument register to sync with
* imx_cpu_kill() which is running on cpu0 and waiting for
* the register being cleared to kill the cpu.
*/
imx_set_cpu_arg(cpu, ~0);
cpu_do_idle(); cpu_do_idle();
} }
int imx_cpu_kill(unsigned int cpu) int imx_cpu_kill(unsigned int cpu)
{ {
unsigned long timeout = jiffies + msecs_to_jiffies(50);
while (imx_get_cpu_arg(cpu) == 0)
if (time_after(jiffies, timeout))
return 0;
imx_enable_cpu(cpu, false); imx_enable_cpu(cpu, false);
imx_set_cpu_arg(cpu, 0);
return 1; return 1;
} }

View File

@ -43,6 +43,18 @@ void imx_set_cpu_jump(int cpu, void *jump_addr)
src_base + SRC_GPR1 + cpu * 8); src_base + SRC_GPR1 + cpu * 8);
} }
u32 imx_get_cpu_arg(int cpu)
{
cpu = cpu_logical_map(cpu);
return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4);
}
void imx_set_cpu_arg(int cpu, u32 arg)
{
cpu = cpu_logical_map(cpu);
writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4);
}
void imx_src_prepare_restart(void) void imx_src_prepare_restart(void)
{ {
u32 val; u32 val;

View File

@ -53,6 +53,8 @@ static struct mv_sata_platform_data guruplug_sata_data = {
static struct mvsdio_platform_data guruplug_mvsdio_data = { static struct mvsdio_platform_data guruplug_mvsdio_data = {
/* unfortunately the CD signal has not been connected */ /* unfortunately the CD signal has not been connected */
.gpio_card_detect = -1,
.gpio_write_protect = -1,
}; };
static struct gpio_led guruplug_led_pins[] = { static struct gpio_led guruplug_led_pins[] = {

View File

@ -55,6 +55,7 @@ static struct mv_sata_platform_data openrd_sata_data = {
static struct mvsdio_platform_data openrd_mvsdio_data = { static struct mvsdio_platform_data openrd_mvsdio_data = {
.gpio_card_detect = 29, /* MPP29 used as SD card detect */ .gpio_card_detect = 29, /* MPP29 used as SD card detect */
.gpio_write_protect = -1,
}; };
static unsigned int openrd_mpp_config[] __initdata = { static unsigned int openrd_mpp_config[] __initdata = {

View File

@ -69,6 +69,7 @@ static struct mv_sata_platform_data rd88f6281_sata_data = {
static struct mvsdio_platform_data rd88f6281_mvsdio_data = { static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
.gpio_card_detect = 28, .gpio_card_detect = 28,
.gpio_write_protect = -1,
}; };
static unsigned int rd88f6281_mpp_config[] __initdata = { static unsigned int rd88f6281_mpp_config[] __initdata = {

View File

@ -62,7 +62,10 @@ static int msm_timer_set_next_event(unsigned long cycles,
{ {
u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
writel_relaxed(0, event_base + TIMER_CLEAR); ctrl &= ~TIMER_ENABLE_EN;
writel_relaxed(ctrl, event_base + TIMER_ENABLE);
writel_relaxed(ctrl, event_base + TIMER_CLEAR);
writel_relaxed(cycles, event_base + TIMER_MATCH_VAL); writel_relaxed(cycles, event_base + TIMER_MATCH_VAL);
writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE); writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE);
return 0; return 0;

View File

@ -44,6 +44,8 @@
#define ARMADA_370_XP_MAX_PER_CPU_IRQS (28) #define ARMADA_370_XP_MAX_PER_CPU_IRQS (28)
#define ARMADA_370_XP_TIMER0_PER_CPU_IRQ (5)
#define ACTIVE_DOORBELLS (8) #define ACTIVE_DOORBELLS (8)
static DEFINE_RAW_SPINLOCK(irq_controller_lock); static DEFINE_RAW_SPINLOCK(irq_controller_lock);
@ -62,7 +64,7 @@ static void armada_370_xp_irq_mask(struct irq_data *d)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
writel(hwirq, main_int_base + writel(hwirq, main_int_base +
ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS); ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
else else
@ -79,7 +81,7 @@ static void armada_370_xp_irq_unmask(struct irq_data *d)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ)
writel(hwirq, main_int_base + writel(hwirq, main_int_base +
ARMADA_370_XP_INT_SET_ENABLE_OFFS); ARMADA_370_XP_INT_SET_ENABLE_OFFS);
else else
@ -147,7 +149,7 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS); writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
irq_set_status_flags(virq, IRQ_LEVEL); irq_set_status_flags(virq, IRQ_LEVEL);
if (hw < ARMADA_370_XP_MAX_PER_CPU_IRQS) { if (hw == ARMADA_370_XP_TIMER0_PER_CPU_IRQ) {
irq_set_percpu_devid(virq); irq_set_percpu_devid(virq);
irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip, irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
handle_percpu_devid_irq); handle_percpu_devid_irq);

View File

@ -538,15 +538,6 @@ static struct clk usb_hhc_ck16xx = {
}; };
static struct clk usb_dc_ck = { static struct clk usb_dc_ck = {
.name = "usb_dc_ck",
.ops = &clkops_generic,
/* Direct from ULPD, no parent */
.rate = 48000000,
.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
.enable_bit = USB_REQ_EN_SHIFT,
};
static struct clk usb_dc_ck7xx = {
.name = "usb_dc_ck", .name = "usb_dc_ck",
.ops = &clkops_generic, .ops = &clkops_generic,
/* Direct from ULPD, no parent */ /* Direct from ULPD, no parent */
@ -727,8 +718,7 @@ static struct omap_clk omap_clks[] = {
CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310), CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310), CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX), CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX), CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX | CK_7XX),
CLK(NULL, "usb_dc_ck", &usb_dc_ck7xx, CK_7XX),
CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310), CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),
CLK(NULL, "mclk", &mclk_16xx, CK_16XX), CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310), CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),

View File

@ -52,6 +52,13 @@
*/ */
#define OMAP4_DPLL_ABE_DEFFREQ 98304000 #define OMAP4_DPLL_ABE_DEFFREQ 98304000
/*
* OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section
* "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred
* locked frequency for the USB DPLL is 960MHz.
*/
#define OMAP4_DPLL_USB_DEFFREQ 960000000
/* Root clocks */ /* Root clocks */
DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0);
@ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel,
OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK,
hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops);
DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0,
OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL);
DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0,
OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL);
@ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = {
CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X),
CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X),
CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X),
CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X),
CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X),
CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X),
CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X),
@ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void)
if (rc) if (rc)
pr_err("%s: failed to configure ABE DPLL!\n", __func__); pr_err("%s: failed to configure ABE DPLL!\n", __func__);
/*
* Lock USB DPLL on OMAP4 devices so that the L3INIT power
* domain can transition to retention state when not in use.
*/
rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
if (rc)
pr_err("%s: failed to configure USB DPLL!\n", __func__);
return 0; return 0;
} }

View File

@ -293,5 +293,8 @@ extern void omap_reserve(void);
struct omap_hwmod; struct omap_hwmod;
extern int omap_dss_reset(struct omap_hwmod *); extern int omap_dss_reset(struct omap_hwmod *);
/* SoC specific clock initializer */
extern int (*omap_clk_init)(void);
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */

View File

@ -54,6 +54,12 @@
#include "prm3xxx.h" #include "prm3xxx.h"
#include "prm44xx.h" #include "prm44xx.h"
/*
* omap_clk_init: points to a function that does the SoC-specific
* clock initializations
*/
int (*omap_clk_init)(void);
/* /*
* The machine specific code may provide the extra mapping besides the * The machine specific code may provide the extra mapping besides the
* default mapping provided here. * default mapping provided here.
@ -397,7 +403,7 @@ void __init omap2420_init_early(void)
omap242x_clockdomains_init(); omap242x_clockdomains_init();
omap2420_hwmod_init(); omap2420_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
omap2420_clk_init(); omap_clk_init = omap2420_clk_init;
} }
void __init omap2420_init_late(void) void __init omap2420_init_late(void)
@ -427,7 +433,7 @@ void __init omap2430_init_early(void)
omap243x_clockdomains_init(); omap243x_clockdomains_init();
omap2430_hwmod_init(); omap2430_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
omap2430_clk_init(); omap_clk_init = omap2430_clk_init;
} }
void __init omap2430_init_late(void) void __init omap2430_init_late(void)
@ -462,7 +468,7 @@ void __init omap3_init_early(void)
omap3xxx_clockdomains_init(); omap3xxx_clockdomains_init();
omap3xxx_hwmod_init(); omap3xxx_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
omap3xxx_clk_init(); omap_clk_init = omap3xxx_clk_init;
} }
void __init omap3430_init_early(void) void __init omap3430_init_early(void)
@ -500,7 +506,7 @@ void __init ti81xx_init_early(void)
omap3xxx_clockdomains_init(); omap3xxx_clockdomains_init();
omap3xxx_hwmod_init(); omap3xxx_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
omap3xxx_clk_init(); omap_clk_init = omap3xxx_clk_init;
} }
void __init omap3_init_late(void) void __init omap3_init_late(void)
@ -568,7 +574,7 @@ void __init am33xx_init_early(void)
am33xx_clockdomains_init(); am33xx_clockdomains_init();
am33xx_hwmod_init(); am33xx_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
am33xx_clk_init(); omap_clk_init = am33xx_clk_init;
} }
#endif #endif
@ -593,7 +599,7 @@ void __init omap4430_init_early(void)
omap44xx_clockdomains_init(); omap44xx_clockdomains_init();
omap44xx_hwmod_init(); omap44xx_hwmod_init();
omap_hwmod_init_postsetup(); omap_hwmod_init_postsetup();
omap4xxx_clk_init(); omap_clk_init = omap4xxx_clk_init;
} }
void __init omap4430_init_late(void) void __init omap4430_init_late(void)

View File

@ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh)
} }
if (sf & SYSC_HAS_MIDLEMODE) { if (sf & SYSC_HAS_MIDLEMODE) {
if (oh->flags & HWMOD_SWSUP_MSTANDBY) { if (oh->flags & HWMOD_FORCE_MSTANDBY) {
idlemode = HWMOD_IDLEMODE_FORCE;
} else if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
idlemode = HWMOD_IDLEMODE_NO; idlemode = HWMOD_IDLEMODE_NO;
} else { } else {
if (sf & SYSC_HAS_ENAWAKEUP) if (sf & SYSC_HAS_ENAWAKEUP)
@ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh)
} }
if (sf & SYSC_HAS_MIDLEMODE) { if (sf & SYSC_HAS_MIDLEMODE) {
if (oh->flags & HWMOD_SWSUP_MSTANDBY) { if ((oh->flags & HWMOD_SWSUP_MSTANDBY) ||
(oh->flags & HWMOD_FORCE_MSTANDBY)) {
idlemode = HWMOD_IDLEMODE_FORCE; idlemode = HWMOD_IDLEMODE_FORCE;
} else { } else {
if (sf & SYSC_HAS_ENAWAKEUP) if (sf & SYSC_HAS_ENAWAKEUP)

View File

@ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm {
* *
* HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
* of idle, rather than relying on module smart-idle * of idle, rather than relying on module smart-idle
* HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and
* of standby, rather than relying on module smart-standby * out of standby, rather than relying on module smart-standby
* HWMOD_INIT_NO_RESET: don't reset this module at boot - important for * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
* SDRAM controller, etc. XXX probably belongs outside the main hwmod file * SDRAM controller, etc. XXX probably belongs outside the main hwmod file
* XXX Should be HWMOD_SETUP_NO_RESET * XXX Should be HWMOD_SETUP_NO_RESET
@ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm {
* correctly, or this is being abused to deal with some PM latency * correctly, or this is being abused to deal with some PM latency
* issues -- but we're currently suffering from a shortage of * issues -- but we're currently suffering from a shortage of
* folks who are able to track these issues down properly. * folks who are able to track these issues down properly.
* HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device
* 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
* to control MSTANDBY signal when MIDLEMODE is set to force-standby.
*/ */
#define HWMOD_SWSUP_SIDLE (1 << 0) #define HWMOD_SWSUP_SIDLE (1 << 0)
#define HWMOD_SWSUP_MSTANDBY (1 << 1) #define HWMOD_SWSUP_MSTANDBY (1 << 1)
@ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm {
#define HWMOD_16BIT_REG (1 << 8) #define HWMOD_16BIT_REG (1 << 8)
#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)
/* /*
* omap_hwmod._int_flags definitions * omap_hwmod._int_flags definitions

View File

@ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
* Erratum ID: i479 idle_req / idle_ack mechanism potentially * Erratum ID: i479 idle_req / idle_ack mechanism potentially
* broken when autoidle is enabled * broken when autoidle is enabled
* workaround is to disable the autoidle bit at module level. * workaround is to disable the autoidle bit at module level.
*
* Enabling the device in any other MIDLEMODE setting but force-idle
* causes core_pwrdm not enter idle states at least on OMAP3630.
* Note that musb has OTG_FORCESTDBY register that controls MSTANDBY
* signal when MIDLEMODE is set to force-idle.
*/ */
.flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
| HWMOD_SWSUP_MSTANDBY, | HWMOD_FORCE_MSTANDBY,
}; };
/* usb_otg_hs */ /* usb_otg_hs */

View File

@ -2714,6 +2714,10 @@ static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = {
{ } { }
}; };
static struct omap_hwmod_opt_clk ocp2scp_usb_phy_opt_clks[] = {
{ .role = "48mhz", .clk = "ocp2scp_usb_phy_phy_48m" },
};
/* ocp2scp_usb_phy */ /* ocp2scp_usb_phy */
static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
.name = "ocp2scp_usb_phy", .name = "ocp2scp_usb_phy",
@ -2728,6 +2732,8 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = {
}, },
}, },
.dev_attr = ocp2scp_dev_attr, .dev_attr = ocp2scp_dev_attr,
.opt_clks = ocp2scp_usb_phy_opt_clks,
.opt_clks_cnt = ARRAY_SIZE(ocp2scp_usb_phy_opt_clks),
}; };
/* /*

View File

@ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void)
clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src) \
void __init omap##name##_gptimer_timer_init(void) \ void __init omap##name##_gptimer_timer_init(void) \
{ \ { \
if (omap_clk_init) \
omap_clk_init(); \
omap_dmtimer_init(); \ omap_dmtimer_init(); \
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \
@ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void) \
clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src) \
void __init omap##name##_sync32k_timer_init(void) \ void __init omap##name##_sync32k_timer_init(void) \
{ \ { \
if (omap_clk_init) \
omap_clk_init(); \
omap_dmtimer_init(); \ omap_dmtimer_init(); \
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
/* Enable the use of clocksource="gp_timer" kernel parameter */ \ /* Enable the use of clocksource="gp_timer" kernel parameter */ \

View File

@ -81,7 +81,6 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = {
#endif #endif
struct mmci_platform_data mop500_sdi0_data = { struct mmci_platform_data mop500_sdi0_data = {
.ios_handler = mop500_sdi0_ios_handler,
.ocr_mask = MMC_VDD_29_30, .ocr_mask = MMC_VDD_29_30,
.f_max = 50000000, .f_max = 50000000,
.capabilities = MMC_CAP_4_BIT_DATA | .capabilities = MMC_CAP_4_BIT_DATA |

View File

@ -12,6 +12,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/i2c-nomadik.h> #include <linux/platform_data/i2c-nomadik.h>
@ -439,6 +440,15 @@ static void mop500_prox_deactivate(struct device *dev)
regulator_put(prox_regulator); regulator_put(prox_regulator);
} }
void mop500_snowball_ethernet_clock_enable(void)
{
struct clk *clk;
clk = clk_get_sys("fsmc", NULL);
if (!IS_ERR(clk))
clk_prepare_enable(clk);
}
static struct cryp_platform_data u8500_cryp1_platform_data = { static struct cryp_platform_data u8500_cryp1_platform_data = {
.mem_to_engine = { .mem_to_engine = {
.dir = STEDMA40_MEM_TO_PERIPH, .dir = STEDMA40_MEM_TO_PERIPH,
@ -683,6 +693,8 @@ static void __init snowball_init_machine(void)
mop500_audio_init(parent); mop500_audio_init(parent);
mop500_uart_init(parent); mop500_uart_init(parent);
mop500_snowball_ethernet_clock_enable();
/* This board has full regulator constraints */ /* This board has full regulator constraints */
regulator_has_full_constraints(); regulator_has_full_constraints();
} }

View File

@ -104,6 +104,7 @@ void __init mop500_pinmaps_init(void);
void __init snowball_pinmaps_init(void); void __init snowball_pinmaps_init(void);
void __init hrefv60_pinmaps_init(void); void __init hrefv60_pinmaps_init(void);
void mop500_audio_init(struct device *parent); void mop500_audio_init(struct device *parent);
void mop500_snowball_ethernet_clock_enable(void);
int __init mop500_uib_init(void); int __init mop500_uib_init(void);
void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info,

View File

@ -312,9 +312,10 @@ static void __init u8500_init_machine(void)
/* Pinmaps must be in place before devices register */ /* Pinmaps must be in place before devices register */
if (of_machine_is_compatible("st-ericsson,mop500")) if (of_machine_is_compatible("st-ericsson,mop500"))
mop500_pinmaps_init(); mop500_pinmaps_init();
else if (of_machine_is_compatible("calaosystems,snowball-a9500")) else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
snowball_pinmaps_init(); snowball_pinmaps_init();
else if (of_machine_is_compatible("st-ericsson,hrefv60+")) mop500_snowball_ethernet_clock_enable();
} else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
hrefv60_pinmaps_init(); hrefv60_pinmaps_init();
else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} else if (of_machine_is_compatible("st-ericsson,ccu9540")) {}
/* TODO: Add pinmaps for ccu9540 board. */ /* TODO: Add pinmaps for ccu9540 board. */

View File

@ -858,6 +858,7 @@ static void sh_mobile_lcdc_geometry(struct sh_mobile_lcdc_chan *ch)
tmp = ((mode->xres & 7) << 24) | ((display_h_total & 7) << 16) tmp = ((mode->xres & 7) << 24) | ((display_h_total & 7) << 16)
| ((mode->hsync_len & 7) << 8) | (hsync_pos & 7); | ((mode->hsync_len & 7) << 8) | (hsync_pos & 7);
lcdc_write_chan(ch, LDHAJR, tmp); lcdc_write_chan(ch, LDHAJR, tmp);
lcdc_write_chan_mirror(ch, LDHAJR, tmp);
} }
static void sh_mobile_lcdc_overlay_setup(struct sh_mobile_lcdc_overlay *ovl) static void sh_mobile_lcdc_overlay_setup(struct sh_mobile_lcdc_overlay *ovl)