2 * MTD driver for Alauda chips
4 * Copyright (C) 2007 Joern Engel <joern@logfs.org>
6 * Based on drivers/usb/usb-skeleton.c which is:
7 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
8 * and on drivers/usb/storage/alauda.c, which is:
9 * (c) 2005 Daniel Drake <dsd@gentoo.org>
11 * Idea and initial work by Arnd Bergmann <arnd@arndb.de>
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
17 #include <linux/module.h>
18 #include <linux/kref.h>
19 #include <linux/usb.h>
20 #include <linux/mutex.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/nand_ecc.h>
24 /* Control commands */
25 #define ALAUDA_GET_XD_MEDIA_STATUS 0x08
26 #define ALAUDA_ACK_XD_MEDIA_CHANGE 0x0a
27 #define ALAUDA_GET_XD_MEDIA_SIG 0x86
30 #define ALAUDA_BULK_CMD 0x40
33 #define ALAUDA_PORT_XD 0x00
34 #define ALAUDA_PORT_SM 0x01
37 #define ALAUDA_BULK_READ_PAGE 0x84
38 #define ALAUDA_BULK_READ_OOB 0x85 /* don't use, there's a chip bug */
39 #define ALAUDA_BULK_READ_BLOCK 0x94
40 #define ALAUDA_BULK_ERASE_BLOCK 0xa3
41 #define ALAUDA_BULK_WRITE_PAGE 0xa4
42 #define ALAUDA_BULK_WRITE_BLOCK 0xb4
43 #define ALAUDA_BULK_RESET_MEDIA 0xe0
45 /* Address shifting */
46 #define PBA_LO(pba) ((pba & 0xF) << 5)
47 #define PBA_HI(pba) (pba >> 3)
48 #define PBA_ZONE(pba) (pba >> 11)
52 static const struct usb_device_id alauda_table
[] = {
53 { USB_DEVICE(0x0584, 0x0008) }, /* Fujifilm DPC-R1 */
54 { USB_DEVICE(0x07b4, 0x010a) }, /* Olympus MAUSB-10 */
57 MODULE_DEVICE_TABLE(usb
, alauda_table
);
61 u8 chipshift
; /* 1<<chipshift total size */
62 u8 pageshift
; /* 1<<pageshift page size */
63 u8 blockshift
; /* 1<<blockshift block size */
67 struct usb_device
*dev
;
68 struct usb_interface
*interface
;
70 struct alauda_card
*card
;
71 struct mutex card_mutex
;
75 unsigned int write_out
;
77 unsigned int bulk_out
;
82 static struct alauda_card alauda_card_ids
[] = {
84 { 0x6e, 20, 8, 12}, /* 1 MB */
85 { 0xe8, 20, 8, 12}, /* 1 MB */
86 { 0xec, 20, 8, 12}, /* 1 MB */
87 { 0x64, 21, 8, 12}, /* 2 MB */
88 { 0xea, 21, 8, 12}, /* 2 MB */
89 { 0x6b, 22, 9, 13}, /* 4 MB */
90 { 0xe3, 22, 9, 13}, /* 4 MB */
91 { 0xe5, 22, 9, 13}, /* 4 MB */
92 { 0xe6, 23, 9, 13}, /* 8 MB */
93 { 0x73, 24, 9, 14}, /* 16 MB */
94 { 0x75, 25, 9, 14}, /* 32 MB */
95 { 0x76, 26, 9, 14}, /* 64 MB */
96 { 0x79, 27, 9, 14}, /* 128 MB */
97 { 0x71, 28, 9, 14}, /* 256 MB */
100 { 0x5d, 21, 9, 13}, /* 2 MB */
101 { 0xd5, 22, 9, 13}, /* 4 MB */
102 { 0xd6, 23, 9, 13}, /* 8 MB */
103 { 0x57, 24, 9, 13}, /* 16 MB */
104 { 0x58, 25, 9, 13}, /* 32 MB */
108 static struct alauda_card
*get_card(u8 id
)
110 struct alauda_card
*card
;
112 for (card
= alauda_card_ids
; card
->id
; card
++)
118 static void alauda_delete(struct kref
*kref
)
120 struct alauda
*al
= container_of(kref
, struct alauda
, kref
);
123 mtd_device_unregister(al
->mtd
);
126 usb_put_dev(al
->dev
);
130 static int alauda_get_media_status(struct alauda
*al
, void *buf
)
134 mutex_lock(&al
->card_mutex
);
135 ret
= usb_control_msg(al
->dev
, usb_rcvctrlpipe(al
->dev
, 0),
136 ALAUDA_GET_XD_MEDIA_STATUS
, 0xc0, 0, 1, buf
, 2, HZ
);
137 mutex_unlock(&al
->card_mutex
);
141 static int alauda_ack_media(struct alauda
*al
)
145 mutex_lock(&al
->card_mutex
);
146 ret
= usb_control_msg(al
->dev
, usb_sndctrlpipe(al
->dev
, 0),
147 ALAUDA_ACK_XD_MEDIA_CHANGE
, 0x40, 0, 1, NULL
, 0, HZ
);
148 mutex_unlock(&al
->card_mutex
);
152 static int alauda_get_media_signatures(struct alauda
*al
, void *buf
)
156 mutex_lock(&al
->card_mutex
);
157 ret
= usb_control_msg(al
->dev
, usb_rcvctrlpipe(al
->dev
, 0),
158 ALAUDA_GET_XD_MEDIA_SIG
, 0xc0, 0, 0, buf
, 4, HZ
);
159 mutex_unlock(&al
->card_mutex
);
163 static void alauda_reset(struct alauda
*al
)
166 ALAUDA_BULK_CMD
, ALAUDA_BULK_RESET_MEDIA
, 0, 0,
169 mutex_lock(&al
->card_mutex
);
170 usb_bulk_msg(al
->dev
, al
->bulk_out
, command
, 9, NULL
, HZ
);
171 mutex_unlock(&al
->card_mutex
);
174 static void correct_data(void *buf
, void *read_ecc
,
175 int *corrected
, int *uncorrected
)
180 nand_calculate_ecc(NULL
, buf
, calc_ecc
);
181 err
= nand_correct_data(NULL
, buf
, read_ecc
, calc_ecc
);
190 struct alauda_sg_request
{
192 struct completion comp
;
195 static void alauda_complete(struct urb
*urb
)
197 struct completion
*comp
= urb
->context
;
203 static int __alauda_read_page(struct mtd_info
*mtd
, loff_t from
, void *buf
,
206 struct alauda_sg_request sg
;
207 struct alauda
*al
= mtd
->priv
;
208 u32 pba
= from
>> al
->card
->blockshift
;
209 u32 page
= (from
>> al
->card
->pageshift
) & al
->pagemask
;
211 ALAUDA_BULK_CMD
, ALAUDA_BULK_READ_PAGE
, PBA_HI(pba
),
212 PBA_ZONE(pba
), 0, PBA_LO(pba
) + page
, 1, 0, al
->port
220 for (i
=0; i
<3; i
++) {
221 sg
.urb
[i
] = usb_alloc_urb(0, GFP_NOIO
);
225 init_completion(&sg
.comp
);
226 usb_fill_bulk_urb(sg
.urb
[0], al
->dev
, al
->bulk_out
, command
, 9,
227 alauda_complete
, NULL
);
228 usb_fill_bulk_urb(sg
.urb
[1], al
->dev
, al
->bulk_in
, buf
, mtd
->writesize
,
229 alauda_complete
, NULL
);
230 usb_fill_bulk_urb(sg
.urb
[2], al
->dev
, al
->bulk_in
, oob
, 16,
231 alauda_complete
, &sg
.comp
);
233 mutex_lock(&al
->card_mutex
);
234 for (i
=0; i
<3; i
++) {
235 err
= usb_submit_urb(sg
.urb
[i
], GFP_NOIO
);
239 if (!wait_for_completion_timeout(&sg
.comp
, TIMEOUT
)) {
242 for (i
=0; i
<3; i
++) {
243 usb_kill_urb(sg
.urb
[i
]);
246 mutex_unlock(&al
->card_mutex
);
249 usb_free_urb(sg
.urb
[0]);
250 usb_free_urb(sg
.urb
[1]);
251 usb_free_urb(sg
.urb
[2]);
255 static int alauda_read_page(struct mtd_info
*mtd
, loff_t from
,
256 void *buf
, u8
*oob
, int *corrected
, int *uncorrected
)
260 err
= __alauda_read_page(mtd
, from
, buf
, oob
);
263 correct_data(buf
, oob
+13, corrected
, uncorrected
);
264 correct_data(buf
+256, oob
+8, corrected
, uncorrected
);
268 static int alauda_write_page(struct mtd_info
*mtd
, loff_t to
, void *buf
,
271 struct alauda_sg_request sg
;
272 struct alauda
*al
= mtd
->priv
;
273 u32 pba
= to
>> al
->card
->blockshift
;
274 u32 page
= (to
>> al
->card
->pageshift
) & al
->pagemask
;
276 ALAUDA_BULK_CMD
, ALAUDA_BULK_WRITE_PAGE
, PBA_HI(pba
),
277 PBA_ZONE(pba
), 0, PBA_LO(pba
) + page
, 32, 0, al
->port
285 for (i
=0; i
<3; i
++) {
286 sg
.urb
[i
] = usb_alloc_urb(0, GFP_NOIO
);
290 init_completion(&sg
.comp
);
291 usb_fill_bulk_urb(sg
.urb
[0], al
->dev
, al
->bulk_out
, command
, 9,
292 alauda_complete
, NULL
);
293 usb_fill_bulk_urb(sg
.urb
[1], al
->dev
, al
->write_out
, buf
,mtd
->writesize
,
294 alauda_complete
, NULL
);
295 usb_fill_bulk_urb(sg
.urb
[2], al
->dev
, al
->write_out
, oob
, 16,
296 alauda_complete
, &sg
.comp
);
298 mutex_lock(&al
->card_mutex
);
299 for (i
=0; i
<3; i
++) {
300 err
= usb_submit_urb(sg
.urb
[i
], GFP_NOIO
);
304 if (!wait_for_completion_timeout(&sg
.comp
, TIMEOUT
)) {
307 for (i
=0; i
<3; i
++) {
308 usb_kill_urb(sg
.urb
[i
]);
311 mutex_unlock(&al
->card_mutex
);
314 usb_free_urb(sg
.urb
[0]);
315 usb_free_urb(sg
.urb
[1]);
316 usb_free_urb(sg
.urb
[2]);
320 static int alauda_erase_block(struct mtd_info
*mtd
, loff_t ofs
)
322 struct alauda_sg_request sg
;
323 struct alauda
*al
= mtd
->priv
;
324 u32 pba
= ofs
>> al
->card
->blockshift
;
326 ALAUDA_BULK_CMD
, ALAUDA_BULK_ERASE_BLOCK
, PBA_HI(pba
),
327 PBA_ZONE(pba
), 0, PBA_LO(pba
), 0x02, 0, al
->port
336 for (i
=0; i
<2; i
++) {
337 sg
.urb
[i
] = usb_alloc_urb(0, GFP_NOIO
);
341 init_completion(&sg
.comp
);
342 usb_fill_bulk_urb(sg
.urb
[0], al
->dev
, al
->bulk_out
, command
, 9,
343 alauda_complete
, NULL
);
344 usb_fill_bulk_urb(sg
.urb
[1], al
->dev
, al
->bulk_in
, buf
, 2,
345 alauda_complete
, &sg
.comp
);
347 mutex_lock(&al
->card_mutex
);
348 for (i
=0; i
<2; i
++) {
349 err
= usb_submit_urb(sg
.urb
[i
], GFP_NOIO
);
353 if (!wait_for_completion_timeout(&sg
.comp
, TIMEOUT
)) {
356 for (i
=0; i
<2; i
++) {
357 usb_kill_urb(sg
.urb
[i
]);
360 mutex_unlock(&al
->card_mutex
);
363 usb_free_urb(sg
.urb
[0]);
364 usb_free_urb(sg
.urb
[1]);
368 static int alauda_read_oob(struct mtd_info
*mtd
, loff_t from
, void *oob
)
370 static u8 ignore_buf
[512]; /* write only */
372 return __alauda_read_page(mtd
, from
, ignore_buf
, oob
);
375 static int alauda_isbad(struct mtd_info
*mtd
, loff_t ofs
)
380 err
= alauda_read_oob(mtd
, ofs
, oob
);
384 /* A block is marked bad if two or more bits are zero */
385 return hweight8(oob
[5]) >= 7 ? 0 : 1;
388 static int alauda_bounce_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
389 size_t *retlen
, u_char
*buf
)
391 struct alauda
*al
= mtd
->priv
;
393 int err
, corrected
=0, uncorrected
=0;
395 bounce_buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
402 size_t byte
= from
& al
->bytemask
;
403 size_t cplen
= min(len
, mtd
->writesize
- byte
);
405 err
= alauda_read_page(mtd
, from
, bounce_buf
, oob
,
406 &corrected
, &uncorrected
);
410 memcpy(buf
, bounce_buf
+ byte
, cplen
);
425 static int alauda_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
426 size_t *retlen
, u_char
*buf
)
428 struct alauda
*al
= mtd
->priv
;
429 int err
, corrected
=0, uncorrected
=0;
431 if ((from
& al
->bytemask
) || (len
& al
->bytemask
))
432 return alauda_bounce_read(mtd
, from
, len
, retlen
, buf
);
438 err
= alauda_read_page(mtd
, from
, buf
, oob
,
439 &corrected
, &uncorrected
);
443 buf
+= mtd
->writesize
;
444 from
+= mtd
->writesize
;
445 len
-= mtd
->writesize
;
455 static int alauda_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
456 size_t *retlen
, const u_char
*buf
)
458 struct alauda
*al
= mtd
->priv
;
461 if ((to
& al
->bytemask
) || (len
& al
->bytemask
))
466 u32 page
= (to
>> al
->card
->pageshift
) & al
->pagemask
;
467 u8 oob
[16] = { 'h', 'e', 'l', 'l', 'o', 0xff, 0xff, 0xff,
468 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
470 /* don't write to bad blocks */
472 err
= alauda_isbad(mtd
, to
);
477 nand_calculate_ecc(mtd
, buf
, &oob
[13]);
478 nand_calculate_ecc(mtd
, buf
+256, &oob
[8]);
480 err
= alauda_write_page(mtd
, to
, (void*)buf
, oob
);
484 buf
+= mtd
->writesize
;
485 to
+= mtd
->writesize
;
486 len
-= mtd
->writesize
;
491 static int __alauda_erase(struct mtd_info
*mtd
, struct erase_info
*instr
)
493 struct alauda
*al
= mtd
->priv
;
494 u32 ofs
= instr
->addr
;
495 u32 len
= instr
->len
;
498 if ((ofs
& al
->blockmask
) || (len
& al
->blockmask
))
502 /* don't erase bad blocks */
503 err
= alauda_isbad(mtd
, ofs
);
509 err
= alauda_erase_block(mtd
, ofs
);
513 ofs
+= mtd
->erasesize
;
514 len
-= mtd
->erasesize
;
519 static int alauda_erase(struct mtd_info
*mtd
, struct erase_info
*instr
)
523 err
= __alauda_erase(mtd
, instr
);
524 instr
->state
= err
? MTD_ERASE_FAILED
: MTD_ERASE_DONE
;
525 mtd_erase_callback(instr
);
529 static int alauda_init_media(struct alauda
*al
)
531 u8 buf
[4], *b0
=buf
, *b1
=buf
+1;
532 struct alauda_card
*card
;
533 struct mtd_info
*mtd
;
536 mtd
= kzalloc(sizeof(*mtd
), GFP_KERNEL
);
541 err
= alauda_get_media_status(al
, buf
);
549 err
= alauda_ack_media(al
);
555 err
= alauda_get_media_status(al
, buf
);
560 /* media not ready */
564 err
= alauda_get_media_signatures(al
, buf
);
568 card
= get_card(*b1
);
570 printk(KERN_ERR
"Alauda: unknown card id %02x\n", *b1
);
574 printk(KERN_INFO
"pagesize=%x\nerasesize=%x\nsize=%xMiB\n",
575 1<<card
->pageshift
, 1<<card
->blockshift
,
576 1<<(card
->chipshift
-20));
578 al
->pagemask
= (1 << (card
->blockshift
- card
->pageshift
)) - 1;
579 al
->bytemask
= (1 << card
->pageshift
) - 1;
580 al
->blockmask
= (1 << card
->blockshift
) - 1;
582 mtd
->name
= "alauda";
583 mtd
->size
= 1<<card
->chipshift
;
584 mtd
->erasesize
= 1<<card
->blockshift
;
585 mtd
->writesize
= 1<<card
->pageshift
;
586 mtd
->type
= MTD_NANDFLASH
;
587 mtd
->flags
= MTD_CAP_NANDFLASH
;
588 mtd
->read
= alauda_read
;
589 mtd
->write
= alauda_write
;
590 mtd
->erase
= alauda_erase
;
591 mtd
->block_isbad
= alauda_isbad
;
593 mtd
->owner
= THIS_MODULE
;
595 err
= mtd_device_register(mtd
, NULL
, 0);
602 alauda_reset(al
); /* no clue whether this is necessary */
609 static int alauda_check_media(struct alauda
*al
)
611 u8 buf
[2], *b0
= buf
, *b1
= buf
+1;
614 err
= alauda_get_media_status(al
, buf
);
618 if ((*b1
& 0x01) == 0) {
622 if ((*b0
& 0x80) || ((*b0
& 0x1F) == 0x10)) {
628 return alauda_init_media(al
);
633 static int alauda_probe(struct usb_interface
*interface
,
634 const struct usb_device_id
*id
)
637 struct usb_host_interface
*iface
;
638 struct usb_endpoint_descriptor
*ep
,
639 *ep_in
=NULL
, *ep_out
=NULL
, *ep_wr
=NULL
;
640 int i
, err
= -ENOMEM
;
642 al
= kzalloc(2*sizeof(*al
), GFP_KERNEL
);
646 kref_init(&al
->kref
);
647 usb_set_intfdata(interface
, al
);
649 al
->dev
= usb_get_dev(interface_to_usbdev(interface
));
650 al
->interface
= interface
;
652 iface
= interface
->cur_altsetting
;
653 for (i
= 0; i
< iface
->desc
.bNumEndpoints
; ++i
) {
654 ep
= &iface
->endpoint
[i
].desc
;
656 if (usb_endpoint_is_bulk_in(ep
)) {
658 } else if (usb_endpoint_is_bulk_out(ep
)) {
666 if (!ep_wr
|| !ep_in
|| !ep_out
)
669 al
->write_out
= usb_sndbulkpipe(al
->dev
,
670 usb_endpoint_num(ep_wr
));
671 al
->bulk_in
= usb_rcvbulkpipe(al
->dev
,
672 usb_endpoint_num(ep_in
));
673 al
->bulk_out
= usb_sndbulkpipe(al
->dev
,
674 usb_endpoint_num(ep_out
));
676 /* second device is identical up to now */
677 memcpy(al
+1, al
, sizeof(*al
));
679 mutex_init(&al
[0].card_mutex
);
680 mutex_init(&al
[1].card_mutex
);
682 al
[0].port
= ALAUDA_PORT_XD
;
683 al
[1].port
= ALAUDA_PORT_SM
;
685 dev_info(&interface
->dev
, "alauda probed\n");
686 alauda_check_media(al
);
687 alauda_check_media(al
+1);
693 kref_put(&al
->kref
, alauda_delete
);
697 static void alauda_disconnect(struct usb_interface
*interface
)
701 al
= usb_get_intfdata(interface
);
702 usb_set_intfdata(interface
, NULL
);
704 /* FIXME: prevent more I/O from starting */
706 /* decrement our usage count */
708 kref_put(&al
->kref
, alauda_delete
);
710 dev_info(&interface
->dev
, "alauda gone");
713 static struct usb_driver alauda_driver
= {
715 .probe
= alauda_probe
,
716 .disconnect
= alauda_disconnect
,
717 .id_table
= alauda_table
,
720 module_usb_driver(alauda_driver
);
722 MODULE_LICENSE("GPL");