mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-10 19:47:12 +00:00
- Update the ACPICA code in the kernel to upstream revision
20170303 which includes:
* Minor fixes and improvements in the core code (Bob Moore,
Seunghun Han).
* Debugger fixes (Colin Ian King, Lv Zheng).
* Compiler/disassembler improvements (Bob Moore, David Box,
Lv Zheng).
* Build-related update (Lv Zheng).
- Add new device IDs and platform-related information to the
ACPI drivers for Intel (LPSS) and AMD (APD) SoCs (Hanjun Guo,
Hans de Goede).
- Make it possible to quirk ACPI-enumerated devices as "always
present" on platforms where they are incorrectly reported as not
present by the AML and add the INT0002 device ID to the list of
"always present" devices (Hans de Goede).
- Fix the register information in the xpower PMIC driver and add
comments to map the registers to symbols used by AML to it
(Hans de Goede).
- Move the code turning off unused ACPI power resources during
system resume to a point after all devices have been resumed
to avoid issues with power resources that do not behave as
expected (Hans de Goede).
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAABCAAGBQJZEkXjAAoJEILEb/54YlRxWQ4QAIymQKPRXS6g8/5qZ8w5YNY+
gLHkEzANPW3JHTUwv2hxfPP4AWYnDwTSg5g3RVue0R+tj49ERNsDoaFXBJ8L3wlA
bLr9VFXPtzX5yuFD1MGeDWeUqGwuTJztWcMAkzpRgbj+6ppjJForObM76XFB3Pmn
t5XUs0Tjlahqhg59GCHkt+kGeL5BOayLvIQt17IxQiAzAi3SY4P/qcq6qG2hY7BX
0PB/zodPfCQpbcReKMDGfQlhxSWgcoQiCoBmmx0YIQfTQzmvWUejek1GcSUfJu1C
Hx/ndBiAWkJ7m77LMAyQT9FgRsp9GkDllYhXJ+rmAWFuqNrEpTFJjY6q3wXxMyMl
T39BWPFfauatEmDYXXLWpUuFaxX+VJ5nNlUtHGDm3xP/NI4ARiAUowk6haFfR1nx
YmBon4VPzG2cf6wnXKI2rdWIbkKLkDYLPpzBpvUxswkPNtEF2/272nPwo0nqfTms
S3ddyRhYBnht1JgDPf/nAyUOK0jowxWlFEBsKvLUZ0faHuIhAS4FEO8DNxVnhP0b
m1nlZFctJeRCcI11mva5Tob9w8w5Z7WslfoTLQ9eFBl6RJdmy05s8d/CQYI9hK15
EmVIRRqJ+G4gNHdcV26+JKBWgrJv6WSmf32QBXDCT94C4iZrqxXmccvY7s2tZEJR
7VEo/7Ck70xbNcvEOn3c
=Ytsi
-----END PGP SIGNATURE-----
Merge tag 'acpi-extra-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more ACPI updates from Rafael Wysocki:
"These update the ACPICA code in the kernel to upstream revision
20170303 which adds a few minor fixes and improvements, update ACPI
SoC drivers with new device IDs, platform-related information and
similar, fix the register information in the xpower PMIC driver,
introduce a concept of "always present" devices to the ACPI device
enumeration code and use it to fix a problem with one platform, and
fix a system resume issue related to power resources.
Specifics:
- Update the ACPICA code in the kernel to upstream revision 20170303
which includes:
* Minor fixes and improvements in the core code (Bob Moore,
Seunghun Han).
* Debugger fixes (Colin Ian King, Lv Zheng).
* Compiler/disassembler improvements (Bob Moore, David Box, Lv
Zheng).
* Build-related update (Lv Zheng).
- Add new device IDs and platform-related information to the ACPI
drivers for Intel (LPSS) and AMD (APD) SoCs (Hanjun Guo, Hans de
Goede).
- Make it possible to quirk ACPI-enumerated devices as "always
present" on platforms where they are incorrectly reported as not
present by the AML and add the INT0002 device ID to the list of
"always present" devices (Hans de Goede).
- Fix the register information in the xpower PMIC driver and add
comments to map the registers to symbols used by AML to it (Hans de
Goede).
- Move the code turning off unused ACPI power resources during system
resume to a point after all devices have been resumed to avoid
issues with power resources that do not behave as expected (Hans de
Goede)"
* tag 'acpi-extra-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (22 commits)
ACPI / power: Delay turning off unused power resources after suspend
ACPI / PMIC: xpower: Fix power_table addresses
ACPI / LPSS: Call pwm_add_table() for Bay Trail PWM device
ACPICA: Update version to 20170303
ACPICA: iasl: add ASL conversion tool
ACPICA: Local cache support: Allow small cache objects
ACPICA: Disassembler: Do not unconditionally remove temporary names
ACPICA: iasl: Fix IORT SMMU GSI disassembling
ACPICA: Cleanup AML opcode definitions, no functional change
ACPICA: Debugger: Add interpreter blocking mark for single-step mode
ACPICA: debugger: fix memory leak on Pathname
ACPICA: Update for automatic repair code for objects returned by evaluate_object
ACPICA: Namespace: fix operand cache leak
ACPICA: Fix several incorrect invocations of ACPICA return macro
ACPICA: Fix a module for excessive debug output
ACPICA: Update some function headers, no funtional change
ACPICA: Disassembler: Enhance resource descriptor detection
i2c: designware: Add ACPI HID for Hisilicon Hip07/08 I2C controller
ACPI / APD: Add clock frequency for Hisilicon Hip07/08 I2C controller
ACPI / bus: Add INT0002 to list of always-present devices
...
198 lines
4.7 KiB
C
198 lines
4.7 KiB
C
/*
|
|
* AMD ACPI support for ACPI2platform device.
|
|
*
|
|
* Copyright (c) 2014,2015 AMD Corporation.
|
|
* Authors: Ken Xue <Ken.Xue@amd.com>
|
|
* Wu, Jeff <Jeff.Wu@amd.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/clk-provider.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/pm_domain.h>
|
|
#include <linux/clkdev.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/err.h>
|
|
#include <linux/pm.h>
|
|
|
|
#include "internal.h"
|
|
|
|
ACPI_MODULE_NAME("acpi_apd");
|
|
struct apd_private_data;
|
|
|
|
/**
|
|
* ACPI_APD_SYSFS : add device attributes in sysfs
|
|
* ACPI_APD_PM : attach power domain to device
|
|
*/
|
|
#define ACPI_APD_SYSFS BIT(0)
|
|
#define ACPI_APD_PM BIT(1)
|
|
|
|
/**
|
|
* struct apd_device_desc - a descriptor for apd device
|
|
* @flags: device flags like %ACPI_APD_SYSFS, %ACPI_APD_PM
|
|
* @fixed_clk_rate: fixed rate input clock source for acpi device;
|
|
* 0 means no fixed rate input clock source
|
|
* @setup: a hook routine to set device resource during create platform device
|
|
*
|
|
* Device description defined as acpi_device_id.driver_data
|
|
*/
|
|
struct apd_device_desc {
|
|
unsigned int flags;
|
|
unsigned int fixed_clk_rate;
|
|
struct property_entry *properties;
|
|
int (*setup)(struct apd_private_data *pdata);
|
|
};
|
|
|
|
struct apd_private_data {
|
|
struct clk *clk;
|
|
struct acpi_device *adev;
|
|
const struct apd_device_desc *dev_desc;
|
|
};
|
|
|
|
#if defined(CONFIG_X86_AMD_PLATFORM_DEVICE) || defined(CONFIG_ARM64)
|
|
#define APD_ADDR(desc) ((unsigned long)&desc)
|
|
|
|
static int acpi_apd_setup(struct apd_private_data *pdata)
|
|
{
|
|
const struct apd_device_desc *dev_desc = pdata->dev_desc;
|
|
struct clk *clk = ERR_PTR(-ENODEV);
|
|
|
|
if (dev_desc->fixed_clk_rate) {
|
|
clk = clk_register_fixed_rate(&pdata->adev->dev,
|
|
dev_name(&pdata->adev->dev),
|
|
NULL, 0, dev_desc->fixed_clk_rate);
|
|
clk_register_clkdev(clk, NULL, dev_name(&pdata->adev->dev));
|
|
pdata->clk = clk;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
|
|
static const struct apd_device_desc cz_i2c_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 133000000,
|
|
};
|
|
|
|
static const struct apd_device_desc wt_i2c_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 150000000,
|
|
};
|
|
|
|
static struct property_entry uart_properties[] = {
|
|
PROPERTY_ENTRY_U32("reg-io-width", 4),
|
|
PROPERTY_ENTRY_U32("reg-shift", 2),
|
|
PROPERTY_ENTRY_BOOL("snps,uart-16550-compatible"),
|
|
{ },
|
|
};
|
|
|
|
static const struct apd_device_desc cz_uart_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 48000000,
|
|
.properties = uart_properties,
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONFIG_ARM64
|
|
static const struct apd_device_desc xgene_i2c_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 100000000,
|
|
};
|
|
|
|
static const struct apd_device_desc vulcan_spi_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 133000000,
|
|
};
|
|
|
|
static const struct apd_device_desc hip07_i2c_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 200000000,
|
|
};
|
|
|
|
static const struct apd_device_desc hip08_i2c_desc = {
|
|
.setup = acpi_apd_setup,
|
|
.fixed_clk_rate = 250000000,
|
|
};
|
|
#endif
|
|
|
|
#else
|
|
|
|
#define APD_ADDR(desc) (0UL)
|
|
|
|
#endif /* CONFIG_X86_AMD_PLATFORM_DEVICE */
|
|
|
|
/**
|
|
* Create platform device during acpi scan attach handle.
|
|
* Return value > 0 on success of creating device.
|
|
*/
|
|
static int acpi_apd_create_device(struct acpi_device *adev,
|
|
const struct acpi_device_id *id)
|
|
{
|
|
const struct apd_device_desc *dev_desc = (void *)id->driver_data;
|
|
struct apd_private_data *pdata;
|
|
struct platform_device *pdev;
|
|
int ret;
|
|
|
|
if (!dev_desc) {
|
|
pdev = acpi_create_platform_device(adev, NULL);
|
|
return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
|
|
}
|
|
|
|
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
|
if (!pdata)
|
|
return -ENOMEM;
|
|
|
|
pdata->adev = adev;
|
|
pdata->dev_desc = dev_desc;
|
|
|
|
if (dev_desc->setup) {
|
|
ret = dev_desc->setup(pdata);
|
|
if (ret)
|
|
goto err_out;
|
|
}
|
|
|
|
adev->driver_data = pdata;
|
|
pdev = acpi_create_platform_device(adev, dev_desc->properties);
|
|
if (!IS_ERR_OR_NULL(pdev))
|
|
return 1;
|
|
|
|
ret = PTR_ERR(pdev);
|
|
adev->driver_data = NULL;
|
|
|
|
err_out:
|
|
kfree(pdata);
|
|
return ret;
|
|
}
|
|
|
|
static const struct acpi_device_id acpi_apd_device_ids[] = {
|
|
/* Generic apd devices */
|
|
#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
|
|
{ "AMD0010", APD_ADDR(cz_i2c_desc) },
|
|
{ "AMDI0010", APD_ADDR(wt_i2c_desc) },
|
|
{ "AMD0020", APD_ADDR(cz_uart_desc) },
|
|
{ "AMDI0020", APD_ADDR(cz_uart_desc) },
|
|
{ "AMD0030", },
|
|
#endif
|
|
#ifdef CONFIG_ARM64
|
|
{ "APMC0D0F", APD_ADDR(xgene_i2c_desc) },
|
|
{ "BRCM900D", APD_ADDR(vulcan_spi_desc) },
|
|
{ "CAV900D", APD_ADDR(vulcan_spi_desc) },
|
|
{ "HISI0A21", APD_ADDR(hip07_i2c_desc) },
|
|
{ "HISI0A22", APD_ADDR(hip08_i2c_desc) },
|
|
#endif
|
|
{ }
|
|
};
|
|
|
|
static struct acpi_scan_handler apd_handler = {
|
|
.ids = acpi_apd_device_ids,
|
|
.attach = acpi_apd_create_device,
|
|
};
|
|
|
|
void __init acpi_apd_init(void)
|
|
{
|
|
acpi_scan_add_handler(&apd_handler);
|
|
}
|