Skip to content

Commit

Permalink
net: gemini: Move main init to port
Browse files Browse the repository at this point in the history
The initialization sequence for the ethernet, setting up
interrupt routing and such things, need to be done after
both the ports are clocked and reset. Before this the
config will not "take". Move the initialization to the
port probe function and keep track of init status in
the state.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Linus Walleij authored and David S. Miller committed Jul 13, 2018
1 parent 60cc776 commit 06d5151
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions drivers/net/ethernet/cortina/gemini.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ struct gemini_ethernet {
void __iomem *base;
struct gemini_ethernet_port *port0;
struct gemini_ethernet_port *port1;
bool initialized;

spinlock_t irq_lock; /* Locks IRQ-related registers */
unsigned int freeq_order;
Expand Down Expand Up @@ -2303,6 +2304,14 @@ static void gemini_port_remove(struct gemini_ethernet_port *port)

static void gemini_ethernet_init(struct gemini_ethernet *geth)
{
/* Only do this once both ports are online */
if (geth->initialized)
return;
if (geth->port0 && geth->port1)
geth->initialized = true;
else
return;

writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG);
writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG);
writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG);
Expand Down Expand Up @@ -2450,6 +2459,10 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev)
geth->port0 = port;
else
geth->port1 = port;

/* This will just be done once both ports are up and reset */
gemini_ethernet_init(geth);

platform_set_drvdata(pdev, port);

/* Set up and register the netdev */
Expand Down Expand Up @@ -2567,7 +2580,6 @@ static int gemini_ethernet_probe(struct platform_device *pdev)

spin_lock_init(&geth->irq_lock);
spin_lock_init(&geth->freeq_lock);
gemini_ethernet_init(geth);

/* The children will use this */
platform_set_drvdata(pdev, geth);
Expand All @@ -2580,8 +2592,8 @@ static int gemini_ethernet_remove(struct platform_device *pdev)
{
struct gemini_ethernet *geth = platform_get_drvdata(pdev);

gemini_ethernet_init(geth);
geth_cleanup_freeq(geth);
geth->initialized = false;

return 0;
}
Expand Down

0 comments on commit 06d5151

Please sign in to comment.