diff --git a/arch/arm/configs/meson32_defconfig b/arch/arm/configs/meson32_defconfig index fed1108368f1..e341f361ce63 100644 --- a/arch/arm/configs/meson32_defconfig +++ b/arch/arm/configs/meson32_defconfig @@ -276,6 +276,7 @@ CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_OPTION=y CONFIG_USB_GADGET=y CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_F_MTP=y CONFIG_USB_CONFIGFS_F_PTP=y diff --git a/arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts b/arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts index 1bc13ebedcfe..28323162d150 100644 --- a/arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts +++ b/arch/arm64/boot/dts/amlogic/gxl_p400_2g.dts @@ -404,6 +404,10 @@ compatible = "amlogic, amlogic-new-usb3"; portnum = <0>; reg = <0x0 0xd0078080 0x0 0x20>; + interrupts = <0 16 4>; + otg = <1>; + gpio-vbus-power = "GPIOAO_5"; + gpios = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>; }; dwc2_a { @@ -422,7 +426,7 @@ port-id-mode = <0>; /** 0: hardware, 1: sw_host, 2: sw_slave*/ usb-fifo = <728>; cpu-type = "gxl"; - controller-type = <1>; /** 0: normal, 1: host, 2: device*/ + controller-type = <3>; /** 0: normal,1:host,2:device,3:otg*/ phy-reg = <0xd0078000>; phy-reg-size = <0xa0>; clocks = <&clkc CLKID_USB_GENERAL diff --git a/arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts b/arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts index 55d687530005..1339cc77bfbd 100644 --- a/arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts +++ b/arch/arm64/boot/dts/amlogic/gxl_p401_2g.dts @@ -466,6 +466,10 @@ compatible = "amlogic, amlogic-new-usb3"; portnum = <0>; reg = <0x0 0xd0078080 0x0 0x20>; + interrupts = <0 16 4>; + otg = <1>; + gpio-vbus-power = "GPIOAO_5"; + gpios = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>; }; dwc2_a { @@ -484,7 +488,7 @@ port-id-mode = <0>; /** 0: hardware, 1: sw_host, 2: sw_slave*/ usb-fifo = <728>; cpu-type = "gxl"; - controller-type = <1>; /** 0: normal, 1: host, 2: device*/ + controller-type = <3>; /** 0: normal,1:host,2:device,3:otg*/ phy-reg = <0xd0078000>; phy-reg-size = <0xa0>; clocks = <&clkc CLKID_USB_GENERAL diff --git a/arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts b/arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts index e72fbc609116..d05cfb9b4f40 100644 --- a/arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts +++ b/arch/arm64/boot/dts/amlogic/gxm_q200_2g.dts @@ -601,6 +601,10 @@ compatible = "amlogic, amlogic-new-usb3"; portnum = <0>; reg = <0x0 0xd0078080 0x0 0x20>; + interrupts = <0 16 4>; + otg = <1>; + gpio-vbus-power = "GPIOAO_5"; + gpios = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>; }; dwc2_a { @@ -619,7 +623,7 @@ port-id-mode = <0>; /** 0: hardware, 1: sw_host, 2: sw_slave*/ usb-fifo = <728>; cpu-type = "gxl"; - controller-type = <1>; /** 0: normal, 1:host, 2:device*/ + controller-type = <3>; /** 0: normal,1:host,2:device,3:otg*/ phy-reg = <0xd0078000>; phy-reg-size = <0xa0>; clocks = <&clkc CLKID_USB_GENERAL diff --git a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_driver.c b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_driver.c index 6e1399c85771..812c5df5283e 100644 --- a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_driver.c +++ b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_driver.c @@ -1200,11 +1200,13 @@ static int dwc_otg_driver_probe(struct platform_device *pdev) dwc_otg_module_params.host_nperio_tx_fifo_size = -1; dwc_otg_module_params.host_perio_tx_fifo_size = -1; dwc_otg_module_params.host_channels = -1; - dwc_otg_module_params.dev_rx_fifo_size = 164; - dwc_otg_module_params.dev_nperio_tx_fifo_size = 144; - dwc_otg_module_params.dev_tx_fifo_size[0] = 144; + dwc_otg_module_params.dev_rx_fifo_size = 192; + dwc_otg_module_params.dev_nperio_tx_fifo_size = 128; + dwc_otg_module_params.dev_tx_fifo_size[0] = 128; dwc_otg_module_params.dev_tx_fifo_size[1] = 128; dwc_otg_module_params.dev_tx_fifo_size[2] = 128; + dwc_otg_module_params.dev_tx_fifo_size[3] = 16; + dwc_otg_module_params.dev_tx_fifo_size[4] = 16; } else { dwc_otg_module_params.data_fifo_size = -1; dwc_otg_module_params.host_rx_fifo_size = -1; diff --git a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd.c b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd.c index 3bd3aac57685..e54e214b7a5d 100644 --- a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd.c +++ b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd.c @@ -2198,9 +2198,25 @@ int dwc_otg_pcd_ep_queue(dwc_otg_pcd_t *pcd, void *ep_handle, req->priv = req_handle; req->dw_align_buf = NULL; if ((dma_buf & 0x3) && GET_CORE_IF(pcd)->dma_enable - && !GET_CORE_IF(pcd)->dma_desc_enable && buflen) - req->dw_align_buf = DWC_DMA_ALLOC_ATOMIC(buflen, - &req->dw_align_buf_dma); + && !GET_CORE_IF(pcd)->dma_desc_enable && buflen) { + struct device *dev = &pcd->otg_dev->os_dep.pldev->dev; + + if (atomic_alloc) + req->dw_align_buf = DWC_ALLOC_ATOMIC(buflen); + else + req->dw_align_buf = DWC_ALLOC(buflen); + if (!req->dw_align_buf) { + DWC_FREE(req); + return -DWC_E_NO_MEMORY; + } + + if (ep->dwc_ep.is_in) + dwc_memcpy(req->dw_align_buf, buf, buflen); + req->dw_align_buf_dma = dma_map_single(dev, + req->dw_align_buf, buflen, + ep->dwc_ep.is_in ? DMA_TO_DEVICE : + DMA_FROM_DEVICE); + } DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); #if 0 /* @@ -2300,8 +2316,6 @@ int dwc_otg_pcd_ep_queue(dwc_otg_pcd_t *pcd, void *ep_handle, /* Setup and start the Transfer */ if (req->dw_align_buf) { - if (ep->dwc_ep.is_in) - dwc_memcpy(req->dw_align_buf, buf, buflen); ep->dwc_ep.dma_addr = req->dw_align_buf_dma; ep->dwc_ep.start_xfer_buff = req->dw_align_buf; ep->dwc_ep.xfer_buff = req->dw_align_buf; diff --git a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd_intr.c b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd_intr.c index 65b6c9f5e405..accefbafecb2 100644 --- a/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd_intr.c +++ b/drivers/amlogic/usb/dwc_otg/310/dwc_otg_pcd_intr.c @@ -2453,11 +2453,16 @@ static void complete_ep(dwc_otg_pcd_ep_t *ep) req->actual = ep->dwc_ep.xfer_count; if (req->dw_align_buf) { + struct device *dev = &ep->pcd->otg_dev-> + os_dep.pldev->dev; + + dma_unmap_single(dev, + req->dw_align_buf_dma, req->length, + ep->dwc_ep.is_in ? DMA_TO_DEVICE : + DMA_FROM_DEVICE); if (!ep->dwc_ep.is_in) dwc_memcpy(req->buf, req->dw_align_buf, req->length); - - DWC_DMA_FREE(req->length, req->dw_align_buf, - req->dw_align_buf_dma); + DWC_FREE(req->dw_align_buf); } dwc_otg_request_done(ep, req, 0); diff --git a/drivers/amlogic/usb/phy/phy-aml-new-usb3.c b/drivers/amlogic/usb/phy/phy-aml-new-usb3.c index 73175d5e7a52..31f38d72557e 100644 --- a/drivers/amlogic/usb/phy/phy-aml-new-usb3.c +++ b/drivers/amlogic/usb/phy/phy-aml-new-usb3.c @@ -252,13 +252,11 @@ static int amlogic_new_usb3_probe(struct platform_device *pdev) gpio_name = of_get_property(dev->of_node, "gpio-vbus-power", NULL); if (gpio_name) { -#if 0 gpio_vbus_power_pin = 1; usb_gd = gpiod_get_index(&pdev->dev, - NULL, 0); + NULL, 0, GPIOD_OUT_LOW); if (IS_ERR(usb_gd)) return -1; -#endif } prop = of_get_property(dev->of_node, "portnum", NULL);