Lines Matching +full:mmc +full:-

1 // SPDX-License-Identifier: GPL-2.0+
3 * dfu.c -- DFU back-end routines
16 #include <mmc.h>
25 struct mmc *mmc; in mmc_block_op() local
29 mmc = find_mmc_device(dfu->data.mmc.dev_num); in mmc_block_op()
30 if (!mmc) { in mmc_block_op()
31 pr_err("Device MMC %d - not found!", dfu->data.mmc.dev_num); in mmc_block_op()
32 return -ENODEV; in mmc_block_op()
39 *len = ALIGN(*len, dfu->data.mmc.lba_blk_size); in mmc_block_op()
41 blk_start = dfu->data.mmc.lba_start + in mmc_block_op()
42 (u32)lldiv(offset, dfu->data.mmc.lba_blk_size); in mmc_block_op()
43 blk_count = *len / dfu->data.mmc.lba_blk_size; in mmc_block_op()
45 dfu->data.mmc.lba_start + dfu->data.mmc.lba_size) { in mmc_block_op()
47 return -EINVAL; in mmc_block_op()
50 if (dfu->data.mmc.hw_partition >= 0) { in mmc_block_op()
51 part_num_bkp = mmc_get_blk_desc(mmc)->hwpart; in mmc_block_op()
53 dfu->data.mmc.dev_num, in mmc_block_op()
54 dfu->data.mmc.hw_partition); in mmc_block_op()
60 op == DFU_OP_READ ? "MMC READ" : "MMC WRITE", in mmc_block_op()
61 dfu->data.mmc.dev_num, blk_start, blk_count, buf); in mmc_block_op()
64 n = blk_dread(mmc_get_blk_desc(mmc), blk_start, blk_count, buf); in mmc_block_op()
67 n = blk_dwrite(mmc_get_blk_desc(mmc), blk_start, blk_count, in mmc_block_op()
75 pr_err("MMC operation failed"); in mmc_block_op()
76 if (dfu->data.mmc.hw_partition >= 0) in mmc_block_op()
78 dfu->data.mmc.dev_num, in mmc_block_op()
80 return -EIO; in mmc_block_op()
83 if (dfu->data.mmc.hw_partition >= 0) { in mmc_block_op()
85 dfu->data.mmc.dev_num, in mmc_block_op()
98 return -EINVAL; in mmc_file_buffer()
116 switch (dfu->layout) { in mmc_file_op()
125 dfu_get_layout(dfu->layout)); in mmc_file_op()
126 return -1; in mmc_file_op()
130 dfu->data.mmc.dev, dfu->data.mmc.part); in mmc_file_op()
132 ret = fs_set_blk_dev("mmc", dev_part_str, fstype); in mmc_file_op()
140 ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size); in mmc_file_op()
148 ret = fs_write(dfu->name, (size_t)buf, 0, *len, &size); in mmc_file_op()
155 ret = fs_size(dfu->name, &size); in mmc_file_op()
163 return -1; in mmc_file_op()
172 int ret = -1; in dfu_write_medium_mmc()
174 switch (dfu->layout) { in dfu_write_medium_mmc()
184 dfu_get_layout(dfu->layout)); in dfu_write_medium_mmc()
194 if (dfu->layout != DFU_RAW_ADDR) { in dfu_flush_medium_mmc()
210 switch (dfu->layout) { in dfu_get_medium_size_mmc()
212 *size = dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size; in dfu_get_medium_size_mmc()
216 dfu_file_buf_filled = -1; in dfu_get_medium_size_mmc()
221 return -1; in dfu_get_medium_size_mmc()
225 dfu_get_layout(dfu->layout)); in dfu_get_medium_size_mmc()
226 return -1; in dfu_get_medium_size_mmc()
236 if (dfu_file_buf_filled == -1) { in mmc_file_unbuffer()
243 return -EINVAL; in mmc_file_unbuffer()
254 int ret = -1; in dfu_read_medium_mmc()
256 switch (dfu->layout) { in dfu_read_medium_mmc()
266 dfu_get_layout(dfu->layout)); in dfu_read_medium_mmc()
281 * @param s Parameter string containing space-separated arguments:
299 struct mmc *mmc; in dfu_fill_entity_mmc() local
304 dfu->data.mmc.dev_num = simple_strtoul(devstr, NULL, 10); in dfu_fill_entity_mmc()
310 return -ENODEV; in dfu_fill_entity_mmc()
322 mmc = find_mmc_device(dfu->data.mmc.dev_num); in dfu_fill_entity_mmc()
323 if (mmc == NULL) { in dfu_fill_entity_mmc()
324 pr_err("Couldn't find MMC device no. %d.\n", in dfu_fill_entity_mmc()
325 dfu->data.mmc.dev_num); in dfu_fill_entity_mmc()
326 return -ENODEV; in dfu_fill_entity_mmc()
329 if (mmc_init(mmc)) { in dfu_fill_entity_mmc()
330 pr_err("Couldn't init MMC device.\n"); in dfu_fill_entity_mmc()
331 return -ENODEV; in dfu_fill_entity_mmc()
334 dfu->data.mmc.hw_partition = -EINVAL; in dfu_fill_entity_mmc()
336 dfu->layout = DFU_RAW_ADDR; in dfu_fill_entity_mmc()
337 dfu->data.mmc.lba_start = second_arg; in dfu_fill_entity_mmc()
338 dfu->data.mmc.lba_size = third_arg; in dfu_fill_entity_mmc()
339 dfu->data.mmc.lba_blk_size = mmc->read_bl_len; in dfu_fill_entity_mmc()
343 * specifying the mmc HW defined partition number in dfu_fill_entity_mmc()
347 dfu->data.mmc.hw_partition = in dfu_fill_entity_mmc()
352 struct blk_desc *blk_dev = mmc_get_blk_desc(mmc); in dfu_fill_entity_mmc()
357 pr_err("Couldn't find part #%d on mmc device #%d\n", in dfu_fill_entity_mmc()
359 return -ENODEV; in dfu_fill_entity_mmc()
362 dfu->layout = DFU_RAW_ADDR; in dfu_fill_entity_mmc()
363 dfu->data.mmc.lba_start = partinfo.start; in dfu_fill_entity_mmc()
364 dfu->data.mmc.lba_size = partinfo.size; in dfu_fill_entity_mmc()
365 dfu->data.mmc.lba_blk_size = partinfo.blksz; in dfu_fill_entity_mmc()
367 dfu->layout = DFU_FS_FAT; in dfu_fill_entity_mmc()
369 dfu->layout = DFU_FS_EXT4; in dfu_fill_entity_mmc()
372 return -ENODEV; in dfu_fill_entity_mmc()
377 dfu->data.mmc.dev = second_arg; in dfu_fill_entity_mmc()
378 dfu->data.mmc.part = third_arg; in dfu_fill_entity_mmc()
381 dfu->dev_type = DFU_DEV_MMC; in dfu_fill_entity_mmc()
382 dfu->get_medium_size = dfu_get_medium_size_mmc; in dfu_fill_entity_mmc()
383 dfu->read_medium = dfu_read_medium_mmc; in dfu_fill_entity_mmc()
384 dfu->write_medium = dfu_write_medium_mmc; in dfu_fill_entity_mmc()
385 dfu->flush_medium = dfu_flush_medium_mmc; in dfu_fill_entity_mmc()
386 dfu->inited = 0; in dfu_fill_entity_mmc()
387 dfu->free_entity = dfu_free_entity_mmc; in dfu_fill_entity_mmc()
396 return -ENOMEM; in dfu_fill_entity_mmc()