206 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * arch/sh/boards/mach-mb796/setup.c
 | |
|  *
 | |
|  * Copyright (C) 2010 STMicroelectronics Limited
 | |
|  * Author: Pawel Moll <pawel.moll@st.com>
 | |
|  *
 | |
|  * May be copied or modified under the terms of the GNU General Public
 | |
|  * License.  See linux/COPYING for more information.
 | |
|  *
 | |
|  * STMicroelectronics STx5289 processor board support.
 | |
|  */
 | |
| 
 | |
| #include <linux/init.h>
 | |
| #include <linux/platform_device.h>
 | |
| #include <linux/delay.h>
 | |
| #include <linux/leds.h>
 | |
| #include <linux/phy.h>
 | |
| #include <linux/gpio.h>
 | |
| #include <linux/spi/flash.h>
 | |
| #include <linux/stm/pci-glue.h>
 | |
| #include <linux/stm/platform.h>
 | |
| #include <linux/stm/stx5206.h>
 | |
| #include <asm/irq.h>
 | |
| #include <mach/common.h>
 | |
| #include "../mach-st/mb705-epld.h"
 | |
| 
 | |
| #define MB796_NOTPIORESETMII stm_gpio(0, 6)
 | |
| 
 | |
| 
 | |
| static void __init mb796_setup(char **cmdline_p)
 | |
| {
 | |
| 	printk(KERN_INFO "STMicroelectronics STx5289 Mboard initialisation\n");
 | |
| 
 | |
| 	stx5206_early_device_init();
 | |
| 
 | |
| 	stx5206_configure_asc(2, &(struct stx5206_asc_config) {
 | |
| 			.hw_flow_control = 1,
 | |
| 			.is_console = 1, });
 | |
| 	stx5206_configure_asc(3, &(struct stx5206_asc_config) {
 | |
| 			.hw_flow_control = 1,
 | |
| 			.is_console = 0, });
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static struct platform_device mb796_leds = {
 | |
| 	.name = "leds-gpio",
 | |
| 	.id = -1,
 | |
| 	.dev.platform_data = &(struct gpio_led_platform_data) {
 | |
| 		.num_leds = 1,
 | |
| 		.leds = (struct gpio_led[]) {
 | |
| 			{	/* J26-D fitted, J21-A 2-3 */
 | |
| 				.name = "LD15 (GREEN)",
 | |
| 				.default_trigger = "heartbeat",
 | |
| 				.gpio = stm_gpio(3, 3),
 | |
| 			},
 | |
| 		},
 | |
| 	},
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * When connected to the mb705, MII reset is controlled by an EPLD register on
 | |
|  * the mb705.  When used standalone, a PIO pin is used, and J22-B must be
 | |
|  * fitted.
 | |
|  */
 | |
| #ifdef CONFIG_SH_ST_MB705
 | |
| static int mb796_phy_reset(void *bus)
 | |
| {
 | |
| 	mb705_reset(EPLD_EMI_RESET_SW0, 15000);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| #else
 | |
| static int mb796_phy_reset(void *bus)
 | |
| {
 | |
| 	gpio_set_value(MB796_NOTPIORESETMII, 0);
 | |
| 	udelay(15000);
 | |
| 	gpio_set_value(MB796_NOTPIORESETMII, 1);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static struct stmmac_mdio_bus_data stmmac_mdio_bus = {
 | |
| 	.bus_id = 0,
 | |
| 	.phy_reset = mb796_phy_reset,
 | |
| 	.phy_mask = 0,
 | |
| };
 | |
| 
 | |
| static struct platform_device *mb796_devices[] __initdata = {
 | |
| 	&mb796_leds,
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| /* PCI configuration */
 | |
| 
 | |
| static struct stm_plat_pci_config mb796_pci_config = {
 | |
| 	.pci_irq = {
 | |
| 		[0] = PCI_PIN_DEFAULT,
 | |
| 		[1] = PCI_PIN_DEFAULT, /* J20-C fitted, J20-D not fitted */
 | |
| 		[2] = PCI_PIN_DEFAULT,
 | |
| 		[3] = PCI_PIN_DEFAULT
 | |
| 	},
 | |
| 	.serr_irq = PCI_PIN_UNUSED,
 | |
| 	.idsel_lo = 30, /* J15 2-3 */
 | |
| 	.idsel_hi = 30,
 | |
| 	.req_gnt = {
 | |
| 		[0] = PCI_PIN_DEFAULT,
 | |
| 		[1] = PCI_PIN_UNUSED,
 | |
| 		[2] = PCI_PIN_UNUSED,
 | |
| 		[3] = PCI_PIN_UNUSED
 | |
| 	},
 | |
| 	.pci_clk = 33333333,
 | |
| 	/* Well, this board doesn't really provide any
 | |
| 	 * means of resetting the PCI devices... */
 | |
| 	.pci_reset_gpio = -EINVAL,
 | |
| };
 | |
| 
 | |
| int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
 | |
| {
 | |
|        /* We can use the standard function on this board */
 | |
|        return stx5206_pcibios_map_platform_irq(&mb796_pci_config, pin);
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_SH_ST_MB705
 | |
| void __init mbxxx_configure_nand_flash(struct stm_nand_config *config)
 | |
| {
 | |
| 	stx5206_configure_nand(config);
 | |
| }
 | |
| 
 | |
| static struct stm_plat_spifsm_data spifsm_serial_flash;
 | |
| void __init mbxxx_configure_serial_flash(struct spi_board_info *serial_flash)
 | |
| {
 | |
| 	struct flash_platform_data *data =
 | |
| 		(struct flash_platform_data *)serial_flash->platform_data;
 | |
| 
 | |
| 	spifsm_serial_flash.name = data->name;
 | |
| 	spifsm_serial_flash.nr_parts = data->nr_parts;
 | |
| 	spifsm_serial_flash.parts = data->parts;
 | |
| 
 | |
| 	stx5206_configure_spifsm(&spifsm_serial_flash);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static int __init mb796_devices_init(void)
 | |
| {
 | |
| 	gpio_request(MB796_NOTPIORESETMII, "notPioResetMii");
 | |
| 	gpio_direction_output(MB796_NOTPIORESETMII, 1);
 | |
| 
 | |
| 	/* Internal I2C link */
 | |
| 	stx5206_configure_ssc_i2c(0);
 | |
| 	/* LNB (IC20) & CN21 - J34-A & J34-B fitted  */
 | |
| 	stx5206_configure_ssc_i2c(1);
 | |
| 	/* NIM, CN4, CN5 & CN7 - J26-E & J26-F fitted, J21-B 2-3, J19-A 2-3 */
 | |
| 	stx5206_configure_ssc_i2c(2);
 | |
| 	/* HDMI chip (IC34) & CN31 - J26-G & J26-H fitted, J19-B 2-3, J25 2-3 */
 | |
| 	stx5206_configure_ssc_i2c(3);
 | |
| 
 | |
| 	stx5206_configure_pci(&mb796_pci_config);
 | |
| 
 | |
| 	stx5206_configure_usb();
 | |
| 
 | |
| 	/* RMII mode jumper settings:
 | |
| 	 * - J38: 2-3
 | |
| 	 * - J39-A: open
 | |
| 	 * - J39-B: 2-3
 | |
| 	 * - SW4: 1-3=OFF, 4=ON
 | |
| 	 * - SW5: 1-2=ON, 3-4=OFF
 | |
| 	 * Required hardware rework:
 | |
| 	 * - R191-2 and R191-4 need to be pulled down with 1k resistor */
 | |
| 	stx5206_configure_ethernet(&(struct stx5206_ethernet_config) {
 | |
| 			.mode = stx5206_ethernet_mode_rmii,
 | |
| 			.ext_clk = 0,
 | |
| 			.phy_bus = 0,
 | |
| 			.phy_addr = -1,
 | |
| 			.mdio_bus_data = &stmmac_mdio_bus,
 | |
| 		});
 | |
| 
 | |
| 	stx5206_configure_lirc(&(struct stx5206_lirc_config) {
 | |
| 			.rx_mode = stx5206_lirc_rx_mode_ir, });
 | |
| 
 | |
| 	return platform_add_devices(mb796_devices, ARRAY_SIZE(mb796_devices));
 | |
| }
 | |
| arch_initcall(mb796_devices_init);
 | |
| 
 | |
| 
 | |
| 
 | |
| static void __iomem *mb796_ioport_map(unsigned long port, unsigned int size)
 | |
| {
 | |
| 	/* However picking somewhere safe isn't as easy as you might
 | |
| 	 * think.  I used to use external ROM, but that can cause
 | |
| 	 * problems if you are in the middle of updating Flash. So I'm
 | |
| 	 * now using the processor core version register, which is
 | |
| 	 * guaranteed to be available, and non-writable. */
 | |
| 	return (void __iomem *)CCN_PVR;
 | |
| }
 | |
| 
 | |
| struct sh_machine_vector mv_mb796 __initmv = {
 | |
| 	.mv_name		= "mb796",
 | |
| 	.mv_setup		= mb796_setup,
 | |
| 	.mv_nr_irqs		= NR_IRQS,
 | |
| 	.mv_ioport_map		= mb796_ioport_map,
 | |
| 	STM_PCI_IO_MACHINE_VEC
 | |
| };
 |