Re: [RFC] usb-phy-generic: Add support to SMSC USB3315

From: Stephen Boyd
Date: Tue May 23 2017 - 17:00:52 EST


On 05/23, Fabien Lahoudere wrote:
> Hi,
>
> We investigate on the topic and now our device tree look like:
>
> in imx53.dtsi:
>
> usbh2: usb@53f80400 {
> compatible = "fsl,imx53-usb", "fsl,imx27-usb";
>         reg = <0x53f80400 0x0200>;
>         interrupts = <16>;
>         clocks = <&clks IMX5_CLK_USBOH3_GATE>;
>         fsl,usbmisc = <&usbmisc 2>;
>         dr_mode = "host";
>         status = "disabled";
> };
>
> usbmisc: usbmisc@53f80800 {
> #index-cells = <1>;
> compatible = "fsl,imx53-usbmisc";
> reg = <0x53f80800 0x200>;
> clocks = <&clks IMX5_CLK_USBOH3_GATE>;
> };
>
> and in our dts:
>
> &usbh2 {
>         pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_usbh2>;
> disable-int60ck;
>         dr_mode = "host";
>         //fsl,usbphy = <&usbphy2>;
>         vbus-supply = <&reg_usbh2_vbus>;
>         status = "okay";
> ulpi {
>                 phy {
>                         compatible = "smsc,usb3315-ulpi";
>                         reset-gpios = <&gpio4 4 GPIO_ACTIVE_LOW>;
> clock-names = "main_clk";
> /*
>                          * Hardware uses CKO2 at 24MHz at several places. Set the parent
>  *  clock of CKO2 to OSC.
>                          */
> clock-frequency = <24000000>;
> clocks = <&clks IMX5_CLK_CKO2>;
>                         assigned-clocks = <&clks IMX5_CLK_CKO2_SEL>, <&clks IMX5_CLK_OSC>;
> assigned-clock-parents = <&clks IMX5_CLK_OSC>;
>                         status = "okay";
>                 };
>         };
> };
>
> And we create a basic driver to check what happened:
>
> static int smsc_usb3315_phy_probe(struct ulpi *ulpi)
> {
>         printk(KERN_ERR "Fabien: %s:%d-%s\n", __FILE__, __LINE__, __func__);
>
>         return 0;
> }
>
> static const struct of_device_id smsc_usb3315_phy_match[] = {
>         { .compatible = "smsc,usb3315-phy", },
>         { }
> };
> MODULE_DEVICE_TABLE(of, smsc_usb3315_phy_match);
>
> static struct ulpi_driver smsc_usb3315_phy_driver = {
>         .probe = smsc_usb3315_phy_probe,
>         .driver = {
>                 .name = "smsc_usb3315_phy",
>                 .of_match_table = smsc_usb3315_phy_match,
>         },
> };
> module_ulpi_driver(smsc_usb3315_phy_driver);
>
> /*MODULE_ALIAS("platform:usb_phy_generic");*/
> MODULE_AUTHOR("GE Healthcare");
> MODULE_DESCRIPTION("SMSC USB 3315 ULPI Phy driver");
> MODULE_LICENSE("GPL v2");
>
> I checked that the driver is registered by drivers/usb/common/ulpi.c:__ulpi_register_driver
> successfully.

Does the ulpi device have some vendor/product ids associated
with it? The design is made to only fallback to matching the
device to driver based on DT if the ulpi vendor id is 0.
Otherwise, if vendor is non-zero you'll need to have a
ulpi_device_id id table in your ulpi_driver structure.

--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project