diff options
| author | Eric Tashakkor <w36098@motorola.com> | 2014-05-28 15:06:02 -0500 | 
|---|---|---|
| committer | ERIC TASHAKKOR <w36098@motorola.com> | 2014-05-29 19:50:47 +0000 | 
| commit | 987ba520f90fcdbb32a1f84ef8b168507d700e30 (patch) | |
| tree | 2394ffd2a210caa57e93f06e72350de623e319a5 /drivers/mfd/m4sensorhub-stm32_401-fw.c | |
| parent | 9c1764fef85c8f34489dfe73183b258bbfced4e1 (diff) | |
| download | olio-linux-3.10-987ba520f90fcdbb32a1f84ef8b168507d700e30.tar.xz olio-linux-3.10-987ba520f90fcdbb32a1f84ef8b168507d700e30.zip  | |
IKXCLOCK-1703 Add M4 Pre-Flash Callback for RTC
Added a pre-flash callback system for drivers with timing restrictions like RTC
Updated the RTC driver to save and use set time requests until M4 is ready
Fixed a bug where uninitialized memory was preventing the time being set
Minor clean up of driver files to meet checkpatch style requirements
Change-Id: I9e03f373226e678e8e884c836f68fcb265f39a57
Signed-off-by: Eric Tashakkor <w36098@motorola.com>
Diffstat (limited to 'drivers/mfd/m4sensorhub-stm32_401-fw.c')
| -rw-r--r-- | drivers/mfd/m4sensorhub-stm32_401-fw.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/mfd/m4sensorhub-stm32_401-fw.c b/drivers/mfd/m4sensorhub-stm32_401-fw.c index 73ae3a31519..2998546a3a8 100644 --- a/drivers/mfd/m4sensorhub-stm32_401-fw.c +++ b/drivers/mfd/m4sensorhub-stm32_401-fw.c @@ -190,6 +190,11 @@ int m4sensorhub_401_load_firmware(struct m4sensorhub_data *m4sensorhub,  				barker_read_from_device, BARKER_NUMBER);  			KDEBUG(M4SH_NOTICE,  				"forcing firmware update from file\n"); +			/* +			 * This is likely a blank flash factory case, so +			 * skip doing any driver pre-flash callbacks. +			 */ +			goto m4sensorhub_401_load_firmware_erase_flash;  		} else {  			/* Read firmware version from device */  			if (m4sensorhub_bl_rm(m4sensorhub, VERSION_ADDRESS, @@ -223,9 +228,41 @@ int m4sensorhub_401_load_firmware(struct m4sensorhub_data *m4sensorhub,  	} else {  		KDEBUG(M4SH_NOTICE, "Version of firmware on file is 0x%04x\n",  			fw_version_file); +		/* +		 * Currently no code uses the force_upgrade path, +		 * but in case it is used for some recovery (and because +		 * no numbers or error checking is done), we will skip +		 * trying to call any driver pre-flash callbacks. +		 */ +		goto m4sensorhub_401_load_firmware_erase_flash; +	} + +	/* Boot M4, execute any pre-flash callbacks, then reset for BL mode */ +	if (m4sensorhub_preflash_callbacks_exist()) { +		KDEBUG(M4SH_ERROR, "%s: Booting M4 to execute callbacks...\n", +			__func__); /* Not an error (see similar above) */ +		ret = m4sensorhub_jump_to_user(m4sensorhub); +		if (ret < 0) { +			KDEBUG(M4SH_ERROR, "%s: %s %s %d.\n", __func__, +				"Failed to boot M4 for callbacks", +				"with error code", ret); +			/* +			 * Since we don't know the status of M4 at this point, +			 * we will skip any callbacks, reset the IC to a known +			 * state, and go ahead with a reflash. +			 */ +			m4sensorhub_hw_reset(m4sensorhub); +			goto m4sensorhub_401_load_firmware_erase_flash; +		} + +		m4sensorhub_call_preflash_callbacks(); +		KDEBUG(M4SH_ERROR, "%s: Callbacks complete, flashing M4...\n", +			__func__); /* Not an error (see similar above) */ +		m4sensorhub_hw_reset(m4sensorhub);  	}  	/* The flash memory to update has to be erased before updating */ +m4sensorhub_401_load_firmware_erase_flash:  	ret = m4sensorhub_bl_erase_fw(m4sensorhub);  	if (ret < 0) {  		pr_err("%s: erase failed\n", __func__);  |