]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - drivers/dfu/dfu_sf.c
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
12 #include <spi_flash.h>
14 static int dfu_get_medium_size_sf(struct dfu_entity
*dfu
, u64
*size
)
16 *size
= dfu
->data
.sf
.size
;
21 static int dfu_read_medium_sf(struct dfu_entity
*dfu
, u64 offset
, void *buf
,
24 return spi_flash_read(dfu
->data
.sf
.dev
, dfu
->data
.sf
.start
+ offset
,
28 static u64
find_sector(struct dfu_entity
*dfu
, u64 start
, u64 offset
)
30 return (lldiv((start
+ offset
), dfu
->data
.sf
.dev
->sector_size
)) *
31 dfu
->data
.sf
.dev
->sector_size
;
34 static int dfu_write_medium_sf(struct dfu_entity
*dfu
,
35 u64 offset
, void *buf
, long *len
)
39 ret
= spi_flash_erase(dfu
->data
.sf
.dev
,
40 find_sector(dfu
, dfu
->data
.sf
.start
, offset
),
41 dfu
->data
.sf
.dev
->sector_size
);
45 ret
= spi_flash_write(dfu
->data
.sf
.dev
, dfu
->data
.sf
.start
+ offset
,
53 static int dfu_flush_medium_sf(struct dfu_entity
*dfu
)
58 static unsigned int dfu_polltimeout_sf(struct dfu_entity
*dfu
)
60 return DFU_DEFAULT_POLL_TIMEOUT
;
63 static void dfu_free_entity_sf(struct dfu_entity
*dfu
)
65 spi_flash_free(dfu
->data
.sf
.dev
);
68 static struct spi_flash
*parse_dev(char *devstr
)
72 unsigned int speed
= CONFIG_SF_DEFAULT_SPEED
;
73 unsigned int mode
= CONFIG_SF_DEFAULT_MODE
;
75 struct spi_flash
*dev
;
77 s
= strsep(&devstr
, ":");
78 if (!s
|| !*s
|| (bus
= simple_strtoul(s
, &endp
, 0), *endp
)) {
79 printf("Invalid SPI bus %s\n", s
);
83 s
= strsep(&devstr
, ":");
84 if (!s
|| !*s
|| (cs
= simple_strtoul(s
, &endp
, 0), *endp
)) {
85 printf("Invalid SPI chip-select %s\n", s
);
89 s
= strsep(&devstr
, ":");
91 speed
= simple_strtoul(s
, &endp
, 0);
92 if (*endp
|| !speed
) {
93 printf("Invalid SPI speed %s\n", s
);
98 s
= strsep(&devstr
, ":");
100 mode
= simple_strtoul(s
, &endp
, 0);
101 if (*endp
|| mode
> 3) {
102 printf("Invalid SPI mode %s\n", s
);
107 dev
= spi_flash_probe(bus
, cs
, speed
, mode
);
109 printf("Failed to create SPI flash at %d:%d:%d:%d\n",
110 bus
, cs
, speed
, mode
);
117 int dfu_fill_entity_sf(struct dfu_entity
*dfu
, char *devstr
, char *s
)
120 char *devstr_bkup
= strdup(devstr
);
122 dfu
->data
.sf
.dev
= parse_dev(devstr_bkup
);
124 if (!dfu
->data
.sf
.dev
)
127 dfu
->dev_type
= DFU_DEV_SF
;
128 dfu
->max_buf_size
= dfu
->data
.sf
.dev
->sector_size
;
130 st
= strsep(&s
, " ");
131 if (!strcmp(st
, "raw")) {
132 dfu
->layout
= DFU_RAW_ADDR
;
133 dfu
->data
.sf
.start
= simple_strtoul(s
, &s
, 16);
135 dfu
->data
.sf
.size
= simple_strtoul(s
, &s
, 16);
137 printf("%s: Memory layout (%s) not supported!\n", __func__
, st
);
138 spi_flash_free(dfu
->data
.sf
.dev
);
142 dfu
->get_medium_size
= dfu_get_medium_size_sf
;
143 dfu
->read_medium
= dfu_read_medium_sf
;
144 dfu
->write_medium
= dfu_write_medium_sf
;
145 dfu
->flush_medium
= dfu_flush_medium_sf
;
146 dfu
->poll_timeout
= dfu_polltimeout_sf
;
147 dfu
->free_entity
= dfu_free_entity_sf
;