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