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); |