diff options
Diffstat (limited to 'drivers/usb/dwc2/dwc2.c')
-rw-r--r-- | drivers/usb/dwc2/dwc2.c | 66 |
1 files changed, 60 insertions, 6 deletions
diff --git a/drivers/usb/dwc2/dwc2.c b/drivers/usb/dwc2/dwc2.c index 9893977b8e..a35fd0e717 100644 --- a/drivers/usb/dwc2/dwc2.c +++ b/drivers/usb/dwc2/dwc2.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) 2012 Oleksandr Tymoshenko <gonzo@freebsd.org> * Copyright (C) 2014 Marek Vasut <marex@denx.de> @@ -13,9 +13,49 @@ #include <driver.h> #include <linux/clk.h> #include <linux/reset.h> +#include <of_device.h> #include "dwc2.h" +static void dwc2_set_stm32mp15_fsotg_params(struct dwc2 *dwc2) +{ + struct dwc2_core_params *p = &dwc2->params; + + p->otg_cap &= ~(DWC2_CAP_PARAM_HNP_SRP_CAPABLE + | DWC2_CAP_PARAM_SRP_ONLY_CAPABLE); + p->otg_cap |= DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE; + p->speed = DWC2_SPEED_PARAM_FULL; + p->host_rx_fifo_size = 128; + p->host_nperio_tx_fifo_size = 96; + p->host_perio_tx_fifo_size = 96; + p->max_packet_count = 256; + p->phy_type = DWC2_PHY_TYPE_PARAM_FS; + p->i2c_enable = false; + p->activate_stm_fs_transceiver = true; + p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 << GAHBCFG_HBSTLEN_SHIFT; + p->power_down = DWC2_POWER_DOWN_PARAM_NONE; + p->host_support_fs_ls_low_power = true; + p->host_ls_low_power_phy_clk = true; +} + +static void dwc2_set_stm32mp15_hsotg_params(struct dwc2 *dwc2) +{ + struct dwc2_core_params *p = &dwc2->params; + + p->otg_cap &= ~(DWC2_CAP_PARAM_HNP_SRP_CAPABLE + | DWC2_CAP_PARAM_SRP_ONLY_CAPABLE); + p->otg_cap |= DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE; + p->host_rx_fifo_size = 440; + p->host_nperio_tx_fifo_size = 256; + p->host_perio_tx_fifo_size = 256; + p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 << GAHBCFG_HBSTLEN_SHIFT; + p->power_down = DWC2_POWER_DOWN_PARAM_NONE; + p->lpm = false; + p->lpm_clock_gating = false; + p->besl = false; + p->hird_threshold_en = false; +} + static int dwc2_set_mode(void *ctx, enum usb_dr_mode mode) { struct dwc2 *dwc2 = ctx; @@ -43,17 +83,19 @@ static int dwc2_set_mode(void *ctx, enum usb_dr_mode mode) return ret; } -static int dwc2_probe(struct device_d *dev) +typedef void (*set_params_cb)(struct dwc2 *dwc2); + +static int dwc2_probe(struct device *dev) { struct resource *iores; struct dwc2 *dwc2; + set_params_cb set_params; int ret; - dwc2 = xzalloc(sizeof(*dwc2)); - iores = dev_request_mem_resource(dev, 0); if (IS_ERR(iores)) return PTR_ERR(iores); + dwc2 = xzalloc(sizeof(*dwc2)); dwc2->regs = IOMEM(iores->start); dwc2->dev = dev; @@ -106,6 +148,11 @@ static int dwc2_probe(struct device_d *dev) goto error; dwc2_set_default_params(dwc2); + dwc2_get_device_properties(dwc2); + + set_params = of_device_get_match_data(dev); + if (set_params) + set_params(dwc2); dma_set_mask(dev, DMA_BIT_MASK(32)); dev->priv = dwc2; @@ -130,10 +177,12 @@ clk_put: release_region: release_region(iores); + free(dwc2); + return ret; } -static void dwc2_remove(struct device_d *dev) +static void dwc2_remove(struct device *dev) { struct dwc2 *dwc2 = dev->priv; @@ -148,10 +197,15 @@ static const struct of_device_id dwc2_platform_dt_ids[] = { { .compatible = "brcm,bcm2835-usb", }, { .compatible = "brcm,bcm2708-usb", }, { .compatible = "snps,dwc2", }, + { .compatible = "st,stm32mp15-fsotg", + .data = dwc2_set_stm32mp15_fsotg_params }, + { .compatible = "st,stm32mp15-hsotg", + .data = dwc2_set_stm32mp15_hsotg_params }, { } }; +MODULE_DEVICE_TABLE(of, dwc2_platform_dt_ids); -static struct driver_d dwc2_driver = { +static struct driver dwc2_driver = { .name = "dwc2", .probe = dwc2_probe, .remove = dwc2_remove, |