From 32fb278553a4cd6126c1791d70aa33df12f73d90 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 3 May 2010 14:41:29 +0200 Subject: [PATCH 07/43] ARM: OMAP: beagleboard: Add infrastructure to do fixups based on expansionboard name passed by u-boot And add support for zippy2 --- arch/arm/mach-omap2/board-omap3beagle.c | 88 +++++++++++++++++++++++++++---- 1 files changed, 78 insertions(+), 10 deletions(-) diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 429dacb..ac96551 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -75,6 +75,8 @@ static struct omap_opp * _omap37x_l3_rate_table = NULL; #define NAND_BLOCK_SIZE SZ_128K +char expansionboard_name[16]; + #if defined(CONFIG_ENC28J60) || defined(CONFIG_ENC28J60_MODULE) #include @@ -87,7 +89,7 @@ static struct omap2_mcspi_device_config enc28j60_spi_chip_info = { .single_channel = 1, /* 0: slave, 1: master */ }; -static struct spi_board_info omap3beagle_spi_board_info[] __initdata = { +static struct spi_board_info omap3beagle_zippy_spi_board_info[] __initdata = { { .modalias = "enc28j60", .bus_num = 4, @@ -102,21 +104,62 @@ static void __init omap3beagle_enc28j60_init(void) if ((gpio_request(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, "ENC28J60_IRQ") == 0) && (gpio_direction_input(OMAP3BEAGLE_GPIO_ENC28J60_IRQ) == 0)) { gpio_export(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, 0); - omap3beagle_spi_board_info[0].irq = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_ENC28J60_IRQ); - set_irq_type(omap3beagle_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING); + omap3beagle_zippy_spi_board_info[0].irq = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_ENC28J60_IRQ); + set_irq_type(omap3beagle_zippy_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING); } else { printk(KERN_ERR "could not obtain gpio for ENC28J60_IRQ\n"); return; } - spi_register_board_info(omap3beagle_spi_board_info, - ARRAY_SIZE(omap3beagle_spi_board_info)); + spi_register_board_info(omap3beagle_zippy_spi_board_info, + ARRAY_SIZE(omap3beagle_zippy_spi_board_info)); } #else static inline void __init omap3beagle_enc28j60_init(void) { return; } #endif +#if defined(CONFIG_KS8851) || defined(CONFIG_KS8851_MODULE) + +#include +#include + +#define OMAP3BEAGLE_GPIO_KS8851_IRQ 157 + +static struct omap2_mcspi_device_config ks8851_spi_chip_info = { + .turbo_mode = 0, + .single_channel = 1, /* 0: slave, 1: master */ +}; + +static struct spi_board_info omap3beagle_zippy2_spi_board_info[] __initdata = { + { + .modalias = "ks8851", + .bus_num = 4, + .chip_select = 0, + .max_speed_hz = 36000000, + .controller_data = &ks8851_spi_chip_info, + }, +}; + +static void __init omap3beagle_ks8851_init(void) +{ + if ((gpio_request(OMAP3BEAGLE_GPIO_KS8851_IRQ, "KS8851_IRQ") == 0) && + (gpio_direction_input(OMAP3BEAGLE_GPIO_KS8851_IRQ) == 0)) { + gpio_export(OMAP3BEAGLE_GPIO_KS8851_IRQ, 0); + omap3beagle_zippy2_spi_board_info[0].irq = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_KS8851_IRQ); + set_irq_type(omap3beagle_zippy2_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING); + } else { + printk(KERN_ERR "could not obtain gpio for KS8851_IRQ\n"); + return; + } + + spi_register_board_info(omap3beagle_zippy2_spi_board_info, + ARRAY_SIZE(omap3beagle_zippy2_spi_board_info)); +} + +#else +static inline void __init omap3beagle_ks8851_init(void) { return; } +#endif static struct mtd_partition omap3beagle_nand_partitions[] = { /* All the partition sizes are listed in terms of NAND block size */ @@ -281,8 +324,6 @@ static struct twl4030_hsmmc_info mmc[] = { { .mmc = 2, .wires = 4, - .gpio_wp = 141, - .gpio_cd = 162, .transceiver = true, .ocr_mask = 0x00100000, /* 3.3V */ }, @@ -601,7 +642,7 @@ static void __init omap3beagle_flash_init(void) } } -static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { +static struct ehci_hcd_omap_platform_data ehci_pdata __initdata = { .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY, .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY, @@ -621,6 +662,15 @@ static struct omap_board_mux board_mux[] __initdata = { #define board_mux NULL #endif +static int __init expansionboard_setup(char *str) +{ + if (!str) + return -EINVAL; + strncpy(expansionboard_name, str, 16); + printk(KERN_INFO "Beagle expansionboard: %s\n", expansionboard_name); + return 0; +} + static void __init omap3_beagle_init(void) { omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); @@ -634,8 +684,24 @@ static void __init omap3_beagle_init(void) /* REVISIT leave DVI powered down until it's needed ... */ gpio_direction_output(170, true); - omap3beagle_enc28j60_init(); - + if(!strcmp(expansionboard_name, "zippy")) + { + printk(KERN_INFO "Beagle expansionboard: initializing enc28j60\n"); + omap3beagle_enc28j60_init(); + printk(KERN_INFO "Beagle expansionboard: assigning GPIO 141 and 162 to MMC1\n"); + mmc[1].gpio_wp = 141; + mmc[1].gpio_cd = 162; + } + + if(!strcmp(expansionboard_name, "zippy2")) + { + printk(KERN_INFO "Beagle expansionboard: initializing ks_8851\n"); + omap3beagle_ks8851_init(); + printk(KERN_INFO "Beagle expansionboard: assigning GPIO 141 and 162 to MMC1\n"); + mmc[1].gpio_wp = 141; + mmc[1].gpio_cd = 162; + } + usb_musb_init(); usb_ehci_init(&ehci_pdata); omap3beagle_flash_init(); @@ -652,6 +718,8 @@ static void __init omap3_beagle_map_io(void) omap2_map_common_io(); } +early_param("buddy", expansionboard_setup); + MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */ .phys_io = 0x48000000, -- 1.6.6.1