/* * (c) 2010 STMicroelectronics Limited * * Author: Pawel Moll * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include #include #include #include #include #include #include #include /* Ethernet MAC resources ------------------------------------------------- */ static struct stm_pad_config fli7510_ethernet_pad_configs[] = { [fli7510_ethernet_mode_mii] = { .gpios_num = 19, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(18, 0, 1), /* MDC */ STM_PAD_PIO_IN(18, 1, -1), /* COL */ STM_PAD_PIO_IN(18, 2, -1), /* CRS */ STM_PAD_PIO_IN(18, 3, -1), /* MDINT */ STM_PAD_PIO_BIDIR(18, 4, 1), /* MDIO */ STM_PAD_PIO_OUT_NAMED(18, 5, 1, "PHYCLK"), STM_PAD_PIO_OUT(20, 0, 1), /* TXD[0] */ STM_PAD_PIO_OUT(20, 1, 1), /* TXD[1] */ STM_PAD_PIO_OUT(20, 2, 1), /* TXD[2] */ STM_PAD_PIO_OUT(20, 3, 1), /* TXD[3] */ STM_PAD_PIO_OUT(20, 4, 1), /* TXEN */ STM_PAD_PIO_IN_NAMED(20, -1, -1, "TXCLK"), STM_PAD_PIO_IN(21, 0, -1), /* RXD[0] */ STM_PAD_PIO_IN(21, 1, -1), /* RXD[1] */ STM_PAD_PIO_IN(21, 2, -1), /* RXD[2] */ STM_PAD_PIO_IN(21, 3, -1), /* RXD[3] */ STM_PAD_PIO_IN(21, 4, -1), /* RXDV */ STM_PAD_PIO_IN(21, 5, -1), /* RX_ER */ STM_PAD_PIO_IN(21, 6, -1), /* RXCLK */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* gmac_mii_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 8, 8, 1), /* gmac_phy_clock_sel * value set in fli7510_configure_ethernet() */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 9, 9, -1), /* gmac_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 24, 24, 1), /* phy_intf_sel */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 26, 28, 0), }, }, [fli7510_ethernet_mode_gmii] = { /* Not supported by 7510! */ .gpios_num = 27, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(18, 0, 1), /* MDC */ STM_PAD_PIO_IN(18, 1, -1), /* COL */ STM_PAD_PIO_IN(18, 2, -1), /* CRS */ STM_PAD_PIO_IN(18, 3, -1), /* MDINT */ STM_PAD_PIO_BIDIR(18, 4, 1), /* MDIO */ STM_PAD_PIO_OUT(18, 5, 1), /* PHYCLK */ STM_PAD_PIO_OUT(20, 0, 1), /* TXD[0] */ STM_PAD_PIO_OUT(20, 1, 1), /* TXD[1] */ STM_PAD_PIO_OUT(20, 2, 1), /* TXD[2] */ STM_PAD_PIO_OUT(20, 3, 1), /* TXD[3] */ STM_PAD_PIO_OUT(20, 4, 1), /* TXEN */ STM_PAD_PIO_IN(20, 5, -1), /* TXCLK */ STM_PAD_PIO_IN(21, 0, -1), /* RXD[0] */ STM_PAD_PIO_IN(21, 1, -1), /* RXD[1] */ STM_PAD_PIO_IN(21, 2, -1), /* RXD[2] */ STM_PAD_PIO_IN(21, 3, -1), /* RXD[3] */ STM_PAD_PIO_IN(21, 4, -1), /* RXDV */ STM_PAD_PIO_IN(21, 5, -1), /* RX_ER */ STM_PAD_PIO_IN(21, 6, -1), /* RXCLK */ STM_PAD_PIO_IN(24, 0, -1), /* RXD[4] */ STM_PAD_PIO_IN(24, 1, -1), /* RXD[5] */ STM_PAD_PIO_IN(24, 2, -1), /* RXD[6] */ STM_PAD_PIO_IN(24, 3, -1), /* RXD[7] */ STM_PAD_PIO_OUT(24, 4, 1), /* TXD[4] */ STM_PAD_PIO_OUT(24, 5, 1), /* TXD[5] */ STM_PAD_PIO_OUT(24, 6, 1), /* TXD[6] */ STM_PAD_PIO_OUT(24, 7, 1), /* TXD[7] */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* gmac_mii_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 8, 8, 1), /* gmac_phy_clock_sel */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 9, 9, 1), /* gmac_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 24, 24, 1), /* phy_intf_sel */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 26, 28, 0), }, }, [fli7510_ethernet_mode_rmii] = { .gpios_num = 11, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(18, 0, 1), /* MDC */ STM_PAD_PIO_IN(18, 3, -1), /* MDINT */ STM_PAD_PIO_BIDIR(18, 4, 1), /* MDIO */ STM_PAD_PIO_STUB_NAMED(18, 5, "PHYCLK"), STM_PAD_PIO_OUT(20, 0, 1), /* TXD[0] */ STM_PAD_PIO_OUT(20, 1, 1), /* TXD[1] */ STM_PAD_PIO_OUT(20, 4, 1), /* TXEN */ STM_PAD_PIO_IN(21, 0, -1), /* RXD[0] */ STM_PAD_PIO_IN(21, 1, -1), /* RXD[1] */ STM_PAD_PIO_IN(21, 4, -1), /* RXDV */ STM_PAD_PIO_IN(21, 5, -1), /* RX_ER */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* gmac_mii_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 8, 8, 1), /* gmac_phy_clock_sel * value set in fli7510_configure_ethernet() */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 9, 9, -1), /* gmac_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 24, 24, 1), /* phy_intf_sel */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 26, 28, 4), }, }, [fli7510_ethernet_mode_reverse_mii] = { .gpios_num = 19, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(18, 0, 1), /* MDC */ STM_PAD_PIO_IN(18, 1, -1), /* COL */ STM_PAD_PIO_OUT(18, 2, 1), /* CRS */ STM_PAD_PIO_OUT(18, 3, 1), /* MDINT */ STM_PAD_PIO_BIDIR(18, 4, 1), /* MDIO */ STM_PAD_PIO_OUT_NAMED(18, 5, 1, "PHYCLK"), STM_PAD_PIO_OUT(20, 0, 1), /* TXD[0] */ STM_PAD_PIO_OUT(20, 1, 1), /* TXD[1] */ STM_PAD_PIO_OUT(20, 2, 1), /* TXD[2] */ STM_PAD_PIO_OUT(20, 3, 1), /* TXD[3] */ STM_PAD_PIO_OUT(20, 4, 1), /* TXEN */ STM_PAD_PIO_IN_NAMED(20, -1, -1, "TXCLK"), STM_PAD_PIO_IN(21, 0, -1), /* RXD[0] */ STM_PAD_PIO_IN(21, 1, -1), /* RXD[1] */ STM_PAD_PIO_IN(21, 2, -1), /* RXD[2] */ STM_PAD_PIO_IN(21, 3, -1), /* RXD[3] */ STM_PAD_PIO_IN(21, 4, -1), /* RXDV */ STM_PAD_PIO_IN(21, 5, -1), /* RX_ER */ STM_PAD_PIO_IN(21, 6, -1), /* RXCLK */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* gmac_mii_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 8, 8, 0), /* gmac_phy_clock_sel * value set in fli7510_configure_ethernet() */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 9, 9, -1), /* gmac_enable */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 24, 24, 1), /* phy_intf_sel */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_2, 26, 28, 0), }, }, }; static void fli7510_ethernet_fix_mac_speed(void *bsp_priv, unsigned int speed) { struct sysconf_field *mac_speed_sel = bsp_priv; sysconf_write(mac_speed_sel, (speed == SPEED_100) ? 1 : 0); } static struct plat_stmmacenet_data fli7510_ethernet_platform_data = { .pbl = 32, .has_gmac = 1, .enh_desc = 1, .tx_coe = 1, .bugged_jumbo =1, .fix_mac_speed = fli7510_ethernet_fix_mac_speed, .init = &stmmac_claim_resource, }; static struct platform_device fli7510_ethernet_device = { .name = "stmmaceth", .id = -1, .num_resources = 2, .resource = (struct resource[]) { STM_PLAT_RESOURCE_MEM(0xfd920000, 0x08000), STM_PLAT_RESOURCE_IRQ_NAMED("macirq", ILC_IRQ(40), -1), }, .dev.platform_data = &fli7510_ethernet_platform_data, }; void __init fli7510_configure_ethernet(struct fli7510_ethernet_config *config) { static int configured; struct fli7510_ethernet_config default_config; struct stm_pad_config *pad_config; const int interfaces[] = { [fli7510_ethernet_mode_mii] = PHY_INTERFACE_MODE_MII, [fli7510_ethernet_mode_gmii] = PHY_INTERFACE_MODE_GMII, [fli7510_ethernet_mode_rmii] = PHY_INTERFACE_MODE_RMII, [fli7510_ethernet_mode_reverse_mii] = PHY_INTERFACE_MODE_MII, }; BUG_ON(configured); configured = 1; if (!config) config = &default_config; pad_config = &fli7510_ethernet_pad_configs[config->mode]; fli7510_ethernet_platform_data.custom_cfg = (void *) pad_config; fli7510_ethernet_platform_data.interface = interfaces[config->mode]; fli7510_ethernet_platform_data.bus_id = config->phy_bus; fli7510_ethernet_platform_data.phy_addr = config->phy_addr; fli7510_ethernet_platform_data.mdio_bus_data = config->mdio_bus_data; switch (config->mode) { case fli7510_ethernet_mode_mii: case fli7510_ethernet_mode_reverse_mii: if (config->ext_clk) { stm_pad_set_pio_ignored(pad_config, "PHYCLK"); pad_config->sysconfs[1].value = 1; } else { pad_config->sysconfs[1].value = 0; } stm_pad_set_pio(pad_config, "TXCLK", 20, cpu_data->type == CPU_FLI7510 ? 6 : 5); break; case fli7510_ethernet_mode_gmii: if (cpu_data->type == CPU_FLI7510) { BUG(); /* Not supported */ return; } break; case fli7510_ethernet_mode_rmii: if (config->ext_clk) { stm_pad_set_pio_in(pad_config, "PHYCLK", -1); pad_config->sysconfs[1].value = 1; } else { stm_pad_set_pio_out(pad_config, "PHYCLK", 1); pad_config->sysconfs[1].value = 0; } break; default: BUG(); break; } fli7510_ethernet_platform_data.bsp_priv = sysconf_claim(CFG_COMMS_CONFIG_2, 25, 25, "gmac_mac_speed"); platform_device_register(&fli7510_ethernet_device); } /* USB resources ---------------------------------------------------------- */ static u64 fli7510_usb_dma_mask = DMA_BIT_MASK(32); static int fli7510_usb_xtal_initialized; static struct sysconf_field *fli7510_usb_xtal_sc; static int fli7510_usb_xtal_claim(struct stm_pad_state *state, void *priv) { if (!fli7510_usb_xtal_initialized++) { fli7510_usb_xtal_sc = sysconf_claim(CFG_SPARE_1, 1, 1, "USB_xtal_valid"); BUG_ON(!fli7510_usb_xtal_sc); sysconf_write(fli7510_usb_xtal_sc, 1); } return 0; } static void fli7510_usb_xtal_release(struct stm_pad_state *state, void *priv) { if (!--fli7510_usb_xtal_initialized) sysconf_release(fli7510_usb_xtal_sc); } static struct stm_pad_config fli7510_usb_pad_configs[] = { [fli7510_usb_ovrcur_disabled] = { .gpios_num = 1, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(27, 2, 1), /* USB_A_PWREN */ }, .sysconfs_num = 2, .sysconfs = (struct stm_pad_sysconf []) { /* usba_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 1), /* usba_ovrcur */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 13, 13, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_high] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(27, 1, -1), /* USB_A_OVRCUR */ STM_PAD_PIO_OUT(27, 2, 1), /* USB_A_PWREN */ }, .sysconfs_num = 2, .sysconfs = (struct stm_pad_sysconf []) { /* usba_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 0), /* usba_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 11, 11, 0), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_low] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(27, 1, -1), /* USB_A_OVRCUR */ STM_PAD_PIO_OUT(27, 2, 1), /* USB_A_PWREN */ }, .sysconfs_num = 2, .sysconfs = (struct stm_pad_sysconf []) { /* usba_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 0), /* usba_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 11, 11, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, } }; static struct stm_plat_usb_data fli7510_usb_platform_data = { .flags = STM_PLAT_USB_FLAGS_STRAP_16BIT | STM_PLAT_USB_FLAGS_STRAP_PLL | STM_PLAT_USB_FLAGS_STBUS_CONFIG_THRESHOLD256, .device_config = &(struct stm_device_config){ /* .pad_config set in fli7510_configure_usb() */ }, }; static struct platform_device fli7510_usb_device = { .name = "stm-usb", .id = -1, .dev = { .dma_mask = &fli7510_usb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), .platform_data = &fli7510_usb_platform_data, }, .num_resources = 6, .resource = (struct resource[]) { STM_PLAT_RESOURCE_MEM_NAMED("ehci", 0xfdaffe00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ehci", ILC_IRQ(54), -1), STM_PLAT_RESOURCE_MEM_NAMED("ohci", 0xfdaffc00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ohci", ILC_IRQ(55), -1), STM_PLAT_RESOURCE_MEM_NAMED("wrapper", 0xfda00000, 0x100), STM_PLAT_RESOURCE_MEM_NAMED("protocol", 0xfdafff00, 0x100), }, }; static struct stm_pad_config *fli7520_usb_pad_configs[] = { [0] = (struct stm_pad_config []) { [fli7510_usb_ovrcur_disabled] = { .gpios_num = 1, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(26, 4, 1), /* USB_A_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb1_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 1), /* usb1_ovrcur */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 13, 13, 1), /* conf_usb1_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 21, 21, 1), /* conf_usb1_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 23, 23, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_high] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(26, 3, -1), /* USB_A_OVRCUR */ STM_PAD_PIO_OUT(26, 4, 1), /* USB_A_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb1_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 11, 11, 0), /* usb1_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 0), /* conf_usb1_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 21, 21, 1), /* conf_usb1_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 23, 23, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_low] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(26, 3, -1), /* USB_A_OVRCUR */ STM_PAD_PIO_OUT(26, 4, 1), /* USB_A_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb1_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 11, 11, 1), /* usb1_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 12, 12, 0), /* conf_usb1_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 21, 21, 1), /* conf_usb1_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 23, 23, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, } }, [1] = (struct stm_pad_config []) { [fli7510_usb_ovrcur_disabled] = { .gpios_num = 1, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_OUT(26, 6, 1), /* USB_C_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb2_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 15, 15, 1), /* usb2_ovrcur */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 16, 16, 1), /* conf_usb2_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 22, 22, 1), /* conf_usb2_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 24, 24, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_high] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(26, 5, -1), /* USB_C_OVRCUR */ STM_PAD_PIO_OUT(26, 6, 1), /* USB_C_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb2_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 14, 14, 0), /* usb2_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 15, 15, 0), /* conf_usb2_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 22, 22, 1), /* conf_usb2_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 24, 24, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, }, [fli7510_usb_ovrcur_active_low] = { .gpios_num = 2, .gpios = (struct stm_pad_gpio []) { STM_PAD_PIO_IN(26, 5, -1), /* USB_C_OVRCUR */ STM_PAD_PIO_OUT(26, 6, 1), /* USB_C_PWREN */ }, .sysconfs_num = 4, .sysconfs = (struct stm_pad_sysconf []) { /* usb2_ovrcur_polarity */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 14, 14, 1), /* usb2_enable_pad_override */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 15, 15, 0), /* conf_usb2_clk_en */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 22, 22, 1), /* conf_usb2_rst_n */ STM_PAD_SYSCONF(CFG_COMMS_CONFIG_1, 24, 24, 1), }, .custom_claim = fli7510_usb_xtal_claim, .custom_release = fli7510_usb_xtal_release, } }, }; static struct stm_plat_usb_data fli7520_usb_platform_data[] = { [0] = { .flags = STM_PLAT_USB_FLAGS_STRAP_8BIT | STM_PLAT_USB_FLAGS_STRAP_PLL | STM_PLAT_USB_FLAGS_STBUS_CONFIG_THRESHOLD128, .device_config = &(struct stm_device_config){ /* .pad_config set in fli7510_configure_usb() */ }, }, [1] = { .flags = STM_PLAT_USB_FLAGS_STRAP_8BIT | STM_PLAT_USB_FLAGS_STRAP_PLL | STM_PLAT_USB_FLAGS_STBUS_CONFIG_THRESHOLD128, .device_config = &(struct stm_device_config){ /* .pad_config set in fli7510_configure_usb() */ }, }, }; static struct platform_device fli7520_usb_devices[] = { [0] = { .name = "stm-usb", .id = 0, .dev = { .dma_mask = &fli7510_usb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), .platform_data = &fli7520_usb_platform_data[0], }, .num_resources = 6, .resource = (struct resource[]) { STM_PLAT_RESOURCE_MEM_NAMED("ehci", 0xfdaffe00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ehci", ILC_IRQ(54), -1), STM_PLAT_RESOURCE_MEM_NAMED("ohci", 0xfdaffc00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ohci", ILC_IRQ(55), -1), STM_PLAT_RESOURCE_MEM_NAMED("wrapper", 0xfda00000, 0x100), STM_PLAT_RESOURCE_MEM_NAMED("protocol", 0xfdafff00, 0x100), }, }, [1] = { .name = "stm-usb", .id = 1, .dev = { .dma_mask = &fli7510_usb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), .platform_data = &fli7520_usb_platform_data[1], }, .num_resources = 6, .resource = (struct resource[]) { STM_PLAT_RESOURCE_MEM_NAMED("ehci", 0xfdcffe00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ehci", ILC_IRQ(56), -1), STM_PLAT_RESOURCE_MEM_NAMED("ohci", 0xfdcffc00, 0x100), STM_PLAT_RESOURCE_IRQ_NAMED("ohci", ILC_IRQ(57), -1), STM_PLAT_RESOURCE_MEM_NAMED("wrapper", 0xfdc00000, 0x100), STM_PLAT_RESOURCE_MEM_NAMED("protocol", 0xfdcfff00, 0x100), }, } }; void __init fli7510_configure_usb(int port, struct fli7510_usb_config *config) { static int configured[ARRAY_SIZE(fli7520_usb_devices)]; struct fli7510_usb_config default_config; BUG_ON(port < 0 || port > ARRAY_SIZE(fli7520_usb_devices)); if (port != 0 && cpu_data->type == CPU_FLI7510) { BUG(); return; } BUG_ON(configured[port]++); if (!config) config = &default_config; if (cpu_data->type == CPU_FLI7510) { fli7510_usb_platform_data.device_config->pad_config = &fli7510_usb_pad_configs[config->ovrcur_mode]; platform_device_register(&fli7510_usb_device); } else { fli7520_usb_platform_data[port].device_config->pad_config = &fli7520_usb_pad_configs[port] [config->ovrcur_mode]; platform_device_register(&fli7520_usb_devices[port]); } } /* Cut 0 has a problem with accessing the MiPhy, so we have to use the dummy * driver as the PCIe driver expects a phy */ static struct stm_plat_miphy_dummy_data fli7540_miphy_dummy_platform_data = { .miphy_first = 0, .miphy_count = 1, .miphy_modes = (enum miphy_mode[1]) {PCIE_MODE}, }; static struct platform_device fli7540_miphy_dummy_device = { .name = "stm-miphy-dummy", .id = -1, .num_resources = 0, .dev = { .platform_data = &fli7540_miphy_dummy_platform_data, } }; static void fli7540_pcie_mp_select(int port) { /* Freeman only has one port */ } struct stm_plat_pcie_mp_data fli7540_pcie_mp_platform_data = { .miphy_first = 0, .miphy_count = 1, .miphy_modes = (enum miphy_mode[1]) {PCIE_MODE}, .mp_select = fli7540_pcie_mp_select, }; static struct platform_device fli7540_pcie_mp_device = { .name = "pcie-mp", .id = -1, .num_resources = 1, .resource = (struct resource[]) { STM_PLAT_RESOURCE_MEM(0xfe104000, 0xff) }, .dev = { .platform_data = &fli7540_pcie_mp_platform_data, } }; static int __init fli7540_miphy_postcore_setup(void) { if (cpu_data->cut_major >= 1) return platform_device_register(&fli7540_pcie_mp_device); return platform_device_register(&fli7540_miphy_dummy_device); } postcore_initcall(fli7540_miphy_postcore_setup);