| .. | .. |
|---|
| 18 | 18 | #include <linux/delay.h> |
|---|
| 19 | 19 | #include <linux/ide.h> |
|---|
| 20 | 20 | #include <linux/module.h> |
|---|
| 21 | +#include <linux/platform_device.h> |
|---|
| 21 | 22 | |
|---|
| 22 | 23 | #include <asm/macintosh.h> |
|---|
| 23 | | -#include <asm/macints.h> |
|---|
| 24 | | -#include <asm/mac_baboon.h> |
|---|
| 24 | + |
|---|
| 25 | +#define DRV_NAME "mac_ide" |
|---|
| 25 | 26 | |
|---|
| 26 | 27 | #define IDE_BASE 0x50F1A000 /* Base address of IDE controller */ |
|---|
| 27 | 28 | |
|---|
| .. | .. |
|---|
| 100 | 101 | * Probe for a Macintosh IDE interface |
|---|
| 101 | 102 | */ |
|---|
| 102 | 103 | |
|---|
| 103 | | -static int __init macide_init(void) |
|---|
| 104 | +static int mac_ide_probe(struct platform_device *pdev) |
|---|
| 104 | 105 | { |
|---|
| 105 | | - unsigned long base; |
|---|
| 106 | | - int irq; |
|---|
| 106 | + struct resource *mem, *irq; |
|---|
| 107 | 107 | struct ide_hw hw, *hws[] = { &hw }; |
|---|
| 108 | 108 | struct ide_port_info d = macide_port_info; |
|---|
| 109 | + struct ide_host *host; |
|---|
| 110 | + int rc; |
|---|
| 109 | 111 | |
|---|
| 110 | 112 | if (!MACH_IS_MAC) |
|---|
| 111 | 113 | return -ENODEV; |
|---|
| 112 | 114 | |
|---|
| 113 | | - switch (macintosh_config->ide_type) { |
|---|
| 114 | | - case MAC_IDE_QUADRA: |
|---|
| 115 | | - base = IDE_BASE; |
|---|
| 116 | | - irq = IRQ_NUBUS_F; |
|---|
| 117 | | - break; |
|---|
| 118 | | - case MAC_IDE_PB: |
|---|
| 119 | | - base = IDE_BASE; |
|---|
| 120 | | - irq = IRQ_NUBUS_C; |
|---|
| 121 | | - break; |
|---|
| 122 | | - case MAC_IDE_BABOON: |
|---|
| 123 | | - base = BABOON_BASE; |
|---|
| 124 | | - d.port_ops = NULL; |
|---|
| 125 | | - irq = IRQ_BABOON_1; |
|---|
| 126 | | - break; |
|---|
| 127 | | - default: |
|---|
| 115 | + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 116 | + if (!mem) |
|---|
| 128 | 117 | return -ENODEV; |
|---|
| 118 | + |
|---|
| 119 | + irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
|---|
| 120 | + if (!irq) |
|---|
| 121 | + return -ENODEV; |
|---|
| 122 | + |
|---|
| 123 | + if (!devm_request_mem_region(&pdev->dev, mem->start, |
|---|
| 124 | + resource_size(mem), DRV_NAME)) { |
|---|
| 125 | + dev_err(&pdev->dev, "resources busy\n"); |
|---|
| 126 | + return -EBUSY; |
|---|
| 129 | 127 | } |
|---|
| 130 | 128 | |
|---|
| 131 | 129 | printk(KERN_INFO "ide: Macintosh %s IDE controller\n", |
|---|
| 132 | 130 | mac_ide_name[macintosh_config->ide_type - 1]); |
|---|
| 133 | 131 | |
|---|
| 134 | | - macide_setup_ports(&hw, base, irq); |
|---|
| 132 | + macide_setup_ports(&hw, mem->start, irq->start); |
|---|
| 135 | 133 | |
|---|
| 136 | | - return ide_host_add(&d, hws, 1, NULL); |
|---|
| 134 | + rc = ide_host_add(&d, hws, 1, &host); |
|---|
| 135 | + if (rc) |
|---|
| 136 | + return rc; |
|---|
| 137 | + |
|---|
| 138 | + platform_set_drvdata(pdev, host); |
|---|
| 139 | + return 0; |
|---|
| 137 | 140 | } |
|---|
| 138 | 141 | |
|---|
| 139 | | -module_init(macide_init); |
|---|
| 142 | +static int mac_ide_remove(struct platform_device *pdev) |
|---|
| 143 | +{ |
|---|
| 144 | + struct ide_host *host = platform_get_drvdata(pdev); |
|---|
| 140 | 145 | |
|---|
| 146 | + ide_host_remove(host); |
|---|
| 147 | + return 0; |
|---|
| 148 | +} |
|---|
| 149 | + |
|---|
| 150 | +static struct platform_driver mac_ide_driver = { |
|---|
| 151 | + .driver = { |
|---|
| 152 | + .name = DRV_NAME, |
|---|
| 153 | + }, |
|---|
| 154 | + .probe = mac_ide_probe, |
|---|
| 155 | + .remove = mac_ide_remove, |
|---|
| 156 | +}; |
|---|
| 157 | + |
|---|
| 158 | +module_platform_driver(mac_ide_driver); |
|---|
| 159 | + |
|---|
| 160 | +MODULE_ALIAS("platform:" DRV_NAME); |
|---|
| 141 | 161 | MODULE_LICENSE("GPL"); |
|---|