Lines Matching +full:s +full:- +full:mode
4 * Copyright (c) 2007-2009 CodeSourcery.
10 * Validated with U-Boot v2021.01 and Linux v5.10 mmc_spi driver
14 * Contributions after 2012-01-13 are licensed under the terms of the
22 #include "hw/qdev-properties.h"
25 #include "qemu/crc-ccitt.h"
57 uint32_t mode; member
70 #define TYPE_SSI_SD "ssi-sd"
97 /* dummy value - don't care */ in OBJECT_DECLARE_SIMPLE_TYPE()
105 ssi_sd_state *s = SSI_SD(dev); in OBJECT_DECLARE_SIMPLE_TYPE() local
116 * - CMD12 issued at the timing that end bit of CMD12 and end bit of in OBJECT_DECLARE_SIMPLE_TYPE()
118 * - CMD12 issued after one clock cycle after host receives a token in OBJECT_DECLARE_SIMPLE_TYPE()
123 if (s->mode >= SSI_SD_PREP_DATA && s->mode <= SSI_SD_DATA_CRC16) { in OBJECT_DECLARE_SIMPLE_TYPE()
125 s->mode = SSI_SD_CMD; in OBJECT_DECLARE_SIMPLE_TYPE()
127 s->stopping = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
131 switch (s->mode) { in OBJECT_DECLARE_SIMPLE_TYPE()
141 s->mode = SSI_SD_DATA_WRITE; in OBJECT_DECLARE_SIMPLE_TYPE()
149 s->arglen = sdbus_do_command(&s->sdbus, &request, longresp); in OBJECT_DECLARE_SIMPLE_TYPE()
150 if (s->arglen <= 0) { in OBJECT_DECLARE_SIMPLE_TYPE()
151 s->arglen = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
153 s->response[0] = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
156 s->arglen = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
157 /* a non-zero value indicates the card is ready */ in OBJECT_DECLARE_SIMPLE_TYPE()
158 s->response[0] = SSI_DUMMY; in OBJECT_DECLARE_SIMPLE_TYPE()
164 s->cmd = val & 0x3f; in OBJECT_DECLARE_SIMPLE_TYPE()
165 s->mode = SSI_SD_CMDARG; in OBJECT_DECLARE_SIMPLE_TYPE()
166 s->arglen = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
169 if (s->arglen == 4) { in OBJECT_DECLARE_SIMPLE_TYPE()
171 request.cmd = s->cmd; in OBJECT_DECLARE_SIMPLE_TYPE()
172 request.arg = ldl_be_p(s->cmdarg); in OBJECT_DECLARE_SIMPLE_TYPE()
173 DPRINTF("CMD%d arg 0x%08x\n", s->cmd, request.arg); in OBJECT_DECLARE_SIMPLE_TYPE()
174 s->arglen = sdbus_do_command(&s->sdbus, &request, longresp); in OBJECT_DECLARE_SIMPLE_TYPE()
175 if (s->arglen <= 0) { in OBJECT_DECLARE_SIMPLE_TYPE()
176 s->arglen = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
177 s->response[0] = 4; in OBJECT_DECLARE_SIMPLE_TYPE()
179 } else if (s->cmd == 8 || s->cmd == 58) { in OBJECT_DECLARE_SIMPLE_TYPE()
182 s->arglen = 5; in OBJECT_DECLARE_SIMPLE_TYPE()
183 s->response[0] = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
184 memcpy(&s->response[1], longresp, 4); in OBJECT_DECLARE_SIMPLE_TYPE()
185 } else if (s->arglen != 4) { in OBJECT_DECLARE_SIMPLE_TYPE()
186 BADF("Unexpected response to cmd %d\n", s->cmd); in OBJECT_DECLARE_SIMPLE_TYPE()
188 s->arglen = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
189 s->response[0] = 4; in OBJECT_DECLARE_SIMPLE_TYPE()
194 /* CMD13 returns a 2-byte statuse work. Other commands in OBJECT_DECLARE_SIMPLE_TYPE()
196 s->arglen = (s->cmd == 13) ? 2 : 1; in OBJECT_DECLARE_SIMPLE_TYPE()
199 if (s->cmd == 28 || s->cmd == 29 || s->cmd == 38) { in OBJECT_DECLARE_SIMPLE_TYPE()
200 s->stopping = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
234 assume it's set if the second byte is nonzero. */ in OBJECT_DECLARE_SIMPLE_TYPE()
237 s->response[0] = status >> 8; in OBJECT_DECLARE_SIMPLE_TYPE()
238 s->response[1] = status; in OBJECT_DECLARE_SIMPLE_TYPE()
241 s->mode = SSI_SD_PREP_RESP; in OBJECT_DECLARE_SIMPLE_TYPE()
242 s->response_pos = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
244 s->cmdarg[s->arglen++] = val; in OBJECT_DECLARE_SIMPLE_TYPE()
249 s->mode = SSI_SD_RESPONSE; in OBJECT_DECLARE_SIMPLE_TYPE()
252 if (s->response_pos < s->arglen) { in OBJECT_DECLARE_SIMPLE_TYPE()
253 DPRINTF("Response 0x%02x\n", s->response[s->response_pos]); in OBJECT_DECLARE_SIMPLE_TYPE()
254 return s->response[s->response_pos++]; in OBJECT_DECLARE_SIMPLE_TYPE()
256 if (s->stopping) { in OBJECT_DECLARE_SIMPLE_TYPE()
257 s->stopping = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
258 s->mode = SSI_SD_CMD; in OBJECT_DECLARE_SIMPLE_TYPE()
261 if (sdbus_data_ready(&s->sdbus)) { in OBJECT_DECLARE_SIMPLE_TYPE()
263 s->mode = SSI_SD_DATA_START; in OBJECT_DECLARE_SIMPLE_TYPE()
266 s->mode = SSI_SD_CMD; in OBJECT_DECLARE_SIMPLE_TYPE()
271 s->mode = SSI_SD_DATA_START; in OBJECT_DECLARE_SIMPLE_TYPE()
275 s->mode = SSI_SD_DATA_READ; in OBJECT_DECLARE_SIMPLE_TYPE()
276 s->response_pos = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
279 val = sdbus_read_byte(&s->sdbus); in OBJECT_DECLARE_SIMPLE_TYPE()
280 s->read_bytes++; in OBJECT_DECLARE_SIMPLE_TYPE()
281 s->crc16 = crc_ccitt_false(s->crc16, (uint8_t *)&val, 1); in OBJECT_DECLARE_SIMPLE_TYPE()
282 if (!sdbus_data_ready(&s->sdbus) || s->read_bytes == 512) { in OBJECT_DECLARE_SIMPLE_TYPE()
284 s->mode = SSI_SD_DATA_CRC16; in OBJECT_DECLARE_SIMPLE_TYPE()
288 val = (s->crc16 & 0xff00) >> 8; in OBJECT_DECLARE_SIMPLE_TYPE()
289 s->crc16 <<= 8; in OBJECT_DECLARE_SIMPLE_TYPE()
290 s->response_pos++; in OBJECT_DECLARE_SIMPLE_TYPE()
291 if (s->response_pos == 2) { in OBJECT_DECLARE_SIMPLE_TYPE()
293 if (s->read_bytes == 512 && s->cmd != 17) { in OBJECT_DECLARE_SIMPLE_TYPE()
294 s->mode = SSI_SD_PREP_DATA; in OBJECT_DECLARE_SIMPLE_TYPE()
296 s->mode = SSI_SD_CMD; in OBJECT_DECLARE_SIMPLE_TYPE()
298 s->read_bytes = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
299 s->response_pos = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
303 sdbus_write_byte(&s->sdbus, val); in OBJECT_DECLARE_SIMPLE_TYPE()
304 s->write_bytes++; in OBJECT_DECLARE_SIMPLE_TYPE()
305 if (!sdbus_receive_ready(&s->sdbus) || s->write_bytes == 512) { in OBJECT_DECLARE_SIMPLE_TYPE()
307 s->mode = SSI_SD_SKIP_CRC16; in OBJECT_DECLARE_SIMPLE_TYPE()
308 s->response_pos = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
313 s->response_pos++; in OBJECT_DECLARE_SIMPLE_TYPE()
314 if (s->response_pos == 2) { in OBJECT_DECLARE_SIMPLE_TYPE()
316 s->mode = SSI_SD_RESPONSE; in OBJECT_DECLARE_SIMPLE_TYPE()
317 s->write_bytes = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
318 s->arglen = 1; in OBJECT_DECLARE_SIMPLE_TYPE()
319 s->response[0] = DATA_RESPONSE_ACCEPTED; in OBJECT_DECLARE_SIMPLE_TYPE()
320 s->response_pos = 0; in OBJECT_DECLARE_SIMPLE_TYPE()
330 ssi_sd_state *s = (ssi_sd_state *)opaque; in ssi_sd_post_load() local
332 if (s->mode > SSI_SD_SKIP_CRC16) { in ssi_sd_post_load()
333 return -EINVAL; in ssi_sd_post_load()
335 if (s->mode == SSI_SD_CMDARG && in ssi_sd_post_load()
336 (s->arglen < 0 || s->arglen >= ARRAY_SIZE(s->cmdarg))) { in ssi_sd_post_load()
337 return -EINVAL; in ssi_sd_post_load()
339 if (s->mode == SSI_SD_RESPONSE && in ssi_sd_post_load()
340 (s->response_pos < 0 || s->response_pos >= ARRAY_SIZE(s->response) || in ssi_sd_post_load()
341 (!s->stopping && s->arglen > ARRAY_SIZE(s->response)))) { in ssi_sd_post_load()
342 return -EINVAL; in ssi_sd_post_load()
354 VMSTATE_UINT32(mode, ssi_sd_state),
371 ssi_sd_state *s = SSI_SD(d); in ssi_sd_realize() local
373 qbus_init(&s->sdbus, sizeof(s->sdbus), TYPE_SD_BUS, DEVICE(d), "sd-bus"); in ssi_sd_realize()
378 ssi_sd_state *s = SSI_SD(dev); in ssi_sd_reset() local
380 s->mode = SSI_SD_CMD; in ssi_sd_reset()
381 s->cmd = 0; in ssi_sd_reset()
382 memset(s->cmdarg, 0, sizeof(s->cmdarg)); in ssi_sd_reset()
383 memset(s->response, 0, sizeof(s->response)); in ssi_sd_reset()
384 s->crc16 = 0; in ssi_sd_reset()
385 s->read_bytes = 0; in ssi_sd_reset()
386 s->write_bytes = 0; in ssi_sd_reset()
387 s->arglen = 0; in ssi_sd_reset()
388 s->response_pos = 0; in ssi_sd_reset()
389 s->stopping = 0; in ssi_sd_reset()
397 k->realize = ssi_sd_realize; in ssi_sd_class_init()
398 k->transfer = ssi_sd_transfer; in ssi_sd_class_init()
399 k->cs_polarity = SSI_CS_LOW; in ssi_sd_class_init()
400 dc->vmsd = &vmstate_ssi_sd; in ssi_sd_class_init()
402 /* Reason: GPIO chip-select line should be wired up */ in ssi_sd_class_init()
403 dc->user_creatable = false; in ssi_sd_class_init()