Merge remote-tracking branch 'stable/linux-5.10.y' into rpi-5.10.y
authorDom Cobley <popcornmix@gmail.com>
Tue, 17 Aug 2021 18:34:57 +0000 (19:34 +0100)
committerDom Cobley <popcornmix@gmail.com>
Tue, 17 Aug 2021 18:34:57 +0000 (19:34 +0100)
29 files changed:
1  2 
Makefile
arch/arm/boot/dts/bcm2711-rpi-4-b.dts
arch/arm/boot/dts/bcm2711.dtsi
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
arch/arm/boot/dts/bcm2835-rpi-a.dts
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
arch/arm/boot/dts/bcm2835-rpi-b.dts
arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
arch/arm/boot/dts/bcm2835-rpi-zero.dts
arch/arm/boot/dts/bcm2835-rpi.dtsi
arch/arm/boot/dts/bcm2836-rpi-2-b.dts
arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts
arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
arch/arm/boot/dts/bcm2837-rpi-3-b.dts
arch/arm/boot/dts/bcm283x.dtsi
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
drivers/media/common/videobuf2/videobuf2-core.c
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
drivers/net/ethernet/broadcom/genet/bcmgenet.c
drivers/net/usb/r8152.c
drivers/spi/spi-bcm2835.c
drivers/usb/core/hub.c
drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.h
mm/page_alloc.c
sound/usb/quirks.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -3243,8 -3236,9 +3244,9 @@@ static void bcmgenet_get_hw_addr(struc
  }
  
  /* Returns a reusable dma control register value */
 -static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv)
 +static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx)
  {
+       unsigned int i;
        u32 reg;
        u32 dma_ctrl;
  
@@@ -3334,14 -3324,8 +3340,8 @@@ static int bcmgenet_open(struct net_dev
  
        bcmgenet_set_hw_addr(priv, dev->dev_addr);
  
-       if (priv->internal_phy) {
-               reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
-               reg |= EXT_ENERGY_DET_MASK;
-               bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
-       }
 -      /* Disable RX/TX DMA and flush TX queues */
 -      dma_ctrl = bcmgenet_dma_disable(priv);
 +      /* Disable RX/TX DMA and flush TX and RX queues */
 +      dma_ctrl = bcmgenet_dma_disable(priv, true);
  
        /* Reinitialize TDMA and RDMA and SW housekeeping */
        ret = bcmgenet_init_dma(priv);
@@@ -4195,14 -4175,8 +4194,8 @@@ static int bcmgenet_resume(struct devic
                if (rule->state != BCMGENET_RXNFC_STATE_UNUSED)
                        bcmgenet_hfb_create_rxnfc_filter(priv, rule);
  
-       if (priv->internal_phy) {
-               reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
-               reg |= EXT_ENERGY_DET_MASK;
-               bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
-       }
        /* Disable RX/TX DMA and flush TX queues */
 -      dma_ctrl = bcmgenet_dma_disable(priv);
 +      dma_ctrl = bcmgenet_dma_disable(priv, false);
  
        /* Reinitialize TDMA and RDMA and SW housekeeping */
        ret = bcmgenet_init_dma(priv);
@@@ -6760,291 -5281,27 +6760,292 @@@ static int rtl8152_close(struct net_dev
  
                tp->rtl_ops.down(tp);
  
 -              mutex_unlock(&tp->control);
 +              mutex_unlock(&tp->control);
++      }
 +
++      if (!res)
 +              usb_autopm_put_interface(tp->intf);
-       }
 +
 +      free_all_mem(tp);
 +
 +      return res;
 +}
 +
 +static void rtl_tally_reset(struct r8152 *tp)
 +{
 +      u32 ocp_data;
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY);
 +      ocp_data |= TALLY_RESET;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
 +}
 +
 +static void r8152b_init(struct r8152 *tp)
 +{
 +      u32 ocp_data;
 +      u16 data;
 +
 +      if (test_bit(RTL8152_UNPLUG, &tp->flags))
 +              return;
 +
 +      data = r8152_mdio_read(tp, MII_BMCR);
 +      if (data & BMCR_PDOWN) {
 +              data &= ~BMCR_PDOWN;
 +              r8152_mdio_write(tp, MII_BMCR, data);
 +      }
 +
 +      r8152_aldps_en(tp, false);
 +
 +      if (tp->version == RTL_VER_01) {
 +              ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
 +              ocp_data &= ~LED_MODE_MASK;
 +              ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
 +      }
 +
 +      r8152_power_cut_en(tp, false);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
 +      ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
 +      ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL);
 +      ocp_data &= ~MCU_CLK_RATIO_MASK;
 +      ocp_data |= MCU_CLK_RATIO | D3_CLK_GATED_EN;
 +      ocp_write_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ocp_data);
 +      ocp_data = GPHY_STS_MSK | SPEED_DOWN_MSK |
 +                 SPDWN_RXDV_MSK | SPDWN_LINKCHG_MSK;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_GPHY_INTR_IMR, ocp_data);
 +
 +      rtl_tally_reset(tp);
 +
 +      /* enable rx aggregation */
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
 +      ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
 +}
 +
 +static void r8153_init(struct r8152 *tp)
 +{
 +      u32 ocp_data;
 +      u16 data;
 +      int i;
 +
 +      if (test_bit(RTL8152_UNPLUG, &tp->flags))
 +              return;
 +
 +      r8153_u1u2en(tp, false);
 +
 +      for (i = 0; i < 500; i++) {
 +              if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
 +                  AUTOLOAD_DONE)
 +                      break;
 +
 +              msleep(20);
 +              if (test_bit(RTL8152_UNPLUG, &tp->flags))
 +                      break;
 +      }
 +
 +      data = r8153_phy_status(tp, 0);
 +
 +      if (tp->version == RTL_VER_03 || tp->version == RTL_VER_04 ||
 +          tp->version == RTL_VER_05)
 +              ocp_reg_write(tp, OCP_ADC_CFG, CKADSEL_L | ADC_EN | EN_EMI_L);
 +
 +      data = r8152_mdio_read(tp, MII_BMCR);
 +      if (data & BMCR_PDOWN) {
 +              data &= ~BMCR_PDOWN;
 +              r8152_mdio_write(tp, MII_BMCR, data);
 +      }
 +
 +      data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
 +
 +      r8153_u2p3en(tp, false);
 +
 +      if (tp->version == RTL_VER_04) {
 +              ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2);
 +              ocp_data &= ~pwd_dn_scale_mask;
 +              ocp_data |= pwd_dn_scale(96);
 +              ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2, ocp_data);
 +
 +              ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
 +              ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
 +              ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
 +      } else if (tp->version == RTL_VER_05) {
 +              ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0);
 +              ocp_data &= ~ECM_ALDPS;
 +              ocp_write_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0, ocp_data);
 +
 +              ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
 +              if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
 +                      ocp_data &= ~DYNAMIC_BURST;
 +              else
 +                      ocp_data |= DYNAMIC_BURST;
 +              ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
 +      } else if (tp->version == RTL_VER_06) {
 +              ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
 +              if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
 +                      ocp_data &= ~DYNAMIC_BURST;
 +              else
 +                      ocp_data |= DYNAMIC_BURST;
 +              ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
 +
 +              r8153_queue_wake(tp, false);
 +
 +              ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
 +              if (rtl8152_get_speed(tp) & LINK_STATUS)
 +                      ocp_data |= CUR_LINK_OK;
 +              else
 +                      ocp_data &= ~CUR_LINK_OK;
 +              ocp_data |= POLL_LINK_CHG;
 +              ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
 +      }
 +
 +      ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2);
 +      ocp_data |= EP4_FULL_FC;
 +      ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2, ocp_data);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL);
 +      ocp_data &= ~TIMER11_EN;
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
 +      ocp_data &= ~LED_MODE_MASK;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
 +
 +      ocp_data = FIFO_EMPTY_1FB | ROK_EXIT_LPM;
 +      if (tp->version == RTL_VER_04 && tp->udev->speed < USB_SPEED_SUPER)
 +              ocp_data |= LPM_TIMER_500MS;
 +      else
 +              ocp_data |= LPM_TIMER_500US;
 +      ocp_write_byte(tp, MCU_TYPE_USB, USB_LPM_CTRL, ocp_data);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2);
 +      ocp_data &= ~SEN_VAL_MASK;
 +      ocp_data |= SEN_VAL_NORMAL | SEL_RXIDLE;
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2, ocp_data);
 +
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
 +
 +      r8153_power_cut_en(tp, false);
 +      rtl_runtime_suspend_enable(tp, false);
 +      r8153_mac_clk_speed_down(tp, false);
 +      r8153_u1u2en(tp, true);
 +      usb_enable_lpm(tp->udev);
 +
 +      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6);
 +      ocp_data |= LANWAKE_CLR_EN;
 +      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data);
 +
 +      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG);
 +      ocp_data &= ~LANWAKE_PIN;
 +      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data);
 +
 +      /* rx aggregation */
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
 +      ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
 +      if (test_bit(DELL_TB_RX_AGG_BUG, &tp->flags))
 +              ocp_data |= RX_AGG_DISABLE;
 +
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
 +
 +      rtl_tally_reset(tp);
 +
 +      switch (tp->udev->speed) {
 +      case USB_SPEED_SUPER:
 +      case USB_SPEED_SUPER_PLUS:
 +              tp->coalesce = COALESCE_SUPER;
 +              break;
 +      case USB_SPEED_HIGH:
 +              tp->coalesce = COALESCE_HIGH;
 +              break;
 +      default:
 +              tp->coalesce = COALESCE_SLOW;
 +              break;
 +      }
 +}
 +
 +static void r8153b_init(struct r8152 *tp)
 +{
 +      u32 ocp_data;
 +      u16 data;
 +      int i;
 +
 +      if (test_bit(RTL8152_UNPLUG, &tp->flags))
 +              return;
 +
 +      r8153b_u1u2en(tp, false);
 +
 +      for (i = 0; i < 500; i++) {
 +              if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
 +                  AUTOLOAD_DONE)
 +                      break;
 +
 +              msleep(20);
 +              if (test_bit(RTL8152_UNPLUG, &tp->flags))
 +                      break;
 +      }
 +
 +      data = r8153_phy_status(tp, 0);
 +
 +      data = r8152_mdio_read(tp, MII_BMCR);
 +      if (data & BMCR_PDOWN) {
 +              data &= ~BMCR_PDOWN;
 +              r8152_mdio_write(tp, MII_BMCR, data);
 +      }
 +
 +      data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
 +
 +      r8153_u2p3en(tp, false);
 +
 +      /* MSC timer = 0xfff * 8ms = 32760 ms */
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff);
 +
 +      r8153b_power_cut_en(tp, false);
 +      r8153b_ups_en(tp, false);
 +      r8153_queue_wake(tp, false);
 +      rtl_runtime_suspend_enable(tp, false);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
 +      if (rtl8152_get_speed(tp) & LINK_STATUS)
 +              ocp_data |= CUR_LINK_OK;
 +      else
 +              ocp_data &= ~CUR_LINK_OK;
 +      ocp_data |= POLL_LINK_CHG;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
 +
 +      if (tp->udev->speed >= USB_SPEED_SUPER)
 +              r8153b_u1u2en(tp, true);
 +
 +      usb_enable_lpm(tp->udev);
 +
 +      /* MAC clock speed down */
 +      r8153_mac_clk_speed_down(tp, true);
 +
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
 +      ocp_data &= ~PLA_MCU_SPDWN_EN;
 +      ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
 +
 +      if (tp->version == RTL_VER_09) {
 +              /* Disable Test IO for 32QFN */
 +              if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) {
 +                      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
 +                      ocp_data |= TEST_IO_OFF;
 +                      ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
 +              }
        }
  
 -      if (!res)
 -              usb_autopm_put_interface(tp->intf);
 -
 -      free_all_mem(tp);
 +      set_bit(GREEN_ETHERNET, &tp->flags);
  
 -      return res;
 -}
 +      /* rx aggregation */
 +      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
 +      ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
 +      ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  
 -static void rtl_tally_reset(struct r8152 *tp)
 -{
 -      u32 ocp_data;
 +      rtl_tally_reset(tp);
  
 -      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY);
 -      ocp_data |= TALLY_RESET;
 -      ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
 +      tp->coalesce = 15000;   /* 15 us */
  }
  
 -static void r8152b_init(struct r8152 *tp)
 +static void r8153c_init(struct r8152 *tp)
  {
        u32 ocp_data;
        u16 data;
@@@ -1091,21 -1088,10 +1093,20 @@@ static int bcm2835_spi_transfer_one(str
        unsigned long hz_per_byte, byte_limit;
        u32 cs = bs->prepare_cs[spi->chip_select];
  
 +      if (unlikely(!tfr->len)) {
 +              static int warned;
 +
 +              if (!warned)
 +                      dev_warn(&spi->dev,
 +                               "zero-length SPI transfer ignored\n");
 +              warned = 1;
 +              return 0;
 +      }
 +
        /* set clock */
        spi_hz = tfr->speed_hz;
-       clk_hz = clk_get_rate(bs->clk);
  
-       if (spi_hz >= clk_hz / 2) {
+       if (spi_hz >= bs->clk_hz / 2) {
                cdiv = 2; /* clk_hz/2 is the fastest we can go */
        } else if (spi_hz) {
                /* CDIV must be a multiple of two */
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc mm/page_alloc.c
Simple merge
Simple merge