⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.6.20-at91.patch

📁 内容包括2.6.14内核到2.6.23内核的at91内核补丁(没有2.6.19的)
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+ * the Free Software Foundation; either version 2 of the License, or+ * (at your option) any later version.+ *+ */+#include <asm/mach/arch.h>+#include <asm/mach/map.h>++#include <linux/platform_device.h>++#include <asm/arch/board.h>+#include <asm/arch/gpio.h>+#include <asm/arch/at91sam9263.h>+#include <asm/arch/at91sam926x_mc.h>+#include <asm/arch/at91sam9263_matrix.h>++#include "generic.h"++#define SZ_512	0x00000200+#define SZ_256	0x00000100+#define SZ_16	0x00000010++/* --------------------------------------------------------------------+ *  USB Host+ * -------------------------------------------------------------------- */++#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)+static u64 ohci_dmamask = 0xffffffffUL;+static struct at91_usbh_data usbh_data;++static struct resource usbh_resources[] = {+	[0] = {+		.start	= AT91SAM9263_UHP_BASE,+		.end	= AT91SAM9263_UHP_BASE + SZ_1M - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_UHP,+		.end	= AT91SAM9263_ID_UHP,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91_usbh_device = {+	.name		= "at91_ohci",+	.id		= -1,+	.dev		= {+				.dma_mask		= &ohci_dmamask,+				.coherent_dma_mask	= 0xffffffff,+				.platform_data		= &usbh_data,+	},+	.resource	= usbh_resources,+	.num_resources	= ARRAY_SIZE(usbh_resources),+};++void __init at91_add_device_usbh(struct at91_usbh_data *data)+{+	int i;++	if (!data)+		return;++	/* Enable VBus control for UHP ports */+	for (i = 0; i < data->ports; i++) {+		if (data->vbus_pin[i])+			at91_set_gpio_output(data->vbus_pin[i], 0);+	}++	usbh_data = *data;+	platform_device_register(&at91_usbh_device);+}+#else+void __init at91_add_device_usbh(struct at91_usbh_data *data) {}+#endif+++/* --------------------------------------------------------------------+ *  USB Device (Gadget)+ * -------------------------------------------------------------------- */++#ifdef CONFIG_USB_GADGET_AT91+static struct at91_udc_data udc_data;++static struct resource udc_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_UDP,+		.end	= AT91SAM9263_BASE_UDP + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_UDP,+		.end	= AT91SAM9263_ID_UDP,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91_udc_device = {+	.name		= "at91_udc",+	.id		= -1,+	.dev		= {+				.platform_data		= &udc_data,+	},+	.resource	= udc_resources,+	.num_resources	= ARRAY_SIZE(udc_resources),+};++void __init at91_add_device_udc(struct at91_udc_data *data)+{+	if (!data)+		return;++	if (data->vbus_pin) {+		at91_set_gpio_input(data->vbus_pin, 0);+		at91_set_deglitch(data->vbus_pin, 1);+	}++	/* Pullup pin is handled internally by USB device peripheral */++	udc_data = *data;+	platform_device_register(&at91_udc_device);+}+#else+void __init at91_add_device_udc(struct at91_udc_data *data) {}+#endif+++/* --------------------------------------------------------------------+ *  Ethernet+ * -------------------------------------------------------------------- */++#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)+static u64 eth_dmamask = 0xffffffffUL;+static struct at91_eth_data eth_data;++static struct resource eth_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_EMAC,+		.end	= AT91SAM9263_BASE_EMAC + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_EMAC,+		.end	= AT91SAM9263_ID_EMAC,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_eth_device = {+	.name		= "macb",+	.id		= -1,+	.dev		= {+				.dma_mask		= &eth_dmamask,+				.coherent_dma_mask	= 0xffffffff,+				.platform_data		= &eth_data,+	},+	.resource	= eth_resources,+	.num_resources	= ARRAY_SIZE(eth_resources),+};++void __init at91_add_device_eth(struct at91_eth_data *data)+{+	if (!data)+		return;++	if (data->phy_irq_pin) {+		at91_set_gpio_input(data->phy_irq_pin, 0);+		at91_set_deglitch(data->phy_irq_pin, 1);+	}++	/* Pins used for MII and RMII */+	at91_set_A_periph(AT91_PIN_PE21, 0);	/* ETXCK_EREFCK */+	at91_set_B_periph(AT91_PIN_PC25, 0);	/* ERXDV */+	at91_set_A_periph(AT91_PIN_PE25, 0);	/* ERX0 */+	at91_set_A_periph(AT91_PIN_PE26, 0);	/* ERX1 */+	at91_set_A_periph(AT91_PIN_PE27, 0);	/* ERXER */+	at91_set_A_periph(AT91_PIN_PE28, 0);	/* ETXEN */+	at91_set_A_periph(AT91_PIN_PE23, 0);	/* ETX0 */+	at91_set_A_periph(AT91_PIN_PE24, 0);	/* ETX1 */+	at91_set_A_periph(AT91_PIN_PE30, 0);	/* EMDIO */+	at91_set_A_periph(AT91_PIN_PE29, 0);	/* EMDC */++	if (!data->is_rmii) {+		at91_set_A_periph(AT91_PIN_PE22, 0);	/* ECRS */+		at91_set_B_periph(AT91_PIN_PC26, 0);	/* ECOL */+		at91_set_B_periph(AT91_PIN_PC22, 0);	/* ERX2 */+		at91_set_B_periph(AT91_PIN_PC23, 0);	/* ERX3 */+		at91_set_B_periph(AT91_PIN_PC27, 0);	/* ERXCK */+		at91_set_B_periph(AT91_PIN_PC20, 0);	/* ETX2 */+		at91_set_B_periph(AT91_PIN_PC21, 0);	/* ETX3 */+		at91_set_B_periph(AT91_PIN_PC24, 0);	/* ETXER */+	}++	eth_data = *data;+	platform_device_register(&at91sam9263_eth_device);+}+#else+void __init at91_add_device_eth(struct at91_eth_data *data) {}+#endif+++/* --------------------------------------------------------------------+ *  MMC / SD+ * -------------------------------------------------------------------- */++#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)+static u64 mmc_dmamask = 0xffffffffUL;+static struct at91_mmc_data mmc0_data, mmc1_data;++static struct resource mmc0_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_MCI0,+		.end	= AT91SAM9263_BASE_MCI0 + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_MCI0,+		.end	= AT91SAM9263_ID_MCI0,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_mmc0_device = {+	.name		= "at91_mci",+	.id		= 0,+	.dev		= {+				.dma_mask		= &mmc_dmamask,+				.coherent_dma_mask	= 0xffffffff,+				.platform_data		= &mmc0_data,+	},+	.resource	= mmc0_resources,+	.num_resources	= ARRAY_SIZE(mmc0_resources),+};++static struct resource mmc1_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_MCI1,+		.end	= AT91SAM9263_BASE_MCI1 + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_MCI1,+		.end	= AT91SAM9263_ID_MCI1,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_mmc1_device = {+	.name		= "at91_mci",+	.id		= 1,+	.dev		= {+				.dma_mask		= &mmc_dmamask,+				.coherent_dma_mask	= 0xffffffff,+				.platform_data		= &mmc1_data,+	},+	.resource	= mmc1_resources,+	.num_resources	= ARRAY_SIZE(mmc1_resources),+};++void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)+{+	if (!data)+		return;++	/* input/irq */+	if (data->det_pin) {+		at91_set_gpio_input(data->det_pin, 1);+		at91_set_deglitch(data->det_pin, 1);+	}+	if (data->wp_pin)+		at91_set_gpio_input(data->wp_pin, 1);+	if (data->vcc_pin)+		at91_set_gpio_output(data->vcc_pin, 0);++	if (mmc_id == 0) {		/* MCI0 */+		/* CLK */+		at91_set_A_periph(AT91_PIN_PA12, 0);++		if (data->slot_b) {+			/* CMD */+			at91_set_A_periph(AT91_PIN_PA16, 1);++			/* DAT0, maybe DAT1..DAT3 */+			at91_set_A_periph(AT91_PIN_PA17, 1);+			if (data->wire4) {+				at91_set_A_periph(AT91_PIN_PA18, 1);+				at91_set_A_periph(AT91_PIN_PA19, 1);+				at91_set_A_periph(AT91_PIN_PA20, 1);+			}+		} else {+			/* CMD */+			at91_set_A_periph(AT91_PIN_PA1, 1);++			/* DAT0, maybe DAT1..DAT3 */+			at91_set_A_periph(AT91_PIN_PA0, 1);+			if (data->wire4) {+				at91_set_A_periph(AT91_PIN_PA3, 1);+				at91_set_A_periph(AT91_PIN_PA4, 1);+				at91_set_A_periph(AT91_PIN_PA5, 1);+			}+		}++		mmc0_data = *data;+		at91_clock_associate("mci0_clk", &at91sam9263_mmc1_device.dev, "mci_clk");+		platform_device_register(&at91sam9263_mmc0_device);+	} else {			/* MCI1 */+		/* CLK */+		at91_set_A_periph(AT91_PIN_PA6, 0);++		if (data->slot_b) {+			/* CMD */+			at91_set_A_periph(AT91_PIN_PA21, 1);++			/* DAT0, maybe DAT1..DAT3 */+			at91_set_A_periph(AT91_PIN_PA22, 1);+			if (data->wire4) {+				at91_set_A_periph(AT91_PIN_PA23, 1);+				at91_set_A_periph(AT91_PIN_PA24, 1);+				at91_set_A_periph(AT91_PIN_PA25, 1);+			}+		} else {+			/* CMD */+			at91_set_A_periph(AT91_PIN_PA7, 1);++			/* DAT0, maybe DAT1..DAT3 */+			at91_set_A_periph(AT91_PIN_PA8, 1);+			if (data->wire4) {+				at91_set_A_periph(AT91_PIN_PA9, 1);+				at91_set_A_periph(AT91_PIN_PA10, 1);+				at91_set_A_periph(AT91_PIN_PA11, 1);+			}+		}++		mmc1_data = *data;+		at91_clock_associate("mci1_clk", &at91sam9263_mmc1_device.dev, "mci_clk");+		platform_device_register(&at91sam9263_mmc1_device);+	}+}+#else+void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}+#endif+++/* --------------------------------------------------------------------+ *  NAND / SmartMedia+ * -------------------------------------------------------------------- */++#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)+static struct at91_nand_data nand_data;++#define NAND_BASE	AT91_CHIPSELECT_3++static struct resource nand_resources[] = {+	{+		.start	= NAND_BASE,+		.end	= NAND_BASE + SZ_256M - 1,+		.flags	= IORESOURCE_MEM,+	}+};++static struct platform_device at91sam9263_nand_device = {+	.name		= "at91_nand",+	.id		= -1,+	.dev		= {+				.platform_data	= &nand_data,+	},+	.resource	= nand_resources,+	.num_resources	= ARRAY_SIZE(nand_resources),+};++void __init at91_add_device_nand(struct at91_nand_data *data)+{+	unsigned long csa, mode;++	if (!data)+		return;++	csa = at91_sys_read(AT91_MATRIX_EBI0CSA);+	at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC);++	/* set the bus interface characteristics */+	at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)+			| AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));++	at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3)+			| AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3));++	at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5));++	if (data->bus_width_16)+		mode = AT91_SMC_DBW_16;+	else+		mode = AT91_SMC_DBW_8;+	at91_sys_write(AT91_SMC_MODE(3), mode | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(2));++	/* enable pin */+	if (data->enable_pin)+		at91_set_gpio_output(data->enable_pin, 1);++	/* ready/busy pin */+	if (data->rdy_pin)+		at91_set_gpio_input(data->rdy_pin, 1);++	/* card detect pin */+	if (data->det_pin)+		at91_set_gpio_input(data->det_pin, 1);++	nand_data = *data;+	platform_device_register(&at91sam9263_nand_device);+}+#else+void __init at91_add_device_nand(struct at91_nand_data *data) {}+#endif+++/* --------------------------------------------------------------------+ *  TWI (i2c)+ * -------------------------------------------------------------------- */++#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)++static struct resource twi_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_TWI,+		.end	= AT91SAM9263_BASE_TWI + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_TWI,+		.end	= AT91SAM9263_ID_TWI,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_twi_device = {+	.name		= "at91_i2c",+	.id		= -1,+	.resource	= twi_resources,+	.num_resources	= ARRAY_SIZE(twi_resources),+};++void __init at91_add_device_i2c(void)+{+	/* pins used for TWI interface */+	at91_set_A_periph(AT91_PIN_PB4, 0);		/* TWD */+	at91_set_multi_drive(AT91_PIN_PB4, 1);++	at91_set_A_periph(AT91_PIN_PB5, 0);		/* TWCK */+	at91_set_multi_drive(AT91_PIN_PB5, 1);++	platform_device_register(&at91sam9263_twi_device);+}+#else+void __init at91_add_device_i2c(void) {}+#endif+++/* --------------------------------------------------------------------+ *  SPI+ * -------------------------------------------------------------------- */++#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)+static u64 spi_dmamask = 0xffffffffUL;++static struct resource spi0_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_SPI0,+		.end	= AT91SAM9263_BASE_SPI0 + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_SPI0,+		.end	= AT91SAM9263_ID_SPI0,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_spi0_device = {+	.name		= "atmel_spi",+	.id		= 0,+	.dev		= {+				.dma_mask		= &spi_dmamask,+				.coherent_dma_mask	= 0xffffffff,+	},+	.resource	= spi0_resources,+	.num_resources	= ARRAY_SIZE(spi0_resources),+};++static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA5, AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PB11 };++static struct resource spi1_resources[] = {+	[0] = {+		.start	= AT91SAM9263_BASE_SPI1,+		.end	= AT91SAM9263_BASE_SPI1 + SZ_16K - 1,+		.flags	= IORESOURCE_MEM,+	},+	[1] = {+		.start	= AT91SAM9263_ID_SPI1,+		.end	= AT91SAM9263_ID_SPI1,+		.flags	= IORESOURCE_IRQ,+	},+};++static struct platform_device at91sam9263_spi1_device = {+	.name		= "atmel_spi",+	.id		= 1,+	.dev		= {+				.dma_mask		= &spi_dmamask,+				.coherent_dma_mask	= 0xffffffff,+	},+	.resource	= spi1_resources,+	.num_resources	= ARRAY_SIZE(spi1_resources),+};++static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB15, AT91_PIN_PB16, AT91_PIN_PB17, AT91_PIN_PB18 };++void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)+{+	int i;+	unsigned long cs_pin;+	short enable_spi0 = 0;+	short enable_spi1 = 0;++	/* Choose SPI chip-selects */+	for (i = 0; i < nr_devices; i++) {+		if (devices[i].controller_data)+			cs_pin = (unsigned long) devices[i].controller_data;+		else if 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -