mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 14:30:53 +07:00
[ARM] pxa/em-x270: add support for on-board USB Hub
Signed-off-by: Mike Rapoport <mike@compulab.co.il> Signed-off-by: Eric Miao <eric.miao@marvell.com>
This commit is contained in:
parent
3690a0f426
commit
128d88b82e
@ -55,6 +55,7 @@
|
|||||||
#define GPIO95_MMC_WP (95)
|
#define GPIO95_MMC_WP (95)
|
||||||
#define GPIO56_NAND_RB (56)
|
#define GPIO56_NAND_RB (56)
|
||||||
#define GPIO93_CAM_RESET (93)
|
#define GPIO93_CAM_RESET (93)
|
||||||
|
#define GPIO16_USB_HUB_RESET (16)
|
||||||
|
|
||||||
/* eXeda specific GPIOs */
|
/* eXeda specific GPIOs */
|
||||||
#define GPIO114_MMC_CD (114)
|
#define GPIO114_MMC_CD (114)
|
||||||
@ -63,6 +64,7 @@
|
|||||||
#define GPIO37_WLAN_RST (37)
|
#define GPIO37_WLAN_RST (37)
|
||||||
#define GPIO95_TOUCHPAD_INT (95)
|
#define GPIO95_TOUCHPAD_INT (95)
|
||||||
#define GPIO130_CAM_RESET (130)
|
#define GPIO130_CAM_RESET (130)
|
||||||
|
#define GPIO10_USB_HUB_RESET (10)
|
||||||
|
|
||||||
/* common GPIOs */
|
/* common GPIOs */
|
||||||
#define GPIO11_NAND_CS (11)
|
#define GPIO11_NAND_CS (11)
|
||||||
@ -70,11 +72,13 @@
|
|||||||
#define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ)
|
#define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ)
|
||||||
#define GPIO115_WLAN_PWEN (115)
|
#define GPIO115_WLAN_PWEN (115)
|
||||||
#define GPIO19_WLAN_STRAP (19)
|
#define GPIO19_WLAN_STRAP (19)
|
||||||
|
#define GPIO9_USB_VBUS_EN (9)
|
||||||
|
|
||||||
static int mmc_cd;
|
static int mmc_cd;
|
||||||
static int nand_rb;
|
static int nand_rb;
|
||||||
static int dm9000_flags;
|
static int dm9000_flags;
|
||||||
static int cam_reset;
|
static int cam_reset;
|
||||||
|
static int usb_hub_reset;
|
||||||
|
|
||||||
static unsigned long common_pin_config[] = {
|
static unsigned long common_pin_config[] = {
|
||||||
/* AC'97 */
|
/* AC'97 */
|
||||||
@ -197,12 +201,14 @@ static unsigned long common_pin_config[] = {
|
|||||||
|
|
||||||
static unsigned long em_x270_pin_config[] = {
|
static unsigned long em_x270_pin_config[] = {
|
||||||
GPIO13_GPIO, /* MMC card detect */
|
GPIO13_GPIO, /* MMC card detect */
|
||||||
|
GPIO16_GPIO, /* USB hub reset */
|
||||||
GPIO56_GPIO, /* NAND Ready/Busy */
|
GPIO56_GPIO, /* NAND Ready/Busy */
|
||||||
GPIO93_GPIO | MFP_LPM_DRIVE_LOW, /* Camera reset */
|
GPIO93_GPIO | MFP_LPM_DRIVE_LOW, /* Camera reset */
|
||||||
GPIO95_GPIO, /* MMC Write protect */
|
GPIO95_GPIO, /* MMC Write protect */
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned long exeda_pin_config[] = {
|
static unsigned long exeda_pin_config[] = {
|
||||||
|
GPIO10_GPIO, /* USB hub reset */
|
||||||
GPIO20_GPIO, /* NAND Ready/Busy */
|
GPIO20_GPIO, /* NAND Ready/Busy */
|
||||||
GPIO38_GPIO | MFP_LPM_DRIVE_LOW, /* SD slot power */
|
GPIO38_GPIO | MFP_LPM_DRIVE_LOW, /* SD slot power */
|
||||||
GPIO95_GPIO, /* touchpad IRQ */
|
GPIO95_GPIO, /* touchpad IRQ */
|
||||||
@ -471,18 +477,79 @@ static inline void em_x270_init_nor(void) {}
|
|||||||
|
|
||||||
/* PXA27x OHCI controller setup */
|
/* PXA27x OHCI controller setup */
|
||||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||||
|
static struct regulator *em_x270_usb_ldo;
|
||||||
|
|
||||||
|
static int em_x270_usb_hub_init(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
em_x270_usb_ldo = regulator_get(NULL, "vcc usb");
|
||||||
|
if (IS_ERR(em_x270_usb_ldo))
|
||||||
|
return PTR_ERR(em_x270_usb_ldo);
|
||||||
|
|
||||||
|
err = gpio_request(GPIO9_USB_VBUS_EN, "vbus en");
|
||||||
|
if (err)
|
||||||
|
goto err_free_usb_ldo;
|
||||||
|
|
||||||
|
err = gpio_request(usb_hub_reset, "hub rst");
|
||||||
|
if (err)
|
||||||
|
goto err_free_vbus_gpio;
|
||||||
|
|
||||||
|
/* USB Hub power-on and reset */
|
||||||
|
gpio_direction_output(usb_hub_reset, 0);
|
||||||
|
regulator_enable(em_x270_usb_ldo);
|
||||||
|
gpio_set_value(usb_hub_reset, 1);
|
||||||
|
gpio_set_value(usb_hub_reset, 0);
|
||||||
|
regulator_disable(em_x270_usb_ldo);
|
||||||
|
regulator_enable(em_x270_usb_ldo);
|
||||||
|
gpio_set_value(usb_hub_reset, 1);
|
||||||
|
|
||||||
|
/* enable VBUS */
|
||||||
|
gpio_direction_output(GPIO9_USB_VBUS_EN, 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_free_vbus_gpio:
|
||||||
|
gpio_free(GPIO9_USB_VBUS_EN);
|
||||||
|
err_free_usb_ldo:
|
||||||
|
regulator_put(em_x270_usb_ldo);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int em_x270_ohci_init(struct device *dev)
|
static int em_x270_ohci_init(struct device *dev)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* we don't want to entirely disable USB if the HUB init failed */
|
||||||
|
err = em_x270_usb_hub_init();
|
||||||
|
if (err)
|
||||||
|
pr_err("USB Hub initialization failed: %d\n", err);
|
||||||
|
|
||||||
/* enable port 2 transiever */
|
/* enable port 2 transiever */
|
||||||
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE;
|
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void em_x270_ohci_exit(struct device *dev)
|
||||||
|
{
|
||||||
|
gpio_free(usb_hub_reset);
|
||||||
|
gpio_free(GPIO9_USB_VBUS_EN);
|
||||||
|
|
||||||
|
if (!IS_ERR(em_x270_usb_ldo)) {
|
||||||
|
if (regulator_is_enabled(em_x270_usb_ldo))
|
||||||
|
regulator_disable(em_x270_usb_ldo);
|
||||||
|
|
||||||
|
regulator_put(em_x270_usb_ldo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct pxaohci_platform_data em_x270_ohci_platform_data = {
|
static struct pxaohci_platform_data em_x270_ohci_platform_data = {
|
||||||
.port_mode = PMM_PERPORT_MODE,
|
.port_mode = PMM_PERPORT_MODE,
|
||||||
.flags = ENABLE_PORT1 | ENABLE_PORT2 | POWER_CONTROL_LOW,
|
.flags = ENABLE_PORT1 | ENABLE_PORT2 | POWER_CONTROL_LOW,
|
||||||
.init = em_x270_ohci_init,
|
.init = em_x270_ohci_init,
|
||||||
|
.exit = em_x270_ohci_exit,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init em_x270_init_ohci(void)
|
static void __init em_x270_init_ohci(void)
|
||||||
@ -1129,6 +1196,7 @@ static void __init em_x270_module_init(void)
|
|||||||
nand_rb = GPIO56_NAND_RB;
|
nand_rb = GPIO56_NAND_RB;
|
||||||
dm9000_flags = DM9000_PLATF_32BITONLY;
|
dm9000_flags = DM9000_PLATF_32BITONLY;
|
||||||
cam_reset = GPIO93_CAM_RESET;
|
cam_reset = GPIO93_CAM_RESET;
|
||||||
|
usb_hub_reset = GPIO16_USB_HUB_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init em_x270_exeda_init(void)
|
static void __init em_x270_exeda_init(void)
|
||||||
@ -1140,6 +1208,7 @@ static void __init em_x270_exeda_init(void)
|
|||||||
nand_rb = GPIO20_NAND_RB;
|
nand_rb = GPIO20_NAND_RB;
|
||||||
dm9000_flags = DM9000_PLATF_16BITONLY;
|
dm9000_flags = DM9000_PLATF_16BITONLY;
|
||||||
cam_reset = GPIO130_CAM_RESET;
|
cam_reset = GPIO130_CAM_RESET;
|
||||||
|
usb_hub_reset = GPIO10_USB_HUB_RESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init em_x270_init(void)
|
static void __init em_x270_init(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user