Merge tag 'char-misc-5.13-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg KH: "Here are some small misc driver fixes for 5.13-rc6 that fix some reported problems: - Tiny phy driver fixes for reported issues - rtsx regression for when the device suspended - mhi driver fix for a use-after-free All of these have been in linux-next for a few days with no reported issues" * tag 'char-misc-5.13-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: misc: rtsx: separate aspm mode into MODE_REG and MODE_CFG bus: mhi: pci-generic: Fix hibernation bus: mhi: pci_generic: Fix possible use-after-free in mhi_pci_remove() bus: mhi: pci_generic: T99W175: update channel name from AT to DUN phy: Sparx5 Eth SerDes: check return value after calling platform_get_resource() phy: ralink: phy-mt7621-pci: drop 'of_match_ptr' to fix -Wunused-const-variable phy: ti: Fix an error code in wiz_probe() phy: phy-mtk-tphy: Fix some resource leaks in mtk_phy_init() phy: cadence: Sierra: Fix error return code in cdns_sierra_phy_probe() phy: usb: Fix misuse of IS_ENABLED
This commit is contained in:
@@ -311,8 +311,8 @@ static const struct mhi_channel_config mhi_foxconn_sdx55_channels[] = {
|
|||||||
MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1),
|
MHI_CHANNEL_CONFIG_DL(5, "DIAG", 32, 1),
|
||||||
MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0),
|
MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0),
|
MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_UL(32, "AT", 32, 0),
|
MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_DL(33, "AT", 32, 0),
|
MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0),
|
||||||
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2),
|
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2),
|
||||||
MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3),
|
MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3),
|
||||||
};
|
};
|
||||||
@@ -708,7 +708,7 @@ static void mhi_pci_remove(struct pci_dev *pdev)
|
|||||||
struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev);
|
struct mhi_pci_device *mhi_pdev = pci_get_drvdata(pdev);
|
||||||
struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
|
struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
|
||||||
|
|
||||||
del_timer(&mhi_pdev->health_check_timer);
|
del_timer_sync(&mhi_pdev->health_check_timer);
|
||||||
cancel_work_sync(&mhi_pdev->recovery_work);
|
cancel_work_sync(&mhi_pdev->recovery_work);
|
||||||
|
|
||||||
if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) {
|
if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) {
|
||||||
@@ -935,9 +935,43 @@ static int __maybe_unused mhi_pci_resume(struct device *dev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __maybe_unused mhi_pci_freeze(struct device *dev)
|
||||||
|
{
|
||||||
|
struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
|
||||||
|
struct mhi_controller *mhi_cntrl = &mhi_pdev->mhi_cntrl;
|
||||||
|
|
||||||
|
/* We want to stop all operations, hibernation does not guarantee that
|
||||||
|
* device will be in the same state as before freezing, especially if
|
||||||
|
* the intermediate restore kernel reinitializes MHI device with new
|
||||||
|
* context.
|
||||||
|
*/
|
||||||
|
if (test_and_clear_bit(MHI_PCI_DEV_STARTED, &mhi_pdev->status)) {
|
||||||
|
mhi_power_down(mhi_cntrl, false);
|
||||||
|
mhi_unprepare_after_power_down(mhi_cntrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __maybe_unused mhi_pci_restore(struct device *dev)
|
||||||
|
{
|
||||||
|
struct mhi_pci_device *mhi_pdev = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
/* Reinitialize the device */
|
||||||
|
queue_work(system_long_wq, &mhi_pdev->recovery_work);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct dev_pm_ops mhi_pci_pm_ops = {
|
static const struct dev_pm_ops mhi_pci_pm_ops = {
|
||||||
SET_RUNTIME_PM_OPS(mhi_pci_runtime_suspend, mhi_pci_runtime_resume, NULL)
|
SET_RUNTIME_PM_OPS(mhi_pci_runtime_suspend, mhi_pci_runtime_resume, NULL)
|
||||||
SET_SYSTEM_SLEEP_PM_OPS(mhi_pci_suspend, mhi_pci_resume)
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
.suspend = mhi_pci_suspend,
|
||||||
|
.resume = mhi_pci_resume,
|
||||||
|
.freeze = mhi_pci_freeze,
|
||||||
|
.thaw = mhi_pci_restore,
|
||||||
|
.restore = mhi_pci_restore,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_driver mhi_pci_driver = {
|
static struct pci_driver mhi_pci_driver = {
|
||||||
|
|||||||
@@ -468,6 +468,7 @@ static void rtl8411_init_common_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10);
|
||||||
pcr->ic_version = rtl8411_get_ic_version(pcr);
|
pcr->ic_version = rtl8411_get_ic_version(pcr);
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ void rts5209_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 16);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 16);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||||
|
|
||||||
|
|||||||
@@ -358,6 +358,7 @@ void rts5227_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 7, 7);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 7, 7);
|
||||||
|
|
||||||
@@ -483,6 +484,7 @@ void rts522a_init_params(struct rtsx_pcr *pcr)
|
|||||||
|
|
||||||
rts5227_init_params(pcr);
|
rts5227_init_params(pcr);
|
||||||
pcr->ops = &rts522a_pcr_ops;
|
pcr->ops = &rts522a_pcr_ops;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11);
|
||||||
pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3;
|
pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3;
|
||||||
|
|
||||||
|
|||||||
@@ -718,6 +718,7 @@ void rts5228_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(28, 27, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(28, 27, 11);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||||
|
|
||||||
|
|||||||
@@ -246,6 +246,7 @@ void rts5229_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 6, 6);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 6, 6);
|
||||||
|
|
||||||
|
|||||||
@@ -566,6 +566,7 @@ void rts5249_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_CFG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||||
|
|
||||||
@@ -729,6 +730,7 @@ static const struct pcr_ops rts524a_pcr_ops = {
|
|||||||
void rts524a_init_params(struct rtsx_pcr *pcr)
|
void rts524a_init_params(struct rtsx_pcr *pcr)
|
||||||
{
|
{
|
||||||
rts5249_init_params(pcr);
|
rts5249_init_params(pcr);
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||||
@@ -845,6 +847,7 @@ static const struct pcr_ops rts525a_pcr_ops = {
|
|||||||
void rts525a_init_params(struct rtsx_pcr *pcr)
|
void rts525a_init_params(struct rtsx_pcr *pcr)
|
||||||
{
|
{
|
||||||
rts5249_init_params(pcr);
|
rts5249_init_params(pcr);
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11);
|
||||||
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF;
|
||||||
pcr->option.ltr_l1off_snooze_sspwrgate =
|
pcr->option.ltr_l1off_snooze_sspwrgate =
|
||||||
|
|||||||
@@ -628,6 +628,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||||
|
|
||||||
|
|||||||
@@ -783,6 +783,7 @@ void rts5261_init_params(struct rtsx_pcr *pcr)
|
|||||||
pcr->sd30_drive_sel_1v8 = 0x00;
|
pcr->sd30_drive_sel_1v8 = 0x00;
|
||||||
pcr->sd30_drive_sel_3v3 = 0x00;
|
pcr->sd30_drive_sel_3v3 = 0x00;
|
||||||
pcr->aspm_en = ASPM_L1_EN;
|
pcr->aspm_en = ASPM_L1_EN;
|
||||||
|
pcr->aspm_mode = ASPM_MODE_REG;
|
||||||
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 11);
|
pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 11);
|
||||||
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5);
|
||||||
|
|
||||||
|
|||||||
@@ -85,12 +85,18 @@ static void rtsx_comm_set_aspm(struct rtsx_pcr *pcr, bool enable)
|
|||||||
if (pcr->aspm_enabled == enable)
|
if (pcr->aspm_enabled == enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pcr->aspm_en & 0x02)
|
if (pcr->aspm_mode == ASPM_MODE_CFG) {
|
||||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
pcie_capability_clear_and_set_word(pcr->pci, PCI_EXP_LNKCTL,
|
||||||
FORCE_ASPM_CTL1, enable ? 0 : FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
PCI_EXP_LNKCTL_ASPMC,
|
||||||
else
|
enable ? pcr->aspm_en : 0);
|
||||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
} else if (pcr->aspm_mode == ASPM_MODE_REG) {
|
||||||
FORCE_ASPM_CTL1, FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
if (pcr->aspm_en & 0x02)
|
||||||
|
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
||||||
|
FORCE_ASPM_CTL1, enable ? 0 : FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
||||||
|
else
|
||||||
|
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, FORCE_ASPM_CTL0 |
|
||||||
|
FORCE_ASPM_CTL1, FORCE_ASPM_CTL0 | FORCE_ASPM_CTL1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!enable && (pcr->aspm_en & 0x02))
|
if (!enable && (pcr->aspm_en & 0x02))
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
@@ -1394,7 +1400,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0x30, 0x30);
|
if (pcr->aspm_mode == ASPM_MODE_REG)
|
||||||
|
rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0x30, 0x30);
|
||||||
|
|
||||||
/* No CD interrupt if probing driver with card inserted.
|
/* No CD interrupt if probing driver with card inserted.
|
||||||
* So we need to initialize pcr->card_exist here.
|
* So we need to initialize pcr->card_exist here.
|
||||||
@@ -1410,6 +1417,8 @@ static int rtsx_pci_init_hw(struct rtsx_pcr *pcr)
|
|||||||
static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
|
static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
u16 cfg_val;
|
||||||
|
u8 val;
|
||||||
|
|
||||||
spin_lock_init(&pcr->lock);
|
spin_lock_init(&pcr->lock);
|
||||||
mutex_init(&pcr->pcr_mutex);
|
mutex_init(&pcr->pcr_mutex);
|
||||||
@@ -1477,6 +1486,21 @@ static int rtsx_pci_init_chip(struct rtsx_pcr *pcr)
|
|||||||
if (!pcr->slots)
|
if (!pcr->slots)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (pcr->aspm_mode == ASPM_MODE_CFG) {
|
||||||
|
pcie_capability_read_word(pcr->pci, PCI_EXP_LNKCTL, &cfg_val);
|
||||||
|
if (cfg_val & PCI_EXP_LNKCTL_ASPM_L1)
|
||||||
|
pcr->aspm_enabled = true;
|
||||||
|
else
|
||||||
|
pcr->aspm_enabled = false;
|
||||||
|
|
||||||
|
} else if (pcr->aspm_mode == ASPM_MODE_REG) {
|
||||||
|
rtsx_pci_read_register(pcr, ASPM_FORCE_CTL, &val);
|
||||||
|
if (val & FORCE_ASPM_CTL0 && val & FORCE_ASPM_CTL1)
|
||||||
|
pcr->aspm_enabled = false;
|
||||||
|
else
|
||||||
|
pcr->aspm_enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (pcr->ops->fetch_vendor_settings)
|
if (pcr->ops->fetch_vendor_settings)
|
||||||
pcr->ops->fetch_vendor_settings(pcr);
|
pcr->ops->fetch_vendor_settings(pcr);
|
||||||
|
|
||||||
@@ -1506,7 +1530,6 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
|||||||
struct pcr_handle *handle;
|
struct pcr_handle *handle;
|
||||||
u32 base, len;
|
u32 base, len;
|
||||||
int ret, i, bar = 0;
|
int ret, i, bar = 0;
|
||||||
u8 val;
|
|
||||||
|
|
||||||
dev_dbg(&(pcidev->dev),
|
dev_dbg(&(pcidev->dev),
|
||||||
": Realtek PCI-E Card Reader found at %s [%04x:%04x] (rev %x)\n",
|
": Realtek PCI-E Card Reader found at %s [%04x:%04x] (rev %x)\n",
|
||||||
@@ -1572,11 +1595,6 @@ static int rtsx_pci_probe(struct pci_dev *pcidev,
|
|||||||
pcr->host_cmds_addr = pcr->rtsx_resv_buf_addr;
|
pcr->host_cmds_addr = pcr->rtsx_resv_buf_addr;
|
||||||
pcr->host_sg_tbl_ptr = pcr->rtsx_resv_buf + HOST_CMDS_BUF_LEN;
|
pcr->host_sg_tbl_ptr = pcr->rtsx_resv_buf + HOST_CMDS_BUF_LEN;
|
||||||
pcr->host_sg_tbl_addr = pcr->rtsx_resv_buf_addr + HOST_CMDS_BUF_LEN;
|
pcr->host_sg_tbl_addr = pcr->rtsx_resv_buf_addr + HOST_CMDS_BUF_LEN;
|
||||||
rtsx_pci_read_register(pcr, ASPM_FORCE_CTL, &val);
|
|
||||||
if (val & FORCE_ASPM_CTL0 && val & FORCE_ASPM_CTL1)
|
|
||||||
pcr->aspm_enabled = false;
|
|
||||||
else
|
|
||||||
pcr->aspm_enabled = true;
|
|
||||||
pcr->card_inserted = 0;
|
pcr->card_inserted = 0;
|
||||||
pcr->card_removed = 0;
|
pcr->card_removed = 0;
|
||||||
INIT_DELAYED_WORK(&pcr->carddet_work, rtsx_pci_card_detect);
|
INIT_DELAYED_WORK(&pcr->carddet_work, rtsx_pci_card_detect);
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ static inline u32 brcm_usb_readl(void __iomem *addr)
|
|||||||
* Other architectures (e.g., ARM) either do not support big endian, or
|
* Other architectures (e.g., ARM) either do not support big endian, or
|
||||||
* else leave I/O in little endian mode.
|
* else leave I/O in little endian mode.
|
||||||
*/
|
*/
|
||||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
|
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
||||||
return __raw_readl(addr);
|
return __raw_readl(addr);
|
||||||
else
|
else
|
||||||
return readl_relaxed(addr);
|
return readl_relaxed(addr);
|
||||||
@@ -87,7 +87,7 @@ static inline u32 brcm_usb_readl(void __iomem *addr)
|
|||||||
static inline void brcm_usb_writel(u32 val, void __iomem *addr)
|
static inline void brcm_usb_writel(u32 val, void __iomem *addr)
|
||||||
{
|
{
|
||||||
/* See brcmnand_readl() comments */
|
/* See brcmnand_readl() comments */
|
||||||
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
|
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
|
||||||
__raw_writel(val, addr);
|
__raw_writel(val, addr);
|
||||||
else
|
else
|
||||||
writel_relaxed(val, addr);
|
writel_relaxed(val, addr);
|
||||||
|
|||||||
@@ -940,6 +940,7 @@ static int cdns_sierra_phy_probe(struct platform_device *pdev)
|
|||||||
sp->nsubnodes = node;
|
sp->nsubnodes = node;
|
||||||
|
|
||||||
if (sp->num_lanes > SIERRA_MAX_LANES) {
|
if (sp->num_lanes > SIERRA_MAX_LANES) {
|
||||||
|
ret = -EINVAL;
|
||||||
dev_err(dev, "Invalid lane configuration\n");
|
dev_err(dev, "Invalid lane configuration\n");
|
||||||
goto put_child2;
|
goto put_child2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -949,6 +949,8 @@ static int mtk_phy_init(struct phy *phy)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev_err(tphy->dev, "incompatible PHY type\n");
|
dev_err(tphy->dev, "incompatible PHY type\n");
|
||||||
|
clk_disable_unprepare(instance->ref_clk);
|
||||||
|
clk_disable_unprepare(instance->da_ref_clk);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2470,6 +2470,10 @@ static int sparx5_serdes_probe(struct platform_device *pdev)
|
|||||||
priv->coreclock = clock;
|
priv->coreclock = clock;
|
||||||
|
|
||||||
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
if (!iores) {
|
||||||
|
dev_err(priv->dev, "Invalid resource\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores));
|
iomem = devm_ioremap(priv->dev, iores->start, resource_size(iores));
|
||||||
if (IS_ERR(iomem)) {
|
if (IS_ERR(iomem)) {
|
||||||
dev_err(priv->dev, "Unable to get serdes registers: %s\n",
|
dev_err(priv->dev, "Unable to get serdes registers: %s\n",
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ static struct platform_driver mt7621_pci_phy_driver = {
|
|||||||
.probe = mt7621_pci_phy_probe,
|
.probe = mt7621_pci_phy_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "mt7621-pci-phy",
|
.name = "mt7621-pci-phy",
|
||||||
.of_match_table = of_match_ptr(mt7621_pci_phy_ids),
|
.of_match_table = mt7621_pci_phy_ids,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1212,6 +1212,7 @@ static int wiz_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
if (wiz->typec_dir_delay < WIZ_TYPEC_DIR_DEBOUNCE_MIN ||
|
if (wiz->typec_dir_delay < WIZ_TYPEC_DIR_DEBOUNCE_MIN ||
|
||||||
wiz->typec_dir_delay > WIZ_TYPEC_DIR_DEBOUNCE_MAX) {
|
wiz->typec_dir_delay > WIZ_TYPEC_DIR_DEBOUNCE_MAX) {
|
||||||
|
ret = -EINVAL;
|
||||||
dev_err(dev, "Invalid typec-dir-debounce property\n");
|
dev_err(dev, "Invalid typec-dir-debounce property\n");
|
||||||
goto err_addr_to_resource;
|
goto err_addr_to_resource;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1109,6 +1109,7 @@ struct pcr_ops {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum PDEV_STAT {PDEV_STAT_IDLE, PDEV_STAT_RUN};
|
enum PDEV_STAT {PDEV_STAT_IDLE, PDEV_STAT_RUN};
|
||||||
|
enum ASPM_MODE {ASPM_MODE_CFG, ASPM_MODE_REG};
|
||||||
|
|
||||||
#define ASPM_L1_1_EN BIT(0)
|
#define ASPM_L1_1_EN BIT(0)
|
||||||
#define ASPM_L1_2_EN BIT(1)
|
#define ASPM_L1_2_EN BIT(1)
|
||||||
@@ -1234,6 +1235,7 @@ struct rtsx_pcr {
|
|||||||
u8 card_drive_sel;
|
u8 card_drive_sel;
|
||||||
#define ASPM_L1_EN 0x02
|
#define ASPM_L1_EN 0x02
|
||||||
u8 aspm_en;
|
u8 aspm_en;
|
||||||
|
enum ASPM_MODE aspm_mode;
|
||||||
bool aspm_enabled;
|
bool aspm_enabled;
|
||||||
|
|
||||||
#define PCR_MS_PMOS (1 << 0)
|
#define PCR_MS_PMOS (1 << 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user