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

Commit cd39301a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://www.atmel.no/~hskinnemoen/linux/kernel/avr32:
  [AVR32] Add missing #include <linux/param.h> to delay.c
  [AVR32] Pass dev parameter to dma_cache_sync()
  [AVR32] Implement intc_get_pending()
  [AVR32] Don't include <asm/delay.h>
  [AVR32] Put the chip in "stop" mode when halting the system
  [AVR32] Set flow handler for external interrupts
  [AVR32] Remove unused file
  [AVR32] Remove mii_phy_addr and eth_addr from eth_platform_data
  [AVR32] Move ethernet tag parsing to board-specific code
  [AVR32] Add macb1 platform_device
  [AVR32] Portmux API update
parents 13d7d84e 3fc0eb47
Loading
Loading
Loading
Loading
+70 −6
Original line number Diff line number Diff line
@@ -7,20 +7,83 @@
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/clk.h>
#include <linux/etherdevice.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/string.h>
#include <linux/types.h>

#include <asm/io.h>
#include <asm/setup.h>
#include <asm/arch/board.h>
#include <asm/arch/init.h>

struct eth_platform_data __initdata eth0_data = {
	.valid		= 1,
	.mii_phy_addr	= 0x10,
	.is_rmii	= 0,
	.hw_addr	= { 0x6a, 0x87, 0x71, 0x14, 0xcd, 0xcb },
struct eth_addr {
	u8 addr[6];
};

static struct eth_addr __initdata hw_addr[2];

static struct eth_platform_data __initdata eth_data[2];
extern struct lcdc_platform_data atstk1000_fb0_data;

/*
 * The next two functions should go away as the boot loader is
 * supposed to initialize the macb address registers with a valid
 * ethernet address. But we need to keep it around for a while until
 * we can be reasonably sure the boot loader does this.
 *
 * The phy_id is ignored as the driver will probe for it.
 */
static int __init parse_tag_ethernet(struct tag *tag)
{
	int i;

	i = tag->u.ethernet.mac_index;
	if (i < ARRAY_SIZE(hw_addr))
		memcpy(hw_addr[i].addr, tag->u.ethernet.hw_address,
		       sizeof(hw_addr[i].addr));

	return 0;
}
__tagtable(ATAG_ETHERNET, parse_tag_ethernet);

static void __init set_hw_addr(struct platform_device *pdev)
{
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	const u8 *addr;
	void __iomem *regs;
	struct clk *pclk;

	if (!res)
		return;
	if (pdev->id >= ARRAY_SIZE(hw_addr))
		return;

	addr = hw_addr[pdev->id].addr;
	if (!is_valid_ether_addr(addr))
		return;

	/*
	 * Since this is board-specific code, we'll cheat and use the
	 * physical address directly as we happen to know that it's
	 * the same as the virtual address.
	 */
	regs = (void __iomem __force *)res->start;
	pclk = clk_get(&pdev->dev, "pclk");
	if (!pclk)
		return;

	clk_enable(pclk);
	__raw_writel((addr[3] << 24) | (addr[2] << 16)
		     | (addr[1] << 8) | addr[0], regs + 0x98);
	__raw_writel((addr[5] << 8) | addr[4], regs + 0x9c);
	clk_disable(pclk);
	clk_put(pclk);
}

void __init setup_board(void)
{
	at32_map_usart(1, 0);	/* /dev/ttyS0 */
@@ -38,7 +101,8 @@ static int __init atstk1002_init(void)
	at32_add_device_usart(1);
	at32_add_device_usart(2);

	at32_add_device_eth(0, &eth0_data);
	set_hw_addr(at32_add_device_eth(0, &eth_data[0]));

	at32_add_device_spi(0);
	at32_add_device_lcdc(0, &atstk1000_fb0_data);

+1 −1
Original line number Diff line number Diff line
@@ -7,12 +7,12 @@
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/module.h>

#include <asm/checksum.h>
#include <asm/uaccess.h>
#include <asm/delay.h>

/*
 * GCC functions
+7 −0
Original line number Diff line number Diff line
@@ -38,6 +38,13 @@ void cpu_idle(void)

void machine_halt(void)
{
	/*
	 * Enter Stop mode. The 32 kHz oscillator will keep running so
	 * the RTC will keep the time properly and the system will
	 * boot quickly.
	 */
	asm volatile("sleep 3\n\t"
		     "sub pc, -2");
}

void machine_power_off(void)
+0 −24
Original line number Diff line number Diff line
@@ -229,30 +229,6 @@ static int __init parse_tag_rsvd_mem(struct tag *tag)
}
__tagtable(ATAG_RSVD_MEM, parse_tag_rsvd_mem);

static int __init parse_tag_ethernet(struct tag *tag)
{
#if 0
	const struct platform_device *pdev;

	/*
	 * We really need a bus type that supports "classes"...this
	 * will do for now (until we must handle other kinds of
	 * ethernet controllers)
	 */
	pdev = platform_get_device("macb", tag->u.ethernet.mac_index);
	if (pdev && pdev->dev.platform_data) {
		struct eth_platform_data *data = pdev->dev.platform_data;

		data->valid = 1;
		data->mii_phy_addr = tag->u.ethernet.mii_phy_addr;
		memcpy(data->hw_addr, tag->u.ethernet.hw_address,
		       sizeof(data->hw_addr));
	}
#endif
	return 0;
}
__tagtable(ATAG_ETHERNET, parse_tag_ethernet);

/*
 * Scan the tag table for this tag, and call its parse function. The
 * tag table is built by the linker from all the __tagtable
+1 −1
Original line number Diff line number Diff line
@@ -12,9 +12,9 @@

#include <linux/delay.h>
#include <linux/module.h>
#include <linux/param.h>
#include <linux/types.h>

#include <asm/delay.h>
#include <asm/processor.h>
#include <asm/sysreg.h>

Loading