2 * Combined Ethernet driver for Motorola MPC8xx and MPC82xx.
4 * Copyright (c) 2003 Intracom S.A.
5 * by Pantelis Antoniou <panto@intracom.gr>
7 * 2005 (c) MontaVista Software, Inc.
8 * Vitaly Bordug <vbordug@ru.mvista.com>
10 * This file is licensed under the terms of the GNU General Public License
11 * version 2. This program is licensed "as is" without any warranty of any
12 * kind, whether express or implied.
15 #include <linux/module.h>
16 #include <linux/ioport.h>
17 #include <linux/slab.h>
18 #include <linux/init.h>
19 #include <linux/interrupt.h>
20 #include <linux/netdevice.h>
21 #include <linux/etherdevice.h>
22 #include <linux/mii.h>
23 #include <linux/platform_device.h>
24 #include <linux/mdio-bitbang.h>
26 #ifdef CONFIG_PPC_CPM_NEW_BINDING
27 #include <linux/of_platform.h>
33 struct mdiobb_ctrl ctrl
;
40 /* FIXME: If any other users of GPIO crop up, then these will have to
41 * have some sort of global synchronization to avoid races with other
42 * pins on the same port. The ideal solution would probably be to
43 * bind the ports to a GPIO driver, and have this be a client of it.
45 static inline void bb_set(u32 __iomem
*p
, u32 m
)
47 out_be32(p
, in_be32(p
) | m
);
50 static inline void bb_clr(u32 __iomem
*p
, u32 m
)
52 out_be32(p
, in_be32(p
) & ~m
);
55 static inline int bb_read(u32 __iomem
*p
, u32 m
)
57 return (in_be32(p
) & m
) != 0;
60 static inline void mdio_dir(struct mdiobb_ctrl
*ctrl
, int dir
)
62 struct bb_info
*bitbang
= container_of(ctrl
, struct bb_info
, ctrl
);
65 bb_set(bitbang
->dir
, bitbang
->mdio_msk
);
67 bb_clr(bitbang
->dir
, bitbang
->mdio_msk
);
69 /* Read back to flush the write. */
70 in_be32(bitbang
->dir
);
73 static inline int mdio_read(struct mdiobb_ctrl
*ctrl
)
75 struct bb_info
*bitbang
= container_of(ctrl
, struct bb_info
, ctrl
);
76 return bb_read(bitbang
->dat
, bitbang
->mdio_msk
);
79 static inline void mdio(struct mdiobb_ctrl
*ctrl
, int what
)
81 struct bb_info
*bitbang
= container_of(ctrl
, struct bb_info
, ctrl
);
84 bb_set(bitbang
->dat
, bitbang
->mdio_msk
);
86 bb_clr(bitbang
->dat
, bitbang
->mdio_msk
);
88 /* Read back to flush the write. */
89 in_be32(bitbang
->dat
);
92 static inline void mdc(struct mdiobb_ctrl
*ctrl
, int what
)
94 struct bb_info
*bitbang
= container_of(ctrl
, struct bb_info
, ctrl
);
97 bb_set(bitbang
->dat
, bitbang
->mdc_msk
);
99 bb_clr(bitbang
->dat
, bitbang
->mdc_msk
);
101 /* Read back to flush the write. */
102 in_be32(bitbang
->dat
);
105 static struct mdiobb_ops bb_ops
= {
106 .owner
= THIS_MODULE
,
108 .set_mdio_dir
= mdio_dir
,
109 .set_mdio_data
= mdio
,
110 .get_mdio_data
= mdio_read
,
113 #ifdef CONFIG_PPC_CPM_NEW_BINDING
114 static int __devinit
fs_mii_bitbang_init(struct mii_bus
*bus
,
115 struct device_node
*np
)
119 int mdio_pin
, mdc_pin
, len
;
120 struct bb_info
*bitbang
= bus
->priv
;
122 int ret
= of_address_to_resource(np
, 0, &res
);
126 if (res
.end
- res
.start
< 13)
129 /* This should really encode the pin number as well, but all
130 * we get is an int, and the odds of multiple bitbang mdio buses
131 * is low enough that it's not worth going too crazy.
133 snprintf(bus
->id
, MII_BUS_ID_SIZE
, "%x", res
.start
);
135 data
= of_get_property(np
, "fsl,mdio-pin", &len
);
136 if (!data
|| len
!= 4)
140 data
= of_get_property(np
, "fsl,mdc-pin", &len
);
141 if (!data
|| len
!= 4)
145 bitbang
->dir
= ioremap(res
.start
, res
.end
- res
.start
+ 1);
149 bitbang
->dat
= bitbang
->dir
+ 4;
150 bitbang
->mdio_msk
= 1 << (31 - mdio_pin
);
151 bitbang
->mdc_msk
= 1 << (31 - mdc_pin
);
156 static void __devinit
add_phy(struct mii_bus
*bus
, struct device_node
*np
)
161 data
= of_get_property(np
, "reg", &len
);
162 if (!data
|| len
!= 4)
166 bus
->phy_mask
&= ~(1 << id
);
168 irq
= of_irq_to_resource(np
, 0, NULL
);
173 static int __devinit
fs_enet_mdio_probe(struct of_device
*ofdev
,
174 const struct of_device_id
*match
)
176 struct device_node
*np
= NULL
;
177 struct mii_bus
*new_bus
;
178 struct bb_info
*bitbang
;
182 bitbang
= kzalloc(sizeof(struct bb_info
), GFP_KERNEL
);
186 bitbang
->ctrl
.ops
= &bb_ops
;
188 new_bus
= alloc_mdio_bitbang(&bitbang
->ctrl
);
192 new_bus
->name
= "CPM2 Bitbanged MII",
194 ret
= fs_mii_bitbang_init(new_bus
, ofdev
->node
);
198 new_bus
->phy_mask
= ~0;
199 new_bus
->irq
= kmalloc(sizeof(int) * PHY_MAX_ADDR
, GFP_KERNEL
);
203 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
204 new_bus
->irq
[i
] = -1;
206 while ((np
= of_get_next_child(ofdev
->node
, np
)))
207 if (!strcmp(np
->type
, "ethernet-phy"))
208 add_phy(new_bus
, np
);
210 new_bus
->dev
= &ofdev
->dev
;
211 dev_set_drvdata(&ofdev
->dev
, new_bus
);
213 ret
= mdiobus_register(new_bus
);
220 dev_set_drvdata(&ofdev
->dev
, NULL
);
223 iounmap(bitbang
->dir
);
227 free_mdio_bitbang(new_bus
);
232 static int fs_enet_mdio_remove(struct of_device
*ofdev
)
234 struct mii_bus
*bus
= dev_get_drvdata(&ofdev
->dev
);
235 struct bb_info
*bitbang
= bus
->priv
;
237 mdiobus_unregister(bus
);
238 free_mdio_bitbang(bus
);
239 dev_set_drvdata(&ofdev
->dev
, NULL
);
241 iounmap(bitbang
->dir
);
248 static struct of_device_id fs_enet_mdio_bb_match
[] = {
250 .compatible
= "fsl,cpm2-mdio-bitbang",
255 static struct of_platform_driver fs_enet_bb_mdio_driver
= {
256 .name
= "fsl-bb-mdio",
257 .match_table
= fs_enet_mdio_bb_match
,
258 .probe
= fs_enet_mdio_probe
,
259 .remove
= fs_enet_mdio_remove
,
262 static int fs_enet_mdio_bb_init(void)
264 return of_register_platform_driver(&fs_enet_bb_mdio_driver
);
267 static void fs_enet_mdio_bb_exit(void)
269 of_unregister_platform_driver(&fs_enet_bb_mdio_driver
);
272 module_init(fs_enet_mdio_bb_init
);
273 module_exit(fs_enet_mdio_bb_exit
);
275 static int __devinit
fs_mii_bitbang_init(struct bb_info
*bitbang
,
276 struct fs_mii_bb_platform_info
*fmpi
)
278 bitbang
->dir
= (u32 __iomem
*)fmpi
->mdio_dir
.offset
;
279 bitbang
->dat
= (u32 __iomem
*)fmpi
->mdio_dat
.offset
;
280 bitbang
->mdio_msk
= 1U << (31 - fmpi
->mdio_dat
.bit
);
281 bitbang
->mdc_msk
= 1U << (31 - fmpi
->mdc_dat
.bit
);
286 static int __devinit
fs_enet_mdio_probe(struct device
*dev
)
288 struct platform_device
*pdev
= to_platform_device(dev
);
289 struct fs_mii_bb_platform_info
*pdata
;
290 struct mii_bus
*new_bus
;
291 struct bb_info
*bitbang
;
297 bitbang
= kzalloc(sizeof(struct bb_info
), GFP_KERNEL
);
302 bitbang
->ctrl
.ops
= &bb_ops
;
304 new_bus
= alloc_mdio_bitbang(&bitbang
->ctrl
);
309 new_bus
->name
= "BB MII Bus",
310 snprintf(new_bus
->id
, MII_BUS_ID_SIZE
, "%x", pdev
->id
);
312 new_bus
->phy_mask
= ~0x9;
313 pdata
= (struct fs_mii_bb_platform_info
*)pdev
->dev
.platform_data
;
316 printk(KERN_ERR
"gfar mdio %d: Missing platform data!\n", pdev
->id
);
321 fs_mii_bitbang_init(bitbang
, pdata
);
323 new_bus
->priv
= bitbang
;
325 new_bus
->irq
= pdata
->irq
;
328 dev_set_drvdata(dev
, new_bus
);
330 err
= mdiobus_register(new_bus
);
333 printk (KERN_ERR
"%s: Cannot register as MDIO bus\n",
335 goto bus_register_fail
;
341 free_mdio_bitbang(new_bus
);
347 static int fs_enet_mdio_remove(struct device
*dev
)
349 struct mii_bus
*bus
= dev_get_drvdata(dev
);
351 mdiobus_unregister(bus
);
353 dev_set_drvdata(dev
, NULL
);
355 free_mdio_bitbang(bus
);
360 static struct device_driver fs_enet_bb_mdio_driver
= {
361 .name
= "fsl-bb-mdio",
362 .bus
= &platform_bus_type
,
363 .probe
= fs_enet_mdio_probe
,
364 .remove
= fs_enet_mdio_remove
,
367 int fs_enet_mdio_bb_init(void)
369 return driver_register(&fs_enet_bb_mdio_driver
);
372 void fs_enet_mdio_bb_exit(void)
374 driver_unregister(&fs_enet_bb_mdio_driver
);