aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAlex Dubov <oakad@yahoo.com>2008-02-09 13:20:54 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-09 14:08:34 -0500
commitbaf8532a147d5b76681ce040e2c8f25a3f0e718d (patch)
tree69c228046709295c1152f2063321327789c3b9f4 /include/linux
parent941edd030b9725f9f85bd62dfdb68cde3a50fb66 (diff)
memstick: initial commit for Sony MemoryStick support
Sony MemoryStick cards are used in many products manufactured by Sony. They are available both as storage and as IO expansion cards. Currently, only MemoryStick Pro storage cards are supported via TI FlashMedia MemoryStick interface. [mboton@gmail.com: biuld fix] [akpm@linux-foundation.org: build fix] Signed-off-by: Alex Dubov <oakad@yahoo.com> Signed-off-by: Miguel Boton <mboton@gmail.co> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/memstick.h299
-rw-r--r--include/linux/tifm.h4
2 files changed, 303 insertions, 0 deletions
diff --git a/include/linux/memstick.h b/include/linux/memstick.h
new file mode 100644
index 000000000000..334d059d6794
--- /dev/null
+++ b/include/linux/memstick.h
@@ -0,0 +1,299 @@
1/*
2 * Sony MemoryStick support
3 *
4 * Copyright (C) 2007 Alex Dubov <oakad@yahoo.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11
12#ifndef _MEMSTICK_H
13#define _MEMSTICK_H
14
15#include <linux/workqueue.h>
16#include <linux/scatterlist.h>
17#include <linux/device.h>
18
19/*** Hardware based structures ***/
20
21struct ms_status_register {
22 unsigned char reserved;
23 unsigned char interrupt;
24#define MEMSTICK_INT_CMDNAK 0x0001
25#define MEMSTICK_INT_BREQ 0x0020
26#define MEMSTICK_INT_ERR 0x0040
27#define MEMSTICK_INT_CED 0x0080
28
29 unsigned char status0;
30#define MEMSTICK_STATUS0_WP 0x0001
31#define MEMSTICK_STATUS0_SL 0x0002
32#define MEMSTICK_STATUS0_BF 0x0010
33#define MEMSTICK_STATUS0_BE 0x0020
34#define MEMSTICK_STATUS0_FB0 0x0040
35#define MEMSTICK_STATUS0_MB 0x0080
36
37 unsigned char status1;
38#define MEMSTICK_STATUS1_UCFG 0x0001
39#define MEMSTICK_STATUS1_FGER 0x0002
40#define MEMSTICK_STATUS1_UCEX 0x0004
41#define MEMSTICK_STATUS1_EXER 0x0008
42#define MEMSTICK_STATUS1_UCDT 0x0010
43#define MEMSTICK_STATUS1_DTER 0x0020
44#define MEMSTICK_STATUS1_FBI 0x0040
45#define MEMSTICK_STATUS1_MB 0x0080
46} __attribute__((packed));
47
48struct ms_id_register {
49 unsigned char type;
50 unsigned char reserved;
51 unsigned char category;
52 unsigned char class;
53} __attribute__((packed));
54
55struct ms_param_register {
56 unsigned char system;
57 unsigned char block_address_msb;
58 unsigned short block_address;
59 unsigned char cp;
60#define MEMSTICK_CP_BLOCK 0x0000
61#define MEMSTICK_CP_PAGE 0x0020
62#define MEMSTICK_CP_EXTRA 0x0040
63#define MEMSTICK_CP_OVERWRITE 0x0080
64
65 unsigned char page_address;
66} __attribute__((packed));
67
68struct ms_extra_data_register {
69 unsigned char overwrite_flag;
70#define MEMSTICK_OVERWRITE_UPDATA 0x0010
71#define MEMSTICK_OVERWRITE_PAGE 0x0060
72#define MEMSTICK_OVERWRITE_BLOCK 0x0080
73
74 unsigned char management_flag;
75#define MEMSTICK_MANAGEMENT_SYSTEM 0x0004
76#define MEMSTICK_MANAGEMENT_TRANS_TABLE 0x0008
77#define MEMSTICK_MANAGEMENT_COPY 0x0010
78#define MEMSTICK_MANAGEMENT_ACCESS 0x0020
79
80 unsigned short logical_address;
81} __attribute__((packed));
82
83struct ms_register {
84 struct ms_status_register status;
85 struct ms_id_register id;
86 unsigned char reserved[8];
87 struct ms_param_register param;
88 struct ms_extra_data_register extra_data;
89} __attribute__((packed));
90
91struct mspro_param_register {
92 unsigned char system;
93 unsigned short data_count;
94 unsigned int data_address;
95 unsigned char cmd_param;
96} __attribute__((packed));
97
98struct mspro_register {
99 struct ms_status_register status;
100 struct ms_id_register id;
101 unsigned char reserved[8];
102 struct mspro_param_register param;
103} __attribute__((packed));
104
105struct ms_register_addr {
106 unsigned char r_offset;
107 unsigned char r_length;
108 unsigned char w_offset;
109 unsigned char w_length;
110} __attribute__((packed));
111
112enum {
113 MS_TPC_READ_LONG_DATA = 0x02,
114 MS_TPC_READ_SHORT_DATA = 0x03,
115 MS_TPC_READ_REG = 0x04,
116 MS_TPC_READ_IO_DATA = 0x05, /* unverified */
117 MS_TPC_GET_INT = 0x07,
118 MS_TPC_SET_RW_REG_ADRS = 0x08,
119 MS_TPC_EX_SET_CMD = 0x09,
120 MS_TPC_WRITE_IO_DATA = 0x0a, /* unverified */
121 MS_TPC_WRITE_REG = 0x0b,
122 MS_TPC_WRITE_SHORT_DATA = 0x0c,
123 MS_TPC_WRITE_LONG_DATA = 0x0d,
124 MS_TPC_SET_CMD = 0x0e
125};
126
127enum {
128 MS_CMD_BLOCK_END = 0x33,
129 MS_CMD_RESET = 0x3c,
130 MS_CMD_BLOCK_WRITE = 0x55,
131 MS_CMD_SLEEP = 0x5a,
132 MS_CMD_BLOCK_ERASE = 0x99,
133 MS_CMD_BLOCK_READ = 0xaa,
134 MS_CMD_CLEAR_BUF = 0xc3,
135 MS_CMD_FLASH_STOP = 0xcc,
136 MSPRO_CMD_FORMAT = 0x10,
137 MSPRO_CMD_SLEEP = 0x11,
138 MSPRO_CMD_READ_DATA = 0x20,
139 MSPRO_CMD_WRITE_DATA = 0x21,
140 MSPRO_CMD_READ_ATRB = 0x24,
141 MSPRO_CMD_STOP = 0x25,
142 MSPRO_CMD_ERASE = 0x26,
143 MSPRO_CMD_SET_IBA = 0x46,
144 MSPRO_CMD_SET_IBD = 0x47
145/*
146 MSPRO_CMD_RESET
147 MSPRO_CMD_WAKEUP
148 MSPRO_CMD_IN_IO_DATA
149 MSPRO_CMD_OUT_IO_DATA
150 MSPRO_CMD_READ_IO_ATRB
151 MSPRO_CMD_IN_IO_FIFO
152 MSPRO_CMD_OUT_IO_FIFO
153 MSPRO_CMD_IN_IOM
154 MSPRO_CMD_OUT_IOM
155*/
156};
157
158/*** Driver structures and functions ***/
159
160#define MEMSTICK_PART_SHIFT 3
161
162enum memstick_param { MEMSTICK_POWER = 1, MEMSTICK_INTERFACE };
163
164#define MEMSTICK_POWER_OFF 0
165#define MEMSTICK_POWER_ON 1
166
167#define MEMSTICK_SERIAL 0
168#define MEMSTICK_PARALLEL 1
169
170struct memstick_host;
171struct memstick_driver;
172
173#define MEMSTICK_MATCH_ALL 0x01
174
175#define MEMSTICK_TYPE_LEGACY 0xff
176#define MEMSTICK_TYPE_DUO 0x00
177#define MEMSTICK_TYPE_PRO 0x01
178
179#define MEMSTICK_CATEGORY_STORAGE 0xff
180#define MEMSTICK_CATEGORY_STORAGE_DUO 0x00
181
182#define MEMSTICK_CLASS_GENERIC 0xff
183#define MEMSTICK_CLASS_GENERIC_DUO 0x00
184
185
186struct memstick_device_id {
187 unsigned char match_flags;
188 unsigned char type;
189 unsigned char category;
190 unsigned char class;
191};
192
193struct memstick_request {
194 unsigned char tpc;
195 unsigned char data_dir:1,
196 need_card_int:1,
197 get_int_reg:1,
198 io_type:2;
199#define MEMSTICK_IO_NONE 0
200#define MEMSTICK_IO_VAL 1
201#define MEMSTICK_IO_SG 2
202
203 unsigned char int_reg;
204 int error;
205 union {
206 struct scatterlist sg;
207 struct {
208 unsigned char data_len;
209 unsigned char data[15];
210 };
211 };
212};
213
214struct memstick_dev {
215 struct memstick_device_id id;
216 struct memstick_host *host;
217 struct ms_register_addr reg_addr;
218 struct completion mrq_complete;
219 struct memstick_request current_mrq;
220
221 /* Check that media driver is still willing to operate the device. */
222 int (*check)(struct memstick_dev *card);
223 /* Get next request from the media driver. */
224 int (*next_request)(struct memstick_dev *card,
225 struct memstick_request **mrq);
226
227 struct device dev;
228};
229
230struct memstick_host {
231 struct mutex lock;
232 unsigned int id;
233 unsigned int caps;
234#define MEMSTICK_CAP_PARALLEL 1
235#define MEMSTICK_CAP_AUTO_GET_INT 2
236
237 struct work_struct media_checker;
238 struct class_device cdev;
239
240 struct memstick_dev *card;
241 unsigned int retries;
242
243 /* Notify the host that some requests are pending. */
244 void (*request)(struct memstick_host *host);
245 /* Set host IO parameters (power, clock, etc). */
246 void (*set_param)(struct memstick_host *host,
247 enum memstick_param param,
248 int value);
249 unsigned long private[0] ____cacheline_aligned;
250};
251
252struct memstick_driver {
253 struct memstick_device_id *id_table;
254 int (*probe)(struct memstick_dev *card);
255 void (*remove)(struct memstick_dev *card);
256 int (*suspend)(struct memstick_dev *card,
257 pm_message_t state);
258 int (*resume)(struct memstick_dev *card);
259
260 struct device_driver driver;
261};
262
263int memstick_register_driver(struct memstick_driver *drv);
264void memstick_unregister_driver(struct memstick_driver *drv);
265
266struct memstick_host *memstick_alloc_host(unsigned int extra,
267 struct device *dev);
268
269int memstick_add_host(struct memstick_host *host);
270void memstick_remove_host(struct memstick_host *host);
271void memstick_free_host(struct memstick_host *host);
272void memstick_detect_change(struct memstick_host *host);
273
274void memstick_init_req_sg(struct memstick_request *mrq, unsigned char tpc,
275 struct scatterlist *sg);
276void memstick_init_req(struct memstick_request *mrq, unsigned char tpc,
277 void *buf, size_t length);
278int memstick_next_req(struct memstick_host *host,
279 struct memstick_request **mrq);
280void memstick_new_req(struct memstick_host *host);
281
282int memstick_set_rw_addr(struct memstick_dev *card);
283
284static inline void *memstick_priv(struct memstick_host *host)
285{
286 return (void *)host->private;
287}
288
289static inline void *memstick_get_drvdata(struct memstick_dev *card)
290{
291 return dev_get_drvdata(&card->dev);
292}
293
294static inline void memstick_set_drvdata(struct memstick_dev *card, void *data)
295{
296 dev_set_drvdata(&card->dev, data);
297}
298
299#endif
diff --git a/include/linux/tifm.h b/include/linux/tifm.h
index 2096b76d0cee..da76ed85f595 100644
--- a/include/linux/tifm.h
+++ b/include/linux/tifm.h
@@ -72,6 +72,7 @@ enum {
72#define TIFM_FIFO_READY 0x00000001 72#define TIFM_FIFO_READY 0x00000001
73#define TIFM_FIFO_INT_SETALL 0x0000ffff 73#define TIFM_FIFO_INT_SETALL 0x0000ffff
74#define TIFM_FIFO_INTMASK 0x00000005 74#define TIFM_FIFO_INTMASK 0x00000005
75#define TIFM_FIFO_SIZE 0x00000200
75 76
76#define TIFM_DMA_RESET 0x00000002 77#define TIFM_DMA_RESET 0x00000002
77#define TIFM_DMA_TX 0x00008000 78#define TIFM_DMA_TX 0x00008000
@@ -124,6 +125,8 @@ struct tifm_adapter {
124 125
125 void (*eject)(struct tifm_adapter *fm, 126 void (*eject)(struct tifm_adapter *fm,
126 struct tifm_dev *sock); 127 struct tifm_dev *sock);
128 int (*has_ms_pif)(struct tifm_adapter *fm,
129 struct tifm_dev *sock);
127 130
128 struct tifm_dev *sockets[0]; 131 struct tifm_dev *sockets[0];
129}; 132};
@@ -141,6 +144,7 @@ struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id,
141int tifm_register_driver(struct tifm_driver *drv); 144int tifm_register_driver(struct tifm_driver *drv);
142void tifm_unregister_driver(struct tifm_driver *drv); 145void tifm_unregister_driver(struct tifm_driver *drv);
143void tifm_eject(struct tifm_dev *sock); 146void tifm_eject(struct tifm_dev *sock);
147int tifm_has_ms_pif(struct tifm_dev *sock);
144int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents, 148int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
145 int direction); 149 int direction);
146void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents, 150void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,