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:
Коммит
be5fd933f8
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче