usb: phy: isp1301: give it a context structure
authorFelipe Balbi <balbi@ti.com>
Fri, 8 Mar 2013 11:01:40 +0000 (13:01 +0200)
committerFelipe Balbi <balbi@ti.com>
Mon, 18 Mar 2013 09:18:09 +0000 (11:18 +0200)
this patch is a small preparation to fix
isp1301 driver so that other platforms can
use it.

We're defining our private data structure
to represent this device and adding the
PHY to the PHY list.

Later patches will come implementing proper
PHY API and removing bogus code from ohci_nxp
and lpc32xx_udc drivers.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/phy/phy-isp1301.c

index 18dbf7e37607262059b7a1bb9a8f5b4e9ef6e86f..5e0f14369145dcc291c6e2600a18bf1c0aea029e 100644 (file)
  */
 
 #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;
 }