Blame view
drivers/misc/tifm_7xx1.c
11 KB
4020f2d7f [PATCH] mmc: driv... |
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * tifm_7xx1.c - TI FlashMedia driver * * Copyright (C) 2006 Alex Dubov <oakad@yahoo.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ #include <linux/tifm.h> |
c40306980 tifm: add missing... |
13 |
#include <linux/dma-mapping.h> |
eb12a679b drivers/misc: Add... |
14 |
#include <linux/module.h> |
4020f2d7f [PATCH] mmc: driv... |
15 16 |
#define DRIVER_NAME "tifm_7xx1" |
4552f0cbd tifm: hide detail... |
17 18 19 20 21 22 23 |
#define DRIVER_VERSION "0.8" #define TIFM_IRQ_ENABLE 0x80000000 #define TIFM_IRQ_SOCKMASK(x) (x) #define TIFM_IRQ_CARDMASK(x) ((x) << 8) #define TIFM_IRQ_FIFOMASK(x) ((x) << 16) #define TIFM_IRQ_SETALL 0xffffffff |
4020f2d7f [PATCH] mmc: driv... |
24 |
|
6113ed73e tifm: move common... |
25 26 27 28 |
static void tifm_7xx1_dummy_eject(struct tifm_adapter *fm, struct tifm_dev *sock) { } |
4020f2d7f [PATCH] mmc: driv... |
29 30 |
static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock) { |
4020f2d7f [PATCH] mmc: driv... |
31 32 33 |
unsigned long flags; spin_lock_irqsave(&fm->lock, flags); |
7146f0d3b tifm_7xx1: switch... |
34 |
fm->socket_change_set |= 1 << sock->socket_id; |
3540af8ff tifm: replace per... |
35 |
tifm_queue_work(&fm->media_switcher); |
4020f2d7f [PATCH] mmc: driv... |
36 37 |
spin_unlock_irqrestore(&fm->lock, flags); } |
7d12e780e IRQ: Maintain reg... |
38 |
static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id) |
4020f2d7f [PATCH] mmc: driv... |
39 40 |
{ struct tifm_adapter *fm = dev_id; |
217334d14 Add dummy_signal_... |
41 |
struct tifm_dev *sock; |
91f8d0118 tifm: layout fixe... |
42 |
unsigned int irq_status, cnt; |
4020f2d7f [PATCH] mmc: driv... |
43 44 45 46 47 48 49 50 51 52 |
spin_lock(&fm->lock); irq_status = readl(fm->addr + FM_INTERRUPT_STATUS); if (irq_status == 0 || irq_status == (~0)) { spin_unlock(&fm->lock); return IRQ_NONE; } if (irq_status & TIFM_IRQ_ENABLE) { writel(TIFM_IRQ_ENABLE, fm->addr + FM_CLEAR_INTERRUPT_ENABLE); |
8b40adab9 tifm_7xx1: prettify |
53 |
for (cnt = 0; cnt < fm->num_sockets; cnt++) { |
217334d14 Add dummy_signal_... |
54 |
sock = fm->sockets[cnt]; |
4552f0cbd tifm: hide detail... |
55 56 57 58 59 60 |
if (sock) { if ((irq_status >> cnt) & TIFM_IRQ_FIFOMASK(1)) sock->data_event(sock); if ((irq_status >> cnt) & TIFM_IRQ_CARDMASK(1)) sock->card_event(sock); } |
4020f2d7f [PATCH] mmc: driv... |
61 |
} |
6412d9273 tifm_7xx1: Merge ... |
62 |
|
8b40adab9 tifm_7xx1: prettify |
63 64 |
fm->socket_change_set |= irq_status & ((1 << fm->num_sockets) - 1); |
4020f2d7f [PATCH] mmc: driv... |
65 66 |
} writel(irq_status, fm->addr + FM_INTERRUPT_STATUS); |
3540af8ff tifm: replace per... |
67 68 69 |
if (fm->finish_me) complete_all(fm->finish_me); else if (!fm->socket_change_set) |
7146f0d3b tifm_7xx1: switch... |
70 71 |
writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE); else |
3540af8ff tifm: replace per... |
72 |
tifm_queue_work(&fm->media_switcher); |
4020f2d7f [PATCH] mmc: driv... |
73 74 75 76 |
spin_unlock(&fm->lock); return IRQ_HANDLED; } |
342c0ec48 tifm_7xx1: improv... |
77 |
static unsigned char tifm_7xx1_toggle_sock_power(char __iomem *sock_addr) |
4020f2d7f [PATCH] mmc: driv... |
78 79 80 81 82 |
{ unsigned int s_state; int cnt; writel(0x0e00, sock_addr + SOCK_CONTROL); |
342c0ec48 tifm_7xx1: improv... |
83 |
for (cnt = 16; cnt <= 256; cnt <<= 1) { |
8b40adab9 tifm_7xx1: prettify |
84 85 |
if (!(TIFM_SOCK_STATE_POWERED & readl(sock_addr + SOCK_PRESENT_STATE))) |
4020f2d7f [PATCH] mmc: driv... |
86 |
break; |
342c0ec48 tifm_7xx1: improv... |
87 88 |
msleep(cnt); |
4020f2d7f [PATCH] mmc: driv... |
89 90 91 92 |
} s_state = readl(sock_addr + SOCK_PRESENT_STATE); if (!(TIFM_SOCK_STATE_OCCUPIED & s_state)) |
e23f2b8a1 tifm: simplify bu... |
93 |
return 0; |
4020f2d7f [PATCH] mmc: driv... |
94 |
|
342c0ec48 tifm_7xx1: improv... |
95 96 |
writel(readl(sock_addr + SOCK_CONTROL) | TIFM_CTRL_LED, sock_addr + SOCK_CONTROL); |
4020f2d7f [PATCH] mmc: driv... |
97 |
|
342c0ec48 tifm_7xx1: improv... |
98 99 100 101 |
/* xd needs some extra time before power on */ if (((readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7) == TIFM_TYPE_XD) msleep(40); |
055b82241 disable socket po... |
102 103 |
writel((s_state & TIFM_CTRL_POWER_MASK) | 0x0c00, sock_addr + SOCK_CONTROL); |
342c0ec48 tifm_7xx1: improv... |
104 105 106 |
/* wait for power to stabilize */ msleep(20); for (cnt = 16; cnt <= 256; cnt <<= 1) { |
8b40adab9 tifm_7xx1: prettify |
107 108 |
if ((TIFM_SOCK_STATE_POWERED & readl(sock_addr + SOCK_PRESENT_STATE))) |
4020f2d7f [PATCH] mmc: driv... |
109 |
break; |
342c0ec48 tifm_7xx1: improv... |
110 111 |
msleep(cnt); |
4020f2d7f [PATCH] mmc: driv... |
112 |
} |
342c0ec48 tifm_7xx1: improv... |
113 114 |
writel(readl(sock_addr + SOCK_CONTROL) & (~TIFM_CTRL_LED), sock_addr + SOCK_CONTROL); |
4020f2d7f [PATCH] mmc: driv... |
115 116 117 |
return (readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7; } |
055b82241 disable socket po... |
118 119 120 121 122 |
inline static void tifm_7xx1_sock_power_off(char __iomem *sock_addr) { writel((~TIFM_CTRL_POWER_MASK) & readl(sock_addr + SOCK_CONTROL), sock_addr + SOCK_CONTROL); } |
e069d79d2 [PATCH] tifm __io... |
123 124 |
inline static char __iomem * tifm_7xx1_sock_addr(char __iomem *base_addr, unsigned int sock_num) |
4020f2d7f [PATCH] mmc: driv... |
125 126 127 |
{ return base_addr + ((sock_num + 1) << 10); } |
3540af8ff tifm: replace per... |
128 |
static void tifm_7xx1_switch_media(struct work_struct *work) |
4020f2d7f [PATCH] mmc: driv... |
129 |
{ |
3540af8ff tifm: replace per... |
130 131 |
struct tifm_adapter *fm = container_of(work, struct tifm_adapter, media_switcher); |
91f8d0118 tifm: layout fixe... |
132 |
struct tifm_dev *sock; |
055b82241 disable socket po... |
133 |
char __iomem *sock_addr; |
4020f2d7f [PATCH] mmc: driv... |
134 |
unsigned long flags; |
e23f2b8a1 tifm: simplify bu... |
135 |
unsigned char media_id; |
91f8d0118 tifm: layout fixe... |
136 |
unsigned int socket_change_set, cnt; |
4020f2d7f [PATCH] mmc: driv... |
137 |
|
3540af8ff tifm: replace per... |
138 139 140 |
spin_lock_irqsave(&fm->lock, flags); socket_change_set = fm->socket_change_set; fm->socket_change_set = 0; |
6412d9273 tifm_7xx1: Merge ... |
141 |
|
7dd817d08 tifm: Convert fro... |
142 143 |
dev_dbg(fm->dev.parent, "checking media set %x ", |
3540af8ff tifm: replace per... |
144 |
socket_change_set); |
6412d9273 tifm_7xx1: Merge ... |
145 |
|
3540af8ff tifm: replace per... |
146 |
if (!socket_change_set) { |
4020f2d7f [PATCH] mmc: driv... |
147 |
spin_unlock_irqrestore(&fm->lock, flags); |
3540af8ff tifm: replace per... |
148 149 |
return; } |
4020f2d7f [PATCH] mmc: driv... |
150 |
|
2428a8fe2 tifm: move common... |
151 152 153 154 155 156 157 158 |
for (cnt = 0; cnt < fm->num_sockets; cnt++) { if (!(socket_change_set & (1 << cnt))) continue; sock = fm->sockets[cnt]; if (sock) { printk(KERN_INFO "%s : demand removing card from socket %u:%u ", |
0bad16aa0 tifm: struct devi... |
159 |
dev_name(&fm->dev), fm->id, cnt); |
2428a8fe2 tifm: move common... |
160 |
fm->sockets[cnt] = NULL; |
055b82241 disable socket po... |
161 |
sock_addr = sock->addr; |
6412d9273 tifm_7xx1: Merge ... |
162 |
spin_unlock_irqrestore(&fm->lock, flags); |
2428a8fe2 tifm: move common... |
163 164 |
device_unregister(&sock->dev); spin_lock_irqsave(&fm->lock, flags); |
055b82241 disable socket po... |
165 166 |
tifm_7xx1_sock_power_off(sock_addr); writel(0x0e00, sock_addr + SOCK_CONTROL); |
2428a8fe2 tifm: move common... |
167 168 169 170 171 172 173 174 175 176 177 178 179 |
} spin_unlock_irqrestore(&fm->lock, flags); media_id = tifm_7xx1_toggle_sock_power( tifm_7xx1_sock_addr(fm->addr, cnt)); // tifm_alloc_device will check if media_id is valid sock = tifm_alloc_device(fm, cnt, media_id); if (sock) { sock->addr = tifm_7xx1_sock_addr(fm->addr, cnt); if (!device_register(&sock->dev)) { |
6412d9273 tifm_7xx1: Merge ... |
180 |
spin_lock_irqsave(&fm->lock, flags); |
2428a8fe2 tifm: move common... |
181 182 183 184 185 |
if (!fm->sockets[cnt]) { fm->sockets[cnt] = sock; sock = NULL; } spin_unlock_irqrestore(&fm->lock, flags); |
6412d9273 tifm_7xx1: Merge ... |
186 |
} |
2428a8fe2 tifm: move common... |
187 188 |
if (sock) tifm_free_device(&sock->dev); |
6412d9273 tifm_7xx1: Merge ... |
189 |
} |
2428a8fe2 tifm: move common... |
190 191 |
spin_lock_irqsave(&fm->lock, flags); } |
6412d9273 tifm_7xx1: Merge ... |
192 |
|
3540af8ff tifm: replace per... |
193 194 195 196 197 198 199 200 201 202 |
writel(TIFM_IRQ_FIFOMASK(socket_change_set) | TIFM_IRQ_CARDMASK(socket_change_set), fm->addr + FM_CLEAR_INTERRUPT_ENABLE); writel(TIFM_IRQ_FIFOMASK(socket_change_set) | TIFM_IRQ_CARDMASK(socket_change_set), fm->addr + FM_SET_INTERRUPT_ENABLE); writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE); spin_unlock_irqrestore(&fm->lock, flags); |
4020f2d7f [PATCH] mmc: driv... |
203 |
} |
7146f0d3b tifm_7xx1: switch... |
204 |
#ifdef CONFIG_PM |
4020f2d7f [PATCH] mmc: driv... |
205 206 |
static int tifm_7xx1_suspend(struct pci_dev *dev, pm_message_t state) { |
055b82241 disable socket po... |
207 208 |
struct tifm_adapter *fm = pci_get_drvdata(dev); int cnt; |
7146f0d3b tifm_7xx1: switch... |
209 210 |
dev_dbg(&dev->dev, "suspending host "); |
4020f2d7f [PATCH] mmc: driv... |
211 |
|
055b82241 disable socket po... |
212 213 214 215 |
for (cnt = 0; cnt < fm->num_sockets; cnt++) { if (fm->sockets[cnt]) tifm_7xx1_sock_power_off(fm->sockets[cnt]->addr); } |
7146f0d3b tifm_7xx1: switch... |
216 217 218 219 |
pci_save_state(dev); pci_enable_wake(dev, pci_choose_state(dev, state), 0); pci_disable_device(dev); pci_set_power_state(dev, pci_choose_state(dev, state)); |
4020f2d7f [PATCH] mmc: driv... |
220 221 222 223 224 225 |
return 0; } static int tifm_7xx1_resume(struct pci_dev *dev) { struct tifm_adapter *fm = pci_get_drvdata(dev); |
88de1b2fe tifm_7xx1: fix ad... |
226 |
int rc; |
a819a228f misc: tifm: match... |
227 |
unsigned long timeout; |
88de1b2fe tifm_7xx1: fix ad... |
228 |
unsigned int good_sockets = 0, bad_sockets = 0; |
4020f2d7f [PATCH] mmc: driv... |
229 |
unsigned long flags; |
e23f2b8a1 tifm: simplify bu... |
230 |
unsigned char new_ids[fm->num_sockets]; |
3540af8ff tifm: replace per... |
231 |
DECLARE_COMPLETION_ONSTACK(finish_resume); |
4020f2d7f [PATCH] mmc: driv... |
232 |
|
7146f0d3b tifm_7xx1: switch... |
233 |
pci_set_power_state(dev, PCI_D0); |
4020f2d7f [PATCH] mmc: driv... |
234 |
pci_restore_state(dev); |
7146f0d3b tifm_7xx1: switch... |
235 236 237 238 239 240 241 |
rc = pci_enable_device(dev); if (rc) return rc; pci_set_master(dev); dev_dbg(&dev->dev, "resuming host "); |
4020f2d7f [PATCH] mmc: driv... |
242 |
|
88de1b2fe tifm_7xx1: fix ad... |
243 244 245 |
for (rc = 0; rc < fm->num_sockets; rc++) new_ids[rc] = tifm_7xx1_toggle_sock_power( tifm_7xx1_sock_addr(fm->addr, rc)); |
4020f2d7f [PATCH] mmc: driv... |
246 |
spin_lock_irqsave(&fm->lock, flags); |
88de1b2fe tifm_7xx1: fix ad... |
247 248 249 250 251 252 |
for (rc = 0; rc < fm->num_sockets; rc++) { if (fm->sockets[rc]) { if (fm->sockets[rc]->type == new_ids[rc]) good_sockets |= 1 << rc; else bad_sockets |= 1 << rc; |
7146f0d3b tifm_7xx1: switch... |
253 254 |
} } |
6412d9273 tifm_7xx1: Merge ... |
255 |
writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), |
7146f0d3b tifm_7xx1: switch... |
256 |
fm->addr + FM_SET_INTERRUPT_ENABLE); |
88de1b2fe tifm_7xx1: fix ad... |
257 258 259 260 261 262 |
dev_dbg(&dev->dev, "change sets on resume: good %x, bad %x ", good_sockets, bad_sockets); fm->socket_change_set = 0; if (good_sockets) { |
3540af8ff tifm: replace per... |
263 |
fm->finish_me = &finish_resume; |
7146f0d3b tifm_7xx1: switch... |
264 |
spin_unlock_irqrestore(&fm->lock, flags); |
a819a228f misc: tifm: match... |
265 266 267 |
timeout = wait_for_completion_timeout(&finish_resume, HZ); dev_dbg(&dev->dev, "wait returned %lu ", timeout); |
88de1b2fe tifm_7xx1: fix ad... |
268 269 270 271 272 273 274 275 276 |
writel(TIFM_IRQ_FIFOMASK(good_sockets) | TIFM_IRQ_CARDMASK(good_sockets), fm->addr + FM_CLEAR_INTERRUPT_ENABLE); writel(TIFM_IRQ_FIFOMASK(good_sockets) | TIFM_IRQ_CARDMASK(good_sockets), fm->addr + FM_SET_INTERRUPT_ENABLE); spin_lock_irqsave(&fm->lock, flags); fm->finish_me = NULL; fm->socket_change_set ^= good_sockets & fm->socket_change_set; |
7146f0d3b tifm_7xx1: switch... |
277 |
} |
88de1b2fe tifm_7xx1: fix ad... |
278 279 280 |
fm->socket_change_set |= bad_sockets; if (fm->socket_change_set) tifm_queue_work(&fm->media_switcher); |
7146f0d3b tifm_7xx1: switch... |
281 |
|
88de1b2fe tifm_7xx1: fix ad... |
282 |
spin_unlock_irqrestore(&fm->lock, flags); |
7146f0d3b tifm_7xx1: switch... |
283 284 |
writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE); |
7146f0d3b tifm_7xx1: switch... |
285 |
|
4020f2d7f [PATCH] mmc: driv... |
286 287 |
return 0; } |
7146f0d3b tifm_7xx1: switch... |
288 289 290 291 292 293 |
#else #define tifm_7xx1_suspend NULL #define tifm_7xx1_resume NULL #endif /* CONFIG_PM */ |
baf8532a1 memstick: initial... |
294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
static int tifm_7xx1_dummy_has_ms_pif(struct tifm_adapter *fm, struct tifm_dev *sock) { return 0; } static int tifm_7xx1_has_ms_pif(struct tifm_adapter *fm, struct tifm_dev *sock) { if (((fm->num_sockets == 4) && (sock->socket_id == 2)) || ((fm->num_sockets == 2) && (sock->socket_id == 0))) return 1; return 0; } |
4020f2d7f [PATCH] mmc: driv... |
308 |
static int tifm_7xx1_probe(struct pci_dev *dev, |
8b40adab9 tifm_7xx1: prettify |
309 |
const struct pci_device_id *dev_id) |
4020f2d7f [PATCH] mmc: driv... |
310 311 312 313 |
{ struct tifm_adapter *fm; int pci_dev_busy = 0; int rc; |
284901a90 dma-mapping: repl... |
314 |
rc = pci_set_dma_mask(dev, DMA_BIT_MASK(32)); |
4020f2d7f [PATCH] mmc: driv... |
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
if (rc) return rc; rc = pci_enable_device(dev); if (rc) return rc; pci_set_master(dev); rc = pci_request_regions(dev, DRIVER_NAME); if (rc) { pci_dev_busy = 1; goto err_out; } pci_intx(dev, 1); |
6113ed73e tifm: move common... |
331 332 |
fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM ? 4 : 2, &dev->dev); |
4020f2d7f [PATCH] mmc: driv... |
333 334 335 336 |
if (!fm) { rc = -ENOMEM; goto err_out_int; } |
3540af8ff tifm: replace per... |
337 |
INIT_WORK(&fm->media_switcher, tifm_7xx1_switch_media); |
4020f2d7f [PATCH] mmc: driv... |
338 |
fm->eject = tifm_7xx1_eject; |
baf8532a1 memstick: initial... |
339 |
fm->has_ms_pif = tifm_7xx1_has_ms_pif; |
4020f2d7f [PATCH] mmc: driv... |
340 |
pci_set_drvdata(dev, fm); |
bdbeed75b pci: use pci_iore... |
341 |
fm->addr = pci_ioremap_bar(dev, 0); |
86d6275a8 tifm: fix error r... |
342 343 |
if (!fm->addr) { rc = -ENODEV; |
4020f2d7f [PATCH] mmc: driv... |
344 |
goto err_out_free; |
86d6275a8 tifm: fix error r... |
345 |
} |
4020f2d7f [PATCH] mmc: driv... |
346 |
|
bc913b189 misc/tifm_7xx1: r... |
347 |
rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm); |
4020f2d7f [PATCH] mmc: driv... |
348 349 |
if (rc) goto err_out_unmap; |
3540af8ff tifm: replace per... |
350 |
rc = tifm_add_adapter(fm); |
4020f2d7f [PATCH] mmc: driv... |
351 352 |
if (rc) goto err_out_irq; |
6412d9273 tifm_7xx1: Merge ... |
353 |
writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), |
e4c70e852 tifm: clear inter... |
354 355 |
fm->addr + FM_CLEAR_INTERRUPT_ENABLE); writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), |
8b40adab9 tifm_7xx1: prettify |
356 |
fm->addr + FM_SET_INTERRUPT_ENABLE); |
4020f2d7f [PATCH] mmc: driv... |
357 358 359 360 361 362 363 |
return 0; err_out_irq: free_irq(dev->irq, fm); err_out_unmap: iounmap(fm->addr); err_out_free: |
4020f2d7f [PATCH] mmc: driv... |
364 365 366 367 368 369 370 371 372 373 374 375 376 |
tifm_free_adapter(fm); err_out_int: pci_intx(dev, 0); pci_release_regions(dev); err_out: if (!pci_dev_busy) pci_disable_device(dev); return rc; } static void tifm_7xx1_remove(struct pci_dev *dev) { struct tifm_adapter *fm = pci_get_drvdata(dev); |
055b82241 disable socket po... |
377 |
int cnt; |
4020f2d7f [PATCH] mmc: driv... |
378 |
|
6113ed73e tifm: move common... |
379 |
fm->eject = tifm_7xx1_dummy_eject; |
baf8532a1 memstick: initial... |
380 |
fm->has_ms_pif = tifm_7xx1_dummy_has_ms_pif; |
7146f0d3b tifm_7xx1: switch... |
381 382 383 |
writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE); mmiowb(); free_irq(dev->irq, fm); |
4020f2d7f [PATCH] mmc: driv... |
384 |
tifm_remove_adapter(fm); |
055b82241 disable socket po... |
385 386 |
for (cnt = 0; cnt < fm->num_sockets; cnt++) tifm_7xx1_sock_power_off(tifm_7xx1_sock_addr(fm->addr, cnt)); |
4020f2d7f [PATCH] mmc: driv... |
387 388 389 390 391 392 393 394 395 |
iounmap(fm->addr); pci_intx(dev, 0); pci_release_regions(dev); pci_disable_device(dev); tifm_free_adapter(fm); } static struct pci_device_id tifm_7xx1_pci_tbl [] = { |
b5ad67615 tifm_7xx1: recogn... |
396 397 398 399 400 401 |
{ PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11_FM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* xx21 - the one I have */ { PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX12_FM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX20_FM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, |
4020f2d7f [PATCH] mmc: driv... |
402 403 404 405 406 407 408 409 410 411 412 |
{ } }; static struct pci_driver tifm_7xx1_driver = { .name = DRIVER_NAME, .id_table = tifm_7xx1_pci_tbl, .probe = tifm_7xx1_probe, .remove = tifm_7xx1_remove, .suspend = tifm_7xx1_suspend, .resume = tifm_7xx1_resume, }; |
7e0b2cde5 tifm: use module_... |
413 |
module_pci_driver(tifm_7xx1_driver); |
4020f2d7f [PATCH] mmc: driv... |
414 415 416 417 418 |
MODULE_AUTHOR("Alex Dubov"); MODULE_DESCRIPTION("TI FlashMedia host driver"); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, tifm_7xx1_pci_tbl); MODULE_VERSION(DRIVER_VERSION); |