aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/xilinx
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@xilinx.com>2013-06-03 20:03:27 -0400
committerDavid S. Miller <davem@davemloft.net>2013-06-04 20:39:09 -0400
commit7a3e2585f2fd543ac7284a1f09641628f730f720 (patch)
tree890c6db4f4ea667ac726c8528f4af995d56740b8 /drivers/net/ethernet/xilinx
parent15dd16c233b6d5ceea3a00f18d7c42902d0ac6b6 (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.c67
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 */
1077static void xemaclite_remove_ndev(struct net_device *ndev) 1077static 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 */
1127static int xemaclite_of_probe(struct platform_device *ofdev) 1128static 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
1231error1: 1213error:
1232 release_mem_region(ndev->mem_start, resource_size(&r_mem)); 1214 xemaclite_remove_ndev(ndev, ofdev);
1233
1234error2:
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;