View | Details | Raw Unified | Return to bug 8052 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/misc/tifm_7xx1.c (-193 / +159 lines)
Lines 9-20 Link Here
9
 *
9
 *
10
 */
10
 */
11
11
12
#include <linux/tifm.h>
12
#include "linux/tifm.h"
13
#include <linux/dma-mapping.h>
14
#include <linux/freezer.h>
15
13
16
#define DRIVER_NAME "tifm_7xx1"
14
#define DRIVER_NAME "tifm_7xx1"
17
#define DRIVER_VERSION "0.7"
15
#define DRIVER_VERSION "0.8"
16
17
#define TIFM_IRQ_ENABLE           0x80000000
18
#define TIFM_IRQ_SOCKMASK(x)      (x)
19
#define TIFM_IRQ_CARDMASK(x)      ((x) << 8)
20
#define TIFM_IRQ_FIFOMASK(x)      ((x) << 16)
21
#define TIFM_IRQ_SETALL           0xffffffff
22
23
static void tifm_7xx1_dummy_eject(struct tifm_adapter *fm,
24
				  struct tifm_dev *sock)
25
{
26
}
18
27
19
static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock)
28
static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock)
20
{
29
{
Lines 22-28 static void tifm_7xx1_eject(struct tifm_adapter *fm, struct tifm_dev *sock) Link Here
22
31
23
	spin_lock_irqsave(&fm->lock, flags);
32
	spin_lock_irqsave(&fm->lock, flags);
24
	fm->socket_change_set |= 1 << sock->socket_id;
33
	fm->socket_change_set |= 1 << sock->socket_id;
25
	wake_up_all(&fm->change_set_notify);
34
	tifm_queue_work(&fm->media_switcher);
26
	spin_unlock_irqrestore(&fm->lock, flags);
35
	spin_unlock_irqrestore(&fm->lock, flags);
27
}
36
}
28
37
Lines 30-37 static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id) Link Here
30
{
39
{
31
	struct tifm_adapter *fm = dev_id;
40
	struct tifm_adapter *fm = dev_id;
32
	struct tifm_dev *sock;
41
	struct tifm_dev *sock;
33
	unsigned int irq_status;
42
	unsigned int irq_status, cnt;
34
	unsigned int sock_irq_status, cnt;
35
43
36
	spin_lock(&fm->lock);
44
	spin_lock(&fm->lock);
37
	irq_status = readl(fm->addr + FM_INTERRUPT_STATUS);
45
	irq_status = readl(fm->addr + FM_INTERRUPT_STATUS);
Lines 45-56 static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id) Link Here
45
53
46
		for (cnt = 0; cnt < fm->num_sockets; cnt++) {
54
		for (cnt = 0; cnt < fm->num_sockets; cnt++) {
47
			sock = fm->sockets[cnt];
55
			sock = fm->sockets[cnt];
48
			sock_irq_status = (irq_status >> cnt)
56
			if (sock) {
49
					  & (TIFM_IRQ_FIFOMASK(1)
57
				if ((irq_status >> cnt) & TIFM_IRQ_FIFOMASK(1))
50
					     | TIFM_IRQ_CARDMASK(1));
58
					sock->data_event(sock);
51
59
				if ((irq_status >> cnt) & TIFM_IRQ_CARDMASK(1))
52
			if (sock && sock_irq_status)
60
					sock->card_event(sock);
53
				sock->signal_irq(sock, sock_irq_status);
61
			}
54
		}
62
		}
55
63
56
		fm->socket_change_set |= irq_status
64
		fm->socket_change_set |= irq_status
Lines 58-114 static irqreturn_t tifm_7xx1_isr(int irq, void *dev_id) Link Here
58
	}
66
	}
59
	writel(irq_status, fm->addr + FM_INTERRUPT_STATUS);
67
	writel(irq_status, fm->addr + FM_INTERRUPT_STATUS);
60
68
61
	if (!fm->socket_change_set)
69
	if (fm->finish_me)
70
		complete_all(fm->finish_me);
71
	else if (!fm->socket_change_set)
62
		writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE);
72
		writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE);
63
	else
73
	else
64
		wake_up_all(&fm->change_set_notify);
74
		tifm_queue_work(&fm->media_switcher);
65
75
66
	spin_unlock(&fm->lock);
76
	spin_unlock(&fm->lock);
67
	return IRQ_HANDLED;
77
	return IRQ_HANDLED;
68
}
78
}
69
79
70
static tifm_media_id tifm_7xx1_toggle_sock_power(char __iomem *sock_addr,
80
static unsigned char tifm_7xx1_toggle_sock_power(char __iomem *sock_addr)
71
						 int is_x2)
72
{
81
{
73
	unsigned int s_state;
82
	unsigned int s_state;
74
	int cnt;
83
	int cnt;
75
84
76
	writel(0x0e00, sock_addr + SOCK_CONTROL);
85
	writel(0x0e00, sock_addr + SOCK_CONTROL);
77
86
78
	for (cnt = 0; cnt < 100; cnt++) {
87
	for (cnt = 16; cnt <= 256; cnt <<= 1) {
79
		if (!(TIFM_SOCK_STATE_POWERED
88
		if (!(TIFM_SOCK_STATE_POWERED
80
		      & readl(sock_addr + SOCK_PRESENT_STATE)))
89
		      & readl(sock_addr + SOCK_PRESENT_STATE)))
81
			break;
90
			break;
82
		msleep(10);
91
92
		msleep(cnt);
83
	}
93
	}
84
94
85
	s_state = readl(sock_addr + SOCK_PRESENT_STATE);
95
	s_state = readl(sock_addr + SOCK_PRESENT_STATE);
86
	if (!(TIFM_SOCK_STATE_OCCUPIED & s_state))
96
	if (!(TIFM_SOCK_STATE_OCCUPIED & s_state))
87
		return FM_NULL;
97
		return 0;
88
98
89
	if (is_x2) {
99
	writel(readl(sock_addr + SOCK_CONTROL) | TIFM_CTRL_LED,
90
		writel((s_state & 7) | 0x0c00, sock_addr + SOCK_CONTROL);
100
	       sock_addr + SOCK_CONTROL);
91
	} else {
92
		// SmartMedia cards need extra 40 msec
93
		if (((readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7) == 1)
94
			msleep(40);
95
		writel(readl(sock_addr + SOCK_CONTROL) | TIFM_CTRL_LED,
96
		       sock_addr + SOCK_CONTROL);
97
		msleep(10);
98
		writel((s_state & 0x7) | 0x0c00 | TIFM_CTRL_LED,
99
			sock_addr + SOCK_CONTROL);
100
	}
101
101
102
	for (cnt = 0; cnt < 100; cnt++) {
102
	/* xd needs some extra time before power on */
103
	if (((readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7)
104
	    == TIFM_TYPE_XD)
105
		msleep(40);
106
107
	writel((s_state & 7) | 0x0c00, sock_addr + SOCK_CONTROL);
108
	/* wait for power to stabilize */
109
	msleep(20);
110
	for (cnt = 16; cnt <= 256; cnt <<= 1) {
103
		if ((TIFM_SOCK_STATE_POWERED
111
		if ((TIFM_SOCK_STATE_POWERED
104
		     & readl(sock_addr + SOCK_PRESENT_STATE)))
112
		     & readl(sock_addr + SOCK_PRESENT_STATE)))
105
			break;
113
			break;
106
		msleep(10);
114
115
		msleep(cnt);
107
	}
116
	}
108
117
109
	if (!is_x2)
118
	writel(readl(sock_addr + SOCK_CONTROL) & (~TIFM_CTRL_LED),
110
		writel(readl(sock_addr + SOCK_CONTROL) & (~TIFM_CTRL_LED),
119
	       sock_addr + SOCK_CONTROL);
111
		       sock_addr + SOCK_CONTROL);
112
120
113
	return (readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7;
121
	return (readl(sock_addr + SOCK_PRESENT_STATE) >> 4) & 7;
114
}
122
}
Lines 119-245 tifm_7xx1_sock_addr(char __iomem *base_addr, unsigned int sock_num) Link Here
119
	return base_addr + ((sock_num + 1) << 10);
127
	return base_addr + ((sock_num + 1) << 10);
120
}
128
}
121
129
122
static int tifm_7xx1_switch_media(void *data)
130
static void tifm_7xx1_switch_media(struct work_struct *work)
123
{
131
{
124
	struct tifm_adapter *fm = data;
132
	struct tifm_adapter *fm = container_of(work, struct tifm_adapter,
125
	unsigned long flags;
133
					       media_switcher);
126
	tifm_media_id media_id;
127
	char *card_name = "xx";
128
	int cnt, rc;
129
	struct tifm_dev *sock;
134
	struct tifm_dev *sock;
130
	unsigned int socket_change_set;
135
	unsigned long flags;
131
136
	unsigned char media_id;
132
	while (1) {
137
	unsigned int socket_change_set, cnt;
133
		rc = wait_event_interruptible(fm->change_set_notify,
134
					      fm->socket_change_set);
135
		if (rc == -ERESTARTSYS)
136
			try_to_freeze();
137
138
138
		spin_lock_irqsave(&fm->lock, flags);
139
	spin_lock_irqsave(&fm->lock, flags);
139
		socket_change_set = fm->socket_change_set;
140
	socket_change_set = fm->socket_change_set;
140
		fm->socket_change_set = 0;
141
	fm->socket_change_set = 0;
141
142
142
		dev_dbg(fm->dev, "checking media set %x\n",
143
	dev_dbg(fm->cdev.dev, "checking media set %x\n",
143
			socket_change_set);
144
		socket_change_set);
144
145
145
		if (kthread_should_stop())
146
	if (!socket_change_set) {
146
			socket_change_set = (1 << fm->num_sockets) - 1;
147
		spin_unlock_irqrestore(&fm->lock, flags);
147
		spin_unlock_irqrestore(&fm->lock, flags);
148
		return;
149
	}
148
150
149
		if (!socket_change_set)
151
	for (cnt = 0; cnt < fm->num_sockets; cnt++) {
152
		if (!(socket_change_set & (1 << cnt)))
150
			continue;
153
			continue;
151
154
		sock = fm->sockets[cnt];
152
		spin_lock_irqsave(&fm->lock, flags);
155
		if (sock) {
153
		for (cnt = 0; cnt < fm->num_sockets; cnt++) {
156
			printk(KERN_INFO
154
			if (!(socket_change_set & (1 << cnt)))
157
			       "%s : demand removing card from socket %u:%u\n",
155
				continue;
158
			       fm->cdev.class_id, fm->id, cnt);
156
			sock = fm->sockets[cnt];
159
			fm->sockets[cnt] = NULL;
157
			if (sock) {
158
				printk(KERN_INFO DRIVER_NAME
159
				       ": demand removing card from socket %d\n",
160
				       cnt);
161
				fm->sockets[cnt] = NULL;
162
				spin_unlock_irqrestore(&fm->lock, flags);
163
				device_unregister(&sock->dev);
164
				spin_lock_irqsave(&fm->lock, flags);
165
				writel(0x0e00,
166
				       tifm_7xx1_sock_addr(fm->addr, cnt)
167
				       + SOCK_CONTROL);
168
			}
169
			if (kthread_should_stop())
170
				continue;
171
172
			spin_unlock_irqrestore(&fm->lock, flags);
160
			spin_unlock_irqrestore(&fm->lock, flags);
173
			media_id = tifm_7xx1_toggle_sock_power(
161
			device_unregister(&sock->dev);
174
					tifm_7xx1_sock_addr(fm->addr, cnt),
162
			spin_lock_irqsave(&fm->lock, flags);
175
					fm->num_sockets == 2);
163
			writel(0x0e00, tifm_7xx1_sock_addr(fm->addr, cnt)
176
			if (media_id) {
164
			       + SOCK_CONTROL);
177
				sock = tifm_alloc_device(fm);
178
				if (sock) {
179
					sock->addr = tifm_7xx1_sock_addr(fm->addr,
180
									 cnt);
181
					sock->media_id = media_id;
182
					sock->socket_id = cnt;
183
					switch (media_id) {
184
					case 1:
185
						card_name = "xd";
186
						break;
187
					case 2:
188
						card_name = "ms";
189
						break;
190
					case 3:
191
						card_name = "sd";
192
						break;
193
					default:
194
						tifm_free_device(&sock->dev);
195
						spin_lock_irqsave(&fm->lock, flags);
196
						continue;
197
					}
198
					snprintf(sock->dev.bus_id, BUS_ID_SIZE,
199
						 "tifm_%s%u:%u", card_name,
200
						 fm->id, cnt);
201
					printk(KERN_INFO DRIVER_NAME
202
					       ": %s card detected in socket %d\n",
203
					       card_name, cnt);
204
					if (!device_register(&sock->dev)) {
205
						spin_lock_irqsave(&fm->lock, flags);
206
						if (!fm->sockets[cnt]) {
207
							fm->sockets[cnt] = sock;
208
							sock = NULL;
209
						}
210
						spin_unlock_irqrestore(&fm->lock, flags);
211
					}
212
					if (sock)
213
						tifm_free_device(&sock->dev);
214
				}
215
				spin_lock_irqsave(&fm->lock, flags);
216
			}
217
		}
165
		}
218
166
219
		if (!kthread_should_stop()) {
167
		spin_unlock_irqrestore(&fm->lock, flags);
220
			writel(TIFM_IRQ_FIFOMASK(socket_change_set)
168
221
			       | TIFM_IRQ_CARDMASK(socket_change_set),
169
		media_id = tifm_7xx1_toggle_sock_power(
222
			       fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
170
				tifm_7xx1_sock_addr(fm->addr, cnt));
223
			writel(TIFM_IRQ_FIFOMASK(socket_change_set)
171
224
			       | TIFM_IRQ_CARDMASK(socket_change_set),
172
		// tifm_alloc_device will check if media_id is valid
225
			       fm->addr + FM_SET_INTERRUPT_ENABLE);
173
		sock = tifm_alloc_device(fm, cnt, media_id);
226
			writel(TIFM_IRQ_ENABLE,
174
		if (sock) {
227
			       fm->addr + FM_SET_INTERRUPT_ENABLE);
175
			sock->addr = tifm_7xx1_sock_addr(fm->addr, cnt);
228
			spin_unlock_irqrestore(&fm->lock, flags);
176
229
		} else {
177
			if (!device_register(&sock->dev)) {
230
			for (cnt = 0; cnt < fm->num_sockets; cnt++) {
178
				spin_lock_irqsave(&fm->lock, flags);
231
				if (fm->sockets[cnt])
179
				if (!fm->sockets[cnt]) {
232
					fm->socket_change_set |= 1 << cnt;
180
					fm->sockets[cnt] = sock;
233
			}
181
					sock = NULL;
234
			if (!fm->socket_change_set) {
182
				}
235
				spin_unlock_irqrestore(&fm->lock, flags);
236
				return 0;
237
			} else {
238
				spin_unlock_irqrestore(&fm->lock, flags);
183
				spin_unlock_irqrestore(&fm->lock, flags);
239
			}
184
			}
185
			if (sock)
186
				tifm_free_device(&sock->dev);
240
		}
187
		}
188
		spin_lock_irqsave(&fm->lock, flags);
241
	}
189
	}
242
	return 0;
190
191
	writel(TIFM_IRQ_FIFOMASK(socket_change_set)
192
	       | TIFM_IRQ_CARDMASK(socket_change_set),
193
	       fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
194
195
	writel(TIFM_IRQ_FIFOMASK(socket_change_set)
196
	       | TIFM_IRQ_CARDMASK(socket_change_set),
197
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
198
199
	writel(TIFM_IRQ_ENABLE, fm->addr + FM_SET_INTERRUPT_ENABLE);
200
	spin_unlock_irqrestore(&fm->lock, flags);
243
}
201
}
244
202
245
#ifdef CONFIG_PM
203
#ifdef CONFIG_PM
Lines 258-266 static int tifm_7xx1_suspend(struct pci_dev *dev, pm_message_t state) Link Here
258
static int tifm_7xx1_resume(struct pci_dev *dev)
216
static int tifm_7xx1_resume(struct pci_dev *dev)
259
{
217
{
260
	struct tifm_adapter *fm = pci_get_drvdata(dev);
218
	struct tifm_adapter *fm = pci_get_drvdata(dev);
261
	int cnt, rc;
219
	int rc;
220
	unsigned int good_sockets = 0, bad_sockets = 0;
262
	unsigned long flags;
221
	unsigned long flags;
263
	tifm_media_id new_ids[fm->num_sockets];
222
	unsigned char new_ids[fm->num_sockets];
223
	DECLARE_COMPLETION_ONSTACK(finish_resume);
264
224
265
	pci_set_power_state(dev, PCI_D0);
225
	pci_set_power_state(dev, PCI_D0);
266
	pci_restore_state(dev);
226
	pci_restore_state(dev);
Lines 271-315 static int tifm_7xx1_resume(struct pci_dev *dev) Link Here
271
231
272
	dev_dbg(&dev->dev, "resuming host\n");
232
	dev_dbg(&dev->dev, "resuming host\n");
273
233
274
	for (cnt = 0; cnt < fm->num_sockets; cnt++)
234
	for (rc = 0; rc < fm->num_sockets; rc++)
275
		new_ids[cnt] = tifm_7xx1_toggle_sock_power(
235
		new_ids[rc] = tifm_7xx1_toggle_sock_power(
276
					tifm_7xx1_sock_addr(fm->addr, cnt),
236
					tifm_7xx1_sock_addr(fm->addr, rc));
277
					fm->num_sockets == 2);
278
	spin_lock_irqsave(&fm->lock, flags);
237
	spin_lock_irqsave(&fm->lock, flags);
279
	fm->socket_change_set = 0;
238
	for (rc = 0; rc < fm->num_sockets; rc++) {
280
	for (cnt = 0; cnt < fm->num_sockets; cnt++) {
239
		if (fm->sockets[rc]) {
281
		if (fm->sockets[cnt]) {
240
			if (fm->sockets[rc]->type == new_ids[rc])
282
			if (fm->sockets[cnt]->media_id == new_ids[cnt])
241
				good_sockets |= 1 << rc;
283
				fm->socket_change_set |= 1 << cnt;
242
			else
284
243
				bad_sockets |= 1 << rc;
285
			fm->sockets[cnt]->media_id = new_ids[cnt];
286
		}
244
		}
287
	}
245
	}
288
246
289
	writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1),
247
	writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1),
290
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
248
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
291
	if (!fm->socket_change_set) {
249
	dev_dbg(&dev->dev, "change sets on resume: good %x, bad %x\n",
292
		spin_unlock_irqrestore(&fm->lock, flags);
250
		good_sockets, bad_sockets);
293
		return 0;
251
294
	} else {
252
	fm->socket_change_set = 0;
295
		fm->socket_change_set = 0;
253
	if (good_sockets) {
254
		fm->finish_me = &finish_resume;
296
		spin_unlock_irqrestore(&fm->lock, flags);
255
		spin_unlock_irqrestore(&fm->lock, flags);
256
		rc = wait_for_completion_timeout(&finish_resume, HZ);
257
		dev_dbg(&dev->dev, "wait returned %d\n", rc);
258
		writel(TIFM_IRQ_FIFOMASK(good_sockets)
259
		       | TIFM_IRQ_CARDMASK(good_sockets),
260
		       fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
261
		writel(TIFM_IRQ_FIFOMASK(good_sockets)
262
		       | TIFM_IRQ_CARDMASK(good_sockets),
263
		       fm->addr + FM_SET_INTERRUPT_ENABLE);
264
		spin_lock_irqsave(&fm->lock, flags);
265
		fm->finish_me = NULL;
266
		fm->socket_change_set ^= good_sockets & fm->socket_change_set;
297
	}
267
	}
298
268
299
	wait_event_timeout(fm->change_set_notify, fm->socket_change_set, HZ);
269
	fm->socket_change_set |= bad_sockets;
270
	if (fm->socket_change_set)
271
		tifm_queue_work(&fm->media_switcher);
300
272
301
	spin_lock_irqsave(&fm->lock, flags);
273
	spin_unlock_irqrestore(&fm->lock, flags);
302
	writel(TIFM_IRQ_FIFOMASK(fm->socket_change_set)
303
	       | TIFM_IRQ_CARDMASK(fm->socket_change_set),
304
	       fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
305
	writel(TIFM_IRQ_FIFOMASK(fm->socket_change_set)
306
	       | TIFM_IRQ_CARDMASK(fm->socket_change_set),
307
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
308
	writel(TIFM_IRQ_ENABLE,
274
	writel(TIFM_IRQ_ENABLE,
309
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
275
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
310
	fm->socket_change_set = 0;
311
276
312
	spin_unlock_irqrestore(&fm->lock, flags);
313
	return 0;
277
	return 0;
314
}
278
}
315
279
Lines 320-325 static int tifm_7xx1_resume(struct pci_dev *dev) Link Here
320
284
321
#endif /* CONFIG_PM */
285
#endif /* CONFIG_PM */
322
286
287
static int tifm_7xx1_dummy_has_ms_pif(struct tifm_adapter *fm,
288
				      struct tifm_dev *sock)
289
{
290
	return 0;
291
}
292
293
static int tifm_7xx1_has_ms_pif(struct tifm_adapter *fm, struct tifm_dev *sock)
294
{
295
	if (((fm->num_sockets == 4) && (sock->socket_id == 2))
296
	    || ((fm->num_sockets == 2) && (sock->socket_id == 0)))
297
		return 1;
298
299
	return 0;
300
}
301
323
static int tifm_7xx1_probe(struct pci_dev *dev,
302
static int tifm_7xx1_probe(struct pci_dev *dev,
324
			   const struct pci_device_id *dev_id)
303
			   const struct pci_device_id *dev_id)
325
{
304
{
Lines 345-365 static int tifm_7xx1_probe(struct pci_dev *dev, Link Here
345
324
346
	pci_intx(dev, 1);
325
	pci_intx(dev, 1);
347
326
348
	fm = tifm_alloc_adapter();
327
	fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM
328
				? 4 : 2, &dev->dev);
349
	if (!fm) {
329
	if (!fm) {
350
		rc = -ENOMEM;
330
		rc = -ENOMEM;
351
		goto err_out_int;
331
		goto err_out_int;
352
	}
332
	}
353
333
354
	fm->dev = &dev->dev;
334
	INIT_WORK(&fm->media_switcher, tifm_7xx1_switch_media);
355
	fm->num_sockets = (dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM)
356
			  ? 4 : 2;
357
	fm->sockets = kzalloc(sizeof(struct tifm_dev*) * fm->num_sockets,
358
			      GFP_KERNEL);
359
	if (!fm->sockets)
360
		goto err_out_free;
361
362
	fm->eject = tifm_7xx1_eject;
335
	fm->eject = tifm_7xx1_eject;
336
	fm->has_ms_pif = tifm_7xx1_has_ms_pif;
363
	pci_set_drvdata(dev, fm);
337
	pci_set_drvdata(dev, fm);
364
338
365
	fm->addr = ioremap(pci_resource_start(dev, 0),
339
	fm->addr = ioremap(pci_resource_start(dev, 0),
Lines 367-385 static int tifm_7xx1_probe(struct pci_dev *dev, Link Here
367
	if (!fm->addr)
341
	if (!fm->addr)
368
		goto err_out_free;
342
		goto err_out_free;
369
343
370
	rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm);
344
	rc = request_irq(dev->irq, tifm_7xx1_isr, SA_SHIRQ, DRIVER_NAME, fm);
371
	if (rc)
345
	if (rc)
372
		goto err_out_unmap;
346
		goto err_out_unmap;
373
347
374
	init_waitqueue_head(&fm->change_set_notify);
348
	rc = tifm_add_adapter(fm);
375
	rc = tifm_add_adapter(fm, tifm_7xx1_switch_media);
376
	if (rc)
349
	if (rc)
377
		goto err_out_irq;
350
		goto err_out_irq;
378
351
379
	writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
380
	writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1),
352
	writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1),
381
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
353
	       fm->addr + FM_SET_INTERRUPT_ENABLE);
382
	wake_up_process(fm->media_switcher);
383
	return 0;
354
	return 0;
384
355
385
err_out_irq:
356
err_out_irq:
Lines 401-418 err_out: Link Here
401
static void tifm_7xx1_remove(struct pci_dev *dev)
372
static void tifm_7xx1_remove(struct pci_dev *dev)
402
{
373
{
403
	struct tifm_adapter *fm = pci_get_drvdata(dev);
374
	struct tifm_adapter *fm = pci_get_drvdata(dev);
404
	unsigned long flags;
405
375
376
	fm->eject = tifm_7xx1_dummy_eject;
377
	fm->has_ms_pif = tifm_7xx1_dummy_has_ms_pif;
406
	writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
378
	writel(TIFM_IRQ_SETALL, fm->addr + FM_CLEAR_INTERRUPT_ENABLE);
407
	mmiowb();
379
	mmiowb();
408
	free_irq(dev->irq, fm);
380
	free_irq(dev->irq, fm);
409
381
410
	spin_lock_irqsave(&fm->lock, flags);
411
	fm->socket_change_set = (1 << fm->num_sockets) - 1;
412
	spin_unlock_irqrestore(&fm->lock, flags);
413
414
	kthread_stop(fm->media_switcher);
415
416
	tifm_remove_adapter(fm);
382
	tifm_remove_adapter(fm);
417
383
418
	pci_set_drvdata(dev, NULL);
384
	pci_set_drvdata(dev, NULL);
(-)a/drivers/misc/tifm_core.c (-124 / +190 lines)
Lines 9-84 Link Here
9
 *
9
 *
10
 */
10
 */
11
11
12
#include <linux/tifm.h>
12
#include "linux/tifm.h"
13
#include <linux/init.h>
13
#include <linux/init.h>
14
#include <linux/idr.h>
14
#include <linux/idr.h>
15
15
16
#define DRIVER_NAME "tifm_core"
16
#define DRIVER_NAME "tifm_core"
17
#define DRIVER_VERSION "0.7"
17
#define DRIVER_VERSION "0.8"
18
18
19
static struct workqueue_struct *workqueue;
19
static DEFINE_IDR(tifm_adapter_idr);
20
static DEFINE_IDR(tifm_adapter_idr);
20
static DEFINE_SPINLOCK(tifm_adapter_lock);
21
static DEFINE_SPINLOCK(tifm_adapter_lock);
21
22
22
static tifm_media_id *tifm_device_match(tifm_media_id *ids,
23
static const char *tifm_media_type_name(unsigned char type, unsigned char nt)
23
			struct tifm_dev *dev)
24
{
24
{
25
	while (*ids) {
25
	const char *card_type_name[3][3] = {
26
		if (dev->media_id == *ids)
26
		{ "SmartMedia/xD", "MemoryStick", "MMC/SD" },
27
			return ids;
27
		{ "XD", "MS", "SD"},
28
		ids++;
28
		{ "xd", "ms", "sd"}
29
	}
29
	};
30
	return NULL;
30
31
	if (nt > 2 || type < 1 || type > 3)
32
		return NULL;
33
	return card_type_name[nt][type - 1];
31
}
34
}
32
35
33
static int tifm_match(struct device *dev, struct device_driver *drv)
36
static int tifm_dev_match(struct tifm_dev *sock, struct tifm_device_id *id)
34
{
37
{
35
	struct tifm_dev *fm_dev = container_of(dev, struct tifm_dev, dev);
38
	if (sock->type == id->type)
36
	struct tifm_driver *fm_drv;
37
38
	fm_drv = container_of(drv, struct tifm_driver, driver);
39
	if (!fm_drv->id_table)
40
		return -EINVAL;
41
	if (tifm_device_match(fm_drv->id_table, fm_dev))
42
		return 1;
39
		return 1;
43
	return -ENODEV;
40
	return 0;
41
}
42
43
static int tifm_bus_match(struct device *dev, struct device_driver *drv)
44
{
45
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
46
	struct tifm_driver *fm_drv = container_of(drv, struct tifm_driver,
47
						  driver);
48
	struct tifm_device_id *ids = fm_drv->id_table;
49
50
	if (ids) {
51
		while (ids->type) {
52
			if (tifm_dev_match(sock, ids))
53
				return 1;
54
			++ids;
55
		}
56
	}
57
	return 0;
44
}
58
}
45
59
46
static int tifm_uevent(struct device *dev, char **envp, int num_envp,
60
static int tifm_uevent(struct device *dev, char **envp, int num_envp,
47
		       char *buffer, int buffer_size)
61
		       char *buffer, int buffer_size)
48
{
62
{
49
	struct tifm_dev *fm_dev;
63
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
50
	int i = 0;
64
	int i = 0;
51
	int length = 0;
65
	int length = 0;
52
	const char *card_type_name[] = {"INV", "SM", "MS", "SD"};
53
66
54
	if (!dev || !(fm_dev = container_of(dev, struct tifm_dev, dev)))
55
		return -ENODEV;
56
	if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
67
	if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
57
			"TIFM_CARD_TYPE=%s", card_type_name[fm_dev->media_id]))
68
			   "TIFM_CARD_TYPE=%s",
69
			   tifm_media_type_name(sock->type, 1)))
58
		return -ENOMEM;
70
		return -ENOMEM;
59
71
60
	return 0;
72
	return 0;
61
}
73
}
62
74
75
static int tifm_device_probe(struct device *dev)
76
{
77
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
78
	struct tifm_driver *drv = container_of(dev->driver, struct tifm_driver,
79
					       driver);
80
	int rc = -ENODEV;
81
82
	get_device(dev);
83
	if (dev->driver && drv->probe) {
84
		rc = drv->probe(sock);
85
		if (!rc)
86
			return 0;
87
	}
88
	put_device(dev);
89
	return rc;
90
}
91
92
static void tifm_dummy_event(struct tifm_dev *sock)
93
{
94
	return;
95
}
96
97
static int tifm_device_remove(struct device *dev)
98
{
99
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
100
	struct tifm_driver *drv = container_of(dev->driver, struct tifm_driver,
101
					       driver);
102
103
	if (dev->driver && drv->remove) {
104
		sock->card_event = tifm_dummy_event;
105
		sock->data_event = tifm_dummy_event;
106
		drv->remove(sock);
107
		sock->dev.driver = NULL;
108
	}
109
110
	put_device(dev);
111
	return 0;
112
}
113
63
#ifdef CONFIG_PM
114
#ifdef CONFIG_PM
64
115
65
static int tifm_device_suspend(struct device *dev, pm_message_t state)
116
static int tifm_device_suspend(struct device *dev, pm_message_t state)
66
{
117
{
67
	struct tifm_dev *fm_dev = container_of(dev, struct tifm_dev, dev);
118
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
68
	struct tifm_driver *drv = fm_dev->drv;
119
	struct tifm_driver *drv = container_of(dev->driver, struct tifm_driver,
120
					       driver);
69
121
70
	if (drv && drv->suspend)
122
	if (dev->driver && drv->suspend)
71
		return drv->suspend(fm_dev, state);
123
		return drv->suspend(sock, state);
72
	return 0;
124
	return 0;
73
}
125
}
74
126
75
static int tifm_device_resume(struct device *dev)
127
static int tifm_device_resume(struct device *dev)
76
{
128
{
77
	struct tifm_dev *fm_dev = container_of(dev, struct tifm_dev, dev);
129
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
78
	struct tifm_driver *drv = fm_dev->drv;
130
	struct tifm_driver *drv = container_of(dev->driver, struct tifm_driver,
131
					       driver);
79
132
80
	if (drv && drv->resume)
133
	if (dev->driver && drv->resume)
81
		return drv->resume(fm_dev);
134
		return drv->resume(sock);
82
	return 0;
135
	return 0;
83
}
136
}
84
137
Lines 89-107 static int tifm_device_resume(struct device *dev) Link Here
89
142
90
#endif /* CONFIG_PM */
143
#endif /* CONFIG_PM */
91
144
145
static ssize_t type_show(struct device *dev, struct device_attribute *attr,
146
			 char *buf)
147
{
148
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
149
	return sprintf(buf, "%x", sock->type);
150
}
151
152
static struct device_attribute tifm_dev_attrs[] = {
153
	__ATTR(type, S_IRUGO, type_show, NULL),
154
	__ATTR_NULL
155
};
156
92
static struct bus_type tifm_bus_type = {
157
static struct bus_type tifm_bus_type = {
93
	.name    = "tifm",
158
	.name      = "tifm",
94
	.match   = tifm_match,
159
	.dev_attrs = tifm_dev_attrs,
95
	.uevent  = tifm_uevent,
160
	.match     = tifm_bus_match,
96
	.suspend = tifm_device_suspend,
161
	.uevent    = tifm_uevent,
97
	.resume  = tifm_device_resume
162
	.probe     = tifm_device_probe,
163
	.remove    = tifm_device_remove,
164
	.suspend   = tifm_device_suspend,
165
	.resume    = tifm_device_resume
98
};
166
};
99
167
100
static void tifm_free(struct class_device *cdev)
168
static void tifm_free(struct class_device *cdev)
101
{
169
{
102
	struct tifm_adapter *fm = container_of(cdev, struct tifm_adapter, cdev);
170
	struct tifm_adapter *fm = container_of(cdev, struct tifm_adapter, cdev);
103
171
104
	kfree(fm->sockets);
105
	kfree(fm);
172
	kfree(fm);
106
}
173
}
107
174
Lines 110-137 static struct class tifm_adapter_class = { Link Here
110
	.release = tifm_free
177
	.release = tifm_free
111
};
178
};
112
179
113
struct tifm_adapter *tifm_alloc_adapter(void)
180
struct tifm_adapter *tifm_alloc_adapter(unsigned int num_sockets,
181
					struct device *dev)
114
{
182
{
115
	struct tifm_adapter *fm;
183
	struct tifm_adapter *fm;
116
184
117
	fm = kzalloc(sizeof(struct tifm_adapter), GFP_KERNEL);
185
	fm = kzalloc(sizeof(struct tifm_adapter)
186
		     + sizeof(struct tifm_dev*) * num_sockets, GFP_KERNEL);
118
	if (fm) {
187
	if (fm) {
119
		fm->cdev.class = &tifm_adapter_class;
188
		fm->cdev.class = &tifm_adapter_class;
120
		spin_lock_init(&fm->lock);
189
		fm->cdev.dev = dev;
121
		class_device_initialize(&fm->cdev);
190
		class_device_initialize(&fm->cdev);
191
		spin_lock_init(&fm->lock);
192
		fm->num_sockets = num_sockets;
122
	}
193
	}
123
	return fm;
194
	return fm;
124
}
195
}
125
EXPORT_SYMBOL(tifm_alloc_adapter);
196
EXPORT_SYMBOL(tifm_alloc_adapter);
126
197
127
void tifm_free_adapter(struct tifm_adapter *fm)
198
int tifm_add_adapter(struct tifm_adapter *fm)
128
{
129
	class_device_put(&fm->cdev);
130
}
131
EXPORT_SYMBOL(tifm_free_adapter);
132
133
int tifm_add_adapter(struct tifm_adapter *fm,
134
		     int (*mediathreadfn)(void *data))
135
{
199
{
136
	int rc;
200
	int rc;
137
201
Lines 141-199 int tifm_add_adapter(struct tifm_adapter *fm, Link Here
141
	spin_lock(&tifm_adapter_lock);
205
	spin_lock(&tifm_adapter_lock);
142
	rc = idr_get_new(&tifm_adapter_idr, fm, &fm->id);
206
	rc = idr_get_new(&tifm_adapter_idr, fm, &fm->id);
143
	spin_unlock(&tifm_adapter_lock);
207
	spin_unlock(&tifm_adapter_lock);
144
	if (!rc) {
208
	if (rc)
145
		snprintf(fm->cdev.class_id, BUS_ID_SIZE, "tifm%u", fm->id);
209
		return rc;
146
		fm->media_switcher = kthread_create(mediathreadfn,
147
						    fm, "tifm/%u", fm->id);
148
149
		if (!IS_ERR(fm->media_switcher))
150
			return class_device_add(&fm->cdev);
151
210
211
	snprintf(fm->cdev.class_id, BUS_ID_SIZE, "tifm%u", fm->id);
212
	rc = class_device_add(&fm->cdev);
213
	if (rc) {
152
		spin_lock(&tifm_adapter_lock);
214
		spin_lock(&tifm_adapter_lock);
153
		idr_remove(&tifm_adapter_idr, fm->id);
215
		idr_remove(&tifm_adapter_idr, fm->id);
154
		spin_unlock(&tifm_adapter_lock);
216
		spin_unlock(&tifm_adapter_lock);
155
		rc = -ENOMEM;
156
	}
217
	}
218
157
	return rc;
219
	return rc;
158
}
220
}
159
EXPORT_SYMBOL(tifm_add_adapter);
221
EXPORT_SYMBOL(tifm_add_adapter);
160
222
161
void tifm_remove_adapter(struct tifm_adapter *fm)
223
void tifm_remove_adapter(struct tifm_adapter *fm)
162
{
224
{
163
	class_device_del(&fm->cdev);
225
	unsigned int cnt;
226
227
	flush_workqueue(workqueue);
228
	for (cnt = 0; cnt < fm->num_sockets; ++cnt) {
229
		if (fm->sockets[cnt])
230
			device_unregister(&fm->sockets[cnt]->dev);
231
	}
164
232
165
	spin_lock(&tifm_adapter_lock);
233
	spin_lock(&tifm_adapter_lock);
166
	idr_remove(&tifm_adapter_idr, fm->id);
234
	idr_remove(&tifm_adapter_idr, fm->id);
167
	spin_unlock(&tifm_adapter_lock);
235
	spin_unlock(&tifm_adapter_lock);
236
	class_device_del(&fm->cdev);
168
}
237
}
169
EXPORT_SYMBOL(tifm_remove_adapter);
238
EXPORT_SYMBOL(tifm_remove_adapter);
170
239
171
void tifm_free_device(struct device *dev)
240
void tifm_free_adapter(struct tifm_adapter *fm)
172
{
241
{
173
	struct tifm_dev *fm_dev = container_of(dev, struct tifm_dev, dev);
242
	class_device_put(&fm->cdev);
174
	kfree(fm_dev);
175
}
243
}
176
EXPORT_SYMBOL(tifm_free_device);
244
EXPORT_SYMBOL(tifm_free_adapter);
177
245
178
static void tifm_dummy_signal_irq(struct tifm_dev *sock,
246
void tifm_free_device(struct device *dev)
179
				  unsigned int sock_irq_status)
180
{
247
{
181
	return;
248
	struct tifm_dev *sock = container_of(dev, struct tifm_dev, dev);
249
	kfree(sock);
182
}
250
}
251
EXPORT_SYMBOL(tifm_free_device);
183
252
184
struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm)
253
struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id,
254
				   unsigned char type)
185
{
255
{
186
	struct tifm_dev *dev = kzalloc(sizeof(struct tifm_dev), GFP_KERNEL);
256
	struct tifm_dev *sock = NULL;
187
257
188
	if (dev) {
258
	if (!tifm_media_type_name(type, 0))
189
		spin_lock_init(&dev->lock);
259
		return sock;
190
260
191
		dev->dev.parent = fm->dev;
261
	sock = kzalloc(sizeof(struct tifm_dev), GFP_KERNEL);
192
		dev->dev.bus = &tifm_bus_type;
262
	if (sock) {
193
		dev->dev.release = tifm_free_device;
263
		spin_lock_init(&sock->lock);
194
		dev->signal_irq = tifm_dummy_signal_irq;
264
		sock->type = type;
265
		sock->socket_id = id;
266
		sock->card_event = tifm_dummy_event;
267
		sock->data_event = tifm_dummy_event;
268
269
		sock->dev.parent = fm->cdev.dev;
270
		sock->dev.bus = &tifm_bus_type;
271
		sock->dev.dma_mask = fm->cdev.dev->dma_mask;
272
		sock->dev.release = tifm_free_device;
273
274
		snprintf(sock->dev.bus_id, BUS_ID_SIZE,
275
			 "tifm_%s%u:%u", tifm_media_type_name(type, 2),
276
			 fm->id, id);
277
		printk(KERN_INFO DRIVER_NAME
278
		       ": %s card detected in socket %u:%u\n",
279
		       tifm_media_type_name(type, 0), fm->id, id);
195
	}
280
	}
196
	return dev;
281
	return sock;
197
}
282
}
198
EXPORT_SYMBOL(tifm_alloc_device);
283
EXPORT_SYMBOL(tifm_alloc_device);
199
284
Lines 204-209 void tifm_eject(struct tifm_dev *sock) Link Here
204
}
289
}
205
EXPORT_SYMBOL(tifm_eject);
290
EXPORT_SYMBOL(tifm_eject);
206
291
292
int tifm_has_ms_pif(struct tifm_dev *sock)
293
{
294
	struct tifm_adapter *fm = dev_get_drvdata(sock->dev.parent);
295
	return fm->has_ms_pif(fm, sock);
296
}
297
EXPORT_SYMBOL(tifm_has_ms_pif);
298
207
int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
299
int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
208
		int direction)
300
		int direction)
209
{
301
{
Lines 218-271 void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents, Link Here
218
}
310
}
219
EXPORT_SYMBOL(tifm_unmap_sg);
311
EXPORT_SYMBOL(tifm_unmap_sg);
220
312
221
static int tifm_device_probe(struct device *dev)
313
void tifm_queue_work(struct work_struct *work)
222
{
223
	struct tifm_driver *drv;
224
	struct tifm_dev *fm_dev;
225
	int rc = 0;
226
	const tifm_media_id *id;
227
228
	drv = container_of(dev->driver, struct tifm_driver, driver);
229
	fm_dev = container_of(dev, struct tifm_dev, dev);
230
	get_device(dev);
231
	if (!fm_dev->drv && drv->probe && drv->id_table) {
232
		rc = -ENODEV;
233
		id = tifm_device_match(drv->id_table, fm_dev);
234
		if (id)
235
			rc = drv->probe(fm_dev);
236
		if (rc >= 0) {
237
			rc = 0;
238
			fm_dev->drv = drv;
239
		}
240
	}
241
	if (rc)
242
		put_device(dev);
243
	return rc;
244
}
245
246
static int tifm_device_remove(struct device *dev)
247
{
314
{
248
	struct tifm_dev *fm_dev = container_of(dev, struct tifm_dev, dev);
315
	queue_work(workqueue, work);
249
	struct tifm_driver *drv = fm_dev->drv;
250
251
	if (drv) {
252
		fm_dev->signal_irq = tifm_dummy_signal_irq;
253
		if (drv->remove)
254
			drv->remove(fm_dev);
255
		fm_dev->drv = NULL;
256
	}
257
258
	put_device(dev);
259
	return 0;
260
}
316
}
317
EXPORT_SYMBOL(tifm_queue_work);
261
318
262
int tifm_register_driver(struct tifm_driver *drv)
319
int tifm_register_driver(struct tifm_driver *drv)
263
{
320
{
264
	drv->driver.bus = &tifm_bus_type;
321
	drv->driver.bus = &tifm_bus_type;
265
	drv->driver.probe = tifm_device_probe;
266
	drv->driver.remove = tifm_device_remove;
267
	drv->driver.suspend = tifm_device_suspend;
268
	drv->driver.resume = tifm_device_resume;
269
322
270
	return driver_register(&drv->driver);
323
	return driver_register(&drv->driver);
271
}
324
}
Lines 279-291 EXPORT_SYMBOL(tifm_unregister_driver); Link Here
279
332
280
static int __init tifm_init(void)
333
static int __init tifm_init(void)
281
{
334
{
282
	int rc = bus_register(&tifm_bus_type);
335
	int rc;
283
336
284
	if (!rc) {
337
	workqueue = create_freezeable_workqueue("tifm");
285
		rc = class_register(&tifm_adapter_class);
338
	if (!workqueue)
286
		if (rc)
339
		return -ENOMEM;
287
			bus_unregister(&tifm_bus_type);
340
288
	}
341
	rc = bus_register(&tifm_bus_type);
342
343
	if (rc)
344
		goto err_out_wq;
345
346
	rc = class_register(&tifm_adapter_class);
347
	if (!rc)
348
		return 0;
349
350
	bus_unregister(&tifm_bus_type);
351
352
err_out_wq:
353
	destroy_workqueue(workqueue);
289
354
290
	return rc;
355
	return rc;
291
}
356
}
Lines 294-299 static void __exit tifm_exit(void) Link Here
294
{
359
{
295
	class_unregister(&tifm_adapter_class);
360
	class_unregister(&tifm_adapter_class);
296
	bus_unregister(&tifm_bus_type);
361
	bus_unregister(&tifm_bus_type);
362
	destroy_workqueue(workqueue);
297
}
363
}
298
364
299
subsys_initcall(tifm_init);
365
subsys_initcall(tifm_init);
(-)a/drivers/mmc/tifm_sd.c (-431 / +553 lines)
Lines 7-23 Link Here
7
 * it under the terms of the GNU General Public License version 2 as
7
 * it under the terms of the GNU General Public License version 2 as
8
 * published by the Free Software Foundation.
8
 * published by the Free Software Foundation.
9
 *
9
 *
10
 * Special thanks to Brad Campbell for extensive testing of this driver.
11
 *
10
 */
12
 */
11
13
12
14
13
#include <linux/tifm.h>
15
#include "linux/tifm.h"
14
#include <linux/mmc/protocol.h>
16
#include <linux/mmc/protocol.h>
15
#include <linux/mmc/host.h>
17
#include <linux/mmc/host.h>
16
#include <linux/highmem.h>
18
#include <linux/highmem.h>
19
#include <linux/scatterlist.h>
17
#include <asm/io.h>
20
#include <asm/io.h>
18
21
19
#define DRIVER_NAME "tifm_sd"
22
#define DRIVER_NAME "tifm_sd"
20
#define DRIVER_VERSION "0.7"
23
#define DRIVER_VERSION "0.8"
21
24
22
static int no_dma = 0;
25
static int no_dma = 0;
23
static int fixed_timeout = 0;
26
static int fixed_timeout = 0;
Lines 36-44 module_param(fixed_timeout, bool, 0644); Link Here
36
#define TIFM_MMCSD_INAB       0x0080   /* abort / initialize command */
39
#define TIFM_MMCSD_INAB       0x0080   /* abort / initialize command */
37
#define TIFM_MMCSD_READ       0x8000
40
#define TIFM_MMCSD_READ       0x8000
38
41
39
#define TIFM_MMCSD_DATAMASK   0x401d   /* set bits: CERR, EOFB, BRS, CB, EOC */
40
#define TIFM_MMCSD_ERRMASK    0x01e0   /* set bits: CCRC, CTO, DCRC, DTO */
42
#define TIFM_MMCSD_ERRMASK    0x01e0   /* set bits: CCRC, CTO, DCRC, DTO */
41
#define TIFM_MMCSD_EOC        0x0001   /* end of command phase  */
43
#define TIFM_MMCSD_EOC        0x0001   /* end of command phase  */
44
#define TIFM_MMCSD_CD         0x0002   /* card detect           */
42
#define TIFM_MMCSD_CB         0x0004   /* card enter busy state */
45
#define TIFM_MMCSD_CB         0x0004   /* card enter busy state */
43
#define TIFM_MMCSD_BRS        0x0008   /* block received/sent   */
46
#define TIFM_MMCSD_BRS        0x0008   /* block received/sent   */
44
#define TIFM_MMCSD_EOFB       0x0010   /* card exit busy state  */
47
#define TIFM_MMCSD_EOFB       0x0010   /* card exit busy state  */
Lines 48-55 module_param(fixed_timeout, bool, 0644); Link Here
48
#define TIFM_MMCSD_CCRC       0x0100   /* command crc error     */
51
#define TIFM_MMCSD_CCRC       0x0100   /* command crc error     */
49
#define TIFM_MMCSD_AF         0x0400   /* fifo almost full      */
52
#define TIFM_MMCSD_AF         0x0400   /* fifo almost full      */
50
#define TIFM_MMCSD_AE         0x0800   /* fifo almost empty     */
53
#define TIFM_MMCSD_AE         0x0800   /* fifo almost empty     */
54
#define TIFM_MMCSD_OCRB       0x1000   /* OCR busy              */
55
#define TIFM_MMCSD_CIRQ       0x2000   /* card irq (cmd40/sdio) */
51
#define TIFM_MMCSD_CERR       0x4000   /* card status error     */
56
#define TIFM_MMCSD_CERR       0x4000   /* card status error     */
52
57
58
#define TIFM_MMCSD_ODTO       0x0040   /* open drain / extended timeout */
59
#define TIFM_MMCSD_CARD_RO    0x0200   /* card is read-only     */
60
53
#define TIFM_MMCSD_FIFO_SIZE  0x0020
61
#define TIFM_MMCSD_FIFO_SIZE  0x0020
54
62
55
#define TIFM_MMCSD_RSP_R0     0x0000
63
#define TIFM_MMCSD_RSP_R0     0x0000
Lines 67-163 module_param(fixed_timeout, bool, 0644); Link Here
67
#define TIFM_MMCSD_CMD_AC     0x2000
75
#define TIFM_MMCSD_CMD_AC     0x2000
68
#define TIFM_MMCSD_CMD_ADTC   0x3000
76
#define TIFM_MMCSD_CMD_ADTC   0x3000
69
77
70
typedef enum {
78
#define TIFM_MMCSD_MAX_BLOCK_SIZE  0x0800UL
71
	IDLE = 0,
72
	CMD,    /* main command ended                   */
73
	BRS,    /* block transfer finished              */
74
	SCMD,   /* stop command ended                   */
75
	CARD,   /* card left busy state                 */
76
	FIFO,   /* FIFO operation completed (uncertain) */
77
	READY
78
} card_state_t;
79
79
80
enum {
80
enum {
81
	FIFO_RDY   = 0x0001,     /* hardware dependent value */
81
	CMD_READY    = 0x0001,
82
	EJECT      = 0x0004,
82
	FIFO_READY   = 0x0002,
83
	EJECT_DONE = 0x0008,
83
	BRS_READY    = 0x0004,
84
	CARD_BUSY  = 0x0010,
84
	SCMD_ACTIVE  = 0x0008,
85
	OPENDRAIN  = 0x0040,     /* hardware dependent value */
85
	SCMD_READY   = 0x0010,
86
	CARD_EVENT = 0x0100,     /* hardware dependent value */
86
	CARD_BUSY    = 0x0020,
87
	CARD_RO    = 0x0200,     /* hardware dependent value */
87
	DATA_CARRY   = 0x0040
88
	FIFO_EVENT = 0x10000 };  /* hardware dependent value */
88
};
89
89
90
struct tifm_sd {
90
struct tifm_sd {
91
	struct tifm_dev     *dev;
91
	struct tifm_dev       *dev;
92
92
93
	unsigned int        flags;
93
	unsigned short        eject:1,
94
	card_state_t        state;
94
			      open_drain:1,
95
	unsigned int        clk_freq;
95
			      no_dma:1;
96
	unsigned int        clk_div;
96
	unsigned short        cmd_flags;
97
	unsigned long       timeout_jiffies;
97
98
	unsigned int          clk_freq;
99
	unsigned int          clk_div;
100
	unsigned long         timeout_jiffies;
98
101
99
	struct tasklet_struct finish_tasklet;
102
	struct tasklet_struct finish_tasklet;
100
	struct timer_list     timer;
103
	struct timer_list     timer;
101
	struct mmc_request    *req;
104
	struct mmc_request    *req;
102
	wait_queue_head_t     notify;
103
104
	size_t                written_blocks;
105
	size_t                buffer_size;
106
	size_t                buffer_pos;
107
105
106
	int                   sg_len;
107
	int                   sg_pos;
108
	unsigned int          block_pos;
109
	struct scatterlist    bounce_buf;
110
	unsigned char         bounce_buf_data[TIFM_MMCSD_MAX_BLOCK_SIZE];
108
};
111
};
109
112
110
static char* tifm_sd_data_buffer(struct mmc_data *data)
113
/* for some reason, host won't respond correctly to readw/writew */
114
static void tifm_sd_read_fifo(struct tifm_sd *host, struct page *pg,
115
			      unsigned int off, unsigned int cnt)
111
{
116
{
112
	return page_address(data->sg->page) + data->sg->offset;
117
	struct tifm_dev *sock = host->dev;
118
	unsigned char *buf;
119
	unsigned int pos = 0, val;
120
121
	buf = kmap_atomic(pg, KM_BIO_DST_IRQ) + off;
122
	if (host->cmd_flags & DATA_CARRY) {
123
		buf[pos++] = host->bounce_buf_data[0];
124
		host->cmd_flags &= ~DATA_CARRY;
125
	}
126
127
	while (pos < cnt) {
128
		val = readl(sock->addr + SOCK_MMCSD_DATA);
129
		buf[pos++] = val & 0xff;
130
		if (pos == cnt) {
131
			host->bounce_buf_data[0] = (val >> 8) & 0xff;
132
			host->cmd_flags |= DATA_CARRY;
133
			break;
134
		}
135
		buf[pos++] = (val >> 8) & 0xff;
136
	}
137
	kunmap_atomic(buf - off, KM_BIO_DST_IRQ);
113
}
138
}
114
139
115
static int tifm_sd_transfer_data(struct tifm_dev *sock, struct tifm_sd *host,
140
static void tifm_sd_write_fifo(struct tifm_sd *host, struct page *pg,
116
				 unsigned int host_status)
141
			       unsigned int off, unsigned int cnt)
117
{
142
{
118
	struct mmc_command *cmd = host->req->cmd;
143
	struct tifm_dev *sock = host->dev;
119
	unsigned int t_val = 0, cnt = 0;
144
	unsigned char *buf;
120
	char *buffer;
145
	unsigned int pos = 0, val;
121
146
122
	if (host_status & TIFM_MMCSD_BRS) {
147
	buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + off;
123
		/* in non-dma rx mode BRS fires when fifo is still not empty */
148
	if (host->cmd_flags & DATA_CARRY) {
124
		if (no_dma && (cmd->data->flags & MMC_DATA_READ)) {
149
		val = host->bounce_buf_data[0] | ((buf[pos++] << 8) & 0xff00);
125
			buffer = tifm_sd_data_buffer(host->req->data);
150
		writel(val, sock->addr + SOCK_MMCSD_DATA);
126
			while (host->buffer_size > host->buffer_pos) {
151
		host->cmd_flags &= ~DATA_CARRY;
127
				t_val = readl(sock->addr + SOCK_MMCSD_DATA);
152
	}
128
				buffer[host->buffer_pos++] = t_val & 0xff;
153
129
				buffer[host->buffer_pos++] =
154
	while (pos < cnt) {
130
							(t_val >> 8) & 0xff;
155
		val = buf[pos++];
131
			}
156
		if (pos == cnt) {
157
			host->bounce_buf_data[0] = val & 0xff;
158
			host->cmd_flags |= DATA_CARRY;
159
			break;
132
		}
160
		}
133
		return 1;
161
		val |= (buf[pos++] << 8) & 0xff00;
134
	} else if (no_dma) {
162
		writel(val, sock->addr + SOCK_MMCSD_DATA);
135
		buffer = tifm_sd_data_buffer(host->req->data);
163
	}
136
		if ((cmd->data->flags & MMC_DATA_READ) &&
164
	kunmap_atomic(buf - off, KM_BIO_SRC_IRQ);
137
				(host_status & TIFM_MMCSD_AF)) {
165
}
138
			for (cnt = 0; cnt < TIFM_MMCSD_FIFO_SIZE; cnt++) {
166
139
				t_val = readl(sock->addr + SOCK_MMCSD_DATA);
167
static void tifm_sd_transfer_data(struct tifm_sd *host)
140
				if (host->buffer_size > host->buffer_pos) {
168
{
141
					buffer[host->buffer_pos++] =
169
	struct mmc_data *r_data = host->req->cmd->data;
142
							t_val & 0xff;
170
	struct scatterlist *sg = r_data->sg;
143
					buffer[host->buffer_pos++] =
171
	unsigned int off, cnt, t_size = TIFM_MMCSD_FIFO_SIZE * 2;
144
							(t_val >> 8) & 0xff;
172
	unsigned int p_off, p_cnt;
145
				}
173
	struct page *pg;
146
			}
174
147
		} else if ((cmd->data->flags & MMC_DATA_WRITE)
175
	if (host->sg_pos == host->sg_len)
148
			   && (host_status & TIFM_MMCSD_AE)) {
176
		return;
149
			for (cnt = 0; cnt < TIFM_MMCSD_FIFO_SIZE; cnt++) {
177
	while (t_size) {
150
				if (host->buffer_size > host->buffer_pos) {
178
		cnt = sg[host->sg_pos].length - host->block_pos;
151
					t_val = buffer[host->buffer_pos++]
179
		if (!cnt) {
152
						& 0x00ff;
180
			host->block_pos = 0;
153
					t_val |= ((buffer[host->buffer_pos++])
181
			host->sg_pos++;
154
						  << 8) & 0xff00;
182
			if (host->sg_pos == host->sg_len) {
155
					writel(t_val,
183
				if ((r_data->flags & MMC_DATA_WRITE)
156
					       sock->addr + SOCK_MMCSD_DATA);
184
				    && DATA_CARRY)
157
				}
185
					writel(host->bounce_buf_data[0],
186
					       host->dev->addr
187
					       + SOCK_MMCSD_DATA);
188
189
				return;
158
			}
190
			}
191
			cnt = sg[host->sg_pos].length;
159
		}
192
		}
193
		off = sg[host->sg_pos].offset + host->block_pos;
194
195
		pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT);
196
		p_off = offset_in_page(off);
197
		p_cnt = PAGE_SIZE - p_off;
198
		p_cnt = min(p_cnt, cnt);
199
		p_cnt = min(p_cnt, t_size);
200
201
		if (r_data->flags & MMC_DATA_READ)
202
			tifm_sd_read_fifo(host, pg, p_off, p_cnt);
203
		else if (r_data->flags & MMC_DATA_WRITE)
204
			tifm_sd_write_fifo(host, pg, p_off, p_cnt);
205
206
		t_size -= p_cnt;
207
		host->block_pos += p_cnt;
160
	}
208
	}
209
}
210
211
static void tifm_sd_copy_page(struct page *dst, unsigned int dst_off,
212
			      struct page *src, unsigned int src_off,
213
			      unsigned int count)
214
{
215
	unsigned char *src_buf = kmap_atomic(src, KM_BIO_SRC_IRQ) + src_off;
216
	unsigned char *dst_buf = kmap_atomic(dst, KM_BIO_DST_IRQ) + dst_off;
217
218
	memcpy(dst_buf, src_buf, count);
219
220
	kunmap_atomic(dst_buf - dst_off, KM_BIO_DST_IRQ);
221
	kunmap_atomic(src_buf - src_off, KM_BIO_SRC_IRQ);
222
}
223
224
static void tifm_sd_bounce_block(struct tifm_sd *host, struct mmc_data *r_data)
225
{
226
	struct scatterlist *sg = r_data->sg;
227
	unsigned int t_size = r_data->blksz;
228
	unsigned int off, cnt;
229
	unsigned int p_off, p_cnt;
230
	struct page *pg;
231
232
	dev_dbg(&host->dev->dev, "bouncing block\n");
233
	while (t_size) {
234
		cnt = sg[host->sg_pos].length - host->block_pos;
235
		if (!cnt) {
236
			host->block_pos = 0;
237
			host->sg_pos++;
238
			if (host->sg_pos == host->sg_len)
239
				return;
240
			cnt = sg[host->sg_pos].length;
241
		}
242
		off = sg[host->sg_pos].offset + host->block_pos;
243
244
		pg = nth_page(sg[host->sg_pos].page, off >> PAGE_SHIFT);
245
		p_off = offset_in_page(off);
246
		p_cnt = PAGE_SIZE - p_off;
247
		p_cnt = min(p_cnt, cnt);
248
		p_cnt = min(p_cnt, t_size);
249
250
		if (r_data->flags & MMC_DATA_WRITE)
251
			tifm_sd_copy_page(host->bounce_buf.page,
252
					  r_data->blksz - t_size,
253
					  pg, p_off, p_cnt);
254
		else if (r_data->flags & MMC_DATA_READ)
255
			tifm_sd_copy_page(pg, p_off, host->bounce_buf.page,
256
					  r_data->blksz - t_size, p_cnt);
257
258
		t_size -= p_cnt;
259
		host->block_pos += p_cnt;
260
	}
261
}
262
263
int tifm_sd_set_dma_data(struct tifm_sd *host, struct mmc_data *r_data)
264
{
265
	struct tifm_dev *sock = host->dev;
266
	unsigned int t_size = TIFM_DMA_TSIZE * r_data->blksz;
267
	unsigned int dma_len, dma_blk_cnt, dma_off;
268
	struct scatterlist *sg = NULL;
269
	unsigned long flags;
270
271
	if (host->sg_pos == host->sg_len)
272
		return 1;
273
274
	if (host->cmd_flags & DATA_CARRY) {
275
		host->cmd_flags &= ~DATA_CARRY;
276
		local_irq_save(flags);
277
		tifm_sd_bounce_block(host, r_data);
278
		local_irq_restore(flags);
279
		if (host->sg_pos == host->sg_len)
280
			return 1;
281
	}
282
283
	dma_len = sg_dma_len(&r_data->sg[host->sg_pos]) - host->block_pos;
284
	if (!dma_len) {
285
		host->block_pos = 0;
286
		host->sg_pos++;
287
		if (host->sg_pos == host->sg_len)
288
			return 1;
289
		dma_len = sg_dma_len(&r_data->sg[host->sg_pos]);
290
	}
291
292
	if (dma_len < t_size) {
293
		dma_blk_cnt = dma_len / r_data->blksz;
294
		dma_off = host->block_pos;
295
		host->block_pos += dma_blk_cnt * r_data->blksz;
296
	} else {
297
		dma_blk_cnt = TIFM_DMA_TSIZE;
298
		dma_off = host->block_pos;
299
		host->block_pos += t_size;
300
	}
301
302
	if (dma_blk_cnt)
303
		sg = &r_data->sg[host->sg_pos];
304
	else if (dma_len) {
305
		if (r_data->flags & MMC_DATA_WRITE) {
306
			local_irq_save(flags);
307
			tifm_sd_bounce_block(host, r_data);
308
			local_irq_restore(flags);
309
		} else
310
			host->cmd_flags |= DATA_CARRY;
311
312
		sg = &host->bounce_buf;
313
		dma_off = 0;
314
		dma_blk_cnt = 1;
315
	} else
316
		return 1;
317
318
	dev_dbg(&sock->dev, "setting dma for %d blocks\n", dma_blk_cnt);
319
	writel(sg_dma_address(sg) + dma_off, sock->addr + SOCK_DMA_ADDRESS);
320
	if (r_data->flags & MMC_DATA_WRITE)
321
		writel((dma_blk_cnt << 8) | TIFM_DMA_TX | TIFM_DMA_EN,
322
		       sock->addr + SOCK_DMA_CONTROL);
323
	else
324
		writel((dma_blk_cnt << 8) | TIFM_DMA_EN,
325
		       sock->addr + SOCK_DMA_CONTROL);
326
161
	return 0;
327
	return 0;
162
}
328
}
163
329
Lines 206-213 static unsigned int tifm_sd_op_flags(struct mmc_command *cmd) Link Here
206
static void tifm_sd_exec(struct tifm_sd *host, struct mmc_command *cmd)
372
static void tifm_sd_exec(struct tifm_sd *host, struct mmc_command *cmd)
207
{
373
{
208
	struct tifm_dev *sock = host->dev;
374
	struct tifm_dev *sock = host->dev;
209
	unsigned int cmd_mask = tifm_sd_op_flags(cmd) |
375
	unsigned int cmd_mask = tifm_sd_op_flags(cmd);
210
				(host->flags & OPENDRAIN);
376
377
	if (host->open_drain)
378
		cmd_mask |= TIFM_MMCSD_ODTO;
211
379
212
	if (cmd->data && (cmd->data->flags & MMC_DATA_READ))
380
	if (cmd->data && (cmd->data->flags & MMC_DATA_READ))
213
		cmd_mask |= TIFM_MMCSD_READ;
381
		cmd_mask |= TIFM_MMCSD_READ;
Lines 232-422 static void tifm_sd_fetch_resp(struct mmc_command *cmd, struct tifm_dev *sock) Link Here
232
		       | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x00);
400
		       | readl(sock->addr + SOCK_MMCSD_RESPONSE + 0x00);
233
}
401
}
234
402
235
static void tifm_sd_process_cmd(struct tifm_dev *sock, struct tifm_sd *host,
403
static void tifm_sd_check_status(struct tifm_sd *host)
236
				       unsigned int host_status)
237
{
404
{
405
	struct tifm_dev *sock = host->dev;
238
	struct mmc_command *cmd = host->req->cmd;
406
	struct mmc_command *cmd = host->req->cmd;
239
407
240
change_state:
408
	if (cmd->error != MMC_ERR_NONE)
241
	switch (host->state) {
409
		goto finish_request;
242
	case IDLE:
410
411
	if (!(host->cmd_flags & CMD_READY))
243
		return;
412
		return;
244
	case CMD:
413
245
		if (host_status & (TIFM_MMCSD_EOC | TIFM_MMCSD_CERR)) {
414
	if (cmd->data) {
246
			tifm_sd_fetch_resp(cmd, sock);
415
		if (cmd->data->error != MMC_ERR_NONE) {
247
			if (cmd->data) {
416
			if ((host->cmd_flags & SCMD_ACTIVE)
248
				host->state = BRS;
417
			    && !(host->cmd_flags & SCMD_READY))
249
			} else {
418
				return;
250
				host->state = READY;
419
251
			}
420
			goto finish_request;
252
			goto change_state;
253
		}
254
		break;
255
	case BRS:
256
		if (tifm_sd_transfer_data(sock, host, host_status)) {
257
			if (cmd->data->flags & MMC_DATA_WRITE) {
258
				host->state = CARD;
259
			} else {
260
				if (no_dma) {
261
					if (host->req->stop) {
262
						tifm_sd_exec(host, host->req->stop);
263
						host->state = SCMD;
264
					} else {
265
						host->state = READY;
266
					}
267
				} else {
268
					host->state = FIFO;
269
				}
270
			}
271
			goto change_state;
272
		}
273
		break;
274
	case SCMD:
275
		if (host_status & TIFM_MMCSD_EOC) {
276
			tifm_sd_fetch_resp(host->req->stop, sock);
277
			host->state = READY;
278
			goto change_state;
279
		}
421
		}
280
		break;
422
281
	case CARD:
423
		if (!(host->cmd_flags & BRS_READY))
282
		dev_dbg(&sock->dev, "waiting for CARD, have %zd blocks\n",
424
			return;
283
			host->written_blocks);
425
284
		if (!(host->flags & CARD_BUSY)
426
		if (!(host->no_dma || (host->cmd_flags & FIFO_READY)))
285
		    && (host->written_blocks == cmd->data->blocks)) {
427
			return;
286
			if (no_dma) {
428
287
				if (host->req->stop) {
429
		if (cmd->data->flags & MMC_DATA_WRITE) {
430
			if (host->req->stop) {
431
				if (!(host->cmd_flags & SCMD_ACTIVE)) {
432
					host->cmd_flags |= SCMD_ACTIVE;
433
					writel(TIFM_MMCSD_EOFB
434
					       | readl(sock->addr
435
						       + SOCK_MMCSD_INT_ENABLE),
436
					       sock->addr
437
					       + SOCK_MMCSD_INT_ENABLE);
288
					tifm_sd_exec(host, host->req->stop);
438
					tifm_sd_exec(host, host->req->stop);
289
					host->state = SCMD;
439
					return;
290
				} else {
440
				} else {
291
					host->state = READY;
441
					if (!(host->cmd_flags & SCMD_READY)
442
					    || (host->cmd_flags & CARD_BUSY))
443
						return;
444
					writel((~TIFM_MMCSD_EOFB)
445
					       & readl(sock->addr
446
						       + SOCK_MMCSD_INT_ENABLE),
447
					       sock->addr
448
					       + SOCK_MMCSD_INT_ENABLE);
292
				}
449
				}
293
			} else {
450
			} else {
294
				host->state = FIFO;
451
				if (host->cmd_flags & CARD_BUSY)
452
					return;
453
				writel((~TIFM_MMCSD_EOFB)
454
				       & readl(sock->addr
455
					       + SOCK_MMCSD_INT_ENABLE),
456
				       sock->addr + SOCK_MMCSD_INT_ENABLE);
295
			}
457
			}
296
			goto change_state;
458
		} else {
297
		}
298
		break;
299
	case FIFO:
300
		if (host->flags & FIFO_RDY) {
301
			host->flags &= ~FIFO_RDY;
302
			if (host->req->stop) {
459
			if (host->req->stop) {
303
				tifm_sd_exec(host, host->req->stop);
460
				if (!(host->cmd_flags & SCMD_ACTIVE)) {
304
				host->state = SCMD;
461
					host->cmd_flags |= SCMD_ACTIVE;
305
			} else {
462
					tifm_sd_exec(host, host->req->stop);
306
				host->state = READY;
463
					return;
464
				} else {
465
					if (!(host->cmd_flags & SCMD_READY))
466
						return;
467
				}
307
			}
468
			}
308
			goto change_state;
309
		}
469
		}
310
		break;
311
	case READY:
312
		tasklet_schedule(&host->finish_tasklet);
313
		return;
314
	}
470
	}
315
471
finish_request:
472
	tasklet_schedule(&host->finish_tasklet);
316
}
473
}
317
474
318
/* Called from interrupt handler */
475
/* Called from interrupt handler */
319
static void tifm_sd_signal_irq(struct tifm_dev *sock,
476
static void tifm_sd_data_event(struct tifm_dev *sock)
320
			       unsigned int sock_irq_status)
321
{
477
{
322
	struct tifm_sd *host;
478
	struct tifm_sd *host;
323
	unsigned int host_status = 0, fifo_status = 0;
479
	unsigned int fifo_status = 0;
324
	int error_code = 0;
480
	struct mmc_data *r_data = NULL;
325
481
326
	spin_lock(&sock->lock);
482
	spin_lock(&sock->lock);
327
	host = mmc_priv((struct mmc_host*)tifm_get_drvdata(sock));
483
	host = mmc_priv((struct mmc_host*)tifm_get_drvdata(sock));
484
	fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS);
485
	dev_dbg(&sock->dev, "data event: fifo_status %x, flags %x\n",
486
		fifo_status, host->cmd_flags);
328
487
329
	if (sock_irq_status & FIFO_EVENT) {
488
	if (host->req) {
330
		fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS);
489
		r_data = host->req->cmd->data;
331
		writel(fifo_status, sock->addr + SOCK_DMA_FIFO_STATUS);
332
490
333
		host->flags |= fifo_status & FIFO_RDY;
491
		if (r_data && (fifo_status & TIFM_FIFO_READY)) {
492
			if (tifm_sd_set_dma_data(host, r_data)) {
493
				host->cmd_flags |= FIFO_READY;
494
				tifm_sd_check_status(host);
495
			}
496
		}
334
	}
497
	}
335
498
336
	if (sock_irq_status & CARD_EVENT) {
499
	writel(fifo_status, sock->addr + SOCK_DMA_FIFO_STATUS);
337
		host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
500
	spin_unlock(&sock->lock);
338
		writel(host_status, sock->addr + SOCK_MMCSD_STATUS);
501
}
339
502
340
		if (!host->req)
503
/* Called from interrupt handler */
341
			goto done;
504
static void tifm_sd_card_event(struct tifm_dev *sock)
505
{
506
	struct tifm_sd *host;
507
	unsigned int host_status = 0;
508
	int cmd_error = MMC_ERR_NONE;
509
	struct mmc_command *cmd = NULL;
510
	unsigned long flags;
511
512
	spin_lock(&sock->lock);
513
	host = mmc_priv((struct mmc_host*)tifm_get_drvdata(sock));
514
	host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
515
	dev_dbg(&sock->dev, "host event: host_status %x, flags %x\n",
516
		host_status, host->cmd_flags);
517
518
	if (host->req) {
519
		cmd = host->req->cmd;
342
520
343
		if (host_status & TIFM_MMCSD_ERRMASK) {
521
		if (host_status & TIFM_MMCSD_ERRMASK) {
344
			if (host_status & (TIFM_MMCSD_CTO | TIFM_MMCSD_DTO))
522
			writel(host_status & TIFM_MMCSD_ERRMASK,
345
				error_code = MMC_ERR_TIMEOUT;
523
			       sock->addr + SOCK_MMCSD_STATUS);
346
			else if (host_status
524
			if (host_status & TIFM_MMCSD_CTO)
347
				 & (TIFM_MMCSD_CCRC | TIFM_MMCSD_DCRC))
525
				cmd_error = MMC_ERR_TIMEOUT;
348
				error_code = MMC_ERR_BADCRC;
526
			else if (host_status & TIFM_MMCSD_CCRC)
527
				cmd_error = MMC_ERR_BADCRC;
528
529
			if (cmd->data) {
530
				if (host_status & TIFM_MMCSD_DTO)
531
					cmd->data->error = MMC_ERR_TIMEOUT;
532
				else if (host_status & TIFM_MMCSD_DCRC)
533
					cmd->data->error = MMC_ERR_BADCRC;
534
			}
349
535
350
			writel(TIFM_FIFO_INT_SETALL,
536
			writel(TIFM_FIFO_INT_SETALL,
351
			       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
537
			       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
352
			writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL);
538
			writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL);
353
539
354
			if (host->req->stop) {
540
			if (host->req->stop) {
355
				if (host->state == SCMD) {
541
				if (host->cmd_flags & SCMD_ACTIVE) {
356
					host->req->stop->error = error_code;
542
					host->req->stop->error = cmd_error;
357
				} else if (host->state == BRS
543
					host->cmd_flags |= SCMD_READY;
358
					   || host->state == CARD
359
					   || host->state == FIFO) {
360
					host->req->cmd->error = error_code;
361
					tifm_sd_exec(host, host->req->stop);
362
					host->state = SCMD;
363
					goto done;
364
				} else {
544
				} else {
365
					host->req->cmd->error = error_code;
545
					cmd->error = cmd_error;
546
					//host->cmd_flags |= SCMD_ACTIVE;
547
					//tifm_sd_exec(host, host->req->stop);
548
					tifm_sd_check_status(host);
549
					goto done;
550
				}
551
			} else
552
				cmd->error = cmd_error;
553
		} else {
554
			if (host_status & (TIFM_MMCSD_EOC | TIFM_MMCSD_CERR)) {
555
				if (!(host->cmd_flags & CMD_READY)) {
556
					host->cmd_flags |= CMD_READY;
557
					tifm_sd_fetch_resp(cmd, sock);
558
				} else if (host->cmd_flags & SCMD_ACTIVE) {
559
					host->cmd_flags |= SCMD_READY;
560
					tifm_sd_fetch_resp(host->req->stop,
561
							   sock);
366
				}
562
				}
367
			} else {
368
				host->req->cmd->error = error_code;
369
			}
563
			}
370
			host->state = READY;
564
			if (host_status & TIFM_MMCSD_BRS)
565
				host->cmd_flags |= BRS_READY;
371
		}
566
		}
372
567
373
		if (host_status & TIFM_MMCSD_CB)
568
		if (host->no_dma && cmd->data) {
374
			host->flags |= CARD_BUSY;
569
			if (host_status & TIFM_MMCSD_AE)
375
		if ((host_status & TIFM_MMCSD_EOFB)
570
				writel(host_status & TIFM_MMCSD_AE,
376
		    && (host->flags & CARD_BUSY)) {
571
				       sock->addr + SOCK_MMCSD_STATUS);
377
			host->written_blocks++;
572
378
			host->flags &= ~CARD_BUSY;
573
			if (host_status & (TIFM_MMCSD_AE | TIFM_MMCSD_AF
574
					   | TIFM_MMCSD_BRS)) {
575
				local_irq_save(flags);
576
				tifm_sd_transfer_data(host);
577
				local_irq_restore(flags);
578
				host_status &= ~TIFM_MMCSD_AE;
579
			}
379
		}
580
		}
380
        }
381
382
	if (host->req)
383
		tifm_sd_process_cmd(sock, host, host_status);
384
done:
385
	dev_dbg(&sock->dev, "host_status %x, fifo_status %x\n",
386
		host_status, fifo_status);
387
	spin_unlock(&sock->lock);
388
}
389
390
static void tifm_sd_prepare_data(struct tifm_sd *host, struct mmc_command *cmd)
391
{
392
	struct tifm_dev *sock = host->dev;
393
	unsigned int dest_cnt;
394
395
	/* DMA style IO */
396
	dev_dbg(&sock->dev, "setting dma for %d blocks\n",
397
		cmd->data->blocks);
398
	writel(TIFM_FIFO_INT_SETALL,
399
	       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
400
	writel(ilog2(cmd->data->blksz) - 2,
401
	       sock->addr + SOCK_FIFO_PAGE_SIZE);
402
	writel(TIFM_FIFO_ENABLE, sock->addr + SOCK_FIFO_CONTROL);
403
	writel(TIFM_FIFO_INTMASK, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET);
404
405
	dest_cnt = (cmd->data->blocks) << 8;
406
407
	writel(sg_dma_address(cmd->data->sg), sock->addr + SOCK_DMA_ADDRESS);
408
581
409
	writel(cmd->data->blocks - 1, sock->addr + SOCK_MMCSD_NUM_BLOCKS);
582
		if (host_status & TIFM_MMCSD_EOFB)
410
	writel(cmd->data->blksz - 1, sock->addr + SOCK_MMCSD_BLOCK_LEN);
583
			host->cmd_flags &= ~CARD_BUSY;
584
		else if (host_status & TIFM_MMCSD_CB)
585
			host->cmd_flags |= CARD_BUSY;
411
586
412
	if (cmd->data->flags & MMC_DATA_WRITE) {
587
		tifm_sd_check_status(host);
413
		writel(TIFM_MMCSD_TXDE, sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
414
		writel(dest_cnt | TIFM_DMA_TX | TIFM_DMA_EN,
415
		       sock->addr + SOCK_DMA_CONTROL);
416
	} else {
417
		writel(TIFM_MMCSD_RXDE, sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
418
		writel(dest_cnt | TIFM_DMA_EN, sock->addr + SOCK_DMA_CONTROL);
419
	}
588
	}
589
done:
590
	writel(host_status, sock->addr + SOCK_MMCSD_STATUS);
591
	spin_unlock(&sock->lock);
420
}
592
}
421
593
422
static void tifm_sd_set_data_timeout(struct tifm_sd *host,
594
static void tifm_sd_set_data_timeout(struct tifm_sd *host,
Lines 452-597 static void tifm_sd_request(struct mmc_host *mmc, struct mmc_request *mrq) Link Here
452
	struct tifm_sd *host = mmc_priv(mmc);
624
	struct tifm_sd *host = mmc_priv(mmc);
453
	struct tifm_dev *sock = host->dev;
625
	struct tifm_dev *sock = host->dev;
454
	unsigned long flags;
626
	unsigned long flags;
455
	int sg_count = 0;
456
	struct mmc_data *r_data = mrq->cmd->data;
627
	struct mmc_data *r_data = mrq->cmd->data;
457
628
458
	spin_lock_irqsave(&sock->lock, flags);
629
	spin_lock_irqsave(&sock->lock, flags);
459
	if (host->flags & EJECT) {
630
	if (host->eject) {
460
		spin_unlock_irqrestore(&sock->lock, flags);
631
		spin_unlock_irqrestore(&sock->lock, flags);
461
		goto err_out;
632
		goto err_out;
462
	}
633
	}
463
634
464
	if (host->req) {
635
	if (host->req) {
465
		printk(KERN_ERR DRIVER_NAME ": unfinished request detected\n");
636
		printk(KERN_ERR "%s : unfinished request detected\n",
637
		       sock->dev.bus_id);
466
		spin_unlock_irqrestore(&sock->lock, flags);
638
		spin_unlock_irqrestore(&sock->lock, flags);
467
		goto err_out;
639
		goto err_out;
468
	}
640
	}
469
641
642
	host->cmd_flags = 0;
643
	host->block_pos = 0;
644
	host->sg_pos = 0;
645
470
	if (r_data) {
646
	if (r_data) {
471
		tifm_sd_set_data_timeout(host, r_data);
647
		tifm_sd_set_data_timeout(host, r_data);
472
648
473
		sg_count = tifm_map_sg(sock, r_data->sg, r_data->sg_len,
649
		if ((r_data->flags & MMC_DATA_WRITE) && !mrq->stop)
474
				       mrq->cmd->flags & MMC_DATA_WRITE
650
			 writel(TIFM_MMCSD_EOFB
475
				       ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
651
				| readl(sock->addr + SOCK_MMCSD_INT_ENABLE),
476
		if (sg_count != 1) {
652
				sock->addr + SOCK_MMCSD_INT_ENABLE);
477
			printk(KERN_ERR DRIVER_NAME
478
				": scatterlist map failed\n");
479
			spin_unlock_irqrestore(&sock->lock, flags);
480
			goto err_out;
481
		}
482
483
		host->written_blocks = 0;
484
		host->flags &= ~CARD_BUSY;
485
		tifm_sd_prepare_data(host, mrq->cmd);
486
	}
487
488
	host->req = mrq;
489
	mod_timer(&host->timer, jiffies + host->timeout_jiffies);
490
	host->state = CMD;
491
	writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL),
492
	       sock->addr + SOCK_CONTROL);
493
	tifm_sd_exec(host, mrq->cmd);
494
	spin_unlock_irqrestore(&sock->lock, flags);
495
	return;
496
497
err_out:
498
	if (sg_count > 0)
499
		tifm_unmap_sg(sock, r_data->sg, r_data->sg_len,
500
			      (r_data->flags & MMC_DATA_WRITE)
501
			      ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
502
503
	mrq->cmd->error = MMC_ERR_TIMEOUT;
504
	mmc_request_done(mmc, mrq);
505
}
506
507
static void tifm_sd_end_cmd(unsigned long data)
508
{
509
	struct tifm_sd *host = (struct tifm_sd*)data;
510
	struct tifm_dev *sock = host->dev;
511
	struct mmc_host *mmc = tifm_get_drvdata(sock);
512
	struct mmc_request *mrq;
513
	struct mmc_data *r_data = NULL;
514
	unsigned long flags;
515
516
	spin_lock_irqsave(&sock->lock, flags);
517
518
	del_timer(&host->timer);
519
	mrq = host->req;
520
	host->req = NULL;
521
	host->state = IDLE;
522
653
523
	if (!mrq) {
654
		if (host->no_dma) {
524
		printk(KERN_ERR DRIVER_NAME ": no request to complete?\n");
655
			writel(TIFM_MMCSD_BUFINT
525
		spin_unlock_irqrestore(&sock->lock, flags);
656
			       | readl(sock->addr + SOCK_MMCSD_INT_ENABLE),
526
		return;
657
			       sock->addr + SOCK_MMCSD_INT_ENABLE);
527
	}
658
			writel(((TIFM_MMCSD_FIFO_SIZE - 1) << 8)
659
			       | (TIFM_MMCSD_FIFO_SIZE - 1),
660
			       sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
528
661
529
	r_data = mrq->cmd->data;
662
			host->sg_len = r_data->sg_len;
530
	if (r_data) {
531
		if (r_data->flags & MMC_DATA_WRITE) {
532
			r_data->bytes_xfered = host->written_blocks
533
					       * r_data->blksz;
534
		} else {
663
		} else {
535
			r_data->bytes_xfered = r_data->blocks -
664
			sg_init_one(&host->bounce_buf, host->bounce_buf_data,
536
				readl(sock->addr + SOCK_MMCSD_NUM_BLOCKS) - 1;
665
				    r_data->blksz);
537
			r_data->bytes_xfered *= r_data->blksz;
666
538
			r_data->bytes_xfered += r_data->blksz -
667
			if(1 != tifm_map_sg(sock, &host->bounce_buf, 1,
539
				readl(sock->addr + SOCK_MMCSD_BLOCK_LEN) + 1;
668
					    r_data->flags & MMC_DATA_WRITE
540
		}
669
					    ? PCI_DMA_TODEVICE
541
		tifm_unmap_sg(sock, r_data->sg, r_data->sg_len,
670
					    : PCI_DMA_FROMDEVICE)) {
542
			      (r_data->flags & MMC_DATA_WRITE)
671
				printk(KERN_ERR "%s : scatterlist map failed\n",
543
			      ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
672
				       sock->dev.bus_id);
544
	}
673
				spin_unlock_irqrestore(&sock->lock, flags);
545
674
				goto err_out;
546
	writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL),
675
			}
547
	       sock->addr + SOCK_CONTROL);
676
			host->sg_len = tifm_map_sg(sock, r_data->sg,
548
677
						   r_data->sg_len,
549
	spin_unlock_irqrestore(&sock->lock, flags);
678
						   r_data->flags
550
	mmc_request_done(mmc, mrq);
679
						   & MMC_DATA_WRITE
551
}
680
						   ? PCI_DMA_TODEVICE
552
681
						   : PCI_DMA_FROMDEVICE);
553
static void tifm_sd_request_nodma(struct mmc_host *mmc, struct mmc_request *mrq)
682
			if (host->sg_len < 1) {
554
{
683
				printk(KERN_ERR "%s : scatterlist map failed\n",
555
	struct tifm_sd *host = mmc_priv(mmc);
684
				       sock->dev.bus_id);
556
	struct tifm_dev *sock = host->dev;
685
				tifm_unmap_sg(sock, &host->bounce_buf, 1,
557
	unsigned long flags;
686
					      r_data->flags & MMC_DATA_WRITE
558
	struct mmc_data *r_data = mrq->cmd->data;
687
					      ? PCI_DMA_TODEVICE
559
688
					      : PCI_DMA_FROMDEVICE);
560
	spin_lock_irqsave(&sock->lock, flags);
689
				spin_unlock_irqrestore(&sock->lock, flags);
561
	if (host->flags & EJECT) {
690
				goto err_out;
562
		spin_unlock_irqrestore(&sock->lock, flags);
691
			}
563
		goto err_out;
564
	}
565
566
	if (host->req) {
567
		printk(KERN_ERR DRIVER_NAME ": unfinished request detected\n");
568
		spin_unlock_irqrestore(&sock->lock, flags);
569
		goto err_out;
570
	}
571
692
572
	if (r_data) {
693
			writel(TIFM_FIFO_INT_SETALL,
573
		tifm_sd_set_data_timeout(host, r_data);
694
			       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
695
			writel(ilog2(r_data->blksz) - 2,
696
			       sock->addr + SOCK_FIFO_PAGE_SIZE);
697
			writel(TIFM_FIFO_ENABLE,
698
			       sock->addr + SOCK_FIFO_CONTROL);
699
			writel(TIFM_FIFO_INTMASK,
700
			       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET);
701
702
			if (r_data->flags & MMC_DATA_WRITE)
703
				writel(TIFM_MMCSD_TXDE,
704
				       sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
705
			else
706
				writel(TIFM_MMCSD_RXDE,
707
				       sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
708
709
			tifm_sd_set_dma_data(host, r_data);
710
		}
574
711
575
		host->buffer_size = mrq->cmd->data->blocks
712
		writel(r_data->blocks - 1,
576
				    * mrq->cmd->data->blksz;
713
		       sock->addr + SOCK_MMCSD_NUM_BLOCKS);
577
714
		writel(r_data->blksz - 1,
578
		writel(TIFM_MMCSD_BUFINT
715
		       sock->addr + SOCK_MMCSD_BLOCK_LEN);
579
		       | readl(sock->addr + SOCK_MMCSD_INT_ENABLE),
580
		       sock->addr + SOCK_MMCSD_INT_ENABLE);
581
		writel(((TIFM_MMCSD_FIFO_SIZE - 1) << 8)
582
		       | (TIFM_MMCSD_FIFO_SIZE - 1),
583
		       sock->addr + SOCK_MMCSD_BUFFER_CONFIG);
584
585
		host->written_blocks = 0;
586
		host->flags &= ~CARD_BUSY;
587
		host->buffer_pos = 0;
588
		writel(r_data->blocks - 1, sock->addr + SOCK_MMCSD_NUM_BLOCKS);
589
		writel(r_data->blksz - 1, sock->addr + SOCK_MMCSD_BLOCK_LEN);
590
	}
716
	}
591
717
592
	host->req = mrq;
718
	host->req = mrq;
593
	mod_timer(&host->timer, jiffies + host->timeout_jiffies);
719
	mod_timer(&host->timer, jiffies + host->timeout_jiffies);
594
	host->state = CMD;
595
	writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL),
720
	writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL),
596
	       sock->addr + SOCK_CONTROL);
721
	       sock->addr + SOCK_CONTROL);
597
	tifm_sd_exec(host, mrq->cmd);
722
	tifm_sd_exec(host, mrq->cmd);
Lines 603-609 err_out: Link Here
603
	mmc_request_done(mmc, mrq);
728
	mmc_request_done(mmc, mrq);
604
}
729
}
605
730
606
static void tifm_sd_end_cmd_nodma(unsigned long data)
731
static void tifm_sd_end_cmd(unsigned long data)
607
{
732
{
608
	struct tifm_sd *host = (struct tifm_sd*)data;
733
	struct tifm_sd *host = (struct tifm_sd*)data;
609
	struct tifm_dev *sock = host->dev;
734
	struct tifm_dev *sock = host->dev;
Lines 617-684 static void tifm_sd_end_cmd_nodma(unsigned long data) Link Here
617
	del_timer(&host->timer);
742
	del_timer(&host->timer);
618
	mrq = host->req;
743
	mrq = host->req;
619
	host->req = NULL;
744
	host->req = NULL;
620
	host->state = IDLE;
621
745
622
	if (!mrq) {
746
	if (!mrq) {
623
		printk(KERN_ERR DRIVER_NAME ": no request to complete?\n");
747
		printk(KERN_ERR " %s : no request to complete?\n",
748
		       sock->dev.bus_id);
624
		spin_unlock_irqrestore(&sock->lock, flags);
749
		spin_unlock_irqrestore(&sock->lock, flags);
625
		return;
750
		return;
626
	}
751
	}
627
752
628
	r_data = mrq->cmd->data;
753
	r_data = mrq->cmd->data;
629
	if (r_data) {
754
	if (r_data) {
630
		writel((~TIFM_MMCSD_BUFINT) &
755
		if (host->no_dma) {
631
			readl(sock->addr + SOCK_MMCSD_INT_ENABLE),
756
			writel((~TIFM_MMCSD_BUFINT)
632
			sock->addr + SOCK_MMCSD_INT_ENABLE);
757
			       & readl(sock->addr + SOCK_MMCSD_INT_ENABLE),
633
758
			       sock->addr + SOCK_MMCSD_INT_ENABLE);
634
		if (r_data->flags & MMC_DATA_WRITE) {
635
			r_data->bytes_xfered = host->written_blocks
636
					       * r_data->blksz;
637
		} else {
759
		} else {
638
			r_data->bytes_xfered = r_data->blocks -
760
			tifm_unmap_sg(sock, &host->bounce_buf, 1,
639
				readl(sock->addr + SOCK_MMCSD_NUM_BLOCKS) - 1;
761
				      (r_data->flags & MMC_DATA_WRITE)
640
			r_data->bytes_xfered *= r_data->blksz;
762
				      ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
641
			r_data->bytes_xfered += r_data->blksz -
763
			tifm_unmap_sg(sock, r_data->sg, r_data->sg_len,
642
				readl(sock->addr + SOCK_MMCSD_BLOCK_LEN) + 1;
764
				      (r_data->flags & MMC_DATA_WRITE)
765
				      ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
643
		}
766
		}
644
		host->buffer_pos = 0;
767
645
		host->buffer_size = 0;
768
		r_data->bytes_xfered = r_data->blocks
769
			- readl(sock->addr + SOCK_MMCSD_NUM_BLOCKS) - 1;
770
		r_data->bytes_xfered *= r_data->blksz;
771
		r_data->bytes_xfered += r_data->blksz
772
			- readl(sock->addr + SOCK_MMCSD_BLOCK_LEN) + 1;
646
	}
773
	}
647
774
648
	writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL),
775
	writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL),
649
	       sock->addr + SOCK_CONTROL);
776
	       sock->addr + SOCK_CONTROL);
650
777
651
	spin_unlock_irqrestore(&sock->lock, flags);
778
	spin_unlock_irqrestore(&sock->lock, flags);
652
653
	mmc_request_done(mmc, mrq);
779
	mmc_request_done(mmc, mrq);
654
}
780
}
655
781
656
static void tifm_sd_terminate(struct tifm_sd *host)
657
{
658
	struct tifm_dev *sock = host->dev;
659
	unsigned long flags;
660
661
	writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE);
662
	mmiowb();
663
	spin_lock_irqsave(&sock->lock, flags);
664
	host->flags |= EJECT;
665
	if (host->req) {
666
		writel(TIFM_FIFO_INT_SETALL,
667
		       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
668
		writel(0, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET);
669
		tasklet_schedule(&host->finish_tasklet);
670
	}
671
	spin_unlock_irqrestore(&sock->lock, flags);
672
}
673
674
static void tifm_sd_abort(unsigned long data)
782
static void tifm_sd_abort(unsigned long data)
675
{
783
{
676
	struct tifm_sd *host = (struct tifm_sd*)data;
784
	struct tifm_sd *host = (struct tifm_sd*)data;
677
785
678
	printk(KERN_ERR DRIVER_NAME
786
	printk(KERN_ERR
679
	       ": card failed to respond for a long period of time");
787
	       "%s : card failed to respond for a long period of time "
788
	       "(%x, %x)\n",
789
	       host->dev->dev.bus_id, host->req->cmd->opcode, host->cmd_flags);
680
790
681
	tifm_sd_terminate(host);
682
	tifm_eject(host->dev);
791
	tifm_eject(host->dev);
683
}
792
}
684
793
Lines 691-698 static void tifm_sd_ios(struct mmc_host *mmc, struct mmc_ios *ios) Link Here
691
800
692
	spin_lock_irqsave(&sock->lock, flags);
801
	spin_lock_irqsave(&sock->lock, flags);
693
802
694
	dev_dbg(&sock->dev, "Setting bus width %d, power %d\n", ios->bus_width,
803
	dev_dbg(&sock->dev, "ios: clock = %u, vdd = %x, bus_mode = %x, "
695
		ios->power_mode);
804
		"chip_select = %x, power_mode = %x, bus_width = %x\n",
805
		ios->clock, ios->vdd, ios->bus_mode, ios->chip_select,
806
		ios->power_mode, ios->bus_width);
807
696
	if (ios->bus_width == MMC_BUS_WIDTH_4) {
808
	if (ios->bus_width == MMC_BUS_WIDTH_4) {
697
		writel(TIFM_MMCSD_4BBUS | readl(sock->addr + SOCK_MMCSD_CONFIG),
809
		writel(TIFM_MMCSD_4BBUS | readl(sock->addr + SOCK_MMCSD_CONFIG),
698
		       sock->addr + SOCK_MMCSD_CONFIG);
810
		       sock->addr + SOCK_MMCSD_CONFIG);
Lines 737-777 static void tifm_sd_ios(struct mmc_host *mmc, struct mmc_ios *ios) Link Here
737
		  & readl(sock->addr + SOCK_MMCSD_CONFIG)),
849
		  & readl(sock->addr + SOCK_MMCSD_CONFIG)),
738
	       sock->addr + SOCK_MMCSD_CONFIG);
850
	       sock->addr + SOCK_MMCSD_CONFIG);
739
851
740
	if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
852
	host->open_drain = (ios->bus_mode == MMC_BUSMODE_OPENDRAIN);
741
		host->flags |= OPENDRAIN;
742
	else
743
		host->flags &= ~OPENDRAIN;
744
853
745
	/* chip_select : maybe later */
854
	/* chip_select : maybe later */
746
	//vdd
855
	//vdd
747
	//power is set before probe / after remove
856
	//power is set before probe / after remove
748
	//I believe, power_off when already marked for eject is sufficient to
749
	// allow removal.
750
	if ((host->flags & EJECT) && ios->power_mode == MMC_POWER_OFF) {
751
		host->flags |= EJECT_DONE;
752
		wake_up_all(&host->notify);
753
	}
754
857
755
	spin_unlock_irqrestore(&sock->lock, flags);
858
	spin_unlock_irqrestore(&sock->lock, flags);
756
}
859
}
757
860
758
static int tifm_sd_ro(struct mmc_host *mmc)
861
static int tifm_sd_ro(struct mmc_host *mmc)
759
{
862
{
760
	int rc;
863
	int rc = 0;
761
	struct tifm_sd *host = mmc_priv(mmc);
864
	struct tifm_sd *host = mmc_priv(mmc);
762
	struct tifm_dev *sock = host->dev;
865
	struct tifm_dev *sock = host->dev;
763
	unsigned long flags;
866
	unsigned long flags;
764
867
765
	spin_lock_irqsave(&sock->lock, flags);
868
	spin_lock_irqsave(&sock->lock, flags);
766
869
	if (TIFM_MMCSD_CARD_RO & readl(sock->addr + SOCK_PRESENT_STATE))
767
	host->flags |= (CARD_RO & readl(sock->addr + SOCK_PRESENT_STATE));
870
		rc = 1;
768
	rc = (host->flags & CARD_RO) ? 1 : 0;
769
770
	spin_unlock_irqrestore(&sock->lock, flags);
871
	spin_unlock_irqrestore(&sock->lock, flags);
771
	return rc;
872
	return rc;
772
}
873
}
773
874
774
static struct mmc_host_ops tifm_sd_ops = {
875
static const struct mmc_host_ops tifm_sd_ops = {
775
	.request = tifm_sd_request,
876
	.request = tifm_sd_request,
776
	.set_ios = tifm_sd_ios,
877
	.set_ios = tifm_sd_ios,
777
	.get_ro  = tifm_sd_ro
878
	.get_ro  = tifm_sd_ro
Lines 792-798 static int tifm_sd_initialize_host(struct tifm_sd *host) Link Here
792
	       sock->addr + SOCK_MMCSD_CONFIG);
893
	       sock->addr + SOCK_MMCSD_CONFIG);
793
894
794
	/* wait up to 0.51 sec for reset */
895
	/* wait up to 0.51 sec for reset */
795
	for (rc = 2; rc <= 256; rc <<= 1) {
896
	for (rc = 32; rc <= 256; rc <<= 1) {
796
		if (1 & readl(sock->addr + SOCK_MMCSD_SYSTEM_STATUS)) {
897
		if (1 & readl(sock->addr + SOCK_MMCSD_SYSTEM_STATUS)) {
797
			rc = 0;
898
			rc = 0;
798
			break;
899
			break;
Lines 801-808 static int tifm_sd_initialize_host(struct tifm_sd *host) Link Here
801
	}
902
	}
802
903
803
	if (rc) {
904
	if (rc) {
804
		printk(KERN_ERR DRIVER_NAME
905
		printk(KERN_ERR "%s : controller failed to reset\n",
805
		       ": controller failed to reset\n");
906
		       sock->dev.bus_id);
806
		return -ENODEV;
907
		return -ENODEV;
807
	}
908
	}
808
909
Lines 815-822 static int tifm_sd_initialize_host(struct tifm_sd *host) Link Here
815
	writel(64, sock->addr + SOCK_MMCSD_COMMAND_TO);
916
	writel(64, sock->addr + SOCK_MMCSD_COMMAND_TO);
816
	writel(TIFM_MMCSD_INAB, sock->addr + SOCK_MMCSD_COMMAND);
917
	writel(TIFM_MMCSD_INAB, sock->addr + SOCK_MMCSD_COMMAND);
817
918
818
	/* INAB should take much less than reset */
919
	for (rc = 16; rc <= 64; rc <<= 1) {
819
	for (rc = 1; rc <= 16; rc <<= 1) {
820
		host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
920
		host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
821
		writel(host_status, sock->addr + SOCK_MMCSD_STATUS);
921
		writel(host_status, sock->addr + SOCK_MMCSD_STATUS);
822
		if (!(host_status & TIFM_MMCSD_ERRMASK)
922
		if (!(host_status & TIFM_MMCSD_ERRMASK)
Lines 828-839 static int tifm_sd_initialize_host(struct tifm_sd *host) Link Here
828
	}
928
	}
829
929
830
	if (rc) {
930
	if (rc) {
831
		printk(KERN_ERR DRIVER_NAME
931
		printk(KERN_ERR
832
		       ": card not ready - probe failed on initialization\n");
932
		       "%s : card not ready - probe failed on initialization\n",
933
		       sock->dev.bus_id);
833
		return -ENODEV;
934
		return -ENODEV;
834
	}
935
	}
835
936
836
	writel(TIFM_MMCSD_DATAMASK | TIFM_MMCSD_ERRMASK,
937
	writel(TIFM_MMCSD_CERR | TIFM_MMCSD_BRS | TIFM_MMCSD_EOC
938
	       | TIFM_MMCSD_ERRMASK,
837
	       sock->addr + SOCK_MMCSD_INT_ENABLE);
939
	       sock->addr + SOCK_MMCSD_INT_ENABLE);
838
	mmiowb();
940
	mmiowb();
839
941
Lines 848-854 static int tifm_sd_probe(struct tifm_dev *sock) Link Here
848
950
849
	if (!(TIFM_SOCK_STATE_OCCUPIED
951
	if (!(TIFM_SOCK_STATE_OCCUPIED
850
	      & readl(sock->addr + SOCK_PRESENT_STATE))) {
952
	      & readl(sock->addr + SOCK_PRESENT_STATE))) {
851
		printk(KERN_WARNING DRIVER_NAME ": card gone, unexpectedly\n");
953
		printk(KERN_WARNING "%s : card gone, unexpectedly\n",
954
		       sock->dev.bus_id);
852
		return rc;
955
		return rc;
853
	}
956
	}
854
957
Lines 857-897 static int tifm_sd_probe(struct tifm_dev *sock) Link Here
857
		return -ENOMEM;
960
		return -ENOMEM;
858
961
859
	host = mmc_priv(mmc);
962
	host = mmc_priv(mmc);
963
	host->no_dma = no_dma;
860
	tifm_set_drvdata(sock, mmc);
964
	tifm_set_drvdata(sock, mmc);
861
	host->dev = sock;
965
	host->dev = sock;
862
	host->timeout_jiffies = msecs_to_jiffies(1000);
966
	host->timeout_jiffies = msecs_to_jiffies(1000);
863
967
864
	init_waitqueue_head(&host->notify);
968
	tasklet_init(&host->finish_tasklet, tifm_sd_end_cmd,
865
	tasklet_init(&host->finish_tasklet,
866
		     no_dma ? tifm_sd_end_cmd_nodma : tifm_sd_end_cmd,
867
		     (unsigned long)host);
969
		     (unsigned long)host);
868
	setup_timer(&host->timer, tifm_sd_abort, (unsigned long)host);
970
	setup_timer(&host->timer, tifm_sd_abort, (unsigned long)host);
869
971
870
	tifm_sd_ops.request = no_dma ? tifm_sd_request_nodma : tifm_sd_request;
871
	mmc->ops = &tifm_sd_ops;
972
	mmc->ops = &tifm_sd_ops;
872
	mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
973
	mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
873
	mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE;
974
	mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE;
874
	mmc->f_min = 20000000 / 60;
975
	mmc->f_min = 20000000 / 60;
875
	mmc->f_max = 24000000;
976
	mmc->f_max = 24000000;
876
	mmc->max_hw_segs = 1;
977
#if 0
877
	mmc->max_phys_segs = 1;
978
	mmc->max_seg_size = 2048 * 2048;
878
	// limited by DMA counter - it's safer to stick with
979
	mmc->max_hw_segs = 2048;
879
	// block counter has 11 bits though
980
	mmc->max_phys_segs = 2048;
880
	mmc->max_blk_count = 256;
981
	mmc->max_sectors = 2048;
881
	// 2k maximum hw block length
982
#endif
882
	mmc->max_blk_size = 2048;
983
	mmc->max_blk_count = 2048;
883
	mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
984
	mmc->max_hw_segs = mmc->max_blk_count;
884
	mmc->max_seg_size = mmc->max_req_size;
985
	mmc->max_phys_segs = mmc->max_hw_segs;
885
	sock->signal_irq = tifm_sd_signal_irq;
986
	mmc->max_blk_size = min(2048UL, PAGE_SIZE);
987
	mmc->max_seg_size = mmc->max_blk_count * mmc->max_blk_size;
988
	mmc->max_req_size = mmc->max_seg_size;
989
990
	sock->card_event = tifm_sd_card_event;
991
	sock->data_event = tifm_sd_data_event;
886
	rc = tifm_sd_initialize_host(host);
992
	rc = tifm_sd_initialize_host(host);
887
993
888
	if (!rc)
994
	if (!rc)
889
		rc = mmc_add_host(mmc);
995
		rc = mmc_add_host(mmc);
890
	if (rc)
996
	if (!rc)
891
		goto out_free_mmc;
997
		return 0;
892
998
893
	return 0;
894
out_free_mmc:
895
	mmc_free_host(mmc);
999
	mmc_free_host(mmc);
896
	return rc;
1000
	return rc;
897
}
1001
}
Lines 900-918 static void tifm_sd_remove(struct tifm_dev *sock) Link Here
900
{
1004
{
901
	struct mmc_host *mmc = tifm_get_drvdata(sock);
1005
	struct mmc_host *mmc = tifm_get_drvdata(sock);
902
	struct tifm_sd *host = mmc_priv(mmc);
1006
	struct tifm_sd *host = mmc_priv(mmc);
1007
	unsigned long flags;
1008
1009
	spin_lock_irqsave(&sock->lock, flags);
1010
	host->eject = 1;
1011
	writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE);
1012
	mmiowb();
1013
	spin_unlock_irqrestore(&sock->lock, flags);
903
1014
904
	del_timer_sync(&host->timer);
905
	tifm_sd_terminate(host);
906
	wait_event_timeout(host->notify, host->flags & EJECT_DONE,
907
			   host->timeout_jiffies);
908
	tasklet_kill(&host->finish_tasklet);
1015
	tasklet_kill(&host->finish_tasklet);
1016
1017
	spin_lock_irqsave(&sock->lock, flags);
1018
	if (host->req) {
1019
		writel(TIFM_FIFO_INT_SETALL,
1020
		       sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR);
1021
		writel(0, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET);
1022
		host->req->cmd->error = MMC_ERR_TIMEOUT;
1023
		if (host->req->stop)
1024
			host->req->stop->error = MMC_ERR_TIMEOUT;
1025
		tasklet_schedule(&host->finish_tasklet);
1026
	}
1027
	spin_unlock_irqrestore(&sock->lock, flags);
909
	mmc_remove_host(mmc);
1028
	mmc_remove_host(mmc);
1029
	dev_dbg(&sock->dev, "after remove\n");
910
1030
911
	/* The meaning of the bit majority in this constant is unknown. */
1031
	/* The meaning of the bit majority in this constant is unknown. */
912
	writel(0xfff8 & readl(sock->addr + SOCK_CONTROL),
1032
	writel(0xfff8 & readl(sock->addr + SOCK_CONTROL),
913
	       sock->addr + SOCK_CONTROL);
1033
	       sock->addr + SOCK_CONTROL);
914
1034
915
	tifm_set_drvdata(sock, NULL);
916
	mmc_free_host(mmc);
1035
	mmc_free_host(mmc);
917
}
1036
}
918
1037
Lines 934-947 static int tifm_sd_resume(struct tifm_dev *sock) Link Here
934
{
1053
{
935
	struct mmc_host *mmc = tifm_get_drvdata(sock);
1054
	struct mmc_host *mmc = tifm_get_drvdata(sock);
936
	struct tifm_sd *host = mmc_priv(mmc);
1055
	struct tifm_sd *host = mmc_priv(mmc);
1056
	int rc;
937
1057
938
	if (sock->media_id != FM_SD
1058
	rc = tifm_sd_initialize_host(host);
939
	    || tifm_sd_initialize_host(host)) {
1059
	dev_dbg(&sock->dev, "resume initialize %d\n", rc);
940
		tifm_eject(sock);
1060
941
		return 0;
1061
	if (rc)
942
	} else {
1062
		host->eject = 1;
943
		return mmc_resume_host(mmc);
1063
	else
944
	}
1064
		rc = mmc_resume_host(mmc);
1065
1066
	return rc;
945
}
1067
}
946
1068
947
#else
1069
#else
Lines 951-958 static int tifm_sd_resume(struct tifm_dev *sock) Link Here
951
1073
952
#endif /* CONFIG_PM */
1074
#endif /* CONFIG_PM */
953
1075
954
static tifm_media_id tifm_sd_id_tbl[] = {
1076
static struct tifm_device_id tifm_sd_id_tbl[] = {
955
	FM_SD, 0
1077
	{ TIFM_TYPE_SD }, { }
956
};
1078
};
957
1079
958
static struct tifm_driver tifm_sd_driver = {
1080
static struct tifm_driver tifm_sd_driver = {
(-)a/include/linux/tifm.h (-57 / +63 lines)
Lines 14-29 Link Here
14
14
15
#include <linux/spinlock.h>
15
#include <linux/spinlock.h>
16
#include <linux/interrupt.h>
16
#include <linux/interrupt.h>
17
#include <linux/wait.h>
18
#include <linux/delay.h>
17
#include <linux/delay.h>
19
#include <linux/pci.h>
18
#include <linux/pci.h>
20
#include <linux/kthread.h>
19
#include <linux/workqueue.h>
21
20
22
/* Host registers (relative to pci base address): */
21
/* Host registers (relative to pci base address): */
23
enum {
22
enum {
24
	FM_SET_INTERRUPT_ENABLE   = 0x008,
23
	FM_SET_INTERRUPT_ENABLE   = 0x008,
25
	FM_CLEAR_INTERRUPT_ENABLE = 0x00c,
24
	FM_CLEAR_INTERRUPT_ENABLE = 0x00c,
26
	FM_INTERRUPT_STATUS       = 0x014 };
25
	FM_INTERRUPT_STATUS       = 0x014
26
};
27
27
28
/* Socket registers (relative to socket base address): */
28
/* Socket registers (relative to socket base address): */
29
enum {
29
enum {
Lines 58-71 enum { Link Here
58
	SOCK_MS_DATA                   = 0x188,
58
	SOCK_MS_DATA                   = 0x188,
59
	SOCK_MS_STATUS                 = 0x18c,
59
	SOCK_MS_STATUS                 = 0x18c,
60
	SOCK_MS_SYSTEM                 = 0x190,
60
	SOCK_MS_SYSTEM                 = 0x190,
61
	SOCK_FIFO_ACCESS               = 0x200 };
61
	SOCK_FIFO_ACCESS               = 0x200
62
62
};
63
64
#define TIFM_IRQ_ENABLE           0x80000000
65
#define TIFM_IRQ_SOCKMASK(x)      (x)
66
#define TIFM_IRQ_CARDMASK(x)      ((x) << 8)
67
#define TIFM_IRQ_FIFOMASK(x)      ((x) << 16)
68
#define TIFM_IRQ_SETALL           0xffffffff
69
63
70
#define TIFM_CTRL_LED             0x00000040
64
#define TIFM_CTRL_LED             0x00000040
71
#define TIFM_CTRL_FAST_CLK        0x00000100
65
#define TIFM_CTRL_FAST_CLK        0x00000100
Lines 73-147 enum { Link Here
73
#define TIFM_SOCK_STATE_OCCUPIED  0x00000008
67
#define TIFM_SOCK_STATE_OCCUPIED  0x00000008
74
#define TIFM_SOCK_STATE_POWERED   0x00000080
68
#define TIFM_SOCK_STATE_POWERED   0x00000080
75
69
76
#define TIFM_FIFO_ENABLE          0x00000001 /* Meaning of this constant is unverified */
70
#define TIFM_FIFO_ENABLE          0x00000001
71
#define TIFM_FIFO_READY           0x00000001
77
#define TIFM_FIFO_INT_SETALL      0x0000ffff
72
#define TIFM_FIFO_INT_SETALL      0x0000ffff
78
#define TIFM_FIFO_INTMASK         0x00000005 /* Meaning of this constant is unverified */
73
#define TIFM_FIFO_INTMASK         0x00000005
79
74
80
#define TIFM_DMA_RESET            0x00000002 /* Meaning of this constant is unverified */
75
#define TIFM_DMA_RESET            0x00000002
81
#define TIFM_DMA_TX               0x00008000 /* Meaning of this constant is unverified */
76
#define TIFM_DMA_TX               0x00008000
82
#define TIFM_DMA_EN               0x00000001 /* Meaning of this constant is unverified */
77
#define TIFM_DMA_EN               0x00000001
78
#define TIFM_DMA_TSIZE            0x0000007f
83
79
84
typedef enum {FM_NULL = 0, FM_XD = 0x01, FM_MS = 0x02, FM_SD = 0x03} tifm_media_id;
80
#define TIFM_TYPE_XD 1
81
#define TIFM_TYPE_MS 2
82
#define TIFM_TYPE_SD 3
83
84
struct tifm_device_id {
85
	unsigned char type;
86
};
85
87
86
struct tifm_driver;
88
struct tifm_driver;
87
struct tifm_dev {
89
struct tifm_dev {
88
	char __iomem            *addr;
90
	char __iomem  *addr;
89
	spinlock_t              lock;
91
	spinlock_t    lock;
90
	tifm_media_id           media_id;
92
	unsigned char type;
91
	unsigned int            socket_id;
93
	unsigned int  socket_id;
92
94
93
	void                    (*signal_irq)(struct tifm_dev *sock,
95
	void          (*card_event)(struct tifm_dev *sock);
94
					      unsigned int sock_irq_status);
96
	void          (*data_event)(struct tifm_dev *sock);
95
97
96
	struct tifm_driver      *drv;
98
	struct device dev;
97
	struct device           dev;
98
};
99
};
99
100
100
struct tifm_driver {
101
struct tifm_driver {
101
	tifm_media_id        *id_table;
102
	struct tifm_device_id *id_table;
102
	int                  (*probe)(struct tifm_dev *dev);
103
	int                   (*probe)(struct tifm_dev *dev);
103
	void                 (*remove)(struct tifm_dev *dev);
104
	void                  (*remove)(struct tifm_dev *dev);
104
	int                  (*suspend)(struct tifm_dev *dev,
105
	int                   (*suspend)(struct tifm_dev *dev,
105
                                        pm_message_t state);
106
					 pm_message_t state);
106
	int                  (*resume)(struct tifm_dev *dev);
107
	int                   (*resume)(struct tifm_dev *dev);
107
108
108
	struct device_driver driver;
109
	struct device_driver  driver;
109
};
110
};
110
111
111
struct tifm_adapter {
112
struct tifm_adapter {
112
	char __iomem            *addr;
113
	char __iomem        *addr;
113
	spinlock_t              lock;
114
	spinlock_t          lock;
114
	unsigned int            irq_status;
115
	unsigned int        irq_status;
115
	unsigned int            socket_change_set;
116
	unsigned int        socket_change_set;
116
	wait_queue_head_t       change_set_notify;
117
	unsigned int        id;
117
	unsigned int            id;
118
	unsigned int        num_sockets;
118
	unsigned int            num_sockets;
119
	struct completion   *finish_me;
119
	struct tifm_dev         **sockets;
120
120
	struct task_struct      *media_switcher;
121
	struct work_struct  media_switcher;
121
	struct class_device     cdev;
122
	struct class_device cdev;
122
	struct device           *dev;
123
123
124
	void                (*eject)(struct tifm_adapter *fm,
124
	void                    (*eject)(struct tifm_adapter *fm, struct tifm_dev *sock);
125
				     struct tifm_dev *sock);
126
	int                 (*has_ms_pif)(struct tifm_adapter *fm,
127
					  struct tifm_dev *sock);
128
129
	struct tifm_dev     *sockets[0];
125
};
130
};
126
131
127
struct tifm_adapter *tifm_alloc_adapter(void);
132
struct tifm_adapter *tifm_alloc_adapter(unsigned int num_sockets,
128
void tifm_free_device(struct device *dev);
133
					struct device *dev);
129
void tifm_free_adapter(struct tifm_adapter *fm);
134
int tifm_add_adapter(struct tifm_adapter *fm);
130
int tifm_add_adapter(struct tifm_adapter *fm, int (*mediathreadfn)(void *data));
131
void tifm_remove_adapter(struct tifm_adapter *fm);
135
void tifm_remove_adapter(struct tifm_adapter *fm);
132
struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm);
136
void tifm_free_adapter(struct tifm_adapter *fm);
137
138
void tifm_free_device(struct device *dev);
139
struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id,
140
				   unsigned char type);
141
133
int tifm_register_driver(struct tifm_driver *drv);
142
int tifm_register_driver(struct tifm_driver *drv);
134
void tifm_unregister_driver(struct tifm_driver *drv);
143
void tifm_unregister_driver(struct tifm_driver *drv);
135
void tifm_eject(struct tifm_dev *sock);
144
void tifm_eject(struct tifm_dev *sock);
145
int tifm_has_ms_pif(struct tifm_dev *sock);
136
int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
146
int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
137
		int direction);
147
		int direction);
138
void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
148
void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
139
		   int direction);
149
		   int direction);
140
150
void tifm_queue_work(struct work_struct *work);
141
151
142
static inline void *tifm_get_drvdata(struct tifm_dev *dev)
152
static inline void *tifm_get_drvdata(struct tifm_dev *dev)
143
{
153
{
144
        return dev_get_drvdata(&dev->dev);
154
	return dev_get_drvdata(&dev->dev);
145
}
155
}
146
156
147
static inline void tifm_set_drvdata(struct tifm_dev *dev, void *data)
157
static inline void tifm_set_drvdata(struct tifm_dev *dev, void *data)
Lines 149-156 static inline void tifm_set_drvdata(struct tifm_dev *dev, void *data) Link Here
149
	dev_set_drvdata(&dev->dev, data);
159
	dev_set_drvdata(&dev->dev, data);
150
}
160
}
151
161
152
struct tifm_device_id {
153
	tifm_media_id media_id;
154
};
155
156
#endif
162
#endif

Return to bug 8052