提交 66bbf58b 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/egtvedt/avr32-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/egtvedt/avr32-2.6:
  avr32: add ATAG_BOARDINFO
  don't check platform_get_irq's return value against zero
  avr32: init cannot ignore signals sent by force_sig_info()
  avr32: fix deadlock when reading clock list in debugfs
  avr32: Fix .size directive for cpu_enter_idle
  avr32: At32ap: pio fix typo "))" on gpio_irq_unmask prototype
  fix the wrong argument of the functions definition
...@@ -94,6 +94,13 @@ struct tag_ethernet { ...@@ -94,6 +94,13 @@ struct tag_ethernet {
#define ETH_INVALID_PHY 0xff #define ETH_INVALID_PHY 0xff
/* board information */
#define ATAG_BOARDINFO 0x54410008
struct tag_boardinfo {
u32 board_number;
};
struct tag { struct tag {
struct tag_header hdr; struct tag_header hdr;
union { union {
...@@ -102,6 +109,7 @@ struct tag { ...@@ -102,6 +109,7 @@ struct tag {
struct tag_cmdline cmdline; struct tag_cmdline cmdline;
struct tag_clock clock; struct tag_clock clock;
struct tag_ethernet ethernet; struct tag_ethernet ethernet;
struct tag_boardinfo boardinfo;
} u; } u;
}; };
...@@ -128,6 +136,7 @@ extern struct tag *bootloader_tags; ...@@ -128,6 +136,7 @@ extern struct tag *bootloader_tags;
extern resource_size_t fbmem_start; extern resource_size_t fbmem_start;
extern resource_size_t fbmem_size; extern resource_size_t fbmem_size;
extern u32 board_number;
void setup_processor(void); void setup_processor(void);
......
...@@ -390,6 +390,21 @@ static int __init parse_tag_clock(struct tag *tag) ...@@ -390,6 +390,21 @@ static int __init parse_tag_clock(struct tag *tag)
} }
__tagtable(ATAG_CLOCK, parse_tag_clock); __tagtable(ATAG_CLOCK, parse_tag_clock);
/*
* The board_number correspond to the bd->bi_board_number in U-Boot. This
* parameter is only available during initialisation and can be used in some
* kind of board identification.
*/
u32 __initdata board_number;
static int __init parse_tag_boardinfo(struct tag *tag)
{
board_number = tag->u.boardinfo.board_number;
return 0;
}
__tagtable(ATAG_BOARDINFO, parse_tag_boardinfo);
/* /*
* Scan the tag table for this tag, and call its parse function. The * Scan the tag table for this tag, and call its parse function. The
* tag table is built by the linker from all the __tagtable * tag table is built by the linker from all the __tagtable
......
...@@ -95,28 +95,6 @@ void _exception(long signr, struct pt_regs *regs, int code, ...@@ -95,28 +95,6 @@ void _exception(long signr, struct pt_regs *regs, int code,
info.si_code = code; info.si_code = code;
info.si_addr = (void __user *)addr; info.si_addr = (void __user *)addr;
force_sig_info(signr, &info, current); force_sig_info(signr, &info, current);
/*
* Init gets no signals that it doesn't have a handler for.
* That's all very well, but if it has caused a synchronous
* exception and we ignore the resulting signal, it will just
* generate the same exception over and over again and we get
* nowhere. Better to kill it and let the kernel panic.
*/
if (is_global_init(current)) {
__sighandler_t handler;
spin_lock_irq(&current->sighand->siglock);
handler = current->sighand->action[signr-1].sa.sa_handler;
spin_unlock_irq(&current->sighand->siglock);
if (handler == SIG_DFL) {
/* init has generated a synchronous exception
and it doesn't have a handler for the signal */
printk(KERN_CRIT "init has generated signal %ld "
"but has no handler for it\n", signr);
do_exit(signr);
}
}
} }
asmlinkage void do_nmi(unsigned long ecr, struct pt_regs *regs) asmlinkage void do_nmi(unsigned long ecr, struct pt_regs *regs)
......
...@@ -35,22 +35,30 @@ void at32_clk_register(struct clk *clk) ...@@ -35,22 +35,30 @@ void at32_clk_register(struct clk *clk)
spin_unlock(&clk_list_lock); spin_unlock(&clk_list_lock);
} }
struct clk *clk_get(struct device *dev, const char *id) static struct clk *__clk_get(struct device *dev, const char *id)
{ {
struct clk *clk; struct clk *clk;
spin_lock(&clk_list_lock);
list_for_each_entry(clk, &at32_clock_list, list) { list_for_each_entry(clk, &at32_clock_list, list) {
if (clk->dev == dev && strcmp(id, clk->name) == 0) { if (clk->dev == dev && strcmp(id, clk->name) == 0) {
spin_unlock(&clk_list_lock);
return clk; return clk;
} }
} }
spin_unlock(&clk_list_lock);
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
} }
struct clk *clk_get(struct device *dev, const char *id)
{
struct clk *clk;
spin_lock(&clk_list_lock);
clk = __clk_get(dev, id);
spin_unlock(&clk_list_lock);
return clk;
}
EXPORT_SYMBOL(clk_get); EXPORT_SYMBOL(clk_get);
void clk_put(struct clk *clk) void clk_put(struct clk *clk)
...@@ -257,15 +265,15 @@ static int clk_show(struct seq_file *s, void *unused) ...@@ -257,15 +265,15 @@ static int clk_show(struct seq_file *s, void *unused)
spin_lock(&clk_list_lock); spin_lock(&clk_list_lock);
/* show clock tree as derived from the three oscillators */ /* show clock tree as derived from the three oscillators */
clk = clk_get(NULL, "osc32k"); clk = __clk_get(NULL, "osc32k");
dump_clock(clk, &r); dump_clock(clk, &r);
clk_put(clk); clk_put(clk);
clk = clk_get(NULL, "osc0"); clk = __clk_get(NULL, "osc0");
dump_clock(clk, &r); dump_clock(clk, &r);
clk_put(clk); clk_put(clk);
clk = clk_get(NULL, "osc1"); clk = __clk_get(NULL, "osc1");
dump_clock(clk, &r); dump_clock(clk, &r);
clk_put(clk); clk_put(clk);
......
...@@ -61,34 +61,34 @@ struct eic { ...@@ -61,34 +61,34 @@ struct eic {
static struct eic *nmi_eic; static struct eic *nmi_eic;
static bool nmi_enabled; static bool nmi_enabled;
static void eic_ack_irq(struct irq_chip *d) static void eic_ack_irq(struct irq_data *d)
{ {
struct eic *eic = irq_data_get_irq_chip_data(data); struct eic *eic = irq_data_get_irq_chip_data(d);
eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq)); eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq));
} }
static void eic_mask_irq(struct irq_chip *d) static void eic_mask_irq(struct irq_data *d)
{ {
struct eic *eic = irq_data_get_irq_chip_data(data); struct eic *eic = irq_data_get_irq_chip_data(d);
eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq)); eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq));
} }
static void eic_mask_ack_irq(struct irq_chip *d) static void eic_mask_ack_irq(struct irq_data *d)
{ {
struct eic *eic = irq_data_get_irq_chip_data(data); struct eic *eic = irq_data_get_irq_chip_data(d);
eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq)); eic_writel(eic, ICR, 1 << (d->irq - eic->first_irq));
eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq)); eic_writel(eic, IDR, 1 << (d->irq - eic->first_irq));
} }
static void eic_unmask_irq(struct irq_chip *d) static void eic_unmask_irq(struct irq_data *d)
{ {
struct eic *eic = irq_data_get_irq_chip_data(data); struct eic *eic = irq_data_get_irq_chip_data(d);
eic_writel(eic, IER, 1 << (d->irq - eic->first_irq)); eic_writel(eic, IER, 1 << (d->irq - eic->first_irq));
} }
static int eic_set_irq_type(struct irq_chip *d, unsigned int flow_type) static int eic_set_irq_type(struct irq_data *d, unsigned int flow_type)
{ {
struct eic *eic = irq_data_get_irq_chip_data(data); struct eic *eic = irq_data_get_irq_chip_data(d);
unsigned int irq = d->irq; unsigned int irq = d->irq;
unsigned int i = irq - eic->first_irq; unsigned int i = irq - eic->first_irq;
u32 mode, edge, level; u32 mode, edge, level;
...@@ -191,7 +191,7 @@ static int __init eic_probe(struct platform_device *pdev) ...@@ -191,7 +191,7 @@ static int __init eic_probe(struct platform_device *pdev)
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
int_irq = platform_get_irq(pdev, 0); int_irq = platform_get_irq(pdev, 0);
if (!regs || !int_irq) { if (!regs || (int)int_irq <= 0) {
dev_dbg(&pdev->dev, "missing regs and/or irq resource\n"); dev_dbg(&pdev->dev, "missing regs and/or irq resource\n");
return -ENXIO; return -ENXIO;
} }
......
...@@ -257,7 +257,7 @@ static void gpio_irq_mask(struct irq_data *d) ...@@ -257,7 +257,7 @@ static void gpio_irq_mask(struct irq_data *d)
pio_writel(pio, IDR, 1 << (gpio & 0x1f)); pio_writel(pio, IDR, 1 << (gpio & 0x1f));
} }
static void gpio_irq_unmask(struct irq_data *d)) static void gpio_irq_unmask(struct irq_data *d)
{ {
unsigned gpio = irq_to_gpio(d->irq); unsigned gpio = irq_to_gpio(d->irq);
struct pio_device *pio = &pio_dev[gpio >> 5]; struct pio_device *pio = &pio_dev[gpio >> 5];
......
...@@ -53,7 +53,7 @@ cpu_enter_idle: ...@@ -53,7 +53,7 @@ cpu_enter_idle:
st.w r8[TI_flags], r9 st.w r8[TI_flags], r9
unmask_interrupts unmask_interrupts
sleep CPU_SLEEP_IDLE sleep CPU_SLEEP_IDLE
.size cpu_idle_sleep, . - cpu_idle_sleep .size cpu_enter_idle, . - cpu_enter_idle
/* /*
* Common return path for PM functions that don't run from * Common return path for PM functions that don't run from
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册