]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/dfu/dfu_sf.c
2 * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
4 * SPDX-License-Identifier: GPL-2.0+
13 #include <spi_flash.h>
15 static int dfu_get_medium_size_sf(struct dfu_entity
*dfu
, u64
*size
)
17 *size
= dfu
->data
.sf
.size
;
22 static int dfu_read_medium_sf(struct dfu_entity
*dfu
, u64 offset
, void *buf
,
25 return spi_flash_read(dfu
->data
.sf
.dev
, dfu
->data
.sf
.start
+ offset
,
29 static u64
find_sector(struct dfu_entity
*dfu
, u64 start
, u64 offset
)
31 return (lldiv((start
+ offset
), dfu
->data
.sf
.dev
->sector_size
)) *
32 dfu
->data
.sf
.dev
->sector_size
;
35 static int dfu_write_medium_sf(struct dfu_entity
*dfu
,
36 u64 offset
, void *buf
, long *len
)
40 ret
= spi_flash_erase(dfu
->data
.sf
.dev
,
41 find_sector(dfu
, dfu
->data
.sf
.start
, offset
),
42 dfu
->data
.sf
.dev
->sector_size
);
46 ret
= spi_flash_write(dfu
->data
.sf
.dev
, dfu
->data
.sf
.start
+ offset
,
54 static int dfu_flush_medium_sf(struct dfu_entity
*dfu
)
59 static unsigned int dfu_polltimeout_sf(struct dfu_entity
*dfu
)
61 return DFU_DEFAULT_POLL_TIMEOUT
;
64 static void dfu_free_entity_sf(struct dfu_entity
*dfu
)
66 spi_flash_free(dfu
->data
.sf
.dev
);
69 static struct spi_flash
*parse_dev(char *devstr
)
73 unsigned int speed
= CONFIG_SF_DEFAULT_SPEED
;
74 unsigned int mode
= CONFIG_SF_DEFAULT_MODE
;
76 struct spi_flash
*dev
;
78 s
= strsep(&devstr
, ":");
79 if (!s
|| !*s
|| (bus
= simple_strtoul(s
, &endp
, 0), *endp
)) {
80 printf("Invalid SPI bus %s\n", s
);
84 s
= strsep(&devstr
, ":");
85 if (!s
|| !*s
|| (cs
= simple_strtoul(s
, &endp
, 0), *endp
)) {
86 printf("Invalid SPI chip-select %s\n", s
);
90 s
= strsep(&devstr
, ":");
92 speed
= simple_strtoul(s
, &endp
, 0);
93 if (*endp
|| !speed
) {
94 printf("Invalid SPI speed %s\n", s
);
99 s
= strsep(&devstr
, ":");
101 mode
= simple_strtoul(s
, &endp
, 0);
102 if (*endp
|| mode
> 3) {
103 printf("Invalid SPI mode %s\n", s
);
108 dev
= spi_flash_probe(bus
, cs
, speed
, mode
);
110 printf("Failed to create SPI flash at %d:%d:%d:%d\n",
111 bus
, cs
, speed
, mode
);
118 int dfu_fill_entity_sf(struct dfu_entity
*dfu
, char *devstr
, char *s
)
121 char *devstr_bkup
= strdup(devstr
);
123 dfu
->data
.sf
.dev
= parse_dev(devstr_bkup
);
125 if (!dfu
->data
.sf
.dev
)
128 dfu
->dev_type
= DFU_DEV_SF
;
129 dfu
->max_buf_size
= dfu
->data
.sf
.dev
->sector_size
;
131 st
= strsep(&s
, " ");
132 if (!strcmp(st
, "raw")) {
133 dfu
->layout
= DFU_RAW_ADDR
;
134 dfu
->data
.sf
.start
= simple_strtoul(s
, &s
, 16);
136 dfu
->data
.sf
.size
= simple_strtoul(s
, &s
, 16);
138 printf("%s: Memory layout (%s) not supported!\n", __func__
, st
);
139 spi_flash_free(dfu
->data
.sf
.dev
);
143 dfu
->get_medium_size
= dfu_get_medium_size_sf
;
144 dfu
->read_medium
= dfu_read_medium_sf
;
145 dfu
->write_medium
= dfu_write_medium_sf
;
146 dfu
->flush_medium
= dfu_flush_medium_sf
;
147 dfu
->poll_timeout
= dfu_polltimeout_sf
;
148 dfu
->free_entity
= dfu_free_entity_sf
;