mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 07:03:09 -04:00
Reset controller changes for v4.5
- oftree support for getting reset devices by index - fixed return value consistency of of_reset_control_get - added support for STi co-processor resets - added STi status callback - various fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWSgYwAAoJEFDCiBxwnmDr8LsQAIYRPl0Vf5q/gAiC5XL+glUN AWY5F+1RfoSVOlEQ4cogWPG6urwP/NVUn+7vmyV5r0EWG/QxOEV6QXhr+VWcdct7 oJyVN57wDUIA8VIG4GPWOsNzk9eJhIypRZTVuD/4a3g4Za36eM0uPJ7RD67MrGqN q2YB4L/wufOuBVTuw4ZQtaD3ZpzR4cbtbjk73+3g3XTMrerNrkVDCgP7jU3vCGED 6Zhw8h18v4RgBI4ZWhstK8XGY97ExpfWAwzGD+TF0HRz/Uu+k4QK4DxPEENvDf+N Pb6Qto2171RUY3IfBUO6aVREYA50b+Y6S8rSc73egMsk/aqnDYcsDB+AEjHyd6sC UCVt/lIj6Y+XMfnxfton32ECdNgrq696oDrfDoqOacvATeIb8jgpas5oUP9sr9B/ fbX3K76q39nWzMO68IYT14AXa+QmQc13BxkWzxMdK+fpagd0ZoX4ZiH+eFnsAS/o 3h25MPbp0rq8D06g+ioL5SftnsrTT12GjdmvwqZ0ZZfHXmx3tmJ5SDV0ssXY6R/r 8JBfWpoD4GyZDQXbXmAaoTscuNfMVS7Uu2pMhLzJVIhrsRHNGqig0QRVmQAvYoAO IXYnsru2lAkhtFyUim+wGjcTc5QPjZjvGE8HWrvqWT69nOBoFtyvdfkZYJDfb2u/ AAbuIk+Dc6b0DWkmZEK6 =MAay -----END PGP SIGNATURE----- Merge tag 'reset-for-4.5' of git://git.pengutronix.de/git/pza/linux into next/drivers Merge "Reset controller changes for v4.5" from Philipp Zabel: - oftree support for getting reset devices by index - fixed return value consistency of of_reset_control_get - added support for STi co-processor resets - added STi status callback - various fixes * tag 'reset-for-4.5' of git://git.pengutronix.de/git/pza/linux: reset: check return value of reset_controller_register() reset: remove redundant $(CONFIG_RESET_CONTROLLER) from Makefile reset: use ENOTSUPP instead of ENOSYS reset: sunxi: mark the of_device_id array as __initconst reset: sti: add a missing blank line after declaration reset: sti: Provide ops .status() call-back reset: sti: Add support for resetting co-processors ARM: STi: Add DT defines for co-processor reset lines reset: Fix of_reset_control_get() for consistent return values reset: add of_reset_control_get_by_index()
This commit is contained in:
commit
7eccfebf65
10 changed files with 90 additions and 31 deletions
|
|
@ -1,4 +1,4 @@
|
|||
obj-$(CONFIG_RESET_CONTROLLER) += core.o
|
||||
obj-y += core.o
|
||||
obj-$(CONFIG_ARCH_LPC18XX) += reset-lpc18xx.o
|
||||
obj-$(CONFIG_ARCH_SOCFPGA) += reset-socfpga.o
|
||||
obj-$(CONFIG_ARCH_BERLIN) += reset-berlin.o
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ int reset_control_reset(struct reset_control *rstc)
|
|||
if (rstc->rcdev->ops->reset)
|
||||
return rstc->rcdev->ops->reset(rstc->rcdev, rstc->id);
|
||||
|
||||
return -ENOSYS;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(reset_control_reset);
|
||||
|
||||
|
|
@ -108,7 +108,7 @@ int reset_control_assert(struct reset_control *rstc)
|
|||
if (rstc->rcdev->ops->assert)
|
||||
return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id);
|
||||
|
||||
return -ENOSYS;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(reset_control_assert);
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ int reset_control_deassert(struct reset_control *rstc)
|
|||
if (rstc->rcdev->ops->deassert)
|
||||
return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id);
|
||||
|
||||
return -ENOSYS;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(reset_control_deassert);
|
||||
|
||||
|
|
@ -136,32 +136,29 @@ int reset_control_status(struct reset_control *rstc)
|
|||
if (rstc->rcdev->ops->status)
|
||||
return rstc->rcdev->ops->status(rstc->rcdev, rstc->id);
|
||||
|
||||
return -ENOSYS;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(reset_control_status);
|
||||
|
||||
/**
|
||||
* of_reset_control_get - Lookup and obtain a reference to a reset controller.
|
||||
* of_reset_control_get_by_index - Lookup and obtain a reference to a reset
|
||||
* controller by index.
|
||||
* @node: device to be reset by the controller
|
||||
* @id: reset line name
|
||||
* @index: index of the reset controller
|
||||
*
|
||||
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
||||
*
|
||||
* Use of id names is optional.
|
||||
* This is to be used to perform a list of resets for a device or power domain
|
||||
* in whatever order. Returns a struct reset_control or IS_ERR() condition
|
||||
* containing errno.
|
||||
*/
|
||||
struct reset_control *of_reset_control_get(struct device_node *node,
|
||||
const char *id)
|
||||
struct reset_control *of_reset_control_get_by_index(struct device_node *node,
|
||||
int index)
|
||||
{
|
||||
struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER);
|
||||
struct reset_controller_dev *r, *rcdev;
|
||||
struct of_phandle_args args;
|
||||
int index = 0;
|
||||
int rstc_id;
|
||||
int ret;
|
||||
|
||||
if (id)
|
||||
index = of_property_match_string(node,
|
||||
"reset-names", id);
|
||||
ret = of_parse_phandle_with_args(node, "resets", "#reset-cells",
|
||||
index, &args);
|
||||
if (ret)
|
||||
|
|
@ -202,6 +199,30 @@ struct reset_control *of_reset_control_get(struct device_node *node,
|
|||
|
||||
return rstc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_reset_control_get_by_index);
|
||||
|
||||
/**
|
||||
* of_reset_control_get - Lookup and obtain a reference to a reset controller.
|
||||
* @node: device to be reset by the controller
|
||||
* @id: reset line name
|
||||
*
|
||||
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
||||
*
|
||||
* Use of id names is optional.
|
||||
*/
|
||||
struct reset_control *of_reset_control_get(struct device_node *node,
|
||||
const char *id)
|
||||
{
|
||||
int index = 0;
|
||||
|
||||
if (id) {
|
||||
index = of_property_match_string(node,
|
||||
"reset-names", id);
|
||||
if (index < 0)
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
return of_reset_control_get_by_index(node, index);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_reset_control_get);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -87,9 +87,7 @@ static int berlin2_reset_probe(struct platform_device *pdev)
|
|||
priv->rcdev.of_reset_n_cells = 2;
|
||||
priv->rcdev.of_xlate = berlin_reset_xlate;
|
||||
|
||||
reset_controller_register(&priv->rcdev);
|
||||
|
||||
return 0;
|
||||
return reset_controller_register(&priv->rcdev);
|
||||
}
|
||||
|
||||
static const struct of_device_id berlin_reset_dt_match[] = {
|
||||
|
|
|
|||
|
|
@ -133,9 +133,8 @@ static int socfpga_reset_probe(struct platform_device *pdev)
|
|||
data->rcdev.nr_resets = NR_BANKS * BITS_PER_LONG;
|
||||
data->rcdev.ops = &socfpga_reset_ops;
|
||||
data->rcdev.of_node = pdev->dev.of_node;
|
||||
reset_controller_register(&data->rcdev);
|
||||
|
||||
return 0;
|
||||
return reset_controller_register(&data->rcdev);
|
||||
}
|
||||
|
||||
static int socfpga_reset_remove(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -108,9 +108,8 @@ static int sunxi_reset_init(struct device_node *np)
|
|||
data->rcdev.nr_resets = size * 32;
|
||||
data->rcdev.ops = &sunxi_reset_ops;
|
||||
data->rcdev.of_node = np;
|
||||
reset_controller_register(&data->rcdev);
|
||||
|
||||
return 0;
|
||||
return reset_controller_register(&data->rcdev);
|
||||
|
||||
err_alloc:
|
||||
kfree(data);
|
||||
|
|
@ -122,7 +121,7 @@ err_alloc:
|
|||
* our system, before we can even think of using a regular device
|
||||
* driver for it.
|
||||
*/
|
||||
static const struct of_device_id sunxi_early_reset_dt_ids[] __initdata = {
|
||||
static const struct of_device_id sunxi_early_reset_dt_ids[] __initconst = {
|
||||
{ .compatible = "allwinner,sun6i-a31-ahb1-reset", },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
|
|
|||
|
|
@ -121,9 +121,8 @@ static int zynq_reset_probe(struct platform_device *pdev)
|
|||
priv->rcdev.nr_resets = resource_size(res) / 4 * BITS_PER_LONG;
|
||||
priv->rcdev.ops = &zynq_reset_ops;
|
||||
priv->rcdev.of_node = pdev->dev.of_node;
|
||||
reset_controller_register(&priv->rcdev);
|
||||
|
||||
return 0;
|
||||
return reset_controller_register(&priv->rcdev);
|
||||
}
|
||||
|
||||
static int zynq_reset_remove(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ static const struct syscfg_reset_channel_data stih407_powerdowns[] = {
|
|||
};
|
||||
|
||||
/* Reset Generator control 0/1 */
|
||||
#define SYSCFG_5128 0x200
|
||||
#define SYSCFG_5131 0x20c
|
||||
#define SYSCFG_5132 0x210
|
||||
|
||||
|
|
@ -96,6 +97,10 @@ static const struct syscfg_reset_channel_data stih407_softresets[] = {
|
|||
[STIH407_ERAM_HVA_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 1),
|
||||
[STIH407_LPM_SOFTRESET] = STIH407_SRST_SBC(SYSCFG_4002, 2),
|
||||
[STIH407_KEYSCAN_SOFTRESET] = STIH407_SRST_LPM(LPM_SYSCFG_1, 8),
|
||||
[STIH407_ST231_AUD_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 26),
|
||||
[STIH407_ST231_DMU_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 27),
|
||||
[STIH407_ST231_GP0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 28),
|
||||
[STIH407_ST231_GP1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5128, 2),
|
||||
};
|
||||
|
||||
/* PicoPHY reset/control */
|
||||
|
|
|
|||
|
|
@ -103,17 +103,42 @@ static int syscfg_reset_deassert(struct reset_controller_dev *rcdev,
|
|||
static int syscfg_reset_dev(struct reset_controller_dev *rcdev,
|
||||
unsigned long idx)
|
||||
{
|
||||
int err = syscfg_reset_assert(rcdev, idx);
|
||||
int err;
|
||||
|
||||
err = syscfg_reset_assert(rcdev, idx);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return syscfg_reset_deassert(rcdev, idx);
|
||||
}
|
||||
|
||||
static int syscfg_reset_status(struct reset_controller_dev *rcdev,
|
||||
unsigned long idx)
|
||||
{
|
||||
struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev);
|
||||
const struct syscfg_reset_channel *ch;
|
||||
u32 ret_val = 0;
|
||||
int err;
|
||||
|
||||
if (idx >= rcdev->nr_resets)
|
||||
return -EINVAL;
|
||||
|
||||
ch = &rst->channels[idx];
|
||||
if (ch->ack)
|
||||
err = regmap_field_read(ch->ack, &ret_val);
|
||||
else
|
||||
err = regmap_field_read(ch->reset, &ret_val);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return rst->active_low ? !ret_val : !!ret_val;
|
||||
}
|
||||
|
||||
static struct reset_control_ops syscfg_reset_ops = {
|
||||
.reset = syscfg_reset_dev,
|
||||
.assert = syscfg_reset_assert,
|
||||
.deassert = syscfg_reset_deassert,
|
||||
.status = syscfg_reset_status,
|
||||
};
|
||||
|
||||
static int syscfg_reset_controller_register(struct device *dev,
|
||||
|
|
|
|||
|
|
@ -52,6 +52,10 @@
|
|||
#define STIH407_KEYSCAN_SOFTRESET 26
|
||||
#define STIH407_USB2_PORT0_SOFTRESET 27
|
||||
#define STIH407_USB2_PORT1_SOFTRESET 28
|
||||
#define STIH407_ST231_AUD_SOFTRESET 29
|
||||
#define STIH407_ST231_DMU_SOFTRESET 30
|
||||
#define STIH407_ST231_GP0_SOFTRESET 31
|
||||
#define STIH407_ST231_GP1_SOFTRESET 32
|
||||
|
||||
/* Picophy reset defines */
|
||||
#define STIH407_PICOPHY0_RESET 0
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@ static inline struct reset_control *devm_reset_control_get_optional(
|
|||
struct reset_control *of_reset_control_get(struct device_node *node,
|
||||
const char *id);
|
||||
|
||||
struct reset_control *of_reset_control_get_by_index(
|
||||
struct device_node *node, int index);
|
||||
|
||||
#else
|
||||
|
||||
static inline int reset_control_reset(struct reset_control *rstc)
|
||||
|
|
@ -71,7 +74,7 @@ static inline void reset_control_put(struct reset_control *rstc)
|
|||
|
||||
static inline int device_reset_optional(struct device *dev)
|
||||
{
|
||||
return -ENOSYS;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline struct reset_control *__must_check reset_control_get(
|
||||
|
|
@ -91,19 +94,25 @@ static inline struct reset_control *__must_check devm_reset_control_get(
|
|||
static inline struct reset_control *reset_control_get_optional(
|
||||
struct device *dev, const char *id)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
static inline struct reset_control *devm_reset_control_get_optional(
|
||||
struct device *dev, const char *id)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
static inline struct reset_control *of_reset_control_get(
|
||||
struct device_node *node, const char *id)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
static inline struct reset_control *of_reset_control_get_by_index(
|
||||
struct device_node *node, int index)
|
||||
{
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_RESET_CONTROLLER */
|
||||
|
|
|
|||
Loading…
Reference in a new issue