Commit 1c6ba37b authored by Linus Torvalds's avatar Linus Torvalds

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

Pull ARM SoC bug fixes from Arnd Bergmann:
 "Things are calming down for arm-soc as well.  This set of bug fixes is
  dominated in size by the at91 platform bug fixes.  Some of them were
  meant to go through the framebuffer tree during the merge window, but
  since the framebuffer maintainer could not be reached, I offered to
  take them here.  The other notable at91 change is the addition of
  pinctrl definitions to fix the NAND controller.

  The rest are mostly simple regression fixes:

   - Our removal of VIRT_TO_BUS conflicted with Stephen Rothwell's
     renaming of the Kconfig symbol.  You will get a trivial merge
     conflict here, we still want to remove it.
   - missing bits for clocks on imx and s5pv210
   - missing header inclusions in mmp and shmobile
   - typos in s5pv210 camera and vt8500 clock support code

  and three trivial fixes for pre-3.8 bugs:

   - an old bogus build warning in the joystick driver
   - a misleading Kconfig description
   - a NULL pointer check on davinci"

* tag 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  ARM: fix CONFIG_VIRT_TO_BUS handling
  ARM: i.MX35: enable MAX clock
  ARM: Scorpion is a v7 architecture, not v6
  ARM: mmp: add platform_device head file in gplugd
  input/joystick: use get_cycles on ARM
  [media] s5p-fimc: fix s5pv210 build
  clk: vt8500: Fix "fix device clock divisor calculations"
  ARM: i.MX25: Fix DT compilation
  ARM: at91: fix infinite loop in at91_irq_suspend/resume
  ARM: at91: add gpio suspend/resume support when using pinctrl
  ARM: at91: fix LCD-wiring mode
  atmel_lcdfb: fix 16-bpp modes on older SOCs
  ARM: at91: dt: at91sam9x5: complete NAND pinctrl
  ARM: at91: dt: at91sam9x5: correct NAND pins comments
  ARM: davinci: edma: fix dmaengine induced null pointer dereference on da830
  ARM: shmobile: marzen: Include mmc/host.h
  ARM: EXYNOS: Add #dma-cells for generic dma binding support for PL330
  ARM: S5PV210: Fix PL330 DMA controller clkdev entries
parents a15cd063 b4811bac
...@@ -49,7 +49,6 @@ config ARM ...@@ -49,7 +49,6 @@ config ARM
select HAVE_REGS_AND_STACK_ACCESS_API select HAVE_REGS_AND_STACK_ACCESS_API
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select HAVE_UID16 select HAVE_UID16
select VIRT_TO_BUS
select KTIME_SCALAR select KTIME_SCALAR
select PERF_USE_VMALLOC select PERF_USE_VMALLOC
select RTC_LIB select RTC_LIB
...@@ -743,6 +742,7 @@ config ARCH_RPC ...@@ -743,6 +742,7 @@ config ARCH_RPC
select NEED_MACH_IO_H select NEED_MACH_IO_H
select NEED_MACH_MEMORY_H select NEED_MACH_MEMORY_H
select NO_IOPORT select NO_IOPORT
select VIRT_TO_BUS
help help
On the Acorn Risc-PC, Linux can support the internal IDE disk and On the Acorn Risc-PC, Linux can support the internal IDE disk and
CD-ROM interface, serial and parallel port, and the floppy drive. CD-ROM interface, serial and parallel port, and the floppy drive.
...@@ -878,6 +878,7 @@ config ARCH_SHARK ...@@ -878,6 +878,7 @@ config ARCH_SHARK
select ISA_DMA select ISA_DMA
select NEED_MACH_MEMORY_H select NEED_MACH_MEMORY_H
select PCI select PCI
select VIRT_TO_BUS
select ZONE_DMA select ZONE_DMA
help help
Support for the StrongARM based Digital DNARD machine, also known Support for the StrongARM based Digital DNARD machine, also known
...@@ -1005,12 +1006,12 @@ config ARCH_MULTI_V4_V5 ...@@ -1005,12 +1006,12 @@ config ARCH_MULTI_V4_V5
bool bool
config ARCH_MULTI_V6 config ARCH_MULTI_V6
bool "ARMv6 based platforms (ARM11, Scorpion, ...)" bool "ARMv6 based platforms (ARM11)"
select ARCH_MULTI_V6_V7 select ARCH_MULTI_V6_V7
select CPU_V6 select CPU_V6
config ARCH_MULTI_V7 config ARCH_MULTI_V7
bool "ARMv7 based platforms (Cortex-A, PJ4, Krait)" bool "ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait)"
default y default y
select ARCH_MULTI_V6_V7 select ARCH_MULTI_V6_V7
select ARCH_VEXPRESS select ARCH_VEXPRESS
...@@ -1461,10 +1462,6 @@ config ISA_DMA ...@@ -1461,10 +1462,6 @@ config ISA_DMA
bool bool
select ISA_DMA_API select ISA_DMA_API
config ARCH_NO_VIRT_TO_BUS
def_bool y
depends on !ARCH_RPC && !ARCH_NETWINDER && !ARCH_SHARK
# Select ISA DMA interface # Select ISA DMA interface
config ISA_DMA_API config ISA_DMA_API
bool bool
......
...@@ -238,8 +238,32 @@ pinctrl_uart1: uart1-0 { ...@@ -238,8 +238,32 @@ pinctrl_uart1: uart1-0 {
nand { nand {
pinctrl_nand: nand-0 { pinctrl_nand: nand-0 {
atmel,pins = atmel,pins =
<3 4 0x0 0x1 /* PD5 gpio RDY pin pull_up */ <3 0 0x1 0x0 /* PD0 periph A Read Enable */
3 5 0x0 0x1>; /* PD4 gpio enable pin pull_up */ 3 1 0x1 0x0 /* PD1 periph A Write Enable */
3 2 0x1 0x0 /* PD2 periph A Address Latch Enable */
3 3 0x1 0x0 /* PD3 periph A Command Latch Enable */
3 4 0x0 0x1 /* PD4 gpio Chip Enable pin pull_up */
3 5 0x0 0x1 /* PD5 gpio RDY/BUSY pin pull_up */
3 6 0x1 0x0 /* PD6 periph A Data bit 0 */
3 7 0x1 0x0 /* PD7 periph A Data bit 1 */
3 8 0x1 0x0 /* PD8 periph A Data bit 2 */
3 9 0x1 0x0 /* PD9 periph A Data bit 3 */
3 10 0x1 0x0 /* PD10 periph A Data bit 4 */
3 11 0x1 0x0 /* PD11 periph A Data bit 5 */
3 12 0x1 0x0 /* PD12 periph A Data bit 6 */
3 13 0x1 0x0>; /* PD13 periph A Data bit 7 */
};
pinctrl_nand_16bits: nand_16bits-0 {
atmel,pins =
<3 14 0x1 0x0 /* PD14 periph A Data bit 8 */
3 15 0x1 0x0 /* PD15 periph A Data bit 9 */
3 16 0x1 0x0 /* PD16 periph A Data bit 10 */
3 17 0x1 0x0 /* PD17 periph A Data bit 11 */
3 18 0x1 0x0 /* PD18 periph A Data bit 12 */
3 19 0x1 0x0 /* PD19 periph A Data bit 13 */
3 20 0x1 0x0 /* PD20 periph A Data bit 14 */
3 21 0x1 0x0>; /* PD21 periph A Data bit 15 */
}; };
}; };
......
...@@ -275,18 +275,27 @@ pdma0: pdma@12680000 { ...@@ -275,18 +275,27 @@ pdma0: pdma@12680000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x12680000 0x1000>; reg = <0x12680000 0x1000>;
interrupts = <0 35 0>; interrupts = <0 35 0>;
#dma-cells = <1>;
#dma-channels = <8>;
#dma-requests = <32>;
}; };
pdma1: pdma@12690000 { pdma1: pdma@12690000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x12690000 0x1000>; reg = <0x12690000 0x1000>;
interrupts = <0 36 0>; interrupts = <0 36 0>;
#dma-cells = <1>;
#dma-channels = <8>;
#dma-requests = <32>;
}; };
mdma1: mdma@12850000 { mdma1: mdma@12850000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x12850000 0x1000>; reg = <0x12850000 0x1000>;
interrupts = <0 34 0>; interrupts = <0 34 0>;
#dma-cells = <1>;
#dma-channels = <8>;
#dma-requests = <1>;
}; };
}; };
}; };
...@@ -142,12 +142,18 @@ pdma0: pdma@121A0000 { ...@@ -142,12 +142,18 @@ pdma0: pdma@121A0000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x120000 0x1000>; reg = <0x120000 0x1000>;
interrupts = <0 34 0>; interrupts = <0 34 0>;
#dma-cells = <1>;
#dma-channels = <8>;
#dma-requests = <32>;
}; };
pdma1: pdma@121B0000 { pdma1: pdma@121B0000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x121000 0x1000>; reg = <0x121000 0x1000>;
interrupts = <0 35 0>; interrupts = <0 35 0>;
#dma-cells = <1>;
#dma-channels = <8>;
#dma-requests = <32>;
}; };
}; };
......
...@@ -209,6 +209,14 @@ extern int at91_get_gpio_value(unsigned pin); ...@@ -209,6 +209,14 @@ extern int at91_get_gpio_value(unsigned pin);
extern void at91_gpio_suspend(void); extern void at91_gpio_suspend(void);
extern void at91_gpio_resume(void); extern void at91_gpio_resume(void);
#ifdef CONFIG_PINCTRL_AT91
extern void at91_pinctrl_gpio_suspend(void);
extern void at91_pinctrl_gpio_resume(void);
#else
static inline void at91_pinctrl_gpio_suspend(void) {}
static inline void at91_pinctrl_gpio_resume(void) {}
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif #endif
...@@ -92,23 +92,21 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value) ...@@ -92,23 +92,21 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value)
void at91_irq_suspend(void) void at91_irq_suspend(void)
{ {
int i = 0, bit; int bit = -1;
if (has_aic5()) { if (has_aic5()) {
/* disable enabled irqs */ /* disable enabled irqs */
while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {
at91_aic_write(AT91_AIC5_SSR, at91_aic_write(AT91_AIC5_SSR,
bit & AT91_AIC5_INTSEL_MSK); bit & AT91_AIC5_INTSEL_MSK);
at91_aic_write(AT91_AIC5_IDCR, 1); at91_aic_write(AT91_AIC5_IDCR, 1);
i = bit;
} }
/* enable wakeup irqs */ /* enable wakeup irqs */
i = 0; bit = -1;
while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {
at91_aic_write(AT91_AIC5_SSR, at91_aic_write(AT91_AIC5_SSR,
bit & AT91_AIC5_INTSEL_MSK); bit & AT91_AIC5_INTSEL_MSK);
at91_aic_write(AT91_AIC5_IECR, 1); at91_aic_write(AT91_AIC5_IECR, 1);
i = bit;
} }
} else { } else {
at91_aic_write(AT91_AIC_IDCR, *backups); at91_aic_write(AT91_AIC_IDCR, *backups);
...@@ -118,23 +116,21 @@ void at91_irq_suspend(void) ...@@ -118,23 +116,21 @@ void at91_irq_suspend(void)
void at91_irq_resume(void) void at91_irq_resume(void)
{ {
int i = 0, bit; int bit = -1;
if (has_aic5()) { if (has_aic5()) {
/* disable wakeup irqs */ /* disable wakeup irqs */
while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) { while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {
at91_aic_write(AT91_AIC5_SSR, at91_aic_write(AT91_AIC5_SSR,
bit & AT91_AIC5_INTSEL_MSK); bit & AT91_AIC5_INTSEL_MSK);
at91_aic_write(AT91_AIC5_IDCR, 1); at91_aic_write(AT91_AIC5_IDCR, 1);
i = bit;
} }
/* enable irqs disabled for suspend */ /* enable irqs disabled for suspend */
i = 0; bit = -1;
while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) { while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {
at91_aic_write(AT91_AIC5_SSR, at91_aic_write(AT91_AIC5_SSR,
bit & AT91_AIC5_INTSEL_MSK); bit & AT91_AIC5_INTSEL_MSK);
at91_aic_write(AT91_AIC5_IECR, 1); at91_aic_write(AT91_AIC5_IECR, 1);
i = bit;
} }
} else { } else {
at91_aic_write(AT91_AIC_IDCR, *wakeups); at91_aic_write(AT91_AIC_IDCR, *wakeups);
......
...@@ -201,7 +201,10 @@ extern u32 at91_slow_clock_sz; ...@@ -201,7 +201,10 @@ extern u32 at91_slow_clock_sz;
static int at91_pm_enter(suspend_state_t state) static int at91_pm_enter(suspend_state_t state)
{ {
at91_gpio_suspend(); if (of_have_populated_dt())
at91_pinctrl_gpio_suspend();
else
at91_gpio_suspend();
at91_irq_suspend(); at91_irq_suspend();
pr_debug("AT91: PM - wake mask %08x, pm state %d\n", pr_debug("AT91: PM - wake mask %08x, pm state %d\n",
...@@ -286,7 +289,10 @@ static int at91_pm_enter(suspend_state_t state) ...@@ -286,7 +289,10 @@ static int at91_pm_enter(suspend_state_t state)
error: error:
target_state = PM_SUSPEND_ON; target_state = PM_SUSPEND_ON;
at91_irq_resume(); at91_irq_resume();
at91_gpio_resume(); if (of_have_populated_dt())
at91_pinctrl_gpio_resume();
else
at91_gpio_resume();
return 0; return 0;
} }
......
...@@ -743,6 +743,9 @@ EXPORT_SYMBOL(edma_free_channel); ...@@ -743,6 +743,9 @@ EXPORT_SYMBOL(edma_free_channel);
*/ */
int edma_alloc_slot(unsigned ctlr, int slot) int edma_alloc_slot(unsigned ctlr, int slot)
{ {
if (!edma_cc[ctlr])
return -EINVAL;
if (slot >= 0) if (slot >= 0)
slot = EDMA_CHAN_SLOT(slot); slot = EDMA_CHAN_SLOT(slot);
......
...@@ -67,6 +67,7 @@ config ARCH_NETWINDER ...@@ -67,6 +67,7 @@ config ARCH_NETWINDER
select ISA select ISA
select ISA_DMA select ISA_DMA
select PCI select PCI
select VIRT_TO_BUS
help help
Say Y here if you intend to run this kernel on the Rebel.COM Say Y here if you intend to run this kernel on the Rebel.COM
NetWinder. Information about this machine can be found at: NetWinder. Information about this machine can be found at:
......
...@@ -264,6 +264,7 @@ int __init mx35_clocks_init(void) ...@@ -264,6 +264,7 @@ int __init mx35_clocks_init(void)
clk_prepare_enable(clk[gpio3_gate]); clk_prepare_enable(clk[gpio3_gate]);
clk_prepare_enable(clk[iim_gate]); clk_prepare_enable(clk[iim_gate]);
clk_prepare_enable(clk[emi_gate]); clk_prepare_enable(clk[emi_gate]);
clk_prepare_enable(clk[max_gate]);
/* /*
* SCC is needed to boot via mmc after a watchdog reset. The clock code * SCC is needed to boot via mmc after a watchdog reset. The clock code
......
...@@ -27,6 +27,11 @@ static const char * const imx25_dt_board_compat[] __initconst = { ...@@ -27,6 +27,11 @@ static const char * const imx25_dt_board_compat[] __initconst = {
NULL NULL
}; };
static void __init imx25_timer_init(void)
{
mx25_clocks_init_dt();
}
DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)") DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)")
.map_io = mx25_map_io, .map_io = mx25_map_io,
.init_early = imx25_init_early, .init_early = imx25_init_early,
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
......
...@@ -214,11 +214,6 @@ static struct clk clk_pcmcdclk2 = { ...@@ -214,11 +214,6 @@ static struct clk clk_pcmcdclk2 = {
.name = "pcmcdclk", .name = "pcmcdclk",
}; };
static struct clk dummy_apb_pclk = {
.name = "apb_pclk",
.id = -1,
};
static struct clk *clkset_vpllsrc_list[] = { static struct clk *clkset_vpllsrc_list[] = {
[0] = &clk_fin_vpll, [0] = &clk_fin_vpll,
[1] = &clk_sclk_hdmi27m, [1] = &clk_sclk_hdmi27m,
...@@ -305,18 +300,6 @@ static struct clk_ops clk_fout_apll_ops = { ...@@ -305,18 +300,6 @@ static struct clk_ops clk_fout_apll_ops = {
static struct clk init_clocks_off[] = { static struct clk init_clocks_off[] = {
{ {
.name = "dma",
.devname = "dma-pl330.0",
.parent = &clk_hclk_psys.clk,
.enable = s5pv210_clk_ip0_ctrl,
.ctrlbit = (1 << 3),
}, {
.name = "dma",
.devname = "dma-pl330.1",
.parent = &clk_hclk_psys.clk,
.enable = s5pv210_clk_ip0_ctrl,
.ctrlbit = (1 << 4),
}, {
.name = "rot", .name = "rot",
.parent = &clk_hclk_dsys.clk, .parent = &clk_hclk_dsys.clk,
.enable = s5pv210_clk_ip0_ctrl, .enable = s5pv210_clk_ip0_ctrl,
...@@ -573,6 +556,20 @@ static struct clk clk_hsmmc3 = { ...@@ -573,6 +556,20 @@ static struct clk clk_hsmmc3 = {
.ctrlbit = (1<<19), .ctrlbit = (1<<19),
}; };
static struct clk clk_pdma0 = {
.name = "pdma0",
.parent = &clk_hclk_psys.clk,
.enable = s5pv210_clk_ip0_ctrl,
.ctrlbit = (1 << 3),
};
static struct clk clk_pdma1 = {
.name = "pdma1",
.parent = &clk_hclk_psys.clk,
.enable = s5pv210_clk_ip0_ctrl,
.ctrlbit = (1 << 4),
};
static struct clk *clkset_uart_list[] = { static struct clk *clkset_uart_list[] = {
[6] = &clk_mout_mpll.clk, [6] = &clk_mout_mpll.clk,
[7] = &clk_mout_epll.clk, [7] = &clk_mout_epll.clk,
...@@ -1075,6 +1072,8 @@ static struct clk *clk_cdev[] = { ...@@ -1075,6 +1072,8 @@ static struct clk *clk_cdev[] = {
&clk_hsmmc1, &clk_hsmmc1,
&clk_hsmmc2, &clk_hsmmc2,
&clk_hsmmc3, &clk_hsmmc3,
&clk_pdma0,
&clk_pdma1,
}; };
/* Clock initialisation code */ /* Clock initialisation code */
...@@ -1333,6 +1332,8 @@ static struct clk_lookup s5pv210_clk_lookup[] = { ...@@ -1333,6 +1332,8 @@ static struct clk_lookup s5pv210_clk_lookup[] = {
CLKDEV_INIT(NULL, "spi_busclk0", &clk_p), CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk), CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk), CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
CLKDEV_INIT("dma-pl330.0", "apb_pclk", &clk_pdma0),
CLKDEV_INIT("dma-pl330.1", "apb_pclk", &clk_pdma1),
}; };
void __init s5pv210_register_clocks(void) void __init s5pv210_register_clocks(void)
...@@ -1361,6 +1362,5 @@ void __init s5pv210_register_clocks(void) ...@@ -1361,6 +1362,5 @@ void __init s5pv210_register_clocks(void)
for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++) for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
s3c_disable_clocks(clk_cdev[ptr], 1); s3c_disable_clocks(clk_cdev[ptr], 1);
s3c24xx_register_clock(&dummy_apb_pclk);
s3c_pwmclk_init(); s3c_pwmclk_init();
} }
...@@ -845,7 +845,7 @@ static struct fimc_source_info goni_camera_sensors[] = { ...@@ -845,7 +845,7 @@ static struct fimc_source_info goni_camera_sensors[] = {
.mux_id = 0, .mux_id = 0,
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
V4L2_MBUS_VSYNC_ACTIVE_LOW, V4L2_MBUS_VSYNC_ACTIVE_LOW,
.bus_type = FIMC_BUS_TYPE_ITU_601, .fimc_bus_type = FIMC_BUS_TYPE_ITU_601,
.board_info = &noon010pc30_board_info, .board_info = &noon010pc30_board_info,
.i2c_bus_num = 0, .i2c_bus_num = 0,
.clk_frequency = 16000000UL, .clk_frequency = 16000000UL,
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/sh_hspi.h> #include <linux/spi/sh_hspi.h>
#include <linux/mmc/host.h>
#include <linux/mmc/sh_mobile_sdhi.h> #include <linux/mmc/sh_mobile_sdhi.h>
#include <linux/mfd/tmio.h> #include <linux/mfd/tmio.h>
#include <linux/usb/otg.h> #include <linux/usb/otg.h>
......
...@@ -157,7 +157,7 @@ static int vt8500_dclk_set_rate(struct clk_hw *hw, unsigned long rate, ...@@ -157,7 +157,7 @@ static int vt8500_dclk_set_rate(struct clk_hw *hw, unsigned long rate,
divisor = parent_rate / rate; divisor = parent_rate / rate;
/* If prate / rate would be decimal, incr the divisor */ /* If prate / rate would be decimal, incr the divisor */
if (rate * divisor < *prate) if (rate * divisor < parent_rate)
divisor++; divisor++;
if (divisor == cdev->div_mask + 1) if (divisor == cdev->div_mask + 1)
......
...@@ -158,14 +158,10 @@ static unsigned int get_time_pit(void) ...@@ -158,14 +158,10 @@ static unsigned int get_time_pit(void)
#define GET_TIME(x) rdtscl(x) #define GET_TIME(x) rdtscl(x)
#define DELTA(x,y) ((y)-(x)) #define DELTA(x,y) ((y)-(x))
#define TIME_NAME "TSC" #define TIME_NAME "TSC"
#elif defined(__alpha__) #elif defined(__alpha__) || defined(CONFIG_MN10300) || defined(CONFIG_ARM) || defined(CONFIG_TILE)
#define GET_TIME(x) do { x = get_cycles(); } while (0) #define GET_TIME(x) do { x = get_cycles(); } while (0)
#define DELTA(x,y) ((y)-(x)) #define DELTA(x,y) ((y)-(x))
#define TIME_NAME "PCC" #define TIME_NAME "get_cycles"
#elif defined(CONFIG_MN10300) || defined(CONFIG_TILE)
#define GET_TIME(x) do { x = get_cycles(); } while (0)
#define DELTA(x, y) ((x) - (y))
#define TIME_NAME "TSC"
#else #else
#define FAKE_TIME #define FAKE_TIME
static unsigned long analog_faketime = 0; static unsigned long analog_faketime = 0;
......
...@@ -1277,21 +1277,80 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type) ...@@ -1277,21 +1277,80 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static u32 wakeups[MAX_GPIO_BANKS];
static u32 backups[MAX_GPIO_BANKS];
static int gpio_irq_set_wake(struct irq_data *d, unsigned state) static int gpio_irq_set_wake(struct irq_data *d, unsigned state)
{ {
struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d);
unsigned bank = at91_gpio->pioc_idx; unsigned bank = at91_gpio->pioc_idx;
unsigned mask = 1 << d->hwirq;
if (unlikely(bank >= MAX_GPIO_BANKS)) if (unlikely(bank >= MAX_GPIO_BANKS))
return -EINVAL; return -EINVAL;
if (state)
wakeups[bank] |= mask;
else
wakeups[bank] &= ~mask;
irq_set_irq_wake(at91_gpio->pioc_virq, state); irq_set_irq_wake(at91_gpio->pioc_virq, state);
return 0; return 0;
} }
void at91_pinctrl_gpio_suspend(void)
{
int i;
for (i = 0; i < gpio_banks; i++) {
void __iomem *pio;
if (!gpio_chips[i])
continue;
pio = gpio_chips[i]->regbase;
backups[i] = __raw_readl(pio + PIO_IMR);
__raw_writel(backups[i], pio + PIO_IDR);
__raw_writel(wakeups[i], pio + PIO_IER);
if (!wakeups[i]) {
clk_unprepare(gpio_chips[i]->clock);
clk_disable(gpio_chips[i]->clock);
} else {
printk(KERN_DEBUG "GPIO-%c may wake for %08x\n",
'A'+i, wakeups[i]);
}
}
}
void at91_pinctrl_gpio_resume(void)
{
int i;
for (i = 0; i < gpio_banks; i++) {
void __iomem *pio;
if (!gpio_chips[i])
continue;
pio = gpio_chips[i]->regbase;
if (!wakeups[i]) {
if (clk_prepare(gpio_chips[i]->clock) == 0)
clk_enable(gpio_chips[i]->clock);
}
__raw_writel(wakeups[i], pio + PIO_IDR);
__raw_writel(backups[i], pio + PIO_IER);
}
}
#else #else
#define gpio_irq_set_wake NULL #define gpio_irq_set_wake NULL
#endif #endif /* CONFIG_PM */
static struct irq_chip gpio_irqchip = { static struct irq_chip gpio_irqchip = {
.name = "GPIO", .name = "GPIO",
......
...@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var, ...@@ -422,17 +422,22 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,
= var->bits_per_pixel; = var->bits_per_pixel;
break; break;
case 16: case 16:
/* Older SOCs use IBGR:555 rather than BGR:565. */
if (sinfo->have_intensity_bit)
var->green.length = 5;
else
var->green.length = 6;
if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) { if (sinfo->lcd_wiring_mode == ATMEL_LCDC_WIRING_RGB) {
/* RGB:565 mode */ /* RGB:5X5 mode */
var->red.offset = 11; var->red.offset = var->green.length + 5;
var->blue.offset = 0; var->blue.offset = 0;
} else { } else {
/* BGR:565 mode */ /* BGR:5X5 mode */
var->red.offset = 0; var->red.offset = 0;
var->blue.offset = 11; var->blue.offset = var->green.length + 5;
} }
var->green.offset = 5; var->green.offset = 5;
var->green.length = 6;
var->red.length = var->blue.length = 5; var->red.length = var->blue.length = 5;
break; break;
case 32: case 32:
...@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red, ...@@ -679,8 +684,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red,
case FB_VISUAL_PSEUDOCOLOR: case FB_VISUAL_PSEUDOCOLOR:
if (regno < 256) { if (regno < 256) {
if (cpu_is_at91sam9261() || cpu_is_at91sam9263() if (sinfo->have_intensity_bit) {
|| cpu_is_at91sam9rl()) {
/* old style I+BGR:555 */ /* old style I+BGR:555 */
val = ((red >> 11) & 0x001f); val = ((red >> 11) & 0x001f);
val |= ((green >> 6) & 0x03e0); val |= ((green >> 6) & 0x03e0);
...@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) ...@@ -870,6 +874,10 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
} }
sinfo->info = info; sinfo->info = info;
sinfo->pdev = pdev; sinfo->pdev = pdev;
if (cpu_is_at91sam9261() || cpu_is_at91sam9263() ||
cpu_is_at91sam9rl()) {
sinfo->have_intensity_bit = true;
}
strcpy(info->fix.id, sinfo->pdev->name); strcpy(info->fix.id, sinfo->pdev->name);
info->flags = ATMEL_LCDFB_FBINFO_DEFAULT; info->flags = ATMEL_LCDFB_FBINFO_DEFAULT;
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
*/ */
#define ATMEL_LCDC_WIRING_BGR 0 #define ATMEL_LCDC_WIRING_BGR 0
#define ATMEL_LCDC_WIRING_RGB 1 #define ATMEL_LCDC_WIRING_RGB 1
#define ATMEL_LCDC_WIRING_RGB555 2
/* LCD Controller info data structure, stored in device platform_data */ /* LCD Controller info data structure, stored in device platform_data */
...@@ -62,6 +61,7 @@ struct atmel_lcdfb_info { ...@@ -62,6 +61,7 @@ struct atmel_lcdfb_info {
void (*atmel_lcdfb_power_control)(int on); void (*atmel_lcdfb_power_control)(int on);
struct fb_monspecs *default_monspecs; struct fb_monspecs *default_monspecs;
u32 pseudo_palette[16]; u32 pseudo_palette[16];
bool have_intensity_bit;
}; };
#define ATMEL_LCDC_DMABADDR1 0x00 #define ATMEL_LCDC_DMABADDR1 0x00
......
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