Merge branch 'sh-latest' of git://github.com/pmundt/linux-sh

* 'sh-latest' of git://github.com/pmundt/linux-sh:
  sh: Add default uImage rule for sh7757lcr
  sh: modify the asm/sh_eth.h to linux/sh_eth.h in sh7757lcr
  sh: userimask.c needs linux/stat.h
  sh: pfc: Add GPIO IRQ support
  sh: modify the asm/sh_eth.h to linux/sh_eth.h in some boards
  sh: pfc: Remove unused gpio_in_use member
  sh: add parameters for EHCI and RIIC in clock-sh7757.c
  sh: kexec: Add PHYSICAL_START
  SH: irq: Remove IRQF_DISABLED
  sh: pfc: get_config_reg() shift clean up
  sh: intc: Add IRQ trigger bit field check
  sh: drop unused Kconfig symbol
  sh: Fix implicit declaration of function numa_node_id
  sh: kexec: Register crashk_res
  sh: ecovec: add renesas_usbhs DMAEngine support
This commit is contained in:
Linus Torvalds 2011-11-03 08:22:06 -07:00
commit cf0223503e
29 changed files with 117 additions and 42 deletions

View file

@ -101,10 +101,6 @@ config GENERIC_LOCKBREAK
def_bool y def_bool y
depends on SMP && PREEMPT depends on SMP && PREEMPT
config SYS_SUPPORTS_PM
bool
depends on !SMP
config ARCH_SUSPEND_POSSIBLE config ARCH_SUSPEND_POSSIBLE
def_bool n def_bool n
@ -649,7 +645,7 @@ config CRASH_DUMP
a specially reserved region and then later executed after a specially reserved region and then later executed after
a crash by kdump/kexec. The crash dump kernel must be compiled a crash by kdump/kexec. The crash dump kernel must be compiled
to a memory address not used by the main kernel using to a memory address not used by the main kernel using
MEMORY_START. PHYSICAL_START.
For more details see Documentation/kdump/kdump.txt For more details see Documentation/kdump/kdump.txt
@ -660,6 +656,17 @@ config KEXEC_JUMP
Jump between original kernel and kexeced kernel and invoke Jump between original kernel and kexeced kernel and invoke
code via KEXEC code via KEXEC
config PHYSICAL_START
hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP)
default MEMORY_START
---help---
This gives the physical address where the kernel is loaded
and is ordinarily the same as MEMORY_START.
Different values are primarily used in the case of kexec on panic
where the fail safe kernel needs to run at a different address
than the panic-ed kernel.
config SECCOMP config SECCOMP
bool "Enable seccomp to safely compute untrusted bytecode" bool "Enable seccomp to safely compute untrusted bytecode"
depends on PROC_FS depends on PROC_FS

View file

@ -80,6 +80,7 @@ defaultimage-$(CONFIG_SH_RSK) := uImage
defaultimage-$(CONFIG_SH_URQUELL) := uImage defaultimage-$(CONFIG_SH_URQUELL) := uImage
defaultimage-$(CONFIG_SH_MIGOR) := uImage defaultimage-$(CONFIG_SH_MIGOR) := uImage
defaultimage-$(CONFIG_SH_AP325RXA) := uImage defaultimage-$(CONFIG_SH_AP325RXA) := uImage
defaultimage-$(CONFIG_SH_SH7757LCR) := uImage
defaultimage-$(CONFIG_SH_7724_SOLUTION_ENGINE) := uImage defaultimage-$(CONFIG_SH_7724_SOLUTION_ENGINE) := uImage
defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux
defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux

View file

@ -13,9 +13,9 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sh_eth.h>
#include <asm/machvec.h> #include <asm/machvec.h>
#include <asm/sizes.h> #include <asm/sizes.h>
#include <asm/sh_eth.h>
/* NOR Flash */ /* NOR Flash */
static struct mtd_partition espt_nor_flash_partitions[] = { static struct mtd_partition espt_nor_flash_partitions[] = {

View file

@ -41,8 +41,7 @@ static int __init eraseconfig_init(void)
printk("SnapGear: EraseConfig init\n"); printk("SnapGear: EraseConfig init\n");
/* Setup "EraseConfig" switch on external IRQ 0 */ /* Setup "EraseConfig" switch on external IRQ 0 */
if (request_irq(irq, eraseconfig_interrupt, IRQF_DISABLED, if (request_irq(irq, eraseconfig_interrupt, 0, "Erase Config", NULL))
"Erase Config", NULL))
printk("SnapGear: failed to register IRQ%d for Reset witch\n", printk("SnapGear: failed to register IRQ%d for Reset witch\n",
irq); irq);
else else

View file

@ -18,8 +18,8 @@
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
#include <linux/mmc/sh_mmcif.h> #include <linux/mmc/sh_mmcif.h>
#include <linux/mmc/sh_mobile_sdhi.h> #include <linux/mmc/sh_mobile_sdhi.h>
#include <linux/sh_eth.h>
#include <cpu/sh7757.h> #include <cpu/sh7757.h>
#include <asm/sh_eth.h>
#include <asm/heartbeat.h> #include <asm/heartbeat.h>
static struct resource heartbeat_resource = { static struct resource heartbeat_resource = {

View file

@ -46,13 +46,11 @@ static irqreturn_t cayman_interrupt_pci2(int irq, void *dev_id)
static struct irqaction cayman_action_smsc = { static struct irqaction cayman_action_smsc = {
.name = "Cayman SMSC Mux", .name = "Cayman SMSC Mux",
.handler = cayman_interrupt_smsc, .handler = cayman_interrupt_smsc,
.flags = IRQF_DISABLED,
}; };
static struct irqaction cayman_action_pci2 = { static struct irqaction cayman_action_pci2 = {
.name = "Cayman PCI2 Mux", .name = "Cayman PCI2 Mux",
.handler = cayman_interrupt_pci2, .handler = cayman_interrupt_pci2,
.flags = IRQF_DISABLED,
}; };
static void enable_cayman_irq(struct irq_data *data) static void enable_cayman_irq(struct irq_data *data)

View file

@ -28,13 +28,13 @@
#include <linux/spi/mmc_spi.h> #include <linux/spi/mmc_spi.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/sh_keysc.h> #include <linux/input/sh_keysc.h>
#include <linux/sh_eth.h>
#include <video/sh_mobile_lcdc.h> #include <video/sh_mobile_lcdc.h>
#include <sound/sh_fsi.h> #include <sound/sh_fsi.h>
#include <media/sh_mobile_ceu.h> #include <media/sh_mobile_ceu.h>
#include <media/tw9910.h> #include <media/tw9910.h>
#include <media/mt9t112.h> #include <media/mt9t112.h>
#include <asm/heartbeat.h> #include <asm/heartbeat.h>
#include <asm/sh_eth.h>
#include <asm/clock.h> #include <asm/clock.h>
#include <asm/suspend.h> #include <asm/suspend.h>
#include <cpu/sh7724.h> #include <cpu/sh7724.h>
@ -248,6 +248,10 @@ static struct renesas_usbhs_platform_info usbhs_info = {
.driver_param = { .driver_param = {
.buswait_bwait = 4, .buswait_bwait = 4,
.detection_delay = 5, .detection_delay = 5,
.d0_tx_id = SHDMA_SLAVE_USB1D0_TX,
.d0_rx_id = SHDMA_SLAVE_USB1D0_RX,
.d1_tx_id = SHDMA_SLAVE_USB1D1_TX,
.d1_rx_id = SHDMA_SLAVE_USB1D1_RX,
}, },
}; };

View file

@ -86,7 +86,7 @@ static int __init hp6x0_apm_init(void)
int ret; int ret;
ret = request_irq(HP680_BTN_IRQ, hp6x0_apm_interrupt, ret = request_irq(HP680_BTN_IRQ, hp6x0_apm_interrupt,
IRQF_DISABLED, MODNAME, NULL); 0, MODNAME, NULL);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
printk(KERN_ERR MODNAME ": IRQ %d request failed\n", printk(KERN_ERR MODNAME ": IRQ %d request failed\n",
HP680_BTN_IRQ); HP680_BTN_IRQ);

View file

@ -23,12 +23,12 @@
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/sh_keysc.h> #include <linux/input/sh_keysc.h>
#include <linux/usb/r8a66597.h> #include <linux/usb/r8a66597.h>
#include <linux/sh_eth.h>
#include <video/sh_mobile_lcdc.h> #include <video/sh_mobile_lcdc.h>
#include <media/sh_mobile_ceu.h> #include <media/sh_mobile_ceu.h>
#include <sound/sh_fsi.h> #include <sound/sh_fsi.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/heartbeat.h> #include <asm/heartbeat.h>
#include <asm/sh_eth.h>
#include <asm/clock.h> #include <asm/clock.h>
#include <asm/suspend.h> #include <asm/suspend.h>
#include <cpu/sh7724.h> #include <cpu/sh7724.h>

View file

@ -17,8 +17,8 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sh_eth.h>
#include <mach/sh7763rdp.h> #include <mach/sh7763rdp.h>
#include <asm/sh_eth.h>
#include <asm/sh7760fb.h> #include <asm/sh7760fb.h>
/* NOR Flash */ /* NOR Flash */

View file

@ -19,6 +19,7 @@ CONFIG_MEMORY_START ?= 0x0c000000
CONFIG_BOOT_LINK_OFFSET ?= 0x00800000 CONFIG_BOOT_LINK_OFFSET ?= 0x00800000
CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000 CONFIG_ZERO_PAGE_OFFSET ?= 0x00001000
CONFIG_ENTRY_OFFSET ?= 0x00001000 CONFIG_ENTRY_OFFSET ?= 0x00001000
CONFIG_PHYSICAL_START ?= $(CONFIG_MEMORY_START)
suffix-y := bin suffix-y := bin
suffix-$(CONFIG_KERNEL_GZIP) := gz suffix-$(CONFIG_KERNEL_GZIP) := gz
@ -48,7 +49,7 @@ $(obj)/romimage/vmlinux: $(obj)/zImage FORCE
$(Q)$(MAKE) $(build)=$(obj)/romimage $@ $(Q)$(MAKE) $(build)=$(obj)/romimage $@
KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \
$$[$(CONFIG_MEMORY_START) & 0x1fffffff]') $$[$(CONFIG_PHYSICAL_START) & 0x1fffffff]')
KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \
$$[$(CONFIG_PAGE_OFFSET) + \ $$[$(CONFIG_PAGE_OFFSET) + \
@ -114,4 +115,5 @@ $(obj)/uImage: $(obj)/uImage.$(suffix-y)
@echo ' Image $@ is ready' @echo ' Image $@ is ready'
export CONFIG_PAGE_OFFSET CONFIG_MEMORY_START CONFIG_BOOT_LINK_OFFSET \ export CONFIG_PAGE_OFFSET CONFIG_MEMORY_START CONFIG_BOOT_LINK_OFFSET \
CONFIG_ZERO_PAGE_OFFSET CONFIG_ENTRY_OFFSET KERNEL_MEMORY suffix-y CONFIG_PHYSICAL_START CONFIG_ZERO_PAGE_OFFSET CONFIG_ENTRY_OFFSET \
KERNEL_MEMORY suffix-y

View file

@ -170,7 +170,7 @@ static int __init g2_dma_init(void)
{ {
int ret; int ret;
ret = request_irq(HW_EVENT_G2_DMA, g2_dma_interrupt, IRQF_DISABLED, ret = request_irq(HW_EVENT_G2_DMA, g2_dma_interrupt, 0,
"g2 DMA handler", &g2_dma_info); "g2 DMA handler", &g2_dma_info);
if (unlikely(ret)) if (unlikely(ret))
return -EINVAL; return -EINVAL;

View file

@ -70,7 +70,6 @@ static int pvr2_xfer_dma(struct dma_channel *chan)
static struct irqaction pvr2_dma_irq = { static struct irqaction pvr2_dma_irq = {
.name = "pvr2 DMA handler", .name = "pvr2 DMA handler",
.handler = pvr2_dma_interrupt, .handler = pvr2_dma_interrupt,
.flags = IRQF_DISABLED,
}; };
static struct dma_ops pvr2_dma_ops = { static struct dma_ops pvr2_dma_ops = {

View file

@ -95,7 +95,7 @@ static int sh_dmac_request_dma(struct dma_channel *chan)
#if defined(CONFIG_SH_DMA_IRQ_MULTI) #if defined(CONFIG_SH_DMA_IRQ_MULTI)
IRQF_SHARED, IRQF_SHARED,
#else #else
IRQF_DISABLED, 0,
#endif #endif
chan->dev_id, chan); chan->dev_id, chan);
} }
@ -305,7 +305,7 @@ static int __init sh_dmac_init(void)
#if defined(CONFIG_SH_DMA_IRQ_MULTI) #if defined(CONFIG_SH_DMA_IRQ_MULTI)
IRQF_SHARED, IRQF_SHARED,
#else #else
IRQF_DISABLED, 0,
#endif #endif
dmae_name[n], (void *)dmae_name[n]); dmae_name[n], (void *)dmae_name[n]);
if (unlikely(i < 0)) { if (unlikely(i < 0)) {

View file

@ -174,17 +174,17 @@ static int __init dmabrg_init(void)
or = __raw_readl(DMAOR); or = __raw_readl(DMAOR);
__raw_writel(or | DMAOR_BRG | DMAOR_DMEN, DMAOR); __raw_writel(or | DMAOR_BRG | DMAOR_DMEN, DMAOR);
ret = request_irq(DMABRGI0, dmabrg_irq, IRQF_DISABLED, ret = request_irq(DMABRGI0, dmabrg_irq, 0,
"DMABRG USB address error", NULL); "DMABRG USB address error", NULL);
if (ret) if (ret)
goto out0; goto out0;
ret = request_irq(DMABRGI1, dmabrg_irq, IRQF_DISABLED, ret = request_irq(DMABRGI1, dmabrg_irq, 0,
"DMABRG Transfer End", NULL); "DMABRG Transfer End", NULL);
if (ret) if (ret)
goto out1; goto out1;
ret = request_irq(DMABRGI2, dmabrg_irq, IRQF_DISABLED, ret = request_irq(DMABRGI2, dmabrg_irq, 0,
"DMABRG Transfer Half", NULL); "DMABRG Transfer Half", NULL);
if (ret == 0) if (ret == 0)
return ret; return ret;

View file

@ -107,13 +107,13 @@ static int __init sh5pci_init(void)
u32 uval; u32 uval;
if (request_irq(IRQ_ERR, pcish5_err_irq, if (request_irq(IRQ_ERR, pcish5_err_irq,
IRQF_DISABLED, "PCI Error",NULL) < 0) { 0, "PCI Error",NULL) < 0) {
printk(KERN_ERR "PCISH5: Cannot hook PCI_PERR interrupt\n"); printk(KERN_ERR "PCISH5: Cannot hook PCI_PERR interrupt\n");
return -EINVAL; return -EINVAL;
} }
if (request_irq(IRQ_SERR, pcish5_serr_irq, if (request_irq(IRQ_SERR, pcish5_serr_irq,
IRQF_DISABLED, "PCI SERR interrupt", NULL) < 0) { 0, "PCI SERR interrupt", NULL) < 0) {
printk(KERN_ERR "PCISH5: Cannot hook PCI_SERR interrupt\n"); printk(KERN_ERR "PCISH5: Cannot hook PCI_SERR interrupt\n");
return -EINVAL; return -EINVAL;
} }

View file

@ -172,7 +172,7 @@ static int __init sh7780_pci_setup_irqs(struct pci_channel *hose)
PCI_STATUS_SIG_TARGET_ABORT | \ PCI_STATUS_SIG_TARGET_ABORT | \
PCI_STATUS_PARITY, hose->reg_base + PCI_STATUS); PCI_STATUS_PARITY, hose->reg_base + PCI_STATUS);
ret = request_irq(hose->serr_irq, sh7780_pci_serr_irq, IRQF_DISABLED, ret = request_irq(hose->serr_irq, sh7780_pci_serr_irq, 0,
"PCI SERR interrupt", hose); "PCI SERR interrupt", hose);
if (unlikely(ret)) { if (unlikely(ret)) {
printk(KERN_ERR "PCI: Failed hooking SERR IRQ\n"); printk(KERN_ERR "PCI: Failed hooking SERR IRQ\n");

View file

@ -63,7 +63,7 @@ static int switch_drv_probe(struct platform_device *pdev)
BUG_ON(!psw_info); BUG_ON(!psw_info);
ret = request_irq(irq, psw_info->irq_handler, ret = request_irq(irq, psw_info->irq_handler,
IRQF_DISABLED | psw_info->irq_flags, psw_info->irq_flags,
psw_info->name ? psw_info->name : DRV_NAME, pdev); psw_info->name ? psw_info->name : DRV_NAME, pdev);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
goto err; goto err;

View file

@ -112,6 +112,16 @@ typedef struct page *pgtable_t;
#define __MEMORY_START CONFIG_MEMORY_START #define __MEMORY_START CONFIG_MEMORY_START
#define __MEMORY_SIZE CONFIG_MEMORY_SIZE #define __MEMORY_SIZE CONFIG_MEMORY_SIZE
/*
* PHYSICAL_OFFSET is the offset in physical memory where the base
* of the kernel is loaded.
*/
#ifdef CONFIG_PHYSICAL_START
#define PHYSICAL_OFFSET (CONFIG_PHYSICAL_START - __MEMORY_START)
#else
#define PHYSICAL_OFFSET 0
#endif
/* /*
* PAGE_OFFSET is the virtual address of the start of kernel address * PAGE_OFFSET is the virtual address of the start of kernel address
* space. * space.

View file

@ -113,7 +113,14 @@ static struct clk_lookup lookups[] = {
/* MSTP32 clocks */ /* MSTP32 clocks */
CLKDEV_CON_ID("sdhi0", &mstp_clks[MSTP004]), CLKDEV_CON_ID("sdhi0", &mstp_clks[MSTP004]),
CLKDEV_CON_ID("riic", &mstp_clks[MSTP000]), CLKDEV_CON_ID("riic0", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic1", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic2", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic3", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic4", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic5", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic6", &mstp_clks[MSTP000]),
CLKDEV_CON_ID("riic7", &mstp_clks[MSTP000]),
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.0", &mstp_clks[MSTP113]), CLKDEV_ICK_ID("tmu_fck", "sh_tmu.0", &mstp_clks[MSTP113]),
CLKDEV_ICK_ID("tmu_fck", "sh_tmu.1", &mstp_clks[MSTP114]), CLKDEV_ICK_ID("tmu_fck", "sh_tmu.1", &mstp_clks[MSTP114]),
@ -121,6 +128,7 @@ static struct clk_lookup lookups[] = {
CLKDEV_ICK_ID("sci_fck", "sh-sci.1", &mstp_clks[MSTP111]), CLKDEV_ICK_ID("sci_fck", "sh-sci.1", &mstp_clks[MSTP111]),
CLKDEV_ICK_ID("sci_fck", "sh-sci.0", &mstp_clks[MSTP110]), CLKDEV_ICK_ID("sci_fck", "sh-sci.0", &mstp_clks[MSTP110]),
CLKDEV_CON_ID("usb_fck", &mstp_clks[MSTP103]),
CLKDEV_CON_ID("usb0", &mstp_clks[MSTP102]), CLKDEV_CON_ID("usb0", &mstp_clks[MSTP102]),
CLKDEV_CON_ID("mmc0", &mstp_clks[MSTP220]), CLKDEV_CON_ID("mmc0", &mstp_clks[MSTP220]),
}; };

View file

@ -79,7 +79,7 @@ static void shx3_prepare_cpus(unsigned int max_cpus)
for (i = 0; i < SMP_MSG_NR; i++) for (i = 0; i < SMP_MSG_NR; i++)
request_irq(104 + i, ipi_interrupt_handler, request_irq(104 + i, ipi_interrupt_handler,
IRQF_DISABLED | IRQF_PERCPU, "IPI", (void *)(long)i); IRQF_PERCPU, "IPI", (void *)(long)i);
for (i = 0; i < max_cpus; i++) for (i = 0; i < max_cpus; i++)
set_cpu_present(i, true); set_cpu_present(i, true);

View file

@ -211,13 +211,16 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn,
} }
/* /*
* We don't know which RAM region contains kernel data, * We don't know which RAM region contains kernel data or
* so we try it repeatedly and let the resource manager * the reserved crashkernel region, so try it repeatedly
* test it. * and let the resource manager test it.
*/ */
request_resource(res, &code_resource); request_resource(res, &code_resource);
request_resource(res, &data_resource); request_resource(res, &data_resource);
request_resource(res, &bss_resource); request_resource(res, &bss_resource);
#ifdef CONFIG_KEXEC
request_resource(res, &crashk_res);
#endif
/* /*
* Also make sure that there is a PMB mapping that covers this * Also make sure that there is a PMB mapping that covers this

View file

@ -11,6 +11,7 @@
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <linux/topology.h>
#include <linux/node.h> #include <linux/node.h>
#include <linux/nodemask.h> #include <linux/nodemask.h>

View file

@ -23,7 +23,7 @@ OUTPUT_ARCH(sh)
ENTRY(_start) ENTRY(_start)
SECTIONS SECTIONS
{ {
. = PAGE_OFFSET + MEMORY_OFFSET + CONFIG_ZERO_PAGE_OFFSET; . = PAGE_OFFSET + MEMORY_OFFSET + PHYSICAL_OFFSET + CONFIG_ZERO_PAGE_OFFSET;
_text = .; /* Text and read-only data */ _text = .; /* Text and read-only data */

View file

@ -287,6 +287,8 @@ static void __init do_init_bootmem(void)
static void __init early_reserve_mem(void) static void __init early_reserve_mem(void)
{ {
unsigned long start_pfn; unsigned long start_pfn;
u32 zero_base = (u32)__MEMORY_START + (u32)PHYSICAL_OFFSET;
u32 start = zero_base + (u32)CONFIG_ZERO_PAGE_OFFSET;
/* /*
* Partially used pages are not usable - thus * Partially used pages are not usable - thus
@ -300,15 +302,13 @@ static void __init early_reserve_mem(void)
* this catches the (definitely buggy) case of us accidentally * this catches the (definitely buggy) case of us accidentally
* initializing the bootmem allocator with an invalid RAM area. * initializing the bootmem allocator with an invalid RAM area.
*/ */
memblock_reserve(__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET, memblock_reserve(start, (PFN_PHYS(start_pfn) + PAGE_SIZE - 1) - start);
(PFN_PHYS(start_pfn) + PAGE_SIZE - 1) -
(__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET));
/* /*
* Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET. * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET.
*/ */
if (CONFIG_ZERO_PAGE_OFFSET != 0) if (CONFIG_ZERO_PAGE_OFFSET != 0)
memblock_reserve(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET); memblock_reserve(zero_base, CONFIG_ZERO_PAGE_OFFSET);
/* /*
* Handle additional early reservations * Handle additional early reservations

View file

@ -202,11 +202,16 @@ static int intc_set_type(struct irq_data *data, unsigned int type)
if (!value) if (!value)
return -EINVAL; return -EINVAL;
value &= ~SENSE_VALID_FLAG;
ihp = intc_find_irq(d->sense, d->nr_sense, irq); ihp = intc_find_irq(d->sense, d->nr_sense, irq);
if (ihp) { if (ihp) {
/* PINT has 2-bit sense registers, should fail on EDGE_BOTH */
if (value >= (1 << _INTC_WIDTH(ihp->handle)))
return -EINVAL;
addr = INTC_REG(d, _INTC_ADDR_E(ihp->handle), 0); addr = INTC_REG(d, _INTC_ADDR_E(ihp->handle), 0);
intc_reg_fns[_INTC_FN(ihp->handle)](addr, ihp->handle, intc_reg_fns[_INTC_FN(ihp->handle)](addr, ihp->handle, value);
value & ~SENSE_VALID_FLAG);
} }
return 0; return 0;

View file

@ -13,6 +13,7 @@
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/stat.h>
#include <asm/sizes.h> #include <asm/sizes.h>
#include "internals.h" #include "internals.h"

View file

@ -217,7 +217,7 @@ static int get_config_reg(struct pinmux_info *gpioc, pinmux_enum_t enum_id,
if (!r_width) if (!r_width)
break; break;
for (n = 0; n < (r_width / f_width) * 1 << f_width; n++) { for (n = 0; n < (r_width / f_width) * (1 << f_width); n++) {
if (config_reg->enum_ids[n] == enum_id) { if (config_reg->enum_ids[n] == enum_id) {
*crp = config_reg; *crp = config_reg;
*indexp = n; *indexp = n;
@ -577,6 +577,32 @@ static void sh_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
sh_gpio_set_value(chip_to_pinmux(chip), offset, value); sh_gpio_set_value(chip_to_pinmux(chip), offset, value);
} }
static int sh_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
{
struct pinmux_info *gpioc = chip_to_pinmux(chip);
pinmux_enum_t enum_id;
pinmux_enum_t *enum_ids;
int i, k, pos;
pos = 0;
enum_id = 0;
while (1) {
pos = get_gpio_enum_id(gpioc, offset, pos, &enum_id);
if (pos <= 0 || !enum_id)
break;
for (i = 0; i < gpioc->gpio_irq_size; i++) {
enum_ids = gpioc->gpio_irq[i].enum_ids;
for (k = 0; enum_ids[k]; k++) {
if (enum_ids[k] == enum_id)
return gpioc->gpio_irq[i].irq;
}
}
}
return -ENOSYS;
}
int register_pinmux(struct pinmux_info *pip) int register_pinmux(struct pinmux_info *pip)
{ {
struct gpio_chip *chip = &pip->chip; struct gpio_chip *chip = &pip->chip;
@ -592,6 +618,7 @@ int register_pinmux(struct pinmux_info *pip)
chip->get = sh_gpio_get; chip->get = sh_gpio_get;
chip->direction_output = sh_gpio_direction_output; chip->direction_output = sh_gpio_direction_output;
chip->set = sh_gpio_set; chip->set = sh_gpio_set;
chip->to_irq = sh_gpio_to_irq;
WARN_ON(pip->first_gpio != 0); /* needs testing */ WARN_ON(pip->first_gpio != 0); /* needs testing */

View file

@ -61,6 +61,14 @@ struct pinmux_data_reg {
.reg = r, .reg_width = r_width, \ .reg = r, .reg_width = r_width, \
.enum_ids = (pinmux_enum_t [r_width]) \ .enum_ids = (pinmux_enum_t [r_width]) \
struct pinmux_irq {
int irq;
pinmux_enum_t *enum_ids;
};
#define PINMUX_IRQ(irq_nr, ids...) \
{ .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } } \
struct pinmux_range { struct pinmux_range {
pinmux_enum_t begin; pinmux_enum_t begin;
pinmux_enum_t end; pinmux_enum_t end;
@ -87,7 +95,9 @@ struct pinmux_info {
pinmux_enum_t *gpio_data; pinmux_enum_t *gpio_data;
unsigned int gpio_data_size; unsigned int gpio_data_size;
unsigned long *gpio_in_use; struct pinmux_irq *gpio_irq;
unsigned int gpio_irq_size;
struct gpio_chip chip; struct gpio_chip chip;
}; };