Commit 341323fa authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-5.9-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull more ACPI updates from Rafael Wysocki:
 "Add new hardware support to the ACPI driver for AMD SoCs, the x86 clk
  driver and the Designware i2c driver (changes from Akshu Agrawal and
  Pu Wen)"

* tag 'acpi-5.9-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  clk: x86: Support RV architecture
  ACPI: APD: Add a fmw property is_raven
  clk: x86: Change name from ST to FCH
  ACPI: APD: Change name from ST to FCH
  i2c: designware: Add device HID for Hygon I2C controller
parents 1a5d9dbb 19fe87fd
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
*/ */
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/platform_data/clk-st.h> #include <linux/platform_data/clk-fch.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_domain.h> #include <linux/pm_domain.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
...@@ -79,11 +79,12 @@ static int misc_check_res(struct acpi_resource *ares, void *data) ...@@ -79,11 +79,12 @@ static int misc_check_res(struct acpi_resource *ares, void *data)
return !acpi_dev_resource_memory(ares, &res); return !acpi_dev_resource_memory(ares, &res);
} }
static int st_misc_setup(struct apd_private_data *pdata) static int fch_misc_setup(struct apd_private_data *pdata)
{ {
struct acpi_device *adev = pdata->adev; struct acpi_device *adev = pdata->adev;
const union acpi_object *obj;
struct platform_device *clkdev; struct platform_device *clkdev;
struct st_clk_data *clk_data; struct fch_clk_data *clk_data;
struct resource_entry *rentry; struct resource_entry *rentry;
struct list_head resource_list; struct list_head resource_list;
int ret; int ret;
...@@ -98,6 +99,9 @@ static int st_misc_setup(struct apd_private_data *pdata) ...@@ -98,6 +99,9 @@ static int st_misc_setup(struct apd_private_data *pdata)
if (ret < 0) if (ret < 0)
return -ENOENT; return -ENOENT;
acpi_dev_get_property(adev, "is-rv", ACPI_TYPE_INTEGER, &obj);
clk_data->is_rv = obj->integer.value;
list_for_each_entry(rentry, &resource_list, node) { list_for_each_entry(rentry, &resource_list, node) {
clk_data->base = devm_ioremap(&adev->dev, rentry->res->start, clk_data->base = devm_ioremap(&adev->dev, rentry->res->start,
resource_size(rentry->res)); resource_size(rentry->res));
...@@ -106,7 +110,7 @@ static int st_misc_setup(struct apd_private_data *pdata) ...@@ -106,7 +110,7 @@ static int st_misc_setup(struct apd_private_data *pdata)
acpi_dev_free_resource_list(&resource_list); acpi_dev_free_resource_list(&resource_list);
clkdev = platform_device_register_data(&adev->dev, "clk-st", clkdev = platform_device_register_data(&adev->dev, "clk-fch",
PLATFORM_DEVID_NONE, clk_data, PLATFORM_DEVID_NONE, clk_data,
sizeof(*clk_data)); sizeof(*clk_data));
return PTR_ERR_OR_ZERO(clkdev); return PTR_ERR_OR_ZERO(clkdev);
...@@ -135,8 +139,8 @@ static const struct apd_device_desc cz_uart_desc = { ...@@ -135,8 +139,8 @@ static const struct apd_device_desc cz_uart_desc = {
.properties = uart_properties, .properties = uart_properties,
}; };
static const struct apd_device_desc st_misc_desc = { static const struct apd_device_desc fch_misc_desc = {
.setup = st_misc_setup, .setup = fch_misc_setup,
}; };
#endif #endif
...@@ -239,7 +243,8 @@ static const struct acpi_device_id acpi_apd_device_ids[] = { ...@@ -239,7 +243,8 @@ static const struct acpi_device_id acpi_apd_device_ids[] = {
{ "AMD0020", APD_ADDR(cz_uart_desc) }, { "AMD0020", APD_ADDR(cz_uart_desc) },
{ "AMDI0020", APD_ADDR(cz_uart_desc) }, { "AMDI0020", APD_ADDR(cz_uart_desc) },
{ "AMD0030", }, { "AMD0030", },
{ "AMD0040", APD_ADDR(st_misc_desc)}, { "AMD0040", APD_ADDR(fch_misc_desc)},
{ "HYGO0010", APD_ADDR(wt_i2c_desc) },
#endif #endif
#ifdef CONFIG_ARM64 #ifdef CONFIG_ARM64
{ "APMC0D0F", APD_ADDR(xgene_i2c_desc) }, { "APMC0D0F", APD_ADDR(xgene_i2c_desc) },
......
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o
obj-$(CONFIG_X86_AMD_PLATFORM_DEVICE) += clk-st.o obj-$(CONFIG_X86_AMD_PLATFORM_DEVICE) += clk-fch.o
clk-x86-lpss-objs := clk-lpt.o clk-x86-lpss-objs := clk-lpt.o
obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o
obj-$(CONFIG_CLK_LGM_CGU) += clk-cgu.o clk-cgu-pll.o clk-lgm.o obj-$(CONFIG_CLK_LGM_CGU) += clk-cgu.o clk-cgu-pll.o clk-lgm.o
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/platform_data/clk-st.h> #include <linux/platform_data/clk-fch.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
/* Clock Driving Strength 2 register */ /* Clock Driving Strength 2 register */
...@@ -26,53 +26,76 @@ ...@@ -26,53 +26,76 @@
#define ST_CLK_GATE 3 #define ST_CLK_GATE 3
#define ST_MAX_CLKS 4 #define ST_MAX_CLKS 4
#define RV_CLK_48M 0
#define RV_CLK_GATE 1
#define RV_MAX_CLKS 2
static const char * const clk_oscout1_parents[] = { "clk48MHz", "clk25MHz" }; static const char * const clk_oscout1_parents[] = { "clk48MHz", "clk25MHz" };
static struct clk_hw *hws[ST_MAX_CLKS]; static struct clk_hw *hws[ST_MAX_CLKS];
static int st_clk_probe(struct platform_device *pdev) static int fch_clk_probe(struct platform_device *pdev)
{ {
struct st_clk_data *st_data; struct fch_clk_data *fch_data;
st_data = dev_get_platdata(&pdev->dev); fch_data = dev_get_platdata(&pdev->dev);
if (!st_data || !st_data->base) if (!fch_data || !fch_data->base)
return -EINVAL; return -EINVAL;
hws[ST_CLK_48M] = clk_hw_register_fixed_rate(NULL, "clk48MHz", NULL, 0, if (!fch_data->is_rv) {
48000000); hws[ST_CLK_48M] = clk_hw_register_fixed_rate(NULL, "clk48MHz",
hws[ST_CLK_25M] = clk_hw_register_fixed_rate(NULL, "clk25MHz", NULL, 0, NULL, 0, 48000000);
25000000); hws[ST_CLK_25M] = clk_hw_register_fixed_rate(NULL, "clk25MHz",
NULL, 0, 25000000);
hws[ST_CLK_MUX] = clk_hw_register_mux(NULL, "oscout1_mux",
clk_oscout1_parents, ARRAY_SIZE(clk_oscout1_parents),
0, fch_data->base + CLKDRVSTR2, OSCOUT1CLK25MHZ, 3, 0,
NULL);
clk_set_parent(hws[ST_CLK_MUX]->clk, hws[ST_CLK_48M]->clk);
hws[ST_CLK_MUX] = clk_hw_register_mux(NULL, "oscout1_mux", hws[ST_CLK_GATE] = clk_hw_register_gate(NULL, "oscout1",
clk_oscout1_parents, ARRAY_SIZE(clk_oscout1_parents), "oscout1_mux", 0, fch_data->base + MISCCLKCNTL1,
0, st_data->base + CLKDRVSTR2, OSCOUT1CLK25MHZ, 3, 0, NULL); OSCCLKENB, CLK_GATE_SET_TO_DISABLE, NULL);
clk_set_parent(hws[ST_CLK_MUX]->clk, hws[ST_CLK_48M]->clk); devm_clk_hw_register_clkdev(&pdev->dev, hws[ST_CLK_GATE],
"oscout1", NULL);
} else {
hws[RV_CLK_48M] = clk_hw_register_fixed_rate(NULL, "clk48MHz",
NULL, 0, 48000000);
hws[ST_CLK_GATE] = clk_hw_register_gate(NULL, "oscout1", "oscout1_mux", hws[RV_CLK_GATE] = clk_hw_register_gate(NULL, "oscout1",
0, st_data->base + MISCCLKCNTL1, OSCCLKENB, "clk48MHz", 0, fch_data->base + MISCCLKCNTL1,
CLK_GATE_SET_TO_DISABLE, NULL); OSCCLKENB, CLK_GATE_SET_TO_DISABLE, NULL);
devm_clk_hw_register_clkdev(&pdev->dev, hws[ST_CLK_GATE], "oscout1", devm_clk_hw_register_clkdev(&pdev->dev, hws[RV_CLK_GATE],
NULL); "oscout1", NULL);
}
return 0; return 0;
} }
static int st_clk_remove(struct platform_device *pdev) static int fch_clk_remove(struct platform_device *pdev)
{ {
int i; int i, clks;
struct fch_clk_data *fch_data;
for (i = 0; i < ST_MAX_CLKS; i++) fch_data = dev_get_platdata(&pdev->dev);
clks = fch_data->is_rv ? RV_MAX_CLKS : ST_MAX_CLKS;
for (i = 0; i < clks; i++)
clk_hw_unregister(hws[i]); clk_hw_unregister(hws[i]);
return 0; return 0;
} }
static struct platform_driver st_clk_driver = { static struct platform_driver fch_clk_driver = {
.driver = { .driver = {
.name = "clk-st", .name = "clk-fch",
.suppress_bind_attrs = true, .suppress_bind_attrs = true,
}, },
.probe = st_clk_probe, .probe = fch_clk_probe,
.remove = st_clk_remove, .remove = fch_clk_remove,
}; };
builtin_platform_driver(st_clk_driver); builtin_platform_driver(fch_clk_driver);
...@@ -55,6 +55,7 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = { ...@@ -55,6 +55,7 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = {
{ "HISI02A1", 0 }, { "HISI02A1", 0 },
{ "HISI02A2", 0 }, { "HISI02A2", 0 },
{ "HISI02A3", 0 }, { "HISI02A3", 0 },
{ "HYGO0010", ACCESS_INTR_MASK },
{ } { }
}; };
MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match); MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
......
/* SPDX-License-Identifier: MIT */ /* SPDX-License-Identifier: MIT */
/* /*
* clock framework for AMD Stoney based clock * clock framework for AMD misc clocks
* *
* Copyright 2018 Advanced Micro Devices, Inc. * Copyright 2018 Advanced Micro Devices, Inc.
*/ */
#ifndef __CLK_ST_H #ifndef __CLK_FCH_H
#define __CLK_ST_H #define __CLK_FCH_H
#include <linux/compiler.h> #include <linux/compiler.h>
struct st_clk_data { struct fch_clk_data {
void __iomem *base; void __iomem *base;
u32 is_rv;
}; };
#endif /* __CLK_ST_H */ #endif /* __CLK_FCH_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment