mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
Merge git://git.denx.de/u-boot-usb
- DM support for OMAP - DWC3 fix - Typo fix in eth/r8152
This commit is contained in:
@@ -123,6 +123,7 @@ struct omap_ehci {
|
|||||||
u32 insreg08; /* 0xb0 */
|
u32 insreg08; /* 0xb0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if !CONFIG_IS_ENABLED(DM_USB) || !CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
/*
|
/*
|
||||||
* FIXME: forward declaration of this structs needed because omap got the
|
* FIXME: forward declaration of this structs needed because omap got the
|
||||||
* ehci implementation backwards. move out ehci_hcd_x from board files
|
* ehci implementation backwards. move out ehci_hcd_x from board files
|
||||||
@@ -133,5 +134,6 @@ struct ehci_hcor;
|
|||||||
int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
|
int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
|
||||||
struct ehci_hccr **hccr, struct ehci_hcor **hcor);
|
struct ehci_hccr **hccr, struct ehci_hcor **hcor);
|
||||||
int omap_ehci_hcd_stop(void);
|
int omap_ehci_hcd_stop(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _OMAP_COMMON_EHCI_H_ */
|
#endif /* _OMAP_COMMON_EHCI_H_ */
|
||||||
|
@@ -711,9 +711,9 @@ static void r8152b_enter_oob(struct r8152 *tp)
|
|||||||
|
|
||||||
rtl_rx_vlan_en(tp, false);
|
rtl_rx_vlan_en(tp, false);
|
||||||
|
|
||||||
ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
|
ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_BDC_CR);
|
||||||
ocp_data |= ALDPS_PROXY_MODE;
|
ocp_data |= ALDPS_PROXY_MODE;
|
||||||
ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
|
ocp_write_word(tp, MCU_TYPE_PLA, PLA_BDC_CR, ocp_data);
|
||||||
|
|
||||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
|
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
|
||||||
ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
|
ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
|
||||||
@@ -844,9 +844,9 @@ static void r8153_enter_oob(struct r8152 *tp)
|
|||||||
|
|
||||||
rtl_rx_vlan_en(tp, false);
|
rtl_rx_vlan_en(tp, false);
|
||||||
|
|
||||||
ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
|
ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_BDC_CR);
|
||||||
ocp_data |= ALDPS_PROXY_MODE;
|
ocp_data |= ALDPS_PROXY_MODE;
|
||||||
ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
|
ocp_write_word(tp, MCU_TYPE_PLA, PLA_BDC_CR, ocp_data);
|
||||||
|
|
||||||
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
|
ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
|
||||||
ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
|
ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
#define PLA_TEREDO_CFG 0xc0bc
|
#define PLA_TEREDO_CFG 0xc0bc
|
||||||
#define PLA_MAR 0xcd00
|
#define PLA_MAR 0xcd00
|
||||||
#define PLA_BACKUP 0xd000
|
#define PLA_BACKUP 0xd000
|
||||||
#define PAL_BDC_CR 0xd1a0
|
#define PLA_BDC_CR 0xd1a0
|
||||||
#define PLA_TEREDO_TIMER 0xd2cc
|
#define PLA_TEREDO_TIMER 0xd2cc
|
||||||
#define PLA_REALWOW_TIMER 0xd2e8
|
#define PLA_REALWOW_TIMER 0xd2e8
|
||||||
#define PLA_LEDSEL 0xdd90
|
#define PLA_LEDSEL 0xdd90
|
||||||
@@ -225,7 +225,7 @@
|
|||||||
#define TEREDO_RS_EVENT_MASK 0x00fe
|
#define TEREDO_RS_EVENT_MASK 0x00fe
|
||||||
#define OOB_TEREDO_EN 0x0001
|
#define OOB_TEREDO_EN 0x0001
|
||||||
|
|
||||||
/* PAL_BDC_CR */
|
/* PLA_BDC_CR */
|
||||||
#define ALDPS_PROXY_MODE 0x0001
|
#define ALDPS_PROXY_MODE 0x0001
|
||||||
|
|
||||||
/* PLA_CONFIG34 */
|
/* PLA_CONFIG34 */
|
||||||
|
@@ -20,6 +20,10 @@
|
|||||||
#include <asm/gpio.h>
|
#include <asm/gpio.h>
|
||||||
#include <asm/arch/ehci.h>
|
#include <asm/arch/ehci.h>
|
||||||
#include <asm/ehci-omap.h>
|
#include <asm/ehci-omap.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
|
#include <dm/lists.h>
|
||||||
|
#include <power/regulator.h>
|
||||||
|
|
||||||
#include "ehci.h"
|
#include "ehci.h"
|
||||||
|
|
||||||
@@ -179,9 +183,17 @@ int omap_ehci_hcd_stop(void)
|
|||||||
* Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
|
* Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
|
||||||
* See there for additional Copyrights.
|
* See there for additional Copyrights.
|
||||||
*/
|
*/
|
||||||
|
#if !CONFIG_IS_ENABLED(DM_USB) || !CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
|
|
||||||
int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
|
int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
|
||||||
struct ehci_hccr **hccr, struct ehci_hcor **hcor)
|
struct ehci_hccr **hccr, struct ehci_hcor **hcor)
|
||||||
{
|
{
|
||||||
|
*hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);
|
||||||
|
*hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10);
|
||||||
|
#else
|
||||||
|
int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int i, reg = 0, rev = 0;
|
unsigned int i, reg = 0, rev = 0;
|
||||||
|
|
||||||
@@ -288,9 +300,114 @@ int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
|
|||||||
if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))
|
if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))
|
||||||
omap_ehci_soft_phy_reset(i);
|
omap_ehci_soft_phy_reset(i);
|
||||||
|
|
||||||
*hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);
|
|
||||||
*hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10);
|
|
||||||
|
|
||||||
debug("OMAP EHCI init done\n");
|
debug("OMAP EHCI init done\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(DM_USB)
|
||||||
|
|
||||||
|
static struct omap_usbhs_board_data usbhs_bdata = {
|
||||||
|
.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
|
||||||
|
.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
|
||||||
|
.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_usbhs_set_mode(u8 index, const char *mode)
|
||||||
|
{
|
||||||
|
if (!strcmp(mode, "ehci-phy"))
|
||||||
|
usbhs_bdata.port_mode[index] = OMAP_EHCI_PORT_MODE_PHY;
|
||||||
|
else if (!strcmp(mode, "ehci-tll"))
|
||||||
|
usbhs_bdata.port_mode[index] = OMAP_EHCI_PORT_MODE_TLL;
|
||||||
|
else if (!strcmp(mode, "ehci-hsic"))
|
||||||
|
usbhs_bdata.port_mode[index] = OMAP_EHCI_PORT_MODE_HSIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_usbhs_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
const char *mode;
|
||||||
|
char prop[11];
|
||||||
|
|
||||||
|
/* Go through each port portX-mode to determing phy mode */
|
||||||
|
for (i = 0; i < OMAP_HS_USB_PORTS; i++) {
|
||||||
|
snprintf(prop, sizeof(prop), "port%d-mode", i + 1);
|
||||||
|
mode = dev_read_string(dev, prop);
|
||||||
|
|
||||||
|
/* If the portX-mode exists, set the mode */
|
||||||
|
if (mode)
|
||||||
|
omap_usbhs_set_mode(i, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return omap_ehci_hcd_init(0, &usbhs_bdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct udevice_id omap_usbhs_dt_ids[] = {
|
||||||
|
{ .compatible = "ti,usbhs-host" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(usb_omaphs_host) = {
|
||||||
|
.name = "usbhs-host",
|
||||||
|
.id = UCLASS_SIMPLE_BUS,
|
||||||
|
.of_match = omap_usbhs_dt_ids,
|
||||||
|
.probe = omap_usbhs_probe,
|
||||||
|
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ehci_omap_priv_data {
|
||||||
|
struct ehci_ctrl ctrl;
|
||||||
|
struct omap_ehci *ehci;
|
||||||
|
#ifdef CONFIG_DM_REGULATOR
|
||||||
|
struct udevice *vbus_supply;
|
||||||
|
#endif
|
||||||
|
enum usb_init_type init_type;
|
||||||
|
int portnr;
|
||||||
|
struct phy phy[OMAP_HS_USB_PORTS];
|
||||||
|
int nports;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ehci_usb_ofdata_to_platdata(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct usb_platdata *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
|
plat->init_type = USB_INIT_HOST;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_ehci_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct usb_platdata *plat = dev_get_platdata(dev);
|
||||||
|
struct ehci_omap_priv_data *priv = dev_get_priv(dev);
|
||||||
|
struct ehci_hccr *hccr;
|
||||||
|
struct ehci_hcor *hcor;
|
||||||
|
|
||||||
|
priv->ehci = (struct omap_ehci *)devfdt_get_addr(dev);
|
||||||
|
priv->portnr = dev->seq;
|
||||||
|
priv->init_type = plat->init_type;
|
||||||
|
|
||||||
|
hccr = (struct ehci_hccr *)&priv->ehci->hccapbase;
|
||||||
|
hcor = (struct ehci_hcor *)&priv->ehci->usbcmd;
|
||||||
|
|
||||||
|
return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct udevice_id omap_ehci_dt_ids[] = {
|
||||||
|
{ .compatible = "ti,ehci-omap" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(usb_omap_ehci) = {
|
||||||
|
.name = "omap-ehci",
|
||||||
|
.id = UCLASS_USB,
|
||||||
|
.of_match = omap_ehci_dt_ids,
|
||||||
|
.probe = omap_ehci_probe,
|
||||||
|
.ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
|
||||||
|
.platdata_auto_alloc_size = sizeof(struct usb_platdata),
|
||||||
|
.priv_auto_alloc_size = sizeof(struct ehci_omap_priv_data),
|
||||||
|
.remove = ehci_deregister,
|
||||||
|
.ops = &ehci_usb_ops,
|
||||||
|
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
#include <linux/usb/otg.h>
|
#include <linux/usb/otg.h>
|
||||||
|
|
||||||
struct xhci_dwc3_platdata {
|
struct xhci_dwc3_platdata {
|
||||||
struct phy_bulk *usb_phys;
|
struct phy_bulk phys;
|
||||||
};
|
};
|
||||||
|
|
||||||
void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode)
|
void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode)
|
||||||
@@ -126,7 +126,7 @@ static int xhci_dwc3_probe(struct udevice *dev)
|
|||||||
hcor = (struct xhci_hcor *)((uintptr_t)hccr +
|
hcor = (struct xhci_hcor *)((uintptr_t)hccr +
|
||||||
HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
|
HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
|
||||||
|
|
||||||
ret = dwc3_setup_phy(dev, plat->usb_phys);
|
ret = dwc3_setup_phy(dev, &plat->phys);
|
||||||
if (ret && (ret != -ENOTSUPP))
|
if (ret && (ret != -ENOTSUPP))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ static int xhci_dwc3_remove(struct udevice *dev)
|
|||||||
{
|
{
|
||||||
struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
|
struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
|
||||||
|
|
||||||
dwc3_shutdown_phy(dev, plat->usb_phys);
|
dwc3_shutdown_phy(dev, &plat->phys);
|
||||||
|
|
||||||
return xhci_deregister(dev);
|
return xhci_deregister(dev);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user