aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_sx4.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-01-20 02:00:28 -0500
committerJeff Garzik <jeff@garzik.org>2007-02-09 17:39:37 -0500
commit24dc5f33ea4b504cfbd23fa159a4cacba8e4d800 (patch)
treed76de456157f555c9a65b83f426fd805fee1e846 /drivers/ata/sata_sx4.c
parentf0d36efdc624beb3d9e29b9ab9e9537bf0f25d5b (diff)
libata: update libata LLDs to use devres
Update libata LLDs to use devres. Core layer is already converted to support managed LLDs. This patch simplifies initialization and fixes many resource related bugs in init failure and detach path. For example, all converted drivers now handle ata_device_add() failure gracefully without excessive resource rollback code. As most resources are released automatically on driver detach, many drivers don't need or can do with much simpler ->{port|host}_stop(). In general, stop callbacks are need iff port or host needs to be given commands to shut it down. Note that freezing is enough in many cases and ports are automatically frozen before being detached. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/sata_sx4.c')
-rw-r--r--drivers/ata/sata_sx4.c131
1 files changed, 31 insertions, 100 deletions
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
index ae7992de4b08..d9838dcb4b01 100644
--- a/drivers/ata/sata_sx4.c
+++ b/drivers/ata/sata_sx4.c
@@ -42,7 +42,6 @@
42#include <scsi/scsi_host.h> 42#include <scsi/scsi_host.h>
43#include <scsi/scsi_cmnd.h> 43#include <scsi/scsi_cmnd.h>
44#include <linux/libata.h> 44#include <linux/libata.h>
45#include <asm/io.h>
46#include "sata_promise.h" 45#include "sata_promise.h"
47 46
48#define DRV_NAME "sata_sx4" 47#define DRV_NAME "sata_sx4"
@@ -156,11 +155,9 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance);
156static void pdc_eng_timeout(struct ata_port *ap); 155static void pdc_eng_timeout(struct ata_port *ap);
157static void pdc_20621_phy_reset (struct ata_port *ap); 156static void pdc_20621_phy_reset (struct ata_port *ap);
158static int pdc_port_start(struct ata_port *ap); 157static int pdc_port_start(struct ata_port *ap);
159static void pdc_port_stop(struct ata_port *ap);
160static void pdc20621_qc_prep(struct ata_queued_cmd *qc); 158static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
161static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf); 159static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
162static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf); 160static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
163static void pdc20621_host_stop(struct ata_host *host);
164static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe); 161static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
165static int pdc20621_detect_dimm(struct ata_probe_ent *pe); 162static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
166static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, 163static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe,
@@ -210,8 +207,6 @@ static const struct ata_port_operations pdc_20621_ops = {
210 .irq_handler = pdc20621_interrupt, 207 .irq_handler = pdc20621_interrupt,
211 .irq_clear = pdc20621_irq_clear, 208 .irq_clear = pdc20621_irq_clear,
212 .port_start = pdc_port_start, 209 .port_start = pdc_port_start,
213 .port_stop = pdc_port_stop,
214 .host_stop = pdc20621_host_stop,
215}; 210};
216 211
217static const struct ata_port_info pdc_port_info[] = { 212static const struct ata_port_info pdc_port_info[] = {
@@ -243,18 +238,6 @@ static struct pci_driver pdc_sata_pci_driver = {
243}; 238};
244 239
245 240
246static void pdc20621_host_stop(struct ata_host *host)
247{
248 struct pci_dev *pdev = to_pci_dev(host->dev);
249 struct pdc_host_priv *hpriv = host->private_data;
250 void __iomem *dimm_mmio = hpriv->dimm_mmio;
251
252 pci_iounmap(pdev, dimm_mmio);
253 kfree(hpriv);
254
255 pci_iounmap(pdev, host->mmio_base);
256}
257
258static int pdc_port_start(struct ata_port *ap) 241static int pdc_port_start(struct ata_port *ap)
259{ 242{
260 struct device *dev = ap->host->dev; 243 struct device *dev = ap->host->dev;
@@ -265,43 +248,19 @@ static int pdc_port_start(struct ata_port *ap)
265 if (rc) 248 if (rc)
266 return rc; 249 return rc;
267 250
268 pp = kmalloc(sizeof(*pp), GFP_KERNEL); 251 pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
269 if (!pp) { 252 if (!pp)
270 rc = -ENOMEM; 253 return -ENOMEM;
271 goto err_out;
272 }
273 memset(pp, 0, sizeof(*pp));
274 254
275 pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL); 255 pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
276 if (!pp->pkt) { 256 if (!pp->pkt)
277 rc = -ENOMEM; 257 return -ENOMEM;
278 goto err_out_kfree;
279 }
280 258
281 ap->private_data = pp; 259 ap->private_data = pp;
282 260
283 return 0; 261 return 0;
284
285err_out_kfree:
286 kfree(pp);
287err_out:
288 ata_port_stop(ap);
289 return rc;
290}
291
292
293static void pdc_port_stop(struct ata_port *ap)
294{
295 struct device *dev = ap->host->dev;
296 struct pdc_port_priv *pp = ap->private_data;
297
298 ap->private_data = NULL;
299 dma_free_coherent(dev, 128, pp->pkt, pp->pkt_dma);
300 kfree(pp);
301 ata_port_stop(ap);
302} 262}
303 263
304
305static void pdc_20621_phy_reset (struct ata_port *ap) 264static void pdc_20621_phy_reset (struct ata_port *ap)
306{ 265{
307 VPRINTK("ENTER\n"); 266 VPRINTK("ENTER\n");
@@ -1365,65 +1324,53 @@ static void pdc_20621_init(struct ata_probe_ent *pe)
1365static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 1324static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
1366{ 1325{
1367 static int printed_version; 1326 static int printed_version;
1368 struct ata_probe_ent *probe_ent = NULL; 1327 struct ata_probe_ent *probe_ent;
1369 unsigned long base; 1328 unsigned long base;
1370 void __iomem *mmio_base; 1329 void __iomem *mmio_base;
1371 void __iomem *dimm_mmio = NULL; 1330 void __iomem *dimm_mmio;
1372 struct pdc_host_priv *hpriv = NULL; 1331 struct pdc_host_priv *hpriv;
1373 unsigned int board_idx = (unsigned int) ent->driver_data; 1332 unsigned int board_idx = (unsigned int) ent->driver_data;
1374 int pci_dev_busy = 0;
1375 int rc; 1333 int rc;
1376 1334
1377 if (!printed_version++) 1335 if (!printed_version++)
1378 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); 1336 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
1379 1337
1380 rc = pci_enable_device(pdev); 1338 rc = pcim_enable_device(pdev);
1381 if (rc) 1339 if (rc)
1382 return rc; 1340 return rc;
1383 1341
1384 rc = pci_request_regions(pdev, DRV_NAME); 1342 rc = pci_request_regions(pdev, DRV_NAME);
1385 if (rc) { 1343 if (rc) {
1386 pci_dev_busy = 1; 1344 pcim_pin_device(pdev);
1387 goto err_out; 1345 return rc;
1388 } 1346 }
1389 1347
1390 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); 1348 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
1391 if (rc) 1349 if (rc)
1392 goto err_out_regions; 1350 return rc;
1393 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK); 1351 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
1394 if (rc) 1352 if (rc)
1395 goto err_out_regions; 1353 return rc;
1396 1354
1397 probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL); 1355 probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
1398 if (probe_ent == NULL) { 1356 if (probe_ent == NULL)
1399 rc = -ENOMEM; 1357 return -ENOMEM;
1400 goto err_out_regions;
1401 }
1402 1358
1403 memset(probe_ent, 0, sizeof(*probe_ent));
1404 probe_ent->dev = pci_dev_to_dev(pdev); 1359 probe_ent->dev = pci_dev_to_dev(pdev);
1405 INIT_LIST_HEAD(&probe_ent->node); 1360 INIT_LIST_HEAD(&probe_ent->node);
1406 1361
1407 mmio_base = pci_iomap(pdev, 3, 0); 1362 mmio_base = pcim_iomap(pdev, 3, 0);
1408 if (mmio_base == NULL) { 1363 if (mmio_base == NULL)
1409 rc = -ENOMEM; 1364 return -ENOMEM;
1410 goto err_out_free_ent;
1411 }
1412 base = (unsigned long) mmio_base; 1365 base = (unsigned long) mmio_base;
1413 1366
1414 hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL); 1367 hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
1415 if (!hpriv) { 1368 if (!hpriv)
1416 rc = -ENOMEM; 1369 return -ENOMEM;
1417 goto err_out_iounmap;
1418 }
1419 memset(hpriv, 0, sizeof(*hpriv));
1420 1370
1421 dimm_mmio = pci_iomap(pdev, 4, 0); 1371 dimm_mmio = pcim_iomap(pdev, 4, 0);
1422 if (!dimm_mmio) { 1372 if (!dimm_mmio)
1423 kfree(hpriv); 1373 return -ENOMEM;
1424 rc = -ENOMEM;
1425 goto err_out_iounmap;
1426 }
1427 1374
1428 hpriv->dimm_mmio = dimm_mmio; 1375 hpriv->dimm_mmio = dimm_mmio;
1429 1376
@@ -1451,31 +1398,15 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
1451 1398
1452 /* initialize adapter */ 1399 /* initialize adapter */
1453 /* initialize local dimm */ 1400 /* initialize local dimm */
1454 if (pdc20621_dimm_init(probe_ent)) { 1401 if (pdc20621_dimm_init(probe_ent))
1455 rc = -ENOMEM; 1402 return -ENOMEM;
1456 goto err_out_iounmap_dimm;
1457 }
1458 pdc_20621_init(probe_ent); 1403 pdc_20621_init(probe_ent);
1459 1404
1460 /* FIXME: check ata_device_add return value */ 1405 if (!ata_device_add(probe_ent))
1461 ata_device_add(probe_ent); 1406 return -ENODEV;
1462 kfree(probe_ent);
1463 1407
1408 devm_kfree(&pdev->dev, probe_ent);
1464 return 0; 1409 return 0;
1465
1466err_out_iounmap_dimm: /* only get to this label if 20621 */
1467 kfree(hpriv);
1468 pci_iounmap(pdev, dimm_mmio);
1469err_out_iounmap:
1470 pci_iounmap(pdev, mmio_base);
1471err_out_free_ent:
1472 kfree(probe_ent);
1473err_out_regions:
1474 pci_release_regions(pdev);
1475err_out:
1476 if (!pci_dev_busy)
1477 pci_disable_device(pdev);
1478 return rc;
1479} 1410}
1480 1411
1481 1412