Commit dbc3c09b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull ARM SoC fixes from Olof Johansson:
 "A bigger batch than I anticipated this week, for two reasons:

   - Some fallout on Davinci from board file -> DTB conversion, that
     also includes a few longer-standing fixes (i.e. not recent
     regressions).

   - drivers/reset material that has been in linux-next for a while, but
     didn't get sent to us until now for a variety of reasons
     (maintainer out sick, holidays, etc). There's a functional
     dependency in there such that one platform (Altera's SoCFPGA) won't
     boot without one of the patches; instead of reverting the patch
     that got merged, I looked at this set and decided it was small
     enough that I'll pick it up anyway. If you disagree I can revisit
     with a smaller set.

  That being said, there's also a handful of the usual stuff:

   - Fix for a crash on Armada 7K/8K when the kernel touches
     PSCI-reserved memory

   - Fix for PCIe reset on Macchiatobin (Armada 8K development board,
     what this email is sent from in fact :)

   - Enable a few new-merged modules for Amlogic in arm64 defconfig

   - Error path fixes on Integrator

   - Build fix for Renesas and Qualcomm

   - Initialization fix for Renesas RZ/G2E

  .. plus a few more fixlets"

* tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (28 commits)
  ARM: integrator: impd1: use struct_size() in devm_kzalloc()
  qcom-scm: Include <linux/err.h> header
  gpio: pl061: handle failed allocations
  ARM: dts: kirkwood: Fix polarity of GPIO fan lines
  arm64: dts: marvell: mcbin: fix PCIe reset signal
  arm64: dts: marvell: armada-ap806: reserve PSCI area
  ARM: dts: da850-lcdk: Correct the sound card name
  ARM: dts: da850-lcdk: Correct the audio codec regulators
  ARM: dts: da850-evm: Correct the sound card name
  ARM: dts: da850-evm: Correct the audio codec regulators
  ARM: davinci: omapl138-hawk: fix label names in GPIO lookup entries
  ARM: davinci: dm644x-evm: fix label names in GPIO lookup entries
  ARM: davinci: dm355-evm: fix label names in GPIO lookup entries
  ARM: davinci: da850-evm: fix label names in GPIO lookup entries
  ARM: davinci: da830-evm: fix label names in GPIO lookup entries
  arm64: defconfig: enable modules for amlogic s400 sound card
  reset: uniphier-glue: Add AHCI reset control support in glue layer
  dt-bindings: reset: uniphier: Add AHCI core reset description
  reset: uniphier-usb3: Rename to reset-uniphier-glue
  dt-bindings: reset: uniphier: Replace the expression of USB3 with generic peripherals
  ...
parents 6b529fb0 46561217
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2018, Intel Corporation
* Copied from reset-sunxi.c
*/
#include <linux/err.h>
#include <linux/io.h>
#include <linux/init.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include "reset-simple.h"
#define SOCFPGA_NR_BANKS 8
void __init socfpga_reset_init(void);
static int a10_reset_init(struct device_node *np)
{
struct reset_simple_data *data;
struct resource res;
resource_size_t size;
int ret;
u32 reg_offset = 0x10;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
ret = of_address_to_resource(np, 0, &res);
if (ret)
goto err_alloc;
size = resource_size(&res);
if (!request_mem_region(res.start, size, np->name)) {
ret = -EBUSY;
goto err_alloc;
}
data->membase = ioremap(res.start, size);
if (!data->membase) {
ret = -ENOMEM;
goto err_alloc;
}
if (of_property_read_u32(np, "altr,modrst-offset", &reg_offset))
pr_warn("missing altr,modrst-offset property, assuming 0x10\n");
data->membase += reg_offset;
spin_lock_init(&data->lock);
data->rcdev.owner = THIS_MODULE;
data->rcdev.nr_resets = SOCFPGA_NR_BANKS * 32;
data->rcdev.ops = &reset_simple_ops;
data->rcdev.of_node = np;
data->status_active_low = true;
return reset_controller_register(&data->rcdev);
err_alloc:
kfree(data);
return ret;
};
/*
* These are the reset controller we need to initialize early on in
* our system, before we can even think of using a regular device
* driver for it.
* The controllers that we can register through the regular device
* model are handled by the simple reset driver directly.
*/
static const struct of_device_id socfpga_early_reset_dt_ids[] __initconst = {
{ .compatible = "altr,rst-mgr", },
{ /* sentinel */ },
};
void __init socfpga_reset_init(void)
{
struct device_node *np;
for_each_matching_node(np, socfpga_early_reset_dt_ids)
a10_reset_init(np);
}
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
// //
// reset-uniphier-usb3.c - USB3 reset driver for UniPhier // reset-uniphier-glue.c - Glue layer reset driver for UniPhier
// Copyright 2018 Socionext Inc. // Copyright 2018 Socionext Inc.
// Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com> // Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
...@@ -15,24 +15,24 @@ ...@@ -15,24 +15,24 @@
#define MAX_CLKS 2 #define MAX_CLKS 2
#define MAX_RSTS 2 #define MAX_RSTS 2
struct uniphier_usb3_reset_soc_data { struct uniphier_glue_reset_soc_data {
int nclks; int nclks;
const char * const *clock_names; const char * const *clock_names;
int nrsts; int nrsts;
const char * const *reset_names; const char * const *reset_names;
}; };
struct uniphier_usb3_reset_priv { struct uniphier_glue_reset_priv {
struct clk_bulk_data clk[MAX_CLKS]; struct clk_bulk_data clk[MAX_CLKS];
struct reset_control *rst[MAX_RSTS]; struct reset_control *rst[MAX_RSTS];
struct reset_simple_data rdata; struct reset_simple_data rdata;
const struct uniphier_usb3_reset_soc_data *data; const struct uniphier_glue_reset_soc_data *data;
}; };
static int uniphier_usb3_reset_probe(struct platform_device *pdev) static int uniphier_glue_reset_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct uniphier_usb3_reset_priv *priv; struct uniphier_glue_reset_priv *priv;
struct resource *res; struct resource *res;
resource_size_t size; resource_size_t size;
const char *name; const char *name;
...@@ -100,9 +100,9 @@ static int uniphier_usb3_reset_probe(struct platform_device *pdev) ...@@ -100,9 +100,9 @@ static int uniphier_usb3_reset_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int uniphier_usb3_reset_remove(struct platform_device *pdev) static int uniphier_glue_reset_remove(struct platform_device *pdev)
{ {
struct uniphier_usb3_reset_priv *priv = platform_get_drvdata(pdev); struct uniphier_glue_reset_priv *priv = platform_get_drvdata(pdev);
int i; int i;
for (i = 0; i < priv->data->nrsts; i++) for (i = 0; i < priv->data->nrsts; i++)
...@@ -117,7 +117,7 @@ static const char * const uniphier_pro4_clock_reset_names[] = { ...@@ -117,7 +117,7 @@ static const char * const uniphier_pro4_clock_reset_names[] = {
"gio", "link", "gio", "link",
}; };
static const struct uniphier_usb3_reset_soc_data uniphier_pro4_data = { static const struct uniphier_glue_reset_soc_data uniphier_pro4_data = {
.nclks = ARRAY_SIZE(uniphier_pro4_clock_reset_names), .nclks = ARRAY_SIZE(uniphier_pro4_clock_reset_names),
.clock_names = uniphier_pro4_clock_reset_names, .clock_names = uniphier_pro4_clock_reset_names,
.nrsts = ARRAY_SIZE(uniphier_pro4_clock_reset_names), .nrsts = ARRAY_SIZE(uniphier_pro4_clock_reset_names),
...@@ -128,14 +128,14 @@ static const char * const uniphier_pxs2_clock_reset_names[] = { ...@@ -128,14 +128,14 @@ static const char * const uniphier_pxs2_clock_reset_names[] = {
"link", "link",
}; };
static const struct uniphier_usb3_reset_soc_data uniphier_pxs2_data = { static const struct uniphier_glue_reset_soc_data uniphier_pxs2_data = {
.nclks = ARRAY_SIZE(uniphier_pxs2_clock_reset_names), .nclks = ARRAY_SIZE(uniphier_pxs2_clock_reset_names),
.clock_names = uniphier_pxs2_clock_reset_names, .clock_names = uniphier_pxs2_clock_reset_names,
.nrsts = ARRAY_SIZE(uniphier_pxs2_clock_reset_names), .nrsts = ARRAY_SIZE(uniphier_pxs2_clock_reset_names),
.reset_names = uniphier_pxs2_clock_reset_names, .reset_names = uniphier_pxs2_clock_reset_names,
}; };
static const struct of_device_id uniphier_usb3_reset_match[] = { static const struct of_device_id uniphier_glue_reset_match[] = {
{ {
.compatible = "socionext,uniphier-pro4-usb3-reset", .compatible = "socionext,uniphier-pro4-usb3-reset",
.data = &uniphier_pro4_data, .data = &uniphier_pro4_data,
...@@ -152,20 +152,32 @@ static const struct of_device_id uniphier_usb3_reset_match[] = { ...@@ -152,20 +152,32 @@ static const struct of_device_id uniphier_usb3_reset_match[] = {
.compatible = "socionext,uniphier-pxs3-usb3-reset", .compatible = "socionext,uniphier-pxs3-usb3-reset",
.data = &uniphier_pxs2_data, .data = &uniphier_pxs2_data,
}, },
{
.compatible = "socionext,uniphier-pro4-ahci-reset",
.data = &uniphier_pro4_data,
},
{
.compatible = "socionext,uniphier-pxs2-ahci-reset",
.data = &uniphier_pxs2_data,
},
{
.compatible = "socionext,uniphier-pxs3-ahci-reset",
.data = &uniphier_pxs2_data,
},
{ /* Sentinel */ } { /* Sentinel */ }
}; };
MODULE_DEVICE_TABLE(of, uniphier_usb3_reset_match); MODULE_DEVICE_TABLE(of, uniphier_glue_reset_match);
static struct platform_driver uniphier_usb3_reset_driver = { static struct platform_driver uniphier_glue_reset_driver = {
.probe = uniphier_usb3_reset_probe, .probe = uniphier_glue_reset_probe,
.remove = uniphier_usb3_reset_remove, .remove = uniphier_glue_reset_remove,
.driver = { .driver = {
.name = "uniphier-usb3-reset", .name = "uniphier-glue-reset",
.of_match_table = uniphier_usb3_reset_match, .of_match_table = uniphier_glue_reset_match,
}, },
}; };
module_platform_driver(uniphier_usb3_reset_driver); module_platform_driver(uniphier_glue_reset_driver);
MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>"); MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>");
MODULE_DESCRIPTION("UniPhier USB3 Reset Driver"); MODULE_DESCRIPTION("UniPhier Glue layer reset driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -44,7 +44,7 @@ config ARCH_RZN1 ...@@ -44,7 +44,7 @@ config ARCH_RZN1
bool bool
select ARM_AMBA select ARM_AMBA
if ARM if ARM && ARCH_RENESAS
#comment "Renesas ARM SoCs System Type" #comment "Renesas ARM SoCs System Type"
......
...@@ -28,19 +28,6 @@ static struct rcar_sysc_area r8a774c0_areas[] __initdata = { ...@@ -28,19 +28,6 @@ static struct rcar_sysc_area r8a774c0_areas[] __initdata = {
{ "3dg-b", 0x100, 1, R8A774C0_PD_3DG_B, R8A774C0_PD_3DG_A }, { "3dg-b", 0x100, 1, R8A774C0_PD_3DG_B, R8A774C0_PD_3DG_A },
}; };
static void __init rcar_sysc_fix_parent(struct rcar_sysc_area *areas,
unsigned int num_areas, u8 id,
int new_parent)
{
unsigned int i;
for (i = 0; i < num_areas; i++)
if (areas[i].isr_bit == id) {
areas[i].parent = new_parent;
return;
}
}
/* Fixups for RZ/G2E ES1.0 revision */ /* Fixups for RZ/G2E ES1.0 revision */
static const struct soc_device_attribute r8a774c0[] __initconst = { static const struct soc_device_attribute r8a774c0[] __initconst = {
{ .soc_id = "r8a774c0", .revision = "ES1.0" }, { .soc_id = "r8a774c0", .revision = "ES1.0" },
...@@ -50,12 +37,10 @@ static const struct soc_device_attribute r8a774c0[] __initconst = { ...@@ -50,12 +37,10 @@ static const struct soc_device_attribute r8a774c0[] __initconst = {
static int __init r8a774c0_sysc_init(void) static int __init r8a774c0_sysc_init(void)
{ {
if (soc_device_match(r8a774c0)) { if (soc_device_match(r8a774c0)) {
rcar_sysc_fix_parent(r8a774c0_areas, /* Fix incorrect 3DG hierarchy */
ARRAY_SIZE(r8a774c0_areas), swap(r8a774c0_areas[6], r8a774c0_areas[7]);
R8A774C0_PD_3DG_A, R8A774C0_PD_3DG_B); r8a774c0_areas[6].parent = R8A774C0_PD_ALWAYS_ON;
rcar_sysc_fix_parent(r8a774c0_areas, r8a774c0_areas[7].parent = R8A774C0_PD_3DG_B;
ARRAY_SIZE(r8a774c0_areas),
R8A774C0_PD_3DG_B, R8A774C0_PD_ALWAYS_ON);
} }
return 0; return 0;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#ifndef __QCOM_SCM_H #ifndef __QCOM_SCM_H
#define __QCOM_SCM_H #define __QCOM_SCM_H
#include <linux/err.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
......
...@@ -32,6 +32,8 @@ struct reset_control *devm_reset_control_array_get(struct device *dev, ...@@ -32,6 +32,8 @@ struct reset_control *devm_reset_control_array_get(struct device *dev,
struct reset_control *of_reset_control_array_get(struct device_node *np, struct reset_control *of_reset_control_array_get(struct device_node *np,
bool shared, bool optional); bool shared, bool optional);
int reset_control_get_count(struct device *dev);
#else #else
static inline int reset_control_reset(struct reset_control *rstc) static inline int reset_control_reset(struct reset_control *rstc)
...@@ -97,6 +99,11 @@ of_reset_control_array_get(struct device_node *np, bool shared, bool optional) ...@@ -97,6 +99,11 @@ of_reset_control_array_get(struct device_node *np, bool shared, bool optional)
return optional ? NULL : ERR_PTR(-ENOTSUPP); return optional ? NULL : ERR_PTR(-ENOTSUPP);
} }
static inline int reset_control_get_count(struct device *dev)
{
return -ENOENT;
}
#endif /* CONFIG_RESET_CONTROLLER */ #endif /* CONFIG_RESET_CONTROLLER */
static inline int __must_check device_reset(struct device *dev) static inline int __must_check device_reset(struct device *dev)
...@@ -138,7 +145,7 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id) ...@@ -138,7 +145,7 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id)
* *
* Returns a struct reset_control or IS_ERR() condition containing errno. * Returns a struct reset_control or IS_ERR() condition containing errno.
* This function is intended for use with reset-controls which are shared * This function is intended for use with reset-controls which are shared
* between hardware-blocks. * between hardware blocks.
* *
* When a reset-control is shared, the behavior of reset_control_assert / * When a reset-control is shared, the behavior of reset_control_assert /
* deassert is changed, the reset-core will keep track of a deassert_count * deassert is changed, the reset-core will keep track of a deassert_count
...@@ -187,7 +194,7 @@ static inline struct reset_control *of_reset_control_get_exclusive( ...@@ -187,7 +194,7 @@ static inline struct reset_control *of_reset_control_get_exclusive(
} }
/** /**
* of_reset_control_get_shared - Lookup and obtain an shared reference * of_reset_control_get_shared - Lookup and obtain a shared reference
* to a reset controller. * to a reset controller.
* @node: device to be reset by the controller * @node: device to be reset by the controller
* @id: reset line name * @id: reset line name
...@@ -229,7 +236,7 @@ static inline struct reset_control *of_reset_control_get_exclusive_by_index( ...@@ -229,7 +236,7 @@ static inline struct reset_control *of_reset_control_get_exclusive_by_index(
} }
/** /**
* of_reset_control_get_shared_by_index - Lookup and obtain an shared * of_reset_control_get_shared_by_index - Lookup and obtain a shared
* reference to a reset controller * reference to a reset controller
* by index. * by index.
* @node: device to be reset by the controller * @node: device to be reset by the controller
...@@ -322,7 +329,7 @@ devm_reset_control_get_exclusive_by_index(struct device *dev, int index) ...@@ -322,7 +329,7 @@ devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
/** /**
* devm_reset_control_get_shared_by_index - resource managed * devm_reset_control_get_shared_by_index - resource managed
* reset_control_get_shared * reset_control_get_shared
* @dev: device to be reset by the controller * @dev: device to be reset by the controller
* @index: index of the reset controller * @index: index of the reset controller
* *
......
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