ux500.c (e9e8c85e69310141d78daaecd6a56138700ac317) ux500.c (b96d3b08365f5a9603f50f3aadca6012f7eaffa1)
1/*
2 * Copyright (C) 2010 ST-Ericsson AB
3 * Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>
4 *
5 * Based on omap2430.c
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 23 unchanged lines hidden (view full) ---

32 struct device *dev;
33 struct platform_device *musb;
34 struct clk *clk;
35};
36#define glue_to_musb(g) platform_get_drvdata(g->musb)
37
38static int ux500_musb_init(struct musb *musb)
39{
1/*
2 * Copyright (C) 2010 ST-Ericsson AB
3 * Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>
4 *
5 * Based on omap2430.c
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 23 unchanged lines hidden (view full) ---

32 struct device *dev;
33 struct platform_device *musb;
34 struct clk *clk;
35};
36#define glue_to_musb(g) platform_get_drvdata(g->musb)
37
38static int ux500_musb_init(struct musb *musb)
39{
40 musb->xceiv = otg_get_transceiver();
40 musb->xceiv = usb_get_transceiver();
41 if (!musb->xceiv) {
42 pr_err("HS USB OTG: no transceiver configured\n");
43 return -ENODEV;
44 }
45
46 return 0;
47}
48
49static int ux500_musb_exit(struct musb *musb)
50{
41 if (!musb->xceiv) {
42 pr_err("HS USB OTG: no transceiver configured\n");
43 return -ENODEV;
44 }
45
46 return 0;
47}
48
49static int ux500_musb_exit(struct musb *musb)
50{
51 otg_put_transceiver(musb->xceiv);
51 usb_put_transceiver(musb->xceiv);
52
53 return 0;
54}
55
56static const struct musb_platform_ops ux500_ops = {
57 .init = ux500_musb_init,
58 .exit = ux500_musb_exit,
59};
60
52
53 return 0;
54}
55
56static const struct musb_platform_ops ux500_ops = {
57 .init = ux500_musb_init,
58 .exit = ux500_musb_exit,
59};
60
61static int __devinit ux500_probe(struct platform_device *pdev)
61static int __init ux500_probe(struct platform_device *pdev)
62{
63 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
64 struct platform_device *musb;
65 struct ux500_glue *glue;
66 struct clk *clk;
67
68 int ret = -ENOMEM;
69

--- 66 unchanged lines hidden (view full) ---

136
137err1:
138 kfree(glue);
139
140err0:
141 return ret;
142}
143
62{
63 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
64 struct platform_device *musb;
65 struct ux500_glue *glue;
66 struct clk *clk;
67
68 int ret = -ENOMEM;
69

--- 66 unchanged lines hidden (view full) ---

136
137err1:
138 kfree(glue);
139
140err0:
141 return ret;
142}
143
144static int __devexit ux500_remove(struct platform_device *pdev)
144static int __exit ux500_remove(struct platform_device *pdev)
145{
146 struct ux500_glue *glue = platform_get_drvdata(pdev);
147
148 platform_device_del(glue->musb);
149 platform_device_put(glue->musb);
150 clk_disable(glue->clk);
151 clk_put(glue->clk);
152 kfree(glue);
153
154 return 0;
155}
156
157#ifdef CONFIG_PM
158static int ux500_suspend(struct device *dev)
159{
160 struct ux500_glue *glue = dev_get_drvdata(dev);
161 struct musb *musb = glue_to_musb(glue);
162
145{
146 struct ux500_glue *glue = platform_get_drvdata(pdev);
147
148 platform_device_del(glue->musb);
149 platform_device_put(glue->musb);
150 clk_disable(glue->clk);
151 clk_put(glue->clk);
152 kfree(glue);
153
154 return 0;
155}
156
157#ifdef CONFIG_PM
158static int ux500_suspend(struct device *dev)
159{
160 struct ux500_glue *glue = dev_get_drvdata(dev);
161 struct musb *musb = glue_to_musb(glue);
162
163 otg_set_suspend(musb->xceiv, 1);
163 usb_phy_set_suspend(musb->xceiv, 1);
164 clk_disable(glue->clk);
165
166 return 0;
167}
168
169static int ux500_resume(struct device *dev)
170{
171 struct ux500_glue *glue = dev_get_drvdata(dev);
172 struct musb *musb = glue_to_musb(glue);
173 int ret;
174
175 ret = clk_enable(glue->clk);
176 if (ret) {
177 dev_err(dev, "failed to enable clock\n");
178 return ret;
179 }
180
164 clk_disable(glue->clk);
165
166 return 0;
167}
168
169static int ux500_resume(struct device *dev)
170{
171 struct ux500_glue *glue = dev_get_drvdata(dev);
172 struct musb *musb = glue_to_musb(glue);
173 int ret;
174
175 ret = clk_enable(glue->clk);
176 if (ret) {
177 dev_err(dev, "failed to enable clock\n");
178 return ret;
179 }
180
181 otg_set_suspend(musb->xceiv, 0);
181 usb_phy_set_suspend(musb->xceiv, 0);
182
183 return 0;
184}
185
186static const struct dev_pm_ops ux500_pm_ops = {
187 .suspend = ux500_suspend,
188 .resume = ux500_resume,
189};
190
191#define DEV_PM_OPS (&ux500_pm_ops)
192#else
193#define DEV_PM_OPS NULL
194#endif
195
196static struct platform_driver ux500_driver = {
182
183 return 0;
184}
185
186static const struct dev_pm_ops ux500_pm_ops = {
187 .suspend = ux500_suspend,
188 .resume = ux500_resume,
189};
190
191#define DEV_PM_OPS (&ux500_pm_ops)
192#else
193#define DEV_PM_OPS NULL
194#endif
195
196static struct platform_driver ux500_driver = {
197 .probe = ux500_probe,
198 .remove = __devexit_p(ux500_remove),
197 .remove = __exit_p(ux500_remove),
199 .driver = {
200 .name = "musb-ux500",
201 .pm = DEV_PM_OPS,
202 },
203};
204
205MODULE_DESCRIPTION("UX500 MUSB Glue Layer");
206MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>");
207MODULE_LICENSE("GPL v2");
208
209static int __init ux500_init(void)
210{
198 .driver = {
199 .name = "musb-ux500",
200 .pm = DEV_PM_OPS,
201 },
202};
203
204MODULE_DESCRIPTION("UX500 MUSB Glue Layer");
205MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>");
206MODULE_LICENSE("GPL v2");
207
208static int __init ux500_init(void)
209{
211 return platform_driver_register(&ux500_driver);
210 return platform_driver_probe(&ux500_driver, ux500_probe);
212}
211}
213module_init(ux500_init);
212subsys_initcall(ux500_init);
214
215static void __exit ux500_exit(void)
216{
217 platform_driver_unregister(&ux500_driver);
218}
219module_exit(ux500_exit);
213
214static void __exit ux500_exit(void)
215{
216 platform_driver_unregister(&ux500_driver);
217}
218module_exit(ux500_exit);