diff options
| author | Michal Simek <michal.simek@xilinx.com> | 2013-06-03 20:03:27 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-06-04 20:39:09 -0400 |
| commit | 7a3e2585f2fd543ac7284a1f09641628f730f720 (patch) | |
| tree | 890c6db4f4ea667ac726c8528f4af995d56740b8 /drivers/net/ethernet/xilinx | |
| parent | 15dd16c233b6d5ceea3a00f18d7c42902d0ac6b6 (diff) | |
net: emaclite: Use platform resource table
Read data directly from platform recource table
and do not use of_irq_to_resource().
Also use devm_request_and_ioremap() for probe
functions simplification.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/xilinx')
| -rw-r--r-- | drivers/net/ethernet/xilinx/xilinx_emaclite.c | 67 |
1 files changed, 22 insertions, 45 deletions
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index aaadf7e551df..c4d8aeffb4ba 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c | |||
| @@ -1074,13 +1074,14 @@ static int xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev) | |||
| 1074 | * This function un maps the IO region of the Emaclite device and frees the net | 1074 | * This function un maps the IO region of the Emaclite device and frees the net |
| 1075 | * device. | 1075 | * device. |
| 1076 | */ | 1076 | */ |
| 1077 | static void xemaclite_remove_ndev(struct net_device *ndev) | 1077 | static void xemaclite_remove_ndev(struct net_device *ndev, |
| 1078 | struct platform_device *pdev) | ||
| 1078 | { | 1079 | { |
| 1079 | if (ndev) { | 1080 | if (ndev) { |
| 1080 | struct net_local *lp = netdev_priv(ndev); | 1081 | struct net_local *lp = netdev_priv(ndev); |
| 1081 | 1082 | ||
| 1082 | if (lp->base_addr) | 1083 | if (lp->base_addr) |
| 1083 | iounmap((void __iomem __force *) (lp->base_addr)); | 1084 | devm_iounmap(&pdev->dev, lp->base_addr); |
| 1084 | free_netdev(ndev); | 1085 | free_netdev(ndev); |
| 1085 | } | 1086 | } |
| 1086 | } | 1087 | } |
| @@ -1126,8 +1127,7 @@ static struct net_device_ops xemaclite_netdev_ops; | |||
| 1126 | */ | 1127 | */ |
| 1127 | static int xemaclite_of_probe(struct platform_device *ofdev) | 1128 | static int xemaclite_of_probe(struct platform_device *ofdev) |
| 1128 | { | 1129 | { |
| 1129 | struct resource r_irq; /* Interrupt resources */ | 1130 | struct resource *res; |
| 1130 | struct resource r_mem; /* IO mem resources */ | ||
| 1131 | struct net_device *ndev = NULL; | 1131 | struct net_device *ndev = NULL; |
| 1132 | struct net_local *lp = NULL; | 1132 | struct net_local *lp = NULL; |
| 1133 | struct device *dev = &ofdev->dev; | 1133 | struct device *dev = &ofdev->dev; |
| @@ -1137,20 +1137,6 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
| 1137 | 1137 | ||
| 1138 | dev_info(dev, "Device Tree Probing\n"); | 1138 | dev_info(dev, "Device Tree Probing\n"); |
| 1139 | 1139 | ||
| 1140 | /* Get iospace for the device */ | ||
| 1141 | rc = of_address_to_resource(ofdev->dev.of_node, 0, &r_mem); | ||
| 1142 | if (rc) { | ||
| 1143 | dev_err(dev, "invalid address\n"); | ||
| 1144 | return rc; | ||
| 1145 | } | ||
| 1146 | |||
| 1147 | /* Get IRQ for the device */ | ||
| 1148 | rc = of_irq_to_resource(ofdev->dev.of_node, 0, &r_irq); | ||
| 1149 | if (!rc) { | ||
| 1150 | dev_err(dev, "no IRQ found\n"); | ||
| 1151 | return rc; | ||
| 1152 | } | ||
| 1153 | |||
| 1154 | /* Create an ethernet device instance */ | 1140 | /* Create an ethernet device instance */ |
| 1155 | ndev = alloc_etherdev(sizeof(struct net_local)); | 1141 | ndev = alloc_etherdev(sizeof(struct net_local)); |
| 1156 | if (!ndev) | 1142 | if (!ndev) |
| @@ -1159,29 +1145,25 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
| 1159 | dev_set_drvdata(dev, ndev); | 1145 | dev_set_drvdata(dev, ndev); |
| 1160 | SET_NETDEV_DEV(ndev, &ofdev->dev); | 1146 | SET_NETDEV_DEV(ndev, &ofdev->dev); |
| 1161 | 1147 | ||
| 1162 | ndev->irq = r_irq.start; | ||
| 1163 | ndev->mem_start = r_mem.start; | ||
| 1164 | ndev->mem_end = r_mem.end; | ||
| 1165 | |||
| 1166 | lp = netdev_priv(ndev); | 1148 | lp = netdev_priv(ndev); |
| 1167 | lp->ndev = ndev; | 1149 | lp->ndev = ndev; |
| 1168 | 1150 | ||
| 1169 | if (!request_mem_region(ndev->mem_start, | 1151 | /* Get IRQ for the device */ |
| 1170 | ndev->mem_end - ndev->mem_start + 1, | 1152 | res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0); |
| 1171 | DRIVER_NAME)) { | 1153 | if (!res) { |
| 1172 | dev_err(dev, "Couldn't lock memory region at %p\n", | 1154 | dev_err(dev, "no IRQ found\n"); |
| 1173 | (void *)ndev->mem_start); | 1155 | goto error; |
| 1174 | rc = -EBUSY; | ||
| 1175 | goto error2; | ||
| 1176 | } | 1156 | } |
| 1177 | 1157 | ||
| 1178 | /* Get the virtual base address for the device */ | 1158 | ndev->irq = res->start; |
| 1179 | lp->base_addr = ioremap(r_mem.start, resource_size(&r_mem)); | 1159 | |
| 1180 | if (NULL == lp->base_addr) { | 1160 | res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); |
| 1181 | dev_err(dev, "EmacLite: Could not allocate iomem\n"); | 1161 | lp->base_addr = devm_request_and_ioremap(&ofdev->dev, res); |
| 1182 | rc = -EIO; | 1162 | if (!lp->base_addr) |
| 1183 | goto error1; | 1163 | goto error; |
| 1184 | } | 1164 | |
| 1165 | ndev->mem_start = res->start; | ||
| 1166 | ndev->mem_end = res->end; | ||
| 1185 | 1167 | ||
| 1186 | spin_lock_init(&lp->reset_lock); | 1168 | spin_lock_init(&lp->reset_lock); |
| 1187 | lp->next_tx_buf_to_use = 0x0; | 1169 | lp->next_tx_buf_to_use = 0x0; |
| @@ -1219,7 +1201,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
| 1219 | if (rc) { | 1201 | if (rc) { |
| 1220 | dev_err(dev, | 1202 | dev_err(dev, |
| 1221 | "Cannot register network device, aborting\n"); | 1203 | "Cannot register network device, aborting\n"); |
| 1222 | goto error1; | 1204 | goto error; |
| 1223 | } | 1205 | } |
| 1224 | 1206 | ||
| 1225 | dev_info(dev, | 1207 | dev_info(dev, |
| @@ -1228,11 +1210,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev) | |||
| 1228 | (unsigned int __force)lp->base_addr, ndev->irq); | 1210 | (unsigned int __force)lp->base_addr, ndev->irq); |
| 1229 | return 0; | 1211 | return 0; |
| 1230 | 1212 | ||
| 1231 | error1: | 1213 | error: |
| 1232 | release_mem_region(ndev->mem_start, resource_size(&r_mem)); | 1214 | xemaclite_remove_ndev(ndev, ofdev); |
| 1233 | |||
| 1234 | error2: | ||
| 1235 | xemaclite_remove_ndev(ndev); | ||
| 1236 | return rc; | 1215 | return rc; |
| 1237 | } | 1216 | } |
| 1238 | 1217 | ||
| @@ -1267,9 +1246,7 @@ static int xemaclite_of_remove(struct platform_device *of_dev) | |||
| 1267 | of_node_put(lp->phy_node); | 1246 | of_node_put(lp->phy_node); |
| 1268 | lp->phy_node = NULL; | 1247 | lp->phy_node = NULL; |
| 1269 | 1248 | ||
| 1270 | release_mem_region(ndev->mem_start, ndev->mem_end-ndev->mem_start + 1); | 1249 | xemaclite_remove_ndev(ndev, of_dev); |
| 1271 | |||
| 1272 | xemaclite_remove_ndev(ndev); | ||
| 1273 | dev_set_drvdata(dev, NULL); | 1250 | dev_set_drvdata(dev, NULL); |
| 1274 | 1251 | ||
| 1275 | return 0; | 1252 | return 0; |
