diff --git a/drivers/usb/phy/phy-isp1301.c b/drivers/usb/phy/phy-isp1301.c
index 18dbf7e37607..5e0f14369145 100644
--- a/drivers/usb/phy/phy-isp1301.c
+++ b/drivers/usb/phy/phy-isp1301.c
@@ -11,10 +11,19 @@
  */
 
 #include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/i2c.h>
+#include <linux/usb/phy.h>
 
 #define DRV_NAME		"isp1301"
 
+struct isp1301 {
+	struct usb_phy		phy;
+	struct mutex		mutex;
+
+	struct i2c_client	*client;
+};
+
 static const struct i2c_device_id isp1301_id[] = {
 	{ "isp1301", 0 },
 	{ }
@@ -25,12 +34,35 @@ static struct i2c_client *isp1301_i2c_client;
 static int isp1301_probe(struct i2c_client *client,
 			 const struct i2c_device_id *i2c_id)
 {
+	struct isp1301 *isp;
+	struct usb_phy *phy;
+
+	isp = devm_kzalloc(&client->dev, sizeof(*isp), GFP_KERNEL);
+	if (!isp)
+		return -ENOMEM;
+
+	isp->client = client;
+	mutex_init(&isp->mutex);
+
+	phy = &isp->phy;
+	phy->label = DRV_NAME;
+	phy->type = USB_PHY_TYPE_USB2;
+
+	i2c_set_clientdata(client, isp);
+	usb_add_phy_dev(phy);
+
 	isp1301_i2c_client = client;
+
 	return 0;
 }
 
 static int isp1301_remove(struct i2c_client *client)
 {
+	struct isp1301 *isp = i2c_get_clientdata(client);
+
+	usb_remove_phy(&isp->phy);
+	isp1301_i2c_client = NULL;
+
 	return 0;
 }