20 #include <linux/kernel.h>
21 #include <linux/errno.h>
22 #include <linux/ctype.h>
34 static unsigned char atohx(
unsigned char *
dst,
char *
src)
36 unsigned char value = 0;
46 *dst = value = ((msb & 0xF) << 4) | (lsb & 0xF);
53 static int parse_hex_line(
unsigned char *
fw_data,
unsigned char *
addr,
55 unsigned char *addr_has_changed) {
60 if (*fw_data++ !=
':') {
61 pr_err(
"invalid firmware file\n");
66 for (src = fw_data; *src !=
'\n'; src += 2) {
82 *addr_has_changed = 1;
84 *addr_has_changed = 0;
88 if (*addr_has_changed)
89 addr[(count - 4)] = dst;
91 data[(count - 4)] = dst;
94 data[(count - 4)] = dst;
101 return (count * 2) + 2;
109 int total_read_bytes = 0,
errno = 0;
110 unsigned char addr_has_changed = 0;
114 for (total_read_bytes = 0; total_read_bytes < firmware->
size; ) {
118 read_bytes = parse_hex_line(
119 (
u8 *) (firmware->
data + total_read_bytes),
129 total_read_bytes += read_bytes;
130 if (total_read_bytes == firmware->
size) {
131 fw_pkt.u.request[0] = 0x00;
132 fw_pkt.u.request[1] = 0x03;
135 errno = bus_adap->
ops->upload_fw_pkt(bus_adap,
141 if (!addr_has_changed) {
143 fw_pkt.u.request[0] = 0x00;
144 fw_pkt.u.request[1] = 0x01;
146 data_len +=
sizeof(fw_pkt.u.request);
147 data_len +=
sizeof(fw_pkt.raw.address);
150 errno = bus_adap->
ops->upload_fw_pkt(bus_adap,
162 return (errno == 0) ? total_read_bytes :
errno;
168 const struct firmware *firmware =
NULL;
186 if (cmd_buf ==
NULL) {
194 pr_err(
"%s: unable to locate firmware file: %s\n",
200 errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
202 pr_err(
"%s: error during firmware upload part1\n",
207 pr_info(
"%s: firmware: %s loaded with success\n",
217 pr_err(
"%s: unable to locate firmware file: %s\n",
223 errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
225 pr_err(
"%s: error during firmware upload part2\n",
230 pr_info(
"%s: firmware: %s loaded with success\n",