Reset controller fixes for v6.0

Fix the i.MX8MP PCIe PHY PERST bit polarity, issue the Sparx5 "switch"
 reset (which turned out to be a rather more global reset) early on
 startup, stubbing out the reset controller driver, and fix the NPCM8XX
 USB reset sequence by setting IPSRST4 bits in the correct register.
 -----BEGIN PGP SIGNATURE-----
 
 iI0EABYIADUWIQRRO6F6WdpH1R0vGibVhaclGDdiwAUCYy3D5hcccC56YWJlbEBw
 ZW5ndXRyb25peC5kZQAKCRDVhaclGDdiwKXfAP0WI8iTRGZIfqUsfuf+RevV1J5I
 fSkDCp/kSMJGAZECDAD+K4uV9Gb+gP00HQa+Q/oXr1oPhfmwDZ3w3hHZZ49sEwE=
 =OPnR
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmMt1IoACgkQmmx57+YA
 GNmhJw//bNlWf5jsplx51Nl+G2BZGMzHqe8Dd+C0lokif6tAag7LfV2vSpCR75v0
 /Qw9oBHHltXKXE373V417vfzn9FZL5E9ICoU+b88PLI/j+NPQ83SNz17uDgOtSyY
 nuyw+RosrvUEryc7m2HWTwbbMz3w2EEzM1K5/x6++04XykbQlP2uvljvS4zro6Vg
 bVXvRzDwjEscdCpVncpJ+kMJi0M9kii8puRia9xXEVu/ZwKlZvezOWFWYZkBCjRC
 IU4YVJJ548wRPSKz3OgvBb5oEVVmrcg7NYeDVls6kcx4YiUL0uSGBzT9rLcvgw4B
 NBjGzYhYyb5tsa9Bo+p70odHk6JHnkKMLDkuInv+YI/FW/vMZVfg+MRB35EyJRFA
 Bvy6OboSommyxjmUV9A020FPWN3U5Xz/tVifWSzsdvXMoLfdLHF6bj1jc9bnvX5j
 65Nixrqj9FVeliR9rkUuUKTEjww6lGF7rnV0EjNsEalRWNaY4Gll9urSc2f8BInR
 aymUXm4c6AoLiOHS8VB2aaRlZnxx1arHLpQWnJXtR4EPLo/DG+z/cPCdeoz3oGbs
 GRfp+wFduJOvykAKrlRnbdkMVprOItPLZnaSvvxj3hI8xEC/ld/P+OKAp77BaCvO
 ajShD3o7TqvGeQweKx7TJF6dz2NqeC1H3NxKcIYdOB6Tpv/NY6Y=
 =+c6Z
 -----END PGP SIGNATURE-----

Merge tag 'reset-fixes-for-v6.0' of git://git.pengutronix.de/pza/linux into arm/fixes

Reset controller fixes for v6.0

Fix the i.MX8MP PCIe PHY PERST bit polarity, issue the Sparx5 "switch"
reset (which turned out to be a rather more global reset) early on
startup, stubbing out the reset controller driver, and fix the NPCM8XX
USB reset sequence by setting IPSRST4 bits in the correct register.

* tag 'reset-fixes-for-v6.0' of git://git.pengutronix.de/pza/linux:
  reset: npcm: fix iprst2 and iprst4 setting
  reset: microchip-sparx5: issue a reset on startup
  reset: imx7: Fix the iMX8MP PCIe PHY PERST support

Link: https://lore.kernel.org/r/20220923143519.41735-1-p.zabel@pengutronix.de
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2022-09-23 17:45:13 +02:00
commit 2653853e2a
3 changed files with 19 additions and 6 deletions

View File

@ -329,6 +329,7 @@ static int imx8mp_reset_set(struct reset_controller_dev *rcdev,
break;
case IMX8MP_RESET_PCIE_CTRL_APPS_EN:
case IMX8MP_RESET_PCIEPHY_PERST:
value = assert ? 0 : bit;
break;
}

View File

@ -33,11 +33,8 @@ static struct regmap_config sparx5_reset_regmap_config = {
.reg_stride = 4,
};
static int sparx5_switch_reset(struct reset_controller_dev *rcdev,
unsigned long id)
static int sparx5_switch_reset(struct mchp_reset_context *ctx)
{
struct mchp_reset_context *ctx =
container_of(rcdev, struct mchp_reset_context, rcdev);
u32 val;
/* Make sure the core is PROTECTED from reset */
@ -54,8 +51,14 @@ static int sparx5_switch_reset(struct reset_controller_dev *rcdev,
1, 100);
}
static int sparx5_reset_noop(struct reset_controller_dev *rcdev,
unsigned long id)
{
return 0;
}
static const struct reset_control_ops sparx5_reset_ops = {
.reset = sparx5_switch_reset,
.reset = sparx5_reset_noop,
};
static int mchp_sparx5_map_syscon(struct platform_device *pdev, char *name,
@ -122,6 +125,11 @@ static int mchp_sparx5_reset_probe(struct platform_device *pdev)
ctx->rcdev.of_node = dn;
ctx->props = device_get_match_data(&pdev->dev);
/* Issue the reset very early, our actual reset callback is a noop. */
err = sparx5_switch_reset(ctx);
if (err)
return err;
return devm_reset_controller_register(&pdev->dev, &ctx->rcdev);
}
@ -163,6 +171,10 @@ static int __init mchp_sparx5_reset_init(void)
return platform_driver_register(&mchp_sparx5_reset_driver);
}
/*
* Because this is a global reset, keep this postcore_initcall() to issue the
* reset as early as possible during the kernel startup.
*/
postcore_initcall(mchp_sparx5_reset_init);
MODULE_DESCRIPTION("Microchip Sparx5 switch reset driver");

View File

@ -291,7 +291,7 @@ static void npcm_usb_reset_npcm8xx(struct npcm_rc_data *rc)
iprst2 |= ipsrst2_bits;
iprst3 |= (ipsrst3_bits | NPCM_IPSRST3_USBPHY1 |
NPCM_IPSRST3_USBPHY2);
iprst2 |= ipsrst4_bits;
iprst4 |= ipsrst4_bits;
writel(iprst1, rc->base + NPCM_IPSRST1);
writel(iprst2, rc->base + NPCM_IPSRST2);