Commit 71a59b12 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull ARM SoC fixes from Olof Johansson:
 "A week's worth of fixes for various ARM platforms.  Diff wise, the
  largest fix is for OMAP to deal with how GIC now registers interrupts
  (irq_domain_add_legacy() -> irq_domain_add_linear() changes).

  Besides this, a few more renesas platforms needed the GIC instatiation
  done for legacy boards.  There's also a fix that disables coherency of
  mvebu due to issues, and a few other smaller fixes"

* tag 'armsoc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  arm64: dts: add baud rate to Juno stdout-path
  ARM: dts: imx25: Fix PWM "per" clocks
  bus: mvebu-mbus: fix support of MBus window 13
  Merge tag 'mvebu-fixes-3.19-3' of git://git.infradead.org/linux-mvebu into fixes
  ARM: mvebu: completely disable hardware I/O coherency
  ARM: OMAP: Work around hardcoded interrupts
  ARM: shmobile: r8a7779: Instantiate GIC from C board code in legacy builds
  ARM: shmobile: r8a7778: Instantiate GIC from C board code in legacy builds
  arm: boot: dts: dra7: enable dwc3 suspend PHY quirk
parents 80a75554 4b3415c9
...@@ -1257,6 +1257,8 @@ usb1: usb@48890000 { ...@@ -1257,6 +1257,8 @@ usb1: usb@48890000 {
tx-fifo-resize; tx-fifo-resize;
maximum-speed = "super-speed"; maximum-speed = "super-speed";
dr_mode = "otg"; dr_mode = "otg";
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
}; };
}; };
...@@ -1278,6 +1280,8 @@ usb2: usb@488d0000 { ...@@ -1278,6 +1280,8 @@ usb2: usb@488d0000 {
tx-fifo-resize; tx-fifo-resize;
maximum-speed = "high-speed"; maximum-speed = "high-speed";
dr_mode = "otg"; dr_mode = "otg";
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
}; };
}; };
...@@ -1299,6 +1303,8 @@ usb3: usb@48910000 { ...@@ -1299,6 +1303,8 @@ usb3: usb@48910000 {
tx-fifo-resize; tx-fifo-resize;
maximum-speed = "high-speed"; maximum-speed = "high-speed";
dr_mode = "otg"; dr_mode = "otg";
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
}; };
}; };
......
...@@ -369,7 +369,7 @@ pwm2: pwm@53fa0000 { ...@@ -369,7 +369,7 @@ pwm2: pwm@53fa0000 {
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
#pwm-cells = <2>; #pwm-cells = <2>;
reg = <0x53fa0000 0x4000>; reg = <0x53fa0000 0x4000>;
clocks = <&clks 106>, <&clks 36>; clocks = <&clks 106>, <&clks 52>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
interrupts = <36>; interrupts = <36>;
}; };
...@@ -388,7 +388,7 @@ pwm3: pwm@53fa8000 { ...@@ -388,7 +388,7 @@ pwm3: pwm@53fa8000 {
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
#pwm-cells = <2>; #pwm-cells = <2>;
reg = <0x53fa8000 0x4000>; reg = <0x53fa8000 0x4000>;
clocks = <&clks 107>, <&clks 36>; clocks = <&clks 107>, <&clks 52>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
interrupts = <41>; interrupts = <41>;
}; };
...@@ -429,7 +429,7 @@ slcdc@53fc0000 { ...@@ -429,7 +429,7 @@ slcdc@53fc0000 {
pwm4: pwm@53fc8000 { pwm4: pwm@53fc8000 {
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
reg = <0x53fc8000 0x4000>; reg = <0x53fc8000 0x4000>;
clocks = <&clks 108>, <&clks 36>; clocks = <&clks 108>, <&clks 52>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
interrupts = <42>; interrupts = <42>;
}; };
...@@ -476,7 +476,7 @@ pwm1: pwm@53fe0000 { ...@@ -476,7 +476,7 @@ pwm1: pwm@53fe0000 {
compatible = "fsl,imx25-pwm", "fsl,imx27-pwm"; compatible = "fsl,imx25-pwm", "fsl,imx27-pwm";
#pwm-cells = <2>; #pwm-cells = <2>;
reg = <0x53fe0000 0x4000>; reg = <0x53fe0000 0x4000>;
clocks = <&clks 105>, <&clks 36>; clocks = <&clks 105>, <&clks 52>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
interrupts = <26>; interrupts = <26>;
}; };
......
...@@ -246,9 +246,14 @@ static int coherency_type(void) ...@@ -246,9 +246,14 @@ static int coherency_type(void)
return type; return type;
} }
/*
* As a precaution, we currently completely disable hardware I/O
* coherency, until enough testing is done with automatic I/O
* synchronization barriers to validate that it is a proper solution.
*/
int coherency_available(void) int coherency_available(void)
{ {
return coherency_type() != COHERENCY_FABRIC_TYPE_NONE; return false;
} }
int __init coherency_init(void) int __init coherency_init(void)
......
...@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void); ...@@ -211,6 +211,7 @@ extern struct device *omap2_get_iva_device(void);
extern struct device *omap2_get_l3_device(void); extern struct device *omap2_get_l3_device(void);
extern struct device *omap4_get_dsp_device(void); extern struct device *omap4_get_dsp_device(void);
unsigned int omap4_xlate_irq(unsigned int hwirq);
void omap_gic_of_init(void); void omap_gic_of_init(void);
#ifdef CONFIG_CACHE_L2X0 #ifdef CONFIG_CACHE_L2X0
......
...@@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void) ...@@ -256,6 +256,38 @@ static int __init omap4_sar_ram_init(void)
} }
omap_early_initcall(omap4_sar_ram_init); omap_early_initcall(omap4_sar_ram_init);
static struct of_device_id gic_match[] = {
{ .compatible = "arm,cortex-a9-gic", },
{ .compatible = "arm,cortex-a15-gic", },
{ },
};
static struct device_node *gic_node;
unsigned int omap4_xlate_irq(unsigned int hwirq)
{
struct of_phandle_args irq_data;
unsigned int irq;
if (!gic_node)
gic_node = of_find_matching_node(NULL, gic_match);
if (WARN_ON(!gic_node))
return hwirq;
irq_data.np = gic_node;
irq_data.args_count = 3;
irq_data.args[0] = 0;
irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START;
irq_data.args[2] = IRQ_TYPE_LEVEL_HIGH;
irq = irq_create_of_mapping(&irq_data);
if (WARN_ON(!irq))
irq = hwirq;
return irq;
}
void __init omap_gic_of_init(void) void __init omap_gic_of_init(void)
{ {
struct device_node *np; struct device_node *np;
......
...@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res) ...@@ -3534,9 +3534,15 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
mpu_irqs_cnt = _count_mpu_irqs(oh); mpu_irqs_cnt = _count_mpu_irqs(oh);
for (i = 0; i < mpu_irqs_cnt; i++) { for (i = 0; i < mpu_irqs_cnt; i++) {
unsigned int irq;
if (oh->xlate_irq)
irq = oh->xlate_irq((oh->mpu_irqs + i)->irq);
else
irq = (oh->mpu_irqs + i)->irq;
(res + r)->name = (oh->mpu_irqs + i)->name; (res + r)->name = (oh->mpu_irqs + i)->name;
(res + r)->start = (oh->mpu_irqs + i)->irq; (res + r)->start = irq;
(res + r)->end = (oh->mpu_irqs + i)->irq; (res + r)->end = irq;
(res + r)->flags = IORESOURCE_IRQ; (res + r)->flags = IORESOURCE_IRQ;
r++; r++;
} }
......
...@@ -676,6 +676,7 @@ struct omap_hwmod { ...@@ -676,6 +676,7 @@ struct omap_hwmod {
spinlock_t _lock; spinlock_t _lock;
struct list_head node; struct list_head node;
struct omap_hwmod_ocp_if *_mpu_port; struct omap_hwmod_ocp_if *_mpu_port;
unsigned int (*xlate_irq)(unsigned int);
u16 flags; u16 flags;
u8 mpu_rt_idx; u8 mpu_rt_idx;
u8 response_lat; u8 response_lat;
......
...@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = { ...@@ -479,6 +479,7 @@ static struct omap_hwmod omap44xx_dma_system_hwmod = {
.class = &omap44xx_dma_hwmod_class, .class = &omap44xx_dma_hwmod_class,
.clkdm_name = "l3_dma_clkdm", .clkdm_name = "l3_dma_clkdm",
.mpu_irqs = omap44xx_dma_system_irqs, .mpu_irqs = omap44xx_dma_system_irqs,
.xlate_irq = omap4_xlate_irq,
.main_clk = "l3_div_ck", .main_clk = "l3_div_ck",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
...@@ -640,6 +641,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = { ...@@ -640,6 +641,7 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = {
.class = &omap44xx_dispc_hwmod_class, .class = &omap44xx_dispc_hwmod_class,
.clkdm_name = "l3_dss_clkdm", .clkdm_name = "l3_dss_clkdm",
.mpu_irqs = omap44xx_dss_dispc_irqs, .mpu_irqs = omap44xx_dss_dispc_irqs,
.xlate_irq = omap4_xlate_irq,
.sdma_reqs = omap44xx_dss_dispc_sdma_reqs, .sdma_reqs = omap44xx_dss_dispc_sdma_reqs,
.main_clk = "dss_dss_clk", .main_clk = "dss_dss_clk",
.prcm = { .prcm = {
...@@ -693,6 +695,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = { ...@@ -693,6 +695,7 @@ static struct omap_hwmod omap44xx_dss_dsi1_hwmod = {
.class = &omap44xx_dsi_hwmod_class, .class = &omap44xx_dsi_hwmod_class,
.clkdm_name = "l3_dss_clkdm", .clkdm_name = "l3_dss_clkdm",
.mpu_irqs = omap44xx_dss_dsi1_irqs, .mpu_irqs = omap44xx_dss_dsi1_irqs,
.xlate_irq = omap4_xlate_irq,
.sdma_reqs = omap44xx_dss_dsi1_sdma_reqs, .sdma_reqs = omap44xx_dss_dsi1_sdma_reqs,
.main_clk = "dss_dss_clk", .main_clk = "dss_dss_clk",
.prcm = { .prcm = {
...@@ -726,6 +729,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = { ...@@ -726,6 +729,7 @@ static struct omap_hwmod omap44xx_dss_dsi2_hwmod = {
.class = &omap44xx_dsi_hwmod_class, .class = &omap44xx_dsi_hwmod_class,
.clkdm_name = "l3_dss_clkdm", .clkdm_name = "l3_dss_clkdm",
.mpu_irqs = omap44xx_dss_dsi2_irqs, .mpu_irqs = omap44xx_dss_dsi2_irqs,
.xlate_irq = omap4_xlate_irq,
.sdma_reqs = omap44xx_dss_dsi2_sdma_reqs, .sdma_reqs = omap44xx_dss_dsi2_sdma_reqs,
.main_clk = "dss_dss_clk", .main_clk = "dss_dss_clk",
.prcm = { .prcm = {
...@@ -784,6 +788,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = { ...@@ -784,6 +788,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = {
*/ */
.flags = HWMOD_SWSUP_SIDLE, .flags = HWMOD_SWSUP_SIDLE,
.mpu_irqs = omap44xx_dss_hdmi_irqs, .mpu_irqs = omap44xx_dss_hdmi_irqs,
.xlate_irq = omap4_xlate_irq,
.sdma_reqs = omap44xx_dss_hdmi_sdma_reqs, .sdma_reqs = omap44xx_dss_hdmi_sdma_reqs,
.main_clk = "dss_48mhz_clk", .main_clk = "dss_48mhz_clk",
.prcm = { .prcm = {
......
...@@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = { ...@@ -288,6 +288,7 @@ static struct omap_hwmod omap54xx_dma_system_hwmod = {
.class = &omap54xx_dma_hwmod_class, .class = &omap54xx_dma_hwmod_class,
.clkdm_name = "dma_clkdm", .clkdm_name = "dma_clkdm",
.mpu_irqs = omap54xx_dma_system_irqs, .mpu_irqs = omap54xx_dma_system_irqs,
.xlate_irq = omap4_xlate_irq,
.main_clk = "l3_iclk_div", .main_clk = "l3_iclk_div",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
......
...@@ -498,6 +498,7 @@ struct omap_prcm_irq_setup { ...@@ -498,6 +498,7 @@ struct omap_prcm_irq_setup {
u8 nr_irqs; u8 nr_irqs;
const struct omap_prcm_irq *irqs; const struct omap_prcm_irq *irqs;
int irq; int irq;
unsigned int (*xlate_irq)(unsigned int);
void (*read_pending_irqs)(unsigned long *events); void (*read_pending_irqs)(unsigned long *events);
void (*ocp_barrier)(void); void (*ocp_barrier)(void);
void (*save_and_clear_irqen)(u32 *saved_mask); void (*save_and_clear_irqen)(u32 *saved_mask);
......
...@@ -49,6 +49,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = { ...@@ -49,6 +49,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {
.irqs = omap4_prcm_irqs, .irqs = omap4_prcm_irqs,
.nr_irqs = ARRAY_SIZE(omap4_prcm_irqs), .nr_irqs = ARRAY_SIZE(omap4_prcm_irqs),
.irq = 11 + OMAP44XX_IRQ_GIC_START, .irq = 11 + OMAP44XX_IRQ_GIC_START,
.xlate_irq = omap4_xlate_irq,
.read_pending_irqs = &omap44xx_prm_read_pending_irqs, .read_pending_irqs = &omap44xx_prm_read_pending_irqs,
.ocp_barrier = &omap44xx_prm_ocp_barrier, .ocp_barrier = &omap44xx_prm_ocp_barrier,
.save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen, .save_and_clear_irqen = &omap44xx_prm_save_and_clear_irqen,
...@@ -751,8 +752,10 @@ static int omap44xx_prm_late_init(void) ...@@ -751,8 +752,10 @@ static int omap44xx_prm_late_init(void)
} }
/* Once OMAP4 DT is filled as well */ /* Once OMAP4 DT is filled as well */
if (irq_num >= 0) if (irq_num >= 0) {
omap4_prcm_irq_setup.irq = irq_num; omap4_prcm_irq_setup.irq = irq_num;
omap4_prcm_irq_setup.xlate_irq = NULL;
}
} }
omap44xx_prm_enable_io_wakeup(); omap44xx_prm_enable_io_wakeup();
......
...@@ -187,6 +187,7 @@ int omap_prcm_event_to_irq(const char *name) ...@@ -187,6 +187,7 @@ int omap_prcm_event_to_irq(const char *name)
*/ */
void omap_prcm_irq_cleanup(void) void omap_prcm_irq_cleanup(void)
{ {
unsigned int irq;
int i; int i;
if (!prcm_irq_setup) { if (!prcm_irq_setup) {
...@@ -211,7 +212,11 @@ void omap_prcm_irq_cleanup(void) ...@@ -211,7 +212,11 @@ void omap_prcm_irq_cleanup(void)
kfree(prcm_irq_setup->priority_mask); kfree(prcm_irq_setup->priority_mask);
prcm_irq_setup->priority_mask = NULL; prcm_irq_setup->priority_mask = NULL;
irq_set_chained_handler(prcm_irq_setup->irq, NULL); if (prcm_irq_setup->xlate_irq)
irq = prcm_irq_setup->xlate_irq(prcm_irq_setup->irq);
else
irq = prcm_irq_setup->irq;
irq_set_chained_handler(irq, NULL);
if (prcm_irq_setup->base_irq > 0) if (prcm_irq_setup->base_irq > 0)
irq_free_descs(prcm_irq_setup->base_irq, irq_free_descs(prcm_irq_setup->base_irq,
...@@ -259,6 +264,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) ...@@ -259,6 +264,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
int offset, i; int offset, i;
struct irq_chip_generic *gc; struct irq_chip_generic *gc;
struct irq_chip_type *ct; struct irq_chip_type *ct;
unsigned int irq;
if (!irq_setup) if (!irq_setup)
return -EINVAL; return -EINVAL;
...@@ -298,7 +304,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) ...@@ -298,7 +304,11 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup)
1 << (offset & 0x1f); 1 << (offset & 0x1f);
} }
irq_set_chained_handler(irq_setup->irq, omap_prcm_irq_handler); if (irq_setup->xlate_irq)
irq = irq_setup->xlate_irq(irq_setup->irq);
else
irq = irq_setup->irq;
irq_set_chained_handler(irq, omap_prcm_irq_handler);
irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32,
0); 0);
......
...@@ -66,19 +66,24 @@ void __init omap_pmic_init(int bus, u32 clkrate, ...@@ -66,19 +66,24 @@ void __init omap_pmic_init(int bus, u32 clkrate,
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
} }
#ifdef CONFIG_ARCH_OMAP4
void __init omap4_pmic_init(const char *pmic_type, void __init omap4_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data, struct twl4030_platform_data *pmic_data,
struct i2c_board_info *devices, int nr_devices) struct i2c_board_info *devices, int nr_devices)
{ {
/* PMIC part*/ /* PMIC part*/
unsigned int irq;
omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT);
omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data); irq = omap4_xlate_irq(7 + OMAP44XX_IRQ_GIC_START);
omap_pmic_init(1, 400, pmic_type, irq, pmic_data);
/* Register additional devices on i2c1 bus if needed */ /* Register additional devices on i2c1 bus if needed */
if (devices) if (devices)
i2c_register_board_info(1, devices, nr_devices); i2c_register_board_info(1, devices, nr_devices);
} }
#endif
void __init omap_pmic_late_init(void) void __init omap_pmic_late_init(void)
{ {
......
...@@ -576,11 +576,18 @@ void __init r8a7778_init_irq_extpin(int irlm) ...@@ -576,11 +576,18 @@ void __init r8a7778_init_irq_extpin(int irlm)
void __init r8a7778_init_irq_dt(void) void __init r8a7778_init_irq_dt(void)
{ {
void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
void __iomem *gic_dist_base = ioremap_nocache(0xfe438000, 0x1000);
void __iomem *gic_cpu_base = ioremap_nocache(0xfe430000, 0x1000);
#endif
BUG_ON(!base); BUG_ON(!base);
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
gic_init(0, 29, gic_dist_base, gic_cpu_base);
#else
irqchip_init(); irqchip_init();
#endif
/* route all interrupts to ARM */ /* route all interrupts to ARM */
__raw_writel(0x73ffffff, base + INT2NTSR0); __raw_writel(0x73ffffff, base + INT2NTSR0);
__raw_writel(0xffffffff, base + INT2NTSR1); __raw_writel(0xffffffff, base + INT2NTSR1);
......
...@@ -720,10 +720,17 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on) ...@@ -720,10 +720,17 @@ static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
void __init r8a7779_init_irq_dt(void) void __init r8a7779_init_irq_dt(void)
{ {
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
void __iomem *gic_dist_base = ioremap_nocache(0xf0001000, 0x1000);
void __iomem *gic_cpu_base = ioremap_nocache(0xf0000100, 0x1000);
#endif
gic_arch_extn.irq_set_wake = r8a7779_set_wake; gic_arch_extn.irq_set_wake = r8a7779_set_wake;
#ifdef CONFIG_ARCH_SHMOBILE_LEGACY
gic_init(0, 29, gic_dist_base, gic_cpu_base);
#else
irqchip_init(); irqchip_init();
#endif
/* route all interrupts to ARM */ /* route all interrupts to ARM */
__raw_writel(0xffffffff, INT2NTSR0); __raw_writel(0xffffffff, INT2NTSR0);
__raw_writel(0x3fffffff, INT2NTSR1); __raw_writel(0x3fffffff, INT2NTSR1);
......
...@@ -22,7 +22,7 @@ aliases { ...@@ -22,7 +22,7 @@ aliases {
}; };
chosen { chosen {
stdout-path = &soc_uart0; stdout-path = "serial0:115200n8";
}; };
psci { psci {
......
...@@ -210,12 +210,25 @@ static void mvebu_mbus_disable_window(struct mvebu_mbus_state *mbus, ...@@ -210,12 +210,25 @@ static void mvebu_mbus_disable_window(struct mvebu_mbus_state *mbus,
} }
/* Checks whether the given window number is available */ /* Checks whether the given window number is available */
/* On Armada XP, 375 and 38x the MBus window 13 has the remap
* capability, like windows 0 to 7. However, the mvebu-mbus driver
* isn't currently taking into account this special case, which means
* that when window 13 is actually used, the remap registers are left
* to 0, making the device using this MBus window unavailable. The
* quick fix for stable is to not use window 13. A follow up patch
* will correctly handle this window.
*/
static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus, static int mvebu_mbus_window_is_free(struct mvebu_mbus_state *mbus,
const int win) const int win)
{ {
void __iomem *addr = mbus->mbuswins_base + void __iomem *addr = mbus->mbuswins_base +
mbus->soc->win_cfg_offset(win); mbus->soc->win_cfg_offset(win);
u32 ctrl = readl(addr + WIN_CTRL_OFF); u32 ctrl = readl(addr + WIN_CTRL_OFF);
if (win == 13)
return false;
return !(ctrl & WIN_CTRL_ENABLE); return !(ctrl & WIN_CTRL_ENABLE);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment