1 #include <linux/module.h>
2 #include <linux/platform_device.h>
8 void (*phy_power
)(struct phy_control
*phy_ctrl
, u32 id
, bool on
);
9 void (*phy_wkup
)(struct phy_control
*phy_ctrl
, u32 id
, bool on
);
12 struct am335x_control_usb
{
14 void __iomem
*phy_reg
;
17 struct phy_control phy_ctrl
;
20 #define AM335X_USB0_CTRL 0x0
21 #define AM335X_USB1_CTRL 0x8
22 #define AM335x_USB_WKUP 0x0
24 #define USBPHY_CM_PWRDN (1 << 0)
25 #define USBPHY_OTG_PWRDN (1 << 1)
26 #define USBPHY_OTGVDET_EN (1 << 19)
27 #define USBPHY_OTGSESSEND_EN (1 << 20)
29 static void am335x_phy_power(struct phy_control
*phy_ctrl
, u32 id
, bool on
)
31 struct am335x_control_usb
*usb_ctrl
;
35 usb_ctrl
= container_of(phy_ctrl
, struct am335x_control_usb
, phy_ctrl
);
39 reg
= AM335X_USB0_CTRL
;
42 reg
= AM335X_USB1_CTRL
;
49 val
= readl(usb_ctrl
->phy_reg
+ reg
);
51 val
&= ~(USBPHY_CM_PWRDN
| USBPHY_OTG_PWRDN
);
52 val
|= USBPHY_OTGVDET_EN
| USBPHY_OTGSESSEND_EN
;
54 val
|= USBPHY_CM_PWRDN
| USBPHY_OTG_PWRDN
;
57 writel(val
, usb_ctrl
->phy_reg
+ reg
);
60 static const struct phy_control ctrl_am335x
= {
61 .phy_power
= am335x_phy_power
,
64 static const struct of_device_id omap_control_usb_id_table
[] = {
65 { .compatible
= "ti,am335x-usb-ctrl-module", .data
= &ctrl_am335x
},
68 MODULE_DEVICE_TABLE(of
, omap_control_usb_id_table
);
70 static struct platform_driver am335x_control_driver
;
71 static int match(struct device
*dev
, void *data
)
73 struct device_node
*node
= (struct device_node
*)data
;
74 return dev
->of_node
== node
&&
75 dev
->driver
== &am335x_control_driver
.driver
;
78 struct phy_control
*am335x_get_phy_control(struct device
*dev
)
80 struct device_node
*node
;
81 struct am335x_control_usb
*ctrl_usb
;
83 node
= of_parse_phandle(dev
->of_node
, "ti,ctrl_mod", 0);
87 dev
= bus_find_device(&platform_bus_type
, NULL
, node
, match
);
88 ctrl_usb
= dev_get_drvdata(dev
);
91 return &ctrl_usb
->phy_ctrl
;
93 EXPORT_SYMBOL_GPL(am335x_get_phy_control
);
95 static int am335x_control_usb_probe(struct platform_device
*pdev
)
98 struct am335x_control_usb
*ctrl_usb
;
99 const struct of_device_id
*of_id
;
100 const struct phy_control
*phy_ctrl
;
102 of_id
= of_match_node(omap_control_usb_id_table
, pdev
->dev
.of_node
);
106 phy_ctrl
= of_id
->data
;
108 ctrl_usb
= devm_kzalloc(&pdev
->dev
, sizeof(*ctrl_usb
), GFP_KERNEL
);
110 dev_err(&pdev
->dev
, "unable to alloc memory for control usb\n");
114 ctrl_usb
->dev
= &pdev
->dev
;
116 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "phy_ctrl");
117 ctrl_usb
->phy_reg
= devm_ioremap_resource(&pdev
->dev
, res
);
118 if (IS_ERR(ctrl_usb
->phy_reg
))
119 return PTR_ERR(ctrl_usb
->phy_reg
);
120 spin_lock_init(&ctrl_usb
->lock
);
121 ctrl_usb
->phy_ctrl
= *phy_ctrl
;
123 dev_set_drvdata(ctrl_usb
->dev
, ctrl_usb
);
127 static struct platform_driver am335x_control_driver
= {
128 .probe
= am335x_control_usb_probe
,
130 .name
= "am335x-control-usb",
131 .owner
= THIS_MODULE
,
132 .of_match_table
= of_match_ptr(omap_control_usb_id_table
),
136 module_platform_driver(am335x_control_driver
);
137 MODULE_LICENSE("GPL v2");