* [PATCH v1 0/2] Add driver support for Eswin eic7700 SoC Usb controller @ 2025-05-16 9:52 zhangsenchuan 2025-05-16 9:53 ` [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 " zhangsenchuan 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan 0 siblings, 2 replies; 9+ messages in thread From: zhangsenchuan @ 2025-05-16 9:52 UTC (permalink / raw) To: gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: ningyu, linmin, yangwei1, Senchuan Zhang From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> Support for the Eswin eic7700 Usb driver control program has been added to the Linux kernel, which is part of the Eswin SoC family. Features: Implements support for the Eswin eic7700 SoC Usb controller, which is responsible for identifying,configuring and connecting usb devices,and provides interfaces for accessing these devices. Supported chips: Eswin eic7700 series SoC. Test: Tested this patch on the Sifive HiFive Premier P550 (which uses the eic7700 SoC),The driver was tested to be normal through a usb peripheral. Senchuan Zhang (2): dt-bindings: usb: Add Eswin EIC7700 Usb controller usb: dwc3: eic7700: Add EIC7700 usb driver .../bindings/usb/eswin,eic7700-usb.yaml | 120 ++++ drivers/usb/dwc3/Kconfig | 11 + drivers/usb/dwc3/Makefile | 1 + drivers/usb/dwc3/dwc3-eic7700.c | 605 ++++++++++++++++++ 4 files changed, 737 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml create mode 100644 drivers/usb/dwc3/dwc3-eic7700.c -- 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 Usb controller 2025-05-16 9:52 [PATCH v1 0/2] Add driver support for Eswin eic7700 SoC Usb controller zhangsenchuan @ 2025-05-16 9:53 ` zhangsenchuan 2025-05-16 11:26 ` Rob Herring (Arm) 2025-05-19 6:24 ` Krzysztof Kozlowski 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan 1 sibling, 2 replies; 9+ messages in thread From: zhangsenchuan @ 2025-05-16 9:53 UTC (permalink / raw) To: gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: ningyu, linmin, yangwei1, Senchuan Zhang From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> Add Device Tree binding documentation for the ESWIN EIC7700 usb controller module. Co-developed-by: Wei Yang <yangwei1@eswincomputing.com> Signed-off-by: Wei Yang <yangwei1@eswincomputing.com> Signed-off-by: Senchuan Zhang <zhangsenchuan@eswincomputing.com> --- .../bindings/usb/eswin,eic7700-usb.yaml | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml diff --git a/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml b/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml new file mode 100644 index 000000000000..eb8260069b99 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml @@ -0,0 +1,120 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/usb/eswin,eic7700-usb.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Eswin EIC7700 SoC Usb Controller + +maintainers: + - Wei Yang <yangwei1@eswincomputing.com> + - Senchuan Zhang <zhangsenchuan@eswincomputing.com> + +description: | + The Usb controller on EIC7700 SoC. + +properties: + compatible: + const: eswin,eic7700-usb + + reg: + maxItems: 3 + + interrupts: + maxItems: 1 + + interrupt-names: + items: + - const: peripheral + + clocks: + maxItems: 3 + description: handles to clock for the usb controller. + + clock-names: + items: + - const: suspend + - const: aclk + - const: cfg_clk + description: the name of each clock. + + resets: + description: resets to be used by the controller. + + reset-names: + items: + - const: vaux + description: names of the resets listed in resets property in the same order. + + eswin,hsp_sp_csr: + description: | + High-speed equipment control register. + $ref: /schemas/types.yaml#/definitions/phandle-array + + ranges: true + + dma-noncoherent: true + + numa-node-id: + maximum: 0 + +required: + - compatible + - reg + - interrupts + - interrupt-names + - interrupt-parent + - clocks + - clock-names + - resets + - reset-names + - eswin,hsp_sp_csr + - dma-noncoherent + - ranges + - numa-node-id + +additionalProperties: false + +examples: + - | + usb { + #address-cells = <2>; + #size-cells = <2>; + + usbdrd3_0: usb0{ + compatible = "eswin,eic7700-dwc3"; + #address-cells = <2>; + #size-cells = <2>; + clocks = <&clock 270>, + <&clock 545>, + <&clock 546>; + clock-names = "suspend","aclk", "cfg_clk"; + eswin,hsp_sp_csr = <&hsp_sp_csr 0x800 0x808 0x83c 0x840>; + resets = <&reset 0x07 (1 << 15)>; + reset-names = "vaux"; + ranges; + numa-node-id = <0>; + status = "disabled"; + usbdrd_dwc3_0: dwc3@50480000 { + compatible = "snps,dwc3"; + reg = <0x0 0x50480000 0x0 0x10000>; + #address-cells = <2>; + #size-cells = <2>; + interrupt-parent = <&plic>; + interrupts = <85>; + interrupt-names = "peripheral"; + dr_mode = "peripheral"; + phy_type = "utmi"; + maximum-speed = "high-speed"; + eswin,hsp_sp_csr = <&hsp_sp_csr 0x1044>; + snps,dis_enblslpm_quirk; + snps,dis-u2-freeclk-exists-quirk; + snps,dis_u2_susphy_quirk; + snps,dis-del-phy-power-chg-quirk; + snps,parkmode-disable-ss-quirk; + status = "disabled"; + numa-node-id = <0>; + dma-noncoherent; + }; + }; + }; -- 2.25.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 Usb controller 2025-05-16 9:53 ` [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 " zhangsenchuan @ 2025-05-16 11:26 ` Rob Herring (Arm) 2025-05-19 6:24 ` Krzysztof Kozlowski 1 sibling, 0 replies; 9+ messages in thread From: Rob Herring (Arm) @ 2025-05-16 11:26 UTC (permalink / raw) To: zhangsenchuan Cc: linux-kernel, Thinh.Nguyen, p.zabel, ningyu, linux-usb, devicetree, linmin, yangwei1, gregkh, krzk+dt, conor+dt On Fri, 16 May 2025 17:53:37 +0800, zhangsenchuan@eswincomputing.com wrote: > From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > > Add Device Tree binding documentation for the ESWIN EIC7700 > usb controller module. > > Co-developed-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > --- > .../bindings/usb/eswin,eic7700-usb.yaml | 120 ++++++++++++++++++ > 1 file changed, 120 insertions(+) > create mode 100644 Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml > My bot found errors running 'make dt_binding_check' on your patch: yamllint warnings/errors: dtschema/dtc warnings/errors: Documentation/devicetree/bindings/usb/eswin,eic7700-usb.example.dtb: /example-0/usb/usb0: failed to match any schema with compatible: ['eswin,eic7700-dwc3'] /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.example.dtb: usb0 (eswin,eic7700-dwc3): 'eswin,hsp_sp_csr' does not match any of the regexes: '^#.*', '^(at25|bm|devbus|dmacap|dsa|exynos|fsi[ab]|gpio-fan|gpio-key|gpio|gpmc|hdmi|i2c-gpio),.*', '^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', '^(pciclass|pinctrl-single|#pinctrl-single|PowerPC),.*', '^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', '^(simple-audio-card|st-plgpio|st-spics|ts),.*', '^100ask,.*', '^70mai,.*', '^8dev,.*', '^GEFanuc,.*', '^IBM,.*', '^ORCL,.*', '^SUNW,.*', '^[a-zA-Z0-9#_][a-zA-Z0-9+\\-._@]{0,63}$', '^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abb,.*', '^abilis,.*', '^abracon,.*', '^abt,.*', '^acbel,.*', '^acelink,.*', '^acer,.*', '^acme,.*', '^actions,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', '^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^adieng,.*', '^admatec,.*', '^advantech,.*', '^aeroflexgaisler,.*', '^aesop,.*', '^airoha,.*', '^al,.*', '^alcatel,.*', '^aldec,.*', '^alfa-network,.*', '^allegro,.*', '^allegromicro,.*', '^alliedvision,.*', '^allo,.*', '^allwinner,.*', '^alphascale,.*', '^alps,.*', '^alt,.*', '^altr,.*', '^amarula,.*', '^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', '^ampere,.*', '^amphenol,.*', '^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^anbernic,.*', '^andestech,.*', '^anvo,.*', '^aoly,.*', '^aosong,.*', '^apm,.*', '^apple,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', '^arcom,.*', '^arctic,.*', '^arcx,.*', '^ariaboard,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', '^armsom,.*', '^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^asc,.*', '^asix,.*', '^aspeed,.*', '^asrock,.*', '^asteralabs,.*', '^asus,.*', '^atheros,.*', '^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', '^avia,.*', '^avic,.*', '^avnet,.*', '^awinic,.*', '^axentia,.*', '^axis,.*', '^azoteq,.*', '^azw,.*', '^baikal,.*', '^bananapi,.*', '^beacon,.*', '^beagle,.*', '^belling,.*', '^bhf,.*', '^bigtreetech,.*', '^bitmain,.*', '^blaize,.*', '^blutek,.*', '^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^broadmobi,.*', '^bsh,.*', '^bticino,.*', '^buffalo,.*', '^bur,.*', '^bytedance,.*', '^calamp,.*', '^calao,.*', '^calaosystems,.*', '^calxeda,.*', '^cameo,.*', '^canaan,.*', '^caninos,.*', '^capella,.*', '^cascoda,.*', '^catalyst,.*', '^cavium,.*', '^cct,.*', '^cdns,.*', '^cdtech,.*', '^cellwise,.*', '^ceva,.*', '^chargebyte,.*', '^checkpoint,.*', '^chefree,.*', '^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chongzhou,.*', '^chrontel,.*', '^chrp,.*', '^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', '^cisco,.*', '^clockwork,.*', '^cloos,.*', '^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', '^compulab,.*', '^comvetia,.*', '^congatec,.*', '^coolpi,.*', '^coreriver,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', '^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csot,.*', '^csq,.*', '^ctera,.*', '^ctu,.*', '^cubietech,.*', '^cudy,.*', '^cui,.*', '^cypress,.*', '^cyx,.*', '^cznic,.*', '^dallas,.*', '^dataimage,.*', '^davicom,.*', '^deepcomputing,.*', '^dell,.*', '^delta,.*', '^densitron,.*', '^denx,.*', '^devantech,.*', '^dfi,.*', '^dfrobot,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', '^dimonoff,.*', '^diodes,.*', '^dioo,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', '^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', '^dream,.*', '^ds,.*', '^dserve,.*', '^dynaimage,.*', '^ea,.*', '^ebang,.*', '^ebbg,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', '^econet,.*', '^edgeble,.*', '^edimax,.*', '^edt,.*', '^ees,.*', '^eeti,.*', '^einfochips,.*', '^eink,.*', '^elan,.*', '^element14,.*', '^elgin,.*', '^elida,.*', '^elimo,.*', '^elpida,.*', '^embedfire,.*', '^embest,.*', '^emcraft,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', '^emtrion,.*', '^enclustra,.*', '^endless,.*', '^ene,.*', '^energymicro,.*', '^engicam,.*', '^engleder,.*', '^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^ettus,.*', '^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', '^exar,.*', '^excito,.*', '^exegin,.*', '^ezchip,.*', '^facebook,.*', '^fairchild,.*', '^fairphone,.*', '^faraday,.*', '^fascontek,.*', '^fastrax,.*', '^fcs,.*', '^feixin,.*', '^feiyang,.*', '^fii,.*', '^firefly,.*', '^focaltech,.*', '^forlinx,.*', '^freebox,.*', '^freecom,.*', '^frida,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', '^fxtec,.*', '^galaxycore,.*', '^gameforce,.*', '^gardena,.*', '^gateway,.*', '^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', '^gehc,.*', '^gemei,.*', '^gemtek,.*', '^genesys,.*', '^genexis,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', '^glinet,.*', '^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^gocontroll,.*', '^goldelico,.*', '^goodix,.*', '^google,.*', '^goramo,.*', '^gplus,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', '^hannstar,.*', '^haochuangyi,.*', '^haoyu,.*', '^hardkernel,.*', '^hechuang,.*', '^hideep,.*', '^himax,.*', '^hirschmann,.*', '^hisi,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^holt,.*', '^holtek,.*', '^honestar,.*', '^honeywell,.*', '^hoperf,.*', '^hoperun,.*', '^hp,.*', '^hpe,.*', '^hsg,.*', '^htc,.*', '^huawei,.*', '^hugsun,.*', '^hwacom,.*', '^hxt,.*', '^hycon,.*', '^hydis,.*', '^hynitron,.*', '^hynix,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', '^icplus,.*', '^idt,.*', '^iei,.*', '^ifi,.*', '^ilitek,.*', '^imagis,.*', '^img,.*', '^imi,.*', '^inanbo,.*', '^incircuit,.*', '^indiedroid,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', '^ingenic,.*', '^ingrasys,.*', '^injoinic,.*', '^innocomm,.*', '^innolux,.*', '^inside-secure,.*', '^insignal,.*', '^inspur,.*', '^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inventec,.*', '^inversepath,.*', '^iom,.*', '^irondevice,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^ite,.*', '^itead,.*', '^itian,.*', '^ivo,.*', '^iwave,.*', '^jadard,.*', '^jasonic,.*', '^jdi,.*', '^jedec,.*', '^jenson,.*', '^jesurun,.*', '^jethome,.*', '^jianda,.*', '^jide,.*', '^joz,.*', '^kam,.*', '^karo,.*', '^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', '^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', '^kobo,.*', '^kobol,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kvg,.*', '^kyo,.*', '^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', '^lckfb,.*', '^lctech,.*', '^leadtek,.*', '^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', '^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', '^lincolntech,.*', '^lineartechnology,.*', '^linksprite,.*', '^linksys,.*', '^linutronix,.*', '^linux,.*', '^linx,.*', '^liontron,.*', '^liteon,.*', '^litex,.*', '^lltc,.*', '^logicpd,.*', '^logictechno,.*', '^longcheer,.*', '^lontium,.*', '^loongmasses,.*', '^loongson,.*', '^lsi,.*', '^lunzn,.*', '^luxul,.*', '^lwn,.*', '^lxa,.*', '^m5stack,.*', '^macnica,.*', '^mantix,.*', '^mapleboard,.*', '^marantec,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', '^maxlinear,.*', '^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', '^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', '^mellanox,.*', '^memsensing,.*', '^memsic,.*', '^menlo,.*', '^mentor,.*', '^meraki,.*', '^merrii,.*', '^methode,.*', '^micrel,.*', '^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', '^microsys,.*', '^microtips,.*', '^mikroe,.*', '^mikrotik,.*', '^milkv,.*', '^miniand,.*', '^minix,.*', '^mips,.*', '^miramems,.*', '^mitsubishi,.*', '^mitsumi,.*', '^mixel,.*', '^miyoo,.*', '^mntre,.*', '^mobileye,.*', '^modtronix,.*', '^moortec,.*', '^mosaixtech,.*', '^motorcomm,.*', '^motorola,.*', '^moxa,.*', '^mpl,.*', '^mps,.*', '^mqmaker,.*', '^mrvl,.*', '^mscc,.*', '^msi,.*', '^mstar,.*', '^mti,.*', '^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxic,.*', '^mxicy,.*', '^myir,.*', '^national,.*', '^neardi,.*', '^nec,.*', '^neofidelity,.*', '^neonode,.*', '^netcube,.*', '^netgear,.*', '^netlogic,.*', '^netron-dy,.*', '^netronix,.*', '^netxeon,.*', '^neweast,.*', '^newhaven,.*', '^newvision,.*', '^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nintendo,.*', '^nlt,.*', '^nokia,.*', '^nordic,.*', '^nothing,.*', '^novatek,.*', '^novtech,.*', '^numonyx,.*', '^nutsboard,.*', '^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', '^ocs,.*', '^oct,.*', '^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^oneplus,.*', '^onie,.*', '^onion,.*', '^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^openailab,.*', '^opencores,.*', '^openembed,.*', '^openpandora,.*', '^openrisc,.*', '^openwrt,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', '^ortustech,.*', '^osddisplays,.*', '^osmc,.*', '^ouya,.*', '^overkiz,.*', '^ovti,.*', '^oxsemi,.*', '^ozzmaker,.*', '^panasonic,.*', '^parade,.*', '^parallax,.*', '^pda,.*', '^pegatron,.*', '^pericom,.*', '^pervasive,.*', '^phicomm,.*', '^phytec,.*', '^picochip,.*', '^pinctrl-[0-9]+$', '^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', '^plathome,.*', '^plda,.*', '^plx,.*', '^ply,.*', '^pni,.*', '^pocketbook,.*', '^polaroid,.*', '^polyhex,.*', '^portwell,.*', '^poslab,.*', '^pov,.*', '^powertip,.*', '^powervr,.*', '^powkiddy,.*', '^pri,.*', '^primeview,.*', '^primux,.*', '^probox2,.*', '^prt,.*', '^pulsedlight,.*', '^purism,.*', '^puya,.*', '^qca,.*', '^qcom,.*', '^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qishenglong,.*', '^qnap,.*', '^quanta,.*', '^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', '^raspberrypi,.*', '^raydium,.*', '^rda,.*', '^realtek,.*', '^relfor,.*', '^remarkable,.*', '^renesas,.*', '^rervision,.*', '^retronix,.*', '^revotics,.*', '^rex,.*', '^richtek,.*', '^ricoh,.*', '^rikomagic,.*', '^riot,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', '^rohm,.*', '^ronbo,.*', '^roofull,.*', '^roseapplepi,.*', '^rve,.*', '^saef,.*', '^samsung,.*', '^samtec,.*', '^sancloud,.*', '^sandisk,.*', '^satoz,.*', '^sbs,.*', '^schindler,.*', '^schneider,.*', '^sciosense,.*', '^seagate,.*', '^seeed,.*', '^seirobotics,.*', '^semtech,.*', '^senseair,.*', '^sensirion,.*', '^sensortek,.*', '^sercomm,.*', '^sff,.*', '^sgd,.*', '^sgmicro,.*', '^sgx,.*', '^sharp,.*', '^shift,.*', '^shimafuji,.*', '^shineworld,.*', '^shiratech,.*', '^si-en,.*', '^si-linux,.*', '^siemens,.*', '^sifive,.*', '^siflower,.*', '^sigma,.*', '^sii,.*', '^sil,.*', '^silabs,.*', '^silan,.*', '^silead,.*', '^silergy,.*', '^silex-insight,.*', '^siliconfile,.*', '^siliconmitus,.*', '^silvaco,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', '^sinowealth,.*', '^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skov,.*', '^skyworks,.*', '^smartlabs,.*', '^smartrg,.*', '^smi,.*', '^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', '^solomon,.*', '^sony,.*', '^sophgo,.*', '^sourceparts,.*', '^spacemit,.*', '^spansion,.*', '^sparkfun,.*', '^spinalhdl,.*', '^sprd,.*', '^square,.*', '^ssi,.*', '^sst,.*', '^sstar,.*', '^st,.*', '^st-ericsson,.*', '^starfive,.*', '^starry,.*', '^startek,.*', '^starterkit,.*', '^ste,.*', '^stericsson,.*', '^storlink,.*', '^storm,.*', '^storopack,.*', '^summit,.*', '^sunchip,.*', '^sundance,.*', '^sunplus,.*', '^supermicro,.*', '^swir,.*', '^syna,.*', '^synology,.*', '^synopsys,.*', '^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^tcs,.*', '^tcu,.*', '^tdo,.*', '^team-source-display,.*', '^technexion,.*', '^technologic,.*', '^techstar,.*', '^techwell,.*', '^teejet,.*', '^teltonika,.*', '^tempo,.*', '^terasic,.*', '^tesla,.*', '^test,.*', '^tfc,.*', '^thead,.*', '^thine,.*', '^thingyjp,.*', '^thundercomm,.*', '^thwc,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', '^topeet,.*', '^topic,.*', '^topland,.*', '^toppoly,.*', '^topwise,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', '^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^transpeed,.*', '^traverse,.*', '^tronfy,.*', '^tronsmart,.*', '^truly,.*', '^tsd,.*', '^turing,.*', '^tyan,.*', '^tyhx,.*', '^u-blox,.*', '^u-boot,.*', '^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^ufispace,.*', '^ugoos,.*', '^ultratronik,.*', '^uni-t,.*', '^uniwest,.*', '^upisemi,.*', '^urt,.*', '^usi,.*', '^usr,.*', '^utoo,.*', '^v3,.*', '^vaisala,.*', '^vamrs,.*', '^variscite,.*', '^vdl,.*', '^vertexcom,.*', '^via,.*', '^vialab,.*', '^vicor,.*', '^videostrong,.*', '^virtio,.*', '^virtual,.*', '^vishay,.*', '^visionox,.*', '^vitesse,.*', '^vivante,.*', '^vivax,.*', '^vocore,.*', '^voipac,.*', '^voltafield,.*', '^vot,.*', '^vscom,.*', '^vxt,.*', '^wacom,.*', '^wanchanglong,.*', '^wand,.*', '^waveshare,.*', '^wd,.*', '^we,.*', '^welltech,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', '^widora,.*', '^wiligear,.*', '^willsemi,.*', '^winbond,.*', '^wingtech,.*', '^winlink,.*', '^winsen,.*', '^winstar,.*', '^wirelesstag,.*', '^wits,.*', '^wlf,.*', '^wm,.*', '^wobo,.*', '^wolfvision,.*', '^x-powers,.*', '^xen,.*', '^xes,.*', '^xiaomi,.*', '^xillybus,.*', '^xingbangda,.*', '^xinpeng,.*', '^xiphera,.*', '^xlnx,.*', '^xnano,.*', '^xunlong,.*', '^xylon,.*', '^yadro,.*', '^yamaha,.*', '^yes-optoelectronics,.*', '^yic,.*', '^yiming,.*', '^ylm,.*', '^yna,.*', '^yones-toptech,.*', '^ys,.*', '^ysoft,.*', '^yuridenki,.*', '^yuzukihd,.*', '^zarlink,.*', '^zealz,.*', '^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zinitix,.*', '^zkmagic,.*', '^zte,.*', '^zyxel,.*' from schema $id: http://devicetree.org/schemas/vendor-prefixes.yaml# /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.example.dtb: dwc3@50480000 (snps,dwc3): $nodename:0: 'dwc3@50480000' does not match '^usb(@.*)?' from schema $id: http://devicetree.org/schemas/usb/snps,dwc3.yaml# /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.example.dtb: dwc3@50480000 (snps,dwc3): 'eswin,hsp_sp_csr' does not match any of the regexes: '^#.*', '^(at25|bm|devbus|dmacap|dsa|exynos|fsi[ab]|gpio-fan|gpio-key|gpio|gpmc|hdmi|i2c-gpio),.*', '^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', '^(pciclass|pinctrl-single|#pinctrl-single|PowerPC),.*', '^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', '^(simple-audio-card|st-plgpio|st-spics|ts),.*', '^100ask,.*', '^70mai,.*', '^8dev,.*', '^GEFanuc,.*', '^IBM,.*', '^ORCL,.*', '^SUNW,.*', '^[a-zA-Z0-9#_][a-zA-Z0-9+\\-._@]{0,63}$', '^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abb,.*', '^abilis,.*', '^abracon,.*', '^abt,.*', '^acbel,.*', '^acelink,.*', '^acer,.*', '^acme,.*', '^actions,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', '^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^adieng,.*', '^admatec,.*', '^advantech,.*', '^aeroflexgaisler,.*', '^aesop,.*', '^airoha,.*', '^al,.*', '^alcatel,.*', '^aldec,.*', '^alfa-network,.*', '^allegro,.*', '^allegromicro,.*', '^alliedvision,.*', '^allo,.*', '^allwinner,.*', '^alphascale,.*', '^alps,.*', '^alt,.*', '^altr,.*', '^amarula,.*', '^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', '^ampere,.*', '^amphenol,.*', '^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^anbernic,.*', '^andestech,.*', '^anvo,.*', '^aoly,.*', '^aosong,.*', '^apm,.*', '^apple,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', '^arcom,.*', '^arctic,.*', '^arcx,.*', '^ariaboard,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', '^armsom,.*', '^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^asc,.*', '^asix,.*', '^aspeed,.*', '^asrock,.*', '^asteralabs,.*', '^asus,.*', '^atheros,.*', '^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', '^avia,.*', '^avic,.*', '^avnet,.*', '^awinic,.*', '^axentia,.*', '^axis,.*', '^azoteq,.*', '^azw,.*', '^baikal,.*', '^bananapi,.*', '^beacon,.*', '^beagle,.*', '^belling,.*', '^bhf,.*', '^bigtreetech,.*', '^bitmain,.*', '^blaize,.*', '^blutek,.*', '^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^broadmobi,.*', '^bsh,.*', '^bticino,.*', '^buffalo,.*', '^bur,.*', '^bytedance,.*', '^calamp,.*', '^calao,.*', '^calaosystems,.*', '^calxeda,.*', '^cameo,.*', '^canaan,.*', '^caninos,.*', '^capella,.*', '^cascoda,.*', '^catalyst,.*', '^cavium,.*', '^cct,.*', '^cdns,.*', '^cdtech,.*', '^cellwise,.*', '^ceva,.*', '^chargebyte,.*', '^checkpoint,.*', '^chefree,.*', '^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chongzhou,.*', '^chrontel,.*', '^chrp,.*', '^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', '^cisco,.*', '^clockwork,.*', '^cloos,.*', '^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', '^compulab,.*', '^comvetia,.*', '^congatec,.*', '^coolpi,.*', '^coreriver,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', '^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csot,.*', '^csq,.*', '^ctera,.*', '^ctu,.*', '^cubietech,.*', '^cudy,.*', '^cui,.*', '^cypress,.*', '^cyx,.*', '^cznic,.*', '^dallas,.*', '^dataimage,.*', '^davicom,.*', '^deepcomputing,.*', '^dell,.*', '^delta,.*', '^densitron,.*', '^denx,.*', '^devantech,.*', '^dfi,.*', '^dfrobot,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', '^dimonoff,.*', '^diodes,.*', '^dioo,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', '^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', '^dream,.*', '^ds,.*', '^dserve,.*', '^dynaimage,.*', '^ea,.*', '^ebang,.*', '^ebbg,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', '^econet,.*', '^edgeble,.*', '^edimax,.*', '^edt,.*', '^ees,.*', '^eeti,.*', '^einfochips,.*', '^eink,.*', '^elan,.*', '^element14,.*', '^elgin,.*', '^elida,.*', '^elimo,.*', '^elpida,.*', '^embedfire,.*', '^embest,.*', '^emcraft,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', '^emtrion,.*', '^enclustra,.*', '^endless,.*', '^ene,.*', '^energymicro,.*', '^engicam,.*', '^engleder,.*', '^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^ettus,.*', '^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', '^exar,.*', '^excito,.*', '^exegin,.*', '^ezchip,.*', '^facebook,.*', '^fairchild,.*', '^fairphone,.*', '^faraday,.*', '^fascontek,.*', '^fastrax,.*', '^fcs,.*', '^feixin,.*', '^feiyang,.*', '^fii,.*', '^firefly,.*', '^focaltech,.*', '^forlinx,.*', '^freebox,.*', '^freecom,.*', '^frida,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', '^fxtec,.*', '^galaxycore,.*', '^gameforce,.*', '^gardena,.*', '^gateway,.*', '^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', '^gehc,.*', '^gemei,.*', '^gemtek,.*', '^genesys,.*', '^genexis,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', '^glinet,.*', '^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^gocontroll,.*', '^goldelico,.*', '^goodix,.*', '^google,.*', '^goramo,.*', '^gplus,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', '^hannstar,.*', '^haochuangyi,.*', '^haoyu,.*', '^hardkernel,.*', '^hechuang,.*', '^hideep,.*', '^himax,.*', '^hirschmann,.*', '^hisi,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^holt,.*', '^holtek,.*', '^honestar,.*', '^honeywell,.*', '^hoperf,.*', '^hoperun,.*', '^hp,.*', '^hpe,.*', '^hsg,.*', '^htc,.*', '^huawei,.*', '^hugsun,.*', '^hwacom,.*', '^hxt,.*', '^hycon,.*', '^hydis,.*', '^hynitron,.*', '^hynix,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', '^icplus,.*', '^idt,.*', '^iei,.*', '^ifi,.*', '^ilitek,.*', '^imagis,.*', '^img,.*', '^imi,.*', '^inanbo,.*', '^incircuit,.*', '^indiedroid,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', '^ingenic,.*', '^ingrasys,.*', '^injoinic,.*', '^innocomm,.*', '^innolux,.*', '^inside-secure,.*', '^insignal,.*', '^inspur,.*', '^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inventec,.*', '^inversepath,.*', '^iom,.*', '^irondevice,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^ite,.*', '^itead,.*', '^itian,.*', '^ivo,.*', '^iwave,.*', '^jadard,.*', '^jasonic,.*', '^jdi,.*', '^jedec,.*', '^jenson,.*', '^jesurun,.*', '^jethome,.*', '^jianda,.*', '^jide,.*', '^joz,.*', '^kam,.*', '^karo,.*', '^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', '^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', '^kobo,.*', '^kobol,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kvg,.*', '^kyo,.*', '^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', '^lckfb,.*', '^lctech,.*', '^leadtek,.*', '^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', '^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', '^lincolntech,.*', '^lineartechnology,.*', '^linksprite,.*', '^linksys,.*', '^linutronix,.*', '^linux,.*', '^linx,.*', '^liontron,.*', '^liteon,.*', '^litex,.*', '^lltc,.*', '^logicpd,.*', '^logictechno,.*', '^longcheer,.*', '^lontium,.*', '^loongmasses,.*', '^loongson,.*', '^lsi,.*', '^lunzn,.*', '^luxul,.*', '^lwn,.*', '^lxa,.*', '^m5stack,.*', '^macnica,.*', '^mantix,.*', '^mapleboard,.*', '^marantec,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', '^maxlinear,.*', '^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', '^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', '^mellanox,.*', '^memsensing,.*', '^memsic,.*', '^menlo,.*', '^mentor,.*', '^meraki,.*', '^merrii,.*', '^methode,.*', '^micrel,.*', '^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', '^microsys,.*', '^microtips,.*', '^mikroe,.*', '^mikrotik,.*', '^milkv,.*', '^miniand,.*', '^minix,.*', '^mips,.*', '^miramems,.*', '^mitsubishi,.*', '^mitsumi,.*', '^mixel,.*', '^miyoo,.*', '^mntre,.*', '^mobileye,.*', '^modtronix,.*', '^moortec,.*', '^mosaixtech,.*', '^motorcomm,.*', '^motorola,.*', '^moxa,.*', '^mpl,.*', '^mps,.*', '^mqmaker,.*', '^mrvl,.*', '^mscc,.*', '^msi,.*', '^mstar,.*', '^mti,.*', '^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxic,.*', '^mxicy,.*', '^myir,.*', '^national,.*', '^neardi,.*', '^nec,.*', '^neofidelity,.*', '^neonode,.*', '^netcube,.*', '^netgear,.*', '^netlogic,.*', '^netron-dy,.*', '^netronix,.*', '^netxeon,.*', '^neweast,.*', '^newhaven,.*', '^newvision,.*', '^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nintendo,.*', '^nlt,.*', '^nokia,.*', '^nordic,.*', '^nothing,.*', '^novatek,.*', '^novtech,.*', '^numonyx,.*', '^nutsboard,.*', '^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', '^ocs,.*', '^oct,.*', '^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^oneplus,.*', '^onie,.*', '^onion,.*', '^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^openailab,.*', '^opencores,.*', '^openembed,.*', '^openpandora,.*', '^openrisc,.*', '^openwrt,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', '^ortustech,.*', '^osddisplays,.*', '^osmc,.*', '^ouya,.*', '^overkiz,.*', '^ovti,.*', '^oxsemi,.*', '^ozzmaker,.*', '^panasonic,.*', '^parade,.*', '^parallax,.*', '^pda,.*', '^pegatron,.*', '^pericom,.*', '^pervasive,.*', '^phicomm,.*', '^phytec,.*', '^picochip,.*', '^pinctrl-[0-9]+$', '^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', '^plathome,.*', '^plda,.*', '^plx,.*', '^ply,.*', '^pni,.*', '^pocketbook,.*', '^polaroid,.*', '^polyhex,.*', '^portwell,.*', '^poslab,.*', '^pov,.*', '^powertip,.*', '^powervr,.*', '^powkiddy,.*', '^pri,.*', '^primeview,.*', '^primux,.*', '^probox2,.*', '^prt,.*', '^pulsedlight,.*', '^purism,.*', '^puya,.*', '^qca,.*', '^qcom,.*', '^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qishenglong,.*', '^qnap,.*', '^quanta,.*', '^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', '^raspberrypi,.*', '^raydium,.*', '^rda,.*', '^realtek,.*', '^relfor,.*', '^remarkable,.*', '^renesas,.*', '^rervision,.*', '^retronix,.*', '^revotics,.*', '^rex,.*', '^richtek,.*', '^ricoh,.*', '^rikomagic,.*', '^riot,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', '^rohm,.*', '^ronbo,.*', '^roofull,.*', '^roseapplepi,.*', '^rve,.*', '^saef,.*', '^samsung,.*', '^samtec,.*', '^sancloud,.*', '^sandisk,.*', '^satoz,.*', '^sbs,.*', '^schindler,.*', '^schneider,.*', '^sciosense,.*', '^seagate,.*', '^seeed,.*', '^seirobotics,.*', '^semtech,.*', '^senseair,.*', '^sensirion,.*', '^sensortek,.*', '^sercomm,.*', '^sff,.*', '^sgd,.*', '^sgmicro,.*', '^sgx,.*', '^sharp,.*', '^shift,.*', '^shimafuji,.*', '^shineworld,.*', '^shiratech,.*', '^si-en,.*', '^si-linux,.*', '^siemens,.*', '^sifive,.*', '^siflower,.*', '^sigma,.*', '^sii,.*', '^sil,.*', '^silabs,.*', '^silan,.*', '^silead,.*', '^silergy,.*', '^silex-insight,.*', '^siliconfile,.*', '^siliconmitus,.*', '^silvaco,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', '^sinowealth,.*', '^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skov,.*', '^skyworks,.*', '^smartlabs,.*', '^smartrg,.*', '^smi,.*', '^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', '^solomon,.*', '^sony,.*', '^sophgo,.*', '^sourceparts,.*', '^spacemit,.*', '^spansion,.*', '^sparkfun,.*', '^spinalhdl,.*', '^sprd,.*', '^square,.*', '^ssi,.*', '^sst,.*', '^sstar,.*', '^st,.*', '^st-ericsson,.*', '^starfive,.*', '^starry,.*', '^startek,.*', '^starterkit,.*', '^ste,.*', '^stericsson,.*', '^storlink,.*', '^storm,.*', '^storopack,.*', '^summit,.*', '^sunchip,.*', '^sundance,.*', '^sunplus,.*', '^supermicro,.*', '^swir,.*', '^syna,.*', '^synology,.*', '^synopsys,.*', '^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^tcs,.*', '^tcu,.*', '^tdo,.*', '^team-source-display,.*', '^technexion,.*', '^technologic,.*', '^techstar,.*', '^techwell,.*', '^teejet,.*', '^teltonika,.*', '^tempo,.*', '^terasic,.*', '^tesla,.*', '^test,.*', '^tfc,.*', '^thead,.*', '^thine,.*', '^thingyjp,.*', '^thundercomm,.*', '^thwc,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', '^topeet,.*', '^topic,.*', '^topland,.*', '^toppoly,.*', '^topwise,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', '^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^transpeed,.*', '^traverse,.*', '^tronfy,.*', '^tronsmart,.*', '^truly,.*', '^tsd,.*', '^turing,.*', '^tyan,.*', '^tyhx,.*', '^u-blox,.*', '^u-boot,.*', '^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^ufispace,.*', '^ugoos,.*', '^ultratronik,.*', '^uni-t,.*', '^uniwest,.*', '^upisemi,.*', '^urt,.*', '^usi,.*', '^usr,.*', '^utoo,.*', '^v3,.*', '^vaisala,.*', '^vamrs,.*', '^variscite,.*', '^vdl,.*', '^vertexcom,.*', '^via,.*', '^vialab,.*', '^vicor,.*', '^videostrong,.*', '^virtio,.*', '^virtual,.*', '^vishay,.*', '^visionox,.*', '^vitesse,.*', '^vivante,.*', '^vivax,.*', '^vocore,.*', '^voipac,.*', '^voltafield,.*', '^vot,.*', '^vscom,.*', '^vxt,.*', '^wacom,.*', '^wanchanglong,.*', '^wand,.*', '^waveshare,.*', '^wd,.*', '^we,.*', '^welltech,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', '^widora,.*', '^wiligear,.*', '^willsemi,.*', '^winbond,.*', '^wingtech,.*', '^winlink,.*', '^winsen,.*', '^winstar,.*', '^wirelesstag,.*', '^wits,.*', '^wlf,.*', '^wm,.*', '^wobo,.*', '^wolfvision,.*', '^x-powers,.*', '^xen,.*', '^xes,.*', '^xiaomi,.*', '^xillybus,.*', '^xingbangda,.*', '^xinpeng,.*', '^xiphera,.*', '^xlnx,.*', '^xnano,.*', '^xunlong,.*', '^xylon,.*', '^yadro,.*', '^yamaha,.*', '^yes-optoelectronics,.*', '^yic,.*', '^yiming,.*', '^ylm,.*', '^yna,.*', '^yones-toptech,.*', '^ys,.*', '^ysoft,.*', '^yuridenki,.*', '^yuzukihd,.*', '^zarlink,.*', '^zealz,.*', '^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zinitix,.*', '^zkmagic,.*', '^zte,.*', '^zyxel,.*' from schema $id: http://devicetree.org/schemas/vendor-prefixes.yaml# doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250516095338.1467-1-zhangsenchuan@eswincomputing.com The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 Usb controller 2025-05-16 9:53 ` [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 " zhangsenchuan 2025-05-16 11:26 ` Rob Herring (Arm) @ 2025-05-19 6:24 ` Krzysztof Kozlowski 1 sibling, 0 replies; 9+ messages in thread From: Krzysztof Kozlowski @ 2025-05-19 6:24 UTC (permalink / raw) To: zhangsenchuan Cc: gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel, ningyu, linmin, yangwei1 On Fri, May 16, 2025 at 05:53:37PM GMT, zhangsenchuan@eswincomputing.com wrote: > From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > > Add Device Tree binding documentation for the ESWIN EIC7700 > usb controller module. > > Co-developed-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > --- > .../bindings/usb/eswin,eic7700-usb.yaml | 120 ++++++++++++++++++ > 1 file changed, 120 insertions(+) > create mode 100644 Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml > > diff --git a/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml b/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml > new file mode 100644 > index 000000000000..eb8260069b99 > --- /dev/null > +++ b/Documentation/devicetree/bindings/usb/eswin,eic7700-usb.yaml > @@ -0,0 +1,120 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/usb/eswin,eic7700-usb.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Eswin EIC7700 SoC Usb Controller > + > +maintainers: > + - Wei Yang <yangwei1@eswincomputing.com> > + - Senchuan Zhang <zhangsenchuan@eswincomputing.com> > + > +description: | > + The Usb controller on EIC7700 SoC. > + > +properties: > + compatible: > + const: eswin,eic7700-usb > + > + reg: > + maxItems: 3 > + > + interrupts: > + maxItems: 1 > + > + interrupt-names: > + items: > + - const: peripheral > + > + clocks: > + maxItems: 3 > + description: handles to clock for the usb controller. Useless description, drop. Do not explain what DT syntax is. > + > + clock-names: > + items: > + - const: suspend > + - const: aclk > + - const: cfg_clk > + description: the name of each clock. Drop description. > + > + resets: > + description: resets to be used by the controller. Missing constraints. > + > + reset-names: > + items: > + - const: vaux > + description: names of the resets listed in resets property in the same order. Drop description. > + > + eswin,hsp_sp_csr: DTS coding style > + description: | Drop | > + High-speed equipment control register. For what purpose? > + $ref: /schemas/types.yaml#/definitions/phandle-array Missing constraints. > + > + ranges: true > + > + dma-noncoherent: true > + > + numa-node-id: > + maximum: 0 Huh? What is the point of this if this is fixed to 0? There is no way this passes any tests. Please look at writing-schema docs. > + > +required: > + - compatible > + - reg > + - interrupts > + - interrupt-names > + - interrupt-parent > + - clocks > + - clock-names > + - resets > + - reset-names > + - eswin,hsp_sp_csr > + - dma-noncoherent > + - ranges > + - numa-node-id > + > +additionalProperties: false > + > +examples: > + - | > + usb { > + #address-cells = <2>; > + #size-cells = <2>; > + > + usbdrd3_0: usb0{ usb, missing space, drop unused label > + compatible = "eswin,eic7700-dwc3"; > + #address-cells = <2>; > + #size-cells = <2>; Order properties according to DTS coding style > + clocks = <&clock 270>, > + <&clock 545>, > + <&clock 546>; > + clock-names = "suspend","aclk", "cfg_clk"; > + eswin,hsp_sp_csr = <&hsp_sp_csr 0x800 0x808 0x83c 0x840>; > + resets = <&reset 0x07 (1 << 15)>; > + reset-names = "vaux"; > + ranges; > + numa-node-id = <0>; > + status = "disabled"; No. You cannot make it disable and it makes no sense. > + usbdrd_dwc3_0: dwc3@50480000 { Node names should be generic. See also an explanation and list of examples (not exhaustive) in DT specification: https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation Fold the child node into the parent. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver 2025-05-16 9:52 [PATCH v1 0/2] Add driver support for Eswin eic7700 SoC Usb controller zhangsenchuan 2025-05-16 9:53 ` [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 " zhangsenchuan @ 2025-05-16 9:54 ` zhangsenchuan 2025-05-16 12:50 ` Krzysztof Kozlowski ` (3 more replies) 1 sibling, 4 replies; 9+ messages in thread From: zhangsenchuan @ 2025-05-16 9:54 UTC (permalink / raw) To: gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: ningyu, linmin, yangwei1, Senchuan Zhang From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> Add the eic7700 usb driver, which is responsible for identifying,configuring and connecting usb devices,and provides interfaces for accessing these devices. Co-developed-by: Wei Yang <yangwei1@eswincomputing.com> Signed-off-by: Wei Yang <yangwei1@eswincomputing.com> Signed-off-by: Senchuan Zhang <zhangsenchuan@eswincomputing.com> --- drivers/usb/dwc3/Kconfig | 11 + drivers/usb/dwc3/Makefile | 1 + drivers/usb/dwc3/dwc3-eic7700.c | 605 ++++++++++++++++++++++++++++++++ 3 files changed, 617 insertions(+) create mode 100644 drivers/usb/dwc3/dwc3-eic7700.c diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig index 310d182e10b5..19657cfb5d08 100644 --- a/drivers/usb/dwc3/Kconfig +++ b/drivers/usb/dwc3/Kconfig @@ -189,4 +189,15 @@ config USB_DWC3_RTK or dual-role mode. Say 'Y' or 'M' if you have such device. +config USB_DWC3_EIC7700 + tristate "Eswin Platforms" + depends on OF + depends on USB=y || USB=USB_DWC3 + default USB_DWC3 + help + The usb controller on eic7700 SoC. + support of USB2/3 functionality + in Eswin platforms. + say 'Y' or 'M' if you have one such device. + endif diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile index 124eda2522d9..b1fc066dd92e 100644 --- a/drivers/usb/dwc3/Makefile +++ b/drivers/usb/dwc3/Makefile @@ -56,3 +56,4 @@ obj-$(CONFIG_USB_DWC3_IMX8MP) += dwc3-imx8mp.o obj-$(CONFIG_USB_DWC3_XILINX) += dwc3-xilinx.o obj-$(CONFIG_USB_DWC3_OCTEON) += dwc3-octeon.o obj-$(CONFIG_USB_DWC3_RTK) += dwc3-rtk.o +obj-$(CONFIG_USB_DWC3_EIC7700) += dwc3-eic7700.o diff --git a/drivers/usb/dwc3/dwc3-eic7700.c b/drivers/usb/dwc3/dwc3-eic7700.c new file mode 100644 index 000000000000..872c0374be0f --- /dev/null +++ b/drivers/usb/dwc3/dwc3-eic7700.c @@ -0,0 +1,605 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Eswin Specific Glue layer + * + * Copyright 2024, Beijing ESWIN Computing Technology Co., Ltd.. All rights reserved. + * + * Authors: Wei Yang <yangwei1@eswincomputing.com> + * Senchuan Zhang <zhangsenchuan@eswincomputing.com> + */ + +#include <linux/async.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/kernel.h> +#include <linux/slab.h> +#include <linux/platform_device.h> +#include <linux/dma-mapping.h> +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/pm_runtime.h> +#include <linux/extcon.h> +#include <linux/freezer.h> +#include <linux/iopoll.h> +#include <linux/reset.h> +#include <linux/usb.h> +#include <linux/pm.h> +#include <linux/usb/hcd.h> +#include <linux/usb/ch9.h> +#include <linux/extcon-provider.h> +#include <linux/mfd/syscon.h> +#include <linux/bitfield.h> +#include <linux/regmap.h> +#include <linux/gpio/consumer.h> +#include "core.h" +#include "io.h" + +#define HSP_USB_VBUS_FSEL 0x2a +#define HSP_USB_MPLL_DEFAULT 0x0 + +#define HSP_USB_BUS_FILTER_EN (0x1 << 0) +#define HSP_USB_BUS_CLKEN_GM (0x1 << 9) +#define HSP_USB_BUS_CLKEN_GS (0x1 << 16) +#define HSP_USB_BUS_SW_RST (0x1 << 24) +#define HSP_USB_BUS_CLK_EN (0x1 << 28) + +#define HSP_USB_AXI_LP_XM_CSYSREQ (0x1 << 0) +#define HSP_USB_AXI_LP_XS_CSYSREQ (0x1 << 16) + +struct dwc3_eswin { + int num_clocks; + bool connected; + bool suspended; + bool force_mode; + bool is_phy_on; + struct device *dev; + struct clk **clks; + struct dwc3 *dwc; + struct extcon_dev *edev; + struct usb_hcd *hcd; + struct notifier_block device_nb; + struct notifier_block host_nb; + struct work_struct otg_work; + struct mutex lock; + struct reset_control *vaux_rst; + struct device *child_dev; + enum usb_role new_usb_role; + struct gpio_desc *hub_gpio; +}; + +static ssize_t dwc3_mode_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(device); + struct dwc3 *dwc = eswin->dwc; + int ret; + + switch (dwc->current_dr_role) { + case USB_DR_MODE_HOST: + ret = sprintf(buf, "host\n"); + break; + case USB_DR_MODE_PERIPHERAL: + ret = sprintf(buf, "peripheral\n"); + break; + case USB_DR_MODE_OTG: + ret = sprintf(buf, "otg\n"); + break; + default: + ret = sprintf(buf, "UNKNOWN\n"); + } + + return ret; +} + +static ssize_t dwc3_mode_store(struct device *device, + struct device_attribute *attr, const char *buf, + size_t count) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(device); + struct dwc3 *dwc = eswin->dwc; + enum usb_role new_role; + struct usb_role_switch *role_sw = dwc->role_sw; + + if (!strncmp(buf, "1", 1) || !strncmp(buf, "host", 4)) { + new_role = USB_ROLE_HOST; + } else if (!strncmp(buf, "0", 1) || !strncmp(buf, "peripheral", 10)) { + new_role = USB_ROLE_DEVICE; + } else { + dev_info(eswin->dev, "illegal dr_mode\n"); + return count; + } + eswin->force_mode = true; + + mutex_lock(&eswin->lock); + usb_role_switch_set_role(role_sw, new_role); + mutex_unlock(&eswin->lock); + + return count; +} + +static DEVICE_ATTR_RW(dwc3_mode); + +static ssize_t dwc3_hub_rst_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(device); + + if (!IS_ERR(eswin->hub_gpio)) + return sprintf(buf, "%d", gpiod_get_raw_value(eswin->hub_gpio)); + + return sprintf(buf, "UNKONWN"); +} + +static ssize_t dwc3_hub_rst_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(device); + + if (!IS_ERR(eswin->hub_gpio)) { + if (!strncmp(buf, "0", 1)) + gpiod_set_raw_value(eswin->hub_gpio, 0); + else + gpiod_set_raw_value(eswin->hub_gpio, 1); + } + + return count; +} + +static DEVICE_ATTR_RW(dwc3_hub_rst); + +static struct attribute *dwc3_eswin_attrs[] = { + &dev_attr_dwc3_mode.attr, + &dev_attr_dwc3_hub_rst.attr, + NULL, +}; + +static struct attribute_group dwc3_eswin_attr_group = { + .name = NULL, /* we want them in the same directory */ + .attrs = dwc3_eswin_attrs, +}; + +static int dwc3_eswin_device_notifier(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct dwc3_eswin *eswin = + container_of(nb, struct dwc3_eswin, device_nb); + + mutex_lock(&eswin->lock); + eswin->new_usb_role = USB_ROLE_DEVICE; + mutex_unlock(&eswin->lock); + if (!eswin->suspended) + schedule_work(&eswin->otg_work); + + return NOTIFY_DONE; +} + +static int dwc3_eswin_host_notifier(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct dwc3_eswin *eswin = container_of(nb, struct dwc3_eswin, host_nb); + + mutex_lock(&eswin->lock); + eswin->new_usb_role = USB_ROLE_HOST; + mutex_unlock(&eswin->lock); + if (!eswin->suspended) + schedule_work(&eswin->otg_work); + + return NOTIFY_DONE; +} + +static void dwc3_eswin_otg_extcon_evt_work(struct work_struct *work) +{ + struct dwc3_eswin *eswin = + container_of(work, struct dwc3_eswin, otg_work); + struct usb_role_switch *role_sw = eswin->dwc->role_sw; + + if (true == eswin->force_mode) + return; + mutex_lock(&eswin->lock); + usb_role_switch_set_role(role_sw, eswin->new_usb_role); + mutex_unlock(&eswin->lock); +} + +static int dwc3_eswin_get_extcon_dev(struct dwc3_eswin *eswin) +{ + struct device *dev = eswin->dev; + struct extcon_dev *edev; + s32 ret = 0; + + if (device_property_read_bool(dev, "extcon")) { + edev = extcon_get_edev_by_phandle(dev, 0); + if (IS_ERR(edev)) { + if (PTR_ERR(edev) != -EPROBE_DEFER) + dev_err(dev, "couldn't get extcon device\n"); + return PTR_ERR(edev); + } + eswin->edev = edev; + eswin->device_nb.notifier_call = dwc3_eswin_device_notifier; + ret = devm_extcon_register_notifier(dev, edev, EXTCON_USB, + &eswin->device_nb); + if (ret < 0) + dev_err(dev, "failed to register notifier for USB\n"); + + eswin->host_nb.notifier_call = dwc3_eswin_host_notifier; + ret = devm_extcon_register_notifier(dev, edev, EXTCON_USB_HOST, + &eswin->host_nb); + if (ret < 0) + dev_err(dev, + "failed to register notifier for USB-HOST\n"); + } + + return 0; +} + +static int __init dwc3_eswin_deassert(struct dwc3_eswin *eswin) +{ + int rc; + + if (eswin->vaux_rst) { + rc = reset_control_deassert(eswin->vaux_rst); + WARN_ON(rc != 0); + } + + return 0; +} + +static int dwc3_eswin_assert(struct dwc3_eswin *eswin) +{ + int rc = 0; + + if (eswin->vaux_rst) { + rc = reset_control_assert(eswin->vaux_rst); + WARN_ON(rc != 0); + } + + return 0; +} + +static int dwc_usb_clk_init(struct device *dev) +{ + struct regmap *regmap; + u32 hsp_usb_bus; + u32 hsp_usb_axi_lp; + u32 hsp_usb_vbus_freq; + u32 hsp_usb_mpll; + int ret; + + regmap = syscon_regmap_lookup_by_phandle(dev->of_node, + "eswin,hsp_sp_csr"); + if (IS_ERR(regmap)) { + dev_dbg(dev, "No hsp_sp_csr phandle specified\n"); + return -1; + } + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 1, + &hsp_usb_bus); + if (ret) { + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); + return ret; + } + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 2, + &hsp_usb_axi_lp); + if (ret) { + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); + return ret; + } + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 3, + &hsp_usb_vbus_freq); + if (ret) { + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); + return ret; + } + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 4, + &hsp_usb_mpll); + if (ret) { + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); + return ret; + } + + /* + * usb1 clock init + * ref clock is 24M, below need to be set to satisfy usb phy requirement(125M) + */ + regmap_write(regmap, hsp_usb_vbus_freq, HSP_USB_VBUS_FSEL); + regmap_write(regmap, hsp_usb_mpll, HSP_USB_MPLL_DEFAULT); + /* + * reset usb core and usb phy + */ + regmap_write(regmap, hsp_usb_bus, + HSP_USB_BUS_FILTER_EN | HSP_USB_BUS_CLKEN_GM | + HSP_USB_BUS_CLKEN_GS | HSP_USB_BUS_SW_RST | + HSP_USB_BUS_CLK_EN); + regmap_write(regmap, hsp_usb_axi_lp, + HSP_USB_AXI_LP_XM_CSYSREQ | HSP_USB_AXI_LP_XS_CSYSREQ); + + return 0; +} + +static int dwc3_eswin_probe(struct platform_device *pdev) +{ + struct dwc3_eswin *eswin; + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node, *child; + struct platform_device *child_pdev; + unsigned int count; + int ret; + int i; + int err_desc = 0; + + eswin = devm_kzalloc(dev, sizeof(*eswin), GFP_KERNEL); + if (!eswin) + return -ENOMEM; + eswin->hub_gpio = devm_gpiod_get(dev, "hub-rst", GPIOD_OUT_HIGH); + err_desc = IS_ERR(eswin->hub_gpio); + + if (!err_desc) + gpiod_set_raw_value(eswin->hub_gpio, 1); + + count = of_clk_get_parent_count(np); + if (!count) + return -ENOENT; + + eswin->num_clocks = count; + eswin->force_mode = false; + eswin->clks = devm_kcalloc(dev, eswin->num_clocks, sizeof(struct clk *), + GFP_KERNEL); + if (!eswin->clks) + return -ENOMEM; + + platform_set_drvdata(pdev, eswin); + + mutex_init(&eswin->lock); + + eswin->dev = dev; + + mutex_lock(&eswin->lock); + + for (i = 0; i < eswin->num_clocks; i++) { + struct clk *clk; + + clk = of_clk_get(np, i); + if (IS_ERR(clk)) { + ret = PTR_ERR(clk); + goto err0; + } + ret = clk_prepare_enable(clk); + if (ret < 0) { + clk_put(clk); + goto err0; + } + + eswin->clks[i] = clk; + } + + eswin->vaux_rst = devm_reset_control_get(dev, "vaux"); + if (IS_ERR_OR_NULL(eswin->vaux_rst)) { + dev_err(dev, "Failed to asic0_rst handle\n"); + return -EFAULT; + } + + dwc3_eswin_deassert(eswin); + dwc_usb_clk_init(dev); + + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "get_sync failed with err %d\n", ret); + goto err1; + } + + child = of_get_child_by_name(np, "dwc3"); + if (!child) { + dev_err(dev, "failed to find dwc3 core node\n"); + ret = -ENODEV; + goto err1; + } + /* Allocate and initialize the core */ + ret = of_platform_populate(np, NULL, NULL, dev); + if (ret) { + dev_err(dev, "failed to create dwc3 core\n"); + goto err1; + } + + INIT_WORK(&eswin->otg_work, dwc3_eswin_otg_extcon_evt_work); + child_pdev = of_find_device_by_node(child); + if (!child_pdev) { + dev_err(dev, "failed to find dwc3 core device\n"); + ret = -ENODEV; + goto err2; + } + eswin->dwc = platform_get_drvdata(child_pdev); + if (!eswin->dwc) { + dev_err(dev, "failed to get drvdata dwc3\n"); + ret = -EPROBE_DEFER; + goto err2; + } + eswin->child_dev = &child_pdev->dev; + ret = dwc3_eswin_get_extcon_dev(eswin); + if (ret < 0) + dev_err(dev, "couldn't get extcon device: %d\n", ret); + + mutex_unlock(&eswin->lock); + ret = sysfs_create_group(&dev->kobj, &dwc3_eswin_attr_group); + if (ret) + dev_err(dev, "failed to create sysfs group: %d\n", ret); + + return ret; +err2: + cancel_work_sync(&eswin->otg_work); + of_platform_depopulate(dev); + +err1: + pm_runtime_put_sync(dev); + pm_runtime_disable(dev); + dwc3_eswin_assert(eswin); +err0: + for (i = 0; i < eswin->num_clocks && eswin->clks[i]; i++) { + if (!pm_runtime_status_suspended(dev)) + clk_disable(eswin->clks[i]); + clk_unprepare(eswin->clks[i]); + clk_put(eswin->clks[i]); + } + + mutex_unlock(&eswin->lock); + + return ret; +} + +static void dwc3_eswin_remove(struct platform_device *pdev) +{ + struct dwc3_eswin *eswin = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; + int i = 0; + + cancel_work_sync(&eswin->otg_work); + + sysfs_remove_group(&dev->kobj, &dwc3_eswin_attr_group); + + /* Restore hcd state before unregistering xhci */ + if (eswin->edev && !eswin->connected) { + struct usb_hcd *hcd = dev_get_drvdata(&eswin->dwc->xhci->dev); + + pm_runtime_get_sync(dev); + + /* + * The xhci code does not expect that HCDs have been removed. + * It will unconditionally call usb_remove_hcd() when the xhci + * driver is unloaded in of_platform_depopulate(). This results + * in a crash if the HCDs were already removed. To avoid this + * crash, add the HCDs here as dummy operation. + * This code should be removed after pm runtime support + * has been added to xhci. + */ + if (hcd->state == HC_STATE_HALT) { + usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); + usb_add_hcd(hcd->shared_hcd, hcd->irq, IRQF_SHARED); + } + } + + of_platform_depopulate(dev); + + pm_runtime_put_sync(dev); + pm_runtime_disable(dev); + + dwc3_eswin_assert(eswin); + for (i = 0; i < eswin->num_clocks; i++) { + if (!pm_runtime_status_suspended(dev)) + clk_disable(eswin->clks[i]); + clk_unprepare(eswin->clks[i]); + clk_put(eswin->clks[i]); + } +} + +#ifdef CONFIG_PM +static int dwc3_eswin_runtime_suspend(struct device *dev) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(dev); + int i; + + for (i = 0; i < eswin->num_clocks; i++) + clk_disable(eswin->clks[i]); + + device_init_wakeup(dev, false); + + return 0; +} + +static int dwc3_eswin_runtime_resume(struct device *dev) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(dev); + int i; + + for (i = 0; i < eswin->num_clocks; i++) + clk_enable(eswin->clks[i]); + + device_init_wakeup(dev, true); + + return 0; +} + +static int __maybe_unused dwc3_eswin_suspend(struct device *dev) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(dev); + struct dwc3 *dwc = eswin->dwc; + + eswin->suspended = true; + cancel_work_sync(&eswin->otg_work); + + /* + * The flag of is_phy_on is only true if + * the DWC3 is in Host mode. + */ + if (eswin->is_phy_on) { + phy_power_off(dwc->usb2_generic_phy[0]); + + /* + * If link state is Rx.Detect, it means that + * no usb device is connecting with the DWC3 + * Host, and need to power off the USB3 PHY. + */ + dwc->link_state = dwc3_gadget_get_link_state(dwc); + if (dwc->link_state == DWC3_LINK_STATE_RX_DET) + phy_power_off(dwc->usb3_generic_phy[0]); + } + + return 0; +} + +static int __maybe_unused dwc3_eswin_resume(struct device *dev) +{ + struct dwc3_eswin *eswin = dev_get_drvdata(dev); + struct dwc3 *dwc = eswin->dwc; + + eswin->suspended = false; + + if (eswin->is_phy_on) { + phy_power_on(dwc->usb2_generic_phy[0]); + + if (dwc->link_state == DWC3_LINK_STATE_RX_DET) + phy_power_on(dwc->usb3_generic_phy[0]); + } + + if (eswin->edev) + schedule_work(&eswin->otg_work); + + return 0; +} + +static const struct dev_pm_ops dwc3_eswin_dev_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(dwc3_eswin_suspend, dwc3_eswin_resume) + SET_RUNTIME_PM_OPS(dwc3_eswin_runtime_suspend, + dwc3_eswin_runtime_resume, NULL) +}; + +#define DEV_PM_OPS (&dwc3_eswin_dev_pm_ops) +#else +#define DEV_PM_OPS NULL +#endif /* CONFIG_PM */ + +static const struct of_device_id eswin_dwc3_match[] = { + { .compatible = "eswin,eic7700-dwc3" }, + { /* Sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, eswin_dwc3_match); + +static struct platform_driver dwc3_eswin_driver = { + .probe = dwc3_eswin_probe, + .remove = dwc3_eswin_remove, + .driver = { + .name = "eic7700-dwc3", + .pm = DEV_PM_OPS, + .of_match_table = eswin_dwc3_match, + }, +}; + +module_platform_driver(dwc3_eswin_driver); + +MODULE_ALIAS("platform:eic7700-dwc3"); +MODULE_AUTHOR("Wei Yang <yangwei1@eswincomputing.com"); +MODULE_AUTHOR("Senchuan Zhang <zhangsenchuan@eswincomputing.com"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("DesignWare USB3 ESWIN Glue Layer"); -- 2.25.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan @ 2025-05-16 12:50 ` Krzysztof Kozlowski 2025-05-17 1:15 ` kernel test robot ` (2 subsequent siblings) 3 siblings, 0 replies; 9+ messages in thread From: Krzysztof Kozlowski @ 2025-05-16 12:50 UTC (permalink / raw) To: zhangsenchuan, gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: ningyu, linmin, yangwei1 On 16/05/2025 11:54, zhangsenchuan@eswincomputing.com wrote: > +static ssize_t dwc3_mode_store(struct device *device, > + struct device_attribute *attr, const char *buf, > + size_t count) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + struct dwc3 *dwc = eswin->dwc; > + enum usb_role new_role; > + struct usb_role_switch *role_sw = dwc->role_sw; > + > + if (!strncmp(buf, "1", 1) || !strncmp(buf, "host", 4)) { > + new_role = USB_ROLE_HOST; > + } else if (!strncmp(buf, "0", 1) || !strncmp(buf, "peripheral", 10)) { > + new_role = USB_ROLE_DEVICE; > + } else { > + dev_info(eswin->dev, "illegal dr_mode\n"); > + return count; > + } > + eswin->force_mode = true; > + > + mutex_lock(&eswin->lock); > + usb_role_switch_set_role(role_sw, new_role); > + mutex_unlock(&eswin->lock); > + > + return count; > +} > + > +static DEVICE_ATTR_RW(dwc3_mode); Missing ABI documentation. Anyway, unlikely this will be accepted. > + > +static ssize_t dwc3_hub_rst_show(struct device *device, > + struct device_attribute *attr, char *buf) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + > + if (!IS_ERR(eswin->hub_gpio)) > + return sprintf(buf, "%d", gpiod_get_raw_value(eswin->hub_gpio)); > + > + return sprintf(buf, "UNKONWN"); > +} > + > +static ssize_t dwc3_hub_rst_store(struct device *device, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + > + if (!IS_ERR(eswin->hub_gpio)) { > + if (!strncmp(buf, "0", 1)) > + gpiod_set_raw_value(eswin->hub_gpio, 0); > + else > + gpiod_set_raw_value(eswin->hub_gpio, 1); > + } > + > + return count; > +} > + > +static DEVICE_ATTR_RW(dwc3_hub_rst); > + > +static struct attribute *dwc3_eswin_attrs[] = { > + &dev_attr_dwc3_mode.attr, > + &dev_attr_dwc3_hub_rst.attr, > + NULL, > +}; > + > +static struct attribute_group dwc3_eswin_attr_group = { > + .name = NULL, /* we want them in the same directory */ > + .attrs = dwc3_eswin_attrs, > +}; > + > +static int dwc3_eswin_device_notifier(struct notifier_block *nb, > + unsigned long event, void *ptr) > +{ > + struct dwc3_eswin *eswin = > + container_of(nb, struct dwc3_eswin, device_nb); > + > + mutex_lock(&eswin->lock); > + eswin->new_usb_role = USB_ROLE_DEVICE; > + mutex_unlock(&eswin->lock); > + if (!eswin->suspended) > + schedule_work(&eswin->otg_work); > + > + return NOTIFY_DONE; > +} > + > +static int dwc3_eswin_host_notifier(struct notifier_block *nb, > + unsigned long event, void *ptr) > +{ > + struct dwc3_eswin *eswin = container_of(nb, struct dwc3_eswin, host_nb); > + > + mutex_lock(&eswin->lock); > + eswin->new_usb_role = USB_ROLE_HOST; > + mutex_unlock(&eswin->lock); > + if (!eswin->suspended) > + schedule_work(&eswin->otg_work); > + > + return NOTIFY_DONE; > +} > + > +static void dwc3_eswin_otg_extcon_evt_work(struct work_struct *work) > +{ > + struct dwc3_eswin *eswin = > + container_of(work, struct dwc3_eswin, otg_work); > + struct usb_role_switch *role_sw = eswin->dwc->role_sw; > + > + if (true == eswin->force_mode) > + return; > + mutex_lock(&eswin->lock); > + usb_role_switch_set_role(role_sw, eswin->new_usb_role); > + mutex_unlock(&eswin->lock); > +} > + > +static int dwc3_eswin_get_extcon_dev(struct dwc3_eswin *eswin) > +{ > + struct device *dev = eswin->dev; > + struct extcon_dev *edev; > + s32 ret = 0; > + > + if (device_property_read_bool(dev, "extcon")) { extcon is not a bool. This is just wrong... plus undocumented ABI. > + edev = extcon_get_edev_by_phandle(dev, 0); > + if (IS_ERR(edev)) { > + if (PTR_ERR(edev) != -EPROBE_DEFER) > + dev_err(dev, "couldn't get extcon device\n"); > + return PTR_ERR(edev); Do not open code dev_err_probe. > + } > + eswin->edev = edev; > + eswin->device_nb.notifier_call = dwc3_eswin_device_notifier; > + ret = devm_extcon_register_notifier(dev, edev, EXTCON_USB, > + &eswin->device_nb); > + if (ret < 0) > + dev_err(dev, "failed to register notifier for USB\n"); > + > + eswin->host_nb.notifier_call = dwc3_eswin_host_notifier; > + ret = devm_extcon_register_notifier(dev, edev, EXTCON_USB_HOST, > + &eswin->host_nb); > + if (ret < 0) > + dev_err(dev, > + "failed to register notifier for USB-HOST\n"); > + } > + > + return 0; > +} > + > +static int __init dwc3_eswin_deassert(struct dwc3_eswin *eswin) That's wrong annotation. You did not build your kernel with DEBUG SECTION MISMATCH. > +{ > + int rc; > + > + if (eswin->vaux_rst) { > + rc = reset_control_deassert(eswin->vaux_rst); > + WARN_ON(rc != 0); > + } > + > + return 0; > +} > + > +static int dwc3_eswin_assert(struct dwc3_eswin *eswin) > +{ > + int rc = 0; > + > + if (eswin->vaux_rst) { > + rc = reset_control_assert(eswin->vaux_rst); > + WARN_ON(rc != 0); > + } > + > + return 0; > +} > + > +static int dwc_usb_clk_init(struct device *dev) > +{ > + struct regmap *regmap; > + u32 hsp_usb_bus; > + u32 hsp_usb_axi_lp; > + u32 hsp_usb_vbus_freq; > + u32 hsp_usb_mpll; > + int ret; > + > + regmap = syscon_regmap_lookup_by_phandle(dev->of_node, > + "eswin,hsp_sp_csr"); > + if (IS_ERR(regmap)) { > + dev_dbg(dev, "No hsp_sp_csr phandle specified\n"); > + return -1; > + } > + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 1, > + &hsp_usb_bus); > + if (ret) { > + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); > + return ret; > + } > + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 2, > + &hsp_usb_axi_lp); > + if (ret) { > + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); > + return ret; > + } > + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 3, > + &hsp_usb_vbus_freq); > + if (ret) { > + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); > + return ret; > + } > + ret = of_property_read_u32_index(dev->of_node, "eswin,hsp_sp_csr", 4, > + &hsp_usb_mpll); > + if (ret) { > + dev_err(dev, "can't get usb sid cfg reg offset (%d)\n", ret); > + return ret; > + } > + > + /* > + * usb1 clock init > + * ref clock is 24M, below need to be set to satisfy usb phy requirement(125M) > + */ > + regmap_write(regmap, hsp_usb_vbus_freq, HSP_USB_VBUS_FSEL); > + regmap_write(regmap, hsp_usb_mpll, HSP_USB_MPLL_DEFAULT); > + /* > + * reset usb core and usb phy > + */ > + regmap_write(regmap, hsp_usb_bus, > + HSP_USB_BUS_FILTER_EN | HSP_USB_BUS_CLKEN_GM | > + HSP_USB_BUS_CLKEN_GS | HSP_USB_BUS_SW_RST | > + HSP_USB_BUS_CLK_EN); > + regmap_write(regmap, hsp_usb_axi_lp, > + HSP_USB_AXI_LP_XM_CSYSREQ | HSP_USB_AXI_LP_XS_CSYSREQ); > + > + return 0; > +} > + > +static int dwc3_eswin_probe(struct platform_device *pdev) > +{ > + struct dwc3_eswin *eswin; > + struct device *dev = &pdev->dev; > + struct device_node *np = dev->of_node, *child; > + struct platform_device *child_pdev; > + unsigned int count; > + int ret; > + int i; > + int err_desc = 0; > + > + eswin = devm_kzalloc(dev, sizeof(*eswin), GFP_KERNEL); > + if (!eswin) > + return -ENOMEM; > + eswin->hub_gpio = devm_gpiod_get(dev, "hub-rst", GPIOD_OUT_HIGH); > + err_desc = IS_ERR(eswin->hub_gpio); > + > + if (!err_desc) > + gpiod_set_raw_value(eswin->hub_gpio, 1); > + > + count = of_clk_get_parent_count(np); > + if (!count) > + return -ENOENT; > + > + eswin->num_clocks = count; > + eswin->force_mode = false; > + eswin->clks = devm_kcalloc(dev, eswin->num_clocks, sizeof(struct clk *), > + GFP_KERNEL); > + if (!eswin->clks) > + return -ENOMEM; > + > + platform_set_drvdata(pdev, eswin); > + > + mutex_init(&eswin->lock); > + > + eswin->dev = dev; > + > + mutex_lock(&eswin->lock); I don't understand the point of it. Explain me, what are you protecting here from what? How is it possible? > + > + for (i = 0; i < eswin->num_clocks; i++) { > + struct clk *clk; > + > + clk = of_clk_get(np, i); No, use devm_clk_Get > + if (IS_ERR(clk)) { > + ret = PTR_ERR(clk); > + goto err0; > + } > + ret = clk_prepare_enable(clk); > + if (ret < 0) { > + clk_put(clk); > + goto err0; > + } > + > + eswin->clks[i] = clk; Use get_enabled and bulk api. > + } > + > + eswin->vaux_rst = devm_reset_control_get(dev, "vaux"); > + if (IS_ERR_OR_NULL(eswin->vaux_rst)) { OR_NULL? Why? > + dev_err(dev, "Failed to asic0_rst handle\n"); Syntax is always: retrun dev_err_probe > + return -EFAULT; No, return proper error codes. > + } > + > + dwc3_eswin_deassert(eswin); > + dwc_usb_clk_init(dev); > + > + pm_runtime_set_active(dev); > + pm_runtime_enable(dev); > + ret = pm_runtime_get_sync(dev); > + if (ret < 0) { > + dev_err(dev, "get_sync failed with err %d\n", ret); > + goto err1; > + } > + > + child = of_get_child_by_name(np, "dwc3"); > + if (!child) { > + dev_err(dev, "failed to find dwc3 core node\n"); > + ret = -ENODEV; > + goto err1; > + } > + /* Allocate and initialize the core */ > + ret = of_platform_populate(np, NULL, NULL, dev); > + if (ret) { > + dev_err(dev, "failed to create dwc3 core\n"); > + goto err1; > + } > + > + INIT_WORK(&eswin->otg_work, dwc3_eswin_otg_extcon_evt_work); > + child_pdev = of_find_device_by_node(child); > + if (!child_pdev) { > + dev_err(dev, "failed to find dwc3 core device\n"); > + ret = -ENODEV; > + goto err2; > + } > + eswin->dwc = platform_get_drvdata(child_pdev); > + if (!eswin->dwc) { > + dev_err(dev, "failed to get drvdata dwc3\n"); > + ret = -EPROBE_DEFER; > + goto err2; > + } > + eswin->child_dev = &child_pdev->dev; > + ret = dwc3_eswin_get_extcon_dev(eswin); > + if (ret < 0) > + dev_err(dev, "couldn't get extcon device: %d\n", ret); > + > + mutex_unlock(&eswin->lock); > + ret = sysfs_create_group(&dev->kobj, &dwc3_eswin_attr_group); > + if (ret) > + dev_err(dev, "failed to create sysfs group: %d\n", ret); > + > + return ret; > +err2: > + cancel_work_sync(&eswin->otg_work); > + of_platform_depopulate(dev); > + > +err1: > + pm_runtime_put_sync(dev); > + pm_runtime_disable(dev); > + dwc3_eswin_assert(eswin); > +err0: > + for (i = 0; i < eswin->num_clocks && eswin->clks[i]; i++) { > + if (!pm_runtime_status_suspended(dev)) > + clk_disable(eswin->clks[i]); > + clk_unprepare(eswin->clks[i]); > + clk_put(eswin->clks[i]); > + } > + > + mutex_unlock(&eswin->lock); > + > + return ret; > +} > + > +static void dwc3_eswin_remove(struct platform_device *pdev) > +{ > + struct dwc3_eswin *eswin = platform_get_drvdata(pdev); > + struct device *dev = &pdev->dev; > + int i = 0; > + > + cancel_work_sync(&eswin->otg_work); > + > + sysfs_remove_group(&dev->kobj, &dwc3_eswin_attr_group); > + > + /* Restore hcd state before unregistering xhci */ > + if (eswin->edev && !eswin->connected) { > + struct usb_hcd *hcd = dev_get_drvdata(&eswin->dwc->xhci->dev); > + > + pm_runtime_get_sync(dev); > + > + /* > + * The xhci code does not expect that HCDs have been removed. > + * It will unconditionally call usb_remove_hcd() when the xhci > + * driver is unloaded in of_platform_depopulate(). This results > + * in a crash if the HCDs were already removed. To avoid this > + * crash, add the HCDs here as dummy operation. > + * This code should be removed after pm runtime support > + * has been added to xhci. > + */ > + if (hcd->state == HC_STATE_HALT) { > + usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); > + usb_add_hcd(hcd->shared_hcd, hcd->irq, IRQF_SHARED); > + } > + } > + > + of_platform_depopulate(dev); > + > + pm_runtime_put_sync(dev); > + pm_runtime_disable(dev); > + > + dwc3_eswin_assert(eswin); > + for (i = 0; i < eswin->num_clocks; i++) { > + if (!pm_runtime_status_suspended(dev)) > + clk_disable(eswin->clks[i]); > + clk_unprepare(eswin->clks[i]); > + clk_put(eswin->clks[i]); > + } > +} > + > +#ifdef CONFIG_PM > +static int dwc3_eswin_runtime_suspend(struct device *dev) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(dev); > + int i; > + > + for (i = 0; i < eswin->num_clocks; i++) > + clk_disable(eswin->clks[i]); > + > + device_init_wakeup(dev, false); > + > + return 0; > +} > + > +static int dwc3_eswin_runtime_resume(struct device *dev) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(dev); > + int i; > + > + for (i = 0; i < eswin->num_clocks; i++) > + clk_enable(eswin->clks[i]); > + > + device_init_wakeup(dev, true); This feels odd. What is the point of wakeup if you disable it for the sleeping periods? > + > + return 0; > +} > + > +static int __maybe_unused dwc3_eswin_suspend(struct device *dev) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(dev); > + struct dwc3 *dwc = eswin->dwc; > + > + eswin->suspended = true; > + cancel_work_sync(&eswin->otg_work); > + > + /* > + * The flag of is_phy_on is only true if > + * the DWC3 is in Host mode. > + */ > + if (eswin->is_phy_on) { > + phy_power_off(dwc->usb2_generic_phy[0]); > + > + /* > + * If link state is Rx.Detect, it means that > + * no usb device is connecting with the DWC3 > + * Host, and need to power off the USB3 PHY. > + */ > + dwc->link_state = dwc3_gadget_get_link_state(dwc); > + if (dwc->link_state == DWC3_LINK_STATE_RX_DET) > + phy_power_off(dwc->usb3_generic_phy[0]); > + } > + > + return 0; > +} > + > +static int __maybe_unused dwc3_eswin_resume(struct device *dev) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(dev); > + struct dwc3 *dwc = eswin->dwc; > + > + eswin->suspended = false; > + > + if (eswin->is_phy_on) { > + phy_power_on(dwc->usb2_generic_phy[0]); > + > + if (dwc->link_state == DWC3_LINK_STATE_RX_DET) > + phy_power_on(dwc->usb3_generic_phy[0]); > + } > + > + if (eswin->edev) > + schedule_work(&eswin->otg_work); > + > + return 0; > +} > + > +static const struct dev_pm_ops dwc3_eswin_dev_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(dwc3_eswin_suspend, dwc3_eswin_resume) > + SET_RUNTIME_PM_OPS(dwc3_eswin_runtime_suspend, > + dwc3_eswin_runtime_resume, NULL) > +}; > + > +#define DEV_PM_OPS (&dwc3_eswin_dev_pm_ops) > +#else > +#define DEV_PM_OPS NULL > +#endif /* CONFIG_PM */ > + > +static const struct of_device_id eswin_dwc3_match[] = { > + { .compatible = "eswin,eic7700-dwc3" }, > + { /* Sentinel */ } > +}; > + > +MODULE_DEVICE_TABLE(of, eswin_dwc3_match); > + > +static struct platform_driver dwc3_eswin_driver = { > + .probe = dwc3_eswin_probe, > + .remove = dwc3_eswin_remove, > + .driver = { > + .name = "eic7700-dwc3", > + .pm = DEV_PM_OPS, > + .of_match_table = eswin_dwc3_match, > + }, > +}; > + > +module_platform_driver(dwc3_eswin_driver); > + > +MODULE_ALIAS("platform:eic7700-dwc3"); Drop. You should not need MODULE_ALIAS() in normal cases. If you need it, usually it means your device ID table is wrong (e.g. misses either entries or MODULE_DEVICE_TABLE()). MODULE_ALIAS() is not a substitute for incomplete ID table. Both of your drivers - this and PCI - are in very poor shape. I suggest redoing them based on latest upstream drivers, not pushing to us your downstream code. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan 2025-05-16 12:50 ` Krzysztof Kozlowski @ 2025-05-17 1:15 ` kernel test robot 2025-05-17 23:28 ` kernel test robot 2025-05-20 6:20 ` Krishna Kurapati 3 siblings, 0 replies; 9+ messages in thread From: kernel test robot @ 2025-05-17 1:15 UTC (permalink / raw) To: zhangsenchuan, gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: llvm, oe-kbuild-all, ningyu, linmin, yangwei1, Senchuan Zhang Hi, kernel test robot noticed the following build warnings: [auto build test WARNING on usb/usb-testing] [also build test WARNING on usb/usb-next usb/usb-linus robh/for-next westeri-thunderbolt/next linus/master v6.15-rc6 next-20250516] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/zhangsenchuan-eswincomputing-com/dt-bindings-usb-Add-Eswin-EIC7700-Usb-controller/20250516-175800 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing patch link: https://lore.kernel.org/r/20250516095408.704-1-zhangsenchuan%40eswincomputing.com patch subject: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver config: arm-randconfig-004-20250517 (https://download.01.org/0day-ci/archive/20250517/202505170848.MGykwPlY-lkp@intel.com/config) compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250517/202505170848.MGykwPlY-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202505170848.MGykwPlY-lkp@intel.com/ All warnings (new ones prefixed by >>, old ones prefixed by <<): >> WARNING: modpost: vmlinux: section mismatch in reference: dwc3_eswin_probe+0x3c4 (section: .text) -> dwc3_eswin_deassert (section: .init.text) -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan 2025-05-16 12:50 ` Krzysztof Kozlowski 2025-05-17 1:15 ` kernel test robot @ 2025-05-17 23:28 ` kernel test robot 2025-05-20 6:20 ` Krishna Kurapati 3 siblings, 0 replies; 9+ messages in thread From: kernel test robot @ 2025-05-17 23:28 UTC (permalink / raw) To: zhangsenchuan, gregkh, robh, krzk+dt, conor+dt, linux-usb, linux-kernel, devicetree, Thinh.Nguyen, p.zabel Cc: oe-kbuild-all, ningyu, linmin, yangwei1, Senchuan Zhang Hi, kernel test robot noticed the following build errors: [auto build test ERROR on usb/usb-testing] [also build test ERROR on usb/usb-next usb/usb-linus robh/for-next westeri-thunderbolt/next linus/master v6.15-rc6 next-20250516] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/zhangsenchuan-eswincomputing-com/dt-bindings-usb-Add-Eswin-EIC7700-Usb-controller/20250516-175800 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing patch link: https://lore.kernel.org/r/20250516095408.704-1-zhangsenchuan%40eswincomputing.com patch subject: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver config: x86_64-randconfig-005-20250518 (https://download.01.org/0day-ci/archive/20250518/202505180701.e5gwT1y2-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250518/202505180701.e5gwT1y2-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202505180701.e5gwT1y2-lkp@intel.com/ All errors (new ones prefixed by >>, old ones prefixed by <<): >> ERROR: modpost: "dwc3_gadget_get_link_state" [drivers/usb/dwc3/dwc3-eic7700.ko] undefined! -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan ` (2 preceding siblings ...) 2025-05-17 23:28 ` kernel test robot @ 2025-05-20 6:20 ` Krishna Kurapati 3 siblings, 0 replies; 9+ messages in thread From: Krishna Kurapati @ 2025-05-20 6:20 UTC (permalink / raw) To: zhangsenchuan Cc: ningyu, robh, p.zabel, Thinh.Nguyen, devicetree, linux-kernel, linux-usb, conor+dt, krzk+dt, linmin, yangwei1, gregkh On 5/16/2025 3:24 PM, zhangsenchuan@eswincomputing.com wrote: > From: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > > Add the eic7700 usb driver, which is responsible for > identifying,configuring and connecting usb devices,and > provides interfaces for accessing these devices. > > Co-developed-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Wei Yang <yangwei1@eswincomputing.com> > Signed-off-by: Senchuan Zhang <zhangsenchuan@eswincomputing.com> > --- [...] > +static ssize_t dwc3_mode_show(struct device *device, > + struct device_attribute *attr, char *buf) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + struct dwc3 *dwc = eswin->dwc; > + int ret; > + > + switch (dwc->current_dr_role) { > + case USB_DR_MODE_HOST: > + ret = sprintf(buf, "host\n"); > + break; > + case USB_DR_MODE_PERIPHERAL: > + ret = sprintf(buf, "peripheral\n"); > + break; > + case USB_DR_MODE_OTG: > + ret = sprintf(buf, "otg\n"); > + break; > + default: > + ret = sprintf(buf, "UNKNOWN\n"); > + } > + Use sysfs_emit instead [1]. > + return ret; > +} > + > +static ssize_t dwc3_mode_store(struct device *device, > + struct device_attribute *attr, const char *buf, > + size_t count) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + struct dwc3 *dwc = eswin->dwc; > + enum usb_role new_role; > + struct usb_role_switch *role_sw = dwc->role_sw; > + > + if (!strncmp(buf, "1", 1) || !strncmp(buf, "host", 4)) { > + new_role = USB_ROLE_HOST; > + } else if (!strncmp(buf, "0", 1) || !strncmp(buf, "peripheral", 10)) { > + new_role = USB_ROLE_DEVICE; > + } else { > + dev_info(eswin->dev, "illegal dr_mode\n"); > + return count; > + } > + eswin->force_mode = true; > + > + mutex_lock(&eswin->lock); > + usb_role_switch_set_role(role_sw, new_role); > + mutex_unlock(&eswin->lock); > + > + return count; > +} > + > +static DEVICE_ATTR_RW(dwc3_mode); > + > +static ssize_t dwc3_hub_rst_show(struct device *device, > + struct device_attribute *attr, char *buf) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + > + if (!IS_ERR(eswin->hub_gpio)) > + return sprintf(buf, "%d", gpiod_get_raw_value(eswin->hub_gpio)); > + > + return sprintf(buf, "UNKONWN"); Here too, Use sysfs_emit instead [1]. > +} > + > +static ssize_t dwc3_hub_rst_store(struct device *device, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct dwc3_eswin *eswin = dev_get_drvdata(device); > + > + if (!IS_ERR(eswin->hub_gpio)) { > + if (!strncmp(buf, "0", 1)) > + gpiod_set_raw_value(eswin->hub_gpio, 0); > + else > + gpiod_set_raw_value(eswin->hub_gpio, 1); > + } > + > + return count; > +} > + > +static DEVICE_ATTR_RW(dwc3_hub_rst); > + > +static struct attribute *dwc3_eswin_attrs[] = { > + &dev_attr_dwc3_mode.attr, > + &dev_attr_dwc3_hub_rst.attr, > + NULL, > +}; > + > +static struct attribute_group dwc3_eswin_attr_group = { > + .name = NULL, /* we want them in the same directory */ > + .attrs = dwc3_eswin_attrs, > +}; > + [...] > +static int dwc3_eswin_probe(struct platform_device *pdev) > +{ > + struct dwc3_eswin *eswin; > + struct device *dev = &pdev->dev; > + struct device_node *np = dev->of_node, *child; > + struct platform_device *child_pdev; > + unsigned int count; > + int ret; > + int i; > + int err_desc = 0; > + [...] > + child = of_get_child_by_name(np, "dwc3"); > + if (!child) { > + dev_err(dev, "failed to find dwc3 core node\n"); > + ret = -ENODEV; > + goto err1; > + } > + /* Allocate and initialize the core */ > + ret = of_platform_populate(np, NULL, NULL, dev); > + if (ret) { > + dev_err(dev, "failed to create dwc3 core\n"); > + goto err1; > + } > + > + INIT_WORK(&eswin->otg_work, dwc3_eswin_otg_extcon_evt_work); > + child_pdev = of_find_device_by_node(child); > + if (!child_pdev) { > + dev_err(dev, "failed to find dwc3 core device\n"); > + ret = -ENODEV; > + goto err2; > + } > + eswin->dwc = platform_get_drvdata(child_pdev); > + if (!eswin->dwc) { > + dev_err(dev, "failed to get drvdata dwc3\n"); > + ret = -EPROBE_DEFER; > + goto err2; > + } Try using falttened implementation if possible. Regards, Krishna, ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-05-20 6:20 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-05-16 9:52 [PATCH v1 0/2] Add driver support for Eswin eic7700 SoC Usb controller zhangsenchuan 2025-05-16 9:53 ` [PATCH v1 1/2] dt-bindings: usb: Add Eswin EIC7700 " zhangsenchuan 2025-05-16 11:26 ` Rob Herring (Arm) 2025-05-19 6:24 ` Krzysztof Kozlowski 2025-05-16 9:54 ` [PATCH v1 2/2] usb: dwc3: eic7700: Add EIC7700 usb driver zhangsenchuan 2025-05-16 12:50 ` Krzysztof Kozlowski 2025-05-17 1:15 ` kernel test robot 2025-05-17 23:28 ` kernel test robot 2025-05-20 6:20 ` Krishna Kurapati
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).