diff options
author | Giuseppe CAVALLARO <peppe.cavallaro@st.com> | 2016-04-01 03:07:16 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-01 14:38:59 -0400 |
commit | a7657f128c279ae5796ab2ca7d04a7819f4259f0 (patch) | |
tree | 160bc8bb98d4211393230dcfbc6440359c00ecd0 /drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |
parent | d7e944c8ddc0983640a9a32868fb217485d12ca2 (diff) |
stmmac: fix MDIO settings
Initially the phy_bus_name was added to manipulate the
driver name but it was recently just used to manage the
fixed-link and then to take some decision at run-time.
So the patch uses the is_pseudo_fixed_link and removes
the phy_bus_name variable not necessary anymore.
The driver can manage the mdio registration by using phy-handle,
dwmac-mdio and own parameter e.g. snps,phy-addr.
This patch takes care about all these possible configurations
and fixes the mdio registration in case of there is a real
transceiver or a switch (that needs to be managed by using
fixed-link).
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Tested-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Cc: Gabriel Fernandez <gabriel.fernandez@linaro.org>
Cc: Dinh Nguyen <dinh.linux@gmail.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Phil Reid <preid@electromag.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c')
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 84 |
1 files changed, 66 insertions, 18 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 9cf181f839fd..cf37ea558ecc 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |||
@@ -132,6 +132,69 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev) | |||
132 | } | 132 | } |
133 | 133 | ||
134 | /** | 134 | /** |
135 | * stmmac_dt_phy - parse device-tree driver parameters to allocate PHY resources | ||
136 | * @plat: driver data platform structure | ||
137 | * @np: device tree node | ||
138 | * @dev: device pointer | ||
139 | * Description: | ||
140 | * The mdio bus will be allocated in case of a phy transceiver is on board; | ||
141 | * it will be NULL if the fixed-link is configured. | ||
142 | * If there is the "snps,dwmac-mdio" sub-node the mdio will be allocated | ||
143 | * in any case (for DSA, mdio must be registered even if fixed-link). | ||
144 | * The table below sums the supported configurations: | ||
145 | * ------------------------------- | ||
146 | * snps,phy-addr | Y | ||
147 | * ------------------------------- | ||
148 | * phy-handle | Y | ||
149 | * ------------------------------- | ||
150 | * fixed-link | N | ||
151 | * ------------------------------- | ||
152 | * snps,dwmac-mdio | | ||
153 | * even if | Y | ||
154 | * fixed-link | | ||
155 | * ------------------------------- | ||
156 | * | ||
157 | * It returns 0 in case of success otherwise -ENODEV. | ||
158 | */ | ||
159 | static int stmmac_dt_phy(struct plat_stmmacenet_data *plat, | ||
160 | struct device_node *np, struct device *dev) | ||
161 | { | ||
162 | bool mdio = true; | ||
163 | |||
164 | /* If phy-handle property is passed from DT, use it as the PHY */ | ||
165 | plat->phy_node = of_parse_phandle(np, "phy-handle", 0); | ||
166 | if (plat->phy_node) | ||
167 | dev_dbg(dev, "Found phy-handle subnode\n"); | ||
168 | |||
169 | /* If phy-handle is not specified, check if we have a fixed-phy */ | ||
170 | if (!plat->phy_node && of_phy_is_fixed_link(np)) { | ||
171 | if ((of_phy_register_fixed_link(np) < 0)) | ||
172 | return -ENODEV; | ||
173 | |||
174 | dev_dbg(dev, "Found fixed-link subnode\n"); | ||
175 | plat->phy_node = of_node_get(np); | ||
176 | mdio = false; | ||
177 | } | ||
178 | |||
179 | /* If snps,dwmac-mdio is passed from DT, always register the MDIO */ | ||
180 | for_each_child_of_node(np, plat->mdio_node) { | ||
181 | if (of_device_is_compatible(plat->mdio_node, "snps,dwmac-mdio")) | ||
182 | break; | ||
183 | } | ||
184 | |||
185 | if (plat->mdio_node) { | ||
186 | dev_dbg(dev, "Found MDIO subnode\n"); | ||
187 | mdio = true; | ||
188 | } | ||
189 | |||
190 | if (mdio) | ||
191 | plat->mdio_bus_data = | ||
192 | devm_kzalloc(dev, sizeof(struct stmmac_mdio_bus_data), | ||
193 | GFP_KERNEL); | ||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | /** | ||
135 | * stmmac_probe_config_dt - parse device-tree driver parameters | 198 | * stmmac_probe_config_dt - parse device-tree driver parameters |
136 | * @pdev: platform_device structure | 199 | * @pdev: platform_device structure |
137 | * @plat: driver data platform structure | 200 | * @plat: driver data platform structure |
@@ -165,30 +228,15 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) | |||
165 | /* Default to phy auto-detection */ | 228 | /* Default to phy auto-detection */ |
166 | plat->phy_addr = -1; | 229 | plat->phy_addr = -1; |
167 | 230 | ||
168 | /* If we find a phy-handle property, use it as the PHY */ | ||
169 | plat->phy_node = of_parse_phandle(np, "phy-handle", 0); | ||
170 | |||
171 | /* If phy-handle is not specified, check if we have a fixed-phy */ | ||
172 | if (!plat->phy_node && of_phy_is_fixed_link(np)) { | ||
173 | if ((of_phy_register_fixed_link(np) < 0)) | ||
174 | return ERR_PTR(-ENODEV); | ||
175 | |||
176 | plat->phy_node = of_node_get(np); | ||
177 | } | ||
178 | |||
179 | /* "snps,phy-addr" is not a standard property. Mark it as deprecated | 231 | /* "snps,phy-addr" is not a standard property. Mark it as deprecated |
180 | * and warn of its use. Remove this when phy node support is added. | 232 | * and warn of its use. Remove this when phy node support is added. |
181 | */ | 233 | */ |
182 | if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0) | 234 | if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0) |
183 | dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n"); | 235 | dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n"); |
184 | 236 | ||
185 | if ((plat->phy_node && !of_phy_is_fixed_link(np)) || plat->phy_bus_name) | 237 | /* To Configure PHY by using all device-tree supported properties */ |
186 | plat->mdio_bus_data = NULL; | 238 | if (stmmac_dt_phy(plat, np, &pdev->dev)) |
187 | else | 239 | return ERR_PTR(-ENODEV); |
188 | plat->mdio_bus_data = | ||
189 | devm_kzalloc(&pdev->dev, | ||
190 | sizeof(struct stmmac_mdio_bus_data), | ||
191 | GFP_KERNEL); | ||
192 | 240 | ||
193 | of_property_read_u32(np, "tx-fifo-depth", &plat->tx_fifo_size); | 241 | of_property_read_u32(np, "tx-fifo-depth", &plat->tx_fifo_size); |
194 | 242 | ||