Lines Matching +full:mmc +full:-
2 * dfu.c -- DFU back-end routines
7 * SPDX-License-Identifier: GPL-2.0+
17 #include <mmc.h>
26 struct mmc *mmc; in mmc_block_op() local
30 mmc = find_mmc_device(dfu->data.mmc.dev_num); in mmc_block_op()
31 if (!mmc) { in mmc_block_op()
32 pr_err("Device MMC %d - not found!", dfu->data.mmc.dev_num); in mmc_block_op()
33 return -ENODEV; in mmc_block_op()
40 *len = ALIGN(*len, dfu->data.mmc.lba_blk_size); in mmc_block_op()
42 blk_start = dfu->data.mmc.lba_start + in mmc_block_op()
43 (u32)lldiv(offset, dfu->data.mmc.lba_blk_size); in mmc_block_op()
44 blk_count = *len / dfu->data.mmc.lba_blk_size; in mmc_block_op()
46 dfu->data.mmc.lba_start + dfu->data.mmc.lba_size) { in mmc_block_op()
48 return -EINVAL; in mmc_block_op()
51 if (dfu->data.mmc.hw_partition >= 0) { in mmc_block_op()
52 part_num_bkp = mmc_get_blk_desc(mmc)->hwpart; in mmc_block_op()
54 dfu->data.mmc.dev_num, in mmc_block_op()
55 dfu->data.mmc.hw_partition); in mmc_block_op()
61 op == DFU_OP_READ ? "MMC READ" : "MMC WRITE", in mmc_block_op()
62 dfu->data.mmc.dev_num, blk_start, blk_count, buf); in mmc_block_op()
65 n = blk_dread(mmc_get_blk_desc(mmc), blk_start, blk_count, buf); in mmc_block_op()
68 n = blk_dwrite(mmc_get_blk_desc(mmc), blk_start, blk_count, in mmc_block_op()
76 pr_err("MMC operation failed"); in mmc_block_op()
77 if (dfu->data.mmc.hw_partition >= 0) in mmc_block_op()
79 dfu->data.mmc.dev_num, in mmc_block_op()
81 return -EIO; in mmc_block_op()
84 if (dfu->data.mmc.hw_partition >= 0) { in mmc_block_op()
86 dfu->data.mmc.dev_num, in mmc_block_op()
99 return -EINVAL; in mmc_file_buffer()
117 switch (dfu->layout) { in mmc_file_op()
126 dfu_get_layout(dfu->layout)); in mmc_file_op()
127 return -1; in mmc_file_op()
141 return -1; in mmc_file_op()
144 sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname, in mmc_file_op()
145 dfu->data.mmc.dev, dfu->data.mmc.part); in mmc_file_op()
150 sprintf(cmd_buf + strlen(cmd_buf), " %s", dfu->name); in mmc_file_op()
167 return -1; in mmc_file_op()
178 int ret = -1; in dfu_write_medium_mmc()
180 switch (dfu->layout) { in dfu_write_medium_mmc()
190 dfu_get_layout(dfu->layout)); in dfu_write_medium_mmc()
200 if (dfu->layout != DFU_RAW_ADDR) { in dfu_flush_medium_mmc()
216 switch (dfu->layout) { in dfu_get_medium_size_mmc()
218 *size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size; in dfu_get_medium_size_mmc()
222 dfu_file_buf_filled = -1; in dfu_get_medium_size_mmc()
227 return -1; in dfu_get_medium_size_mmc()
231 dfu_get_layout(dfu->layout)); in dfu_get_medium_size_mmc()
232 return -1; in dfu_get_medium_size_mmc()
242 if (dfu_file_buf_filled == -1) { in mmc_file_unbuffer()
249 return -EINVAL; in mmc_file_unbuffer()
260 int ret = -1; in dfu_read_medium_mmc()
262 switch (dfu->layout) { in dfu_read_medium_mmc()
272 dfu_get_layout(dfu->layout)); in dfu_read_medium_mmc()
287 * @param s Parameter string containing space-separated arguments:
305 struct mmc *mmc; in dfu_fill_entity_mmc() local
310 dfu->data.mmc.dev_num = simple_strtoul(devstr, NULL, 10); in dfu_fill_entity_mmc()
316 return -ENODEV; in dfu_fill_entity_mmc()
328 mmc = find_mmc_device(dfu->data.mmc.dev_num); in dfu_fill_entity_mmc()
329 if (mmc == NULL) { in dfu_fill_entity_mmc()
330 pr_err("Couldn't find MMC device no. %d.\n", in dfu_fill_entity_mmc()
331 dfu->data.mmc.dev_num); in dfu_fill_entity_mmc()
332 return -ENODEV; in dfu_fill_entity_mmc()
335 if (mmc_init(mmc)) { in dfu_fill_entity_mmc()
336 pr_err("Couldn't init MMC device.\n"); in dfu_fill_entity_mmc()
337 return -ENODEV; in dfu_fill_entity_mmc()
340 dfu->data.mmc.hw_partition = -EINVAL; in dfu_fill_entity_mmc()
342 dfu->layout = DFU_RAW_ADDR; in dfu_fill_entity_mmc()
343 dfu->data.mmc.lba_start = second_arg; in dfu_fill_entity_mmc()
344 dfu->data.mmc.lba_size = third_arg; in dfu_fill_entity_mmc()
345 dfu->data.mmc.lba_blk_size = mmc->read_bl_len; in dfu_fill_entity_mmc()
349 * specifying the mmc HW defined partition number in dfu_fill_entity_mmc()
353 dfu->data.mmc.hw_partition = in dfu_fill_entity_mmc()
358 struct blk_desc *blk_dev = mmc_get_blk_desc(mmc); in dfu_fill_entity_mmc()
363 pr_err("Couldn't find part #%d on mmc device #%d\n", in dfu_fill_entity_mmc()
365 return -ENODEV; in dfu_fill_entity_mmc()
368 dfu->layout = DFU_RAW_ADDR; in dfu_fill_entity_mmc()
369 dfu->data.mmc.lba_start = partinfo.start; in dfu_fill_entity_mmc()
370 dfu->data.mmc.lba_size = partinfo.size; in dfu_fill_entity_mmc()
371 dfu->data.mmc.lba_blk_size = partinfo.blksz; in dfu_fill_entity_mmc()
373 dfu->layout = DFU_FS_FAT; in dfu_fill_entity_mmc()
375 dfu->layout = DFU_FS_EXT4; in dfu_fill_entity_mmc()
378 return -ENODEV; in dfu_fill_entity_mmc()
383 dfu->data.mmc.dev = second_arg; in dfu_fill_entity_mmc()
384 dfu->data.mmc.part = third_arg; in dfu_fill_entity_mmc()
387 dfu->dev_type = DFU_DEV_MMC; in dfu_fill_entity_mmc()
388 dfu->get_medium_size = dfu_get_medium_size_mmc; in dfu_fill_entity_mmc()
389 dfu->read_medium = dfu_read_medium_mmc; in dfu_fill_entity_mmc()
390 dfu->write_medium = dfu_write_medium_mmc; in dfu_fill_entity_mmc()
391 dfu->flush_medium = dfu_flush_medium_mmc; in dfu_fill_entity_mmc()
392 dfu->inited = 0; in dfu_fill_entity_mmc()
393 dfu->free_entity = dfu_free_entity_mmc; in dfu_fill_entity_mmc()
402 return -ENOMEM; in dfu_fill_entity_mmc()