mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/arch/arm/mach-gemini/common.h
 | |
| +++ b/arch/arm/mach-gemini/common.h
 | |
| @@ -15,6 +15,7 @@
 | |
|  #include <linux/reboot.h>
 | |
|  
 | |
|  struct mtd_partition;
 | |
| +struct gemini_gmac_platform_data;
 | |
|  
 | |
|  extern void gemini_map_io(void);
 | |
|  extern void gemini_init_irq(void);
 | |
| @@ -28,6 +29,7 @@ extern int platform_register_pflash(unsi
 | |
|  				    struct mtd_partition *parts,
 | |
|  				    unsigned int nr_parts);
 | |
|  extern int platform_register_watchdog(void);
 | |
| +extern int platform_register_ethernet(struct gemini_gmac_platform_data *pdata);
 | |
|  
 | |
|  extern void gemini_restart(enum reboot_mode mode, const char *cmd);
 | |
|  
 | |
| --- a/arch/arm/mach-gemini/devices.c
 | |
| +++ b/arch/arm/mach-gemini/devices.c
 | |
| @@ -17,6 +17,7 @@
 | |
|  #include <mach/irqs.h>
 | |
|  #include <mach/hardware.h>
 | |
|  #include <mach/global_reg.h>
 | |
| +#include <mach/gmac.h>
 | |
|  
 | |
|  static struct plat_serial8250_port serial_platform_data[] = {
 | |
|  	{
 | |
| @@ -133,3 +134,56 @@ int __init platform_register_watchdog(vo
 | |
|  {
 | |
|  	return platform_device_register(&wdt_device);
 | |
|  }
 | |
| +
 | |
| +static struct resource gmac_resources[] = {
 | |
| +	{
 | |
| +		.start	= GEMINI_TOE_BASE,
 | |
| +		.end	= GEMINI_TOE_BASE + 0xffff,
 | |
| +		.flags	= IORESOURCE_MEM,
 | |
| +	},
 | |
| +	{
 | |
| +		.start	= IRQ_GMAC0,
 | |
| +		.end	= IRQ_GMAC0,
 | |
| +		.flags	= IORESOURCE_IRQ,
 | |
| +	},
 | |
| +	{
 | |
| +		.start	= IRQ_GMAC1,
 | |
| +		.end	= IRQ_GMAC1,
 | |
| +		.flags	= IORESOURCE_IRQ,
 | |
| +	},
 | |
| +};
 | |
| +
 | |
| +static u64 gmac_dmamask = 0xffffffffUL;
 | |
| +
 | |
| +static struct platform_device ethernet_device = {
 | |
| +	.name	= "gmac-gemini",
 | |
| +	.id	= 0,
 | |
| +	.dev	= {
 | |
| +		.dma_mask		= &gmac_dmamask,
 | |
| +		.coherent_dma_mask	= 0xffffffff,
 | |
| +	},
 | |
| +	.num_resources	= ARRAY_SIZE(gmac_resources),
 | |
| +	.resource	= gmac_resources,
 | |
| +};
 | |
| +
 | |
| +int platform_register_ethernet(struct gemini_gmac_platform_data *pdata)
 | |
| +{
 | |
| +	unsigned int reg;
 | |
| +
 | |
| +	reg = readl((void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) +
 | |
| +		GLOBAL_MISC_CTRL));
 | |
| +
 | |
| +	reg &= ~(GMAC_GMII | GMAC_1_ENABLE);
 | |
| +
 | |
| +	if (pdata->bus_id[1])
 | |
| +		reg |= GMAC_1_ENABLE;
 | |
| +	else if (pdata->interface[0] == PHY_INTERFACE_MODE_GMII)
 | |
| +		reg |= GMAC_GMII;
 | |
| +
 | |
| +	writel(reg, (void __iomem*)(IO_ADDRESS(GEMINI_GLOBAL_BASE) +
 | |
| +		GLOBAL_MISC_CTRL));
 | |
| +
 | |
| +	ethernet_device.dev.platform_data = pdata;
 | |
| +
 | |
| +	return platform_device_register(ðernet_device);
 | |
| +}
 |