Merge branch 'add-reset-deassertion-for-aspeed-mdio'

Dylan Hung says:

====================
Add reset deassertion for Aspeed MDIO

Add missing reset deassertion for Aspeed MDIO bus controller. The reset
is asserted by the hardware when power-on so the driver only needs to
deassert it. To be able to work with the old DT blobs, the reset is
optional since it may be deasserted by the bootloader or the previous
kernel.

V6:
- fix merge conflict for net-next

V5:
- fix error of dt_binding_check

V4:
- use ASPEED_RESET_MII instead of hardcoding in dt-binding example

V3:
- remove reset property from the required list of the device tree
  bindings
- remove "Cc: stable@vger.kernel.org" from the commit messages
- add more description in the commit message of the dt-binding

V2:
- add reset property in the device tree bindings
- add reset assertion in the error path and driver remove
====================

Link: https://lore.kernel.org/r/20220427035501.17500-1-dylan_hung@aspeedtech.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Paolo Abeni 2022-04-28 09:39:34 +02:00
Родитель 50c6afabfd a8db203db0
Коммит be5fd933f8
3 изменённых файлов: 24 добавлений и 1 удалений

Просмотреть файл

@ -20,10 +20,14 @@ allOf:
properties:
compatible:
const: aspeed,ast2600-mdio
reg:
maxItems: 1
description: The register range of the MDIO controller instance
resets:
maxItems: 1
required:
- compatible
- reg
@ -34,11 +38,13 @@ unevaluatedProperties: false
examples:
- |
#include <dt-bindings/clock/ast2600-clock.h>
mdio0: mdio@1e650000 {
compatible = "aspeed,ast2600-mdio";
reg = <0x1e650000 0x8>;
#address-cells = <1>;
#size-cells = <0>;
resets = <&syscon ASPEED_RESET_MII>;
ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";

Просмотреть файл

@ -181,6 +181,7 @@
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mdio1_default>;
resets = <&syscon ASPEED_RESET_MII>;
};
mdio1: mdio@1e650008 {
@ -191,6 +192,7 @@
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mdio2_default>;
resets = <&syscon ASPEED_RESET_MII>;
};
mdio2: mdio@1e650010 {
@ -201,6 +203,7 @@
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mdio3_default>;
resets = <&syscon ASPEED_RESET_MII>;
};
mdio3: mdio@1e650018 {
@ -211,6 +214,7 @@
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_mdio4_default>;
resets = <&syscon ASPEED_RESET_MII>;
};
mac0: ftgmac@1e660000 {

Просмотреть файл

@ -3,6 +3,7 @@
#include <linux/bitfield.h>
#include <linux/delay.h>
#include <linux/reset.h>
#include <linux/iopoll.h>
#include <linux/mdio.h>
#include <linux/module.h>
@ -41,6 +42,7 @@
struct aspeed_mdio {
void __iomem *base;
struct reset_control *reset;
};
static int aspeed_mdio_op(struct mii_bus *bus, u8 st, u8 op, u8 phyad, u8 regad,
@ -174,6 +176,12 @@ static int aspeed_mdio_probe(struct platform_device *pdev)
if (IS_ERR(ctx->base))
return PTR_ERR(ctx->base);
ctx->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
if (IS_ERR(ctx->reset))
return PTR_ERR(ctx->reset);
reset_control_deassert(ctx->reset);
bus->name = DRV_NAME;
snprintf(bus->id, MII_BUS_ID_SIZE, "%s%d", pdev->name, pdev->id);
bus->parent = &pdev->dev;
@ -184,6 +192,7 @@ static int aspeed_mdio_probe(struct platform_device *pdev)
rc = of_mdiobus_register(bus, pdev->dev.of_node);
if (rc) {
dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
reset_control_assert(ctx->reset);
return rc;
}
@ -194,7 +203,11 @@ static int aspeed_mdio_probe(struct platform_device *pdev)
static int aspeed_mdio_remove(struct platform_device *pdev)
{
mdiobus_unregister(platform_get_drvdata(pdev));
struct mii_bus *bus = (struct mii_bus *)platform_get_drvdata(pdev);
struct aspeed_mdio *ctx = bus->priv;
reset_control_assert(ctx->reset);
mdiobus_unregister(bus);
return 0;
}