ARM: SoC driver updates for 4.17
The main addition this time around is the new ARM "SCMI" framework,
which is the latest in a series of standards coming from ARM to do power
management in a platform independent way. This has been through many
review cycles, and it relies on a rather interesting way of using the
mailbox subsystem, but in the end I agreed that Sudeep's version was
the best we could do after all.
Other changes include:
- the ARM CCN driver is moved out of drivers/bus into drivers/perf,
which makes more sense. Similarly, the performance monitoring
portion of the CCI driver are moved the same way and cleaned up
a little more.
- a series of updates to the SCPI framework
- support for the Mediatek mt7623a SoC in drivers/soc
- support for additional NVIDIA Tegra hardware in drivers/soc
- a new reset driver for Socionext Uniphier
- lesser bug fixes in drivers/soc, drivers/tee, drivers/memory, and
drivers/firmware and drivers/reset across platforms
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQIcBAABAgAGBQJaxiNzAAoJEGCrR//JCVInYhYP/2kPhc5t/kszA1bcklcbO9dY
eX37Ra/RR4yQ5yeQZVIZ4UkUovxk9PmG2tM4K5oJaTDsz5pPEgavVOOr3sbfj6vb
4O9auTeysEQlHcbVdNFum0YS2gUY2YD7D12DTRorotLxCqod184ccWXq0XGfIWaY
l3YRrcL/lPlqmyS3z/GNx9oNygOMUzEfXfIQYICyzHuYiLBUGnkKC1vIb+Hx1TDq
Cxk++AUqH13Mss24O2A2QQh+oBHj2BybDLLqwcC5PSpsUbFrVCfzG54l43mig32T
NOxV0Qnml2wAtU4H0QcgtSgwRimHD0YOiX8ssquvDDiqTqM5G+llSTGkEbYe+AUW
4GIZYoBOwGkfEXS+tyymHe9yfc5h1OLYAeFU1jRm723c7phanuu67rPn35YC8UMK
zSql10JpkAGNzMikrxxb6wnis951w2UFlzhgZQ6ItA/nRq3l+oEQA0Qiljv965nz
DVLsD5+gdhK6GBctkzlsD5HFn6GjM8JilnsOVPHD765nKnVBSxKiXRLV228XVug2
rChF1FhQqLnM54jCMqHZX5fS9SbSgtYswHqIXpVw6GmJkqq/Ly10yGR0vuWD+uyn
BV7q5AKpGrwm6wZkMM2uZ1VdUtWzn856AbkqrvX/QhmJcX4McuqaLUrC8bSOj1ty
KeVil0akq3nU+xHl5Ojs
=Pmsx
-----END PGP SIGNATURE-----
Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC driver updates from Arnd Bergmann:
"The main addition this time around is the new ARM "SCMI" framework,
which is the latest in a series of standards coming from ARM to do
power management in a platform independent way.
This has been through many review cycles, and it relies on a rather
interesting way of using the mailbox subsystem, but in the end I
agreed that Sudeep's version was the best we could do after all.
Other changes include:
- the ARM CCN driver is moved out of drivers/bus into drivers/perf,
which makes more sense. Similarly, the performance monitoring
portion of the CCI driver are moved the same way and cleaned up a
little more.
- a series of updates to the SCPI framework
- support for the Mediatek mt7623a SoC in drivers/soc
- support for additional NVIDIA Tegra hardware in drivers/soc
- a new reset driver for Socionext Uniphier
- lesser bug fixes in drivers/soc, drivers/tee, drivers/memory, and
drivers/firmware and drivers/reset across platforms"
* tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (87 commits)
reset: uniphier: add ethernet reset control support for PXs3
reset: stm32mp1: Enable stm32mp1 reset driver
dt-bindings: reset: add STM32MP1 resets
reset: uniphier: add Pro4/Pro5/PXs2 audio systems reset control
reset: imx7: add 'depends on HAS_IOMEM' to fix unmet dependency
reset: modify the way reset lookup works for board files
reset: add support for non-DT systems
clk: scmi: use devm_of_clk_add_hw_provider() API and drop scmi_clocks_remove
firmware: arm_scmi: prevent accessing rate_discrete uninitialized
hwmon: (scmi) return -EINVAL when sensor information is unavailable
amlogic: meson-gx-socinfo: Update soc ids
soc/tegra: pmc: Use the new reset APIs to manage reset controllers
soc: mediatek: update power domain data of MT2712
dt-bindings: soc: update MT2712 power dt-bindings
cpufreq: scmi: add thermal dependency
soc: mediatek: fix the mistaken pointer accessed when subdomains are added
soc: mediatek: add SCPSYS power domain driver for MediaTek MT7623A SoC
soc: mediatek: avoid hardcoded value with bus_prot_mask
dt-bindings: soc: add header files required for MT7623A SCPSYS dt-binding
dt-bindings: soc: add SCPSYS binding for MT7623 and MT7623A SoC
...
This commit is contained in:
commit
38c23685b2
79 changed files with 6861 additions and 2189 deletions
|
|
@ -29,6 +29,7 @@ enum hwmon_sensor_types {
|
|||
hwmon_humidity,
|
||||
hwmon_fan,
|
||||
hwmon_pwm,
|
||||
hwmon_max,
|
||||
};
|
||||
|
||||
enum hwmon_chip_attributes {
|
||||
|
|
|
|||
|
|
@ -26,6 +26,31 @@ struct module;
|
|||
struct device_node;
|
||||
struct of_phandle_args;
|
||||
|
||||
/**
|
||||
* struct reset_control_lookup - represents a single lookup entry
|
||||
*
|
||||
* @list: internal list of all reset lookup entries
|
||||
* @provider: name of the reset controller device controlling this reset line
|
||||
* @index: ID of the reset controller in the reset controller device
|
||||
* @dev_id: name of the device associated with this reset line
|
||||
* @con_id name of the reset line (can be NULL)
|
||||
*/
|
||||
struct reset_control_lookup {
|
||||
struct list_head list;
|
||||
const char *provider;
|
||||
unsigned int index;
|
||||
const char *dev_id;
|
||||
const char *con_id;
|
||||
};
|
||||
|
||||
#define RESET_LOOKUP(_provider, _index, _dev_id, _con_id) \
|
||||
{ \
|
||||
.provider = _provider, \
|
||||
.index = _index, \
|
||||
.dev_id = _dev_id, \
|
||||
.con_id = _con_id, \
|
||||
}
|
||||
|
||||
/**
|
||||
* struct reset_controller_dev - reset controller entity that might
|
||||
* provide multiple reset controls
|
||||
|
|
@ -33,6 +58,7 @@ struct of_phandle_args;
|
|||
* @owner: kernel module of the reset controller driver
|
||||
* @list: internal list of reset controller devices
|
||||
* @reset_control_head: head of internal list of requested reset controls
|
||||
* @dev: corresponding driver model device struct
|
||||
* @of_node: corresponding device tree node as phandle target
|
||||
* @of_reset_n_cells: number of cells in reset line specifiers
|
||||
* @of_xlate: translation function to translate from specifier as found in the
|
||||
|
|
@ -44,6 +70,7 @@ struct reset_controller_dev {
|
|||
struct module *owner;
|
||||
struct list_head list;
|
||||
struct list_head reset_control_head;
|
||||
struct device *dev;
|
||||
struct device_node *of_node;
|
||||
int of_reset_n_cells;
|
||||
int (*of_xlate)(struct reset_controller_dev *rcdev,
|
||||
|
|
@ -58,4 +85,7 @@ struct device;
|
|||
int devm_reset_controller_register(struct device *dev,
|
||||
struct reset_controller_dev *rcdev);
|
||||
|
||||
void reset_controller_add_lookup(struct reset_control_lookup *lookup,
|
||||
unsigned int num_entries);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
277
include/linux/scmi_protocol.h
Normal file
277
include/linux/scmi_protocol.h
Normal file
|
|
@ -0,0 +1,277 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SCMI Message Protocol driver header
|
||||
*
|
||||
* Copyright (C) 2018 ARM Ltd.
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define SCMI_MAX_STR_SIZE 16
|
||||
#define SCMI_MAX_NUM_RATES 16
|
||||
|
||||
/**
|
||||
* struct scmi_revision_info - version information structure
|
||||
*
|
||||
* @major_ver: Major ABI version. Change here implies risk of backward
|
||||
* compatibility break.
|
||||
* @minor_ver: Minor ABI version. Change here implies new feature addition,
|
||||
* or compatible change in ABI.
|
||||
* @num_protocols: Number of protocols that are implemented, excluding the
|
||||
* base protocol.
|
||||
* @num_agents: Number of agents in the system.
|
||||
* @impl_ver: A vendor-specific implementation version.
|
||||
* @vendor_id: A vendor identifier(Null terminated ASCII string)
|
||||
* @sub_vendor_id: A sub-vendor identifier(Null terminated ASCII string)
|
||||
*/
|
||||
struct scmi_revision_info {
|
||||
u16 major_ver;
|
||||
u16 minor_ver;
|
||||
u8 num_protocols;
|
||||
u8 num_agents;
|
||||
u32 impl_ver;
|
||||
char vendor_id[SCMI_MAX_STR_SIZE];
|
||||
char sub_vendor_id[SCMI_MAX_STR_SIZE];
|
||||
};
|
||||
|
||||
struct scmi_clock_info {
|
||||
char name[SCMI_MAX_STR_SIZE];
|
||||
bool rate_discrete;
|
||||
union {
|
||||
struct {
|
||||
int num_rates;
|
||||
u64 rates[SCMI_MAX_NUM_RATES];
|
||||
} list;
|
||||
struct {
|
||||
u64 min_rate;
|
||||
u64 max_rate;
|
||||
u64 step_size;
|
||||
} range;
|
||||
};
|
||||
};
|
||||
|
||||
struct scmi_handle;
|
||||
|
||||
/**
|
||||
* struct scmi_clk_ops - represents the various operations provided
|
||||
* by SCMI Clock Protocol
|
||||
*
|
||||
* @count_get: get the count of clocks provided by SCMI
|
||||
* @info_get: get the information of the specified clock
|
||||
* @rate_get: request the current clock rate of a clock
|
||||
* @rate_set: set the clock rate of a clock
|
||||
* @enable: enables the specified clock
|
||||
* @disable: disables the specified clock
|
||||
*/
|
||||
struct scmi_clk_ops {
|
||||
int (*count_get)(const struct scmi_handle *handle);
|
||||
|
||||
const struct scmi_clock_info *(*info_get)
|
||||
(const struct scmi_handle *handle, u32 clk_id);
|
||||
int (*rate_get)(const struct scmi_handle *handle, u32 clk_id,
|
||||
u64 *rate);
|
||||
int (*rate_set)(const struct scmi_handle *handle, u32 clk_id,
|
||||
u32 config, u64 rate);
|
||||
int (*enable)(const struct scmi_handle *handle, u32 clk_id);
|
||||
int (*disable)(const struct scmi_handle *handle, u32 clk_id);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_perf_ops - represents the various operations provided
|
||||
* by SCMI Performance Protocol
|
||||
*
|
||||
* @limits_set: sets limits on the performance level of a domain
|
||||
* @limits_get: gets limits on the performance level of a domain
|
||||
* @level_set: sets the performance level of a domain
|
||||
* @level_get: gets the performance level of a domain
|
||||
* @device_domain_id: gets the scmi domain id for a given device
|
||||
* @get_transition_latency: gets the DVFS transition latency for a given device
|
||||
* @add_opps_to_device: adds all the OPPs for a given device
|
||||
* @freq_set: sets the frequency for a given device using sustained frequency
|
||||
* to sustained performance level mapping
|
||||
* @freq_get: gets the frequency for a given device using sustained frequency
|
||||
* to sustained performance level mapping
|
||||
*/
|
||||
struct scmi_perf_ops {
|
||||
int (*limits_set)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 max_perf, u32 min_perf);
|
||||
int (*limits_get)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 *max_perf, u32 *min_perf);
|
||||
int (*level_set)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 level, bool poll);
|
||||
int (*level_get)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 *level, bool poll);
|
||||
int (*device_domain_id)(struct device *dev);
|
||||
int (*get_transition_latency)(const struct scmi_handle *handle,
|
||||
struct device *dev);
|
||||
int (*add_opps_to_device)(const struct scmi_handle *handle,
|
||||
struct device *dev);
|
||||
int (*freq_set)(const struct scmi_handle *handle, u32 domain,
|
||||
unsigned long rate, bool poll);
|
||||
int (*freq_get)(const struct scmi_handle *handle, u32 domain,
|
||||
unsigned long *rate, bool poll);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_power_ops - represents the various operations provided
|
||||
* by SCMI Power Protocol
|
||||
*
|
||||
* @num_domains_get: get the count of power domains provided by SCMI
|
||||
* @name_get: gets the name of a power domain
|
||||
* @state_set: sets the power state of a power domain
|
||||
* @state_get: gets the power state of a power domain
|
||||
*/
|
||||
struct scmi_power_ops {
|
||||
int (*num_domains_get)(const struct scmi_handle *handle);
|
||||
char *(*name_get)(const struct scmi_handle *handle, u32 domain);
|
||||
#define SCMI_POWER_STATE_TYPE_SHIFT 30
|
||||
#define SCMI_POWER_STATE_ID_MASK (BIT(28) - 1)
|
||||
#define SCMI_POWER_STATE_PARAM(type, id) \
|
||||
((((type) & BIT(0)) << SCMI_POWER_STATE_TYPE_SHIFT) | \
|
||||
((id) & SCMI_POWER_STATE_ID_MASK))
|
||||
#define SCMI_POWER_STATE_GENERIC_ON SCMI_POWER_STATE_PARAM(0, 0)
|
||||
#define SCMI_POWER_STATE_GENERIC_OFF SCMI_POWER_STATE_PARAM(1, 0)
|
||||
int (*state_set)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 state);
|
||||
int (*state_get)(const struct scmi_handle *handle, u32 domain,
|
||||
u32 *state);
|
||||
};
|
||||
|
||||
struct scmi_sensor_info {
|
||||
u32 id;
|
||||
u8 type;
|
||||
char name[SCMI_MAX_STR_SIZE];
|
||||
};
|
||||
|
||||
/*
|
||||
* Partial list from Distributed Management Task Force (DMTF) specification:
|
||||
* DSP0249 (Platform Level Data Model specification)
|
||||
*/
|
||||
enum scmi_sensor_class {
|
||||
NONE = 0x0,
|
||||
TEMPERATURE_C = 0x2,
|
||||
VOLTAGE = 0x5,
|
||||
CURRENT = 0x6,
|
||||
POWER = 0x7,
|
||||
ENERGY = 0x8,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_sensor_ops - represents the various operations provided
|
||||
* by SCMI Sensor Protocol
|
||||
*
|
||||
* @count_get: get the count of sensors provided by SCMI
|
||||
* @info_get: get the information of the specified sensor
|
||||
* @configuration_set: control notifications on cross-over events for
|
||||
* the trip-points
|
||||
* @trip_point_set: selects and configures a trip-point of interest
|
||||
* @reading_get: gets the current value of the sensor
|
||||
*/
|
||||
struct scmi_sensor_ops {
|
||||
int (*count_get)(const struct scmi_handle *handle);
|
||||
|
||||
const struct scmi_sensor_info *(*info_get)
|
||||
(const struct scmi_handle *handle, u32 sensor_id);
|
||||
int (*configuration_set)(const struct scmi_handle *handle,
|
||||
u32 sensor_id);
|
||||
int (*trip_point_set)(const struct scmi_handle *handle, u32 sensor_id,
|
||||
u8 trip_id, u64 trip_value);
|
||||
int (*reading_get)(const struct scmi_handle *handle, u32 sensor_id,
|
||||
bool async, u64 *value);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scmi_handle - Handle returned to ARM SCMI clients for usage.
|
||||
*
|
||||
* @dev: pointer to the SCMI device
|
||||
* @version: pointer to the structure containing SCMI version information
|
||||
* @power_ops: pointer to set of power protocol operations
|
||||
* @perf_ops: pointer to set of performance protocol operations
|
||||
* @clk_ops: pointer to set of clock protocol operations
|
||||
* @sensor_ops: pointer to set of sensor protocol operations
|
||||
*/
|
||||
struct scmi_handle {
|
||||
struct device *dev;
|
||||
struct scmi_revision_info *version;
|
||||
struct scmi_perf_ops *perf_ops;
|
||||
struct scmi_clk_ops *clk_ops;
|
||||
struct scmi_power_ops *power_ops;
|
||||
struct scmi_sensor_ops *sensor_ops;
|
||||
/* for protocol internal use */
|
||||
void *perf_priv;
|
||||
void *clk_priv;
|
||||
void *power_priv;
|
||||
void *sensor_priv;
|
||||
};
|
||||
|
||||
enum scmi_std_protocol {
|
||||
SCMI_PROTOCOL_BASE = 0x10,
|
||||
SCMI_PROTOCOL_POWER = 0x11,
|
||||
SCMI_PROTOCOL_SYSTEM = 0x12,
|
||||
SCMI_PROTOCOL_PERF = 0x13,
|
||||
SCMI_PROTOCOL_CLOCK = 0x14,
|
||||
SCMI_PROTOCOL_SENSOR = 0x15,
|
||||
};
|
||||
|
||||
struct scmi_device {
|
||||
u32 id;
|
||||
u8 protocol_id;
|
||||
struct device dev;
|
||||
struct scmi_handle *handle;
|
||||
};
|
||||
|
||||
#define to_scmi_dev(d) container_of(d, struct scmi_device, dev)
|
||||
|
||||
struct scmi_device *
|
||||
scmi_device_create(struct device_node *np, struct device *parent, int protocol);
|
||||
void scmi_device_destroy(struct scmi_device *scmi_dev);
|
||||
|
||||
struct scmi_device_id {
|
||||
u8 protocol_id;
|
||||
};
|
||||
|
||||
struct scmi_driver {
|
||||
const char *name;
|
||||
int (*probe)(struct scmi_device *sdev);
|
||||
void (*remove)(struct scmi_device *sdev);
|
||||
const struct scmi_device_id *id_table;
|
||||
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
#define to_scmi_driver(d) container_of(d, struct scmi_driver, driver)
|
||||
|
||||
#ifdef CONFIG_ARM_SCMI_PROTOCOL
|
||||
int scmi_driver_register(struct scmi_driver *driver,
|
||||
struct module *owner, const char *mod_name);
|
||||
void scmi_driver_unregister(struct scmi_driver *driver);
|
||||
#else
|
||||
static inline int
|
||||
scmi_driver_register(struct scmi_driver *driver, struct module *owner,
|
||||
const char *mod_name)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void scmi_driver_unregister(struct scmi_driver *driver) {}
|
||||
#endif /* CONFIG_ARM_SCMI_PROTOCOL */
|
||||
|
||||
#define scmi_register(driver) \
|
||||
scmi_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
|
||||
#define scmi_unregister(driver) \
|
||||
scmi_driver_unregister(driver)
|
||||
|
||||
/**
|
||||
* module_scmi_driver() - Helper macro for registering a scmi driver
|
||||
* @__scmi_driver: scmi_driver structure
|
||||
*
|
||||
* Helper macro for scmi drivers to set up proper module init / exit
|
||||
* functions. Replaces module_init() and module_exit() and keeps people from
|
||||
* printing pointless things to the kernel log when their driver is loaded.
|
||||
*/
|
||||
#define module_scmi_driver(__scmi_driver) \
|
||||
module_driver(__scmi_driver, scmi_register, scmi_unregister)
|
||||
|
||||
typedef int (*scmi_prot_init_fn_t)(struct scmi_handle *);
|
||||
int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn);
|
||||
void scmi_protocol_unregister(int protocol_id);
|
||||
|
|
@ -21,6 +21,10 @@
|
|||
#define MT8173_TOP_AXI_PROT_EN_MFG_M1 BIT(22)
|
||||
#define MT8173_TOP_AXI_PROT_EN_MFG_SNOOP_OUT BIT(23)
|
||||
|
||||
#define MT2701_TOP_AXI_PROT_EN_MM_M0 BIT(1)
|
||||
#define MT2701_TOP_AXI_PROT_EN_CONN_M BIT(2)
|
||||
#define MT2701_TOP_AXI_PROT_EN_CONN_S BIT(8)
|
||||
|
||||
#define MT7622_TOP_AXI_PROT_EN_ETHSYS (BIT(3) | BIT(17))
|
||||
#define MT7622_TOP_AXI_PROT_EN_HIF0 (BIT(24) | BIT(25))
|
||||
#define MT7622_TOP_AXI_PROT_EN_HIF1 (BIT(26) | BIT(27) | \
|
||||
|
|
|
|||
|
|
@ -1,12 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Header for EXYNOS PMU Driver support
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SOC_EXYNOS_PMU_H
|
||||
|
|
|
|||
|
|
@ -1,14 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2010-2015 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* EXYNOS - Power management unit definition
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* Notice:
|
||||
* This is not a list of all Exynos Power Management Unit SFRs.
|
||||
* There are too many of them, not mentioning subtle differences
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue