mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
rtc: k3: detect SoC to determine erratum fix
To allow new SoCs to use this device without a new compatible string, use a soc_device_attribute list to define all SoCs affected by the TI i2327 erratum and require help from their bootloaders to unlock this device. Signed-off-by: Bryan Brattlof <bb@ti.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20220816173312.23243-2-bb@ti.com
This commit is contained in:
parent
f2c5671a64
commit
1e2585b49d
@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sys_soc.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/rtc.h>
|
||||
@ -45,14 +46,6 @@
|
||||
#define K3RTC_MIN_OFFSET (-277761)
|
||||
#define K3RTC_MAX_OFFSET (277778)
|
||||
|
||||
/**
|
||||
* struct ti_k3_rtc_soc_data - Private of compatible data for ti-k3-rtc
|
||||
* @unlock_irq_erratum: Has erratum for unlock infinite IRQs (erratum i2327)
|
||||
*/
|
||||
struct ti_k3_rtc_soc_data {
|
||||
const bool unlock_irq_erratum;
|
||||
};
|
||||
|
||||
static const struct regmap_config ti_k3_rtc_regmap_config = {
|
||||
.name = "peripheral-registers",
|
||||
.reg_bits = 32,
|
||||
@ -118,7 +111,6 @@ static const struct reg_field ti_rtc_reg_fields[] = {
|
||||
* @rtc_dev: rtc device
|
||||
* @regmap: rtc mmio regmap
|
||||
* @r_fields: rtc register fields
|
||||
* @soc: SoC compatible match data
|
||||
*/
|
||||
struct ti_k3_rtc {
|
||||
unsigned int irq;
|
||||
@ -127,7 +119,6 @@ struct ti_k3_rtc {
|
||||
struct rtc_device *rtc_dev;
|
||||
struct regmap *regmap;
|
||||
struct regmap_field *r_fields[K3_RTC_MAX_FIELDS];
|
||||
const struct ti_k3_rtc_soc_data *soc;
|
||||
};
|
||||
|
||||
static int k3rtc_field_read(struct ti_k3_rtc *priv, enum ti_k3_rtc_fields f)
|
||||
@ -195,6 +186,17 @@ static int k3rtc_unlock_rtc(struct ti_k3_rtc *priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the list of SoCs affected by TI's i2327 errata causing the RTC
|
||||
* state-machine to break if not unlocked fast enough during boot. These
|
||||
* SoCs must have the bootloader unlock this device very early in the
|
||||
* boot-flow before we (Linux) can use this device.
|
||||
*/
|
||||
static const struct soc_device_attribute has_erratum_i2327[] = {
|
||||
{ .family = "AM62X", .revision = "SR1.0" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int k3rtc_configure(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
@ -208,7 +210,7 @@ static int k3rtc_configure(struct device *dev)
|
||||
*
|
||||
* In such occurrence, it is assumed that the RTC module is unusable
|
||||
*/
|
||||
if (priv->soc->unlock_irq_erratum) {
|
||||
if (soc_device_match(has_erratum_i2327)) {
|
||||
ret = k3rtc_check_unlocked(priv);
|
||||
/* If there is an error OR if we are locked, return error */
|
||||
if (ret) {
|
||||
@ -602,8 +604,6 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->rtc_dev))
|
||||
return PTR_ERR(priv->rtc_dev);
|
||||
|
||||
priv->soc = of_device_get_match_data(dev);
|
||||
|
||||
priv->rtc_dev->ops = &ti_k3_rtc_ops;
|
||||
priv->rtc_dev->range_max = (1ULL << 48) - 1; /* 48Bit seconds */
|
||||
ti_k3_rtc_nvmem_config.priv = priv;
|
||||
@ -635,12 +635,8 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
|
||||
return devm_rtc_nvmem_register(priv->rtc_dev, &ti_k3_rtc_nvmem_config);
|
||||
}
|
||||
|
||||
static const struct ti_k3_rtc_soc_data ti_k3_am62_data = {
|
||||
.unlock_irq_erratum = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id ti_k3_rtc_of_match_table[] = {
|
||||
{.compatible = "ti,am62-rtc", .data = &ti_k3_am62_data},
|
||||
{.compatible = "ti,am62-rtc" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ti_k3_rtc_of_match_table);
|
||||
|
Loading…
Reference in New Issue
Block a user