Commit 2c1d2470 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-2.6-mn10300

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-2.6-mn10300:
  MN10300: Clear ASB2364 peripheral interrupt masks before enabling interrupts
  MN10300: Fix the ASB2364 gdbport UART register defs
  MN10300: Fix ASB2364 FPGA register defs
  MN10300: Select GENERIC_HARDIRQS_NO_DEPRECATED
  MN10300: Select HAVE_GENERIC_HARDIRQS rather than GENERIC_HARDIRQS
  MN10300: Convert ASB2364 FPGA irq_chip to new functions
  MN10300: Convert ipi irq_chip to new functions
  MN10300: Convert serial irq_chip to new functions
  MN10300: Convert cpu irq_chips to new functions
  MN10300: Remove unused mn10300_intc_* functions
  MN10300: Remove stale irq_chip.end - V2
  MN10300: Use clockevents_calc_mult_shift()
  MN10300: Use clocksource_register_hz()
  MN10300: Remove stale code
parents 664322a4 ddb7d1e9
config MN10300 config MN10300
def_bool y def_bool y
select HAVE_OPROFILE select HAVE_OPROFILE
select GENERIC_HARDIRQS select HAVE_GENERIC_HARDIRQS
select GENERIC_HARDIRQS_NO_DEPRECATED
config AM33_2 config AM33_2
def_bool n def_bool n
...@@ -53,21 +54,6 @@ config GENERIC_TIME ...@@ -53,21 +54,6 @@ config GENERIC_TIME
config GENERIC_CLOCKEVENTS config GENERIC_CLOCKEVENTS
def_bool y def_bool y
config GENERIC_CLOCKEVENTS_BUILD
def_bool y
depends on GENERIC_CLOCKEVENTS
config GENERIC_CLOCKEVENTS_BROADCAST
bool
config CEVT_MN10300
def_bool y
depends on GENERIC_CLOCKEVENTS
config CSRC_MN10300
def_bool y
depends on GENERIC_TIME
config GENERIC_BUG config GENERIC_BUG
def_bool y def_bool y
......
...@@ -60,11 +60,6 @@ ...@@ -60,11 +60,6 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
extern void set_intr_level(int irq, u16 level); extern void set_intr_level(int irq, u16 level);
extern void mn10300_intc_set_level(unsigned int irq, unsigned int level);
extern void mn10300_intc_clear(unsigned int irq);
extern void mn10300_intc_set(unsigned int irq);
extern void mn10300_intc_enable(unsigned int irq);
extern void mn10300_intc_disable(unsigned int irq);
extern void mn10300_set_lateack_irq_type(int irq); extern void mn10300_set_lateack_irq_type(int irq);
#endif #endif
......
...@@ -8,7 +8,8 @@ fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o ...@@ -8,7 +8,8 @@ fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o
obj-y := process.o signal.o entry.o traps.o irq.o \ obj-y := process.o signal.o entry.o traps.o irq.o \
ptrace.o setup.o time.o sys_mn10300.o io.o kthread.o \ ptrace.o setup.o time.o sys_mn10300.o io.o kthread.o \
switch_to.o mn10300_ksyms.o kernel_execve.o $(fpu-obj-y) switch_to.o mn10300_ksyms.o kernel_execve.o $(fpu-obj-y) \
csrc-mn10300.o cevt-mn10300.o
obj-$(CONFIG_SMP) += smp.o smp-low.o obj-$(CONFIG_SMP) += smp.o smp-low.o
...@@ -28,5 +29,3 @@ obj-$(CONFIG_MN10300_RTC) += rtc.o ...@@ -28,5 +29,3 @@ obj-$(CONFIG_MN10300_RTC) += rtc.o
obj-$(CONFIG_PROFILE) += profile.o profile-low.o obj-$(CONFIG_PROFILE) += profile.o profile-low.o
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KPROBES) += kprobes.o
obj-$(CONFIG_CSRC_MN10300) += csrc-mn10300.o
obj-$(CONFIG_CEVT_MN10300) += cevt-mn10300.o
...@@ -89,9 +89,10 @@ int __init init_clockevents(void) ...@@ -89,9 +89,10 @@ int __init init_clockevents(void)
cd->name = "Timestamp"; cd->name = "Timestamp";
cd->features = CLOCK_EVT_FEAT_ONESHOT; cd->features = CLOCK_EVT_FEAT_ONESHOT;
/* Calculate the min / max delta */ /* Calculate shift/mult. We want to spawn at least 1 second */
clockevent_set_clock(cd, MN10300_JCCLK); clockevents_calc_mult_shift(cd, MN10300_JCCLK, 1);
/* Calculate the min / max delta */
cd->max_delta_ns = clockevent_delta2ns(TMJCBR_MAX, cd); cd->max_delta_ns = clockevent_delta2ns(TMJCBR_MAX, cd);
cd->min_delta_ns = clockevent_delta2ns(100, cd); cd->min_delta_ns = clockevent_delta2ns(100, cd);
...@@ -110,9 +111,9 @@ int __init init_clockevents(void) ...@@ -110,9 +111,9 @@ int __init init_clockevents(void)
#if defined(CONFIG_SMP) && !defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) #if defined(CONFIG_SMP) && !defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)
/* setup timer irq affinity so it only runs on this cpu */ /* setup timer irq affinity so it only runs on this cpu */
{ {
struct irq_desc *desc; struct irq_data *data;
desc = irq_to_desc(cd->irq); data = irq_get_irq_data(cd->irq);
cpumask_copy(desc->affinity, cpumask_of(cpu)); cpumask_copy(data->affinity, cpumask_of(cpu));
iact->flags |= IRQF_NOBALANCING; iact->flags |= IRQF_NOBALANCING;
} }
#endif #endif
......
...@@ -29,7 +29,6 @@ static struct clocksource clocksource_mn10300 = { ...@@ -29,7 +29,6 @@ static struct clocksource clocksource_mn10300 = {
int __init init_clocksource(void) int __init init_clocksource(void)
{ {
startup_timestamp_counter(); startup_timestamp_counter();
clocksource_set_clock(&clocksource_mn10300, MN10300_TSCCLK); clocksource_register_hz(&clocksource_mn10300, MN10300_TSCCLK);
clocksource_register(&clocksource_mn10300);
return 0; return 0;
} }
...@@ -33,13 +33,3 @@ extern void mn10300_low_ipi_handler(void); ...@@ -33,13 +33,3 @@ extern void mn10300_low_ipi_handler(void);
* time.c * time.c
*/ */
extern irqreturn_t local_timer_interrupt(void); extern irqreturn_t local_timer_interrupt(void);
/*
* time.c
*/
#ifdef CONFIG_CEVT_MN10300
extern void clockevent_set_clock(struct clock_event_device *, unsigned int);
#endif
#ifdef CONFIG_CSRC_MN10300
extern void clocksource_set_clock(struct clocksource *, unsigned int);
#endif
...@@ -37,8 +37,9 @@ atomic_t irq_err_count; ...@@ -37,8 +37,9 @@ atomic_t irq_err_count;
/* /*
* MN10300 interrupt controller operations * MN10300 interrupt controller operations
*/ */
static void mn10300_cpupic_ack(unsigned int irq) static void mn10300_cpupic_ack(struct irq_data *d)
{ {
unsigned int irq = d->irq;
unsigned long flags; unsigned long flags;
u16 tmp; u16 tmp;
...@@ -61,13 +62,14 @@ static void __mask_and_set_icr(unsigned int irq, ...@@ -61,13 +62,14 @@ static void __mask_and_set_icr(unsigned int irq,
arch_local_irq_restore(flags); arch_local_irq_restore(flags);
} }
static void mn10300_cpupic_mask(unsigned int irq) static void mn10300_cpupic_mask(struct irq_data *d)
{ {
__mask_and_set_icr(irq, GxICR_LEVEL, 0); __mask_and_set_icr(d->irq, GxICR_LEVEL, 0);
} }
static void mn10300_cpupic_mask_ack(unsigned int irq) static void mn10300_cpupic_mask_ack(struct irq_data *d)
{ {
unsigned int irq = d->irq;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
unsigned long flags; unsigned long flags;
u16 tmp; u16 tmp;
...@@ -85,7 +87,7 @@ static void mn10300_cpupic_mask_ack(unsigned int irq) ...@@ -85,7 +87,7 @@ static void mn10300_cpupic_mask_ack(unsigned int irq)
tmp2 = GxICR(irq); tmp2 = GxICR(irq);
irq_affinity_online[irq] = irq_affinity_online[irq] =
any_online_cpu(*irq_desc[irq].affinity); any_online_cpu(*d->affinity);
CROSS_GxICR(irq, irq_affinity_online[irq]) = CROSS_GxICR(irq, irq_affinity_online[irq]) =
(tmp & (GxICR_LEVEL | GxICR_ENABLE)) | GxICR_DETECT; (tmp & (GxICR_LEVEL | GxICR_ENABLE)) | GxICR_DETECT;
tmp = CROSS_GxICR(irq, irq_affinity_online[irq]); tmp = CROSS_GxICR(irq, irq_affinity_online[irq]);
...@@ -97,13 +99,14 @@ static void mn10300_cpupic_mask_ack(unsigned int irq) ...@@ -97,13 +99,14 @@ static void mn10300_cpupic_mask_ack(unsigned int irq)
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
} }
static void mn10300_cpupic_unmask(unsigned int irq) static void mn10300_cpupic_unmask(struct irq_data *d)
{ {
__mask_and_set_icr(irq, GxICR_LEVEL, GxICR_ENABLE); __mask_and_set_icr(d->irq, GxICR_LEVEL, GxICR_ENABLE);
} }
static void mn10300_cpupic_unmask_clear(unsigned int irq) static void mn10300_cpupic_unmask_clear(struct irq_data *d)
{ {
unsigned int irq = d->irq;
/* the MN10300 PIC latches its interrupt request bit, even after the /* the MN10300 PIC latches its interrupt request bit, even after the
* device has ceased to assert its interrupt line and the interrupt * device has ceased to assert its interrupt line and the interrupt
* channel has been disabled in the PIC, so for level-triggered * channel has been disabled in the PIC, so for level-triggered
...@@ -121,7 +124,7 @@ static void mn10300_cpupic_unmask_clear(unsigned int irq) ...@@ -121,7 +124,7 @@ static void mn10300_cpupic_unmask_clear(unsigned int irq)
} else { } else {
tmp = GxICR(irq); tmp = GxICR(irq);
irq_affinity_online[irq] = any_online_cpu(*irq_desc[irq].affinity); irq_affinity_online[irq] = any_online_cpu(*d->affinity);
CROSS_GxICR(irq, irq_affinity_online[irq]) = (tmp & GxICR_LEVEL) | GxICR_ENABLE | GxICR_DETECT; CROSS_GxICR(irq, irq_affinity_online[irq]) = (tmp & GxICR_LEVEL) | GxICR_ENABLE | GxICR_DETECT;
tmp = CROSS_GxICR(irq, irq_affinity_online[irq]); tmp = CROSS_GxICR(irq, irq_affinity_online[irq]);
} }
...@@ -134,7 +137,8 @@ static void mn10300_cpupic_unmask_clear(unsigned int irq) ...@@ -134,7 +137,8 @@ static void mn10300_cpupic_unmask_clear(unsigned int irq)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static int static int
mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask) mn10300_cpupic_setaffinity(struct irq_data *d, const struct cpumask *mask,
bool force)
{ {
unsigned long flags; unsigned long flags;
int err; int err;
...@@ -142,7 +146,7 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask) ...@@ -142,7 +146,7 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask)
flags = arch_local_cli_save(); flags = arch_local_cli_save();
/* check irq no */ /* check irq no */
switch (irq) { switch (d->irq) {
case TMJCIRQ: case TMJCIRQ:
case RESCHEDULE_IPI: case RESCHEDULE_IPI:
case CALL_FUNC_SINGLE_IPI: case CALL_FUNC_SINGLE_IPI:
...@@ -181,7 +185,7 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask) ...@@ -181,7 +185,7 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask)
break; break;
default: default:
set_bit(irq, irq_affinity_request); set_bit(d->irq, irq_affinity_request);
err = 0; err = 0;
break; break;
} }
...@@ -202,15 +206,15 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask) ...@@ -202,15 +206,15 @@ mn10300_cpupic_setaffinity(unsigned int irq, const struct cpumask *mask)
* mask_ack() is provided), and mask_ack() just masks. * mask_ack() is provided), and mask_ack() just masks.
*/ */
static struct irq_chip mn10300_cpu_pic_level = { static struct irq_chip mn10300_cpu_pic_level = {
.name = "cpu_l", .name = "cpu_l",
.disable = mn10300_cpupic_mask, .irq_disable = mn10300_cpupic_mask,
.enable = mn10300_cpupic_unmask_clear, .irq_enable = mn10300_cpupic_unmask_clear,
.ack = NULL, .irq_ack = NULL,
.mask = mn10300_cpupic_mask, .irq_mask = mn10300_cpupic_mask,
.mask_ack = mn10300_cpupic_mask, .irq_mask_ack = mn10300_cpupic_mask,
.unmask = mn10300_cpupic_unmask_clear, .irq_unmask = mn10300_cpupic_unmask_clear,
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
.set_affinity = mn10300_cpupic_setaffinity, .irq_set_affinity = mn10300_cpupic_setaffinity,
#endif #endif
}; };
...@@ -220,15 +224,15 @@ static struct irq_chip mn10300_cpu_pic_level = { ...@@ -220,15 +224,15 @@ static struct irq_chip mn10300_cpu_pic_level = {
* We use the latch clearing function of the PIC as the 'ACK' function. * We use the latch clearing function of the PIC as the 'ACK' function.
*/ */
static struct irq_chip mn10300_cpu_pic_edge = { static struct irq_chip mn10300_cpu_pic_edge = {
.name = "cpu_e", .name = "cpu_e",
.disable = mn10300_cpupic_mask, .irq_disable = mn10300_cpupic_mask,
.enable = mn10300_cpupic_unmask, .irq_enable = mn10300_cpupic_unmask,
.ack = mn10300_cpupic_ack, .irq_ack = mn10300_cpupic_ack,
.mask = mn10300_cpupic_mask, .irq_mask = mn10300_cpupic_mask,
.mask_ack = mn10300_cpupic_mask_ack, .irq_mask_ack = mn10300_cpupic_mask_ack,
.unmask = mn10300_cpupic_unmask, .irq_unmask = mn10300_cpupic_unmask,
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
.set_affinity = mn10300_cpupic_setaffinity, .irq_set_affinity = mn10300_cpupic_setaffinity,
#endif #endif
}; };
...@@ -252,31 +256,6 @@ void set_intr_level(int irq, u16 level) ...@@ -252,31 +256,6 @@ void set_intr_level(int irq, u16 level)
__mask_and_set_icr(irq, GxICR_ENABLE, level); __mask_and_set_icr(irq, GxICR_ENABLE, level);
} }
void mn10300_intc_set_level(unsigned int irq, unsigned int level)
{
set_intr_level(irq, NUM2GxICR_LEVEL(level) & GxICR_LEVEL);
}
void mn10300_intc_clear(unsigned int irq)
{
__mask_and_set_icr(irq, GxICR_LEVEL | GxICR_ENABLE, GxICR_DETECT);
}
void mn10300_intc_set(unsigned int irq)
{
__mask_and_set_icr(irq, 0, GxICR_REQUEST | GxICR_DETECT);
}
void mn10300_intc_enable(unsigned int irq)
{
mn10300_cpupic_unmask(irq);
}
void mn10300_intc_disable(unsigned int irq)
{
mn10300_cpupic_mask(irq);
}
/* /*
* mark an interrupt to be ACK'd after interrupt handlers have been run rather * mark an interrupt to be ACK'd after interrupt handlers have been run rather
* than before * than before
...@@ -296,7 +275,7 @@ void __init init_IRQ(void) ...@@ -296,7 +275,7 @@ void __init init_IRQ(void)
int irq; int irq;
for (irq = 0; irq < NR_IRQS; irq++) for (irq = 0; irq < NR_IRQS; irq++)
if (irq_desc[irq].chip == &no_irq_chip) if (get_irq_chip(irq) == &no_irq_chip)
/* due to the PIC latching interrupt requests, even /* due to the PIC latching interrupt requests, even
* when the IRQ is disabled, IRQ_PENDING is superfluous * when the IRQ is disabled, IRQ_PENDING is superfluous
* and we can use handle_level_irq() for edge-triggered * and we can use handle_level_irq() for edge-triggered
...@@ -384,12 +363,12 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -384,12 +363,12 @@ int show_interrupts(struct seq_file *p, void *v)
if (i < NR_CPU_IRQS) if (i < NR_CPU_IRQS)
seq_printf(p, " %14s.%u", seq_printf(p, " %14s.%u",
irq_desc[i].chip->name, irq_desc[i].irq_data.chip->name,
(GxICR(i) & GxICR_LEVEL) >> (GxICR(i) & GxICR_LEVEL) >>
GxICR_LEVEL_SHIFT); GxICR_LEVEL_SHIFT);
else else
seq_printf(p, " %14s", seq_printf(p, " %14s",
irq_desc[i].chip->name); irq_desc[i].irq_data.chip->name);
seq_printf(p, " %s", action->name); seq_printf(p, " %s", action->name);
......
...@@ -384,17 +384,21 @@ static void mn10300_serial_mask_ack(unsigned int irq) ...@@ -384,17 +384,21 @@ static void mn10300_serial_mask_ack(unsigned int irq)
arch_local_irq_restore(flags); arch_local_irq_restore(flags);
} }
static void mn10300_serial_nop(unsigned int irq) static void mn10300_serial_chip_mask_ack(struct irq_data *d)
{
mn10300_serial_mask_ack(d->irq);
}
static void mn10300_serial_nop(struct irq_data *d)
{ {
} }
static struct irq_chip mn10300_serial_pic = { static struct irq_chip mn10300_serial_pic = {
.name = "mnserial", .name = "mnserial",
.ack = mn10300_serial_mask_ack, .irq_ack = mn10300_serial_chip_mask_ack,
.mask = mn10300_serial_mask_ack, .irq_mask = mn10300_serial_chip_mask_ack,
.mask_ack = mn10300_serial_mask_ack, .irq_mask_ack = mn10300_serial_chip_mask_ack,
.unmask = mn10300_serial_nop, .irq_unmask = mn10300_serial_nop,
.end = mn10300_serial_nop,
}; };
......
...@@ -113,15 +113,17 @@ static void init_ipi(void); ...@@ -113,15 +113,17 @@ static void init_ipi(void);
*/ */
static void mn10300_ipi_disable(unsigned int irq); static void mn10300_ipi_disable(unsigned int irq);
static void mn10300_ipi_enable(unsigned int irq); static void mn10300_ipi_enable(unsigned int irq);
static void mn10300_ipi_ack(unsigned int irq); static void mn10300_ipi_chip_disable(struct irq_data *d);
static void mn10300_ipi_nop(unsigned int irq); static void mn10300_ipi_chip_enable(struct irq_data *d);
static void mn10300_ipi_ack(struct irq_data *d);
static void mn10300_ipi_nop(struct irq_data *d);
static struct irq_chip mn10300_ipi_type = { static struct irq_chip mn10300_ipi_type = {
.name = "cpu_ipi", .name = "cpu_ipi",
.disable = mn10300_ipi_disable, .irq_disable = mn10300_ipi_chip_disable,
.enable = mn10300_ipi_enable, .irq_enable = mn10300_ipi_chip_enable,
.ack = mn10300_ipi_ack, .irq_ack = mn10300_ipi_ack,
.eoi = mn10300_ipi_nop .irq_eoi = mn10300_ipi_nop
}; };
static irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id); static irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id);
...@@ -236,6 +238,11 @@ static void mn10300_ipi_enable(unsigned int irq) ...@@ -236,6 +238,11 @@ static void mn10300_ipi_enable(unsigned int irq)
arch_local_irq_restore(flags); arch_local_irq_restore(flags);
} }
static void mn10300_ipi_chip_enable(struct irq_data *d)
{
mn10300_ipi_enable(d->irq);
}
/** /**
* mn10300_ipi_disable - Disable an IPI * mn10300_ipi_disable - Disable an IPI
* @irq: The IPI to be disabled. * @irq: The IPI to be disabled.
...@@ -254,6 +261,12 @@ static void mn10300_ipi_disable(unsigned int irq) ...@@ -254,6 +261,12 @@ static void mn10300_ipi_disable(unsigned int irq)
arch_local_irq_restore(flags); arch_local_irq_restore(flags);
} }
static void mn10300_ipi_chip_disable(struct irq_data *d)
{
mn10300_ipi_disable(d->irq);
}
/** /**
* mn10300_ipi_ack - Acknowledge an IPI interrupt in the PIC * mn10300_ipi_ack - Acknowledge an IPI interrupt in the PIC
* @irq: The IPI to be acknowledged. * @irq: The IPI to be acknowledged.
...@@ -261,8 +274,9 @@ static void mn10300_ipi_disable(unsigned int irq) ...@@ -261,8 +274,9 @@ static void mn10300_ipi_disable(unsigned int irq)
* Clear the interrupt detection flag for the IPI on the appropriate interrupt * Clear the interrupt detection flag for the IPI on the appropriate interrupt
* channel in the PIC. * channel in the PIC.
*/ */
static void mn10300_ipi_ack(unsigned int irq) static void mn10300_ipi_ack(struct irq_data *d)
{ {
unsigned int irq = d->irq;
unsigned long flags; unsigned long flags;
u16 tmp; u16 tmp;
...@@ -276,7 +290,7 @@ static void mn10300_ipi_ack(unsigned int irq) ...@@ -276,7 +290,7 @@ static void mn10300_ipi_ack(unsigned int irq)
* mn10300_ipi_nop - Dummy IPI action * mn10300_ipi_nop - Dummy IPI action
* @irq: The IPI to be acted upon. * @irq: The IPI to be acted upon.
*/ */
static void mn10300_ipi_nop(unsigned int irq) static void mn10300_ipi_nop(struct irq_data *d)
{ {
} }
......
...@@ -93,79 +93,6 @@ irqreturn_t local_timer_interrupt(void) ...@@ -93,79 +93,6 @@ irqreturn_t local_timer_interrupt(void)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
#ifndef CONFIG_GENERIC_TIME
/*
* advance the kernel's time keeping clocks (xtime and jiffies)
* - we use Timer 0 & 1 cascaded as a clock to nudge us the next time
* there's a need to update
*/
static irqreturn_t timer_interrupt(int irq, void *dev_id)
{
unsigned tsc, elapse;
irqreturn_t ret;
while (tsc = get_cycles(),
elapse = tsc - mn10300_last_tsc, /* time elapsed since last
* tick */
elapse > MN10300_TSC_PER_HZ
) {
mn10300_last_tsc += MN10300_TSC_PER_HZ;
/* advance the kernel's time tracking system */
xtime_update(1);
}
ret = local_timer_interrupt();
#ifdef CONFIG_SMP
send_IPI_allbutself(LOCAL_TIMER_IPI);
#endif
return ret;
}
static struct irqaction timer_irq = {
.handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_SHARED | IRQF_TIMER,
.name = "timer",
};
#endif /* CONFIG_GENERIC_TIME */
#ifdef CONFIG_CSRC_MN10300
void __init clocksource_set_clock(struct clocksource *cs, unsigned int clock)
{
u64 temp;
u32 shift;
/* Find a shift value */
for (shift = 32; shift > 0; shift--) {
temp = (u64) NSEC_PER_SEC << shift;
do_div(temp, clock);
if ((temp >> 32) == 0)
break;
}
cs->shift = shift;
cs->mult = (u32) temp;
}
#endif
#if CONFIG_CEVT_MN10300
void __cpuinit clockevent_set_clock(struct clock_event_device *cd,
unsigned int clock)
{
u64 temp;
u32 shift;
/* Find a shift value */
for (shift = 32; shift > 0; shift--) {
temp = (u64) clock << shift;
do_div(temp, NSEC_PER_SEC);
if ((temp >> 32) == 0)
break;
}
cd->shift = shift;
cd->mult = (u32) temp;
}
#endif
/* /*
* initialise the various timers used by the main part of the kernel * initialise the various timers used by the main part of the kernel
*/ */
...@@ -177,11 +104,7 @@ void __init time_init(void) ...@@ -177,11 +104,7 @@ void __init time_init(void)
*/ */
TMPSCNT |= TMPSCNT_ENABLE; TMPSCNT |= TMPSCNT_ENABLE;
#ifdef CONFIG_GENERIC_TIME
init_clocksource(); init_clocksource();
#else
startup_timestamp_counter();
#endif
printk(KERN_INFO printk(KERN_INFO
"timestamp counter I/O clock running at %lu.%02lu" "timestamp counter I/O clock running at %lu.%02lu"
...@@ -190,12 +113,7 @@ void __init time_init(void) ...@@ -190,12 +113,7 @@ void __init time_init(void)
mn10300_last_tsc = read_timestamp_counter(); mn10300_last_tsc = read_timestamp_counter();
#ifdef CONFIG_GENERIC_CLOCKEVENTS
init_clockevents(); init_clockevents();
#else
reload_jiffies_counter(MN10300_JC_PER_HZ - 1);
setup_jiffies_interrupt(TMJCIRQ, &timer_irq, CONFIG_TIMER_IRQ_LEVEL);
#endif
#ifdef CONFIG_MN10300_WD_TIMER #ifdef CONFIG_MN10300_WD_TIMER
/* start the watchdog timer */ /* start the watchdog timer */
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#define ASB2364_FPGA_REG_RESET_USB __SYSREG(0xa900130c, u16) #define ASB2364_FPGA_REG_RESET_USB __SYSREG(0xa900130c, u16)
#define ASB2364_FPGA_REG_RESET_AV __SYSREG(0xa9001310, u16) #define ASB2364_FPGA_REG_RESET_AV __SYSREG(0xa9001310, u16)
#define ASB2364_FPGA_REG_IRQ(X) __SYSREG(0xa9001590+((X)*4), u16) #define ASB2364_FPGA_REG_IRQ(X) __SYSREG(0xa9001510+((X)*4), u16)
#define ASB2364_FPGA_REG_IRQ_LAN ASB2364_FPGA_REG_IRQ(0) #define ASB2364_FPGA_REG_IRQ_LAN ASB2364_FPGA_REG_IRQ(0)
#define ASB2364_FPGA_REG_IRQ_UART ASB2364_FPGA_REG_IRQ(1) #define ASB2364_FPGA_REG_IRQ_UART ASB2364_FPGA_REG_IRQ(1)
#define ASB2364_FPGA_REG_IRQ_I2C ASB2364_FPGA_REG_IRQ(2) #define ASB2364_FPGA_REG_IRQ_I2C ASB2364_FPGA_REG_IRQ(2)
......
...@@ -59,18 +59,18 @@ static inline void __debug_to_serial(const char *p, int n) ...@@ -59,18 +59,18 @@ static inline void __debug_to_serial(const char *p, int n)
#define SERIAL_PORT_DFNS /* stolen by gdb-stub */ #define SERIAL_PORT_DFNS /* stolen by gdb-stub */
#if defined(CONFIG_GDBSTUB_ON_TTYS0) #if defined(CONFIG_GDBSTUB_ON_TTYS0)
#define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 4, u8) #define GDBPORT_SERIAL_RX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_RX * 2, u8)
#define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 4, u8) #define GDBPORT_SERIAL_TX __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_TX * 2, u8)
#define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 4, u8) #define GDBPORT_SERIAL_DLL __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLL * 2, u8)
#define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 4, u8) #define GDBPORT_SERIAL_DLM __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_DLM * 2, u8)
#define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 4, u8) #define GDBPORT_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 2, u8)
#define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 4, u8) #define GDBPORT_SERIAL_IIR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IIR * 2, u8)
#define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 4, u8) #define GDBPORT_SERIAL_FCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_FCR * 2, u8)
#define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 4, u8) #define GDBPORT_SERIAL_LCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LCR * 2, u8)
#define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 4, u8) #define GDBPORT_SERIAL_MCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MCR * 2, u8)
#define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 4, u8) #define GDBPORT_SERIAL_LSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_LSR * 2, u8)
#define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 4, u8) #define GDBPORT_SERIAL_MSR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_MSR * 2, u8)
#define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 4, u8) #define GDBPORT_SERIAL_SCR __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_SCR * 2, u8)
#define GDBPORT_SERIAL_IRQ SERIAL_IRQ #define GDBPORT_SERIAL_IRQ SERIAL_IRQ
#elif defined(CONFIG_GDBSTUB_ON_TTYS1) #elif defined(CONFIG_GDBSTUB_ON_TTYS1)
......
...@@ -17,38 +17,38 @@ ...@@ -17,38 +17,38 @@
/* /*
* FPGA PIC operations * FPGA PIC operations
*/ */
static void asb2364_fpga_mask(unsigned int irq) static void asb2364_fpga_mask(struct irq_data *d)
{ {
ASB2364_FPGA_REG_MASK(irq - NR_CPU_IRQS) = 0x0001; ASB2364_FPGA_REG_MASK(d->irq - NR_CPU_IRQS) = 0x0001;
SyncExBus(); SyncExBus();
} }
static void asb2364_fpga_ack(unsigned int irq) static void asb2364_fpga_ack(struct irq_data *d)
{ {
ASB2364_FPGA_REG_IRQ(irq - NR_CPU_IRQS) = 0x0001; ASB2364_FPGA_REG_IRQ(d->irq - NR_CPU_IRQS) = 0x0001;
SyncExBus(); SyncExBus();
} }
static void asb2364_fpga_mask_ack(unsigned int irq) static void asb2364_fpga_mask_ack(struct irq_data *d)
{ {
ASB2364_FPGA_REG_MASK(irq - NR_CPU_IRQS) = 0x0001; ASB2364_FPGA_REG_MASK(d->irq - NR_CPU_IRQS) = 0x0001;
SyncExBus(); SyncExBus();
ASB2364_FPGA_REG_IRQ(irq - NR_CPU_IRQS) = 0x0001; ASB2364_FPGA_REG_IRQ(d->irq - NR_CPU_IRQS) = 0x0001;
SyncExBus(); SyncExBus();
} }
static void asb2364_fpga_unmask(unsigned int irq) static void asb2364_fpga_unmask(struct irq_data *d)
{ {
ASB2364_FPGA_REG_MASK(irq - NR_CPU_IRQS) = 0x0000; ASB2364_FPGA_REG_MASK(d->irq - NR_CPU_IRQS) = 0x0000;
SyncExBus(); SyncExBus();
} }
static struct irq_chip asb2364_fpga_pic = { static struct irq_chip asb2364_fpga_pic = {
.name = "fpga", .name = "fpga",
.ack = asb2364_fpga_ack, .irq_ack = asb2364_fpga_ack,
.mask = asb2364_fpga_mask, .irq_mask = asb2364_fpga_mask,
.mask_ack = asb2364_fpga_mask_ack, .irq_mask_ack = asb2364_fpga_mask_ack,
.unmask = asb2364_fpga_unmask, .irq_unmask = asb2364_fpga_unmask,
}; };
/* /*
...@@ -88,6 +88,17 @@ void __init irq_fpga_init(void) ...@@ -88,6 +88,17 @@ void __init irq_fpga_init(void)
{ {
int irq; int irq;
ASB2364_FPGA_REG_MASK_LAN = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_MASK_UART = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_MASK_I2C = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_MASK_USB = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_MASK_FPGA = 0x0001;
SyncExBus();
for (irq = NR_CPU_IRQS; irq < NR_IRQS; irq++) for (irq = NR_CPU_IRQS; irq < NR_IRQS; irq++)
set_irq_chip_and_handler(irq, &asb2364_fpga_pic, handle_level_irq); set_irq_chip_and_handler(irq, &asb2364_fpga_pic, handle_level_irq);
......
...@@ -20,13 +20,41 @@ ...@@ -20,13 +20,41 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/intctl-regs.h> #include <asm/intctl-regs.h>
#include <asm/serial-regs.h>
#include <unit/fpga-regs.h> #include <unit/fpga-regs.h>
#include <unit/serial.h>
#include <unit/smsc911x.h>
#define TTYS0_SERIAL_IER __SYSREG(SERIAL_PORT0_BASE_ADDRESS + UART_IER * 2, u8)
#define LAN_IRQ_CFG __SYSREG(SMSC911X_BASE + 0x54, u32)
#define LAN_INT_EN __SYSREG(SMSC911X_BASE + 0x5c, u32)
/* /*
* initialise some of the unit hardware before gdbstub is set up * initialise some of the unit hardware before gdbstub is set up
*/ */
asmlinkage void __init unit_init(void) asmlinkage void __init unit_init(void)
{ {
/* Make sure we aren't going to get unexpected interrupts */
TTYS0_SERIAL_IER = 0;
SC0RXICR = 0;
SC0TXICR = 0;
SC1RXICR = 0;
SC1TXICR = 0;
SC2RXICR = 0;
SC2TXICR = 0;
/* Attempt to reset the FPGA attached peripherals */
ASB2364_FPGA_REG_RESET_LAN = 0x0000;
SyncExBus();
ASB2364_FPGA_REG_RESET_UART = 0x0000;
SyncExBus();
ASB2364_FPGA_REG_RESET_I2C = 0x0000;
SyncExBus();
ASB2364_FPGA_REG_RESET_USB = 0x0000;
SyncExBus();
ASB2364_FPGA_REG_RESET_AV = 0x0000;
SyncExBus();
/* set up the external interrupts */ /* set up the external interrupts */
/* XIRQ[0]: NAND RXBY */ /* XIRQ[0]: NAND RXBY */
...@@ -56,7 +84,23 @@ asmlinkage void __init unit_init(void) ...@@ -56,7 +84,23 @@ asmlinkage void __init unit_init(void)
*/ */
asmlinkage void __init unit_setup(void) asmlinkage void __init unit_setup(void)
{ {
/* Release the reset on the SMSC911X so that it is ready by the time we
* need it */
ASB2364_FPGA_REG_RESET_LAN = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_RESET_UART = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_RESET_I2C = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_RESET_USB = 0x0001;
SyncExBus();
ASB2364_FPGA_REG_RESET_AV = 0x0001;
SyncExBus();
/* Make sure the ethernet chipset isn't going to give us an interrupt
* storm from stuff it was doing pre-reset */
LAN_IRQ_CFG = 0;
LAN_INT_EN = 0;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment