Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux...
[pandora-kernel.git] / drivers / net / phy / micrel.c
1 /*
2  * drivers/net/phy/micrel.c
3  *
4  * Driver for Micrel PHYs
5  *
6  * Author: David J. Choi
7  *
8  * Copyright (c) 2010 Micrel, Inc.
9  *
10  * This program is free software; you can redistribute  it and/or modify it
11  * under  the terms of  the GNU General  Public License as published by the
12  * Free Software Foundation;  either version 2 of the  License, or (at your
13  * option) any later version.
14  *
15  * Support : ksz9021 , vsc8201, ks8001
16  */
17
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/phy.h>
21
22 #define PHY_ID_KSZ9021                  0x00221611
23 #define PHY_ID_VSC8201                  0x000FC413
24 #define PHY_ID_KS8001                   0x0022161A
25
26
27 static int kszphy_config_init(struct phy_device *phydev)
28 {
29         return 0;
30 }
31
32
33 static struct phy_driver ks8001_driver = {
34         .phy_id         = PHY_ID_KS8001,
35         .name           = "Micrel KS8001",
36         .phy_id_mask    = 0x00fffff0,
37         .features       = PHY_BASIC_FEATURES,
38         .flags          = PHY_POLL,
39         .config_init    = kszphy_config_init,
40         .config_aneg    = genphy_config_aneg,
41         .read_status    = genphy_read_status,
42         .driver         = { .owner = THIS_MODULE,},
43 };
44
45 static struct phy_driver vsc8201_driver = {
46         .phy_id         = PHY_ID_VSC8201,
47         .name           = "Micrel VSC8201",
48         .phy_id_mask    = 0x00fffff0,
49         .features       = PHY_BASIC_FEATURES,
50         .flags          = PHY_POLL,
51         .config_init    = kszphy_config_init,
52         .config_aneg    = genphy_config_aneg,
53         .read_status    = genphy_read_status,
54         .driver         = { .owner = THIS_MODULE,},
55 };
56
57 static struct phy_driver ksz9021_driver = {
58         .phy_id         = PHY_ID_KSZ9021,
59         .phy_id_mask    = 0x000fff10,
60         .name           = "Micrel KSZ9021 Gigabit PHY",
61         .features       = PHY_GBIT_FEATURES | SUPPORTED_Pause,
62         .flags          = PHY_POLL,
63         .config_init    = kszphy_config_init,
64         .config_aneg    = genphy_config_aneg,
65         .read_status    = genphy_read_status,
66         .driver         = { .owner = THIS_MODULE, },
67 };
68
69 static int __init ksphy_init(void)
70 {
71         int ret;
72
73         ret = phy_driver_register(&ks8001_driver);
74         if (ret)
75                 goto err1;
76         ret = phy_driver_register(&vsc8201_driver);
77         if (ret)
78                 goto err2;
79
80         ret = phy_driver_register(&ksz9021_driver);
81         if (ret)
82                 goto err3;
83         return 0;
84
85 err3:
86         phy_driver_unregister(&vsc8201_driver);
87 err2:
88         phy_driver_unregister(&ks8001_driver);
89 err1:
90         return ret;
91 }
92
93 static void __exit ksphy_exit(void)
94 {
95         phy_driver_unregister(&ks8001_driver);
96         phy_driver_unregister(&vsc8201_driver);
97         phy_driver_unregister(&ksz9021_driver);
98 }
99
100 module_init(ksphy_init);
101 module_exit(ksphy_exit);
102
103 MODULE_DESCRIPTION("Micrel PHY driver");
104 MODULE_AUTHOR("David J. Choi");
105 MODULE_LICENSE("GPL");