All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices
@ 2021-06-24  9:18 Pawel Dembicki
  2021-06-24  9:18 ` [PATCH 2/2] power: reset: linkstation-poweroff: add new device Pawel Dembicki
  2021-08-13 17:17 ` [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Sebastian Reichel
  0 siblings, 2 replies; 4+ messages in thread
From: Pawel Dembicki @ 2021-06-24  9:18 UTC (permalink / raw)
  Cc: Daniel Gonzalez Cabanelas, Pawel Dembicki, Sebastian Reichel,
	linux-pm, linux-kernel

This commit prepare driver for another device support.

New power_off_cfg structure describes two most important things: name of
mdio bus and pointer to register setting function. It allow to add new
device with different mdio bus node and other phy register config.

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
---
 drivers/power/reset/linkstation-poweroff.c | 35 ++++++++++++++++++----
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/drivers/power/reset/linkstation-poweroff.c b/drivers/power/reset/linkstation-poweroff.c
index f1e843df0e16..cb5a32f852c1 100644
--- a/drivers/power/reset/linkstation-poweroff.c
+++ b/drivers/power/reset/linkstation-poweroff.c
@@ -29,11 +29,21 @@
 #define LED2_FORCE_ON					(0x8 << 8)
 #define LEDMASK						GENMASK(11,8)
 
+struct power_off_cfg {
+	char *mdio_node_name;
+	void (*phy_set_reg)(bool restart);
+};
+
 static struct phy_device *phydev;
+static const struct power_off_cfg *cfg;
 
-static void mvphy_reg_intn(u16 data)
+static void linkstation_mvphy_reg_intn(bool restart)
 {
 	int rc = 0, saved_page;
+	u16 data = 0;
+
+	if (restart)
+		data = MII_88E1318S_PHY_LED_TCR_FORCE_INT;
 
 	saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE);
 	if (saved_page < 0)
@@ -66,11 +76,16 @@ static void mvphy_reg_intn(u16 data)
 		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
 }
 
+static const struct power_off_cfg linkstation_power_off_cfg = {
+	.mdio_node_name = "mdio",
+	.phy_set_reg = linkstation_mvphy_reg_intn,
+};
+
 static int linkstation_reboot_notifier(struct notifier_block *nb,
 				       unsigned long action, void *unused)
 {
 	if (action == SYS_RESTART)
-		mvphy_reg_intn(MII_88E1318S_PHY_LED_TCR_FORCE_INT);
+		cfg->phy_set_reg(true);
 
 	return NOTIFY_DONE;
 }
@@ -82,14 +97,18 @@ static struct notifier_block linkstation_reboot_nb = {
 static void linkstation_poweroff(void)
 {
 	unregister_reboot_notifier(&linkstation_reboot_nb);
-	mvphy_reg_intn(0);
+	cfg->phy_set_reg(false);
 
 	kernel_restart("Power off");
 }
 
 static const struct of_device_id ls_poweroff_of_match[] = {
-	{ .compatible = "buffalo,ls421d" },
-	{ .compatible = "buffalo,ls421de" },
+	{ .compatible = "buffalo,ls421d",
+	  .data = &linkstation_power_off_cfg,
+	},
+	{ .compatible = "buffalo,ls421de",
+	  .data = &linkstation_power_off_cfg,
+	},
 	{ },
 };
 
@@ -97,13 +116,17 @@ static int __init linkstation_poweroff_init(void)
 {
 	struct mii_bus *bus;
 	struct device_node *dn;
+	const struct of_device_id *match;
 
 	dn = of_find_matching_node(NULL, ls_poweroff_of_match);
 	if (!dn)
 		return -ENODEV;
 	of_node_put(dn);
 
-	dn = of_find_node_by_name(NULL, "mdio");
+	match = of_match_node(ls_poweroff_of_match, dn);
+	cfg = match->data;
+
+	dn = of_find_node_by_name(NULL, cfg->mdio_node_name);
 	if (!dn)
 		return -ENODEV;
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] power: reset: linkstation-poweroff: add new device
  2021-06-24  9:18 [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Pawel Dembicki
@ 2021-06-24  9:18 ` Pawel Dembicki
  2021-08-13 17:18   ` Sebastian Reichel
  2021-08-13 17:17 ` [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Sebastian Reichel
  1 sibling, 1 reply; 4+ messages in thread
From: Pawel Dembicki @ 2021-06-24  9:18 UTC (permalink / raw)
  Cc: Daniel Gonzalez Cabanelas, Pawel Dembicki, Sebastian Reichel,
	linux-pm, linux-kernel

This commit introduces support for NETGEAR ReadyNAS Duo v2.
This device use bit 4 of LED[2:0] Polarity Control Register to indicate
AC Power loss.

For more details about AC loss detection in NETGEAR ReadyNAS Duo v2,
please look at the file:
RND_5.3.13_WW.src/u-boot/board/mv_feroceon/mv_hal/usibootup/usibootup.c
from Netgear GPL sources.

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
---
 drivers/power/reset/linkstation-poweroff.c | 43 ++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/drivers/power/reset/linkstation-poweroff.c b/drivers/power/reset/linkstation-poweroff.c
index cb5a32f852c1..5afe3ef23395 100644
--- a/drivers/power/reset/linkstation-poweroff.c
+++ b/drivers/power/reset/linkstation-poweroff.c
@@ -19,6 +19,7 @@
 #define MII_MARVELL_PHY_PAGE		22
 
 #define MII_PHY_LED_CTRL		16
+#define MII_PHY_LED_POL_CTRL		17
 #define MII_88E1318S_PHY_LED_TCR	18
 #define MII_88E1318S_PHY_WOL_CTRL	16
 #define MII_M1011_IEVENT		19
@@ -29,6 +30,8 @@
 #define LED2_FORCE_ON					(0x8 << 8)
 #define LEDMASK						GENMASK(11,8)
 
+#define MII_88E1318S_PHY_LED_POL_LED2		BIT(4)
+
 struct power_off_cfg {
 	char *mdio_node_name;
 	void (*phy_set_reg)(bool restart);
@@ -76,11 +79,48 @@ static void linkstation_mvphy_reg_intn(bool restart)
 		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
 }
 
+static void readynas_mvphy_set_reg(bool restart)
+{
+	int rc = 0, saved_page;
+	u16 data = 0;
+
+	if (restart)
+		data = MII_88E1318S_PHY_LED_POL_LED2;
+
+	saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE);
+	if (saved_page < 0)
+		goto err;
+
+	/* Set the LED[2].0 Polarity bit to the required state */
+	__phy_modify(phydev, MII_PHY_LED_POL_CTRL,
+		     MII_88E1318S_PHY_LED_POL_LED2, data);
+
+	if (!data) {
+
+		/* If WOL was enabled and a magic packet was received before powering
+		 * off, we won't be able to wake up by sending another magic packet.
+		 * Clear WOL status.
+		 */
+		__phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_WOL_PAGE);
+		__phy_set_bits(phydev, MII_88E1318S_PHY_WOL_CTRL,
+			       MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS);
+	}
+err:
+	rc = phy_restore_page(phydev, saved_page, rc);
+	if (rc < 0)
+		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
+}
+
 static const struct power_off_cfg linkstation_power_off_cfg = {
 	.mdio_node_name = "mdio",
 	.phy_set_reg = linkstation_mvphy_reg_intn,
 };
 
+static const struct power_off_cfg readynas_power_off_cfg = {
+	.mdio_node_name = "mdio-bus",
+	.phy_set_reg = readynas_mvphy_set_reg,
+};
+
 static int linkstation_reboot_notifier(struct notifier_block *nb,
 				       unsigned long action, void *unused)
 {
@@ -109,6 +149,9 @@ static const struct of_device_id ls_poweroff_of_match[] = {
 	{ .compatible = "buffalo,ls421de",
 	  .data = &linkstation_power_off_cfg,
 	},
+	{ .compatible = "netgear,readynas-duo-v2",
+	  .data = &readynas_power_off_cfg,
+	},
 	{ },
 };
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices
  2021-06-24  9:18 [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Pawel Dembicki
  2021-06-24  9:18 ` [PATCH 2/2] power: reset: linkstation-poweroff: add new device Pawel Dembicki
@ 2021-08-13 17:17 ` Sebastian Reichel
  1 sibling, 0 replies; 4+ messages in thread
From: Sebastian Reichel @ 2021-08-13 17:17 UTC (permalink / raw)
  To: Pawel Dembicki; +Cc: Daniel Gonzalez Cabanelas, linux-pm, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3237 bytes --]

Hi,

On Thu, Jun 24, 2021 at 11:18:11AM +0200, Pawel Dembicki wrote:
> This commit prepare driver for another device support.
> 
> New power_off_cfg structure describes two most important things: name of
> mdio bus and pointer to register setting function. It allow to add new
> device with different mdio bus node and other phy register config.
> 
> Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
> ---

Thanks, queued.

-- Sebastian

>  drivers/power/reset/linkstation-poweroff.c | 35 ++++++++++++++++++----
>  1 file changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/power/reset/linkstation-poweroff.c b/drivers/power/reset/linkstation-poweroff.c
> index f1e843df0e16..cb5a32f852c1 100644
> --- a/drivers/power/reset/linkstation-poweroff.c
> +++ b/drivers/power/reset/linkstation-poweroff.c
> @@ -29,11 +29,21 @@
>  #define LED2_FORCE_ON					(0x8 << 8)
>  #define LEDMASK						GENMASK(11,8)
>  
> +struct power_off_cfg {
> +	char *mdio_node_name;
> +	void (*phy_set_reg)(bool restart);
> +};
> +
>  static struct phy_device *phydev;
> +static const struct power_off_cfg *cfg;
>  
> -static void mvphy_reg_intn(u16 data)
> +static void linkstation_mvphy_reg_intn(bool restart)
>  {
>  	int rc = 0, saved_page;
> +	u16 data = 0;
> +
> +	if (restart)
> +		data = MII_88E1318S_PHY_LED_TCR_FORCE_INT;
>  
>  	saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE);
>  	if (saved_page < 0)
> @@ -66,11 +76,16 @@ static void mvphy_reg_intn(u16 data)
>  		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
>  }
>  
> +static const struct power_off_cfg linkstation_power_off_cfg = {
> +	.mdio_node_name = "mdio",
> +	.phy_set_reg = linkstation_mvphy_reg_intn,
> +};
> +
>  static int linkstation_reboot_notifier(struct notifier_block *nb,
>  				       unsigned long action, void *unused)
>  {
>  	if (action == SYS_RESTART)
> -		mvphy_reg_intn(MII_88E1318S_PHY_LED_TCR_FORCE_INT);
> +		cfg->phy_set_reg(true);
>  
>  	return NOTIFY_DONE;
>  }
> @@ -82,14 +97,18 @@ static struct notifier_block linkstation_reboot_nb = {
>  static void linkstation_poweroff(void)
>  {
>  	unregister_reboot_notifier(&linkstation_reboot_nb);
> -	mvphy_reg_intn(0);
> +	cfg->phy_set_reg(false);
>  
>  	kernel_restart("Power off");
>  }
>  
>  static const struct of_device_id ls_poweroff_of_match[] = {
> -	{ .compatible = "buffalo,ls421d" },
> -	{ .compatible = "buffalo,ls421de" },
> +	{ .compatible = "buffalo,ls421d",
> +	  .data = &linkstation_power_off_cfg,
> +	},
> +	{ .compatible = "buffalo,ls421de",
> +	  .data = &linkstation_power_off_cfg,
> +	},
>  	{ },
>  };
>  
> @@ -97,13 +116,17 @@ static int __init linkstation_poweroff_init(void)
>  {
>  	struct mii_bus *bus;
>  	struct device_node *dn;
> +	const struct of_device_id *match;
>  
>  	dn = of_find_matching_node(NULL, ls_poweroff_of_match);
>  	if (!dn)
>  		return -ENODEV;
>  	of_node_put(dn);
>  
> -	dn = of_find_node_by_name(NULL, "mdio");
> +	match = of_match_node(ls_poweroff_of_match, dn);
> +	cfg = match->data;
> +
> +	dn = of_find_node_by_name(NULL, cfg->mdio_node_name);
>  	if (!dn)
>  		return -ENODEV;
>  
> -- 
> 2.25.1
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] power: reset: linkstation-poweroff: add new device
  2021-06-24  9:18 ` [PATCH 2/2] power: reset: linkstation-poweroff: add new device Pawel Dembicki
@ 2021-08-13 17:18   ` Sebastian Reichel
  0 siblings, 0 replies; 4+ messages in thread
From: Sebastian Reichel @ 2021-08-13 17:18 UTC (permalink / raw)
  To: Pawel Dembicki; +Cc: Daniel Gonzalez Cabanelas, linux-pm, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3340 bytes --]

Hi,

On Thu, Jun 24, 2021 at 11:18:12AM +0200, Pawel Dembicki wrote:
> This commit introduces support for NETGEAR ReadyNAS Duo v2.
> This device use bit 4 of LED[2:0] Polarity Control Register to indicate
> AC Power loss.
> 
> For more details about AC loss detection in NETGEAR ReadyNAS Duo v2,
> please look at the file:
> RND_5.3.13_WW.src/u-boot/board/mv_feroceon/mv_hal/usibootup/usibootup.c
> from Netgear GPL sources.
> 
> Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
> ---

Thanks, queued.

-- Sebastian

>  drivers/power/reset/linkstation-poweroff.c | 43 ++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
> 
> diff --git a/drivers/power/reset/linkstation-poweroff.c b/drivers/power/reset/linkstation-poweroff.c
> index cb5a32f852c1..5afe3ef23395 100644
> --- a/drivers/power/reset/linkstation-poweroff.c
> +++ b/drivers/power/reset/linkstation-poweroff.c
> @@ -19,6 +19,7 @@
>  #define MII_MARVELL_PHY_PAGE		22
>  
>  #define MII_PHY_LED_CTRL		16
> +#define MII_PHY_LED_POL_CTRL		17
>  #define MII_88E1318S_PHY_LED_TCR	18
>  #define MII_88E1318S_PHY_WOL_CTRL	16
>  #define MII_M1011_IEVENT		19
> @@ -29,6 +30,8 @@
>  #define LED2_FORCE_ON					(0x8 << 8)
>  #define LEDMASK						GENMASK(11,8)
>  
> +#define MII_88E1318S_PHY_LED_POL_LED2		BIT(4)
> +
>  struct power_off_cfg {
>  	char *mdio_node_name;
>  	void (*phy_set_reg)(bool restart);
> @@ -76,11 +79,48 @@ static void linkstation_mvphy_reg_intn(bool restart)
>  		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
>  }
>  
> +static void readynas_mvphy_set_reg(bool restart)
> +{
> +	int rc = 0, saved_page;
> +	u16 data = 0;
> +
> +	if (restart)
> +		data = MII_88E1318S_PHY_LED_POL_LED2;
> +
> +	saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE);
> +	if (saved_page < 0)
> +		goto err;
> +
> +	/* Set the LED[2].0 Polarity bit to the required state */
> +	__phy_modify(phydev, MII_PHY_LED_POL_CTRL,
> +		     MII_88E1318S_PHY_LED_POL_LED2, data);
> +
> +	if (!data) {
> +
> +		/* If WOL was enabled and a magic packet was received before powering
> +		 * off, we won't be able to wake up by sending another magic packet.
> +		 * Clear WOL status.
> +		 */
> +		__phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_WOL_PAGE);
> +		__phy_set_bits(phydev, MII_88E1318S_PHY_WOL_CTRL,
> +			       MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS);
> +	}
> +err:
> +	rc = phy_restore_page(phydev, saved_page, rc);
> +	if (rc < 0)
> +		dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
> +}
> +
>  static const struct power_off_cfg linkstation_power_off_cfg = {
>  	.mdio_node_name = "mdio",
>  	.phy_set_reg = linkstation_mvphy_reg_intn,
>  };
>  
> +static const struct power_off_cfg readynas_power_off_cfg = {
> +	.mdio_node_name = "mdio-bus",
> +	.phy_set_reg = readynas_mvphy_set_reg,
> +};
> +
>  static int linkstation_reboot_notifier(struct notifier_block *nb,
>  				       unsigned long action, void *unused)
>  {
> @@ -109,6 +149,9 @@ static const struct of_device_id ls_poweroff_of_match[] = {
>  	{ .compatible = "buffalo,ls421de",
>  	  .data = &linkstation_power_off_cfg,
>  	},
> +	{ .compatible = "netgear,readynas-duo-v2",
> +	  .data = &readynas_power_off_cfg,
> +	},
>  	{ },
>  };
>  
> -- 
> 2.25.1
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-08-13 17:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-24  9:18 [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Pawel Dembicki
2021-06-24  9:18 ` [PATCH 2/2] power: reset: linkstation-poweroff: add new device Pawel Dembicki
2021-08-13 17:18   ` Sebastian Reichel
2021-08-13 17:17 ` [PATCH 1/2] power: reset: linkstation-poweroff: prepare for new devices Sebastian Reichel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.