351 lines
8.8 KiB
C
351 lines
8.8 KiB
C
/*
|
|
* arch/sh/boards/mach-mb837/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 STi7108 processor board support.
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/i2c/pcf857x.h>
|
|
#include <linux/leds.h>
|
|
#include <linux/phy.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/spi/spi_gpio.h>
|
|
#include <linux/stm/pci-glue.h>
|
|
#include <linux/stm/platform.h>
|
|
#include <linux/stm/stx7108.h>
|
|
#include <linux/stm/sysconf.h>
|
|
#include <asm/irq.h>
|
|
#include <mach/common.h>
|
|
#include "../mach-st/mb705-epld.h"
|
|
|
|
/* PCF8575 I2C PIO Extender (IC12) */
|
|
#define PIO_EXTENDER_BASE 220
|
|
#define PIO_EXTENDER_GPIO(port, pin) (PIO_EXTENDER_BASE + (port * 8) + (pin))
|
|
|
|
|
|
|
|
#define MB837_NOTPIORESETMII0 PIO_EXTENDER_GPIO(1, 1)
|
|
#define MB837_NOTPIORESETMII1 PIO_EXTENDER_GPIO(1, 2)
|
|
|
|
|
|
|
|
static void __init mb837_setup(char **cmdline_p)
|
|
{
|
|
printk(KERN_INFO "STMicroelectronics STi7108-MBOARD (mb837) "
|
|
"initialisation\n");
|
|
|
|
stx7108_early_device_init();
|
|
|
|
stx7108_configure_asc(2, &(struct stx7108_asc_config) {
|
|
.hw_flow_control = 1,
|
|
.is_console = 1, });
|
|
stx7108_configure_asc(3, &(struct stx7108_asc_config) {
|
|
.routing.asc3.txd = stx7108_asc3_txd_pio21_0,
|
|
.routing.asc3.rxd = stx7108_asc3_rxd_pio21_1,
|
|
.routing.asc3.cts = stx7108_asc3_cts_pio21_4,
|
|
.routing.asc3.rts = stx7108_asc3_rts_pio21_3,
|
|
.hw_flow_control = 1, });
|
|
}
|
|
|
|
|
|
|
|
static struct platform_device mb837_led = {
|
|
.name = "leds-gpio",
|
|
.id = -1,
|
|
.dev.platform_data = &(struct gpio_led_platform_data) {
|
|
.num_leds = 1,
|
|
.leds = (struct gpio_led[]) {
|
|
{
|
|
.name = "Heartbeat (LD6)", /* J23 1-2 */
|
|
.default_trigger = "heartbeat",
|
|
.gpio = stm_gpio(5, 4),
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
|
|
|
|
#ifdef CONFIG_SH_ST_MB837_STMMAC0
|
|
/* J14-B must be fitted */
|
|
static int mb837_mii0_phy_reset(void *bus)
|
|
{
|
|
static int requested;
|
|
|
|
if (!requested && gpio_request(MB837_NOTPIORESETMII0,
|
|
"notPioResetMii0") == 0) {
|
|
gpio_direction_output(MB837_NOTPIORESETMII0, 1);
|
|
requested = 1;
|
|
} else {
|
|
pr_warning("mb837: Failed to request notPioResetMii0!\n");
|
|
}
|
|
|
|
if (requested) {
|
|
gpio_set_value(MB837_NOTPIORESETMII0, 0);
|
|
udelay(15000);
|
|
gpio_set_value(MB837_NOTPIORESETMII0, 1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct stmmac_mdio_bus_data stmmac0_mdio_bus = {
|
|
.bus_id = 0,
|
|
.phy_reset = mb837_mii0_phy_reset,
|
|
.phy_mask = 0,
|
|
};
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_SH_ST_MB837_STMMAC1
|
|
/* J14-A must be fitted */
|
|
static int mb837_mii1_phy_reset(void *bus)
|
|
{
|
|
static int requested;
|
|
|
|
if (!requested && gpio_request(MB837_NOTPIORESETMII1,
|
|
"notPioResetMii1") == 0) {
|
|
gpio_direction_output(MB837_NOTPIORESETMII1, 1);
|
|
requested = 1;
|
|
} else {
|
|
pr_warning("mb837: Failed to request notPioResetMii1!\n");
|
|
}
|
|
|
|
if (requested) {
|
|
gpio_set_value(MB837_NOTPIORESETMII1, 0);
|
|
udelay(15000);
|
|
gpio_set_value(MB837_NOTPIORESETMII1, 1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct stmmac_mdio_bus_data stmmac1_mdio_bus = {
|
|
.bus_id = 1,
|
|
.phy_reset = mb837_mii1_phy_reset,
|
|
.phy_mask = 0,
|
|
};
|
|
#endif
|
|
|
|
/* PCF8575 I2C PIO Extender (IC12) */
|
|
static struct i2c_board_info mb837_pio_extender = {
|
|
I2C_BOARD_INFO("pcf857x", 0x27),
|
|
.type = "pcf8575",
|
|
.platform_data = &(struct pcf857x_platform_data) {
|
|
.gpio_base = PIO_EXTENDER_BASE,
|
|
},
|
|
};
|
|
|
|
|
|
|
|
static struct platform_device *mb837_devices[] __initdata = {
|
|
&mb837_led,
|
|
};
|
|
|
|
|
|
|
|
static struct stm_plat_pci_config mb837_pci_config = {
|
|
.pci_irq = {
|
|
[0] = PCI_PIN_DEFAULT,
|
|
[1] = PCI_PIN_DEFAULT,
|
|
[2] = PCI_PIN_DEFAULT,
|
|
[3] = PCI_PIN_DEFAULT,
|
|
},
|
|
.serr_irq = PCI_PIN_DEFAULT,
|
|
.idsel_lo = 30,
|
|
.idsel_hi = 30,
|
|
.req_gnt = {
|
|
[0] = PCI_PIN_DEFAULT,
|
|
[1] = PCI_PIN_UNUSED,
|
|
[2] = PCI_PIN_UNUSED,
|
|
[3] = PCI_PIN_UNUSED,
|
|
},
|
|
.pci_clk = 33333333,
|
|
.pci_reset_gpio = -EINVAL,
|
|
};
|
|
|
|
#ifdef CONFIG_SH_ST_MB705
|
|
void __init mbxxx_configure_nand_flash(struct stm_nand_config *config)
|
|
{
|
|
stx7108_configure_nand(config);
|
|
}
|
|
|
|
/* SPI PIO Bus for Serial Flash on mb705 peripheral board:
|
|
* CLK J42-F closed (J42-E open)
|
|
* CSn J42-H closed (J42-G open)
|
|
* DIn J30-A closed
|
|
* DOut J30-B closed
|
|
* Note, leave SSC0 (I2C MII1) unconfigured */
|
|
static struct platform_device mb837_serial_flash_bus = {
|
|
.name = "spi_gpio",
|
|
.id = 8,
|
|
.num_resources = 0,
|
|
.dev.platform_data = &(struct spi_gpio_platform_data) {
|
|
.num_chipselect = 1,
|
|
.sck = stm_gpio(1, 6),
|
|
.mosi = stm_gpio(2, 1),
|
|
.miso = stm_gpio(2, 0),
|
|
}
|
|
};
|
|
|
|
void __init mbxxx_configure_serial_flash(struct spi_board_info *serial_flash)
|
|
{
|
|
/* Specify CSn and SPI bus */
|
|
serial_flash->bus_num = 8;
|
|
serial_flash->controller_data = (void *)stm_gpio(1, 7);
|
|
|
|
/* Register SPI bus and flash devices */
|
|
platform_device_register(&mb837_serial_flash_bus);
|
|
spi_register_board_info(serial_flash, 1);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
|
{
|
|
/* We can use the standard function on this board */
|
|
return stx7108_pcibios_map_platform_irq(&mb837_pci_config, pin);
|
|
}
|
|
|
|
|
|
|
|
void __init mbxxx_configure_audio_pins(int *pcm_reader, int *pcm_player)
|
|
{
|
|
*pcm_reader = -1;
|
|
*pcm_player = 2;
|
|
stx7108_configure_audio(&(struct stx7108_audio_config) {
|
|
.pcm_player_2_output = stx7108_pcm_player_2_output_8_channels,
|
|
.spdif_player_output_enabled = 1,
|
|
.pcm_reader_input_enabled = 1, });
|
|
}
|
|
|
|
|
|
|
|
static int __init mb837_devices_init(void)
|
|
{
|
|
int ssc2_i2c;
|
|
|
|
/* PCI jumper settings:
|
|
* J18 not fitted, J19 2-3, J30-G fitted, J34-B fitted,
|
|
* J35-A fitted, J35-B not fitted, J35-C fitted, J35-D not fitted,
|
|
* J39-E fitted, J39-F not fitted */
|
|
stx7108_configure_pci(&mb837_pci_config);
|
|
|
|
#ifndef CONFIG_SH_ST_MB705
|
|
/* MII1 & TS Connectors (inc. Cable Card one) - J42E & J42G */
|
|
stx7108_configure_ssc_i2c(0, NULL);
|
|
#endif
|
|
|
|
/* STRec to going to MB705 - J41C & J41D */
|
|
stx7108_configure_ssc_i2c(1, NULL);
|
|
/* MII0 & PIO Extender - J42A & J42C */
|
|
ssc2_i2c = stx7108_configure_ssc_i2c(2, &(struct stx7108_ssc_config) {
|
|
.routing.ssc2.sclk = stx7108_ssc2_sclk_pio1_3,
|
|
.routing.ssc2.mtsr = stx7108_ssc2_mtsr_pio1_4, });
|
|
/* NIM AB - J25 1-2 & J27 1-2 */
|
|
stx7108_configure_ssc_i2c(3, NULL);
|
|
/* NIM CDI - J24 1-2 & J26 1-2 */
|
|
stx7108_configure_ssc_i2c(5, NULL);
|
|
/* HDMI - J55C & J55D */
|
|
stx7108_configure_ssc_i2c(6, NULL);
|
|
|
|
/* PIO extender is connected to SSC2 */
|
|
i2c_register_board_info(ssc2_i2c, &mb837_pio_extender, 1);
|
|
|
|
stx7108_configure_lirc(&(struct stx7108_lirc_config) {
|
|
#ifdef CONFIG_LIRC_STM_UHF
|
|
.rx_mode = stx7108_lirc_rx_mode_uhf,
|
|
#else
|
|
.rx_mode = stx7108_lirc_rx_mode_ir,
|
|
#endif
|
|
.tx_enabled = 1,
|
|
.tx_od_enabled = 1, });
|
|
|
|
/* J56A & J56B fitted */
|
|
stx7108_configure_usb(0);
|
|
/* J53A & J53B fitted */
|
|
stx7108_configure_usb(1);
|
|
/* J53C & J53D fitted */
|
|
stx7108_configure_usb(2);
|
|
|
|
if (cpu_data->cut_major >= 2) {
|
|
stx7108_configure_miphy(&(struct stx7108_miphy_config) {
|
|
.force_jtag = 1,
|
|
.modes = (enum miphy_mode[2]) {
|
|
SATA_MODE, UNUSED_MODE },
|
|
});
|
|
stx7108_configure_sata(0, &(struct stx7108_sata_config) { });
|
|
} else {
|
|
stx7108_configure_miphy(&(struct stx7108_miphy_config) {
|
|
.modes = (enum miphy_mode[2]) {
|
|
SATA_MODE, SATA_MODE },
|
|
});
|
|
stx7108_configure_sata(0, &(struct stx7108_sata_config) { });
|
|
stx7108_configure_sata(1, &(struct stx7108_sata_config) { });
|
|
}
|
|
|
|
#ifdef CONFIG_SH_ST_MB837_STMMAC0
|
|
stx7108_configure_ethernet(0, &(struct stx7108_ethernet_config) {
|
|
.mode = stx7108_ethernet_mode_mii,
|
|
.ext_clk = 1,
|
|
.phy_bus = 0,
|
|
.phy_addr = -1,
|
|
.mdio_bus_data = &stmmac0_mdio_bus,
|
|
});
|
|
#endif
|
|
#ifdef CONFIG_SH_ST_MB837_STMMAC1
|
|
stx7108_configure_ethernet(1, &(struct stx7108_ethernet_config) {
|
|
.mode = stx7108_ethernet_mode_mii,
|
|
.ext_clk = 1,
|
|
.phy_bus = 1,
|
|
.phy_addr = -1,
|
|
.mdio_bus_data = &stmmac1_mdio_bus,
|
|
});
|
|
#endif
|
|
|
|
/* MMC Hardware settings:
|
|
* - Jumpers to be set:
|
|
* J52[A..H] , J51[A..C] , J51-D, J42-B and J42-D
|
|
* - Jumpers to be unset: J42-A and J42-C
|
|
* HW workaround on board:
|
|
* MMC lines pull-up resistors
|
|
* In mb837 v1.0 schematic, the following pull-up values are wrong:
|
|
* R(MMC_Cmd) = R258-2 = 61k and R(MMC_Data2) = R261 = 10k.
|
|
* They should be replaced by: R(MMC_Data2) = 61k R(MMC_Cmd) = 10k.
|
|
*/
|
|
stx7108_configure_mmc(0);
|
|
|
|
return platform_add_devices(mb837_devices, ARRAY_SIZE(mb837_devices));
|
|
}
|
|
arch_initcall(mb837_devices_init);
|
|
|
|
|
|
|
|
static void __iomem *mb837_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_mb837 __initmv = {
|
|
.mv_name = "mb837",
|
|
.mv_setup = mb837_setup,
|
|
.mv_nr_irqs = NR_IRQS,
|
|
.mv_ioport_map = mb837_ioport_map,
|
|
STM_PCI_IO_MACHINE_VEC
|
|
};
|