usb: ChipIdea: add Nuvoton NPCM UDC support
Subsystems (4)
Tomer Maimon
maintainerv2 cover usb: ChipIdea: add Nuvoton NPCM UDC support
This patch set add USB device controller for the NPCM Baseboard Management Controllers (BMC).
NPCM UDC driver is a part of the USB ChipIdea driver.
Adding CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag to modify the vbus_active parameter to active in case the ChipIdea USB IP role is device-only and there is no otgsc register.
BMC NPCM7XX and BMC NPCM8XX has ten identical NPCM UDC modules,
The NPCM UDC were tested on NPCM845 evaluation board.
Addressed comments from:
- Rob Herring : https://www.spinics.net/lists/linux-usb/msg246811.html
- Krzysztof Kozlowski : https://www.spinics.net/lists/linux-usb/msg246773.html
- kernel test robot : https://www.spinics.net/lists/devicetree/msg634160.html
- Jonathan Neuschäfer : https://www.spinics.net/lists/linux-usb/msg246790.html
Changes since version 1:
- Add SoC specific compatible.
- Remove USB phy mux property from dt-binding, will be handled differently.
- Add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS commit to this patch set.
Tomer Maimon (3):
usb: chipidea: add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag
dt-bindings: usb: ci-hdrc-usb2: add npcm750 and npcm845 compatible
usb: chipidea: Add support for NPCM
.../devicetree/bindings/usb/ci-hdrc-usb2.yaml | 4 + drivers/usb/chipidea/Kconfig | 4 + drivers/usb/chipidea/Makefile | 1 + drivers/usb/chipidea/ci_hdrc_npcm.c | 117 ++++++++++++++++++ drivers/usb/chipidea/otg.c | 5 +- include/linux/usb/chipidea.h | 1 + 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 drivers/usb/chipidea/ci_hdrc_npcm.c
Signature · 1 line
2.33.0
Tomer Maimon
maintainerPATCH v2 1/3 usb: chipidea: add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag
Adding CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag to modify the vbus_active parameter to active in case the ChipIdea USB IP role is device-only and there is no otgsc register.
--- drivers/usb/chipidea/otg.c | 5 ++++- include/linux/usb/chipidea.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/usb/chipidea/otg.c +4 -1
@@ -130,8 +130,11 @@ enum ci_role ci_otg_role(struct ci_hdrc *ci)void ci_handle_vbus_change (struct ci_hdrc *ci) { -if (!ci->is_otg) +if (!ci->is_otg) { +if (ci->platdata->flags &CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS ) +usb_gadget_vbus_connect (&ci->gadget);return ; + }if (hw_read_otgsc (ci,OTGSC_BSV ) && !ci->vbus_active)usb_gadget_vbus_connect (&ci->gadget);
include/linux/usb/chipidea.h +1 -0
@@ -64,6 +64,7 @@ struct ci_hdrc_platform_data {#define CI_HDRC_PMQOS BIT(15)#define CI_HDRC_PHY_VBUS_CONTROL BIT(16)#define CI_HDRC_HAS_PORTSC_PEC_MISSED BIT(17) +#define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS BIT(18)enum usb_dr_mode dr_mode;#define CI_HDRC_CONTROLLER_RESET_EVENT 0#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1
Signature · 1 line
2.33.0
Re: [PATCH v2 1/3] usb: chipidea: add CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS flag
Quoted 5 lines · Tomer Maimon
Adding
CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYSflag to modify thevbus_activeparameter to active in case the ChipIdea USB IP role is device-only and there is no otgsc register.Signed-off-by Tomer Maimon <[email protected]>
Peter
Quoted 37 lines
--- drivers/usb/chipidea/otg.c | 5 ++++- include/linux/usb/chipidea.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)drivers/usb/chipidea/otg.c +4
-1@@ -130,8 +130,11 @@ enum ci_role ci_otg_role(struct ci_hdrc *ci)void ci_handle_vbus_change (struct ci_hdrc *ci) { -if (!ci->is_otg) +if (!ci->is_otg) { +if (ci->platdata->flags &CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS ) +usb_gadget_vbus_connect (&ci->gadget);return ; + }if (hw_read_otgsc (ci,OTGSC_BSV ) && !ci->vbus_active)usb_gadget_vbus_connect (&ci->gadget);include/linux/usb/chipidea.h +1
-0@@ -64,6 +64,7 @@ struct ci_hdrc_platform_data {#define CI_HDRC_PMQOS BIT(15)#define CI_HDRC_PHY_VBUS_CONTROL BIT(16)#define CI_HDRC_HAS_PORTSC_PEC_MISSED BIT(17) +#define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS BIT(18)enum usb_dr_mode dr_mode;#define CI_HDRC_CONTROLLER_RESET_EVENT 0#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1Signature · 1 line
2.33.0
Signature · 2 lines
Thanks, Peter Chen
Tomer Maimon
maintainerPATCH v2 2/3 dt-bindings: usb: ci-hdrc-usb2: add npcm750 and npcm845 compatible
In reply to Tomer MaimonAdd a compatible string for Nuvoton BMC NPCM750 and Nuvoton BMC NPCM845.
--- Documentation/devicetree/bindings/usb/ci-hdrc-usb2.yaml | 4 ++++ 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/usb/ci-hdrc-usb2.yaml +4 -0
@@ -16,6 +16,8 @@ properties: - enum: - chipidea,usb2 - lsi,zevio-usb + - nuvoton,npcm750-udc + - nuvoton,npcm845-udc - nvidia,tegra20-ehci - nvidia,tegra20-udc - nvidia,tegra30-ehci
@@ -388,6 +390,8 @@ allOf: enum: - chipidea,usb2 - lsi,zevio-usb + - nuvoton,npcm750-udc + - nuvoton,npcm845-udc - nvidia,tegra20-udc - nvidia,tegra30-udc - nvidia,tegra114-udc
Signature · 1 line
2.33.0
Tomer Maimon
maintainerPATCH v2 3/3 usb: chipidea: Add support for NPCM
In reply to Tomer MaimonAdd Nuvoton NPCM BMC SoCs support to USB ChipIdea driver. NPCM SoC include ChipIdea IP block that used for USB device controller mode.
--- drivers/usb/chipidea/Kconfig | 4 + drivers/usb/chipidea/Makefile | 1 + drivers/usb/chipidea/ci_hdrc_npcm.c | 117 ++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 drivers/usb/chipidea/ci_hdrc_npcm.c
drivers/usb/chipidea/Kconfig +4 -0
@@ -43,6 +43,10 @@ config USB_CHIPIDEA_MSM tristate "Enable MSM hsusb glue driver" if EXPERT default USB_CHIPIDEA +config USB_CHIPIDEA_NPCM + tristate "Enable NPCM hsusb glue driver" if EXPERT + default USB_CHIPIDEA + config USB_CHIPIDEA_IMX tristate "Enable i.MX USB glue driver" if EXPERT depends on OF
drivers/usb/chipidea/Makefile +1 -0
@@ -13,6 +13,7 @@ ci_hdrc-$(CONFIG_USB_OTG_FSM) += otg_fsm.o obj-$(CONFIG_USB_CHIPIDEA_GENERIC) += ci_hdrc_usb2.o obj-$(CONFIG_USB_CHIPIDEA_MSM) += ci_hdrc_msm.o +obj-$(CONFIG_USB_CHIPIDEA_NPCM) += ci_hdrc_npcm.o obj-$(CONFIG_USB_CHIPIDEA_PCI) += ci_hdrc_pci.o obj-$(CONFIG_USB_CHIPIDEA_IMX) += usbmisc_imx.o ci_hdrc_imx.o obj-$(CONFIG_USB_CHIPIDEA_TEGRA) += ci_hdrc_tegra.o
drivers/usb/chipidea/ci_hdrc_npcm.c new file +117 -0
117 lines not on this page · raw message
Signature · 1 line
2.33.0
Re: [PATCH v2 3/3] usb: chipidea: Add support for NPCM
Quoted 5 lines · Tomer Maimon
Add Nuvoton NPCM BMC SoCs support to USB ChipIdea driver. NPCM SoC include ChipIdea IP block that used for USB device controller mode.
Signed-off-by Tomer Maimon <[email protected]>
Peter
Quoted 160 lines
--- drivers/usb/chipidea/Kconfig | 4 + drivers/usb/chipidea/Makefile | 1 + drivers/usb/chipidea/ci_hdrc_npcm.c | 117 ++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 drivers/usb/chipidea/ci_hdrc_npcm.cdrivers/usb/chipidea/Kconfig +4
-0@@ -43,6 +43,10 @@ config USB_CHIPIDEA_MSM tristate "Enable MSM hsusb glue driver" if EXPERT default USB_CHIPIDEA +config USB_CHIPIDEA_NPCM + tristate "Enable NPCM hsusb glue driver" if EXPERT + default USB_CHIPIDEA + config USB_CHIPIDEA_IMX tristate "Enable i.MX USB glue driver" if EXPERT depends on OFdrivers/usb/chipidea/Makefile +1
-0@@ -13,6 +13,7 @@ ci_hdrc-$(CONFIG_USB_OTG_FSM) += otg_fsm.o obj-$(CONFIG_USB_CHIPIDEA_GENERIC) += ci_hdrc_usb2.o obj-$(CONFIG_USB_CHIPIDEA_MSM) += ci_hdrc_msm.o +obj-$(CONFIG_USB_CHIPIDEA_NPCM) += ci_hdrc_npcm.o obj-$(CONFIG_USB_CHIPIDEA_PCI) += ci_hdrc_pci.o obj-$(CONFIG_USB_CHIPIDEA_IMX) += usbmisc_imx.o ci_hdrc_imx.o obj-$(CONFIG_USB_CHIPIDEA_TEGRA) += ci_hdrc_tegra.odrivers/usb/chipidea/ci_hdrc_npcm.c new file +117
-0@@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2023 Nuvoton Technology corporation. + +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> +#include <linux/usb/chipidea.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <linux/reset-controller.h> +#include <linux/of.h> + +#include "ci.h" + +struct npcm_udc_data { +struct platform_device *ci; +struct clk *core_clk; +struct ci_hdrc_platform_data pdata; +}; + +static int npcm_udc_notify_event (struct ci_hdrc *ci,unsigned event) +{ +struct device *dev = ci->dev->parent; + +switch (event) { +case CI_HDRC_CONTROLLER_RESET_EVENT : +/* clear all mode bits */ +hw_write (ci,OP_USBMODE ,0xffffffff ,0x0 ); +break ; +default : +dev_dbg (dev,"unknown ci_hdrc event\n" ); +break ; + } + +return 0 ; +} + +static int npcm_udc_probe (struct platform_device *pdev) +{ +int ret; +struct npcm_udc_data *ci; +struct platform_device *plat_ci; +struct device *dev = &pdev->dev; + + ci =devm_kzalloc (&pdev->dev,sizeof (*ci),GFP_KERNEL ); +if (!ci) +return -ENOMEM ; +platform_set_drvdata (pdev, ci); + + ci->core_clk =devm_clk_get_optional (dev,NULL ); +if (IS_ERR (ci->core_clk)) +return PTR_ERR (ci->core_clk); + + ret =clk_prepare_enable (ci->core_clk); +if (ret) { +dev_err (dev,"failed to enable the clock: %d\n" , ret); +return ret; + } + + ci->pdata.name =dev_name (dev); + ci->pdata.capoffset =DEF_CAPOFFSET ; + ci->pdata.flags =CI_HDRC_REQUIRES_ALIGNED_DMA | +CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS ; + ci->pdata.phy_mode =USBPHY_INTERFACE_MODE_UTMI ; + ci->pdata.notify_event = npcm_udc_notify_event; + + plat_ci =ci_hdrc_add_device (dev, pdev->resource, pdev->num_resources, + &ci->pdata); +if (IS_ERR (plat_ci)) { + ret =PTR_ERR (plat_ci); +dev_err (dev,"failed to register HDRC NPCM device: %d\n" , ret); + goto clk_err; + } + +pm_runtime_no_callbacks (dev); +pm_runtime_enable (dev); + +return 0 ; + +clk_err: +clk_disable_unprepare (ci->core_clk); +return ret; +} + +static int npcm_udc_remove (struct platform_device *pdev) +{ +struct npcm_udc_data *ci =platform_get_drvdata (pdev); + +pm_runtime_disable (&pdev->dev); +ci_hdrc_remove_device (ci->ci); +clk_disable_unprepare (ci->core_clk); + +return 0 ; +} + +static const struct of_device_id npcm_udc_dt_match[] = { + { .compatible ="nuvoton,npcm750-udc" , }, + { .compatible ="nuvoton,npcm845-udc" , }, + { } +}; +MODULE_DEVICE_TABLE (of, npcm_udc_dt_match); + +static struct platform_driver npcm_udc_driver = { + .probe = npcm_udc_probe, + .remove = npcm_udc_remove, + .driver = { + .name ="npcm_udc" , + .of_match_table = npcm_udc_dt_match, + }, +}; + +module_platform_driver (npcm_udc_driver); + +MODULE_DESCRIPTION ("NPCM USB device controller driver" ); +MODULE_AUTHOR ("Tomer Maimon <[email protected]>" ); +MODULE_ALIAS ("platform:npcm-udc" ); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.33.0
Signature · 2 lines
Thanks, Peter Chen
Re: [PATCH v2 3/3] usb: chipidea: Add support for NPCM
In reply to Tomer MaimonQuoted 3 lines · Tomer Maimon
Add Nuvoton NPCM BMC SoCs support to USB ChipIdea driver. NPCM SoC include ChipIdea IP block that used for USB device controller mode.
...
drivers/usb/chipidea/ci_hdrc_npcm.c line 57
Quoted 13 lines
drivers/usb/chipidea/ci_hdrc_npcm.c new file +13
-0+ ci =devm_kzalloc (&pdev->dev,sizeof (*ci),GFP_KERNEL ); +if (!ci) +return -ENOMEM ; +platform_set_drvdata (pdev, ci); + + ci->core_clk =devm_clk_get_optional (dev,NULL ); +if (IS_ERR (ci->core_clk)) +return PTR_ERR (ci->core_clk); + + ret =clk_prepare_enable (ci->core_clk); +if (ret) { +dev_err (dev,"failed to enable the clock: %d\n" , ret); +return ret;
return dev_err_probe()
...
drivers/usb/chipidea/ci_hdrc_npcm.c line 116
Quoted 6 lines
drivers/usb/chipidea/ci_hdrc_npcm.c new file +6
-0+ +module_platform_driver (npcm_udc_driver); + +MODULE_DESCRIPTION ("NPCM USB device controller driver" ); +MODULE_AUTHOR ("Tomer Maimon <[email protected]>" ); +MODULE_ALIAS ("platform:npcm-udc" );
Nope... if you need it, your tables are wrong.
Best regards,
Krzysztof