Merge tag 'imx-fixes-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into arm/fixes
i.MX fixes for 5.14:
- A couple of fixes on MMDC driver to add missing iounmap() and
clk_disable_unprepare(), and a follow-up fix.
- Fix missing-prototypes warning in SRC driver.
- Revert commit 7d981405d0 ("soc: imx8m: change to use platform
driver"), which breaks i.MX8M system that has CAAM driver enabled.
- One fix on imx53-m53menlo pinctrl configuration.
- Increase the PHY reset duration for imx6qdl-sr-som to fix intermittent
issues where the PHY would be unresponsive every once in a while.
- Add missing flag for in-band signalling between PHY and MAC on
kontron-sl28-var2 board to fix network support.
- Limit the SDIO Clock on Colibri iMX6ULL to 25MHz for fixing wireless
noise issue.
- Fix sysclk node name for LS1028A so that U-Boot is able to update the
"clock-frequency" property.
* tag 'imx-fixes-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
ARM: dts: imx: Swap M53Menlo pinctrl_power_button/pinctrl_power_out pins
ARM: imx: fix missing 3rd argument in macro imx_mmdc_perf_init
ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz
arm64: dts: ls1028: sl28: fix networking for variant 2
Revert "soc: imx8m: change to use platform driver"
ARM: dts: imx6qdl-sr-som: Increase the PHY reset duration to 10ms
ARM: imx: common: Move prototype outside the SMP block
ARM: imx: add missing clk_disable_unprepare()
ARM: imx: add missing iounmap()
arm64: dts: ls1028a: fix node name for the sysclk
Link: https://lore.kernel.org/r/20210726023221.GF5901@dragon
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -388,13 +388,13 @@
|
||||
|
||||
pinctrl_power_button: powerbutgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
||||
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_power_out: poweroutgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
|
||||
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
@@ -54,7 +54,13 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
|
||||
phy-mode = "rgmii-id";
|
||||
phy-reset-duration = <2>;
|
||||
|
||||
/*
|
||||
* The PHY seems to require a long-enough reset duration to avoid
|
||||
* some rare issues where the PHY gets stuck in an inconsistent and
|
||||
* non-functional state at boot-up. 10ms proved to be fine .
|
||||
*/
|
||||
phy-reset-duration = <10>;
|
||||
phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
assigned-clock-rates = <0>, <198000000>;
|
||||
cap-power-off-card;
|
||||
keep-power-in-suspend;
|
||||
max-frequency = <25000000>;
|
||||
mmc-pwrseq = <&wifi_pwrseq>;
|
||||
no-1-8-v;
|
||||
non-removable;
|
||||
|
||||
@@ -68,7 +68,6 @@ void imx_set_cpu_arg(int cpu, u32 arg);
|
||||
void v7_secondary_startup(void);
|
||||
void imx_scu_map_io(void);
|
||||
void imx_smp_prepare(void);
|
||||
void imx_gpcv2_set_core1_pdn_pup_by_software(bool pdn);
|
||||
#else
|
||||
static inline void imx_scu_map_io(void) {}
|
||||
static inline void imx_smp_prepare(void) {}
|
||||
@@ -81,6 +80,7 @@ void imx_gpc_mask_all(void);
|
||||
void imx_gpc_restore_all(void);
|
||||
void imx_gpc_hwirq_mask(unsigned int hwirq);
|
||||
void imx_gpc_hwirq_unmask(unsigned int hwirq);
|
||||
void imx_gpcv2_set_core1_pdn_pup_by_software(bool pdn);
|
||||
void imx_anatop_init(void);
|
||||
void imx_anatop_pre_suspend(void);
|
||||
void imx_anatop_post_resume(void);
|
||||
|
||||
@@ -103,6 +103,7 @@ struct mmdc_pmu {
|
||||
struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
|
||||
struct hlist_node node;
|
||||
struct fsl_mmdc_devtype_data *devtype_data;
|
||||
struct clk *mmdc_ipg_clk;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -462,11 +463,14 @@ static int imx_mmdc_remove(struct platform_device *pdev)
|
||||
|
||||
cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
|
||||
perf_pmu_unregister(&pmu_mmdc->pmu);
|
||||
iounmap(pmu_mmdc->mmdc_base);
|
||||
clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk);
|
||||
kfree(pmu_mmdc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base)
|
||||
static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base,
|
||||
struct clk *mmdc_ipg_clk)
|
||||
{
|
||||
struct mmdc_pmu *pmu_mmdc;
|
||||
char *name;
|
||||
@@ -494,6 +498,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
|
||||
}
|
||||
|
||||
mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
|
||||
pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk;
|
||||
if (mmdc_num == 0)
|
||||
name = "mmdc";
|
||||
else
|
||||
@@ -529,7 +534,7 @@ pmu_free:
|
||||
|
||||
#else
|
||||
#define imx_mmdc_remove NULL
|
||||
#define imx_mmdc_perf_init(pdev, mmdc_base) 0
|
||||
#define imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk) 0
|
||||
#endif
|
||||
|
||||
static int imx_mmdc_probe(struct platform_device *pdev)
|
||||
@@ -567,7 +572,13 @@ static int imx_mmdc_probe(struct platform_device *pdev)
|
||||
val &= ~(1 << BP_MMDC_MAPSR_PSD);
|
||||
writel_relaxed(val, reg);
|
||||
|
||||
return imx_mmdc_perf_init(pdev, mmdc_base);
|
||||
err = imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk);
|
||||
if (err) {
|
||||
iounmap(mmdc_base);
|
||||
clk_disable_unprepare(mmdc_ipg_clk);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int imx_mmdc_get_ddr_type(void)
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
|
||||
&mscc_felix_port0 {
|
||||
label = "swp0";
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "sgmii";
|
||||
status = "okay";
|
||||
@@ -61,6 +62,7 @@
|
||||
|
||||
&mscc_felix_port1 {
|
||||
label = "swp1";
|
||||
managed = "in-band-status";
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "sgmii";
|
||||
status = "okay";
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
sysclk: clock-sysclk {
|
||||
sysclk: sysclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <100000000>;
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvmem-consumer.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sys_soc.h>
|
||||
@@ -31,7 +29,7 @@
|
||||
|
||||
struct imx8_soc_data {
|
||||
char *name;
|
||||
u32 (*soc_revision)(struct device *dev);
|
||||
u32 (*soc_revision)(void);
|
||||
};
|
||||
|
||||
static u64 soc_uid;
|
||||
@@ -52,7 +50,7 @@ static u32 imx8mq_soc_revision_from_atf(void)
|
||||
static inline u32 imx8mq_soc_revision_from_atf(void) { return 0; };
|
||||
#endif
|
||||
|
||||
static u32 __init imx8mq_soc_revision(struct device *dev)
|
||||
static u32 __init imx8mq_soc_revision(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *ocotp_base;
|
||||
@@ -77,20 +75,9 @@ static u32 __init imx8mq_soc_revision(struct device *dev)
|
||||
rev = REV_B1;
|
||||
}
|
||||
|
||||
if (dev) {
|
||||
int ret;
|
||||
|
||||
ret = nvmem_cell_read_u64(dev, "soc_unique_id", &soc_uid);
|
||||
if (ret) {
|
||||
iounmap(ocotp_base);
|
||||
of_node_put(np);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
soc_uid = readl_relaxed(ocotp_base + OCOTP_UID_HIGH);
|
||||
soc_uid <<= 32;
|
||||
soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW);
|
||||
}
|
||||
soc_uid = readl_relaxed(ocotp_base + OCOTP_UID_HIGH);
|
||||
soc_uid <<= 32;
|
||||
soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW);
|
||||
|
||||
iounmap(ocotp_base);
|
||||
of_node_put(np);
|
||||
@@ -120,7 +107,7 @@ static void __init imx8mm_soc_uid(void)
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
static u32 __init imx8mm_soc_revision(struct device *dev)
|
||||
static u32 __init imx8mm_soc_revision(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *anatop_base;
|
||||
@@ -138,15 +125,7 @@ static u32 __init imx8mm_soc_revision(struct device *dev)
|
||||
iounmap(anatop_base);
|
||||
of_node_put(np);
|
||||
|
||||
if (dev) {
|
||||
int ret;
|
||||
|
||||
ret = nvmem_cell_read_u64(dev, "soc_unique_id", &soc_uid);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
imx8mm_soc_uid();
|
||||
}
|
||||
imx8mm_soc_uid();
|
||||
|
||||
return rev;
|
||||
}
|
||||
@@ -171,7 +150,7 @@ static const struct imx8_soc_data imx8mp_soc_data = {
|
||||
.soc_revision = imx8mm_soc_revision,
|
||||
};
|
||||
|
||||
static __maybe_unused const struct of_device_id imx8_machine_match[] = {
|
||||
static __maybe_unused const struct of_device_id imx8_soc_match[] = {
|
||||
{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
|
||||
{ .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
|
||||
{ .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
|
||||
@@ -179,20 +158,12 @@ static __maybe_unused const struct of_device_id imx8_machine_match[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static __maybe_unused const struct of_device_id imx8_soc_match[] = {
|
||||
{ .compatible = "fsl,imx8mq-soc", .data = &imx8mq_soc_data, },
|
||||
{ .compatible = "fsl,imx8mm-soc", .data = &imx8mm_soc_data, },
|
||||
{ .compatible = "fsl,imx8mn-soc", .data = &imx8mn_soc_data, },
|
||||
{ .compatible = "fsl,imx8mp-soc", .data = &imx8mp_soc_data, },
|
||||
{ }
|
||||
};
|
||||
|
||||
#define imx8_revision(soc_rev) \
|
||||
soc_rev ? \
|
||||
kasprintf(GFP_KERNEL, "%d.%d", (soc_rev >> 4) & 0xf, soc_rev & 0xf) : \
|
||||
"unknown"
|
||||
|
||||
static int imx8_soc_info(struct platform_device *pdev)
|
||||
static int __init imx8_soc_init(void)
|
||||
{
|
||||
struct soc_device_attribute *soc_dev_attr;
|
||||
struct soc_device *soc_dev;
|
||||
@@ -211,10 +182,7 @@ static int imx8_soc_info(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto free_soc;
|
||||
|
||||
if (pdev)
|
||||
id = of_match_node(imx8_soc_match, pdev->dev.of_node);
|
||||
else
|
||||
id = of_match_node(imx8_machine_match, of_root);
|
||||
id = of_match_node(imx8_soc_match, of_root);
|
||||
if (!id) {
|
||||
ret = -ENODEV;
|
||||
goto free_soc;
|
||||
@@ -223,16 +191,8 @@ static int imx8_soc_info(struct platform_device *pdev)
|
||||
data = id->data;
|
||||
if (data) {
|
||||
soc_dev_attr->soc_id = data->name;
|
||||
if (data->soc_revision) {
|
||||
if (pdev) {
|
||||
soc_rev = data->soc_revision(&pdev->dev);
|
||||
ret = soc_rev;
|
||||
if (ret < 0)
|
||||
goto free_soc;
|
||||
} else {
|
||||
soc_rev = data->soc_revision(NULL);
|
||||
}
|
||||
}
|
||||
if (data->soc_revision)
|
||||
soc_rev = data->soc_revision();
|
||||
}
|
||||
|
||||
soc_dev_attr->revision = imx8_revision(soc_rev);
|
||||
@@ -270,24 +230,4 @@ free_soc:
|
||||
kfree(soc_dev_attr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Retain device_initcall is for backward compatibility with DTS. */
|
||||
static int __init imx8_soc_init(void)
|
||||
{
|
||||
if (of_find_matching_node_and_match(NULL, imx8_soc_match, NULL))
|
||||
return 0;
|
||||
|
||||
return imx8_soc_info(NULL);
|
||||
}
|
||||
device_initcall(imx8_soc_init);
|
||||
|
||||
static struct platform_driver imx8_soc_info_driver = {
|
||||
.probe = imx8_soc_info,
|
||||
.driver = {
|
||||
.name = "imx8_soc_info",
|
||||
.of_match_table = imx8_soc_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(imx8_soc_info_driver);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
Reference in New Issue
Block a user