1 /* 2 * A low-level PATA driver to handle a Compact Flash connected on the 3 * Mikrotik's RouterBoard 532 board. 4 * 5 * Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org> 6 * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> 7 * 8 * This file was based on: drivers/ata/pata_ixp4xx_cf.c 9 * Copyright (C) 2006-07 Tower Technologies 10 * Author: Alessandro Zummo <a.zummo@towertech.it> 11 * 12 * Also was based on the driver for Linux 2.4.xx published by Mikrotik for 13 * their RouterBoard 1xx and 5xx series devices. The original Mikrotik code 14 * seems not to have a license. 15 * 16 * This program is free software; you can redistribute it and/or modify 17 * it under the terms of the GNU General Public License version 2 as 18 * published by the Free Software Foundation. 19 * 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/module.h> 24 #include <linux/platform_device.h> 25 26 #include <linux/io.h> 27 #include <linux/interrupt.h> 28 #include <linux/irq.h> 29 30 #include <linux/libata.h> 31 #include <scsi/scsi_host.h> 32 33 #include <asm/gpio.h> 34 35 #define DRV_NAME "pata-rb532-cf" 36 #define DRV_VERSION "0.1.0" 37 #define DRV_DESC "PATA driver for RouterBOARD 532 Compact Flash" 38 39 #define RB500_CF_MAXPORTS 1 40 #define RB500_CF_IO_DELAY 400 41 42 #define RB500_CF_REG_CMD 0x0800 43 #define RB500_CF_REG_CTRL 0x080E 44 #define RB500_CF_REG_DATA 0x0C00 45 46 struct rb532_cf_info { 47 void __iomem *iobase; 48 unsigned int gpio_line; 49 int frozen; 50 unsigned int irq; 51 }; 52 53 /* ------------------------------------------------------------------------ */ 54 55 static inline void rb532_pata_finish_io(struct ata_port *ap) 56 { 57 struct ata_host *ah = ap->host; 58 struct rb532_cf_info *info = ah->private_data; 59 60 /* FIXME: Keep previous delay. If this is merely a fence then 61 ata_sff_sync might be sufficient. */ 62 ata_sff_dma_pause(ap); 63 ndelay(RB500_CF_IO_DELAY); 64 65 set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); 66 } 67 68 static void rb532_pata_exec_command(struct ata_port *ap, 69 const struct ata_taskfile *tf) 70 { 71 writeb(tf->command, ap->ioaddr.command_addr); 72 rb532_pata_finish_io(ap); 73 } 74 75 static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, 76 unsigned int buflen, int write_data) 77 { 78 struct ata_port *ap = adev->link->ap; 79 void __iomem *ioaddr = ap->ioaddr.data_addr; 80 81 if (write_data) { 82 for (; buflen > 0; buflen--, buf++) 83 writeb(*buf, ioaddr); 84 } else { 85 for (; buflen > 0; buflen--, buf++) 86 *buf = readb(ioaddr); 87 } 88 89 rb532_pata_finish_io(adev->link->ap); 90 } 91 92 static void rb532_pata_freeze(struct ata_port *ap) 93 { 94 struct rb532_cf_info *info = ap->host->private_data; 95 96 info->frozen = 1; 97 } 98 99 static void rb532_pata_thaw(struct ata_port *ap) 100 { 101 struct rb532_cf_info *info = ap->host->private_data; 102 103 info->frozen = 0; 104 } 105 106 static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance) 107 { 108 struct ata_host *ah = dev_instance; 109 struct rb532_cf_info *info = ah->private_data; 110 111 if (gpio_get_value(info->gpio_line)) { 112 set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW); 113 if (!info->frozen) 114 ata_sff_interrupt(info->irq, dev_instance); 115 } else { 116 set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); 117 } 118 119 return IRQ_HANDLED; 120 } 121 122 static struct ata_port_operations rb532_pata_port_ops = { 123 .inherits = &ata_sff_port_ops, 124 .sff_exec_command = rb532_pata_exec_command, 125 .sff_data_xfer = rb532_pata_data_xfer, 126 .freeze = rb532_pata_freeze, 127 .thaw = rb532_pata_thaw, 128 }; 129 130 /* ------------------------------------------------------------------------ */ 131 132 static struct scsi_host_template rb532_pata_sht = { 133 ATA_PIO_SHT(DRV_NAME), 134 }; 135 136 /* ------------------------------------------------------------------------ */ 137 138 static void rb532_pata_setup_ports(struct ata_host *ah) 139 { 140 struct rb532_cf_info *info = ah->private_data; 141 struct ata_port *ap; 142 143 ap = ah->ports[0]; 144 145 ap->ops = &rb532_pata_port_ops; 146 ap->pio_mask = 0x1f; /* PIO4 */ 147 ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; 148 149 ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD; 150 ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; 151 ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; 152 153 ata_sff_std_ports(&ap->ioaddr); 154 155 ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; 156 } 157 158 static __devinit int rb532_pata_driver_probe(struct platform_device *pdev) 159 { 160 unsigned int irq; 161 int gpio; 162 struct resource *res; 163 struct ata_host *ah; 164 struct rb532_cf_info *info; 165 int ret; 166 167 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 168 if (!res) { 169 dev_err(&pdev->dev, "no IOMEM resource found\n"); 170 return -EINVAL; 171 } 172 173 irq = platform_get_irq(pdev, 0); 174 if (irq <= 0) { 175 dev_err(&pdev->dev, "no IRQ resource found\n"); 176 return -ENOENT; 177 } 178 179 gpio = irq_to_gpio(irq); 180 if (gpio < 0) { 181 dev_err(&pdev->dev, "no GPIO found for irq%d\n", irq); 182 return -ENOENT; 183 } 184 185 ret = gpio_request(gpio, DRV_NAME); 186 if (ret) { 187 dev_err(&pdev->dev, "GPIO request failed\n"); 188 return ret; 189 } 190 191 /* allocate host */ 192 ah = ata_host_alloc(&pdev->dev, RB500_CF_MAXPORTS); 193 if (!ah) 194 return -ENOMEM; 195 196 platform_set_drvdata(pdev, ah); 197 198 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); 199 if (!info) 200 return -ENOMEM; 201 202 ah->private_data = info; 203 info->gpio_line = gpio; 204 info->irq = irq; 205 206 info->iobase = devm_ioremap_nocache(&pdev->dev, res->start, 207 res->end - res->start + 1); 208 if (!info->iobase) 209 return -ENOMEM; 210 211 ret = gpio_direction_input(gpio); 212 if (ret) { 213 dev_err(&pdev->dev, "unable to set GPIO direction, err=%d\n", 214 ret); 215 goto err_free_gpio; 216 } 217 218 rb532_pata_setup_ports(ah); 219 220 ret = ata_host_activate(ah, irq, rb532_pata_irq_handler, 221 IRQF_TRIGGER_LOW, &rb532_pata_sht); 222 if (ret) 223 goto err_free_gpio; 224 225 return 0; 226 227 err_free_gpio: 228 gpio_free(gpio); 229 230 return ret; 231 } 232 233 static __devexit int rb532_pata_driver_remove(struct platform_device *pdev) 234 { 235 struct ata_host *ah = platform_get_drvdata(pdev); 236 struct rb532_cf_info *info = ah->private_data; 237 238 ata_host_detach(ah); 239 gpio_free(info->gpio_line); 240 241 return 0; 242 } 243 244 /* work with hotplug and coldplug */ 245 MODULE_ALIAS("platform:" DRV_NAME); 246 247 static struct platform_driver rb532_pata_platform_driver = { 248 .probe = rb532_pata_driver_probe, 249 .remove = __devexit_p(rb532_pata_driver_remove), 250 .driver = { 251 .name = DRV_NAME, 252 .owner = THIS_MODULE, 253 }, 254 }; 255 256 /* ------------------------------------------------------------------------ */ 257 258 #define DRV_INFO DRV_DESC " version " DRV_VERSION 259 260 static int __init rb532_pata_module_init(void) 261 { 262 printk(KERN_INFO DRV_INFO "\n"); 263 264 return platform_driver_register(&rb532_pata_platform_driver); 265 } 266 267 static void __exit rb532_pata_module_exit(void) 268 { 269 platform_driver_unregister(&rb532_pata_platform_driver); 270 } 271 272 MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org>"); 273 MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); 274 MODULE_DESCRIPTION(DRV_DESC); 275 MODULE_VERSION(DRV_VERSION); 276 MODULE_LICENSE("GPL"); 277 278 module_init(rb532_pata_module_init); 279 module_exit(rb532_pata_module_exit); 280