]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'karo-tx6-mainline' into stable
authorLothar Waßmann <LW@KARO-electronics.de>
Tue, 5 Jul 2016 14:05:22 +0000 (16:05 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 5 Jul 2016 14:05:22 +0000 (16:05 +0200)
1  2 
drivers/net/ethernet/freescale/fec_main.c
drivers/spi/spi-omap2-mcspi.c

index f6147ffc7fbca76f4f6f512caa9e9612a32cf00a,976940e303f6062a28e70816cac76e4d40549351..68012c0a311cf972131a35814759e1520ec12d1e
@@@ -66,6 -66,7 +66,7 @@@
  
  static void set_multicast_list(struct net_device *ndev);
  static void fec_enet_itr_coal_init(struct net_device *ndev);
+ static void fec_reset_phy(struct platform_device *pdev);
  
  #define DRIVER_NAME   "fec"
  
@@@ -1557,15 -1558,9 +1558,15 @@@ fec_enet_rx(struct net_device *ndev, in
        struct fec_enet_private *fep = netdev_priv(ndev);
  
        for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) {
 -              clear_bit(queue_id, &fep->work_rx);
 -              pkt_received += fec_enet_rx_queue(ndev,
 +              int ret;
 +
 +              ret = fec_enet_rx_queue(ndev,
                                        budget - pkt_received, queue_id);
 +
 +              if (ret < budget - pkt_received)
 +                      clear_bit(queue_id, &fep->work_rx);
 +
 +              pkt_received += ret;
        }
        return pkt_received;
  }
@@@ -1867,6 -1862,8 +1868,8 @@@ static int fec_enet_clk_enable(struct n
                        ret = clk_prepare_enable(fep->clk_enet_out);
                        if (ret)
                                goto failed_clk_enet_out;
+                       fec_reset_phy(fep->pdev);
                }
                if (fep->clk_ptp) {
                        mutex_lock(&fep->ptp_clk_mutex);
                        }
                        mutex_unlock(&fep->ptp_clk_mutex);
                }
-               if (fep->clk_ref) {
-                       ret = clk_prepare_enable(fep->clk_ref);
-                       if (ret)
-                               goto failed_clk_ref;
-               }
+               ret = clk_prepare_enable(fep->clk_ref);
+               if (ret)
+                       goto failed_clk_ref;
        } else {
                clk_disable_unprepare(fep->clk_ahb);
-               if (fep->clk_enet_out)
-                       clk_disable_unprepare(fep->clk_enet_out);
+               clk_disable_unprepare(fep->clk_enet_out);
                if (fep->clk_ptp) {
                        mutex_lock(&fep->ptp_clk_mutex);
                        clk_disable_unprepare(fep->clk_ptp);
                        fep->ptp_clk_on = false;
                        mutex_unlock(&fep->ptp_clk_mutex);
                }
-               if (fep->clk_ref)
-                       clk_disable_unprepare(fep->clk_ref);
+               clk_disable_unprepare(fep->clk_ref);
        }
  
        return 0;
  
  failed_clk_ref:
-       if (fep->clk_ref)
-               clk_disable_unprepare(fep->clk_ref);
+       clk_disable_unprepare(fep->clk_ref);
  failed_clk_ptp:
-       if (fep->clk_enet_out)
-               clk_disable_unprepare(fep->clk_enet_out);
+       clk_disable_unprepare(fep->clk_enet_out);
  failed_clk_enet_out:
-               clk_disable_unprepare(fep->clk_ahb);
+       clk_disable_unprepare(fep->clk_ahb);
  
        return ret;
  }
@@@ -3244,30 -3236,43 +3242,43 @@@ static int fec_enet_init(struct net_dev
  #ifdef CONFIG_OF
  static void fec_reset_phy(struct platform_device *pdev)
  {
-       int err, phy_reset;
-       int msec = 1;
-       struct device_node *np = pdev->dev.of_node;
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct fec_enet_private *fep = netdev_priv(ndev);
  
-       if (!np)
+       if (!gpio_is_valid(fep->phy_reset_gpio))
                return;
  
-       of_property_read_u32(np, "phy-reset-duration", &msec);
-       /* A sane reset duration should not be longer than 1s */
-       if (msec > 1000)
-               msec = 1;
+       gpio_set_value_cansleep(fep->phy_reset_gpio, 0);
+       msleep(fep->phy_reset_duration);
+       gpio_set_value_cansleep(fep->phy_reset_gpio, 1);
+ }
+ static int fec_get_reset_gpio(struct platform_device *pdev)
+ {
+       int err, phy_reset;
+       int msec = 1;
+       struct device_node *np = pdev->dev.of_node;
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct fec_enet_private *fep = netdev_priv(ndev);
  
        phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
        if (!gpio_is_valid(phy_reset))
-               return;
+               return phy_reset;
  
        err = devm_gpio_request_one(&pdev->dev, phy_reset,
                                    GPIOF_OUT_INIT_LOW, "phy-reset");
        if (err) {
                dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);
-               return;
+               return err;
        }
-       msleep(msec);
-       gpio_set_value_cansleep(phy_reset, 1);
+       of_property_read_u32(np, "phy-reset-duration", &msec);
+       /* A sane reset duration should not be longer than 1s */
+       if (msec > 1000)
+               msec = 1;
+       fep->phy_reset_duration = msec;
+       return phy_reset;
  }
  #else /* CONFIG_OF */
  static void fec_reset_phy(struct platform_device *pdev)
         * by machine code.
         */
  }
+ static inline int fec_get_reset_gpio(struct platform_device *pdev)
+ {
+       return -EINVAL;
+ }
  #endif /* CONFIG_OF */
  
  static void
@@@ -3372,6 -3382,11 +3388,11 @@@ fec_probe(struct platform_device *pdev
  
        platform_set_drvdata(pdev, ndev);
  
+       ret = fec_get_reset_gpio(pdev);
+       if (ret == -EPROBE_DEFER)
+               goto gpio_defer;
+       fep->phy_reset_gpio = ret;
        if (of_get_property(np, "fsl,magic-packet", NULL))
                fep->wol_flag |= FEC_WOL_HAS_MAGIC_PACKET;
  
@@@ -3526,6 -3541,7 +3547,7 @@@ failed_clk_ipg
  failed_clk:
  failed_phy:
        of_node_put(phy_node);
+ gpio_defer:
  failed_ioremap:
        free_netdev(ndev);
  
index ed8283e7397aecd884616ec828fe2846b15c10df,50873236fee1d68a012164139db8638169d1d687..9ccd5a5c8b65c633809b67eb7a14b80de79116ab
@@@ -439,10 -439,9 +439,9 @@@ static void omap2_mcspi_tx_dma(struct s
                } else {
                        /* FIXME: fall back to PIO? */
                }
+               dma_async_issue_pending(mcspi_dma->dma_tx);
        }
-       dma_async_issue_pending(mcspi_dma->dma_tx);
        omap2_mcspi_set_dma_req(spi, 0, 1);
  }
  
  static unsigned
@@@ -567,10 -566,10 +566,10 @@@ omap2_mcspi_txrx_dma(struct spi_device 
        const u8                *tx;
        struct dma_slave_config cfg;
        enum dma_slave_buswidth width;
-       unsigned es;
+       unsigned                es;
        u32                     burst;
        void __iomem            *chstat_reg;
-       void __iomem            *irqstat_reg;
+       void __iomem            *irqstat_reg;
        int                     wait_res;
  
        mcspi = spi_master_get_devdata(spi->master);
@@@ -1024,16 -1023,6 +1023,16 @@@ static int omap2_mcspi_setup(struct spi
                spi->controller_state = cs;
                /* Link this to context save list */
                list_add_tail(&cs->node, &ctx->cs);
 +
 +              if (gpio_is_valid(spi->cs_gpio)) {
 +                      ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
 +                      if (ret) {
 +                              dev_err(&spi->dev, "failed to request gpio\n");
 +                              return ret;
 +                      }
 +                      gpio_direction_output(spi->cs_gpio,
 +                                       !(spi->mode & SPI_CS_HIGH));
 +              }
        }
  
        if (!mcspi_dma->dma_rx || !mcspi_dma->dma_tx) {
                        return ret;
        }
  
 -      if (gpio_is_valid(spi->cs_gpio)) {
 -              ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
 -              if (ret) {
 -                      dev_err(&spi->dev, "failed to request gpio\n");
 -                      return ret;
 -              }
 -              gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
 -      }
 -
        ret = pm_runtime_get_sync(mcspi->dev);
        if (ret < 0)
                return ret;
@@@ -1345,7 -1343,7 +1344,7 @@@ static const struct of_device_id omap_m
                .compatible = "ti,omap4-mcspi",
                .data = &omap4_pdata,
        },
-       { },
+       { }
  };
  MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
  
@@@ -1356,7 -1354,7 +1355,7 @@@ static int omap2_mcspi_probe(struct pla
        struct omap2_mcspi      *mcspi;
        struct resource         *r;
        int                     status = 0, i;
-       u32                     regs_offset = 0;
+       u32                     regs_offset;
        static int              bus_num = 1;
        struct device_node      *node = pdev->dev.of_node;
        const struct of_device_id *match;
                goto free_master;
        }
  
-       r->start += regs_offset;
-       r->end += regs_offset;
-       mcspi->phys = r->start;
        mcspi->base = devm_ioremap_resource(&pdev->dev, r);
        if (IS_ERR(mcspi->base)) {
                status = PTR_ERR(mcspi->base);
                goto free_master;
        }
+       mcspi->phys = r->start + regs_offset;
+       mcspi->base += regs_offset;
  
        mcspi->dev = &pdev->dev;