mirror of
https://github.com/torvalds/linux.git
synced 2024-11-30 08:01:59 +00:00
Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm: [ARM] Fix some section mismatch warnings [ARM] 4417/1: Serial: Fix AMBA drivers locking [ARM] 4394/1: ARMv7: Add the TLB range operations [ARM] 4410/1: Remove extern declarations in coyote/ixdpg425-pci.c [ARM] 4416/1: NWFPE: fix undeclared symbols [ARM] 4415/1: AML5900: fix sparse warnings from map_io [ARM] 4414/1: S3C2443: sparse fix for clock.c [ARM] 4412/1: S3C2412: reset errata fix [ARM] 4411/1: KS8695: Another serial driver fix [ARM] oprofile: avoid lockdep warnings on mpcore oprofile init [ARM] Fix stacktrace FP range checking [ARM] use __used attribute [ARM] enable arbitary speed tty ioctls and split input/output speed [ARM] remove unused header file: arch/arm/mach-s3c2410/bast.h [ARM] 4406/1: Trivial NSLU2 / NAS-100D header & setup code cleanup [ARM] 4405/1: NSLU2, DSM-G600 frequency fixup code [ARM] 4404/1: Trivial IXP42x Kconfig cleanup [ARM] 4403/1: Make the PXA-I2C driver work with lockdep validator [ARM] 4402/1: S3C2443: Add physical address of HSMMC controller [ARM] 4401/1: S3C2443: Add definitions for port GPIOJ
This commit is contained in:
commit
f54496f55a
@ -57,7 +57,7 @@ extern void fp_enter(void);
|
||||
#define EXPORT_SYMBOL_ALIAS(sym,orig) \
|
||||
EXPORT_CRC_ALIAS(sym) \
|
||||
static const struct kernel_symbol __ksymtab_##sym \
|
||||
__attribute_used__ __attribute__((section("__ksymtab"))) = \
|
||||
__used __attribute__((section("__ksymtab"))) = \
|
||||
{ (unsigned long)&orig, #sym };
|
||||
|
||||
/*
|
||||
|
@ -13,7 +13,7 @@ int walk_stackframe(unsigned long fp, unsigned long low, unsigned long high,
|
||||
/*
|
||||
* Check current frame pointer is within bounds
|
||||
*/
|
||||
if ((fp - 12) < low || fp + 4 >= high)
|
||||
if (fp < (low + 12) || fp + 4 >= high)
|
||||
break;
|
||||
|
||||
frame = (struct stackframe *)(fp - 12);
|
||||
|
@ -132,7 +132,7 @@ static struct mtd_partition __initdata dk_nand_partition[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(dk_nand_partition);
|
||||
return dk_nand_partition;
|
||||
|
@ -96,7 +96,7 @@ static struct mtd_partition __initdata kb9202_nand_partition[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(kb9202_nand_partition);
|
||||
return kb9202_nand_partition;
|
||||
|
@ -178,7 +178,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(ek_nand_partition);
|
||||
return ek_nand_partition;
|
||||
|
@ -180,7 +180,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(ek_nand_partition);
|
||||
return ek_nand_partition;
|
||||
|
@ -87,7 +87,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(ek_nand_partition);
|
||||
return ek_nand_partition;
|
||||
|
@ -45,7 +45,7 @@ static struct hw_pci cats_pci __initdata = {
|
||||
.postinit = dc21285_postinit,
|
||||
};
|
||||
|
||||
static int cats_pci_init(void)
|
||||
static int __init cats_pci_init(void)
|
||||
{
|
||||
if (machine_is_cats())
|
||||
pci_common_init(&cats_pci);
|
||||
|
@ -201,7 +201,6 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
|
||||
{
|
||||
imx_mmc_device.dev.platform_data = info;
|
||||
}
|
||||
EXPORT_SYMBOL(imx_set_mmc_info);
|
||||
|
||||
static struct imxfb_mach_info imx_fb_info;
|
||||
|
||||
|
@ -164,7 +164,7 @@ int __init ixdp2400_pci_init(void)
|
||||
|
||||
subsys_initcall(ixdp2400_pci_init);
|
||||
|
||||
void ixdp2400_init_irq(void)
|
||||
void __init ixdp2400_init_irq(void)
|
||||
{
|
||||
ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);
|
||||
}
|
||||
|
@ -279,7 +279,7 @@ int __init ixdp2800_pci_init(void)
|
||||
|
||||
subsys_initcall(ixdp2800_pci_init);
|
||||
|
||||
void ixdp2800_init_irq(void)
|
||||
void __init ixdp2800_init_irq(void)
|
||||
{
|
||||
ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS);
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ static struct irq_chip ixdp2x00_cpld_irq_chip = {
|
||||
.unmask = ixdp2x00_irq_unmask
|
||||
};
|
||||
|
||||
void ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
|
||||
void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
|
||||
{
|
||||
unsigned int irq;
|
||||
|
||||
|
@ -124,7 +124,7 @@ static struct irq_chip ixdp2351_intb_chip = {
|
||||
.unmask = ixdp2351_intb_unmask
|
||||
};
|
||||
|
||||
void ixdp2351_init_irq(void)
|
||||
void __init ixdp2351_init_irq(void)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -284,7 +284,7 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ixp23xx_pci_slave_init(void)
|
||||
void __init ixp23xx_pci_slave_init(void)
|
||||
{
|
||||
ixp23xx_pci_common_init();
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ static int __init roadrunner_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
|
||||
return NO_IRQ;
|
||||
}
|
||||
|
||||
static void roadrunner_pci_preinit(void)
|
||||
static void __init roadrunner_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQT_LOW);
|
||||
set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQT_LOW);
|
||||
|
@ -104,9 +104,6 @@ config MACH_DSMG600
|
||||
DSM-G600 RevA device. For more information on this platform,
|
||||
see http://www.nslu2-linux.org/wiki/DSMG600/HomePage
|
||||
|
||||
#
|
||||
# Avila and IXDP share the same source for now. Will change in future
|
||||
#
|
||||
config ARCH_IXDP4XX
|
||||
bool
|
||||
depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435
|
||||
|
@ -283,7 +283,7 @@ static struct irqaction ixp4xx_timer_irq = {
|
||||
.handler = ixp4xx_timer_interrupt,
|
||||
};
|
||||
|
||||
static void __init ixp4xx_timer_init(void)
|
||||
void __init ixp4xx_timer_init(void)
|
||||
{
|
||||
/* Reset/disable counter */
|
||||
*IXP4XX_OSRT1 = 0;
|
||||
|
@ -25,10 +25,6 @@
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
extern void ixp4xx_pci_preinit(void);
|
||||
extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
|
||||
extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
|
||||
|
||||
void __init coyote_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW);
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
static struct flash_platform_data dsmg600_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
@ -128,6 +129,19 @@ static void dsmg600_power_off(void)
|
||||
gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH);
|
||||
}
|
||||
|
||||
static void __init dsmg600_timer_init(void)
|
||||
{
|
||||
/* The xtal on this machine is non-standard. */
|
||||
ixp4xx_timer_freq = DSMG600_FREQ;
|
||||
|
||||
/* Call standard timer_init function. */
|
||||
ixp4xx_timer_init();
|
||||
}
|
||||
|
||||
static struct sys_timer dsmg600_timer = {
|
||||
.init = dsmg600_timer_init,
|
||||
};
|
||||
|
||||
static void __init dsmg600_init(void)
|
||||
{
|
||||
ixp4xx_sys_init();
|
||||
@ -155,21 +169,13 @@ static void __init dsmg600_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init dsmg600_fixup(struct machine_desc *desc,
|
||||
struct tag *tags, char **cmdline, struct meminfo *mi)
|
||||
{
|
||||
/* The xtal on this machine is non-standard. */
|
||||
ixp4xx_timer_freq = DSMG600_FREQ;
|
||||
}
|
||||
|
||||
MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")
|
||||
/* Maintainer: www.nslu2-linux.org */
|
||||
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
|
||||
.boot_params = 0x00000100,
|
||||
.fixup = dsmg600_fixup,
|
||||
.map_io = ixp4xx_map_io,
|
||||
.init_irq = ixp4xx_init_irq,
|
||||
.timer = &ixp4xx_timer,
|
||||
.timer = &dsmg600_timer,
|
||||
.init_machine = dsmg600_init,
|
||||
MACHINE_END
|
||||
|
@ -23,10 +23,6 @@
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
extern void ixp4xx_pci_preinit(void);
|
||||
extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
|
||||
extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
|
||||
|
||||
void __init ixdpg425_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW);
|
||||
|
@ -155,7 +155,8 @@ static void __init nas100d_init(void)
|
||||
|
||||
pm_power_off = nas100d_power_off;
|
||||
|
||||
/* This is only useful on a modified machine, but it is valuable
|
||||
/*
|
||||
* This is only useful on a modified machine, but it is valuable
|
||||
* to have it first in order to see debug messages, and so that
|
||||
* it does *not* get removed if platform_add_devices fails!
|
||||
*/
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
static struct flash_platform_data nslu2_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
@ -49,26 +50,26 @@ static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = {
|
||||
static struct resource nslu2_led_resources[] = {
|
||||
{
|
||||
.name = "ready", /* green led */
|
||||
.start = NSLU2_LED_GRN,
|
||||
.end = NSLU2_LED_GRN,
|
||||
.start = NSLU2_LED_GRN_GPIO,
|
||||
.end = NSLU2_LED_GRN_GPIO,
|
||||
.flags = IXP4XX_GPIO_HIGH,
|
||||
},
|
||||
{
|
||||
.name = "status", /* red led */
|
||||
.start = NSLU2_LED_RED,
|
||||
.end = NSLU2_LED_RED,
|
||||
.start = NSLU2_LED_RED_GPIO,
|
||||
.end = NSLU2_LED_RED_GPIO,
|
||||
.flags = IXP4XX_GPIO_HIGH,
|
||||
},
|
||||
{
|
||||
.name = "disk-1",
|
||||
.start = NSLU2_LED_DISK1,
|
||||
.end = NSLU2_LED_DISK1,
|
||||
.start = NSLU2_LED_DISK1_GPIO,
|
||||
.end = NSLU2_LED_DISK1_GPIO,
|
||||
.flags = IXP4XX_GPIO_LOW,
|
||||
},
|
||||
{
|
||||
.name = "disk-2",
|
||||
.start = NSLU2_LED_DISK2,
|
||||
.end = NSLU2_LED_DISK2,
|
||||
.start = NSLU2_LED_DISK2_GPIO,
|
||||
.end = NSLU2_LED_DISK2_GPIO,
|
||||
.flags = IXP4XX_GPIO_LOW,
|
||||
},
|
||||
};
|
||||
@ -157,10 +158,21 @@ static void nslu2_power_off(void)
|
||||
gpio_line_set(NSLU2_PO_GPIO, IXP4XX_GPIO_HIGH);
|
||||
}
|
||||
|
||||
static void __init nslu2_timer_init(void)
|
||||
{
|
||||
/* The xtal on this machine is non-standard. */
|
||||
ixp4xx_timer_freq = NSLU2_FREQ;
|
||||
|
||||
/* Call standard timer_init function. */
|
||||
ixp4xx_timer_init();
|
||||
}
|
||||
|
||||
static struct sys_timer nslu2_timer = {
|
||||
.init = nslu2_timer_init,
|
||||
};
|
||||
|
||||
static void __init nslu2_init(void)
|
||||
{
|
||||
ixp4xx_timer_freq = NSLU2_FREQ;
|
||||
|
||||
ixp4xx_sys_init();
|
||||
|
||||
nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
|
||||
@ -169,7 +181,8 @@ static void __init nslu2_init(void)
|
||||
|
||||
pm_power_off = nslu2_power_off;
|
||||
|
||||
/* This is only useful on a modified machine, but it is valuable
|
||||
/*
|
||||
* This is only useful on a modified machine, but it is valuable
|
||||
* to have it first in order to see debug messages, and so that
|
||||
* it does *not* get removed if platform_add_devices fails!
|
||||
*/
|
||||
@ -185,6 +198,6 @@ MACHINE_START(NSLU2, "Linksys NSLU2")
|
||||
.boot_params = 0x00000100,
|
||||
.map_io = ixp4xx_map_io,
|
||||
.init_irq = ixp4xx_init_irq,
|
||||
.timer = &ixp4xx_timer,
|
||||
.timer = &nslu2_timer,
|
||||
.init_machine = nslu2_init,
|
||||
MACHINE_END
|
||||
|
@ -1,2 +0,0 @@
|
||||
/* linux/arch/arm/mach-s3c2410/bast.h
|
||||
extern void bast_init_irq(void);
|
@ -160,7 +160,7 @@ static struct platform_device *amlm5900_devices[] __initdata = {
|
||||
#endif
|
||||
};
|
||||
|
||||
void __init amlm5900_map_io(void)
|
||||
static void __init amlm5900_map_io(void)
|
||||
{
|
||||
s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
|
||||
s3c24xx_init_clocks(0);
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
@ -29,6 +30,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/arch/reset.h>
|
||||
#include <asm/arch/idle.h>
|
||||
|
||||
#include <asm/arch/regs-clock.h>
|
||||
@ -38,6 +40,7 @@
|
||||
#include <asm/arch/regs-gpioj.h>
|
||||
#include <asm/arch/regs-dsc.h>
|
||||
#include <asm/arch/regs-spi.h>
|
||||
#include <asm/arch/regs-s3c2412.h>
|
||||
|
||||
#include <asm/plat-s3c24xx/s3c2412.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
@ -106,6 +109,23 @@ static void s3c2412_idle(void)
|
||||
cpu_do_idle();
|
||||
}
|
||||
|
||||
static void s3c2412_hard_reset(void)
|
||||
{
|
||||
/* errata "Watch-dog/Software Reset Problem" specifies that
|
||||
* this reset must be done with the SYSCLK sourced from
|
||||
* EXTCLK instead of FOUT to avoid a glitch in the reset
|
||||
* mechanism.
|
||||
*
|
||||
* See the watchdog section of the S3C2412 manual for more
|
||||
* information on this fix.
|
||||
*/
|
||||
|
||||
__raw_writel(0x00, S3C2412_CLKSRC);
|
||||
__raw_writel(S3C2412_SWRST_RESET, S3C2412_SWRST);
|
||||
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
/* s3c2412_map_io
|
||||
*
|
||||
* register the standard cpu IO areas, and any passed in from the
|
||||
@ -122,6 +142,10 @@ void __init s3c2412_map_io(struct map_desc *mach_desc, int mach_size)
|
||||
|
||||
s3c24xx_idle = s3c2412_idle;
|
||||
|
||||
/* set custom reset hook */
|
||||
|
||||
s3c24xx_reset_hook = s3c2412_hard_reset;
|
||||
|
||||
/* register our io-tables */
|
||||
|
||||
iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
|
||||
|
@ -394,7 +394,7 @@ static int s3c2443_setrate_usbhost(struct clk *clk, unsigned long rate)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct clk clk_usb_bus_host = {
|
||||
static struct clk clk_usb_bus_host = {
|
||||
.name = "usb-bus-host-parent",
|
||||
.id = -1,
|
||||
.parent = &clk_esysclk,
|
||||
@ -758,7 +758,6 @@ static struct clk init_clocks[] = {
|
||||
.parent = &clk_h,
|
||||
.enable = s3c2443_clkcon_enable_h,
|
||||
.ctrlbit = S3C2443_HCLKCON_CFC,
|
||||
.ctrlbit = S3C2443_HCLKCON_HSMMC,
|
||||
}, {
|
||||
.name = "ssmc",
|
||||
.id = -1,
|
||||
|
@ -139,12 +139,12 @@ static u_int neponset_get_mctrl(struct uart_port *port)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct sa1100_port_fns neponset_port_fns __initdata = {
|
||||
static struct sa1100_port_fns neponset_port_fns __devinitdata = {
|
||||
.set_mctrl = neponset_set_mctrl,
|
||||
.get_mctrl = neponset_get_mctrl,
|
||||
};
|
||||
|
||||
static int neponset_probe(struct platform_device *dev)
|
||||
static int __devinit neponset_probe(struct platform_device *dev)
|
||||
{
|
||||
sa1100_register_uart_fns(&neponset_port_fns);
|
||||
|
||||
|
@ -379,7 +379,7 @@ config CPU_V7
|
||||
select CPU_CP15_MMU
|
||||
select CPU_HAS_ASID
|
||||
select CPU_COPY_V6 if MMU
|
||||
select CPU_TLB_V6 if MMU
|
||||
select CPU_TLB_V7 if MMU
|
||||
|
||||
# Figure out what processor architecture version we should be using.
|
||||
# This defines the compiler instruction set which depends on the machine type.
|
||||
@ -498,6 +498,9 @@ config CPU_TLB_V4WBI
|
||||
config CPU_TLB_V6
|
||||
bool
|
||||
|
||||
config CPU_TLB_V7
|
||||
bool
|
||||
|
||||
endif
|
||||
|
||||
config CPU_HAS_ASID
|
||||
|
@ -46,6 +46,7 @@ obj-$(CONFIG_CPU_TLB_V4WT) += tlb-v4.o
|
||||
obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o
|
||||
obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o
|
||||
obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o
|
||||
obj-$(CONFIG_CPU_TLB_V7) += tlb-v7.o
|
||||
|
||||
obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o
|
||||
obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o
|
||||
|
@ -256,7 +256,7 @@ __v7_proc_info:
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
|
||||
.long cpu_v7_name
|
||||
.long v7_processor_functions
|
||||
.long v6wbi_tlb_fns
|
||||
.long v7wbi_tlb_fns
|
||||
.long v6_user_fns
|
||||
.long v7_cache_fns
|
||||
.size __v7_proc_info, . - __v7_proc_info
|
||||
|
88
arch/arm/mm/tlb-v7.S
Normal file
88
arch/arm/mm/tlb-v7.S
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* linux/arch/arm/mm/tlb-v7.S
|
||||
*
|
||||
* Copyright (C) 1997-2002 Russell King
|
||||
* Modified for ARMv7 by Catalin Marinas
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* ARM architecture version 6 TLB handling functions.
|
||||
* These assume a split I/D TLB.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include "proc-macros.S"
|
||||
|
||||
/*
|
||||
* v7wbi_flush_user_tlb_range(start, end, vma)
|
||||
*
|
||||
* Invalidate a range of TLB entries in the specified address space.
|
||||
*
|
||||
* - start - start address (may not be aligned)
|
||||
* - end - end address (exclusive, may not be aligned)
|
||||
* - vma - vma_struct describing address range
|
||||
*
|
||||
* It is assumed that:
|
||||
* - the "Invalidate single entry" instruction will invalidate
|
||||
* both the I and the D TLBs on Harvard-style TLBs
|
||||
*/
|
||||
ENTRY(v7wbi_flush_user_tlb_range)
|
||||
vma_vm_mm r3, r2 @ get vma->vm_mm
|
||||
mmid r3, r3 @ get vm_mm->context.id
|
||||
dsb
|
||||
mov r0, r0, lsr #PAGE_SHIFT @ align address
|
||||
mov r1, r1, lsr #PAGE_SHIFT
|
||||
asid r3, r3 @ mask ASID
|
||||
orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA
|
||||
mov r1, r1, lsl #PAGE_SHIFT
|
||||
vma_vm_flags r2, r2 @ get vma->vm_flags
|
||||
1:
|
||||
mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA (was 1)
|
||||
tst r2, #VM_EXEC @ Executable area ?
|
||||
mcrne p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA (was 1)
|
||||
add r0, r0, #PAGE_SZ
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c7, c5, 6 @ flush BTAC/BTB
|
||||
dsb
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* v7wbi_flush_kern_tlb_range(start,end)
|
||||
*
|
||||
* Invalidate a range of kernel TLB entries
|
||||
*
|
||||
* - start - start address (may not be aligned)
|
||||
* - end - end address (exclusive, may not be aligned)
|
||||
*/
|
||||
ENTRY(v7wbi_flush_kern_tlb_range)
|
||||
dsb
|
||||
mov r0, r0, lsr #PAGE_SHIFT @ align address
|
||||
mov r1, r1, lsr #PAGE_SHIFT
|
||||
mov r0, r0, lsl #PAGE_SHIFT
|
||||
mov r1, r1, lsl #PAGE_SHIFT
|
||||
1:
|
||||
mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA
|
||||
mcr p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA
|
||||
add r0, r0, #PAGE_SZ
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
mov r2, #0
|
||||
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
|
||||
dsb
|
||||
isb
|
||||
mov pc, lr
|
||||
|
||||
.section ".text.init", #alloc, #execinstr
|
||||
|
||||
.type v7wbi_tlb_fns, #object
|
||||
ENTRY(v7wbi_tlb_fns)
|
||||
.long v7wbi_flush_user_tlb_range
|
||||
.long v7wbi_flush_kern_tlb_range
|
||||
.long v6wbi_tlb_flags
|
||||
.size v7wbi_tlb_fns, . - v7wbi_tlb_fns
|
@ -273,4 +273,7 @@ static inline flag float64_lt_nocheck(float64 a, float64 b)
|
||||
extern flag float32_is_nan( float32 a );
|
||||
extern flag float64_is_nan( float64 a );
|
||||
|
||||
extern int32 float64_to_uint32( struct roundingData *roundData, float64 a );
|
||||
extern int32 float64_to_uint32_round_to_zero( float64 a );
|
||||
|
||||
#endif
|
||||
|
@ -257,8 +257,13 @@ static void em_stop(void)
|
||||
*/
|
||||
static void em_route_irq(int irq, unsigned int cpu)
|
||||
{
|
||||
irq_desc[irq].affinity = cpumask_of_cpu(cpu);
|
||||
irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu));
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
cpumask_t mask = cpumask_of_cpu(cpu);
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
desc->affinity = mask;
|
||||
desc->chip->set_affinity(irq, mask);
|
||||
spin_unlock_irq(&desc->lock);
|
||||
}
|
||||
|
||||
static int em_setup(void)
|
||||
|
@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = {
|
||||
.functionality = i2c_pxa_functionality,
|
||||
};
|
||||
|
||||
static struct pxa_i2c i2c_pxa = {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(i2c_pxa.lock),
|
||||
.adap = {
|
||||
.owner = THIS_MODULE,
|
||||
.algo = &i2c_pxa_algorithm,
|
||||
.name = "pxa2xx-i2c.0",
|
||||
.retries = 5,
|
||||
},
|
||||
};
|
||||
|
||||
#define res_len(r) ((r)->end - (r)->start + 1)
|
||||
static int i2c_pxa_probe(struct platform_device *dev)
|
||||
{
|
||||
struct pxa_i2c *i2c = &i2c_pxa;
|
||||
struct pxa_i2c *i2c;
|
||||
struct resource *res;
|
||||
struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
|
||||
int ret;
|
||||
@ -864,15 +854,20 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
||||
if (!request_mem_region(res->start, res_len(res), res->name))
|
||||
return -ENOMEM;
|
||||
|
||||
i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
|
||||
i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
|
||||
if (!i2c) {
|
||||
ret = -ENOMEM;
|
||||
goto emalloc;
|
||||
}
|
||||
|
||||
memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c));
|
||||
i2c->adap.owner = THIS_MODULE;
|
||||
i2c->adap.algo = &i2c_pxa_algorithm;
|
||||
i2c->adap.retries = 5;
|
||||
|
||||
spin_lock_init(&i2c->lock);
|
||||
init_waitqueue_head(&i2c->wait);
|
||||
i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10;
|
||||
|
||||
sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id);
|
||||
|
||||
i2c->reg_base = ioremap(res->start, res_len(res));
|
||||
if (!i2c->reg_base) {
|
||||
|
@ -170,7 +170,7 @@ static void ps2_close(struct serio *io)
|
||||
/*
|
||||
* Clear the input buffer.
|
||||
*/
|
||||
static void __init ps2_clear_input(struct ps2if *ps2if)
|
||||
static void __devinit ps2_clear_input(struct ps2if *ps2if)
|
||||
{
|
||||
int maxread = 100;
|
||||
|
||||
@ -228,7 +228,7 @@ static int __init ps2_test(struct ps2if *ps2if)
|
||||
/*
|
||||
* Add one device to this driver.
|
||||
*/
|
||||
static int ps2_probe(struct sa1111_dev *dev)
|
||||
static int __devinit ps2_probe(struct sa1111_dev *dev)
|
||||
{
|
||||
struct ps2if *ps2if;
|
||||
struct serio *serio;
|
||||
|
@ -167,8 +167,9 @@ static void pl010_rx_chars(struct uart_amba_port *uap)
|
||||
ignore_char:
|
||||
status = readb(uap->port.membase + UART01x_FR);
|
||||
}
|
||||
spin_unlock(&port->lock);
|
||||
tty_flip_buffer_push(tty);
|
||||
return;
|
||||
spin_lock(&port->lock);
|
||||
}
|
||||
|
||||
static void pl010_tx_chars(struct uart_amba_port *uap)
|
||||
|
@ -153,8 +153,9 @@ static void pl011_rx_chars(struct uart_amba_port *uap)
|
||||
ignore_char:
|
||||
status = readw(uap->port.membase + UART01x_FR);
|
||||
}
|
||||
spin_unlock(&uap->port.lock);
|
||||
tty_flip_buffer_push(tty);
|
||||
return;
|
||||
spin_lock(&uap->port.lock);
|
||||
}
|
||||
|
||||
static void pl011_tx_chars(struct uart_amba_port *uap)
|
||||
|
@ -589,7 +589,7 @@ static int __init ks8695_console_setup(struct console *co, char *options)
|
||||
return uart_set_options(port, co, baud, parity, bits, flow);
|
||||
}
|
||||
|
||||
extern struct uart_driver ks8695_reg;
|
||||
static struct uart_driver ks8695_reg;
|
||||
|
||||
static struct console ks8695_console = {
|
||||
.name = SERIAL_KS8695_DEVNAME,
|
||||
|
@ -10,7 +10,7 @@
|
||||
* based on ixdp425.h:
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
@ -36,31 +36,11 @@
|
||||
#define NAS100D_PCI_INTD_PIN 8
|
||||
#define NAS100D_PCI_INTE_PIN 7
|
||||
|
||||
/* GPIO */
|
||||
|
||||
#define NAS100D_GPIO0 0
|
||||
#define NAS100D_GPIO1 1
|
||||
#define NAS100D_GPIO2 2
|
||||
#define NAS100D_GPIO3 3
|
||||
#define NAS100D_GPIO4 4
|
||||
#define NAS100D_GPIO5 5
|
||||
#define NAS100D_GPIO6 6
|
||||
#define NAS100D_GPIO7 7
|
||||
#define NAS100D_GPIO8 8
|
||||
#define NAS100D_GPIO9 9
|
||||
#define NAS100D_GPIO10 10
|
||||
#define NAS100D_GPIO11 11
|
||||
#define NAS100D_GPIO12 12
|
||||
#define NAS100D_GPIO13 13
|
||||
#define NAS100D_GPIO14 14
|
||||
#define NAS100D_GPIO15 15
|
||||
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define NAS100D_PB_GPIO NAS100D_GPIO14
|
||||
#define NAS100D_RB_GPIO NAS100D_GPIO4
|
||||
#define NAS100D_PO_GPIO NAS100D_GPIO12 /* power off */
|
||||
#define NAS100D_PB_GPIO 14
|
||||
#define NAS100D_RB_GPIO 4
|
||||
#define NAS100D_PO_GPIO 12 /* power off */
|
||||
|
||||
#define NAS100D_PB_IRQ IRQ_IXP4XX_GPIO14
|
||||
#define NAS100D_RB_IRQ IRQ_IXP4XX_GPIO4
|
||||
|
@ -9,7 +9,7 @@
|
||||
* based on ixdp425.h:
|
||||
* Copyright 2004 (c) MontaVista, Software, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
@ -34,36 +34,14 @@
|
||||
#define NSLU2_PCI_INTC_PIN 9
|
||||
#define NSLU2_PCI_INTD_PIN 8
|
||||
|
||||
|
||||
/* NSLU2 Timer */
|
||||
#define NSLU2_FREQ 66000000
|
||||
#define NSLU2_CLOCK_TICK_RATE (((NSLU2_FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
|
||||
#define NSLU2_CLOCK_TICKS_PER_USEC ((NSLU2_CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC)
|
||||
|
||||
/* GPIO */
|
||||
|
||||
#define NSLU2_GPIO0 0
|
||||
#define NSLU2_GPIO1 1
|
||||
#define NSLU2_GPIO2 2
|
||||
#define NSLU2_GPIO3 3
|
||||
#define NSLU2_GPIO4 4
|
||||
#define NSLU2_GPIO5 5
|
||||
#define NSLU2_GPIO6 6
|
||||
#define NSLU2_GPIO7 7
|
||||
#define NSLU2_GPIO8 8
|
||||
#define NSLU2_GPIO9 9
|
||||
#define NSLU2_GPIO10 10
|
||||
#define NSLU2_GPIO11 11
|
||||
#define NSLU2_GPIO12 12
|
||||
#define NSLU2_GPIO13 13
|
||||
#define NSLU2_GPIO14 14
|
||||
#define NSLU2_GPIO15 15
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#define NSLU2_PB_GPIO NSLU2_GPIO5
|
||||
#define NSLU2_PO_GPIO NSLU2_GPIO8 /* power off */
|
||||
#define NSLU2_RB_GPIO NSLU2_GPIO12
|
||||
#define NSLU2_PB_GPIO 5
|
||||
#define NSLU2_PO_GPIO 8 /* power off */
|
||||
#define NSLU2_RB_GPIO 12
|
||||
|
||||
#define NSLU2_PB_IRQ IRQ_IXP4XX_GPIO5
|
||||
#define NSLU2_RB_IRQ IRQ_IXP4XX_GPIO12
|
||||
@ -79,16 +57,16 @@
|
||||
|
||||
/* LEDs */
|
||||
|
||||
#define NSLU2_LED_RED NSLU2_GPIO0
|
||||
#define NSLU2_LED_GRN NSLU2_GPIO1
|
||||
#define NSLU2_LED_RED_GPIO 0
|
||||
#define NSLU2_LED_GRN_GPIO 1
|
||||
|
||||
#define NSLU2_LED_RED_BM (1L << NSLU2_LED_RED)
|
||||
#define NSLU2_LED_GRN_BM (1L << NSLU2_LED_GRN)
|
||||
#define NSLU2_LED_RED_BM (1L << NSLU2_LED_RED_GPIO)
|
||||
#define NSLU2_LED_GRN_BM (1L << NSLU2_LED_GRN_GPIO)
|
||||
|
||||
#define NSLU2_LED_DISK1 NSLU2_GPIO3
|
||||
#define NSLU2_LED_DISK2 NSLU2_GPIO2
|
||||
#define NSLU2_LED_DISK1_GPIO 3
|
||||
#define NSLU2_LED_DISK2_GPIO 2
|
||||
|
||||
#define NSLU2_LED_DISK1_BM (1L << NSLU2_GPIO2)
|
||||
#define NSLU2_LED_DISK2_BM (1L << NSLU2_GPIO3)
|
||||
#define NSLU2_LED_DISK1_BM (1L << NSLU2_LED_DISK1_GPIO)
|
||||
#define NSLU2_LED_DISK2_BM (1L << NSLU2_LED_DISK2_GPIO)
|
||||
|
||||
|
||||
|
@ -113,6 +113,7 @@ extern unsigned long ixp4xx_timer_freq;
|
||||
extern void ixp4xx_map_io(void);
|
||||
extern void ixp4xx_init_irq(void);
|
||||
extern void ixp4xx_sys_init(void);
|
||||
extern void ixp4xx_timer_init(void);
|
||||
extern struct sys_timer ixp4xx_timer;
|
||||
extern void ixp4xx_pci_preinit(void);
|
||||
struct pci_sys_data;
|
||||
|
@ -153,6 +153,10 @@
|
||||
#define S3C2440_PA_AC97 (0x5B000000)
|
||||
#define S3C2440_SZ_AC97 SZ_1M
|
||||
|
||||
/* S3C2443 High-speed SD/MMC */
|
||||
#define S3C2443_PA_HSMMC (0x4A800000)
|
||||
#define S3C2443_SZ_HSMMC (256)
|
||||
|
||||
/* ISA style IO, for each machine to sort out mappings for, if it
|
||||
* implements it. We reserve two 16M regions for ISA.
|
||||
*/
|
||||
|
@ -98,5 +98,9 @@
|
||||
#define S3C2440_GPJ12_OUTP (0x01 << 24)
|
||||
#define S3C2440_GPJ12_CAMRESET (0x02 << 24)
|
||||
|
||||
#define S3C2443_GPJ13 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 13)
|
||||
#define S3C2443_GPJ14 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 14)
|
||||
#define S3C2443_GPJ15 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 15)
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_GPIOJ_H */
|
||||
|
||||
|
21
include/asm-arm/arch-s3c2410/regs-s3c2412.h
Normal file
21
include/asm-arm/arch-s3c2410/regs-s3c2412.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* linux/include/asm-arm/arch-s3c2410/regs-s3c2412.h
|
||||
*
|
||||
* Copyright 2007 Simtec Electronics
|
||||
* http://armlinux.simtec.co.uk/
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* S3C2412 specific register definitions
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_REGS_S3C2412_H
|
||||
#define __ASM_ARCH_REGS_S3C2412_H "s3c2412"
|
||||
|
||||
#define S3C2412_SWRST (S3C24XX_VA_CLKPWR + 0x30)
|
||||
#define S3C2412_SWRST_RESET (0x533C2412)
|
||||
|
||||
#endif /* __ASM_ARCH_REGS_S3C2412_H */
|
||||
|
@ -46,6 +46,10 @@
|
||||
#define TIOCSBRK 0x5427 /* BSD compatibility */
|
||||
#define TIOCCBRK 0x5428 /* BSD compatibility */
|
||||
#define TIOCGSID 0x5429 /* Return the session ID of FD */
|
||||
#define TCGETS2 _IOR('T',0x2A, struct termios2)
|
||||
#define TCSETS2 _IOW('T',0x2B, struct termios2)
|
||||
#define TCSETSW2 _IOW('T',0x2C, struct termios2)
|
||||
#define TCSETSF2 _IOW('T',0x2D, struct termios2)
|
||||
#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
|
||||
#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
|
||||
|
||||
|
@ -49,7 +49,7 @@ struct machine_desc {
|
||||
*/
|
||||
#define MACHINE_START(_type,_name) \
|
||||
static const struct machine_desc __mach_desc_##_type \
|
||||
__attribute_used__ \
|
||||
__used \
|
||||
__attribute__((__section__(".arch.info.init"))) = { \
|
||||
.nr = MACH_TYPE_##_type, \
|
||||
.name = _name,
|
||||
|
@ -185,7 +185,7 @@ struct tagtable {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define __tag __attribute_used__ __attribute__((__section__(".taglist.init")))
|
||||
#define __tag __used __attribute__((__section__(".taglist.init")))
|
||||
#define __tagtable(tag, fn) \
|
||||
static struct tagtable __tagtable_##fn __tag = { tag, fn }
|
||||
|
||||
@ -218,7 +218,7 @@ struct early_params {
|
||||
};
|
||||
|
||||
#define __early_param(name,fn) \
|
||||
static struct early_params __early_##fn __attribute_used__ \
|
||||
static struct early_params __early_##fn __used \
|
||||
__attribute__((__section__(".early_param.init"))) = { name, fn }
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -15,6 +15,17 @@ struct termios {
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
};
|
||||
|
||||
struct termios2 {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
||||
struct ktermios {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
@ -128,6 +139,7 @@ struct ktermios {
|
||||
#define HUPCL 0002000
|
||||
#define CLOCAL 0004000
|
||||
#define CBAUDEX 0010000
|
||||
#define BOTHER 0010000
|
||||
#define B57600 0010001
|
||||
#define B115200 0010002
|
||||
#define B230400 0010003
|
||||
@ -143,10 +155,12 @@ struct ktermios {
|
||||
#define B3000000 0010015
|
||||
#define B3500000 0010016
|
||||
#define B4000000 0010017
|
||||
#define CIBAUD 002003600000 /* input baud rate (not used) */
|
||||
#define CIBAUD 002003600000 /* input baud rate */
|
||||
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||
#define CRTSCTS 020000000000 /* flow control */
|
||||
|
||||
#define IBSHIFT 16
|
||||
|
||||
/* c_lflag bits */
|
||||
#define ISIG 0000001
|
||||
#define ICANON 0000002
|
||||
|
@ -82,8 +82,10 @@ struct termio {
|
||||
copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
|
||||
#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
|
||||
#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
@ -138,6 +138,19 @@
|
||||
# define v6wbi_always_flags (-1UL)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_TLB_V7
|
||||
# define v7wbi_possible_flags v6wbi_tlb_flags
|
||||
# define v7wbi_always_flags v6wbi_tlb_flags
|
||||
# ifdef _TLB
|
||||
# define MULTI_TLB 1
|
||||
# else
|
||||
# define _TLB v7wbi
|
||||
# endif
|
||||
#else
|
||||
# define v7wbi_possible_flags 0
|
||||
# define v7wbi_always_flags (-1UL)
|
||||
#endif
|
||||
|
||||
#ifndef _TLB
|
||||
#error Unknown TLB model
|
||||
#endif
|
||||
|
@ -173,7 +173,7 @@ struct tagtable {
|
||||
int (*parse)(const struct tag *);
|
||||
};
|
||||
|
||||
#define __tag __attribute_used__ __attribute__((__section__(".taglist")))
|
||||
#define __tag __used __attribute__((__section__(".taglist")))
|
||||
#define __tagtable(tag, fn) \
|
||||
static struct tagtable __tagtable_##fn __tag = { tag, fn }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user