Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6
This commit is contained in:
Коммит
05cd2544f4
|
@ -92,7 +92,7 @@ other HZ detail. Thus the CFS scheduler has no notion of "timeslices" in the
|
||||||
way the previous scheduler had, and has no heuristics whatsoever. There is
|
way the previous scheduler had, and has no heuristics whatsoever. There is
|
||||||
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
||||||
|
|
||||||
/proc/sys/kernel/sched_granularity_ns
|
/proc/sys/kernel/sched_min_granularity_ns
|
||||||
|
|
||||||
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
||||||
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -536,7 +536,7 @@ KBUILD_CFLAGS += -g
|
||||||
KBUILD_AFLAGS += -gdwarf-2
|
KBUILD_AFLAGS += -gdwarf-2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
KBUILD_CFLAGS += -pg
|
KBUILD_CFLAGS += -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ config ARM
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_KPROBES if (!XIP_KERNEL)
|
select HAVE_KPROBES if (!XIP_KERNEL)
|
||||||
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
||||||
select HAVE_FTRACE if (!XIP_KERNEL)
|
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
||||||
select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)
|
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
help
|
help
|
||||||
The ARM series is a line of low-power-consumption RISC chip designs
|
The ARM series is a line of low-power-consumption RISC chip designs
|
||||||
|
|
|
@ -70,7 +70,7 @@ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
||||||
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
||||||
head.o misc.o $(OBJS)
|
head.o misc.o $(OBJS)
|
||||||
|
|
||||||
ifeq ($(CONFIG_FTRACE),y)
|
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||||
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -54,11 +54,13 @@
|
||||||
/*
|
/*
|
||||||
* Prototypes
|
* Prototypes
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int sharpsl_off_charge_battery(void);
|
static int sharpsl_off_charge_battery(void);
|
||||||
static int sharpsl_check_battery_temp(void);
|
|
||||||
static int sharpsl_check_battery_voltage(void);
|
static int sharpsl_check_battery_voltage(void);
|
||||||
static int sharpsl_ac_check(void);
|
|
||||||
static int sharpsl_fatal_check(void);
|
static int sharpsl_fatal_check(void);
|
||||||
|
#endif
|
||||||
|
static int sharpsl_check_battery_temp(void);
|
||||||
|
static int sharpsl_ac_check(void);
|
||||||
static int sharpsl_average_value(int ad);
|
static int sharpsl_average_value(int ad);
|
||||||
static void sharpsl_average_clear(void);
|
static void sharpsl_average_clear(void);
|
||||||
static void sharpsl_charge_toggle(struct work_struct *private_);
|
static void sharpsl_charge_toggle(struct work_struct *private_);
|
||||||
|
@ -424,6 +426,7 @@ static int sharpsl_check_battery_temp(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int sharpsl_check_battery_voltage(void)
|
static int sharpsl_check_battery_voltage(void)
|
||||||
{
|
{
|
||||||
int val, i, buff[5];
|
int val, i, buff[5];
|
||||||
|
@ -455,6 +458,7 @@ static int sharpsl_check_battery_voltage(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int sharpsl_ac_check(void)
|
static int sharpsl_ac_check(void)
|
||||||
{
|
{
|
||||||
|
@ -586,8 +590,6 @@ static int corgi_pxa_pm_enter(suspend_state_t state)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for fatal battery errors
|
* Check for fatal battery errors
|
||||||
|
@ -738,7 +740,10 @@ static int sharpsl_off_charge_battery(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define sharpsl_pm_suspend NULL
|
||||||
|
#define sharpsl_pm_resume NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
|
static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
@ -768,10 +773,12 @@ static void sharpsl_apm_get_power_status(struct apm_power_info *info)
|
||||||
info->battery_life = sharpsl_pm.battstat.mainbat_percent;
|
info->battery_life = sharpsl_pm.battstat.mainbat_percent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static struct platform_suspend_ops sharpsl_pm_ops = {
|
static struct platform_suspend_ops sharpsl_pm_ops = {
|
||||||
.enter = corgi_pxa_pm_enter,
|
.enter = corgi_pxa_pm_enter,
|
||||||
.valid = suspend_valid_only_mem,
|
.valid = suspend_valid_only_mem,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
@ -802,7 +809,9 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
apm_get_power_status = sharpsl_apm_get_power_status;
|
apm_get_power_status = sharpsl_apm_get_power_status;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
suspend_set_ops(&sharpsl_pm_ops);
|
suspend_set_ops(&sharpsl_pm_ops);
|
||||||
|
#endif
|
||||||
|
|
||||||
mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
|
mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ASM_ARM_FTRACE
|
#ifndef _ASM_ARM_FTRACE
|
||||||
#define _ASM_ARM_FTRACE
|
#define _ASM_ARM_FTRACE
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#define MCOUNT_ADDR ((long)(mcount))
|
#define MCOUNT_ADDR ((long)(mcount))
|
||||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||||
|
|
||||||
|
|
|
@ -183,6 +183,6 @@ EXPORT_SYMBOL(_find_next_bit_be);
|
||||||
|
|
||||||
EXPORT_SYMBOL(copy_page);
|
EXPORT_SYMBOL(copy_page);
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
EXPORT_SYMBOL(mcount);
|
EXPORT_SYMBOL(mcount);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -101,7 +101,7 @@ ENDPROC(ret_from_fork)
|
||||||
#undef CALL
|
#undef CALL
|
||||||
#define CALL(x) .long x
|
#define CALL(x) .long x
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
ENTRY(mcount)
|
ENTRY(mcount)
|
||||||
stmdb sp!, {r0-r3, lr}
|
stmdb sp!, {r0-r3, lr}
|
||||||
|
@ -149,7 +149,7 @@ trace:
|
||||||
ftrace_stub:
|
ftrace_stub:
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
#endif /* CONFIG_FTRACE */
|
#endif /* CONFIG_FUNCTION_TRACER */
|
||||||
|
|
||||||
/*=============================================================================
|
/*=============================================================================
|
||||||
* SWI handler
|
* SWI handler
|
||||||
|
|
|
@ -95,19 +95,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftrace_mcount_set(unsigned long *data)
|
|
||||||
{
|
|
||||||
unsigned long pc, old;
|
|
||||||
unsigned long *addr = data;
|
|
||||||
unsigned char *new;
|
|
||||||
|
|
||||||
pc = (unsigned long)&mcount_call;
|
|
||||||
memcpy(&old, &mcount_call, MCOUNT_INSN_SIZE);
|
|
||||||
new = ftrace_call_replace(pc, *addr);
|
|
||||||
*addr = ftrace_modify_code(pc, (unsigned char *)&old, new);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* run from kstop_machine */
|
/* run from kstop_machine */
|
||||||
int __init ftrace_dyn_arch_init(void *data)
|
int __init ftrace_dyn_arch_init(void *data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -204,7 +204,9 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
|
||||||
.read_devdata = corgipm_read_devdata,
|
.read_devdata = corgipm_read_devdata,
|
||||||
.charger_wakeup = corgi_charger_wakeup,
|
.charger_wakeup = corgi_charger_wakeup,
|
||||||
.should_wakeup = corgi_should_wakeup,
|
.should_wakeup = corgi_should_wakeup,
|
||||||
#ifdef CONFIG_BACKLIGHT_CORGI
|
#if defined(CONFIG_LCD_CORGI)
|
||||||
|
.backlight_limit = corgi_lcd_limit_intensity,
|
||||||
|
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||||
.backlight_limit = corgibl_limit_intensity,
|
.backlight_limit = corgibl_limit_intensity,
|
||||||
#endif
|
#endif
|
||||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct corgits_machinfo {
|
||||||
* SharpSL Backlight
|
* SharpSL Backlight
|
||||||
*/
|
*/
|
||||||
extern void corgibl_limit_intensity(int limit);
|
extern void corgibl_limit_intensity(int limit);
|
||||||
|
extern void corgi_lcd_limit_intensity(int limit);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -385,6 +385,16 @@ static void __init spitz_init_spi(void)
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_2;
|
goto err_free_2;
|
||||||
|
|
||||||
|
err = gpio_direction_output(SPITZ_GPIO_ADS7846_CS, 1);
|
||||||
|
if (err)
|
||||||
|
goto err_free_3;
|
||||||
|
err = gpio_direction_output(SPITZ_GPIO_LCDCON_CS, 1);
|
||||||
|
if (err)
|
||||||
|
goto err_free_3;
|
||||||
|
err = gpio_direction_output(SPITZ_GPIO_MAX1111_CS, 1);
|
||||||
|
if (err)
|
||||||
|
goto err_free_3;
|
||||||
|
|
||||||
if (machine_is_akita()) {
|
if (machine_is_akita()) {
|
||||||
spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
|
spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
|
||||||
spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
|
spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
|
||||||
|
@ -394,6 +404,8 @@ static void __init spitz_init_spi(void)
|
||||||
spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
|
spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
err_free_3:
|
||||||
|
gpio_free(SPITZ_GPIO_MAX1111_CS);
|
||||||
err_free_2:
|
err_free_2:
|
||||||
gpio_free(SPITZ_GPIO_LCDCON_CS);
|
gpio_free(SPITZ_GPIO_LCDCON_CS);
|
||||||
err_free_1:
|
err_free_1:
|
||||||
|
|
|
@ -198,7 +198,9 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
|
||||||
.read_devdata = spitzpm_read_devdata,
|
.read_devdata = spitzpm_read_devdata,
|
||||||
.charger_wakeup = spitz_charger_wakeup,
|
.charger_wakeup = spitz_charger_wakeup,
|
||||||
.should_wakeup = spitz_should_wakeup,
|
.should_wakeup = spitz_should_wakeup,
|
||||||
#ifdef CONFIG_BACKLIGHT_CORGI
|
#if defined(CONFIG_LCD_CORGI)
|
||||||
|
.backlight_limit = corgi_lcd_limit_intensity,
|
||||||
|
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||||
.backlight_limit = corgibl_limit_intensity,
|
.backlight_limit = corgibl_limit_intensity,
|
||||||
#endif
|
#endif
|
||||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||||
|
|
|
@ -365,7 +365,8 @@ struct kvm_vcpu_arch {
|
||||||
long itc_offset;
|
long itc_offset;
|
||||||
unsigned long itc_check;
|
unsigned long itc_check;
|
||||||
unsigned long timer_check;
|
unsigned long timer_check;
|
||||||
unsigned long timer_pending;
|
unsigned int timer_pending;
|
||||||
|
unsigned int timer_fired;
|
||||||
|
|
||||||
unsigned long vrr[8];
|
unsigned long vrr[8];
|
||||||
unsigned long ibr[8];
|
unsigned long ibr[8];
|
||||||
|
@ -417,6 +418,9 @@ struct kvm_arch {
|
||||||
struct list_head assigned_dev_head;
|
struct list_head assigned_dev_head;
|
||||||
struct dmar_domain *intel_iommu_domain;
|
struct dmar_domain *intel_iommu_domain;
|
||||||
struct hlist_head irq_ack_notifier_list;
|
struct hlist_head irq_ack_notifier_list;
|
||||||
|
|
||||||
|
unsigned long irq_sources_bitmap;
|
||||||
|
unsigned long irq_states[KVM_IOAPIC_NUM_PINS];
|
||||||
};
|
};
|
||||||
|
|
||||||
union cpuid3_t {
|
union cpuid3_t {
|
||||||
|
|
|
@ -29,13 +29,18 @@ define cmd_offsets
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "#endif" ) > $@
|
echo "#endif" ) > $@
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# We use internal rules to avoid the "is up to date" message from make
|
# We use internal rules to avoid the "is up to date" message from make
|
||||||
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c
|
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c \
|
||||||
|
$(wildcard $(srctree)/arch/ia64/include/asm/*.h)\
|
||||||
|
$(wildcard $(srctree)/include/linux/*.h)
|
||||||
$(call if_changed_dep,cc_s_c)
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
$(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
$(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
||||||
$(call cmd,offsets)
|
$(call cmd,offsets)
|
||||||
|
|
||||||
|
FORCE : $(obj)/$(offsets-file)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Makefile for Kernel-based Virtual Machine module
|
# Makefile for Kernel-based Virtual Machine module
|
||||||
#
|
#
|
||||||
|
@ -53,7 +58,6 @@ endif
|
||||||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||||
obj-$(CONFIG_KVM) += kvm.o
|
obj-$(CONFIG_KVM) += kvm.o
|
||||||
|
|
||||||
FORCE : $(obj)/$(offsets-file)
|
|
||||||
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
||||||
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
||||||
vtlb.o process.o
|
vtlb.o process.o
|
||||||
|
|
|
@ -385,6 +385,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
struct kvm *kvm = vcpu->kvm;
|
struct kvm *kvm = vcpu->kvm;
|
||||||
struct call_data call_data;
|
struct call_data call_data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
call_data.ptc_g_data = p->u.ptc_g_data;
|
call_data.ptc_g_data = p->u.ptc_g_data;
|
||||||
|
|
||||||
for (i = 0; i < KVM_MAX_VCPUS; i++) {
|
for (i = 0; i < KVM_MAX_VCPUS; i++) {
|
||||||
|
@ -418,33 +419,41 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu)
|
||||||
ktime_t kt;
|
ktime_t kt;
|
||||||
long itc_diff;
|
long itc_diff;
|
||||||
unsigned long vcpu_now_itc;
|
unsigned long vcpu_now_itc;
|
||||||
|
|
||||||
unsigned long expires;
|
unsigned long expires;
|
||||||
struct hrtimer *p_ht = &vcpu->arch.hlt_timer;
|
struct hrtimer *p_ht = &vcpu->arch.hlt_timer;
|
||||||
unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec;
|
unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec;
|
||||||
struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
|
struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
|
||||||
|
|
||||||
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
|
||||||
|
|
||||||
if (time_after(vcpu_now_itc, vpd->itm)) {
|
|
||||||
vcpu->arch.timer_check = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
itc_diff = vpd->itm - vcpu_now_itc;
|
|
||||||
if (itc_diff < 0)
|
|
||||||
itc_diff = -itc_diff;
|
|
||||||
|
|
||||||
expires = div64_u64(itc_diff, cyc_per_usec);
|
|
||||||
kt = ktime_set(0, 1000 * expires);
|
|
||||||
vcpu->arch.ht_active = 1;
|
|
||||||
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
|
||||||
|
|
||||||
if (irqchip_in_kernel(vcpu->kvm)) {
|
if (irqchip_in_kernel(vcpu->kvm)) {
|
||||||
|
|
||||||
|
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
||||||
|
|
||||||
|
if (time_after(vcpu_now_itc, vpd->itm)) {
|
||||||
|
vcpu->arch.timer_check = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
itc_diff = vpd->itm - vcpu_now_itc;
|
||||||
|
if (itc_diff < 0)
|
||||||
|
itc_diff = -itc_diff;
|
||||||
|
|
||||||
|
expires = div64_u64(itc_diff, cyc_per_usec);
|
||||||
|
kt = ktime_set(0, 1000 * expires);
|
||||||
|
|
||||||
|
down_read(&vcpu->kvm->slots_lock);
|
||||||
|
vcpu->arch.ht_active = 1;
|
||||||
|
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
||||||
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_HALTED;
|
vcpu->arch.mp_state = KVM_MP_STATE_HALTED;
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
hrtimer_cancel(p_ht);
|
hrtimer_cancel(p_ht);
|
||||||
vcpu->arch.ht_active = 0;
|
vcpu->arch.ht_active = 0;
|
||||||
|
|
||||||
|
if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests))
|
||||||
|
if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED)
|
||||||
|
vcpu->arch.mp_state =
|
||||||
|
KVM_MP_STATE_RUNNABLE;
|
||||||
|
up_read(&vcpu->kvm->slots_lock);
|
||||||
|
|
||||||
if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE)
|
if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE)
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -484,10 +493,6 @@ static int (*kvm_vti_exit_handlers[])(struct kvm_vcpu *vcpu,
|
||||||
static const int kvm_vti_max_exit_handlers =
|
static const int kvm_vti_max_exit_handlers =
|
||||||
sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers);
|
sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers);
|
||||||
|
|
||||||
static void kvm_prepare_guest_switch(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
|
static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct exit_ctl_data *p_exit_data;
|
struct exit_ctl_data *p_exit_data;
|
||||||
|
@ -600,8 +605,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
again:
|
again:
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
kvm_prepare_guest_switch(vcpu);
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current)) {
|
||||||
|
@ -614,7 +617,7 @@ again:
|
||||||
|
|
||||||
vcpu->guest_mode = 1;
|
vcpu->guest_mode = 1;
|
||||||
kvm_guest_enter();
|
kvm_guest_enter();
|
||||||
|
down_read(&vcpu->kvm->slots_lock);
|
||||||
r = vti_vcpu_run(vcpu, kvm_run);
|
r = vti_vcpu_run(vcpu, kvm_run);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
@ -634,9 +637,8 @@ again:
|
||||||
* But we need to prevent reordering, hence this barrier():
|
* But we need to prevent reordering, hence this barrier():
|
||||||
*/
|
*/
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
kvm_guest_exit();
|
kvm_guest_exit();
|
||||||
|
up_read(&vcpu->kvm->slots_lock);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
r = kvm_handle_exit(kvm_run, vcpu);
|
r = kvm_handle_exit(kvm_run, vcpu);
|
||||||
|
@ -673,6 +675,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
|
clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
@ -778,6 +781,9 @@ static void kvm_init_vm(struct kvm *kvm)
|
||||||
kvm_build_io_pmt(kvm);
|
kvm_build_io_pmt(kvm);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
|
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
|
||||||
|
|
||||||
|
/* Reserve bit 0 of irq_sources_bitmap for userspace irq source */
|
||||||
|
set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kvm *kvm_arch_create_vm(void)
|
struct kvm *kvm_arch_create_vm(void)
|
||||||
|
@ -941,9 +947,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
goto out;
|
goto out;
|
||||||
if (irqchip_in_kernel(kvm)) {
|
if (irqchip_in_kernel(kvm)) {
|
||||||
mutex_lock(&kvm->lock);
|
mutex_lock(&kvm->lock);
|
||||||
kvm_ioapic_set_irq(kvm->arch.vioapic,
|
kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
|
||||||
irq_event.irq,
|
irq_event.irq, irq_event.level);
|
||||||
irq_event.level);
|
|
||||||
mutex_unlock(&kvm->lock);
|
mutex_unlock(&kvm->lock);
|
||||||
r = 0;
|
r = 0;
|
||||||
}
|
}
|
||||||
|
@ -1123,15 +1128,16 @@ static enum hrtimer_restart hlt_timer_fn(struct hrtimer *data)
|
||||||
wait_queue_head_t *q;
|
wait_queue_head_t *q;
|
||||||
|
|
||||||
vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer);
|
vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer);
|
||||||
|
q = &vcpu->wq;
|
||||||
|
|
||||||
if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED)
|
if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
q = &vcpu->wq;
|
if (waitqueue_active(q))
|
||||||
if (waitqueue_active(q)) {
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
|
||||||
wake_up_interruptible(q);
|
wake_up_interruptible(q);
|
||||||
}
|
|
||||||
out:
|
out:
|
||||||
|
vcpu->arch.timer_fired = 1;
|
||||||
vcpu->arch.timer_check = 1;
|
vcpu->arch.timer_check = 1;
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
}
|
}
|
||||||
|
@ -1700,12 +1706,14 @@ static void vcpu_kick_intr(void *info)
|
||||||
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
|
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
int ipi_pcpu = vcpu->cpu;
|
int ipi_pcpu = vcpu->cpu;
|
||||||
|
int cpu = get_cpu();
|
||||||
|
|
||||||
if (waitqueue_active(&vcpu->wq))
|
if (waitqueue_active(&vcpu->wq))
|
||||||
wake_up_interruptible(&vcpu->wq);
|
wake_up_interruptible(&vcpu->wq);
|
||||||
|
|
||||||
if (vcpu->guest_mode)
|
if (vcpu->guest_mode && cpu != ipi_pcpu)
|
||||||
smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0);
|
smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0);
|
||||||
|
put_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
||||||
|
@ -1715,13 +1723,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
||||||
|
|
||||||
if (!test_and_set_bit(vec, &vpd->irr[0])) {
|
if (!test_and_set_bit(vec, &vpd->irr[0])) {
|
||||||
vcpu->arch.irq_new_pending = 1;
|
vcpu->arch.irq_new_pending = 1;
|
||||||
if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE)
|
kvm_vcpu_kick(vcpu);
|
||||||
kvm_vcpu_kick(vcpu);
|
|
||||||
else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) {
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
|
||||||
if (waitqueue_active(&vcpu->wq))
|
|
||||||
wake_up_interruptible(&vcpu->wq);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1791,7 +1793,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return 0;
|
return vcpu->arch.timer_fired;
|
||||||
}
|
}
|
||||||
|
|
||||||
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
|
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
|
||||||
|
|
|
@ -286,6 +286,12 @@ static u64 kvm_get_pal_call_index(struct kvm_vcpu *vcpu)
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prepare_for_halt(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
vcpu->arch.timer_pending = 1;
|
||||||
|
vcpu->arch.timer_fired = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -304,11 +310,10 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
break;
|
break;
|
||||||
case PAL_HALT_LIGHT:
|
case PAL_HALT_LIGHT:
|
||||||
{
|
{
|
||||||
vcpu->arch.timer_pending = 1;
|
|
||||||
INIT_PAL_STATUS_SUCCESS(result);
|
INIT_PAL_STATUS_SUCCESS(result);
|
||||||
|
prepare_for_halt(vcpu);
|
||||||
if (kvm_highest_pending_irq(vcpu) == -1)
|
if (kvm_highest_pending_irq(vcpu) == -1)
|
||||||
ret = kvm_emulate_halt(vcpu);
|
ret = kvm_emulate_halt(vcpu);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -713,7 +713,7 @@ void leave_hypervisor_tail(void)
|
||||||
if (!(VCPU(v, itv) & (1 << 16))) {
|
if (!(VCPU(v, itv) & (1 << 16))) {
|
||||||
vcpu_pend_interrupt(v, VCPU(v, itv)
|
vcpu_pend_interrupt(v, VCPU(v, itv)
|
||||||
& 0xff);
|
& 0xff);
|
||||||
VMX(v, itc_check) = 0;
|
VMX(v, itc_check) = 0;
|
||||||
} else {
|
} else {
|
||||||
v->arch.timer_pending = 1;
|
v->arch.timer_pending = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,21 +238,8 @@ config MIPS_SIM
|
||||||
This option enables support for MIPS Technologies MIPSsim software
|
This option enables support for MIPS Technologies MIPSsim software
|
||||||
emulator.
|
emulator.
|
||||||
|
|
||||||
config MARKEINS
|
config MACH_EMMA
|
||||||
bool "NEC EMMA2RH Mark-eins"
|
bool "NEC EMMA series based machines"
|
||||||
select CEVT_R4K
|
|
||||||
select CSRC_R4K
|
|
||||||
select DMA_NONCOHERENT
|
|
||||||
select HW_HAS_PCI
|
|
||||||
select IRQ_CPU
|
|
||||||
select SWAP_IO_SPACE
|
|
||||||
select SYS_SUPPORTS_32BIT_KERNEL
|
|
||||||
select SYS_SUPPORTS_BIG_ENDIAN
|
|
||||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
||||||
select SYS_HAS_CPU_R5000
|
|
||||||
help
|
|
||||||
This enables support for the R5432-based NEC Mark-eins
|
|
||||||
boards with R5500 CPU.
|
|
||||||
|
|
||||||
config MACH_VR41XX
|
config MACH_VR41XX
|
||||||
bool "NEC VR4100 series based machines"
|
bool "NEC VR4100 series based machines"
|
||||||
|
@ -261,6 +248,19 @@ config MACH_VR41XX
|
||||||
select SYS_HAS_CPU_VR41XX
|
select SYS_HAS_CPU_VR41XX
|
||||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
|
|
||||||
|
config NXP_STB220
|
||||||
|
bool "NXP STB220 board"
|
||||||
|
select SOC_PNX833X
|
||||||
|
help
|
||||||
|
Support for NXP Semiconductors STB220 Development Board.
|
||||||
|
|
||||||
|
config NXP_STB225
|
||||||
|
bool "NXP 225 board"
|
||||||
|
select SOC_PNX833X
|
||||||
|
select SOC_PNX8335
|
||||||
|
help
|
||||||
|
Support for NXP Semiconductors STB225 Development Board.
|
||||||
|
|
||||||
config PNX8550_JBS
|
config PNX8550_JBS
|
||||||
bool "NXP PNX8550 based JBS board"
|
bool "NXP PNX8550 based JBS board"
|
||||||
select PNX8550
|
select PNX8550
|
||||||
|
@ -601,6 +601,7 @@ endchoice
|
||||||
|
|
||||||
source "arch/mips/alchemy/Kconfig"
|
source "arch/mips/alchemy/Kconfig"
|
||||||
source "arch/mips/basler/excite/Kconfig"
|
source "arch/mips/basler/excite/Kconfig"
|
||||||
|
source "arch/mips/emma/Kconfig"
|
||||||
source "arch/mips/jazz/Kconfig"
|
source "arch/mips/jazz/Kconfig"
|
||||||
source "arch/mips/lasat/Kconfig"
|
source "arch/mips/lasat/Kconfig"
|
||||||
source "arch/mips/pmc-sierra/Kconfig"
|
source "arch/mips/pmc-sierra/Kconfig"
|
||||||
|
@ -849,6 +850,24 @@ config MIPS_RM9122
|
||||||
bool
|
bool
|
||||||
select SERIAL_RM9000
|
select SERIAL_RM9000
|
||||||
|
|
||||||
|
config SOC_PNX833X
|
||||||
|
bool
|
||||||
|
select CEVT_R4K
|
||||||
|
select CSRC_R4K
|
||||||
|
select IRQ_CPU
|
||||||
|
select DMA_NONCOHERENT
|
||||||
|
select SYS_HAS_CPU_MIPS32_R2
|
||||||
|
select SYS_SUPPORTS_32BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||||
|
select SYS_SUPPORTS_BIG_ENDIAN
|
||||||
|
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
|
select GENERIC_GPIO
|
||||||
|
select CPU_MIPSR2_IRQ_VI
|
||||||
|
|
||||||
|
config SOC_PNX8335
|
||||||
|
bool
|
||||||
|
select SOC_PNX833X
|
||||||
|
|
||||||
config PNX8550
|
config PNX8550
|
||||||
bool
|
bool
|
||||||
select SOC_PNX8550
|
select SOC_PNX8550
|
||||||
|
@ -1092,6 +1111,16 @@ config CPU_R5432
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
select CPU_SUPPORTS_64BIT_KERNEL
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
|
||||||
|
config CPU_R5500
|
||||||
|
bool "R5500"
|
||||||
|
depends on SYS_HAS_CPU_R5500
|
||||||
|
select CPU_HAS_LLSC
|
||||||
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
help
|
||||||
|
NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV
|
||||||
|
instruction set.
|
||||||
|
|
||||||
config CPU_R6000
|
config CPU_R6000
|
||||||
bool "R6000"
|
bool "R6000"
|
||||||
depends on EXPERIMENTAL
|
depends on EXPERIMENTAL
|
||||||
|
@ -1202,6 +1231,9 @@ config SYS_HAS_CPU_R5000
|
||||||
config SYS_HAS_CPU_R5432
|
config SYS_HAS_CPU_R5432
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config SYS_HAS_CPU_R5500
|
||||||
|
bool
|
||||||
|
|
||||||
config SYS_HAS_CPU_R6000
|
config SYS_HAS_CPU_R6000
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,8 @@ cflags-$(CONFIG_CPU_MIPS64_R2) += $(call cc-option,-march=mips64r2,-mips64r2 -U_
|
||||||
cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap
|
cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \
|
cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \
|
||||||
-Wa,--trap
|
-Wa,--trap
|
||||||
|
cflags-$(CONFIG_CPU_R5500) += $(call cc-option,-march=r5500,-march=r5000) \
|
||||||
|
-Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \
|
cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \
|
||||||
-Wa,--trap
|
-Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \
|
cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \
|
||||||
|
@ -381,6 +383,14 @@ load-$(CONFIG_CASIO_E55) += 0xffffffff80004000
|
||||||
#
|
#
|
||||||
load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000
|
load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000
|
||||||
|
|
||||||
|
# NXP STB225
|
||||||
|
core-$(CONFIG_SOC_PNX833X) += arch/mips/nxp/pnx833x/common/
|
||||||
|
cflags-$(CONFIG_SOC_PNX833X) += -Iarch/mips/include/asm/mach-pnx833x
|
||||||
|
libs-$(CONFIG_NXP_STB220) += arch/mips/nxp/pnx833x/stb22x/
|
||||||
|
load-$(CONFIG_NXP_STB220) += 0xffffffff80001000
|
||||||
|
libs-$(CONFIG_NXP_STB225) += arch/mips/nxp/pnx833x/stb22x/
|
||||||
|
load-$(CONFIG_NXP_STB225) += 0xffffffff80001000
|
||||||
|
|
||||||
#
|
#
|
||||||
# Common NXP PNX8550
|
# Common NXP PNX8550
|
||||||
#
|
#
|
||||||
|
@ -399,14 +409,17 @@ load-$(CONFIG_PNX8550_JBS) += 0xffffffff80060000
|
||||||
libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/
|
libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/
|
||||||
load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000
|
load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000
|
||||||
|
|
||||||
# NEC EMMA2RH boards
|
|
||||||
#
|
#
|
||||||
core-$(CONFIG_EMMA2RH) += arch/mips/emma2rh/common/
|
# Common NEC EMMAXXX
|
||||||
cflags-$(CONFIG_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
|
#
|
||||||
|
core-$(CONFIG_SOC_EMMA) += arch/mips/emma/common/
|
||||||
|
cflags-$(CONFIG_SOC_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
|
||||||
|
|
||||||
|
#
|
||||||
# NEC EMMA2RH Mark-eins
|
# NEC EMMA2RH Mark-eins
|
||||||
core-$(CONFIG_MARKEINS) += arch/mips/emma2rh/markeins/
|
#
|
||||||
load-$(CONFIG_MARKEINS) += 0xffffffff88100000
|
core-$(CONFIG_NEC_MARKEINS) += arch/mips/emma/markeins/
|
||||||
|
load-$(CONFIG_NEC_MARKEINS) += 0xffffffff88100000
|
||||||
|
|
||||||
#
|
#
|
||||||
# SGI IP22 (Indy/Indigo2)
|
# SGI IP22 (Indy/Indigo2)
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/mach-au1x00/au1xxx.h>
|
#include <asm/mach-au1x00/au1xxx.h>
|
||||||
|
#include <asm/mach-au1x00/au1xxx_dbdma.h>
|
||||||
|
#include <asm/mach-au1x00/au1100_mmc.h>
|
||||||
|
|
||||||
#define PORT(_base, _irq) \
|
#define PORT(_base, _irq) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -163,24 +165,6 @@ static struct resource au1xxx_usb_gdt_resources[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource au1xxx_mmc_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = SD0_PHYS_ADDR,
|
|
||||||
.end = SD0_PHYS_ADDR + 0x7ffff,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = SD1_PHYS_ADDR,
|
|
||||||
.end = SD1_PHYS_ADDR + 0x7ffff,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[2] = {
|
|
||||||
.start = AU1200_SD_INT,
|
|
||||||
.end = AU1200_SD_INT,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 udc_dmamask = DMA_32BIT_MASK;
|
static u64 udc_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
static struct platform_device au1xxx_usb_gdt_device = {
|
static struct platform_device au1xxx_usb_gdt_device = {
|
||||||
|
@ -249,16 +233,79 @@ static struct platform_device au1200_lcd_device = {
|
||||||
|
|
||||||
static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK;
|
static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
static struct platform_device au1xxx_mmc_device = {
|
extern struct au1xmmc_platform_data au1xmmc_platdata[2];
|
||||||
|
|
||||||
|
static struct resource au1200_mmc0_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SD0_PHYS_ADDR,
|
||||||
|
.end = SD0_PHYS_ADDR + 0x7ffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AU1200_SD_INT,
|
||||||
|
.end = AU1200_SD_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_TX0,
|
||||||
|
.end = DSCR_CMD0_SDMS_TX0,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_RX0,
|
||||||
|
.end = DSCR_CMD0_SDMS_RX0,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device au1200_mmc0_device = {
|
||||||
.name = "au1xxx-mmc",
|
.name = "au1xxx-mmc",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &au1xxx_mmc_dmamask,
|
.dma_mask = &au1xxx_mmc_dmamask,
|
||||||
.coherent_dma_mask = DMA_32BIT_MASK,
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = &au1xmmc_platdata[0],
|
||||||
},
|
},
|
||||||
.num_resources = ARRAY_SIZE(au1xxx_mmc_resources),
|
.num_resources = ARRAY_SIZE(au1200_mmc0_resources),
|
||||||
.resource = au1xxx_mmc_resources,
|
.resource = au1200_mmc0_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
static struct resource au1200_mmc1_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SD1_PHYS_ADDR,
|
||||||
|
.end = SD1_PHYS_ADDR + 0x7ffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AU1200_SD_INT,
|
||||||
|
.end = AU1200_SD_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_TX1,
|
||||||
|
.end = DSCR_CMD0_SDMS_TX1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_RX1,
|
||||||
|
.end = DSCR_CMD0_SDMS_RX1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device au1200_mmc1_device = {
|
||||||
|
.name = "au1xxx-mmc",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &au1xxx_mmc_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = &au1xmmc_platdata[1],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(au1200_mmc1_resources),
|
||||||
|
.resource = au1200_mmc1_resources,
|
||||||
|
};
|
||||||
|
#endif /* #ifndef CONFIG_MIPS_DB1200 */
|
||||||
#endif /* #ifdef CONFIG_SOC_AU1200 */
|
#endif /* #ifdef CONFIG_SOC_AU1200 */
|
||||||
|
|
||||||
static struct platform_device au1x00_pcmcia_device = {
|
static struct platform_device au1x00_pcmcia_device = {
|
||||||
|
@ -296,7 +343,10 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
||||||
&au1xxx_usb_gdt_device,
|
&au1xxx_usb_gdt_device,
|
||||||
&au1xxx_usb_otg_device,
|
&au1xxx_usb_otg_device,
|
||||||
&au1200_lcd_device,
|
&au1200_lcd_device,
|
||||||
&au1xxx_mmc_device,
|
&au1200_mmc0_device,
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
&au1200_mmc1_device,
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef SMBUS_PSC_BASE
|
#ifdef SMBUS_PSC_BASE
|
||||||
&pbdb_smbus_device,
|
&pbdb_smbus_device,
|
||||||
|
|
|
@ -20,9 +20,90 @@
|
||||||
|
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <asm/mach-au1x00/au1xxx.h>
|
#include <asm/mach-au1x00/au1xxx.h>
|
||||||
|
#include <asm/mach-au1x00/au1100_mmc.h>
|
||||||
|
|
||||||
|
static int mmc_activity;
|
||||||
|
|
||||||
|
static void pb1200mmc0_set_power(void *mmc_host, int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
bcsr->board |= BCSR_BOARD_SD0PWR;
|
||||||
|
else
|
||||||
|
bcsr->board &= ~BCSR_BOARD_SD0PWR;
|
||||||
|
|
||||||
|
au_sync_delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc0_card_readonly(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->status & BCSR_STATUS_SD0WP) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc0_card_inserted(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->sig_status & BCSR_INT_SD0INSERT) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pb1200_mmcled_set(struct led_classdev *led,
|
||||||
|
enum led_brightness brightness)
|
||||||
|
{
|
||||||
|
if (brightness != LED_OFF) {
|
||||||
|
if (++mmc_activity == 1)
|
||||||
|
bcsr->disk_leds &= ~(1 << 8);
|
||||||
|
} else {
|
||||||
|
if (--mmc_activity == 0)
|
||||||
|
bcsr->disk_leds |= (1 << 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct led_classdev pb1200mmc_led = {
|
||||||
|
.brightness_set = pb1200_mmcled_set,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
static void pb1200mmc1_set_power(void *mmc_host, int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
bcsr->board |= BCSR_BOARD_SD1PWR;
|
||||||
|
else
|
||||||
|
bcsr->board &= ~BCSR_BOARD_SD1PWR;
|
||||||
|
|
||||||
|
au_sync_delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc1_card_readonly(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->status & BCSR_STATUS_SD1WP) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc1_card_inserted(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->sig_status & BCSR_INT_SD1INSERT) ? 1 : 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const struct au1xmmc_platform_data au1xmmc_platdata[2] = {
|
||||||
|
[0] = {
|
||||||
|
.set_power = pb1200mmc0_set_power,
|
||||||
|
.card_inserted = pb1200mmc0_card_inserted,
|
||||||
|
.card_readonly = pb1200mmc0_card_readonly,
|
||||||
|
.cd_setup = NULL, /* use poll-timer in driver */
|
||||||
|
.led = &pb1200mmc_led,
|
||||||
|
},
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
[1] = {
|
||||||
|
.set_power = pb1200mmc1_set_power,
|
||||||
|
.card_inserted = pb1200mmc1_card_inserted,
|
||||||
|
.card_readonly = pb1200mmc1_card_readonly,
|
||||||
|
.cd_setup = NULL, /* use poll-timer in driver */
|
||||||
|
.led = &pb1200mmc_led,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource ide_resources[] = {
|
static struct resource ide_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,29 @@
|
||||||
|
choice
|
||||||
|
prompt "Machine type"
|
||||||
|
depends on MACH_EMMA
|
||||||
|
default NEC_MARKEINS
|
||||||
|
|
||||||
|
config NEC_MARKEINS
|
||||||
|
bool "NEC EMMA2RH Mark-eins board"
|
||||||
|
select SOC_EMMA2RH
|
||||||
|
select HW_HAS_PCI
|
||||||
|
help
|
||||||
|
This enables support for the NEC Electronics Mark-eins boards.
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config SOC_EMMA2RH
|
||||||
|
bool
|
||||||
|
select SOC_EMMA
|
||||||
|
select SYS_HAS_CPU_R5500
|
||||||
|
select SYS_SUPPORTS_32BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_64BIT_KERNEL
|
||||||
|
|
||||||
|
config SOC_EMMA
|
||||||
|
bool
|
||||||
|
select CEVT_R4K
|
||||||
|
select CSRC_R4K
|
||||||
|
select DMA_NONCOHERENT
|
||||||
|
select IRQ_CPU
|
||||||
|
select SWAP_IO_SPACE
|
||||||
|
select SYS_SUPPORTS_BIG_ENDIAN
|
|
@ -10,4 +10,4 @@
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_MARKEINS) += irq.o irq_emma2rh.o prom.o
|
obj-$(CONFIG_NEC_MARKEINS) += prom.o
|
|
@ -29,11 +29,11 @@
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
const char *get_system_type(void)
|
const char *get_system_type(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
return "NEC EMMA2RH Mark-eins";
|
return "NEC EMMA2RH Mark-eins";
|
||||||
#else
|
#else
|
||||||
#error Unknown NEC board
|
#error Unknown NEC board
|
||||||
|
@ -60,7 +60,7 @@ void __init prom_init(void)
|
||||||
strcat(arcs_cmdline, " ");
|
strcat(arcs_cmdline, " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM);
|
add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM);
|
||||||
#else
|
#else
|
||||||
#error Unknown NEC board
|
#error Unknown NEC board
|
|
@ -10,4 +10,4 @@
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_MARKEINS) += irq.o irq_markeins.o setup.o led.o platform.o
|
obj-$(CONFIG_NEC_MARKEINS) += irq.o setup.o led.o platform.o
|
|
@ -0,0 +1,331 @@
|
||||||
|
/*
|
||||||
|
* arch/mips/emma2rh/markeins/irq.c
|
||||||
|
* This file defines the irq handler for EMMA2RH.
|
||||||
|
*
|
||||||
|
* Copyright (C) NEC Electronics Corporation 2004-2006
|
||||||
|
*
|
||||||
|
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
||||||
|
*
|
||||||
|
* Copyright 2001 MontaVista Software Inc.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
|
#include <asm/irq_cpu.h>
|
||||||
|
#include <asm/system.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/addrspace.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
|
static void emma2rh_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg_value;
|
||||||
|
u32 reg_bitmask;
|
||||||
|
u32 reg_index;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_IRQ_BASE;
|
||||||
|
|
||||||
|
reg_index = EMMA2RH_BHIF_INT_EN_0 +
|
||||||
|
(EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32);
|
||||||
|
reg_value = emma2rh_in32(reg_index);
|
||||||
|
reg_bitmask = 0x1 << (irq % 32);
|
||||||
|
emma2rh_out32(reg_index, reg_value | reg_bitmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg_value;
|
||||||
|
u32 reg_bitmask;
|
||||||
|
u32 reg_index;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_IRQ_BASE;
|
||||||
|
|
||||||
|
reg_index = EMMA2RH_BHIF_INT_EN_0 +
|
||||||
|
(EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32);
|
||||||
|
reg_value = emma2rh_in32(reg_index);
|
||||||
|
reg_bitmask = 0x1 << (irq % 32);
|
||||||
|
emma2rh_out32(reg_index, reg_value & ~reg_bitmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_irq_controller = {
|
||||||
|
.name = "emma2rh_irq",
|
||||||
|
.ack = emma2rh_irq_disable,
|
||||||
|
.mask = emma2rh_irq_disable,
|
||||||
|
.mask_ack = emma2rh_irq_disable,
|
||||||
|
.unmask = emma2rh_irq_enable,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ; i++)
|
||||||
|
set_irq_chip_and_handler(EMMA2RH_IRQ_BASE + i,
|
||||||
|
&emma2rh_irq_controller,
|
||||||
|
handle_level_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_sw_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_SW_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_sw_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_SW_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_sw_irq_controller = {
|
||||||
|
.name = "emma2rh_sw_irq",
|
||||||
|
.ack = emma2rh_sw_irq_disable,
|
||||||
|
.mask = emma2rh_sw_irq_disable,
|
||||||
|
.mask_ack = emma2rh_sw_irq_disable,
|
||||||
|
.unmask = emma2rh_sw_irq_enable,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_sw_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ_SW; i++)
|
||||||
|
set_irq_chip_and_handler(EMMA2RH_SW_IRQ_BASE + i,
|
||||||
|
&emma2rh_sw_irq_controller,
|
||||||
|
handle_level_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_ack(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq));
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_end(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_gpio_irq_controller = {
|
||||||
|
.name = "emma2rh_gpio_irq",
|
||||||
|
.ack = emma2rh_gpio_irq_ack,
|
||||||
|
.mask = emma2rh_gpio_irq_disable,
|
||||||
|
.mask_ack = emma2rh_gpio_irq_ack,
|
||||||
|
.unmask = emma2rh_gpio_irq_enable,
|
||||||
|
.end = emma2rh_gpio_irq_end,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_gpio_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ_GPIO; i++)
|
||||||
|
set_irq_chip(EMMA2RH_GPIO_IRQ_BASE + i,
|
||||||
|
&emma2rh_gpio_irq_controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction irq_cascade = {
|
||||||
|
.handler = no_action,
|
||||||
|
.flags = 0,
|
||||||
|
.mask = CPU_MASK_NONE,
|
||||||
|
.name = "cascade",
|
||||||
|
.dev_id = NULL,
|
||||||
|
.next = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the first level int-handler will jump here if it is a emma2rh irq
|
||||||
|
*/
|
||||||
|
void emma2rh_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
u32 intStatus;
|
||||||
|
u32 bitmask;
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_0);
|
||||||
|
|
||||||
|
#ifdef EMMA2RH_SW_CASCADE
|
||||||
|
if (intStatus &
|
||||||
|
(1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
||||||
|
u32 swIntStatus;
|
||||||
|
swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT)
|
||||||
|
& emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (swIntStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_SW_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_1);
|
||||||
|
|
||||||
|
#ifdef EMMA2RH_GPIO_CASCADE
|
||||||
|
if (intStatus &
|
||||||
|
(1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
||||||
|
u32 gpioIntStatus;
|
||||||
|
gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST)
|
||||||
|
& emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (gpioIntStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_2);
|
||||||
|
|
||||||
|
for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init arch_init_irq(void)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
/* by default, interrupts are disabled. */
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0);
|
||||||
|
|
||||||
|
clear_c0_status(0xff00);
|
||||||
|
set_c0_status(0x0400);
|
||||||
|
|
||||||
|
#define GPIO_PCI (0xf<<15)
|
||||||
|
/* setup GPIO interrupt for PCI interface */
|
||||||
|
/* direction input */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_DIR);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI);
|
||||||
|
/* disable interrupt */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI);
|
||||||
|
/* level triggerd */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI);
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI));
|
||||||
|
/* interrupt clear */
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI);
|
||||||
|
|
||||||
|
/* init all controllers */
|
||||||
|
emma2rh_irq_init();
|
||||||
|
emma2rh_sw_irq_init();
|
||||||
|
emma2rh_gpio_irq_init();
|
||||||
|
mips_cpu_irq_init();
|
||||||
|
|
||||||
|
/* setup cascade interrupts */
|
||||||
|
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade);
|
||||||
|
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade);
|
||||||
|
setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade);
|
||||||
|
}
|
||||||
|
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
||||||
|
|
||||||
|
if (pending & STATUSF_IP7)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 7);
|
||||||
|
else if (pending & STATUSF_IP2)
|
||||||
|
emma2rh_irq_dispatch();
|
||||||
|
else if (pending & STATUSF_IP1)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 1);
|
||||||
|
else if (pending & STATUSF_IP0)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 0);
|
||||||
|
else
|
||||||
|
spurious_interrupt();
|
||||||
|
}
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
const unsigned long clear = 0x20202020;
|
const unsigned long clear = 0x20202020;
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
|
|
||||||
#define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */
|
#define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */
|
|
@ -29,7 +29,7 @@
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/common/irq.c
|
|
||||||
* This file is common irq dispatcher.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/bootinfo.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the first level int-handler will jump here if it is a emma2rh irq
|
|
||||||
*/
|
|
||||||
void emma2rh_irq_dispatch(void)
|
|
||||||
{
|
|
||||||
u32 intStatus;
|
|
||||||
u32 bitmask;
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_0);
|
|
||||||
|
|
||||||
#ifdef EMMA2RH_SW_CASCADE
|
|
||||||
if (intStatus &
|
|
||||||
(1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
|
||||||
u32 swIntStatus;
|
|
||||||
swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (swIntStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_SW_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_1);
|
|
||||||
|
|
||||||
#ifdef EMMA2RH_GPIO_CASCADE
|
|
||||||
if (intStatus &
|
|
||||||
(1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
|
||||||
u32 gpioIntStatus;
|
|
||||||
gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST)
|
|
||||||
& emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (gpioIntStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_2);
|
|
||||||
|
|
||||||
for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/common/irq_emma2rh.c
|
|
||||||
* This file defines the irq handler for EMMA2RH.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EMMA2RH defines 64 IRQs.
|
|
||||||
*
|
|
||||||
* This file exports one function:
|
|
||||||
* emma2rh_irq_init(u32 irq_base);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
|
|
||||||
#include <asm/debug.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/* number of total irqs supported by EMMA2RH */
|
|
||||||
#define NUM_EMMA2RH_IRQ 96
|
|
||||||
|
|
||||||
static int emma2rh_irq_base = -1;
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_enable(int);
|
|
||||||
void ll_emma2rh_irq_disable(int);
|
|
||||||
|
|
||||||
static void emma2rh_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_irq_enable(irq - emma2rh_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_irq_disable(irq - emma2rh_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_irq_controller = {
|
|
||||||
.name = "emma2rh_irq",
|
|
||||||
.ack = emma2rh_irq_disable,
|
|
||||||
.mask = emma2rh_irq_disable,
|
|
||||||
.mask_ack = emma2rh_irq_disable,
|
|
||||||
.unmask = emma2rh_irq_enable,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ; i++)
|
|
||||||
set_irq_chip_and_handler(i, &emma2rh_irq_controller,
|
|
||||||
handle_level_irq);
|
|
||||||
|
|
||||||
emma2rh_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_enable(int emma2rh_irq)
|
|
||||||
{
|
|
||||||
u32 reg_value;
|
|
||||||
u32 reg_bitmask;
|
|
||||||
u32 reg_index;
|
|
||||||
|
|
||||||
reg_index = EMMA2RH_BHIF_INT_EN_0
|
|
||||||
+ (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0)
|
|
||||||
* (emma2rh_irq / 32);
|
|
||||||
reg_value = emma2rh_in32(reg_index);
|
|
||||||
reg_bitmask = 0x1 << (emma2rh_irq % 32);
|
|
||||||
db_assert((reg_value & reg_bitmask) == 0);
|
|
||||||
emma2rh_out32(reg_index, reg_value | reg_bitmask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_disable(int emma2rh_irq)
|
|
||||||
{
|
|
||||||
u32 reg_value;
|
|
||||||
u32 reg_bitmask;
|
|
||||||
u32 reg_index;
|
|
||||||
|
|
||||||
reg_index = EMMA2RH_BHIF_INT_EN_0
|
|
||||||
+ (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0)
|
|
||||||
* (emma2rh_irq / 32);
|
|
||||||
reg_value = emma2rh_in32(reg_index);
|
|
||||||
reg_bitmask = 0x1 << (emma2rh_irq % 32);
|
|
||||||
db_assert((reg_value & reg_bitmask) != 0);
|
|
||||||
emma2rh_out32(reg_index, reg_value & ~reg_bitmask);
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/markeins/irq.c
|
|
||||||
* This file defines the irq handler for EMMA2RH.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2004-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
#include <linux/delay.h>
|
|
||||||
|
|
||||||
#include <asm/irq_cpu.h>
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/debug.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/bootinfo.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IRQ mapping
|
|
||||||
*
|
|
||||||
* 0-7: 8 CPU interrupts
|
|
||||||
* 0 - software interrupt 0
|
|
||||||
* 1 - software interrupt 1
|
|
||||||
* 2 - most Vrc5477 interrupts are routed to this pin
|
|
||||||
* 3 - (optional) some other interrupts routed to this pin for debugg
|
|
||||||
* 4 - not used
|
|
||||||
* 5 - not used
|
|
||||||
* 6 - not used
|
|
||||||
* 7 - cpu timer (used by default)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void emma2rh_sw_irq_init(u32 base);
|
|
||||||
extern void emma2rh_gpio_irq_init(u32 base);
|
|
||||||
extern void emma2rh_irq_init(u32 base);
|
|
||||||
extern void emma2rh_irq_dispatch(void);
|
|
||||||
|
|
||||||
static struct irqaction irq_cascade = {
|
|
||||||
.handler = no_action,
|
|
||||||
.flags = 0,
|
|
||||||
.mask = CPU_MASK_NONE,
|
|
||||||
.name = "cascade",
|
|
||||||
.dev_id = NULL,
|
|
||||||
.next = NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init arch_init_irq(void)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_run(printk("markeins_irq_setup invoked.\n"));
|
|
||||||
|
|
||||||
/* by default, interrupts are disabled. */
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0);
|
|
||||||
|
|
||||||
clear_c0_status(0xff00);
|
|
||||||
set_c0_status(0x0400);
|
|
||||||
|
|
||||||
#define GPIO_PCI (0xf<<15)
|
|
||||||
/* setup GPIO interrupt for PCI interface */
|
|
||||||
/* direction input */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_DIR);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI);
|
|
||||||
/* disable interrupt */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI);
|
|
||||||
/* level triggerd */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI);
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI));
|
|
||||||
/* interrupt clear */
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI);
|
|
||||||
|
|
||||||
/* init all controllers */
|
|
||||||
emma2rh_irq_init(EMMA2RH_IRQ_BASE);
|
|
||||||
emma2rh_sw_irq_init(EMMA2RH_SW_IRQ_BASE);
|
|
||||||
emma2rh_gpio_irq_init(EMMA2RH_GPIO_IRQ_BASE);
|
|
||||||
mips_cpu_irq_init();
|
|
||||||
|
|
||||||
/* setup cascade interrupts */
|
|
||||||
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade);
|
|
||||||
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade);
|
|
||||||
setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade);
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage void plat_irq_dispatch(void)
|
|
||||||
{
|
|
||||||
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
|
||||||
|
|
||||||
if (pending & STATUSF_IP7)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 7);
|
|
||||||
else if (pending & STATUSF_IP2)
|
|
||||||
emma2rh_irq_dispatch();
|
|
||||||
else if (pending & STATUSF_IP1)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 1);
|
|
||||||
else if (pending & STATUSF_IP0)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 0);
|
|
||||||
else
|
|
||||||
spurious_interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,158 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/markeins/irq_markeins.c
|
|
||||||
* This file defines the irq handler for Mark-eins.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2004-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
|
|
||||||
#include <asm/debug.h>
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
static int emma2rh_sw_irq_base = -1;
|
|
||||||
static int emma2rh_gpio_irq_base = -1;
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_enable(int reg);
|
|
||||||
void ll_emma2rh_sw_irq_disable(int reg);
|
|
||||||
void ll_emma2rh_gpio_irq_enable(int reg);
|
|
||||||
void ll_emma2rh_gpio_irq_disable(int reg);
|
|
||||||
|
|
||||||
static void emma2rh_sw_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_sw_irq_enable(irq - emma2rh_sw_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_sw_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_sw_irq_controller = {
|
|
||||||
.name = "emma2rh_sw_irq",
|
|
||||||
.ack = emma2rh_sw_irq_disable,
|
|
||||||
.mask = emma2rh_sw_irq_disable,
|
|
||||||
.mask_ack = emma2rh_sw_irq_disable,
|
|
||||||
.unmask = emma2rh_sw_irq_enable,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_sw_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_SW; i++)
|
|
||||||
set_irq_chip_and_handler(i, &emma2rh_sw_irq_controller,
|
|
||||||
handle_level_irq);
|
|
||||||
|
|
||||||
emma2rh_sw_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_enable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_SW);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
reg |= 1 << irq;
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_disable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < 32);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
reg &= ~(1 << irq);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_gpio_irq_disable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_ack(unsigned int irq)
|
|
||||||
{
|
|
||||||
irq -= emma2rh_gpio_irq_base;
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq));
|
|
||||||
ll_emma2rh_gpio_irq_disable(irq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_end(unsigned int irq)
|
|
||||||
{
|
|
||||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
|
||||||
ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_gpio_irq_controller = {
|
|
||||||
.name = "emma2rh_gpio_irq",
|
|
||||||
.ack = emma2rh_gpio_irq_ack,
|
|
||||||
.mask = emma2rh_gpio_irq_disable,
|
|
||||||
.mask_ack = emma2rh_gpio_irq_ack,
|
|
||||||
.unmask = emma2rh_gpio_irq_enable,
|
|
||||||
.end = emma2rh_gpio_irq_end,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_gpio_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_GPIO; i++)
|
|
||||||
set_irq_chip(i, &emma2rh_gpio_irq_controller);
|
|
||||||
|
|
||||||
emma2rh_gpio_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_gpio_irq_enable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_GPIO);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
reg |= 1 << irq;
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_gpio_irq_disable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_GPIO);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
reg &= ~(1 << irq);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* include/asm-mips/emma2rh/emma2rh.h
|
* arch/mips/include/asm/emma/emma2rh.h
|
||||||
* This file is EMMA2RH common header.
|
* This file is EMMA2RH common header.
|
||||||
*
|
*
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
* Copyright (C) NEC Electronics Corporation 2005-2006
|
||||||
|
@ -21,8 +21,8 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
#ifndef __ASM_EMMA2RH_EMMA2RH_H
|
#ifndef __ASM_EMMA_EMMA2RH_H
|
||||||
#define __ASM_EMMA2RH_EMMA2RH_H
|
#define __ASM_EMMA_EMMA2RH_H
|
||||||
|
|
||||||
#include <irq.h>
|
#include <irq.h>
|
||||||
|
|
||||||
|
@ -206,7 +206,6 @@ static inline void emma2rh_out32(u32 offset, u32 val)
|
||||||
static inline u32 emma2rh_in32(u32 offset)
|
static inline u32 emma2rh_in32(u32 offset)
|
||||||
{
|
{
|
||||||
u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset);
|
u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +218,6 @@ static inline void emma2rh_out16(u32 offset, u16 val)
|
||||||
static inline u16 emma2rh_in16(u32 offset)
|
static inline u16 emma2rh_in16(u32 offset)
|
||||||
{
|
{
|
||||||
u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset);
|
u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +230,6 @@ static inline void emma2rh_out8(u32 offset, u8 val)
|
||||||
static inline u8 emma2rh_in8(u32 offset)
|
static inline u8 emma2rh_in8(u32 offset)
|
||||||
{
|
{
|
||||||
u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset);
|
u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,10 +321,10 @@ static inline u8 emma2rh_in8(u32 offset)
|
||||||
/*
|
/*
|
||||||
* include the board dependent part
|
* include the board dependent part
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
#include <asm/emma2rh/markeins.h>
|
#include <asm/emma/markeins.h>
|
||||||
#else
|
#else
|
||||||
#error "Unknown EMMA2RH board!"
|
#error "Unknown EMMA2RH board!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_EMMA2RH_EMMA2RH_H */
|
#endif /* __ASM_EMMA_EMMA2RH_H */
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Zhang Le <r0bertz@gentoo.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU General
|
||||||
|
* Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this program; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
|
||||||
|
* 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LEMOTE_PCI_H_
|
||||||
|
#define _LEMOTE_PCI_H_
|
||||||
|
|
||||||
|
#define LOONGSON2E_PCI_MEM_START 0x14000000UL
|
||||||
|
#define LOONGSON2E_PCI_MEM_END 0x1fffffffUL
|
||||||
|
#define LOONGSON2E_PCI_IO_START 0x00004000UL
|
||||||
|
#define LOONGSON2E_IO_PORT_BASE 0x1fd00000UL
|
||||||
|
|
||||||
|
#endif /* !_LEMOTE_PCI_H_ */
|
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* gpio.h: GPIO Support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_GPIO_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_GPIO_H
|
||||||
|
|
||||||
|
/* BIG FAT WARNING: races danger!
|
||||||
|
No protections exist here. Current users are only early init code,
|
||||||
|
when locking is not needed because no cuncurency yet exists there,
|
||||||
|
and GPIO IRQ dispatcher, which does locking.
|
||||||
|
However, if many uses will ever happen, proper locking will be needed
|
||||||
|
- including locking between different uses
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pnx833x.h"
|
||||||
|
|
||||||
|
#define SET_REG_BIT(reg, bit) do { (reg |= (1 << (bit))); } while (0)
|
||||||
|
#define CLEAR_REG_BIT(reg, bit) do { (reg &= ~(1 << (bit))); } while (0)
|
||||||
|
|
||||||
|
/* Initialize GPIO to a known state */
|
||||||
|
static inline void pnx833x_gpio_init(void)
|
||||||
|
{
|
||||||
|
PNX833X_PIO_DIR = 0;
|
||||||
|
PNX833X_PIO_DIR2 = 0;
|
||||||
|
PNX833X_PIO_SEL = 0;
|
||||||
|
PNX833X_PIO_SEL2 = 0;
|
||||||
|
PNX833X_PIO_INT_EDGE = 0;
|
||||||
|
PNX833X_PIO_INT_HI = 0;
|
||||||
|
PNX833X_PIO_INT_LO = 0;
|
||||||
|
|
||||||
|
/* clear any GPIO interrupt requests */
|
||||||
|
PNX833X_PIO_INT_CLEAR = 0xffff;
|
||||||
|
PNX833X_PIO_INT_CLEAR = 0;
|
||||||
|
PNX833X_PIO_INT_ENABLE = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select GPIO direction for a pin */
|
||||||
|
static inline void pnx833x_gpio_select_input(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_DIR, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_DIR2, pin & 31);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_select_output(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_DIR, pin);
|
||||||
|
else
|
||||||
|
SET_REG_BIT(PNX833X_PIO_DIR2, pin & 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select GPIO or alternate function for a pin */
|
||||||
|
static inline void pnx833x_gpio_select_function_io(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_SEL, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_SEL2, pin & 31);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_select_function_alt(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_SEL, pin);
|
||||||
|
else
|
||||||
|
SET_REG_BIT(PNX833X_PIO_SEL2, pin & 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read GPIO pin */
|
||||||
|
static inline int pnx833x_gpio_read(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
return (PNX833X_PIO_IN >> pin) & 1;
|
||||||
|
else
|
||||||
|
return (PNX833X_PIO_IN2 >> (pin & 31)) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write GPIO pin */
|
||||||
|
static inline void pnx833x_gpio_write(unsigned int val, unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32) {
|
||||||
|
if (val)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_OUT, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_OUT, pin);
|
||||||
|
} else {
|
||||||
|
if (val)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_OUT2, pin & 31);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_OUT2, pin & 31);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure GPIO interrupt */
|
||||||
|
#define GPIO_INT_NONE 0
|
||||||
|
#define GPIO_INT_LEVEL_LOW 1
|
||||||
|
#define GPIO_INT_LEVEL_HIGH 2
|
||||||
|
#define GPIO_INT_EDGE_RISING 3
|
||||||
|
#define GPIO_INT_EDGE_FALLING 4
|
||||||
|
#define GPIO_INT_EDGE_BOTH 5
|
||||||
|
static inline void pnx833x_gpio_setup_irq(int when, unsigned int pin)
|
||||||
|
{
|
||||||
|
switch (when) {
|
||||||
|
case GPIO_INT_LEVEL_LOW:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_LEVEL_HIGH:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_RISING:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_FALLING:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_BOTH:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable/disable GPIO interrupt */
|
||||||
|
static inline void pnx833x_gpio_enable_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_ENABLE, pin);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_disable_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_ENABLE, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear GPIO interrupt request */
|
||||||
|
static inline void pnx833x_gpio_clear_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_CLEAR, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_CLEAR, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,126 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* irq.h: IRQ mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H
|
||||||
|
/*
|
||||||
|
* The "IRQ numbers" are completely virtual.
|
||||||
|
*
|
||||||
|
* In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48.
|
||||||
|
* Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 49..64 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
* In PNX8335, we have 57 interrupt lines, numbered from 1 to 57,
|
||||||
|
* connected to PIC, which uses core hardware interrupt 2, and also
|
||||||
|
* a timer interrupt through hardware interrupt 5.
|
||||||
|
* Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 65..80 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <irq.h>
|
||||||
|
|
||||||
|
#define PNX833X_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7)
|
||||||
|
|
||||||
|
/* Interrupts supported by PIC */
|
||||||
|
#define PNX833X_PIC_I2C0_INT (PNX833X_PIC_IRQ_BASE + 1)
|
||||||
|
#define PNX833X_PIC_I2C1_INT (PNX833X_PIC_IRQ_BASE + 2)
|
||||||
|
#define PNX833X_PIC_UART0_INT (PNX833X_PIC_IRQ_BASE + 3)
|
||||||
|
#define PNX833X_PIC_UART1_INT (PNX833X_PIC_IRQ_BASE + 4)
|
||||||
|
#define PNX833X_PIC_TS_IN0_DV_INT (PNX833X_PIC_IRQ_BASE + 5)
|
||||||
|
#define PNX833X_PIC_TS_IN0_DMA_INT (PNX833X_PIC_IRQ_BASE + 6)
|
||||||
|
#define PNX833X_PIC_GPIO_INT (PNX833X_PIC_IRQ_BASE + 7)
|
||||||
|
#define PNX833X_PIC_AUDIO_DEC_INT (PNX833X_PIC_IRQ_BASE + 8)
|
||||||
|
#define PNX833X_PIC_VIDEO_DEC_INT (PNX833X_PIC_IRQ_BASE + 9)
|
||||||
|
#define PNX833X_PIC_CONFIG_INT (PNX833X_PIC_IRQ_BASE + 10)
|
||||||
|
#define PNX833X_PIC_AOI_INT (PNX833X_PIC_IRQ_BASE + 11)
|
||||||
|
#define PNX833X_PIC_SYNC_INT (PNX833X_PIC_IRQ_BASE + 12)
|
||||||
|
#define PNX8330_PIC_SPU_INT (PNX833X_PIC_IRQ_BASE + 13)
|
||||||
|
#define PNX8335_PIC_SATA_INT (PNX833X_PIC_IRQ_BASE + 13)
|
||||||
|
#define PNX833X_PIC_OSD_INT (PNX833X_PIC_IRQ_BASE + 14)
|
||||||
|
#define PNX833X_PIC_DISP1_INT (PNX833X_PIC_IRQ_BASE + 15)
|
||||||
|
#define PNX833X_PIC_DEINTERLACER_INT (PNX833X_PIC_IRQ_BASE + 16)
|
||||||
|
#define PNX833X_PIC_DISPLAY2_INT (PNX833X_PIC_IRQ_BASE + 17)
|
||||||
|
#define PNX833X_PIC_VC_INT (PNX833X_PIC_IRQ_BASE + 18)
|
||||||
|
#define PNX833X_PIC_SC_INT (PNX833X_PIC_IRQ_BASE + 19)
|
||||||
|
#define PNX833X_PIC_IDE_INT (PNX833X_PIC_IRQ_BASE + 20)
|
||||||
|
#define PNX833X_PIC_IDE_DMA_INT (PNX833X_PIC_IRQ_BASE + 21)
|
||||||
|
#define PNX833X_PIC_TS_IN1_DV_INT (PNX833X_PIC_IRQ_BASE + 22)
|
||||||
|
#define PNX833X_PIC_TS_IN1_DMA_INT (PNX833X_PIC_IRQ_BASE + 23)
|
||||||
|
#define PNX833X_PIC_SGDX_DMA_INT (PNX833X_PIC_IRQ_BASE + 24)
|
||||||
|
#define PNX833X_PIC_TS_OUT_INT (PNX833X_PIC_IRQ_BASE + 25)
|
||||||
|
#define PNX833X_PIC_IR_INT (PNX833X_PIC_IRQ_BASE + 26)
|
||||||
|
#define PNX833X_PIC_VMSP1_INT (PNX833X_PIC_IRQ_BASE + 27)
|
||||||
|
#define PNX833X_PIC_VMSP2_INT (PNX833X_PIC_IRQ_BASE + 28)
|
||||||
|
#define PNX833X_PIC_PIBC_INT (PNX833X_PIC_IRQ_BASE + 29)
|
||||||
|
#define PNX833X_PIC_TS_IN0_TRD_INT (PNX833X_PIC_IRQ_BASE + 30)
|
||||||
|
#define PNX833X_PIC_SGDX_TPD_INT (PNX833X_PIC_IRQ_BASE + 31)
|
||||||
|
#define PNX833X_PIC_USB_INT (PNX833X_PIC_IRQ_BASE + 32)
|
||||||
|
#define PNX833X_PIC_TS_IN1_TRD_INT (PNX833X_PIC_IRQ_BASE + 33)
|
||||||
|
#define PNX833X_PIC_CLOCK_INT (PNX833X_PIC_IRQ_BASE + 34)
|
||||||
|
#define PNX833X_PIC_SGDX_PARSER_INT (PNX833X_PIC_IRQ_BASE + 35)
|
||||||
|
#define PNX833X_PIC_VMSP_DMA_INT (PNX833X_PIC_IRQ_BASE + 36)
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
#define PNX8335_PIC_MIU_INT (PNX833X_PIC_IRQ_BASE + 37)
|
||||||
|
#define PNX8335_PIC_AVCHIP_IRQ_INT (PNX833X_PIC_IRQ_BASE + 38)
|
||||||
|
#define PNX8335_PIC_SYNC_HD_INT (PNX833X_PIC_IRQ_BASE + 39)
|
||||||
|
#define PNX8335_PIC_DISP_HD_INT (PNX833X_PIC_IRQ_BASE + 40)
|
||||||
|
#define PNX8335_PIC_DISP_SCALER_INT (PNX833X_PIC_IRQ_BASE + 41)
|
||||||
|
#define PNX8335_PIC_OSD_HD1_INT (PNX833X_PIC_IRQ_BASE + 42)
|
||||||
|
#define PNX8335_PIC_DTL_WRITER_Y_INT (PNX833X_PIC_IRQ_BASE + 43)
|
||||||
|
#define PNX8335_PIC_DTL_WRITER_C_INT (PNX833X_PIC_IRQ_BASE + 44)
|
||||||
|
#define PNX8335_PIC_DTL_EMULATOR_Y_IR_INT (PNX833X_PIC_IRQ_BASE + 45)
|
||||||
|
#define PNX8335_PIC_DTL_EMULATOR_C_IR_INT (PNX833X_PIC_IRQ_BASE + 46)
|
||||||
|
#define PNX8335_PIC_DENC_TTX_INT (PNX833X_PIC_IRQ_BASE + 47)
|
||||||
|
#define PNX8335_PIC_MMI_SIF0_INT (PNX833X_PIC_IRQ_BASE + 48)
|
||||||
|
#define PNX8335_PIC_MMI_SIF1_INT (PNX833X_PIC_IRQ_BASE + 49)
|
||||||
|
#define PNX8335_PIC_MMI_CDMMU_INT (PNX833X_PIC_IRQ_BASE + 50)
|
||||||
|
#define PNX8335_PIC_PIBCS_INT (PNX833X_PIC_IRQ_BASE + 51)
|
||||||
|
#define PNX8335_PIC_ETHERNET_INT (PNX833X_PIC_IRQ_BASE + 52)
|
||||||
|
#define PNX8335_PIC_VMSP1_0_INT (PNX833X_PIC_IRQ_BASE + 53)
|
||||||
|
#define PNX8335_PIC_VMSP1_1_INT (PNX833X_PIC_IRQ_BASE + 54)
|
||||||
|
#define PNX8335_PIC_VMSP1_DMA_INT (PNX833X_PIC_IRQ_BASE + 55)
|
||||||
|
#define PNX8335_PIC_TDGR_DE_INT (PNX833X_PIC_IRQ_BASE + 56)
|
||||||
|
#define PNX8335_PIC_IR1_IRQ_INT (PNX833X_PIC_IRQ_BASE + 57)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GPIO interrupts */
|
||||||
|
#define PNX833X_GPIO_0_INT (PNX833X_GPIO_IRQ_BASE + 0)
|
||||||
|
#define PNX833X_GPIO_1_INT (PNX833X_GPIO_IRQ_BASE + 1)
|
||||||
|
#define PNX833X_GPIO_2_INT (PNX833X_GPIO_IRQ_BASE + 2)
|
||||||
|
#define PNX833X_GPIO_3_INT (PNX833X_GPIO_IRQ_BASE + 3)
|
||||||
|
#define PNX833X_GPIO_4_INT (PNX833X_GPIO_IRQ_BASE + 4)
|
||||||
|
#define PNX833X_GPIO_5_INT (PNX833X_GPIO_IRQ_BASE + 5)
|
||||||
|
#define PNX833X_GPIO_6_INT (PNX833X_GPIO_IRQ_BASE + 6)
|
||||||
|
#define PNX833X_GPIO_7_INT (PNX833X_GPIO_IRQ_BASE + 7)
|
||||||
|
#define PNX833X_GPIO_8_INT (PNX833X_GPIO_IRQ_BASE + 8)
|
||||||
|
#define PNX833X_GPIO_9_INT (PNX833X_GPIO_IRQ_BASE + 9)
|
||||||
|
#define PNX833X_GPIO_10_INT (PNX833X_GPIO_IRQ_BASE + 10)
|
||||||
|
#define PNX833X_GPIO_11_INT (PNX833X_GPIO_IRQ_BASE + 11)
|
||||||
|
#define PNX833X_GPIO_12_INT (PNX833X_GPIO_IRQ_BASE + 12)
|
||||||
|
#define PNX833X_GPIO_13_INT (PNX833X_GPIO_IRQ_BASE + 13)
|
||||||
|
#define PNX833X_GPIO_14_INT (PNX833X_GPIO_IRQ_BASE + 14)
|
||||||
|
#define PNX833X_GPIO_15_INT (PNX833X_GPIO_IRQ_BASE + 15)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* irq.h: IRQ mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_IRQ_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_IRQ_H
|
||||||
|
/*
|
||||||
|
* The "IRQ numbers" are completely virtual.
|
||||||
|
*
|
||||||
|
* In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48.
|
||||||
|
* Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 49..64 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
* In PNX8335, we have 57 interrupt lines, numbered from 1 to 57,
|
||||||
|
* connected to PIC, which uses core hardware interrupt 2, and also
|
||||||
|
* a timer interrupt through hardware interrupt 5.
|
||||||
|
* Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 65..80 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
#define PNX833X_PIC_NUM_IRQ 58
|
||||||
|
#else
|
||||||
|
#define PNX833X_PIC_NUM_IRQ 37
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MIPS_CPU_NUM_IRQ 8
|
||||||
|
#define PNX833X_GPIO_NUM_IRQ 16
|
||||||
|
|
||||||
|
#define MIPS_CPU_IRQ_BASE 0
|
||||||
|
#define PNX833X_PIC_IRQ_BASE (MIPS_CPU_IRQ_BASE + MIPS_CPU_NUM_IRQ)
|
||||||
|
#define PNX833X_GPIO_IRQ_BASE (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ)
|
||||||
|
#define NR_IRQS (MIPS_CPU_NUM_IRQ + PNX833X_PIC_NUM_IRQ + PNX833X_GPIO_NUM_IRQ)
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,202 @@
|
||||||
|
/*
|
||||||
|
* pnx833x.h: Register mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_PNX833X_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_PNX833X_H
|
||||||
|
|
||||||
|
/* All regs are accessed in KSEG1 */
|
||||||
|
#define PNX833X_BASE (0xa0000000ul + 0x17E00000ul)
|
||||||
|
|
||||||
|
#define PNX833X_REG(offs) (*((volatile unsigned long *)(PNX833X_BASE + offs)))
|
||||||
|
|
||||||
|
/* Registers are named exactly as in PNX833X docs, just with PNX833X_ prefix */
|
||||||
|
|
||||||
|
/* Read access to multibit fields */
|
||||||
|
#define PNX833X_BIT(val, reg, field) ((val) & PNX833X_##reg##_##field)
|
||||||
|
#define PNX833X_REGBIT(reg, field) PNX833X_BIT(PNX833X_##reg, reg, field)
|
||||||
|
|
||||||
|
/* Use PNX833X_FIELD to extract a field from val */
|
||||||
|
#define PNX_FIELD(cpu, val, reg, field) \
|
||||||
|
(((val) & PNX##cpu##_##reg##_##field##_MASK) >> \
|
||||||
|
PNX##cpu##_##reg##_##field##_SHIFT)
|
||||||
|
#define PNX833X_FIELD(val, reg, field) PNX_FIELD(833X, val, reg, field)
|
||||||
|
#define PNX8330_FIELD(val, reg, field) PNX_FIELD(8330, val, reg, field)
|
||||||
|
#define PNX8335_FIELD(val, reg, field) PNX_FIELD(8335, val, reg, field)
|
||||||
|
|
||||||
|
/* Use PNX833X_REGFIELD to extract a field from a register */
|
||||||
|
#define PNX833X_REGFIELD(reg, field) PNX833X_FIELD(PNX833X_##reg, reg, field)
|
||||||
|
#define PNX8330_REGFIELD(reg, field) PNX8330_FIELD(PNX8330_##reg, reg, field)
|
||||||
|
#define PNX8335_REGFIELD(reg, field) PNX8335_FIELD(PNX8335_##reg, reg, field)
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX_WRITEFIELD(cpu, val, reg, field) \
|
||||||
|
(PNX##cpu##_##reg = (PNX##cpu##_##reg & ~(PNX##cpu##_##reg##_##field##_MASK)) | \
|
||||||
|
((val) << PNX##cpu##_##reg##_##field##_SHIFT))
|
||||||
|
#define PNX833X_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(833X, val, reg, field)
|
||||||
|
#define PNX8330_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(8330, val, reg, field)
|
||||||
|
#define PNX8335_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(8335, val, reg, field)
|
||||||
|
|
||||||
|
|
||||||
|
/* Macros to detect CPU type */
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID PNX833X_REG(0x7FFC)
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID_MAJREV_MASK 0x0000f000
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID_MAJREV_SHIFT 12
|
||||||
|
#define PNX8330_CONFIG_MODULE_MAJREV 4
|
||||||
|
#define PNX8335_CONFIG_MODULE_MAJREV 5
|
||||||
|
#define CPU_IS_PNX8330 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \
|
||||||
|
PNX8330_CONFIG_MODULE_MAJREV)
|
||||||
|
#define CPU_IS_PNX8335 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \
|
||||||
|
PNX8335_CONFIG_MODULE_MAJREV)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX833X_RESET_CONTROL PNX833X_REG(0x8004)
|
||||||
|
#define PNX833X_RESET_CONTROL_2 PNX833X_REG(0x8014)
|
||||||
|
|
||||||
|
#define PNX833X_PIC_REG(offs) PNX833X_REG(0x01000 + (offs))
|
||||||
|
#define PNX833X_PIC_INT_PRIORITY PNX833X_PIC_REG(0x0)
|
||||||
|
#define PNX833X_PIC_INT_SRC PNX833X_PIC_REG(0x4)
|
||||||
|
#define PNX833X_PIC_INT_SRC_INT_SRC_MASK 0x00000FF8ul /* bits 11:3 */
|
||||||
|
#define PNX833X_PIC_INT_SRC_INT_SRC_SHIFT 3
|
||||||
|
#define PNX833X_PIC_INT_REG(irq) PNX833X_PIC_REG(0x10 + 4*(irq))
|
||||||
|
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL PNX833X_REG(0x9228)
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_EXIT_RESET 0x00000002ul /* bit 1 */
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_MASK 0x00000018ul /* bits 4:3 */
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_SHIFT 3
|
||||||
|
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL PNX833X_REG(0x9020)
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_MASK 0x1f
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_SHIFT 0
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_MUX PNX833X_REG(0x7004)
|
||||||
|
#define PNX833X_CONFIG_MUX_IDE_MUX 0x00000080 /* bit 7 */
|
||||||
|
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7 PNX833X_REG(0x7040)
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_MASK 0x00180000
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_SHIFT 19
|
||||||
|
|
||||||
|
#define PNX833X_PIO_IN PNX833X_REG(0xF000)
|
||||||
|
#define PNX833X_PIO_OUT PNX833X_REG(0xF004)
|
||||||
|
#define PNX833X_PIO_DIR PNX833X_REG(0xF008)
|
||||||
|
#define PNX833X_PIO_SEL PNX833X_REG(0xF014)
|
||||||
|
#define PNX833X_PIO_INT_EDGE PNX833X_REG(0xF020)
|
||||||
|
#define PNX833X_PIO_INT_HI PNX833X_REG(0xF024)
|
||||||
|
#define PNX833X_PIO_INT_LO PNX833X_REG(0xF028)
|
||||||
|
#define PNX833X_PIO_INT_STATUS PNX833X_REG(0xFFE0)
|
||||||
|
#define PNX833X_PIO_INT_ENABLE PNX833X_REG(0xFFE4)
|
||||||
|
#define PNX833X_PIO_INT_CLEAR PNX833X_REG(0xFFE8)
|
||||||
|
#define PNX833X_PIO_IN2 PNX833X_REG(0xF05C)
|
||||||
|
#define PNX833X_PIO_OUT2 PNX833X_REG(0xF060)
|
||||||
|
#define PNX833X_PIO_DIR2 PNX833X_REG(0xF064)
|
||||||
|
#define PNX833X_PIO_SEL2 PNX833X_REG(0xF068)
|
||||||
|
|
||||||
|
#define PNX833X_UART0_PORTS_START (PNX833X_BASE + 0xB000)
|
||||||
|
#define PNX833X_UART0_PORTS_END (PNX833X_BASE + 0xBFFF)
|
||||||
|
#define PNX833X_UART1_PORTS_START (PNX833X_BASE + 0xC000)
|
||||||
|
#define PNX833X_UART1_PORTS_END (PNX833X_BASE + 0xCFFF)
|
||||||
|
|
||||||
|
#define PNX833X_USB_PORTS_START (PNX833X_BASE + 0x19000)
|
||||||
|
#define PNX833X_USB_PORTS_END (PNX833X_BASE + 0x19FFF)
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_USB PNX833X_REG(0x7008)
|
||||||
|
|
||||||
|
#define PNX833X_I2C0_PORTS_START (PNX833X_BASE + 0xD000)
|
||||||
|
#define PNX833X_I2C0_PORTS_END (PNX833X_BASE + 0xDFFF)
|
||||||
|
#define PNX833X_I2C1_PORTS_START (PNX833X_BASE + 0xE000)
|
||||||
|
#define PNX833X_I2C1_PORTS_END (PNX833X_BASE + 0xEFFF)
|
||||||
|
|
||||||
|
#define PNX833X_IDE_PORTS_START (PNX833X_BASE + 0x1A000)
|
||||||
|
#define PNX833X_IDE_PORTS_END (PNX833X_BASE + 0x1AFFF)
|
||||||
|
#define PNX833X_IDE_MODULE_ID PNX833X_REG(0x1AFFC)
|
||||||
|
|
||||||
|
#define PNX833X_IDE_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX833X_IDE_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX833X_IDE_MODULE_ID_VALUE 0xA009
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0 PNX833X_REG(0x2004)
|
||||||
|
#define PNX833X_MIU_SEL0_TIMING PNX833X_REG(0x2008)
|
||||||
|
#define PNX833X_MIU_SEL1 PNX833X_REG(0x200C)
|
||||||
|
#define PNX833X_MIU_SEL1_TIMING PNX833X_REG(0x2010)
|
||||||
|
#define PNX833X_MIU_SEL2 PNX833X_REG(0x2014)
|
||||||
|
#define PNX833X_MIU_SEL2_TIMING PNX833X_REG(0x2018)
|
||||||
|
#define PNX833X_MIU_SEL3 PNX833X_REG(0x201C)
|
||||||
|
#define PNX833X_MIU_SEL3_TIMING PNX833X_REG(0x2020)
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_MASK (1 << 14)
|
||||||
|
#define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_SHIFT 14
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_MASK (1 << 7)
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_SHIFT 7
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_PAGE_LEN_MASK (0xF << 9)
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_PAGE_LEN_SHIFT 9
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI PNX833X_REG(0x2000)
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_OPCODE_MASK (0xFF << 3)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT 3
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_MASK (1 << 2)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT 2
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_MASK (1 << 1)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT 1
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_SYNC_MASK (1 << 0)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT 0
|
||||||
|
|
||||||
|
#define PNX833X_WRITE_CONFIG_SPI(opcode, data_enable, addr_enable, sync) \
|
||||||
|
(PNX833X_MIU_CONFIG_SPI = \
|
||||||
|
((opcode) << PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT) | \
|
||||||
|
((data_enable) << PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT) | \
|
||||||
|
((addr_enable) << PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT) | \
|
||||||
|
((sync) << PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT))
|
||||||
|
|
||||||
|
#define PNX8335_IP3902_PORTS_START (PNX833X_BASE + 0x2F000)
|
||||||
|
#define PNX8335_IP3902_PORTS_END (PNX833X_BASE + 0x2FFFF)
|
||||||
|
#define PNX8335_IP3902_MODULE_ID PNX833X_REG(0x2FFFC)
|
||||||
|
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_VALUE 0x3902
|
||||||
|
|
||||||
|
/* I/O location(gets remapped)*/
|
||||||
|
#define PNX8335_NAND_BASE 0x18000000
|
||||||
|
/* I/O location with CLE high */
|
||||||
|
#define PNX8335_NAND_CLE_MASK 0x00100000
|
||||||
|
/* I/O location with ALE high */
|
||||||
|
#define PNX8335_NAND_ALE_MASK 0x00010000
|
||||||
|
|
||||||
|
#define PNX8335_SATA_PORTS_START (PNX833X_BASE + 0x2E000)
|
||||||
|
#define PNX8335_SATA_PORTS_END (PNX833X_BASE + 0x2EFFF)
|
||||||
|
#define PNX8335_SATA_MODULE_ID PNX833X_REG(0x2EFFC)
|
||||||
|
|
||||||
|
#define PNX8335_SATA_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX8335_SATA_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX8335_SATA_MODULE_ID_VALUE 0xA099
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_WAR_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_WAR_H
|
||||||
|
|
||||||
|
#define R4600_V1_INDEX_ICACHEOP_WAR 0
|
||||||
|
#define R4600_V1_HIT_CACHEOP_WAR 0
|
||||||
|
#define R4600_V2_HIT_CACHEOP_WAR 0
|
||||||
|
#define R5432_CP0_INTERRUPT_WAR 0
|
||||||
|
#define BCM1250_M3_WAR 0
|
||||||
|
#define SIBYTE_1956_WAR 0
|
||||||
|
#define MIPS4K_ICACHE_REFILL_WAR 0
|
||||||
|
#define MIPS_CACHE_SYNC_WAR 0
|
||||||
|
#define TX49XX_ICACHE_INDEX_INV_WAR 0
|
||||||
|
#define RM9000_CDEX_SMP_WAR 0
|
||||||
|
#define ICACHE_REFILLS_WORKAROUND_WAR 0
|
||||||
|
#define R10000_LLSC_WAR 0
|
||||||
|
#define MIPS34K_MISSED_ITLB_WAR 0
|
||||||
|
|
||||||
|
#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */
|
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef __ASM_MACH_TX49XX_MANGLE_PORT_H
|
||||||
|
#define __ASM_MACH_TX49XX_MANGLE_PORT_H
|
||||||
|
|
||||||
|
#define __swizzle_addr_b(port) (port)
|
||||||
|
#define __swizzle_addr_w(port) (port)
|
||||||
|
#define __swizzle_addr_l(port) (port)
|
||||||
|
#define __swizzle_addr_q(port) (port)
|
||||||
|
|
||||||
|
#define ioswabb(a, x) (x)
|
||||||
|
#define __mem_ioswabb(a, x) (x)
|
||||||
|
#if defined(CONFIG_TOSHIBA_RBTX4939) && \
|
||||||
|
(defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)) && \
|
||||||
|
defined(__BIG_ENDIAN)
|
||||||
|
#define NEEDS_TXX9_IOSWABW
|
||||||
|
extern u16 (*ioswabw)(volatile u16 *a, u16 x);
|
||||||
|
extern u16 (*__mem_ioswabw)(volatile u16 *a, u16 x);
|
||||||
|
#else
|
||||||
|
#define ioswabw(a, x) le16_to_cpu(x)
|
||||||
|
#define __mem_ioswabw(a, x) (x)
|
||||||
|
#endif
|
||||||
|
#define ioswabl(a, x) le32_to_cpu(x)
|
||||||
|
#define __mem_ioswabl(a, x) (x)
|
||||||
|
#define ioswabq(a, x) le64_to_cpu(x)
|
||||||
|
#define __mem_ioswabq(a, x) (x)
|
||||||
|
|
||||||
|
#endif /* __ASM_MACH_TX49XX_MANGLE_PORT_H */
|
|
@ -192,6 +192,7 @@
|
||||||
#define PM_16M 0x01ffe000
|
#define PM_16M 0x01ffe000
|
||||||
#define PM_64M 0x07ffe000
|
#define PM_64M 0x07ffe000
|
||||||
#define PM_256M 0x1fffe000
|
#define PM_256M 0x1fffe000
|
||||||
|
#define PM_1G 0x7fffe000
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,8 @@ search_module_dbetables(unsigned long addr)
|
||||||
#define MODULE_PROC_FAMILY "R5000 "
|
#define MODULE_PROC_FAMILY "R5000 "
|
||||||
#elif defined CONFIG_CPU_R5432
|
#elif defined CONFIG_CPU_R5432
|
||||||
#define MODULE_PROC_FAMILY "R5432 "
|
#define MODULE_PROC_FAMILY "R5432 "
|
||||||
|
#elif defined CONFIG_CPU_R5500
|
||||||
|
#define MODULE_PROC_FAMILY "R5500 "
|
||||||
#elif defined CONFIG_CPU_R6000
|
#elif defined CONFIG_CPU_R6000
|
||||||
#define MODULE_PROC_FAMILY "R6000 "
|
#define MODULE_PROC_FAMILY "R6000 "
|
||||||
#elif defined CONFIG_CPU_NEVADA
|
#elif defined CONFIG_CPU_NEVADA
|
||||||
|
|
|
@ -80,25 +80,25 @@ enum pt_watch_style {
|
||||||
pt_watch_style_mips64
|
pt_watch_style_mips64
|
||||||
};
|
};
|
||||||
struct mips32_watch_regs {
|
struct mips32_watch_regs {
|
||||||
uint32_t watchlo[8];
|
unsigned int watchlo[8];
|
||||||
/* Lower 16 bits of watchhi. */
|
/* Lower 16 bits of watchhi. */
|
||||||
uint16_t watchhi[8];
|
unsigned short watchhi[8];
|
||||||
/* Valid mask and I R W bits.
|
/* Valid mask and I R W bits.
|
||||||
* bit 0 -- 1 if W bit is usable.
|
* bit 0 -- 1 if W bit is usable.
|
||||||
* bit 1 -- 1 if R bit is usable.
|
* bit 1 -- 1 if R bit is usable.
|
||||||
* bit 2 -- 1 if I bit is usable.
|
* bit 2 -- 1 if I bit is usable.
|
||||||
* bits 3 - 11 -- Valid watchhi mask bits.
|
* bits 3 - 11 -- Valid watchhi mask bits.
|
||||||
*/
|
*/
|
||||||
uint16_t watch_masks[8];
|
unsigned short watch_masks[8];
|
||||||
/* The number of valid watch register pairs. */
|
/* The number of valid watch register pairs. */
|
||||||
uint32_t num_valid;
|
unsigned int num_valid;
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
struct mips64_watch_regs {
|
struct mips64_watch_regs {
|
||||||
uint64_t watchlo[8];
|
unsigned long long watchlo[8];
|
||||||
uint16_t watchhi[8];
|
unsigned short watchhi[8];
|
||||||
uint16_t watch_masks[8];
|
unsigned short watch_masks[8];
|
||||||
uint32_t num_valid;
|
unsigned int num_valid;
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
struct pt_watch_regs {
|
struct pt_watch_regs {
|
||||||
|
@ -116,6 +116,7 @@ struct pt_watch_regs {
|
||||||
|
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
#include <linux/types.h>
|
||||||
#include <asm/isadep.h>
|
#include <asm/isadep.h>
|
||||||
|
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
|
|
|
@ -86,4 +86,9 @@ void txx9_iocled_init(unsigned long baseaddr,
|
||||||
int basenum, unsigned int num, int lowactive,
|
int basenum, unsigned int num, int lowactive,
|
||||||
const char *color, char **deftriggers);
|
const char *color, char **deftriggers);
|
||||||
|
|
||||||
|
/* 7SEG LED */
|
||||||
|
void txx9_7segled_init(unsigned int num,
|
||||||
|
void (*putc)(unsigned int pos, unsigned char val));
|
||||||
|
int txx9_7segled_putc(unsigned int pos, char c);
|
||||||
|
|
||||||
#endif /* __ASM_TXX9_GENERIC_H */
|
#endif /* __ASM_TXX9_GENERIC_H */
|
||||||
|
|
|
@ -33,6 +33,7 @@ obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o
|
||||||
|
|
|
@ -180,7 +180,7 @@ bad_stack:
|
||||||
* The system call does not exist in this kernel
|
* The system call does not exist in this kernel
|
||||||
*/
|
*/
|
||||||
illegal_syscall:
|
illegal_syscall:
|
||||||
li v0, -ENOSYS # error
|
li v0, ENOSYS # error
|
||||||
sw v0, PT_R2(sp)
|
sw v0, PT_R2(sp)
|
||||||
li t0, 1 # set error flag
|
li t0, 1 # set error flag
|
||||||
sw t0, PT_R7(sp)
|
sw t0, PT_R7(sp)
|
||||||
|
@ -293,7 +293,7 @@ bad_alignment:
|
||||||
jr t2
|
jr t2
|
||||||
/* Unreached */
|
/* Unreached */
|
||||||
|
|
||||||
einval: li v0, -EINVAL
|
einval: li v0, -ENOSYS
|
||||||
jr ra
|
jr ra
|
||||||
END(sys_syscall)
|
END(sys_syscall)
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ syscall_trace_entry:
|
||||||
|
|
||||||
illegal_syscall:
|
illegal_syscall:
|
||||||
/* This also isn't a 64-bit syscall, throw an error. */
|
/* This also isn't a 64-bit syscall, throw an error. */
|
||||||
li v0, -ENOSYS # error
|
li v0, ENOSYS # error
|
||||||
sd v0, PT_R2(sp)
|
sd v0, PT_R2(sp)
|
||||||
li t0, 1 # set error flag
|
li t0, 1 # set error flag
|
||||||
sd t0, PT_R7(sp)
|
sd t0, PT_R7(sp)
|
||||||
|
|
|
@ -601,8 +601,8 @@ static int __init debugfs_mips(void)
|
||||||
struct dentry *d;
|
struct dentry *d;
|
||||||
|
|
||||||
d = debugfs_create_dir("mips", NULL);
|
d = debugfs_create_dir("mips", NULL);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
mips_debugfs_dir = d;
|
mips_debugfs_dir = d;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,8 +163,10 @@ static void stop_this_cpu(void *dummy)
|
||||||
* Remove this CPU:
|
* Remove this CPU:
|
||||||
*/
|
*/
|
||||||
cpu_clear(smp_processor_id(), cpu_online_map);
|
cpu_clear(smp_processor_id(), cpu_online_map);
|
||||||
local_irq_enable(); /* May need to service _machine_restart IPI */
|
for (;;) {
|
||||||
for (;;); /* Wait if available. */
|
if (cpu_wait)
|
||||||
|
(*cpu_wait)(); /* Wait if available. */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void smp_send_stop(void)
|
void smp_send_stop(void)
|
||||||
|
|
|
@ -560,12 +560,12 @@ static int __init debugfs_unaligned(void)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
|
d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
|
||||||
mips_debugfs_dir, &unaligned_instructions);
|
mips_debugfs_dir, &unaligned_instructions);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
|
d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
|
||||||
mips_debugfs_dir, &unaligned_action);
|
mips_debugfs_dir, &unaligned_action);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
__initcall(debugfs_unaligned);
|
__initcall(debugfs_unaligned);
|
||||||
|
|
|
@ -30,19 +30,20 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/mips-boards/bonito64.h>
|
#include <asm/mips-boards/bonito64.h>
|
||||||
|
#include <asm/mach-lemote/pci.h>
|
||||||
|
|
||||||
extern struct pci_ops bonito64_pci_ops;
|
extern struct pci_ops bonito64_pci_ops;
|
||||||
|
|
||||||
static struct resource loongson2e_pci_mem_resource = {
|
static struct resource loongson2e_pci_mem_resource = {
|
||||||
.name = "LOONGSON2E PCI MEM",
|
.name = "LOONGSON2E PCI MEM",
|
||||||
.start = 0x14000000UL,
|
.start = LOONGSON2E_PCI_MEM_START,
|
||||||
.end = 0x1fffffffUL,
|
.end = LOONGSON2E_PCI_MEM_END,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource loongson2e_pci_io_resource = {
|
static struct resource loongson2e_pci_io_resource = {
|
||||||
.name = "LOONGSON2E PCI IO MEM",
|
.name = "LOONGSON2E PCI IO MEM",
|
||||||
.start = 0x00004000UL,
|
.start = LOONGSON2E_PCI_IO_START,
|
||||||
.end = IO_SPACE_LIMIT,
|
.end = IO_SPACE_LIMIT,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_IO,
|
||||||
};
|
};
|
||||||
|
@ -82,6 +83,12 @@ static void __init ict_pcimap(void)
|
||||||
static int __init pcibios_init(void)
|
static int __init pcibios_init(void)
|
||||||
{
|
{
|
||||||
ict_pcimap();
|
ict_pcimap();
|
||||||
|
|
||||||
|
loongson2e_pci_controller.io_map_base =
|
||||||
|
(unsigned long) ioremap(LOONGSON2E_IO_PORT_BASE,
|
||||||
|
loongson2e_pci_io_resource.end -
|
||||||
|
loongson2e_pci_io_resource.start + 1);
|
||||||
|
|
||||||
register_pci_controller(&loongson2e_pci_controller);
|
register_pci_controller(&loongson2e_pci_controller);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <asm/mc146818-time.h>
|
#include <asm/mc146818-time.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/wbflush.h>
|
#include <asm/wbflush.h>
|
||||||
|
#include <asm/mach-lemote/pci.h>
|
||||||
|
|
||||||
#ifdef CONFIG_VT
|
#ifdef CONFIG_VT
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
@ -42,12 +43,6 @@
|
||||||
|
|
||||||
extern void mips_reboot_setup(void);
|
extern void mips_reboot_setup(void);
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
|
||||||
#define PTR_PAD(p) ((0xffffffff00000000)|((unsigned long long)(p)))
|
|
||||||
#else
|
|
||||||
#define PTR_PAD(p) (p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned long cpu_clock_freq;
|
unsigned long cpu_clock_freq;
|
||||||
unsigned long bus_clock;
|
unsigned long bus_clock;
|
||||||
unsigned int memsize;
|
unsigned int memsize;
|
||||||
|
@ -80,8 +75,8 @@ static void wbflush_loongson2e(void)
|
||||||
|
|
||||||
void __init plat_mem_setup(void)
|
void __init plat_mem_setup(void)
|
||||||
{
|
{
|
||||||
set_io_port_base(PTR_PAD(0xbfd00000));
|
set_io_port_base((unsigned long)ioremap(LOONGSON2E_IO_PORT_BASE,
|
||||||
|
IO_SPACE_LIMIT - LOONGSON2E_PCI_IO_START + 1));
|
||||||
mips_reboot_setup();
|
mips_reboot_setup();
|
||||||
|
|
||||||
__wbflush = wbflush_loongson2e;
|
__wbflush = wbflush_loongson2e;
|
||||||
|
|
|
@ -18,6 +18,7 @@ obj-$(CONFIG_CPU_R4300) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R4X00) += dump_tlb.o
|
obj-$(CONFIG_CPU_R4X00) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R5000) += dump_tlb.o
|
obj-$(CONFIG_CPU_R5000) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R5432) += dump_tlb.o
|
obj-$(CONFIG_CPU_R5432) += dump_tlb.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R6000) +=
|
obj-$(CONFIG_CPU_R6000) +=
|
||||||
obj-$(CONFIG_CPU_R8000) +=
|
obj-$(CONFIG_CPU_R8000) +=
|
||||||
obj-$(CONFIG_CPU_RM7000) += dump_tlb.o
|
obj-$(CONFIG_CPU_RM7000) += dump_tlb.o
|
||||||
|
|
|
@ -25,6 +25,7 @@ static inline const char *msk2str(unsigned int mask)
|
||||||
case PM_16M: return "16Mb";
|
case PM_16M: return "16Mb";
|
||||||
case PM_64M: return "64Mb";
|
case PM_64M: return "64Mb";
|
||||||
case PM_256M: return "256Mb";
|
case PM_256M: return "256Mb";
|
||||||
|
case PM_1G: return "1Gb";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -1299,12 +1299,12 @@ static int __init debugfs_fpuemu(void)
|
||||||
if (!mips_debugfs_dir)
|
if (!mips_debugfs_dir)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir);
|
dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir);
|
||||||
if (IS_ERR(dir))
|
if (!dir)
|
||||||
return PTR_ERR(dir);
|
return -ENOMEM;
|
||||||
for (i = 0; i < ARRAY_SIZE(vars); i++) {
|
for (i = 0; i < ARRAY_SIZE(vars); i++) {
|
||||||
d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v);
|
d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ obj-$(CONFIG_CPU_R4300) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o
|
obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o
|
||||||
obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
|
|
|
@ -324,7 +324,6 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
|
||||||
if (cpu_is_noncoherent_r10000(dev))
|
if (cpu_is_noncoherent_r10000(dev))
|
||||||
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
||||||
sg->length, direction);
|
sg->length, direction);
|
||||||
plat_unmap_dma_mem(sg->dma_address);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +341,6 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nele
|
||||||
if (!plat_device_is_coherent(dev))
|
if (!plat_device_is_coherent(dev))
|
||||||
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
||||||
sg->length, direction);
|
sg->length, direction);
|
||||||
plat_unmap_dma_mem(sg->dma_address);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
obj-y := interrupts.o platform.o prom.o setup.o reset.o
|
||||||
|
|
||||||
|
EXTRA_CFLAGS += -Werror
|
|
@ -0,0 +1,380 @@
|
||||||
|
/*
|
||||||
|
* interrupts.c: Interrupt mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/irq_cpu.h>
|
||||||
|
#include <irq.h>
|
||||||
|
#include <irq-mapping.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
static int mips_cpu_timer_irq;
|
||||||
|
|
||||||
|
static const unsigned int irq_prio[PNX833X_PIC_NUM_IRQ] =
|
||||||
|
{
|
||||||
|
0, /* unused */
|
||||||
|
4, /* PNX833X_PIC_I2C0_INT 1 */
|
||||||
|
4, /* PNX833X_PIC_I2C1_INT 2 */
|
||||||
|
1, /* PNX833X_PIC_UART0_INT 3 */
|
||||||
|
1, /* PNX833X_PIC_UART1_INT 4 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN0_DV_INT 5 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN0_DMA_INT 6 */
|
||||||
|
7, /* PNX833X_PIC_GPIO_INT 7 */
|
||||||
|
4, /* PNX833X_PIC_AUDIO_DEC_INT 8 */
|
||||||
|
5, /* PNX833X_PIC_VIDEO_DEC_INT 9 */
|
||||||
|
4, /* PNX833X_PIC_CONFIG_INT 10 */
|
||||||
|
4, /* PNX833X_PIC_AOI_INT 11 */
|
||||||
|
9, /* PNX833X_PIC_SYNC_INT 12 */
|
||||||
|
9, /* PNX8335_PIC_SATA_INT 13 */
|
||||||
|
4, /* PNX833X_PIC_OSD_INT 14 */
|
||||||
|
9, /* PNX833X_PIC_DISP1_INT 15 */
|
||||||
|
4, /* PNX833X_PIC_DEINTERLACER_INT 16 */
|
||||||
|
9, /* PNX833X_PIC_DISPLAY2_INT 17 */
|
||||||
|
4, /* PNX833X_PIC_VC_INT 18 */
|
||||||
|
4, /* PNX833X_PIC_SC_INT 19 */
|
||||||
|
9, /* PNX833X_PIC_IDE_INT 20 */
|
||||||
|
9, /* PNX833X_PIC_IDE_DMA_INT 21 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN1_DV_INT 22 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN1_DMA_INT 23 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_DMA_INT 24 */
|
||||||
|
4, /* PNX833X_PIC_TS_OUT_INT 25 */
|
||||||
|
4, /* PNX833X_PIC_IR_INT 26 */
|
||||||
|
3, /* PNX833X_PIC_VMSP1_INT 27 */
|
||||||
|
3, /* PNX833X_PIC_VMSP2_INT 28 */
|
||||||
|
4, /* PNX833X_PIC_PIBC_INT 29 */
|
||||||
|
4, /* PNX833X_PIC_TS_IN0_TRD_INT 30 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_TPD_INT 31 */
|
||||||
|
5, /* PNX833X_PIC_USB_INT 32 */
|
||||||
|
4, /* PNX833X_PIC_TS_IN1_TRD_INT 33 */
|
||||||
|
4, /* PNX833X_PIC_CLOCK_INT 34 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_PARSER_INT 35 */
|
||||||
|
4, /* PNX833X_PIC_VMSP_DMA_INT 36 */
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
4, /* PNX8335_PIC_MIU_INT 37 */
|
||||||
|
4, /* PNX8335_PIC_AVCHIP_IRQ_INT 38 */
|
||||||
|
9, /* PNX8335_PIC_SYNC_HD_INT 39 */
|
||||||
|
9, /* PNX8335_PIC_DISP_HD_INT 40 */
|
||||||
|
9, /* PNX8335_PIC_DISP_SCALER_INT 41 */
|
||||||
|
4, /* PNX8335_PIC_OSD_HD1_INT 42 */
|
||||||
|
4, /* PNX8335_PIC_DTL_WRITER_Y_INT 43 */
|
||||||
|
4, /* PNX8335_PIC_DTL_WRITER_C_INT 44 */
|
||||||
|
4, /* PNX8335_PIC_DTL_EMULATOR_Y_IR_INT 45 */
|
||||||
|
4, /* PNX8335_PIC_DTL_EMULATOR_C_IR_INT 46 */
|
||||||
|
4, /* PNX8335_PIC_DENC_TTX_INT 47 */
|
||||||
|
4, /* PNX8335_PIC_MMI_SIF0_INT 48 */
|
||||||
|
4, /* PNX8335_PIC_MMI_SIF1_INT 49 */
|
||||||
|
4, /* PNX8335_PIC_MMI_CDMMU_INT 50 */
|
||||||
|
4, /* PNX8335_PIC_PIBCS_INT 51 */
|
||||||
|
12, /* PNX8335_PIC_ETHERNET_INT 52 */
|
||||||
|
3, /* PNX8335_PIC_VMSP1_0_INT 53 */
|
||||||
|
3, /* PNX8335_PIC_VMSP1_1_INT 54 */
|
||||||
|
4, /* PNX8335_PIC_VMSP1_DMA_INT 55 */
|
||||||
|
4, /* PNX8335_PIC_TDGR_DE_INT 56 */
|
||||||
|
4, /* PNX8335_PIC_IR1_IRQ_INT 57 */
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static void pnx833x_timer_dispatch(void)
|
||||||
|
{
|
||||||
|
do_IRQ(mips_cpu_timer_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pic_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int irq = PNX833X_REGFIELD(PIC_INT_SRC, INT_SRC);
|
||||||
|
|
||||||
|
if ((irq >= 1) && (irq < (PNX833X_PIC_NUM_IRQ))) {
|
||||||
|
unsigned long priority = PNX833X_PIC_INT_PRIORITY;
|
||||||
|
PNX833X_PIC_INT_PRIORITY = irq_prio[irq];
|
||||||
|
|
||||||
|
if (irq == PNX833X_PIC_GPIO_INT) {
|
||||||
|
unsigned long mask = PNX833X_PIO_INT_STATUS & PNX833X_PIO_INT_ENABLE;
|
||||||
|
int pin;
|
||||||
|
while ((pin = ffs(mask & 0xffff))) {
|
||||||
|
pin -= 1;
|
||||||
|
do_IRQ(PNX833X_GPIO_IRQ_BASE + pin);
|
||||||
|
mask &= ~(1 << pin);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_IRQ(irq + PNX833X_PIC_IRQ_BASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
PNX833X_PIC_INT_PRIORITY = priority;
|
||||||
|
} else {
|
||||||
|
printk(KERN_ERR "plat_irq_dispatch: unexpected irq %u\n", irq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int pending = read_c0_status() & read_c0_cause();
|
||||||
|
|
||||||
|
if (pending & STATUSF_IP4)
|
||||||
|
pic_dispatch();
|
||||||
|
else if (pending & STATUSF_IP7)
|
||||||
|
do_IRQ(PNX833X_TIMER_IRQ);
|
||||||
|
else
|
||||||
|
spurious_interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void pnx833x_hard_enable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
/* Currently we do this by setting IRQ priority to 1.
|
||||||
|
If priority support is being implemented, 1 should be repalced
|
||||||
|
by a better value. */
|
||||||
|
PNX833X_PIC_INT_REG(irq) = irq_prio[irq];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void pnx833x_hard_disable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
/* Disable IRQ by writing setting it's priority to 0 */
|
||||||
|
PNX833X_PIC_INT_REG(irq) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int irqflags[PNX833X_PIC_NUM_IRQ]; /* initialized by zeroes */
|
||||||
|
#define IRQFLAG_STARTED 1
|
||||||
|
#define IRQFLAG_DISABLED 2
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(pnx833x_irq_lock);
|
||||||
|
|
||||||
|
static unsigned int pnx833x_startup_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] = IRQFLAG_STARTED; /* started, not disabled */
|
||||||
|
pnx833x_hard_enable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_shutdown_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] = 0; /* not started */
|
||||||
|
pnx833x_hard_disable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_enable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] &= ~IRQFLAG_DISABLED;
|
||||||
|
if (irqflags[pic_irq] == IRQFLAG_STARTED)
|
||||||
|
pnx833x_hard_enable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_disable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] |= IRQFLAG_DISABLED;
|
||||||
|
pnx833x_hard_disable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_ack_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_end_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(pnx833x_gpio_pnx833x_irq_lock);
|
||||||
|
|
||||||
|
static unsigned int pnx833x_startup_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_enable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_enable_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_enable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_disable_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_disable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_ack_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_end_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_clear_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pnx833x_set_type_gpio_irq(unsigned int irq, unsigned int flow_type)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
int gpio_mode;
|
||||||
|
|
||||||
|
switch (flow_type) {
|
||||||
|
case IRQ_TYPE_EDGE_RISING:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_RISING;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_EDGE_FALLING:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_FALLING;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_EDGE_BOTH:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_BOTH;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_LEVEL_HIGH:
|
||||||
|
gpio_mode = GPIO_INT_LEVEL_HIGH;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_LEVEL_LOW:
|
||||||
|
gpio_mode = GPIO_INT_LEVEL_LOW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gpio_mode = GPIO_INT_NONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnx833x_gpio_setup_irq(gpio_mode, pin);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irq_chip pnx833x_pic_irq_type = {
|
||||||
|
.typename = "PNX-PIC",
|
||||||
|
.startup = pnx833x_startup_pic_irq,
|
||||||
|
.shutdown = pnx833x_shutdown_pic_irq,
|
||||||
|
.enable = pnx833x_enable_pic_irq,
|
||||||
|
.disable = pnx833x_disable_pic_irq,
|
||||||
|
.ack = pnx833x_ack_pic_irq,
|
||||||
|
.end = pnx833x_end_pic_irq
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct irq_chip pnx833x_gpio_irq_type = {
|
||||||
|
.typename = "PNX-GPIO",
|
||||||
|
.startup = pnx833x_startup_gpio_irq,
|
||||||
|
.shutdown = pnx833x_disable_gpio_irq,
|
||||||
|
.enable = pnx833x_enable_gpio_irq,
|
||||||
|
.disable = pnx833x_disable_gpio_irq,
|
||||||
|
.ack = pnx833x_ack_gpio_irq,
|
||||||
|
.end = pnx833x_end_gpio_irq,
|
||||||
|
.set_type = pnx833x_set_type_gpio_irq
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init arch_init_irq(void)
|
||||||
|
{
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
|
/* setup standard internal cpu irqs */
|
||||||
|
mips_cpu_irq_init();
|
||||||
|
|
||||||
|
/* Set IRQ information in irq_desc */
|
||||||
|
for (irq = PNX833X_PIC_IRQ_BASE; irq < (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ); irq++) {
|
||||||
|
pnx833x_hard_disable_pic_irq(irq);
|
||||||
|
set_irq_chip_and_handler(irq, &pnx833x_pic_irq_type, handle_simple_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (irq = PNX833X_GPIO_IRQ_BASE; irq < (PNX833X_GPIO_IRQ_BASE + PNX833X_GPIO_NUM_IRQ); irq++)
|
||||||
|
set_irq_chip_and_handler(irq, &pnx833x_gpio_irq_type, handle_simple_irq);
|
||||||
|
|
||||||
|
/* Set PIC priority limiter register to 0 */
|
||||||
|
PNX833X_PIC_INT_PRIORITY = 0;
|
||||||
|
|
||||||
|
/* Setup GPIO IRQ dispatching */
|
||||||
|
pnx833x_startup_pic_irq(PNX833X_PIC_GPIO_INT);
|
||||||
|
|
||||||
|
/* Enable PIC IRQs (HWIRQ2) */
|
||||||
|
if (cpu_has_vint)
|
||||||
|
set_vi_handler(4, pic_dispatch);
|
||||||
|
|
||||||
|
write_c0_status(read_c0_status() | IE_IRQ2);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int __cpuinit get_c0_compare_int(void)
|
||||||
|
{
|
||||||
|
if (cpu_has_vint)
|
||||||
|
set_vi_handler(cp0_compare_irq, pnx833x_timer_dispatch);
|
||||||
|
|
||||||
|
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
|
||||||
|
return mips_cpu_timer_irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init plat_time_init(void)
|
||||||
|
{
|
||||||
|
/* calculate mips_hpt_frequency based on PNX833X_CLOCK_CPUCP_CTL reg */
|
||||||
|
|
||||||
|
extern unsigned long mips_hpt_frequency;
|
||||||
|
unsigned long reg = PNX833X_CLOCK_CPUCP_CTL;
|
||||||
|
|
||||||
|
if (!(PNX833X_BIT(reg, CLOCK_CPUCP_CTL, EXIT_RESET))) {
|
||||||
|
/* Functional clock is disabled so use crystal frequency */
|
||||||
|
mips_hpt_frequency = 25;
|
||||||
|
} else {
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
/* Functional clock is enabled, so get clock multiplier */
|
||||||
|
mips_hpt_frequency = 90 + (10 * PNX8335_REGFIELD(CLOCK_PLL_CPU_CTL, FREQ));
|
||||||
|
#else
|
||||||
|
static const unsigned long int freq[4] = {240, 160, 120, 80};
|
||||||
|
mips_hpt_frequency = freq[PNX833X_FIELD(reg, CLOCK_CPUCP_CTL, DIV_CLOCK)];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_INFO "CPU clock is %ld MHz\n", mips_hpt_frequency);
|
||||||
|
|
||||||
|
mips_hpt_frequency *= 500000;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,319 @@
|
||||||
|
/*
|
||||||
|
* platform.c: platform support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/resource.h>
|
||||||
|
#include <linux/serial.h>
|
||||||
|
#include <linux/serial_pnx8xxx.h>
|
||||||
|
#include <linux/mtd/nand.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
/* Until i2c driver available in kernel.*/
|
||||||
|
#include <linux/i2c-pnx0105.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <irq.h>
|
||||||
|
#include <irq-mapping.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
|
||||||
|
static u64 uart_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_uart_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX833X_UART0_PORTS_START,
|
||||||
|
.end = PNX833X_UART0_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX833X_PIC_UART0_INT,
|
||||||
|
.end = PNX833X_PIC_UART0_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = PNX833X_UART1_PORTS_START,
|
||||||
|
.end = PNX833X_UART1_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = PNX833X_PIC_UART1_INT,
|
||||||
|
.end = PNX833X_PIC_UART1_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pnx8xxx_port pnx8xxx_ports[] = {
|
||||||
|
[0] = {
|
||||||
|
.port = {
|
||||||
|
.type = PORT_PNX8XXX,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.membase = (void __iomem *)PNX833X_UART0_PORTS_START,
|
||||||
|
.mapbase = PNX833X_UART0_PORTS_START,
|
||||||
|
.irq = PNX833X_PIC_UART0_INT,
|
||||||
|
.uartclk = 3692300,
|
||||||
|
.fifosize = 16,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.line = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.port = {
|
||||||
|
.type = PORT_PNX8XXX,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.membase = (void __iomem *)PNX833X_UART1_PORTS_START,
|
||||||
|
.mapbase = PNX833X_UART1_PORTS_START,
|
||||||
|
.irq = PNX833X_PIC_UART1_INT,
|
||||||
|
.uartclk = 3692300,
|
||||||
|
.fifosize = 16,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.line = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_uart_device = {
|
||||||
|
.name = "pnx8xxx-uart",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &uart_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = pnx8xxx_ports,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_uart_resources),
|
||||||
|
.resource = pnx833x_uart_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static u64 ehci_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_usb_ehci_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX833X_USB_PORTS_START,
|
||||||
|
.end = PNX833X_USB_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX833X_PIC_USB_INT,
|
||||||
|
.end = PNX833X_PIC_USB_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_usb_ehci_device = {
|
||||||
|
.name = "pnx833x-ehci",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &ehci_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_usb_ehci_resources),
|
||||||
|
.resource = pnx833x_usb_ehci_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
static struct resource pnx833x_i2c0_resources[] = {
|
||||||
|
{
|
||||||
|
.start = PNX833X_I2C0_PORTS_START,
|
||||||
|
.end = PNX833X_I2C0_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = PNX833X_PIC_I2C0_INT,
|
||||||
|
.end = PNX833X_PIC_I2C0_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource pnx833x_i2c1_resources[] = {
|
||||||
|
{
|
||||||
|
.start = PNX833X_I2C1_PORTS_START,
|
||||||
|
.end = PNX833X_I2C1_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = PNX833X_PIC_I2C1_INT,
|
||||||
|
.end = PNX833X_PIC_I2C1_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_pnx0105_dev pnx833x_i2c_dev[] = {
|
||||||
|
{
|
||||||
|
.base = PNX833X_I2C0_PORTS_START,
|
||||||
|
.irq = -1, /* should be PNX833X_PIC_I2C0_INT but polling is faster */
|
||||||
|
.clock = 6, /* 0 == 400 kHz, 4 == 100 kHz(Maximum HDMI), 6 = 50kHz(Prefered HDCP) */
|
||||||
|
.bus_addr = 0, /* no slave support */
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.base = PNX833X_I2C1_PORTS_START,
|
||||||
|
.irq = -1, /* on high freq, polling is faster */
|
||||||
|
/*.irq = PNX833X_PIC_I2C1_INT,*/
|
||||||
|
.clock = 4, /* 0 == 400 kHz, 4 == 100 kHz. 100 kHz seems a safe default for now */
|
||||||
|
.bus_addr = 0, /* no slave support */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_i2c0_device = {
|
||||||
|
.name = "i2c-pnx0105",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_i2c_dev[0],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_i2c0_resources),
|
||||||
|
.resource = pnx833x_i2c0_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_i2c1_device = {
|
||||||
|
.name = "i2c-pnx0105",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_i2c_dev[1],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_i2c1_resources),
|
||||||
|
.resource = pnx833x_i2c1_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static u64 ethernet_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_ethernet_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX8335_IP3902_PORTS_START,
|
||||||
|
.end = PNX8335_IP3902_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX8335_PIC_ETHERNET_INT,
|
||||||
|
.end = PNX8335_PIC_ETHERNET_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_ethernet_device = {
|
||||||
|
.name = "ip3902-eth",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = ðernet_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_ethernet_resources),
|
||||||
|
.resource = pnx833x_ethernet_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource pnx833x_sata_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX8335_SATA_PORTS_START,
|
||||||
|
.end = PNX8335_SATA_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX8335_PIC_SATA_INT,
|
||||||
|
.end = PNX8335_PIC_SATA_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_sata_device = {
|
||||||
|
.name = "pnx833x-sata",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_sata_resources),
|
||||||
|
.resource = pnx833x_sata_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *part_probes[] = {
|
||||||
|
"cmdlinepart",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
pnx833x_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;
|
||||||
|
|
||||||
|
if (cmd == NAND_CMD_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ctrl & NAND_CLE)
|
||||||
|
writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_CLE_MASK));
|
||||||
|
else
|
||||||
|
writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_ALE_MASK));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_nand_data pnx833x_flash_nand_data = {
|
||||||
|
.chip = {
|
||||||
|
.chip_delay = 25,
|
||||||
|
.part_probe_types = part_probes,
|
||||||
|
},
|
||||||
|
.ctrl = {
|
||||||
|
.cmd_ctrl = pnx833x_flash_nand_cmd_ctrl
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set start to be the correct address (PNX8335_NAND_BASE with no 0xb!!),
|
||||||
|
* 12 bytes more seems to be the standard that allows for NAND access.
|
||||||
|
*/
|
||||||
|
static struct resource pnx833x_flash_nand_resource = {
|
||||||
|
.start = PNX8335_NAND_BASE,
|
||||||
|
.end = PNX8335_NAND_BASE + 12,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_flash_nand = {
|
||||||
|
.name = "gen_nand",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &pnx833x_flash_nand_resource,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_flash_nand_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device *pnx833x_platform_devices[] __initdata = {
|
||||||
|
&pnx833x_uart_device,
|
||||||
|
&pnx833x_usb_ehci_device,
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
&pnx833x_i2c0_device,
|
||||||
|
&pnx833x_i2c1_device,
|
||||||
|
#endif
|
||||||
|
&pnx833x_ethernet_device,
|
||||||
|
&pnx833x_sata_device,
|
||||||
|
&pnx833x_flash_nand,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init pnx833x_platform_init(void)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = platform_add_devices(pnx833x_platform_devices,
|
||||||
|
ARRAY_SIZE(pnx833x_platform_devices));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(pnx833x_platform_init);
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* prom.c:
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
|
void __init prom_init_cmdline(void)
|
||||||
|
{
|
||||||
|
int argc = fw_arg0;
|
||||||
|
char **argv = (char **)fw_arg1;
|
||||||
|
char *c = &(arcs_cmdline[0]);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
strcpy(c, argv[i]);
|
||||||
|
c += strlen(argv[i]);
|
||||||
|
if (i < argc-1)
|
||||||
|
*c++ = ' ';
|
||||||
|
}
|
||||||
|
*c = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char __init *prom_getenv(char *envname)
|
||||||
|
{
|
||||||
|
extern char **prom_envp;
|
||||||
|
char **env = prom_envp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = strlen(envname);
|
||||||
|
|
||||||
|
while (*env) {
|
||||||
|
if (strncmp(envname, *env, i) == 0 && *(*env+i) == '=')
|
||||||
|
return *env + i + 1;
|
||||||
|
env++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init prom_free_prom_memory(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
char * __init prom_getcmdline(void)
|
||||||
|
{
|
||||||
|
return arcs_cmdline;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* reset.c: reset support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/reboot.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
|
||||||
|
void pnx833x_machine_restart(char *command)
|
||||||
|
{
|
||||||
|
PNX833X_RESET_CONTROL_2 = 0;
|
||||||
|
PNX833X_RESET_CONTROL = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pnx833x_machine_halt(void)
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
__asm__ __volatile__ ("wait");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void pnx833x_machine_power_off(void)
|
||||||
|
{
|
||||||
|
pnx833x_machine_halt();
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* setup.c: Setup PNX833X Soc.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
|
#include <asm/reboot.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
extern void pnx833x_board_setup(void);
|
||||||
|
extern void pnx833x_machine_restart(char *);
|
||||||
|
extern void pnx833x_machine_halt(void);
|
||||||
|
extern void pnx833x_machine_power_off(void);
|
||||||
|
|
||||||
|
int __init plat_mem_setup(void)
|
||||||
|
{
|
||||||
|
/* fake pci bus to avoid bounce buffers */
|
||||||
|
PCI_DMA_BUS_IS_PHYS = 1;
|
||||||
|
|
||||||
|
/* set mips clock to 320MHz */
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
PNX8335_WRITEFIELD(0x17, CLOCK_PLL_CPU_CTL, FREQ);
|
||||||
|
#endif
|
||||||
|
pnx833x_gpio_init(); /* so it will be ready in board_setup() */
|
||||||
|
|
||||||
|
pnx833x_board_setup();
|
||||||
|
|
||||||
|
_machine_restart = pnx833x_machine_restart;
|
||||||
|
_machine_halt = pnx833x_machine_halt;
|
||||||
|
pm_power_off = pnx833x_machine_power_off;
|
||||||
|
|
||||||
|
/* IO/MEM resources. */
|
||||||
|
set_io_port_base(KSEG1);
|
||||||
|
ioport_resource.start = 0;
|
||||||
|
ioport_resource.end = ~0;
|
||||||
|
iomem_resource.start = 0;
|
||||||
|
iomem_resource.end = ~0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
lib-y := board.o
|
||||||
|
|
||||||
|
EXTRA_CFLAGS += -Werror
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* board.c: STB225 board support.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
/* endianess twiddlers */
|
||||||
|
#define PNX8335_DEBUG0 0x4400
|
||||||
|
#define PNX8335_DEBUG1 0x4404
|
||||||
|
#define PNX8335_DEBUG2 0x4408
|
||||||
|
#define PNX8335_DEBUG3 0x440c
|
||||||
|
#define PNX8335_DEBUG4 0x4410
|
||||||
|
#define PNX8335_DEBUG5 0x4414
|
||||||
|
#define PNX8335_DEBUG6 0x4418
|
||||||
|
#define PNX8335_DEBUG7 0x441c
|
||||||
|
|
||||||
|
int prom_argc;
|
||||||
|
char **prom_argv = 0, **prom_envp = 0;
|
||||||
|
|
||||||
|
extern void prom_init_cmdline(void);
|
||||||
|
extern char *prom_getenv(char *envname);
|
||||||
|
|
||||||
|
const char *get_system_type(void)
|
||||||
|
{
|
||||||
|
return "NXP STB22x";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long env_or_default(char *env, unsigned long dfl)
|
||||||
|
{
|
||||||
|
char *str = prom_getenv(env);
|
||||||
|
return str ? simple_strtol(str, 0, 0) : dfl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init prom_init(void)
|
||||||
|
{
|
||||||
|
unsigned long memsize;
|
||||||
|
|
||||||
|
prom_argc = fw_arg0;
|
||||||
|
prom_argv = (char **)fw_arg1;
|
||||||
|
prom_envp = (char **)fw_arg2;
|
||||||
|
|
||||||
|
prom_init_cmdline();
|
||||||
|
|
||||||
|
memsize = env_or_default("memsize", 0x02000000);
|
||||||
|
add_memory_region(0, memsize, BOOT_MEM_RAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init pnx833x_board_setup(void)
|
||||||
|
{
|
||||||
|
pnx833x_gpio_select_function_alt(4);
|
||||||
|
pnx833x_gpio_select_output(4);
|
||||||
|
pnx833x_gpio_select_function_alt(5);
|
||||||
|
pnx833x_gpio_select_input(5);
|
||||||
|
pnx833x_gpio_select_function_alt(6);
|
||||||
|
pnx833x_gpio_select_input(6);
|
||||||
|
pnx833x_gpio_select_function_alt(7);
|
||||||
|
pnx833x_gpio_select_output(7);
|
||||||
|
|
||||||
|
pnx833x_gpio_select_function_alt(25);
|
||||||
|
pnx833x_gpio_select_function_alt(26);
|
||||||
|
|
||||||
|
pnx833x_gpio_select_function_alt(27);
|
||||||
|
pnx833x_gpio_select_function_alt(28);
|
||||||
|
pnx833x_gpio_select_function_alt(29);
|
||||||
|
pnx833x_gpio_select_function_alt(30);
|
||||||
|
pnx833x_gpio_select_function_alt(31);
|
||||||
|
pnx833x_gpio_select_function_alt(32);
|
||||||
|
pnx833x_gpio_select_function_alt(33);
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
|
||||||
|
/* Setup MIU for NAND access on CS0...
|
||||||
|
*
|
||||||
|
* (it seems that we must also configure CS1 for reliable operation,
|
||||||
|
* otherwise the first read ID command will fail if it's read as 4 bytes
|
||||||
|
* but pass if it's read as 1 word.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Setup MIU CS0 & CS1 timing */
|
||||||
|
PNX833X_MIU_SEL0 = 0;
|
||||||
|
PNX833X_MIU_SEL1 = 0;
|
||||||
|
PNX833X_MIU_SEL0_TIMING = 0x50003081;
|
||||||
|
PNX833X_MIU_SEL1_TIMING = 0x50003081;
|
||||||
|
|
||||||
|
/* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */
|
||||||
|
pnx833x_gpio_select_function_alt(0);
|
||||||
|
|
||||||
|
/* Setup GPIO 04 to input NAND read/busy signal */
|
||||||
|
pnx833x_gpio_select_function_io(4);
|
||||||
|
pnx833x_gpio_select_input(4);
|
||||||
|
|
||||||
|
/* Setup GPIO 05 to disable NAND write protect */
|
||||||
|
pnx833x_gpio_select_function_io(5);
|
||||||
|
pnx833x_gpio_select_output(5);
|
||||||
|
pnx833x_gpio_write(1, 5);
|
||||||
|
|
||||||
|
#elif defined(CONFIG_MTD_CFI) || defined(CONFIG_MTD_CFI_MODULE)
|
||||||
|
|
||||||
|
/* Set up MIU for 16-bit NOR access on CS0 and CS1... */
|
||||||
|
|
||||||
|
/* Setup MIU CS0 & CS1 timing */
|
||||||
|
PNX833X_MIU_SEL0 = 1;
|
||||||
|
PNX833X_MIU_SEL1 = 1;
|
||||||
|
PNX833X_MIU_SEL0_TIMING = 0x6A08D082;
|
||||||
|
PNX833X_MIU_SEL1_TIMING = 0x6A08D082;
|
||||||
|
|
||||||
|
/* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */
|
||||||
|
pnx833x_gpio_select_function_alt(0);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ obj-$(CONFIG_MIPS_MSC) += ops-msc.o
|
||||||
obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o
|
obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o
|
||||||
obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o
|
obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o
|
||||||
obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o
|
obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o
|
||||||
obj-$(CONFIG_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o
|
obj-$(CONFIG_NEC_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o
|
||||||
obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
|
obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
|
||||||
obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
|
obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define EMMA2RH_PCI_HOST_SLOT 0x09
|
#define EMMA2RH_PCI_HOST_SLOT 0x09
|
||||||
#define EMMA2RH_USB_SLOT 0x03
|
#define EMMA2RH_USB_SLOT 0x03
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/mach-rc32434/rc32434.h>
|
#include <asm/mach-rc32434/rc32434.h>
|
||||||
|
#include <asm/mach-rc32434/irq.h>
|
||||||
|
|
||||||
static int __devinitdata irq_map[2][12] = {
|
static int __devinitdata irq_map[2][12] = {
|
||||||
{0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},
|
{0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/debug.h>
|
#include <asm/debug.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define RTABORT (0x1<<9)
|
#define RTABORT (0x1<<9)
|
||||||
#define RMABORT (0x1<<10)
|
#define RMABORT (0x1<<10)
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
static struct resource pci_io_resource = {
|
static struct resource pci_io_resource = {
|
||||||
.name = "pci IO space",
|
.name = "pci IO space",
|
||||||
|
|
|
@ -280,7 +280,7 @@ static int __init plat_setup_devices(void)
|
||||||
{
|
{
|
||||||
/* Look for the CF card reader */
|
/* Look for the CF card reader */
|
||||||
if (!readl(IDT434_REG_BASE + DEV1MASK))
|
if (!readl(IDT434_REG_BASE + DEV1MASK))
|
||||||
rb532_devs[1] = NULL;
|
rb532_devs[2] = NULL; /* disable cf_slot0 at index 2 */
|
||||||
else {
|
else {
|
||||||
cf_slot0_res[0].start =
|
cf_slot0_res[0].start =
|
||||||
readl(IDT434_REG_BASE + DEV1BASE);
|
readl(IDT434_REG_BASE + DEV1BASE);
|
||||||
|
|
|
@ -310,6 +310,10 @@ int __init rb532_gpio_init(void)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the interrupt status and level for the CF pin */
|
||||||
|
rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1);
|
||||||
|
rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
arch_initcall(rb532_gpio_init);
|
arch_initcall(rb532_gpio_init);
|
||||||
|
|
|
@ -12,20 +12,11 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/signal.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
|
||||||
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/irq_cpu.h>
|
#include <asm/irq_cpu.h>
|
||||||
#include <asm/sgi/ioc.h>
|
|
||||||
#include <asm/sgi/hpc3.h>
|
#include <asm/sgi/hpc3.h>
|
||||||
#include <asm/sgi/ip22.h>
|
#include <asm/sgi/ip22.h>
|
||||||
#include <asm/time.h>
|
|
||||||
|
|
||||||
/* #define DEBUG_SGINT */
|
|
||||||
|
|
||||||
/* So far nothing hangs here */
|
/* So far nothing hangs here */
|
||||||
#undef USE_LIO3_IRQ
|
#undef USE_LIO3_IRQ
|
||||||
|
@ -68,7 +59,7 @@ static void enable_local1_irq(unsigned int irq)
|
||||||
sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
|
sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local1_irq(unsigned int irq)
|
static void disable_local1_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
||||||
}
|
}
|
||||||
|
@ -87,7 +78,7 @@ static void enable_local2_irq(unsigned int irq)
|
||||||
sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
|
sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local2_irq(unsigned int irq)
|
static void disable_local2_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
|
sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
|
||||||
if (!sgint->cmeimask0)
|
if (!sgint->cmeimask0)
|
||||||
|
@ -108,7 +99,7 @@ static void enable_local3_irq(unsigned int irq)
|
||||||
sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
|
sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local3_irq(unsigned int irq)
|
static void disable_local3_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
|
sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
|
||||||
if (!sgint->cmeimask1)
|
if (!sgint->cmeimask1)
|
||||||
|
@ -344,6 +335,6 @@ void __init arch_init_irq(void)
|
||||||
|
|
||||||
#ifdef CONFIG_EISA
|
#ifdef CONFIG_EISA
|
||||||
if (ip22_is_fullhouse()) /* Only Indigo-2 has EISA stuff */
|
if (ip22_is_fullhouse()) /* Only Indigo-2 has EISA stuff */
|
||||||
ip22_eisa_init();
|
ip22_eisa_init();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,10 @@ config TOSHIBA_RBTX4938
|
||||||
support this machine type
|
support this machine type
|
||||||
|
|
||||||
config TOSHIBA_RBTX4939
|
config TOSHIBA_RBTX4939
|
||||||
bool "Toshiba RBTX4939 bobard"
|
bool "Toshiba RBTX4939 board"
|
||||||
depends on MACH_TX49XX
|
depends on MACH_TX49XX
|
||||||
select SOC_TX4939
|
select SOC_TX4939
|
||||||
|
select TXX9_7SEGLED
|
||||||
help
|
help
|
||||||
This Toshiba board is based on the TX4939 processor. Say Y here to
|
This Toshiba board is based on the TX4939 processor. Say Y here to
|
||||||
support this machine type
|
support this machine type
|
||||||
|
@ -86,6 +87,9 @@ config SOC_TX4939
|
||||||
select HW_HAS_PCI
|
select HW_HAS_PCI
|
||||||
select PCI_TX4927
|
select PCI_TX4927
|
||||||
|
|
||||||
|
config TXX9_7SEGLED
|
||||||
|
bool
|
||||||
|
|
||||||
config TOSHIBA_FPCIB0
|
config TOSHIBA_FPCIB0
|
||||||
bool "FPCIB0 Backplane Support"
|
bool "FPCIB0 Backplane Support"
|
||||||
depends on PCI && MACH_TXX9
|
depends on PCI && MACH_TXX9
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* 7 Segment LED routines
|
||||||
|
* Based on RBTX49xx patch from CELF patch archive.
|
||||||
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* (C) Copyright TOSHIBA CORPORATION 2005-2007
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
#include <linux/sysdev.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/map_to_7segment.h>
|
||||||
|
#include <asm/txx9/generic.h>
|
||||||
|
|
||||||
|
static unsigned int tx_7segled_num;
|
||||||
|
static void (*tx_7segled_putc)(unsigned int pos, unsigned char val);
|
||||||
|
|
||||||
|
void __init txx9_7segled_init(unsigned int num,
|
||||||
|
void (*putc)(unsigned int pos, unsigned char val))
|
||||||
|
{
|
||||||
|
tx_7segled_num = num;
|
||||||
|
tx_7segled_putc = putc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SEG7_CONVERSION_MAP(txx9_seg7map, MAP_ASCII7SEG_ALPHANUM_LC);
|
||||||
|
|
||||||
|
int txx9_7segled_putc(unsigned int pos, char c)
|
||||||
|
{
|
||||||
|
if (pos >= tx_7segled_num)
|
||||||
|
return -EINVAL;
|
||||||
|
c = map_to_seg7(&txx9_seg7map, c);
|
||||||
|
if (c < 0)
|
||||||
|
return c;
|
||||||
|
tx_7segled_putc(pos, c);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t ascii_store(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
|
{
|
||||||
|
unsigned int ch = dev->id;
|
||||||
|
txx9_7segled_putc(ch, buf[0]);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t raw_store(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
|
{
|
||||||
|
unsigned int ch = dev->id;
|
||||||
|
tx_7segled_putc(ch, buf[0]);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SYSDEV_ATTR(ascii, 0200, NULL, ascii_store);
|
||||||
|
static SYSDEV_ATTR(raw, 0200, NULL, raw_store);
|
||||||
|
|
||||||
|
static ssize_t map_seg7_show(struct sysdev_class *class, char *buf)
|
||||||
|
{
|
||||||
|
memcpy(buf, &txx9_seg7map, sizeof(txx9_seg7map));
|
||||||
|
return sizeof(txx9_seg7map);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t map_seg7_store(struct sysdev_class *class,
|
||||||
|
const char *buf, size_t size)
|
||||||
|
{
|
||||||
|
if (size != sizeof(txx9_seg7map))
|
||||||
|
return -EINVAL;
|
||||||
|
memcpy(&txx9_seg7map, buf, size);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SYSDEV_CLASS_ATTR(map_seg7, 0600, map_seg7_show, map_seg7_store);
|
||||||
|
|
||||||
|
static struct sysdev_class tx_7segled_sysdev_class = {
|
||||||
|
.name = "7segled",
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init tx_7segled_init_sysfs(void)
|
||||||
|
{
|
||||||
|
int error, i;
|
||||||
|
if (!tx_7segled_num)
|
||||||
|
return -ENODEV;
|
||||||
|
error = sysdev_class_register(&tx_7segled_sysdev_class);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
error = sysdev_class_create_file(&tx_7segled_sysdev_class,
|
||||||
|
&attr_map_seg7);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
for (i = 0; i < tx_7segled_num; i++) {
|
||||||
|
struct sys_device *dev;
|
||||||
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||||
|
if (!dev) {
|
||||||
|
error = -ENODEV;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dev->id = i;
|
||||||
|
dev->cls = &tx_7segled_sysdev_class;
|
||||||
|
error = sysdev_register(dev);
|
||||||
|
if (!error) {
|
||||||
|
sysdev_create_file(dev, &attr_ascii);
|
||||||
|
sysdev_create_file(dev, &attr_raw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
device_initcall(tx_7segled_init_sysfs);
|
|
@ -10,5 +10,6 @@ obj-$(CONFIG_SOC_TX4938) += mem_tx4927.o setup_tx4938.o irq_tx4938.o
|
||||||
obj-$(CONFIG_SOC_TX4939) += setup_tx4939.o irq_tx4939.o
|
obj-$(CONFIG_SOC_TX4939) += setup_tx4939.o irq_tx4939.o
|
||||||
obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o
|
obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o
|
||||||
obj-$(CONFIG_SPI) += spi_eeprom.o
|
obj-$(CONFIG_SPI) += spi_eeprom.o
|
||||||
|
obj-$(CONFIG_TXX9_7SEGLED) += 7segled.o
|
||||||
|
|
||||||
EXTRA_CFLAGS += -Werror
|
EXTRA_CFLAGS += -Werror
|
||||||
|
|
|
@ -156,11 +156,23 @@ static struct txx9_board_vec *__init find_board_byname(const char *name)
|
||||||
|
|
||||||
static void __init prom_init_cmdline(void)
|
static void __init prom_init_cmdline(void)
|
||||||
{
|
{
|
||||||
int argc = (int)fw_arg0;
|
int argc;
|
||||||
int *argv32 = (int *)fw_arg1;
|
int *argv32;
|
||||||
int i; /* Always ignore the "-c" at argv[0] */
|
int i; /* Always ignore the "-c" at argv[0] */
|
||||||
char builtin[CL_SIZE];
|
char builtin[CL_SIZE];
|
||||||
|
|
||||||
|
if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) {
|
||||||
|
/*
|
||||||
|
* argc is not a valid number, or argv32 is not a valid
|
||||||
|
* pointer
|
||||||
|
*/
|
||||||
|
argc = 0;
|
||||||
|
argv32 = NULL;
|
||||||
|
} else {
|
||||||
|
argc = (int)fw_arg0;
|
||||||
|
argv32 = (int *)fw_arg1;
|
||||||
|
}
|
||||||
|
|
||||||
/* ignore all built-in args if any f/w args given */
|
/* ignore all built-in args if any f/w args given */
|
||||||
/*
|
/*
|
||||||
* But if built-in strings was started with '+', append them
|
* But if built-in strings was started with '+', append them
|
||||||
|
@ -414,10 +426,12 @@ char * __init prom_getcmdline(void)
|
||||||
|
|
||||||
const char *__init prom_getenv(const char *name)
|
const char *__init prom_getenv(const char *name)
|
||||||
{
|
{
|
||||||
const s32 *str = (const s32 *)fw_arg2;
|
const s32 *str;
|
||||||
|
|
||||||
if (!str)
|
if (fw_arg2 < CKSEG0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
str = (const s32 *)fw_arg2;
|
||||||
/* YAMON style ("name", "value" pairs) */
|
/* YAMON style ("name", "value" pairs) */
|
||||||
while (str[0] && str[1]) {
|
while (str[0] && str[1]) {
|
||||||
if (!strcmp((const char *)(unsigned long)str[0], name))
|
if (!strcmp((const char *)(unsigned long)str[0], name))
|
||||||
|
@ -622,6 +636,21 @@ unsigned long (*__swizzle_addr_b)(unsigned long port) = __swizzle_addr_none;
|
||||||
EXPORT_SYMBOL(__swizzle_addr_b);
|
EXPORT_SYMBOL(__swizzle_addr_b);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef NEEDS_TXX9_IOSWABW
|
||||||
|
static u16 ioswabw_default(volatile u16 *a, u16 x)
|
||||||
|
{
|
||||||
|
return le16_to_cpu(x);
|
||||||
|
}
|
||||||
|
static u16 __mem_ioswabw_default(volatile u16 *a, u16 x)
|
||||||
|
{
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
u16 (*ioswabw)(volatile u16 *a, u16 x) = ioswabw_default;
|
||||||
|
EXPORT_SYMBOL(ioswabw);
|
||||||
|
u16 (*__mem_ioswabw)(volatile u16 *a, u16 x) = __mem_ioswabw_default;
|
||||||
|
EXPORT_SYMBOL(__mem_ioswabw);
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init txx9_physmap_flash_init(int no, unsigned long addr,
|
void __init txx9_physmap_flash_init(int no, unsigned long addr,
|
||||||
unsigned long size,
|
unsigned long size,
|
||||||
const struct physmap_flash_data *pdata)
|
const struct physmap_flash_data *pdata)
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/smc91x.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/txx9/generic.h>
|
#include <asm/txx9/generic.h>
|
||||||
#include <asm/txx9/pci.h>
|
#include <asm/txx9/pci.h>
|
||||||
|
@ -33,6 +35,21 @@ static void __init rbtx4939_time_init(void)
|
||||||
tx4939_time_init(0);
|
tx4939_time_init(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__BIG_ENDIAN) && \
|
||||||
|
(defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE))
|
||||||
|
#define HAVE_RBTX4939_IOSWAB
|
||||||
|
#define IS_CE1_ADDR(addr) \
|
||||||
|
((((unsigned long)(addr) - IO_BASE) & 0xfff00000) == TXX9_CE(1))
|
||||||
|
static u16 rbtx4939_ioswabw(volatile u16 *a, u16 x)
|
||||||
|
{
|
||||||
|
return IS_CE1_ADDR(a) ? x : le16_to_cpu(x);
|
||||||
|
}
|
||||||
|
static u16 rbtx4939_mem_ioswabw(volatile u16 *a, u16 x)
|
||||||
|
{
|
||||||
|
return !IS_CE1_ADDR(a) ? x : le16_to_cpu(x);
|
||||||
|
}
|
||||||
|
#endif /* __BIG_ENDIAN && CONFIG_SMC91X */
|
||||||
|
|
||||||
static void __init rbtx4939_pci_setup(void)
|
static void __init rbtx4939_pci_setup(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
|
@ -239,6 +256,32 @@ static inline void rbtx4939_led_setup(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void __rbtx4939_7segled_putc(unsigned int pos, unsigned char val)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
|
||||||
|
unsigned long flags;
|
||||||
|
local_irq_save(flags);
|
||||||
|
/* bit7: reserved for LED class */
|
||||||
|
led_val[pos] = (led_val[pos] & 0x80) | (val & 0x7f);
|
||||||
|
val = led_val[pos];
|
||||||
|
local_irq_restore(flags);
|
||||||
|
#endif
|
||||||
|
writeb(val, rbtx4939_7seg_addr(pos / 4, pos % 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rbtx4939_7segled_putc(unsigned int pos, unsigned char val)
|
||||||
|
{
|
||||||
|
/* convert from map_to_seg7() notation */
|
||||||
|
val = (val & 0x88) |
|
||||||
|
((val & 0x40) >> 6) |
|
||||||
|
((val & 0x20) >> 4) |
|
||||||
|
((val & 0x10) >> 2) |
|
||||||
|
((val & 0x04) << 2) |
|
||||||
|
((val & 0x02) << 4) |
|
||||||
|
((val & 0x01) << 6);
|
||||||
|
__rbtx4939_7segled_putc(pos, val);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init rbtx4939_arch_init(void)
|
static void __init rbtx4939_arch_init(void)
|
||||||
{
|
{
|
||||||
rbtx4939_pci_setup();
|
rbtx4939_pci_setup();
|
||||||
|
@ -246,6 +289,22 @@ static void __init rbtx4939_arch_init(void)
|
||||||
|
|
||||||
static void __init rbtx4939_device_init(void)
|
static void __init rbtx4939_device_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned long smc_addr = RBTX4939_ETHER_ADDR - IO_BASE;
|
||||||
|
struct resource smc_res[] = {
|
||||||
|
{
|
||||||
|
.start = smc_addr,
|
||||||
|
.end = smc_addr + 0x10 - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = RBTX4939_IRQ_ETHER,
|
||||||
|
/* override default irq flag defined in smc91x.h */
|
||||||
|
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
struct smc91x_platdata smc_pdata = {
|
||||||
|
.flags = SMC91X_USE_16BIT,
|
||||||
|
};
|
||||||
|
struct platform_device *pdev;
|
||||||
#if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE)
|
#if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE)
|
||||||
int i, j;
|
int i, j;
|
||||||
unsigned char ethaddr[2][6];
|
unsigned char ethaddr[2][6];
|
||||||
|
@ -262,6 +321,12 @@ static void __init rbtx4939_device_init(void)
|
||||||
}
|
}
|
||||||
tx4939_ethaddr_init(ethaddr[0], ethaddr[1]);
|
tx4939_ethaddr_init(ethaddr[0], ethaddr[1]);
|
||||||
#endif
|
#endif
|
||||||
|
pdev = platform_device_alloc("smc91x", -1);
|
||||||
|
if (!pdev ||
|
||||||
|
platform_device_add_resources(pdev, smc_res, ARRAY_SIZE(smc_res)) ||
|
||||||
|
platform_device_add_data(pdev, &smc_pdata, sizeof(smc_pdata)) ||
|
||||||
|
platform_device_add(pdev))
|
||||||
|
platform_device_put(pdev);
|
||||||
rbtx4939_led_setup();
|
rbtx4939_led_setup();
|
||||||
tx4939_wdt_init();
|
tx4939_wdt_init();
|
||||||
tx4939_ata_init();
|
tx4939_ata_init();
|
||||||
|
@ -269,6 +334,8 @@ static void __init rbtx4939_device_init(void)
|
||||||
|
|
||||||
static void __init rbtx4939_setup(void)
|
static void __init rbtx4939_setup(void)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
rbtx4939_ebusc_setup();
|
rbtx4939_ebusc_setup();
|
||||||
/* always enable ATA0 */
|
/* always enable ATA0 */
|
||||||
txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE);
|
txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE);
|
||||||
|
@ -276,9 +343,16 @@ static void __init rbtx4939_setup(void)
|
||||||
if (txx9_master_clock == 0)
|
if (txx9_master_clock == 0)
|
||||||
txx9_master_clock = 20000000;
|
txx9_master_clock = 20000000;
|
||||||
tx4939_setup();
|
tx4939_setup();
|
||||||
|
#ifdef HAVE_RBTX4939_IOSWAB
|
||||||
|
ioswabw = rbtx4939_ioswabw;
|
||||||
|
__mem_ioswabw = rbtx4939_mem_ioswabw;
|
||||||
|
#endif
|
||||||
|
|
||||||
_machine_restart = rbtx4939_machine_restart;
|
_machine_restart = rbtx4939_machine_restart;
|
||||||
|
|
||||||
|
txx9_7segled_init(RBTX4939_MAX_7SEGLEDS, rbtx4939_7segled_putc);
|
||||||
|
for (i = 0; i < RBTX4939_MAX_7SEGLEDS; i++)
|
||||||
|
txx9_7segled_putc(i, '-');
|
||||||
pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n",
|
pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n",
|
||||||
readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr),
|
readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr),
|
||||||
readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr));
|
readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr));
|
||||||
|
|
|
@ -108,8 +108,7 @@ config ARCH_NO_VIRT_TO_BUS
|
||||||
config PPC
|
config PPC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
select HAVE_DYNAMIC_FTRACE
|
select HAVE_FUNCTION_TRACER
|
||||||
select HAVE_FTRACE
|
|
||||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select HAVE_IOREMAP_PROT
|
select HAVE_IOREMAP_PROT
|
||||||
|
|
|
@ -122,7 +122,7 @@ KBUILD_CFLAGS += -mcpu=powerpc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
|
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
|
||||||
ifeq ($(CONFIG_FTRACE),y)
|
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||||
KBUILD_CFLAGS += -mno-sched-epilog
|
KBUILD_CFLAGS += -mno-sched-epilog
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ASM_POWERPC_FTRACE
|
#ifndef _ASM_POWERPC_FTRACE
|
||||||
#define _ASM_POWERPC_FTRACE
|
#define _ASM_POWERPC_FTRACE
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#define MCOUNT_ADDR ((long)(_mcount))
|
#define MCOUNT_ADDR ((long)(_mcount))
|
||||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ CFLAGS_prom_init.o += -fPIC
|
||||||
CFLAGS_btext.o += -fPIC
|
CFLAGS_btext.o += -fPIC
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
# Do not trace early boot code
|
# Do not trace early boot code
|
||||||
CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
|
CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
|
||||||
CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
|
CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
|
||||||
|
|
|
@ -1158,7 +1158,7 @@ machine_check_in_rtas:
|
||||||
|
|
||||||
#endif /* CONFIG_PPC_RTAS */
|
#endif /* CONFIG_PPC_RTAS */
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
_GLOBAL(mcount)
|
_GLOBAL(mcount)
|
||||||
_GLOBAL(_mcount)
|
_GLOBAL(_mcount)
|
||||||
|
|
|
@ -884,7 +884,7 @@ _GLOBAL(enter_prom)
|
||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
_GLOBAL(mcount)
|
_GLOBAL(mcount)
|
||||||
_GLOBAL(_mcount)
|
_GLOBAL(_mcount)
|
||||||
|
|
|
@ -28,17 +28,17 @@ static unsigned int ftrace_nop = 0x60000000;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static unsigned int notrace ftrace_calc_offset(long ip, long addr)
|
static unsigned int ftrace_calc_offset(long ip, long addr)
|
||||||
{
|
{
|
||||||
return (int)(addr - ip);
|
return (int)(addr - ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
notrace unsigned char *ftrace_nop_replace(void)
|
unsigned char *ftrace_nop_replace(void)
|
||||||
{
|
{
|
||||||
return (char *)&ftrace_nop;
|
return (char *)&ftrace_nop;
|
||||||
}
|
}
|
||||||
|
|
||||||
notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
||||||
{
|
{
|
||||||
static unsigned int op;
|
static unsigned int op;
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
||||||
# define _ASM_PTR " .long "
|
# define _ASM_PTR " .long "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
notrace int
|
int
|
||||||
ftrace_modify_code(unsigned long ip, unsigned char *old_code,
|
ftrace_modify_code(unsigned long ip, unsigned char *old_code,
|
||||||
unsigned char *new_code)
|
unsigned char *new_code)
|
||||||
{
|
{
|
||||||
|
@ -113,7 +113,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
|
||||||
return faulted;
|
return faulted;
|
||||||
}
|
}
|
||||||
|
|
||||||
notrace int ftrace_update_ftrace_func(ftrace_func_t func)
|
int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
{
|
{
|
||||||
unsigned long ip = (unsigned long)(&ftrace_call);
|
unsigned long ip = (unsigned long)(&ftrace_call);
|
||||||
unsigned char old[MCOUNT_INSN_SIZE], *new;
|
unsigned char old[MCOUNT_INSN_SIZE], *new;
|
||||||
|
@ -126,23 +126,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
notrace int ftrace_mcount_set(unsigned long *data)
|
|
||||||
{
|
|
||||||
unsigned long ip = (long)(&mcount_call);
|
|
||||||
unsigned long *addr = data;
|
|
||||||
unsigned char old[MCOUNT_INSN_SIZE], *new;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Replace the mcount stub with a pointer to the
|
|
||||||
* ip recorder function.
|
|
||||||
*/
|
|
||||||
memcpy(old, &mcount_call, MCOUNT_INSN_SIZE);
|
|
||||||
new = ftrace_call_replace(ip, *addr);
|
|
||||||
*addr = ftrace_modify_code(ip, old, new);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __init ftrace_dyn_arch_init(void *data)
|
int __init ftrace_dyn_arch_init(void *data)
|
||||||
{
|
{
|
||||||
/* This is running in kstop_machine */
|
/* This is running in kstop_machine */
|
||||||
|
|
|
@ -68,7 +68,7 @@ EXPORT_SYMBOL(single_step_exception);
|
||||||
EXPORT_SYMBOL(sys_sigreturn);
|
EXPORT_SYMBOL(sys_sigreturn);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
EXPORT_SYMBOL(_mcount);
|
EXPORT_SYMBOL(_mcount);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CFLAGS_bootx_init.o += -fPIC
|
CFLAGS_bootx_init.o += -fPIC
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
# Do not trace early boot code
|
# Do not trace early boot code
|
||||||
CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog
|
CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -241,19 +241,17 @@ config PACK_STACK
|
||||||
Say Y if you are unsure.
|
Say Y if you are unsure.
|
||||||
|
|
||||||
config SMALL_STACK
|
config SMALL_STACK
|
||||||
bool "Use 4kb/8kb for kernel stack instead of 8kb/16kb"
|
bool "Use 8kb for kernel stack instead of 16kb"
|
||||||
depends on PACK_STACK && !LOCKDEP
|
depends on PACK_STACK && 64BIT && !LOCKDEP
|
||||||
help
|
help
|
||||||
If you say Y here and the compiler supports the -mkernel-backchain
|
If you say Y here and the compiler supports the -mkernel-backchain
|
||||||
option the kernel will use a smaller kernel stack size. For 31 bit
|
option the kernel will use a smaller kernel stack size. The reduced
|
||||||
the reduced size is 4kb instead of 8kb and for 64 bit it is 8kb
|
size is 8kb instead of 16kb. This allows to run more threads on a
|
||||||
instead of 16kb. This allows to run more thread on a system and
|
system and reduces the pressure on the memory management for higher
|
||||||
reduces the pressure on the memory management for higher order
|
order page allocations.
|
||||||
page allocations.
|
|
||||||
|
|
||||||
Say N if you are unsure.
|
Say N if you are unsure.
|
||||||
|
|
||||||
|
|
||||||
config CHECK_STACK
|
config CHECK_STACK
|
||||||
bool "Detect kernel stack overflow"
|
bool "Detect kernel stack overflow"
|
||||||
help
|
help
|
||||||
|
@ -384,7 +382,7 @@ config IPL
|
||||||
choice
|
choice
|
||||||
prompt "IPL method generated into head.S"
|
prompt "IPL method generated into head.S"
|
||||||
depends on IPL
|
depends on IPL
|
||||||
default IPL_TAPE
|
default IPL_VM
|
||||||
help
|
help
|
||||||
Select "tape" if you want to IPL the image from a Tape.
|
Select "tape" if you want to IPL the image from a Tape.
|
||||||
|
|
||||||
|
|
|
@ -424,7 +424,7 @@ out:
|
||||||
*/
|
*/
|
||||||
int appldata_register_ops(struct appldata_ops *ops)
|
int appldata_register_ops(struct appldata_ops *ops)
|
||||||
{
|
{
|
||||||
if ((ops->size > APPLDATA_MAX_REC_SIZE) || (ops->size < 0))
|
if (ops->size > APPLDATA_MAX_REC_SIZE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ops->ctl_table = kzalloc(4 * sizeof(struct ctl_table), GFP_KERNEL);
|
ops->ctl_table = kzalloc(4 * sizeof(struct ctl_table), GFP_KERNEL);
|
||||||
|
|
|
@ -52,7 +52,7 @@ struct kvm_vqconfig {
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
/* early virtio console setup */
|
/* early virtio console setup */
|
||||||
#ifdef CONFIG_VIRTIO_CONSOLE
|
#ifdef CONFIG_S390_GUEST
|
||||||
extern void s390_virtio_console_init(void);
|
extern void s390_virtio_console_init(void);
|
||||||
#else
|
#else
|
||||||
static inline void s390_virtio_console_init(void)
|
static inline void s390_virtio_console_init(void)
|
||||||
|
|
|
@ -7,7 +7,8 @@ typedef struct {
|
||||||
unsigned long asce_bits;
|
unsigned long asce_bits;
|
||||||
unsigned long asce_limit;
|
unsigned long asce_limit;
|
||||||
int noexec;
|
int noexec;
|
||||||
int pgstes;
|
int has_pgste; /* The mmu context has extended page tables */
|
||||||
|
int alloc_pgste; /* cloned contexts will have extended page tables */
|
||||||
} mm_context_t;
|
} mm_context_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,12 +20,25 @@ static inline int init_new_context(struct task_struct *tsk,
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
||||||
#endif
|
#endif
|
||||||
if (current->mm->context.pgstes) {
|
if (current->mm->context.alloc_pgste) {
|
||||||
|
/*
|
||||||
|
* alloc_pgste indicates, that any NEW context will be created
|
||||||
|
* with extended page tables. The old context is unchanged. The
|
||||||
|
* page table allocation and the page table operations will
|
||||||
|
* look at has_pgste to distinguish normal and extended page
|
||||||
|
* tables. The only way to create extended page tables is to
|
||||||
|
* set alloc_pgste and then create a new context (e.g. dup_mm).
|
||||||
|
* The page table allocation is called after init_new_context
|
||||||
|
* and if has_pgste is set, it will create extended page
|
||||||
|
* tables.
|
||||||
|
*/
|
||||||
mm->context.noexec = 0;
|
mm->context.noexec = 0;
|
||||||
mm->context.pgstes = 1;
|
mm->context.has_pgste = 1;
|
||||||
|
mm->context.alloc_pgste = 1;
|
||||||
} else {
|
} else {
|
||||||
mm->context.noexec = s390_noexec;
|
mm->context.noexec = s390_noexec;
|
||||||
mm->context.pgstes = 0;
|
mm->context.has_pgste = 0;
|
||||||
|
mm->context.alloc_pgste = 0;
|
||||||
}
|
}
|
||||||
mm->context.asce_limit = STACK_TOP_MAX;
|
mm->context.asce_limit = STACK_TOP_MAX;
|
||||||
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
||||||
|
|
|
@ -679,7 +679,7 @@ static inline void pmd_clear(pmd_t *pmd)
|
||||||
|
|
||||||
static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
||||||
{
|
{
|
||||||
if (mm->context.pgstes)
|
if (mm->context.has_pgste)
|
||||||
ptep_rcp_copy(ptep);
|
ptep_rcp_copy(ptep);
|
||||||
pte_val(*ptep) = _PAGE_TYPE_EMPTY;
|
pte_val(*ptep) = _PAGE_TYPE_EMPTY;
|
||||||
if (mm->context.noexec)
|
if (mm->context.noexec)
|
||||||
|
@ -763,7 +763,7 @@ static inline int kvm_s390_test_and_clear_page_dirty(struct mm_struct *mm,
|
||||||
struct page *page;
|
struct page *page;
|
||||||
unsigned int skey;
|
unsigned int skey;
|
||||||
|
|
||||||
if (!mm->context.pgstes)
|
if (!mm->context.has_pgste)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
rcp_lock(ptep);
|
rcp_lock(ptep);
|
||||||
pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
|
pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
|
||||||
|
@ -794,7 +794,7 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
|
||||||
int young;
|
int young;
|
||||||
unsigned long *pgste;
|
unsigned long *pgste;
|
||||||
|
|
||||||
if (!vma->vm_mm->context.pgstes)
|
if (!vma->vm_mm->context.has_pgste)
|
||||||
return 0;
|
return 0;
|
||||||
physpage = pte_val(*ptep) & PAGE_MASK;
|
physpage = pte_val(*ptep) & PAGE_MASK;
|
||||||
pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
|
pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
|
||||||
|
@ -844,7 +844,7 @@ static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
|
||||||
static inline void ptep_invalidate(struct mm_struct *mm,
|
static inline void ptep_invalidate(struct mm_struct *mm,
|
||||||
unsigned long address, pte_t *ptep)
|
unsigned long address, pte_t *ptep)
|
||||||
{
|
{
|
||||||
if (mm->context.pgstes) {
|
if (mm->context.has_pgste) {
|
||||||
rcp_lock(ptep);
|
rcp_lock(ptep);
|
||||||
__ptep_ipte(address, ptep);
|
__ptep_ipte(address, ptep);
|
||||||
ptep_rcp_copy(ptep);
|
ptep_rcp_copy(ptep);
|
||||||
|
|
|
@ -15,13 +15,8 @@
|
||||||
* Size of kernel stack for each process
|
* Size of kernel stack for each process
|
||||||
*/
|
*/
|
||||||
#ifndef __s390x__
|
#ifndef __s390x__
|
||||||
#ifndef __SMALL_STACK
|
|
||||||
#define THREAD_ORDER 1
|
#define THREAD_ORDER 1
|
||||||
#define ASYNC_ORDER 1
|
#define ASYNC_ORDER 1
|
||||||
#else
|
|
||||||
#define THREAD_ORDER 0
|
|
||||||
#define ASYNC_ORDER 0
|
|
||||||
#endif
|
|
||||||
#else /* __s390x__ */
|
#else /* __s390x__ */
|
||||||
#ifndef __SMALL_STACK
|
#ifndef __SMALL_STACK
|
||||||
#define THREAD_ORDER 2
|
#define THREAD_ORDER 2
|
||||||
|
|
|
@ -1119,9 +1119,7 @@ out:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t __ref rescan_store(struct sys_device *dev,
|
static ssize_t __ref rescan_store(struct sysdev_class *class, const char *buf,
|
||||||
struct sysdev_attribute *attr,
|
|
||||||
const char *buf,
|
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -1129,12 +1127,10 @@ static ssize_t __ref rescan_store(struct sys_device *dev,
|
||||||
rc = smp_rescan_cpus();
|
rc = smp_rescan_cpus();
|
||||||
return rc ? rc : count;
|
return rc ? rc : count;
|
||||||
}
|
}
|
||||||
static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store);
|
static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store);
|
||||||
#endif /* CONFIG_HOTPLUG_CPU */
|
#endif /* CONFIG_HOTPLUG_CPU */
|
||||||
|
|
||||||
static ssize_t dispatching_show(struct sys_device *dev,
|
static ssize_t dispatching_show(struct sysdev_class *class, char *buf)
|
||||||
struct sysdev_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
{
|
||||||
ssize_t count;
|
ssize_t count;
|
||||||
|
|
||||||
|
@ -1144,9 +1140,8 @@ static ssize_t dispatching_show(struct sys_device *dev,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t dispatching_store(struct sys_device *dev,
|
static ssize_t dispatching_store(struct sysdev_class *dev, const char *buf,
|
||||||
struct sysdev_attribute *attr,
|
size_t count)
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
{
|
||||||
int val, rc;
|
int val, rc;
|
||||||
char delim;
|
char delim;
|
||||||
|
@ -1168,7 +1163,8 @@ out:
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
return rc ? rc : count;
|
return rc ? rc : count;
|
||||||
}
|
}
|
||||||
static SYSDEV_ATTR(dispatching, 0644, dispatching_show, dispatching_store);
|
static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show,
|
||||||
|
dispatching_store);
|
||||||
|
|
||||||
static int __init topology_init(void)
|
static int __init topology_init(void)
|
||||||
{
|
{
|
||||||
|
@ -1178,13 +1174,11 @@ static int __init topology_init(void)
|
||||||
register_cpu_notifier(&smp_cpu_nb);
|
register_cpu_notifier(&smp_cpu_nb);
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
|
rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_rescan);
|
||||||
&attr_rescan.attr);
|
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
#endif
|
#endif
|
||||||
rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
|
rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_dispatching);
|
||||||
&attr_dispatching.attr);
|
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
for_each_present_cpu(cpu) {
|
for_each_present_cpu(cpu) {
|
||||||
|
|
|
@ -169,7 +169,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
|
||||||
unsigned long *table;
|
unsigned long *table;
|
||||||
unsigned long bits;
|
unsigned long bits;
|
||||||
|
|
||||||
bits = (mm->context.noexec || mm->context.pgstes) ? 3UL : 1UL;
|
bits = (mm->context.noexec || mm->context.has_pgste) ? 3UL : 1UL;
|
||||||
spin_lock(&mm->page_table_lock);
|
spin_lock(&mm->page_table_lock);
|
||||||
page = NULL;
|
page = NULL;
|
||||||
if (!list_empty(&mm->context.pgtable_list)) {
|
if (!list_empty(&mm->context.pgtable_list)) {
|
||||||
|
@ -186,7 +186,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm)
|
||||||
pgtable_page_ctor(page);
|
pgtable_page_ctor(page);
|
||||||
page->flags &= ~FRAG_MASK;
|
page->flags &= ~FRAG_MASK;
|
||||||
table = (unsigned long *) page_to_phys(page);
|
table = (unsigned long *) page_to_phys(page);
|
||||||
if (mm->context.pgstes)
|
if (mm->context.has_pgste)
|
||||||
clear_table_pgstes(table);
|
clear_table_pgstes(table);
|
||||||
else
|
else
|
||||||
clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE);
|
clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE);
|
||||||
|
@ -210,7 +210,7 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
|
||||||
struct page *page;
|
struct page *page;
|
||||||
unsigned long bits;
|
unsigned long bits;
|
||||||
|
|
||||||
bits = (mm->context.noexec || mm->context.pgstes) ? 3UL : 1UL;
|
bits = (mm->context.noexec || mm->context.has_pgste) ? 3UL : 1UL;
|
||||||
bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long);
|
bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long);
|
||||||
page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
|
page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
|
||||||
spin_lock(&mm->page_table_lock);
|
spin_lock(&mm->page_table_lock);
|
||||||
|
@ -257,7 +257,7 @@ int s390_enable_sie(void)
|
||||||
struct mm_struct *mm, *old_mm;
|
struct mm_struct *mm, *old_mm;
|
||||||
|
|
||||||
/* Do we have pgstes? if yes, we are done */
|
/* Do we have pgstes? if yes, we are done */
|
||||||
if (tsk->mm->context.pgstes)
|
if (tsk->mm->context.has_pgste)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* lets check if we are allowed to replace the mm */
|
/* lets check if we are allowed to replace the mm */
|
||||||
|
@ -269,14 +269,14 @@ int s390_enable_sie(void)
|
||||||
}
|
}
|
||||||
task_unlock(tsk);
|
task_unlock(tsk);
|
||||||
|
|
||||||
/* we copy the mm with pgstes enabled */
|
/* we copy the mm and let dup_mm create the page tables with_pgstes */
|
||||||
tsk->mm->context.pgstes = 1;
|
tsk->mm->context.alloc_pgste = 1;
|
||||||
mm = dup_mm(tsk);
|
mm = dup_mm(tsk);
|
||||||
tsk->mm->context.pgstes = 0;
|
tsk->mm->context.alloc_pgste = 0;
|
||||||
if (!mm)
|
if (!mm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* Now lets check again if somebody attached ptrace etc */
|
/* Now lets check again if something happened */
|
||||||
task_lock(tsk);
|
task_lock(tsk);
|
||||||
if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
|
if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
|
||||||
tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) {
|
tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) {
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче