Instead of writing direct into the reset registers.
Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
compatible = "mediatek,mt7628-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
compatible = "mediatek,mt7628-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
- resets = <&rstctrl 23>;
- reset-names = "esw";
+ resets = <&rstctrl 23 &rstctrl 24>;
+ reset-names = "esw", "ephy";
interrupt-parent = <&intc>;
interrupts = <17>;
interrupt-parent = <&intc>;
interrupts = <17>;
compatible = "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
compatible = "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
- resets = <&rstctrl 23>;
- reset-names = "esw";
+ resets = <&rstctrl 23 &rstctrl 24>;
+ reset-names = "esw", "ephy";
interrupt-parent = <&intc>;
interrupts = <17>;
interrupt-parent = <&intc>;
interrupts = <17>;
compatible = "ralink,rt3352-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
compatible = "ralink,rt3352-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
- resets = <&rstctrl 23>;
- reset-names = "esw";
+ resets = <&rstctrl 23 &rstctrl 24>;
+ reset-names = "esw", "ephy";
interrupt-parent = <&intc>;
interrupts = <17>;
interrupt-parent = <&intc>;
interrupts = <17>;
compatible = "ralink,rt5350-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
compatible = "ralink,rt5350-esw", "ralink,rt3050-esw";
reg = <0x10110000 0x8000>;
- resets = <&rstctrl 23>;
- reset-names = "esw";
+ resets = <&rstctrl 23 &rstctrl 24>;
+ reset-names = "esw", "ephy";
interrupt-parent = <&intc>;
interrupts = <17>;
interrupt-parent = <&intc>;
interrupts = <17>;
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <asm/mach-ralink/ralink_regs.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <asm/mach-ralink/ralink_regs.h>
+#include <linux/of_device.h>
#include <linux/of_irq.h>
#include <linux/switch.h>
#include <linux/of_irq.h>
#include <linux/switch.h>
+#include <linux/reset.h>
#define RT5350_ESW_REG_PXTPC(_x) (0x150 + (4 * _x))
#define RT5350_EWS_REG_LED_POLARITY 0x168
#define RT5350_ESW_REG_PXTPC(_x) (0x150 + (4 * _x))
#define RT5350_EWS_REG_LED_POLARITY 0x168
-#define RT5350_RESET_EPHY BIT(24)
enum {
/* Global attributes. */
enum {
/* Global attributes. */
int led_frequency;
struct esw_vlan vlans[RT305X_ESW_NUM_VLANS];
struct esw_port ports[RT305X_ESW_NUM_PORTS];
int led_frequency;
struct esw_vlan vlans[RT305X_ESW_NUM_VLANS];
struct esw_port ports[RT305X_ESW_NUM_PORTS];
+ struct reset_control *rst_esw;
+ struct reset_control *rst_ephy;
__raw_writel(t | val, esw->base + reg);
}
__raw_writel(t | val, esw->base + reg);
}
+static void esw_reset(struct rt305x_esw *esw)
+{
+ if (!esw->rst_esw)
+ return;
+
+ reset_control_assert(esw->rst_esw);
+ usleep_range(60, 120);
+ reset_control_deassert(esw->rst_esw);
+ /* the esw takes long to reset otherwise the board hang */
+ msleep(10);
+}
+
+static void esw_reset_ephy(struct rt305x_esw *esw)
+{
+ if (!esw->rst_ephy)
+ return;
+
+ reset_control_assert(esw->rst_ephy);
+ usleep_range(60, 120);
+ reset_control_deassert(esw->rst_ephy);
+ usleep_range(60, 120);
+}
+
static void esw_rmw(struct rt305x_esw *esw, unsigned reg,
unsigned long mask, unsigned long val)
{
static void esw_rmw(struct rt305x_esw *esw, unsigned reg,
unsigned long mask, unsigned long val)
{
esw->ports[i].disable = (port_disable & (1 << i)) != 0;
if (ralink_soc == RT305X_SOC_RT3352) {
esw->ports[i].disable = (port_disable & (1 << i)) != 0;
if (ralink_soc == RT305X_SOC_RT3352) {
- /* reset EPHY */
- fe_reset(RT5350_RESET_EPHY);
rt305x_mii_write(esw, 0, 31, 0x8000);
for (i = 0; i < 5; i++) {
rt305x_mii_write(esw, 0, 31, 0x8000);
for (i = 0; i < 5; i++) {
/* select local register */
rt305x_mii_write(esw, 0, 31, 0x8000);
} else if (ralink_soc == RT305X_SOC_RT5350) {
/* select local register */
rt305x_mii_write(esw, 0, 31, 0x8000);
} else if (ralink_soc == RT305X_SOC_RT5350) {
- /* reset EPHY */
- fe_reset(RT5350_RESET_EPHY);
/* set the led polarity */
esw_w32(esw, esw->reg_led_polarity & 0x1F,
/* set the led polarity */
esw_w32(esw, esw->reg_led_polarity & 0x1F,
} else if (ralink_soc == MT762X_SOC_MT7628AN || ralink_soc == MT762X_SOC_MT7688) {
int i;
} else if (ralink_soc == MT762X_SOC_MT7628AN || ralink_soc == MT762X_SOC_MT7688) {
int i;
- /* reset EPHY */
- fe_reset(RT5350_RESET_EPHY);
/* set the led polarity */
esw_w32(esw, esw->reg_led_polarity & 0x1F,
/* set the led polarity */
esw_w32(esw, esw->reg_led_polarity & 0x1F,
if (reg_init)
esw->reg_led_polarity = be32_to_cpu(*reg_init);
if (reg_init)
esw->reg_led_polarity = be32_to_cpu(*reg_init);
+ esw->rst_esw = devm_reset_control_get(&pdev->dev, "esw");
+ if (IS_ERR(esw->rst_esw))
+ esw->rst_esw = NULL;
+ esw->rst_ephy = devm_reset_control_get(&pdev->dev, "ephy");
+ if (IS_ERR(esw->rst_ephy))
+ esw->rst_ephy = NULL;
+
swdev = &esw->swdev;
swdev->of_node = pdev->dev.of_node;
swdev->name = "rt305x-esw";
swdev = &esw->swdev;
swdev->of_node = pdev->dev.of_node;
swdev->name = "rt305x-esw";