mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
tty: pl011: fix initialization order of QDF2400 E44
The work-around for Qualcomm Technologies QDF2400 Erratum 44 hinges on a
global variable defined in the pl011 driver. The ACPI SPCR parsing code
determines whether the work-around is needed, and if so, it changes the
console name from "pl011" to "qdf2400_e44". The expectation is that
the pl011 driver will implement the work-around when it sees the console
name. The global variable qdf2400_e44_present is set when that happens.
The problem is that work-around needs to be enabled when the pl011
driver probes, not when the console name is queried. However, sbsa_probe()
is called before pl011_console_match(). The work-around appeared to work
previously because the default console on QDF2400 platforms was always
ttyAMA1. The first time sbsa_probe() is called (for ttyAMA0),
qdf2400_e44_present is still false. Then pl011_console_match() is called,
and it sets qdf2400_e44_present to true. All subsequent calls to
sbsa_probe() enable the work-around.
The solution is to move the global variable into spcr.c and let the
pl011 driver query it during probe time. This works because all QDF2400
platforms require SPCR, so parse_spcr() will always be called.
pl011_console_match still checks for the "qdf2400_e44" console name,
but it doesn't do anything else special.
Fixes: 5a0722b898 ("tty: pl011: use "qdf2400_e44" as the earlycon name for QDF2400 E44")
Tested-by: Jeffrey Hugo <[email protected]>
Signed-off-by: Timur Tabi <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
520eccdfe1
commit
37ef38f3f8
3 changed files with 54 additions and 20 deletions
|
|
@ -16,6 +16,16 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/serial_core.h>
|
||||
|
||||
/*
|
||||
* Erratum 44 for QDF2432v1 and QDF2400v1 SoCs describes the BUSY bit as
|
||||
* occasionally getting stuck as 1. To avoid the potential for a hang, check
|
||||
* TXFE == 0 instead of BUSY == 1. This may not be suitable for all UART
|
||||
* implementations, so only do so if an affected platform is detected in
|
||||
* parse_spcr().
|
||||
*/
|
||||
bool qdf2400_e44_present;
|
||||
EXPORT_SYMBOL(qdf2400_e44_present);
|
||||
|
||||
/*
|
||||
* Some Qualcomm Datacenter Technologies SoCs have a defective UART BUSY bit.
|
||||
* Detect them by examining the OEM fields in the SPCR header, similiar to PCI
|
||||
|
|
@ -147,8 +157,30 @@ int __init parse_spcr(bool earlycon)
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (qdf2400_erratum_44_present(&table->header))
|
||||
uart = "qdf2400_e44";
|
||||
/*
|
||||
* If the E44 erratum is required, then we need to tell the pl011
|
||||
* driver to implement the work-around.
|
||||
*
|
||||
* The global variable is used by the probe function when it
|
||||
* creates the UARTs, whether or not they're used as a console.
|
||||
*
|
||||
* If the user specifies "traditional" earlycon, the qdf2400_e44
|
||||
* console name matches the EARLYCON_DECLARE() statement, and
|
||||
* SPCR is not used. Parameter "earlycon" is false.
|
||||
*
|
||||
* If the user specifies "SPCR" earlycon, then we need to update
|
||||
* the console name so that it also says "qdf2400_e44". Parameter
|
||||
* "earlycon" is true.
|
||||
*
|
||||
* For consistency, if we change the console name, then we do it
|
||||
* for everyone, not just earlycon.
|
||||
*/
|
||||
if (qdf2400_erratum_44_present(&table->header)) {
|
||||
qdf2400_e44_present = true;
|
||||
if (earlycon)
|
||||
uart = "qdf2400_e44";
|
||||
}
|
||||
|
||||
if (xgene_8250_erratum_present(table))
|
||||
iotype = "mmio32";
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue