2 * pata_winbond.c - Winbond VLB ATA controllers
3 * (C) 2006 Red Hat <alan@redhat.com>
5 * Support for the Winbond 83759A when operating in advanced mode.
6 * Multichip mode is not currently supported.
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/pci.h>
12 #include <linux/init.h>
13 #include <linux/blkdev.h>
14 #include <linux/delay.h>
15 #include <scsi/scsi_host.h>
16 #include <linux/libata.h>
17 #include <linux/platform_device.h>
19 #define DRV_NAME "pata_winbond"
20 #define DRV_VERSION "0.0.2"
22 #define NR_HOST 4 /* Two winbond controllers, two channels each */
26 struct platform_device
*platform_dev
;
29 static struct ata_host
*winbond_host
[NR_HOST
];
30 static struct winbond_data winbond_data
[NR_HOST
];
31 static int nr_winbond_host
;
34 static int probe_winbond
= 1;
36 static int probe_winbond
;
39 static spinlock_t winbond_lock
= SPIN_LOCK_UNLOCKED
;
41 static void winbond_writecfg(unsigned long port
, u8 reg
, u8 val
)
44 spin_lock_irqsave(&winbond_lock
, flags
);
45 outb(reg
, port
+ 0x01);
46 outb(val
, port
+ 0x02);
47 spin_unlock_irqrestore(&winbond_lock
, flags
);
50 static u8
winbond_readcfg(unsigned long port
, u8 reg
)
55 spin_lock_irqsave(&winbond_lock
, flags
);
56 outb(reg
, port
+ 0x01);
57 val
= inb(port
+ 0x02);
58 spin_unlock_irqrestore(&winbond_lock
, flags
);
63 static void winbond_set_piomode(struct ata_port
*ap
, struct ata_device
*adev
)
66 struct winbond_data
*winbond
= ap
->host
->private_data
;
69 int timing
= 0x88 + (ap
->port_no
* 4) + (adev
->devno
* 2);
71 reg
= winbond_readcfg(winbond
->config
, 0x81);
73 /* Get the timing data in cycles */
74 if (reg
& 0x40) /* Fast VLB bus, assume 50MHz */
75 ata_timing_compute(adev
, adev
->pio_mode
, &t
, 20000, 1000);
77 ata_timing_compute(adev
, adev
->pio_mode
, &t
, 30303, 1000);
79 active
= (FIT(t
.active
, 3, 17) - 1) & 0x0F;
80 recovery
= (FIT(t
.recover
, 1, 15) + 1) & 0x0F;
81 timing
= (active
<< 4) | recovery
;
82 winbond_writecfg(winbond
->config
, timing
, reg
);
84 /* Load the setup timing */
87 if (adev
->class != ATA_DEV_ATA
)
88 reg
|= 0x08; /* FIFO off */
89 if (!ata_pio_need_iordy(adev
))
90 reg
|= 0x02; /* IORDY off */
91 reg
|= (FIT(t
.setup
, 0, 3) << 6);
92 winbond_writecfg(winbond
->config
, timing
+ 1, reg
);
96 static void winbond_data_xfer(struct ata_device
*adev
, unsigned char *buf
, unsigned int buflen
, int write_data
)
98 struct ata_port
*ap
= adev
->ap
;
99 int slop
= buflen
& 3;
101 if (ata_id_has_dword_io(adev
->id
)) {
103 iowrite32_rep(ap
->ioaddr
.data_addr
, buf
, buflen
>> 2);
105 ioread32_rep(ap
->ioaddr
.data_addr
, buf
, buflen
>> 2);
107 if (unlikely(slop
)) {
110 memcpy(&pad
, buf
+ buflen
- slop
, slop
);
111 pad
= le32_to_cpu(pad
);
112 iowrite32(pad
, ap
->ioaddr
.data_addr
);
114 pad
= ioread32(ap
->ioaddr
.data_addr
);
115 pad
= cpu_to_le16(pad
);
116 memcpy(buf
+ buflen
- slop
, &pad
, slop
);
120 ata_data_xfer(adev
, buf
, buflen
, write_data
);
123 static struct scsi_host_template winbond_sht
= {
124 .module
= THIS_MODULE
,
126 .ioctl
= ata_scsi_ioctl
,
127 .queuecommand
= ata_scsi_queuecmd
,
128 .can_queue
= ATA_DEF_QUEUE
,
129 .this_id
= ATA_SHT_THIS_ID
,
130 .sg_tablesize
= LIBATA_MAX_PRD
,
131 .cmd_per_lun
= ATA_SHT_CMD_PER_LUN
,
132 .emulated
= ATA_SHT_EMULATED
,
133 .use_clustering
= ATA_SHT_USE_CLUSTERING
,
134 .proc_name
= DRV_NAME
,
135 .dma_boundary
= ATA_DMA_BOUNDARY
,
136 .slave_configure
= ata_scsi_slave_config
,
137 .slave_destroy
= ata_scsi_slave_destroy
,
138 .bios_param
= ata_std_bios_param
,
141 static struct ata_port_operations winbond_port_ops
= {
142 .port_disable
= ata_port_disable
,
143 .set_piomode
= winbond_set_piomode
,
145 .tf_load
= ata_tf_load
,
146 .tf_read
= ata_tf_read
,
147 .check_status
= ata_check_status
,
148 .exec_command
= ata_exec_command
,
149 .dev_select
= ata_std_dev_select
,
151 .freeze
= ata_bmdma_freeze
,
152 .thaw
= ata_bmdma_thaw
,
153 .error_handler
= ata_bmdma_error_handler
,
154 .post_internal_cmd
= ata_bmdma_post_internal_cmd
,
156 .qc_prep
= ata_qc_prep
,
157 .qc_issue
= ata_qc_issue_prot
,
159 .data_xfer
= winbond_data_xfer
,
161 .irq_handler
= ata_interrupt
,
162 .irq_clear
= ata_bmdma_irq_clear
,
163 .irq_on
= ata_irq_on
,
164 .irq_ack
= ata_irq_ack
,
166 .port_start
= ata_port_start
,
170 * winbond_init_one - attach a winbond interface
171 * @type: Type to display
172 * @io: I/O port start
173 * @irq: interrupt line
174 * @fast: True if on a > 33Mhz VLB
176 * Register a VLB bus IDE interface. Such interfaces are PIO and we
177 * assume do not support IRQ sharing.
180 static __init
int winbond_init_one(unsigned long port
)
182 struct ata_probe_ent ae
;
183 struct platform_device
*pdev
;
188 reg
= winbond_readcfg(port
, 0x81);
189 reg
|= 0x80; /* jumpered mode off */
190 winbond_writecfg(port
, 0x81, reg
);
191 reg
= winbond_readcfg(port
, 0x83);
192 reg
|= 0xF0; /* local control */
193 winbond_writecfg(port
, 0x83, reg
);
194 reg
= winbond_readcfg(port
, 0x85);
195 reg
|= 0xF0; /* programmable timing */
196 winbond_writecfg(port
, 0x85, reg
);
198 reg
= winbond_readcfg(port
, 0x81);
200 if (!(reg
& 0x03)) /* Disabled */
203 for (i
= 0; i
< 2 ; i
++) {
204 unsigned long cmd_port
= 0x1F0 - (0x80 * i
);
205 void __iomem
*cmd_addr
, *ctl_addr
;
207 if (reg
& (1 << i
)) {
209 * Fill in a probe structure first of all
212 pdev
= platform_device_register_simple(DRV_NAME
, nr_winbond_host
, NULL
, 0);
214 return PTR_ERR(pdev
);
216 cmd_addr
= devm_ioport_map(&pdev
->dev
, cmd_port
, 8);
217 ctl_addr
= devm_ioport_map(&pdev
->dev
, cmd_port
+ 0x0206, 1);
218 if (!cmd_addr
|| !ctl_addr
) {
219 platform_device_unregister(pdev
);
223 memset(&ae
, 0, sizeof(struct ata_probe_ent
));
224 INIT_LIST_HEAD(&ae
.node
);
227 ae
.port_ops
= &winbond_port_ops
;
230 ae
.sht
= &winbond_sht
;
235 ae
.port_flags
= ATA_FLAG_SLAVE_POSS
| ATA_FLAG_SRST
;
236 ae
.port
[0].cmd_addr
= cmd_addr
;
237 ae
.port
[0].altstatus_addr
= ctl_addr
;
238 ae
.port
[0].ctl_addr
= ctl_addr
;
239 ata_std_ports(&ae
.port
[0]);
241 * Hook in a private data structure per channel
243 ae
.private_data
= &winbond_data
[nr_winbond_host
];
244 winbond_data
[nr_winbond_host
].config
= port
;
245 winbond_data
[nr_winbond_host
].platform_dev
= pdev
;
247 ret
= ata_device_add(&ae
);
249 platform_device_unregister(pdev
);
252 winbond_host
[nr_winbond_host
++] = dev_get_drvdata(&pdev
->dev
);
260 * winbond_init - attach winbond interfaces
262 * Attach winbond IDE interfaces by scanning the ports it may occupy.
265 static __init
int winbond_init(void)
267 static const unsigned long config
[2] = { 0x130, 0x1B0 };
272 if (probe_winbond
== 0)
276 * Check both base addresses
279 for (i
= 0; i
< 2; i
++) {
280 if (probe_winbond
& (1<<i
)) {
282 unsigned long port
= config
[i
];
284 if (request_region(port
, 2, "pata_winbond")) {
285 ret
= winbond_init_one(port
);
287 release_region(port
, 2);
297 static __exit
void winbond_exit(void)
301 for (i
= 0; i
< nr_winbond_host
; i
++) {
302 ata_host_detach(winbond_host
[i
]);
303 release_region(winbond_data
[i
].config
, 2);
304 platform_device_unregister(winbond_data
[i
].platform_dev
);
308 MODULE_AUTHOR("Alan Cox");
309 MODULE_DESCRIPTION("low-level driver for Winbond VL ATA");
310 MODULE_LICENSE("GPL");
311 MODULE_VERSION(DRV_VERSION
);
313 module_init(winbond_init
);
314 module_exit(winbond_exit
);
316 module_param(probe_winbond
, int, 0);