xref: /linux/drivers/ata/pata_platform.c (revision 606d099cdd1080bbb50ea50dc52d98252f8f10a1)
1 /*
2  * Generic platform device PATA driver
3  *
4  * Copyright (C) 2006  Paul Mundt
5  *
6  * Based on pata_pcmcia:
7  *
8  *   Copyright 2005-2006 Red Hat Inc <alan@redhat.com>, all rights reserved.
9  *
10  * This file is subject to the terms and conditions of the GNU General Public
11  * License.  See the file "COPYING" in the main directory of this archive
12  * for more details.
13  */
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/blkdev.h>
18 #include <scsi/scsi_host.h>
19 #include <linux/ata.h>
20 #include <linux/libata.h>
21 #include <linux/platform_device.h>
22 #include <linux/pata_platform.h>
23 
24 #define DRV_NAME "pata_platform"
25 #define DRV_VERSION "0.1.2"
26 
27 static int pio_mask = 1;
28 
29 /*
30  * Provide our own set_mode() as we don't want to change anything that has
31  * already been configured..
32  */
33 static void pata_platform_set_mode(struct ata_port *ap)
34 {
35 	int i;
36 
37 	for (i = 0; i < ATA_MAX_DEVICES; i++) {
38 		struct ata_device *dev = &ap->device[i];
39 
40 		if (ata_dev_enabled(dev)) {
41 			/* We don't really care */
42 			dev->pio_mode = dev->xfer_mode = XFER_PIO_0;
43 			dev->xfer_shift = ATA_SHIFT_PIO;
44 			dev->flags |= ATA_DFLAG_PIO;
45 		}
46 	}
47 }
48 
49 static void pata_platform_host_stop(struct ata_host *host)
50 {
51 	int i;
52 
53 	/*
54 	 * Unmap the bases for MMIO
55 	 */
56 	for (i = 0; i < host->n_ports; i++) {
57 		struct ata_port *ap = host->ports[i];
58 
59 		if (ap->flags & ATA_FLAG_MMIO) {
60 			iounmap((void __iomem *)ap->ioaddr.ctl_addr);
61 			iounmap((void __iomem *)ap->ioaddr.cmd_addr);
62 		}
63 	}
64 }
65 
66 static struct scsi_host_template pata_platform_sht = {
67 	.module			= THIS_MODULE,
68 	.name			= DRV_NAME,
69 	.ioctl			= ata_scsi_ioctl,
70 	.queuecommand		= ata_scsi_queuecmd,
71 	.can_queue		= ATA_DEF_QUEUE,
72 	.this_id		= ATA_SHT_THIS_ID,
73 	.sg_tablesize		= LIBATA_MAX_PRD,
74 	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
75 	.emulated		= ATA_SHT_EMULATED,
76 	.use_clustering		= ATA_SHT_USE_CLUSTERING,
77 	.proc_name		= DRV_NAME,
78 	.dma_boundary		= ATA_DMA_BOUNDARY,
79 	.slave_configure	= ata_scsi_slave_config,
80 	.slave_destroy		= ata_scsi_slave_destroy,
81 	.bios_param		= ata_std_bios_param,
82 };
83 
84 static struct ata_port_operations pata_platform_port_ops = {
85 	.set_mode		= pata_platform_set_mode,
86 
87 	.port_disable		= ata_port_disable,
88 	.tf_load		= ata_tf_load,
89 	.tf_read		= ata_tf_read,
90 	.check_status		= ata_check_status,
91 	.exec_command		= ata_exec_command,
92 	.dev_select		= ata_std_dev_select,
93 
94 	.freeze			= ata_bmdma_freeze,
95 	.thaw			= ata_bmdma_thaw,
96 	.error_handler		= ata_bmdma_error_handler,
97 	.post_internal_cmd	= ata_bmdma_post_internal_cmd,
98 
99 	.qc_prep		= ata_qc_prep,
100 	.qc_issue		= ata_qc_issue_prot,
101 
102 	.data_xfer		= ata_pio_data_xfer_noirq,
103 
104 	.irq_handler		= ata_interrupt,
105 	.irq_clear		= ata_bmdma_irq_clear,
106 
107 	.port_start		= ata_port_start,
108 	.port_stop		= ata_port_stop,
109 	.host_stop		= pata_platform_host_stop
110 };
111 
112 static void pata_platform_setup_port(struct ata_ioports *ioaddr,
113 				     struct pata_platform_info *info)
114 {
115 	unsigned int shift = 0;
116 
117 	/* Fixup the port shift for platforms that need it */
118 	if (info && info->ioport_shift)
119 		shift = info->ioport_shift;
120 
121 	ioaddr->data_addr	= ioaddr->cmd_addr + (ATA_REG_DATA    << shift);
122 	ioaddr->error_addr	= ioaddr->cmd_addr + (ATA_REG_ERR     << shift);
123 	ioaddr->feature_addr	= ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
124 	ioaddr->nsect_addr	= ioaddr->cmd_addr + (ATA_REG_NSECT   << shift);
125 	ioaddr->lbal_addr	= ioaddr->cmd_addr + (ATA_REG_LBAL    << shift);
126 	ioaddr->lbam_addr	= ioaddr->cmd_addr + (ATA_REG_LBAM    << shift);
127 	ioaddr->lbah_addr	= ioaddr->cmd_addr + (ATA_REG_LBAH    << shift);
128 	ioaddr->device_addr	= ioaddr->cmd_addr + (ATA_REG_DEVICE  << shift);
129 	ioaddr->status_addr	= ioaddr->cmd_addr + (ATA_REG_STATUS  << shift);
130 	ioaddr->command_addr	= ioaddr->cmd_addr + (ATA_REG_CMD     << shift);
131 }
132 
133 /**
134  *	pata_platform_probe		-	attach a platform interface
135  *	@pdev: platform device
136  *
137  *	Register a platform bus IDE interface. Such interfaces are PIO and we
138  *	assume do not support IRQ sharing.
139  *
140  *	Platform devices are expected to contain 3 resources per port:
141  *
142  *		- I/O Base (IORESOURCE_IO or IORESOURCE_MEM)
143  *		- CTL Base (IORESOURCE_IO or IORESOURCE_MEM)
144  *		- IRQ	   (IORESOURCE_IRQ)
145  *
146  *	If the base resources are both mem types, the ioremap() is handled
147  *	here. For IORESOURCE_IO, it's assumed that there's no remapping
148  *	necessary.
149  */
150 static int __devinit pata_platform_probe(struct platform_device *pdev)
151 {
152 	struct resource *io_res, *ctl_res;
153 	struct ata_probe_ent ae;
154 	unsigned int mmio;
155 	int ret;
156 
157 	/*
158 	 * Simple resource validation ..
159 	 */
160 	if (unlikely(pdev->num_resources != 3)) {
161 		dev_err(&pdev->dev, "invalid number of resources\n");
162 		return -EINVAL;
163 	}
164 
165 	/*
166 	 * Get the I/O base first
167 	 */
168 	io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
169 	if (io_res == NULL) {
170 		io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
171 		if (unlikely(io_res == NULL))
172 			return -EINVAL;
173 	}
174 
175 	/*
176 	 * Then the CTL base
177 	 */
178 	ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
179 	if (ctl_res == NULL) {
180 		ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
181 		if (unlikely(ctl_res == NULL))
182 			return -EINVAL;
183 	}
184 
185 	/*
186 	 * Check for MMIO
187 	 */
188 	mmio = (( io_res->flags == IORESOURCE_MEM) &&
189 		(ctl_res->flags == IORESOURCE_MEM));
190 
191 	/*
192 	 * Now that that's out of the way, wire up the port..
193 	 */
194 	memset(&ae, 0, sizeof(struct ata_probe_ent));
195 	INIT_LIST_HEAD(&ae.node);
196 	ae.dev = &pdev->dev;
197 	ae.port_ops = &pata_platform_port_ops;
198 	ae.sht = &pata_platform_sht;
199 	ae.n_ports = 1;
200 	ae.pio_mask = pio_mask;
201 	ae.irq = platform_get_irq(pdev, 0);
202 	ae.irq_flags = 0;
203 	ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
204 
205 	/*
206 	 * Handle the MMIO case
207 	 */
208 	if (mmio) {
209 		ae.port_flags |= ATA_FLAG_MMIO;
210 
211 		ae.port[0].cmd_addr = (unsigned long)ioremap(io_res->start,
212 				io_res->end - io_res->start + 1);
213 		if (unlikely(!ae.port[0].cmd_addr)) {
214 			dev_err(&pdev->dev, "failed to remap IO base\n");
215 			return -ENXIO;
216 		}
217 
218 		ae.port[0].ctl_addr = (unsigned long)ioremap(ctl_res->start,
219 				ctl_res->end - ctl_res->start + 1);
220 		if (unlikely(!ae.port[0].ctl_addr)) {
221 			dev_err(&pdev->dev, "failed to remap CTL base\n");
222 			ret = -ENXIO;
223 			goto bad_remap;
224 		}
225 	} else {
226 		ae.port[0].cmd_addr = io_res->start;
227 		ae.port[0].ctl_addr = ctl_res->start;
228 	}
229 
230 	ae.port[0].altstatus_addr = ae.port[0].ctl_addr;
231 
232 	pata_platform_setup_port(&ae.port[0], pdev->dev.platform_data);
233 
234 	if (unlikely(ata_device_add(&ae) == 0)) {
235 		ret = -ENODEV;
236 		goto add_failed;
237 	}
238 
239 	return 0;
240 
241 add_failed:
242 	if (ae.port[0].ctl_addr && mmio)
243 		iounmap((void __iomem *)ae.port[0].ctl_addr);
244 bad_remap:
245 	if (ae.port[0].cmd_addr && mmio)
246 		iounmap((void __iomem *)ae.port[0].cmd_addr);
247 
248 	return ret;
249 }
250 
251 /**
252  *	pata_platform_remove	-	unplug a platform interface
253  *	@pdev: platform device
254  *
255  *	A platform bus ATA device has been unplugged. Perform the needed
256  *	cleanup. Also called on module unload for any active devices.
257  */
258 static int __devexit pata_platform_remove(struct platform_device *pdev)
259 {
260 	struct device *dev = &pdev->dev;
261 	struct ata_host *host = dev_get_drvdata(dev);
262 
263 	ata_host_remove(host);
264 	dev_set_drvdata(dev, NULL);
265 
266 	return 0;
267 }
268 
269 static struct platform_driver pata_platform_driver = {
270 	.probe		= pata_platform_probe,
271 	.remove		= __devexit_p(pata_platform_remove),
272 	.driver = {
273 		.name		= DRV_NAME,
274 		.owner		= THIS_MODULE,
275 	},
276 };
277 
278 static int __init pata_platform_init(void)
279 {
280 	return platform_driver_register(&pata_platform_driver);
281 }
282 
283 static void __exit pata_platform_exit(void)
284 {
285 	platform_driver_unregister(&pata_platform_driver);
286 }
287 module_init(pata_platform_init);
288 module_exit(pata_platform_exit);
289 
290 module_param(pio_mask, int, 0);
291 
292 MODULE_AUTHOR("Paul Mundt");
293 MODULE_DESCRIPTION("low-level driver for platform device ATA");
294 MODULE_LICENSE("GPL");
295 MODULE_VERSION(DRV_VERSION);
296