Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66bbf58b authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents 1f4f8eea 24a1a475
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -94,6 +94,13 @@ struct tag_ethernet {

#define ETH_INVALID_PHY	0xff

/* board information */
#define ATAG_BOARDINFO	0x54410008

struct tag_boardinfo {
	u32	board_number;
};

struct tag {
	struct tag_header hdr;
	union {
@@ -102,6 +109,7 @@ struct tag {
		struct tag_cmdline cmdline;
		struct tag_clock clock;
		struct tag_ethernet ethernet;
		struct tag_boardinfo boardinfo;
	} u;
};

@@ -128,6 +136,7 @@ extern struct tag *bootloader_tags;

extern resource_size_t fbmem_start;
extern resource_size_t fbmem_size;
extern u32 board_number;

void setup_processor(void);

+15 −0
Original line number Diff line number Diff line
@@ -390,6 +390,21 @@ static int __init parse_tag_clock(struct tag *tag)
}
__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
 * tag table is built by the linker from all the __tagtable
+0 −22
Original line number Diff line number Diff line
@@ -95,28 +95,6 @@ void _exception(long signr, struct pt_regs *regs, int code,
	info.si_code = code;
	info.si_addr = (void __user *)addr;
	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)
+16 −8
Original line number Diff line number Diff line
@@ -35,22 +35,30 @@ void at32_clk_register(struct clk *clk)
	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;

	spin_lock(&clk_list_lock);

	list_for_each_entry(clk, &at32_clock_list, list) {
		if (clk->dev == dev && strcmp(id, clk->name) == 0) {
			spin_unlock(&clk_list_lock);
			return clk;
		}
	}

	spin_unlock(&clk_list_lock);
	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);

void clk_put(struct clk *clk)
@@ -257,15 +265,15 @@ static int clk_show(struct seq_file *s, void *unused)
	spin_lock(&clk_list_lock);

	/* show clock tree as derived from the three oscillators */
	clk = clk_get(NULL, "osc32k");
	clk = __clk_get(NULL, "osc32k");
	dump_clock(clk, &r);
	clk_put(clk);

	clk = clk_get(NULL, "osc0");
	clk = __clk_get(NULL, "osc0");
	dump_clock(clk, &r);
	clk_put(clk);

	clk = clk_get(NULL, "osc1");
	clk = __clk_get(NULL, "osc1");
	dump_clock(clk, &r);
	clk_put(clk);

+11 −11
Original line number Diff line number Diff line
@@ -61,34 +61,34 @@ struct eic {
static struct eic *nmi_eic;
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));
}

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));
}

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, 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));
}

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 i = irq - eic->first_irq;
	u32 mode, edge, level;
@@ -191,7 +191,7 @@ static int __init eic_probe(struct platform_device *pdev)

	regs = platform_get_resource(pdev, IORESOURCE_MEM, 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");
		return -ENXIO;
	}
Loading