Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec6752f5 authored by David Woodhouse's avatar David Woodhouse Committed by David Woodhouse
Browse files

whiteheat: use request_firmware()

parent 5f24e2d6
Loading
Loading
Loading
Loading
+50 −27
Original line number Original line Diff line number Diff line
@@ -81,7 +81,8 @@
#include <linux/serial_reg.h>
#include <linux/serial_reg.h>
#include <linux/serial.h>
#include <linux/serial.h>
#include <linux/usb/serial.h>
#include <linux/usb/serial.h>
#include "whiteheat_fw.h"		/* firmware for the ConnectTech WhiteHEAT device */
#include <linux/firmware.h>
#include <linux/ihex.h>
#include "whiteheat.h"			/* WhiteHEAT specific commands */
#include "whiteheat.h"			/* WhiteHEAT specific commands */


static int debug;
static int debug;
@@ -279,37 +280,52 @@ static int firm_report_tx_done(struct usb_serial_port *port);
*/
*/
static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id)
static int whiteheat_firmware_download (struct usb_serial *serial, const struct usb_device_id *id)
{
{
	int response;
	int response, ret = -ENOENT;
	const struct whiteheat_hex_record *record;
	const struct firmware *loader_fw = NULL, *firmware_fw = NULL;
	const struct ihex_binrec *record;


	dbg("%s", __func__);
	dbg("%s", __func__);


	if (request_ihex_firmware(&firmware_fw, "whiteheat.fw",
				  &serial->dev->dev)) {
		err("%s - request \"whiteheat.fw\" failed", __func__);
		goto out;
	}
	if (request_ihex_firmware(&loader_fw, "whiteheat_loader.fw",
			     &serial->dev->dev)) {
		err("%s - request \"whiteheat_loader.fw\" failed", __func__);
		goto out;
	}
	ret = 0;
	response = ezusb_set_reset (serial, 1);
	response = ezusb_set_reset (serial, 1);


	record = &whiteheat_loader[0];
	record = (const struct ihex_binrec *)loader_fw->data;
	while (record->address != 0xffff) {
	while (record) {
		response = ezusb_writememory (serial, record->address, 
		response = ezusb_writememory (serial, be32_to_cpu(record->addr),
				(unsigned char *)record->data, record->data_size, 0xa0);
					      (unsigned char *)record->data,
					      be16_to_cpu(record->len), 0xa0);
		if (response < 0) {
		if (response < 0) {
			err("%s - ezusb_writememory failed for loader (%d %04X %p %d)",
			err("%s - ezusb_writememory failed for loader (%d %04X %p %d)",
				__func__, response, record->address, record->data, record->data_size);
			    __func__, response, be32_to_cpu(record->addr),
			    record->data, be16_to_cpu(record->len));
			break;
			break;
		}
		}
		++record;
		record = ihex_next_binrec(record);
	}
	}


	response = ezusb_set_reset (serial, 0);
	response = ezusb_set_reset (serial, 0);


	record = &whiteheat_firmware[0];
	record = (const struct ihex_binrec *)firmware_fw->data;
	while (record->address < 0x1b40) {
	while (record && be32_to_cpu(record->addr) < 0x1b40)
		++record;
		record = ihex_next_binrec(record);
	}
	while (record) {
	while (record->address != 0xffff) {
		response = ezusb_writememory (serial, be32_to_cpu(record->addr),
		response = ezusb_writememory (serial, record->address, 
					      (unsigned char *)record->data,
				(unsigned char *)record->data, record->data_size, 0xa3);
					      be16_to_cpu(record->len), 0xa3);
		if (response < 0) {
		if (response < 0) {
			err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", 
			err("%s - ezusb_writememory failed for first firmware step (%d %04X %p %d)", 
				__func__, response, record->address, record->data, record->data_size);
			    __func__, response, be32_to_cpu(record->addr),
			    record->data, be16_to_cpu(record->len));
			break;
			break;
		}
		}
		++record;
		++record;
@@ -317,21 +333,25 @@ static int whiteheat_firmware_download (struct usb_serial *serial, const struct
	
	
	response = ezusb_set_reset (serial, 1);
	response = ezusb_set_reset (serial, 1);


	record = &whiteheat_firmware[0];
	record = (const struct ihex_binrec *)firmware_fw->data;
	while (record->address < 0x1b40) {
	while (record && be32_to_cpu(record->addr) < 0x1b40) {
		response = ezusb_writememory (serial, record->address, 
		response = ezusb_writememory (serial, be32_to_cpu(record->addr),
				(unsigned char *)record->data, record->data_size, 0xa0);
					      (unsigned char *)record->data,
					      be16_to_cpu(record->len), 0xa0);
		if (response < 0) {
		if (response < 0) {
			err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", 
			err("%s - ezusb_writememory failed for second firmware step (%d %04X %p %d)", 
				__func__, response, record->address, record->data, record->data_size);
			    __func__, response, be32_to_cpu(record->addr),
			    record->data, be16_to_cpu(record->len));
			break;
			break;
		}
		}
		++record;
		++record;
	}
	}

	ret = 0;
	response = ezusb_set_reset (serial, 0);
	response = ezusb_set_reset (serial, 0);

 out:
	return 0;
	release_firmware(loader_fw);
	release_firmware(firmware_fw);
	return ret;
}
}




@@ -1503,6 +1523,9 @@ MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");


MODULE_FIRMWARE("whiteheat.fw");
MODULE_FIRMWARE("whiteheat_loader.fw");

module_param(urb_pool_size, int, 0);
module_param(urb_pool_size, int, 0);
MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering");
MODULE_PARM_DESC(urb_pool_size, "Number of urbs to use for buffering");


Loading