mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
Fixes for clk drivers:
- Mark the DDR bus clk critical in the SpaceMiT driver so that
boot doesn't fail
- Fix boot on Mobile EyeQ by creating the auxiliary device for
the ethernet PHY
- Plug an OF node leak in Rockchip rk808 clk driver
-----BEGIN PGP SIGNATURE-----
iQJIBAABCAAyFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmoAnnsUHHN3Ym95ZEBj
aHJvbWl1bS5vcmcACgkQrQKIl8bklSXTgA//VV/2VvDcWpXLa+Jr05D5j6/JgkSx
P70ssFqVc3mHHfCtlrAHmU+xaLI37C2jDMotOMt1hfwy8CTs9BpP8L5IMbIo0tpg
m7agI4fSUnwZdU5hCh6o9BEcY3KHEWqMeXdXbFXuwqS+/+4pTNOYVpGYLfB8rgZo
qW2VpsK0rrhNC82V3C86pdoC99gHK+fu1+MeKrh9DcNL1+wt89Eh60Fl0G+UfrjJ
0fuIohtsp8W+ciQHg70oBRurmePLoWvWFqmH/kEUvftNU38SnjVT4V7FY6DBDOp3
9sAl3sHsnaWoXIt6fx6YujFXiOUgN5hMSaXQ+uGcH9t+6qxNUtlh0hAEolAvEPe8
SfjByQ3PClUCSu0Gnf6gPu9IBFXTDfWPH6tCk7Du3CY5HnISdQXdagpElhjP6N3B
PGUQJF4oK7W1bs0ryYh3OYHG94nybncz1tJrCipPxmrY1PzZAbvdT7E0lickO35F
MeEeg2xx3iALhK6koMaOuCEobrxeq5aG52qVqnKixupm1vLwPMxBtxhaEIUkjBZR
I7k/qcZoDFXxSnzXdk6TXjbZl6JVJUy0tl3yxIwqVkZVapnGNylsS85psNhy8ovg
PoJUENmKN9AjevtqW2THy77kaqutanYsd6AqMWqpvlux5scQBwJXXVzQTDW0yf1a
LrXCrJQQFmJgPJs=
=yAV8
-----END PGP SIGNATURE-----
Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
Pull clk driver fixes from Stephen Boyd:
- Mark the DDR bus clk critical in the SpaceMiT driver so that
boot doesn't fail
- Fix boot on Mobile EyeQ by creating the auxiliary device for
the ethernet PHY
- Plug an OF node leak in Rockchip rk808 clk driver
* tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
clk: rk808: fix OF node reference imbalance
MAINTAINERS: add myself as a reviewer for the clk subsystem
reset: eyeq: drop device_set_of_node_from_dev() done by parent
clk: eyeq: add EyeQ5 children auxiliary device for generic PHYs
clk: eyeq: use the auxiliary device creation helper
clk: spacemit: k3: mark top_dclk as CLK_IS_CRITICAL
This commit is contained in:
commit
a1a10cdbc6
|
|
@ -6356,6 +6356,7 @@ F: include/uapi/linux/comedi.h
|
||||||
COMMON CLK FRAMEWORK
|
COMMON CLK FRAMEWORK
|
||||||
M: Michael Turquette <mturquette@baylibre.com>
|
M: Michael Turquette <mturquette@baylibre.com>
|
||||||
M: Stephen Boyd <sboyd@kernel.org>
|
M: Stephen Boyd <sboyd@kernel.org>
|
||||||
|
R: Brian Masney <bmasney@redhat.com>
|
||||||
L: linux-clk@vger.kernel.org
|
L: linux-clk@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
Q: http://patchwork.kernel.org/project/linux-clk/list/
|
Q: http://patchwork.kernel.org/project/linux-clk/list/
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,7 @@ struct eqc_match_data {
|
||||||
|
|
||||||
const char *reset_auxdev_name;
|
const char *reset_auxdev_name;
|
||||||
const char *pinctrl_auxdev_name;
|
const char *pinctrl_auxdev_name;
|
||||||
|
const char *eth_phy_auxdev_name;
|
||||||
|
|
||||||
unsigned int early_clk_count;
|
unsigned int early_clk_count;
|
||||||
};
|
};
|
||||||
|
|
@ -321,38 +322,18 @@ static void eqc_probe_init_fixed_factors(struct device *dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eqc_auxdev_release(struct device *dev)
|
static void eqc_auxdev_create_optional(struct device *dev, void __iomem *base,
|
||||||
{
|
const char *name)
|
||||||
struct auxiliary_device *adev = to_auxiliary_dev(dev);
|
|
||||||
|
|
||||||
kfree(adev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eqc_auxdev_create(struct device *dev, void __iomem *base,
|
|
||||||
const char *name, u32 id)
|
|
||||||
{
|
{
|
||||||
struct auxiliary_device *adev;
|
struct auxiliary_device *adev;
|
||||||
int ret;
|
|
||||||
|
|
||||||
adev = kzalloc_obj(*adev);
|
if (name) {
|
||||||
|
adev = devm_auxiliary_device_create(dev, name,
|
||||||
|
(void __force *)base);
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return -ENOMEM;
|
dev_warn(dev, "failed creating auxiliary device %s.%s\n",
|
||||||
|
KBUILD_MODNAME, name);
|
||||||
adev->name = name;
|
}
|
||||||
adev->dev.parent = dev;
|
|
||||||
adev->dev.platform_data = (void __force *)base;
|
|
||||||
adev->dev.release = eqc_auxdev_release;
|
|
||||||
adev->id = id;
|
|
||||||
|
|
||||||
ret = auxiliary_device_init(adev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = auxiliary_device_add(adev);
|
|
||||||
if (ret)
|
|
||||||
auxiliary_device_uninit(adev);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eqc_probe(struct platform_device *pdev)
|
static int eqc_probe(struct platform_device *pdev)
|
||||||
|
|
@ -364,7 +345,6 @@ static int eqc_probe(struct platform_device *pdev)
|
||||||
unsigned int i, clk_count;
|
unsigned int i, clk_count;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int ret;
|
|
||||||
|
|
||||||
data = device_get_match_data(dev);
|
data = device_get_match_data(dev);
|
||||||
if (!data)
|
if (!data)
|
||||||
|
|
@ -378,21 +358,10 @@ static int eqc_probe(struct platform_device *pdev)
|
||||||
if (!base)
|
if (!base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* Init optional reset auxiliary device. */
|
/* Init optional auxiliary devices. */
|
||||||
if (data->reset_auxdev_name) {
|
eqc_auxdev_create_optional(dev, base, data->reset_auxdev_name);
|
||||||
ret = eqc_auxdev_create(dev, base, data->reset_auxdev_name, 0);
|
eqc_auxdev_create_optional(dev, base, data->pinctrl_auxdev_name);
|
||||||
if (ret)
|
eqc_auxdev_create_optional(dev, base, data->eth_phy_auxdev_name);
|
||||||
dev_warn(dev, "failed creating auxiliary device %s.%s: %d\n",
|
|
||||||
KBUILD_MODNAME, data->reset_auxdev_name, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init optional pinctrl auxiliary device. */
|
|
||||||
if (data->pinctrl_auxdev_name) {
|
|
||||||
ret = eqc_auxdev_create(dev, base, data->pinctrl_auxdev_name, 0);
|
|
||||||
if (ret)
|
|
||||||
dev_warn(dev, "failed creating auxiliary device %s.%s: %d\n",
|
|
||||||
KBUILD_MODNAME, data->pinctrl_auxdev_name, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->pll_count + data->div_count + data->fixed_factor_count == 0)
|
if (data->pll_count + data->div_count + data->fixed_factor_count == 0)
|
||||||
return 0; /* Zero clocks, we are done. */
|
return 0; /* Zero clocks, we are done. */
|
||||||
|
|
@ -553,6 +522,7 @@ static const struct eqc_match_data eqc_eyeq5_match_data = {
|
||||||
|
|
||||||
.reset_auxdev_name = "reset",
|
.reset_auxdev_name = "reset",
|
||||||
.pinctrl_auxdev_name = "pinctrl",
|
.pinctrl_auxdev_name = "pinctrl",
|
||||||
|
.eth_phy_auxdev_name = "phy",
|
||||||
|
|
||||||
.early_clk_count = ARRAY_SIZE(eqc_eyeq5_early_plls) +
|
.early_clk_count = ARRAY_SIZE(eqc_eyeq5_early_plls) +
|
||||||
ARRAY_SIZE(eqc_eyeq5_early_fixed_factors),
|
ARRAY_SIZE(eqc_eyeq5_early_fixed_factors),
|
||||||
|
|
|
||||||
|
|
@ -153,7 +153,7 @@ static int rk808_clkout_probe(struct platform_device *pdev)
|
||||||
struct rk808_clkout *rk808_clkout;
|
struct rk808_clkout *rk808_clkout;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dev->of_node = pdev->dev.parent->of_node;
|
device_set_of_node_from_dev(dev, dev->parent);
|
||||||
|
|
||||||
rk808_clkout = devm_kzalloc(dev,
|
rk808_clkout = devm_kzalloc(dev,
|
||||||
sizeof(*rk808_clkout), GFP_KERNEL);
|
sizeof(*rk808_clkout), GFP_KERNEL);
|
||||||
|
|
|
||||||
|
|
@ -846,7 +846,7 @@ static const struct clk_parent_data top_parents[] = {
|
||||||
CCU_PARENT_HW(pll6_d3),
|
CCU_PARENT_HW(pll6_d3),
|
||||||
};
|
};
|
||||||
CCU_MUX_DIV_GATE_FC_DEFINE(top_dclk, top_parents, APMU_TOP_DCLK_CTRL, 5, 3,
|
CCU_MUX_DIV_GATE_FC_DEFINE(top_dclk, top_parents, APMU_TOP_DCLK_CTRL, 5, 3,
|
||||||
BIT(8), 2, 3, BIT(1), 0);
|
BIT(8), 2, 3, BIT(1), CLK_IS_CRITICAL);
|
||||||
|
|
||||||
static const struct clk_parent_data ucie_parents[] = {
|
static const struct clk_parent_data ucie_parents[] = {
|
||||||
CCU_PARENT_HW(pll1_d8_307p2),
|
CCU_PARENT_HW(pll1_d8_307p2),
|
||||||
|
|
|
||||||
|
|
@ -422,13 +422,6 @@ static int eqr_of_xlate_twocells(struct reset_controller_dev *rcdev,
|
||||||
return eqr_of_xlate_internal(rcdev, reset_spec->args[0], reset_spec->args[1]);
|
return eqr_of_xlate_internal(rcdev, reset_spec->args[0], reset_spec->args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eqr_of_node_put(void *_dev)
|
|
||||||
{
|
|
||||||
struct device *dev = _dev;
|
|
||||||
|
|
||||||
of_node_put(dev->of_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eqr_probe(struct auxiliary_device *adev,
|
static int eqr_probe(struct auxiliary_device *adev,
|
||||||
const struct auxiliary_device_id *id)
|
const struct auxiliary_device_id *id)
|
||||||
{
|
{
|
||||||
|
|
@ -439,21 +432,8 @@ static int eqr_probe(struct auxiliary_device *adev,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We are an auxiliary device of clk-eyeq. We do not have an OF node by
|
* Get match data. We cannot use device_get_match_data() because it does
|
||||||
* default; let's reuse our parent's OF node.
|
* not accept reused OF nodes; see device_set_of_node_from_dev().
|
||||||
*/
|
|
||||||
WARN_ON(dev->of_node);
|
|
||||||
device_set_of_node_from_dev(dev, dev->parent);
|
|
||||||
if (!dev->of_node)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
ret = devm_add_action_or_reset(dev, eqr_of_node_put, dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Using our newfound OF node, we can get match data. We cannot use
|
|
||||||
* device_get_match_data() because it does not match reused OF nodes.
|
|
||||||
*/
|
*/
|
||||||
match = of_match_node(dev->driver->of_match_table, dev->of_node);
|
match = of_match_node(dev->driver->of_match_table, dev->of_node);
|
||||||
if (!match || !match->data)
|
if (!match || !match->data)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user