123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- From b36f694256f41bc71571f467646d015dda128d14 Mon Sep 17 00:00:00 2001
- From: Hauke Mehrtens <hauke@hauke-m.de>
- Date: Sat, 9 Nov 2013 17:03:59 +0100
- Subject: [PATCH 210/210] b44: register adm switch
- ---
- drivers/net/ethernet/broadcom/b44.c | 57 +++++++++++++++++++++++++++++++++++
- drivers/net/ethernet/broadcom/b44.h | 3 ++
- 2 files changed, 60 insertions(+)
- --- a/drivers/net/ethernet/broadcom/b44.c
- +++ b/drivers/net/ethernet/broadcom/b44.c
- @@ -31,6 +31,8 @@
- #include <linux/ssb/ssb.h>
- #include <linux/slab.h>
- #include <linux/phy.h>
- +#include <linux/platform_device.h>
- +#include <linux/platform_data/adm6996-gpio.h>
-
- #include <asm/uaccess.h>
- #include <asm/io.h>
- @@ -2240,6 +2242,70 @@ static void b44_adjust_link(struct net_d
- }
- }
-
- +#ifdef CONFIG_BCM47XX
- +static int b44_register_adm_switch(struct b44 *bp)
- +{
- + int gpio;
- + struct platform_device *pdev;
- + struct adm6996_gpio_platform_data adm_data = {0};
- + struct platform_device_info info = {0};
- +
- + adm_data.model = ADM6996L;
- + gpio = bcm47xx_nvram_gpio_pin("adm_eecs");
- + if (gpio >= 0)
- + adm_data.eecs = gpio;
- + else
- + adm_data.eecs = 2;
- +
- + gpio = bcm47xx_nvram_gpio_pin("adm_eesk");
- + if (gpio >= 0)
- + adm_data.eesk = gpio;
- + else
- + adm_data.eesk = 3;
- +
- + gpio = bcm47xx_nvram_gpio_pin("adm_eedi");
- + if (gpio >= 0)
- + adm_data.eedi = gpio;
- + else
- + adm_data.eedi = 4;
- +
- + gpio = bcm47xx_nvram_gpio_pin("adm_rc");
- + if (gpio >= 0)
- + adm_data.eerc = gpio;
- + else
- + adm_data.eerc = 5;
- +
- + info.parent = bp->sdev->dev;
- + info.name = "adm6996_gpio";
- + info.id = -1;
- + info.data = &adm_data;
- + info.size_data = sizeof(adm_data);
- +
- + if (!bp->adm_switch) {
- + pdev = platform_device_register_full(&info);
- + if (IS_ERR(pdev))
- + return PTR_ERR(pdev);
- +
- + bp->adm_switch = pdev;
- + }
- + return 0;
- +}
- +static void b44_unregister_adm_switch(struct b44 *bp)
- +{
- + if (bp->adm_switch)
- + platform_device_unregister(bp->adm_switch);
- +}
- +#else
- +static int b44_register_adm_switch(struct b44 *bp)
- +{
- + return 0;
- +}
- +static void b44_unregister_adm_switch(struct b44 *bp)
- +{
- +
- +}
- +#endif /* CONFIG_BCM47XX */
- +
- static int b44_register_phy_one(struct b44 *bp)
- {
- struct mii_bus *mii_bus;
- @@ -2283,6 +2349,9 @@ static int b44_register_phy_one(struct b
- if (!bp->mii_bus->phy_map[bp->phy_addr] &&
- (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
-
- + if (sprom->boardflags_lo & B44_BOARDFLAG_ADM)
- + b44_register_adm_switch(bp);
- +
- dev_info(sdev->dev,
- "could not find PHY at %i, use fixed one\n",
- bp->phy_addr);
- @@ -2479,6 +2548,7 @@ static void b44_remove_one(struct ssb_de
- unregister_netdev(dev);
- if (bp->flags & B44_FLAG_EXTERNAL_PHY)
- b44_unregister_phy_one(bp);
- + b44_unregister_adm_switch(bp);
- ssb_device_disable(sdev, 0);
- ssb_bus_may_powerdown(sdev->bus);
- netif_napi_del(&bp->napi);
- --- a/drivers/net/ethernet/broadcom/b44.h
- +++ b/drivers/net/ethernet/broadcom/b44.h
- @@ -404,6 +404,9 @@ struct b44 {
- struct mii_bus *mii_bus;
- int old_link;
- struct mii_if_info mii_if;
- +
- + /* platform device for associated switch */
- + struct platform_device *adm_switch;
- };
-
- #endif /* _B44_H */
|