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 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 del_mtd_device(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 popcount8(u8 c
)
384 static int alauda_isbad(struct mtd_info
*mtd
, loff_t ofs
)
389 err
= alauda_read_oob(mtd
, ofs
, oob
);
393 /* A block is marked bad if two or more bits are zero */
394 return popcount8(oob
[5]) >= 7 ? 0 : 1;
397 static int alauda_bounce_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
398 size_t *retlen
, u_char
*buf
)
400 struct alauda
*al
= mtd
->priv
;
402 int err
, corrected
=0, uncorrected
=0;
404 bounce_buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
411 size_t byte
= from
& al
->bytemask
;
412 size_t cplen
= min(len
, mtd
->writesize
- byte
);
414 err
= alauda_read_page(mtd
, from
, bounce_buf
, oob
,
415 &corrected
, &uncorrected
);
419 memcpy(buf
, bounce_buf
+ byte
, cplen
);
434 static int alauda_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
435 size_t *retlen
, u_char
*buf
)
437 struct alauda
*al
= mtd
->priv
;
438 int err
, corrected
=0, uncorrected
=0;
440 if ((from
& al
->bytemask
) || (len
& al
->bytemask
))
441 return alauda_bounce_read(mtd
, from
, len
, retlen
, buf
);
447 err
= alauda_read_page(mtd
, from
, buf
, oob
,
448 &corrected
, &uncorrected
);
452 buf
+= mtd
->writesize
;
453 from
+= mtd
->writesize
;
454 len
-= mtd
->writesize
;
464 static int alauda_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
465 size_t *retlen
, const u_char
*buf
)
467 struct alauda
*al
= mtd
->priv
;
470 if ((to
& al
->bytemask
) || (len
& al
->bytemask
))
475 u32 page
= (to
>> al
->card
->pageshift
) & al
->pagemask
;
476 u8 oob
[16] = { 'h', 'e', 'l', 'l', 'o', 0xff, 0xff, 0xff,
477 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
479 /* don't write to bad blocks */
481 err
= alauda_isbad(mtd
, to
);
486 nand_calculate_ecc(mtd
, buf
, &oob
[13]);
487 nand_calculate_ecc(mtd
, buf
+256, &oob
[8]);
489 err
= alauda_write_page(mtd
, to
, (void*)buf
, oob
);
493 buf
+= mtd
->writesize
;
494 to
+= mtd
->writesize
;
495 len
-= mtd
->writesize
;
500 static int __alauda_erase(struct mtd_info
*mtd
, struct erase_info
*instr
)
502 struct alauda
*al
= mtd
->priv
;
503 u32 ofs
= instr
->addr
;
504 u32 len
= instr
->len
;
507 if ((ofs
& al
->blockmask
) || (len
& al
->blockmask
))
511 /* don't erase bad blocks */
512 err
= alauda_isbad(mtd
, ofs
);
518 err
= alauda_erase_block(mtd
, ofs
);
522 ofs
+= mtd
->erasesize
;
523 len
-= mtd
->erasesize
;
528 static int alauda_erase(struct mtd_info
*mtd
, struct erase_info
*instr
)
532 err
= __alauda_erase(mtd
, instr
);
533 instr
->state
= err
? MTD_ERASE_FAILED
: MTD_ERASE_DONE
;
534 mtd_erase_callback(instr
);
538 static int alauda_init_media(struct alauda
*al
)
540 u8 buf
[4], *b0
=buf
, *b1
=buf
+1;
541 struct alauda_card
*card
;
542 struct mtd_info
*mtd
;
545 mtd
= kzalloc(sizeof(*mtd
), GFP_KERNEL
);
550 err
= alauda_get_media_status(al
, buf
);
558 err
= alauda_ack_media(al
);
564 err
= alauda_get_media_status(al
, buf
);
569 /* media not ready */
573 err
= alauda_get_media_signatures(al
, buf
);
577 card
= get_card(*b1
);
579 printk(KERN_ERR
"Alauda: unknown card id %02x\n", *b1
);
583 printk(KERN_INFO
"pagesize=%x\nerasesize=%x\nsize=%xMiB\n",
584 1<<card
->pageshift
, 1<<card
->blockshift
,
585 1<<(card
->chipshift
-20));
587 al
->pagemask
= (1 << (card
->blockshift
- card
->pageshift
)) - 1;
588 al
->bytemask
= (1 << card
->pageshift
) - 1;
589 al
->blockmask
= (1 << card
->blockshift
) - 1;
591 mtd
->name
= "alauda";
592 mtd
->size
= 1<<card
->chipshift
;
593 mtd
->erasesize
= 1<<card
->blockshift
;
594 mtd
->writesize
= 1<<card
->pageshift
;
595 mtd
->type
= MTD_NANDFLASH
;
596 mtd
->flags
= MTD_CAP_NANDFLASH
;
597 mtd
->read
= alauda_read
;
598 mtd
->write
= alauda_write
;
599 mtd
->erase
= alauda_erase
;
600 mtd
->block_isbad
= alauda_isbad
;
602 mtd
->owner
= THIS_MODULE
;
604 err
= add_mtd_device(mtd
);
611 alauda_reset(al
); /* no clue whether this is necessary */
618 static int alauda_check_media(struct alauda
*al
)
620 u8 buf
[2], *b0
= buf
, *b1
= buf
+1;
623 err
= alauda_get_media_status(al
, buf
);
627 if ((*b1
& 0x01) == 0) {
631 if ((*b0
& 0x80) || ((*b0
& 0x1F) == 0x10)) {
637 return alauda_init_media(al
);
642 static int alauda_probe(struct usb_interface
*interface
,
643 const struct usb_device_id
*id
)
646 struct usb_host_interface
*iface
;
647 struct usb_endpoint_descriptor
*ep
,
648 *ep_in
=NULL
, *ep_out
=NULL
, *ep_wr
=NULL
;
649 int i
, err
= -ENOMEM
;
651 al
= kzalloc(2*sizeof(*al
), GFP_KERNEL
);
655 kref_init(&al
->kref
);
656 usb_set_intfdata(interface
, al
);
658 al
->dev
= usb_get_dev(interface_to_usbdev(interface
));
659 al
->interface
= interface
;
661 iface
= interface
->cur_altsetting
;
662 for (i
= 0; i
< iface
->desc
.bNumEndpoints
; ++i
) {
663 ep
= &iface
->endpoint
[i
].desc
;
665 if (usb_endpoint_is_bulk_in(ep
)) {
667 } else if (usb_endpoint_is_bulk_out(ep
)) {
675 if (!ep_wr
|| !ep_in
|| !ep_out
)
678 al
->write_out
= usb_sndbulkpipe(al
->dev
,
679 usb_endpoint_num(ep_wr
));
680 al
->bulk_in
= usb_rcvbulkpipe(al
->dev
,
681 usb_endpoint_num(ep_in
));
682 al
->bulk_out
= usb_sndbulkpipe(al
->dev
,
683 usb_endpoint_num(ep_out
));
685 /* second device is identical up to now */
686 memcpy(al
+1, al
, sizeof(*al
));
688 mutex_init(&al
[0].card_mutex
);
689 mutex_init(&al
[1].card_mutex
);
691 al
[0].port
= ALAUDA_PORT_XD
;
692 al
[1].port
= ALAUDA_PORT_SM
;
694 dev_info(&interface
->dev
, "alauda probed\n");
695 alauda_check_media(al
);
696 alauda_check_media(al
+1);
702 kref_put(&al
->kref
, alauda_delete
);
706 static void alauda_disconnect(struct usb_interface
*interface
)
710 al
= usb_get_intfdata(interface
);
711 usb_set_intfdata(interface
, NULL
);
713 /* FIXME: prevent more I/O from starting */
715 /* decrement our usage count */
717 kref_put(&al
->kref
, alauda_delete
);
719 dev_info(&interface
->dev
, "alauda gone");
722 static struct usb_driver alauda_driver
= {
724 .probe
= alauda_probe
,
725 .disconnect
= alauda_disconnect
,
726 .id_table
= alauda_table
,
729 static int __init
alauda_init(void)
731 return usb_register(&alauda_driver
);
734 static void __exit
alauda_exit(void)
736 usb_deregister(&alauda_driver
);
739 module_init(alauda_init
);
740 module_exit(alauda_exit
);
742 MODULE_LICENSE("GPL");