1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2021, MediaTek Inc.
4 * Copyright (c) 2021-2022, Intel Corporation.
19 #include <linux/atomic.h>
20 #include <linux/bits.h>
21 #include <linux/completion.h>
22 #include <linux/device.h>
23 #include <linux/dma-mapping.h>
24 #include <linux/gfp.h>
25 #include <linux/interrupt.h>
27 #include <linux/iopoll.h>
28 #include <linux/jiffies.h>
29 #include <linux/list.h>
30 #include <linux/module.h>
31 #include <linux/mutex.h>
32 #include <linux/pci.h>
34 #include <linux/pm_runtime.h>
35 #include <linux/pm_wakeup.h>
36 #include <linux/spinlock.h>
38 #include "t7xx_mhccif.h"
39 #include "t7xx_modem_ops.h"
41 #include "t7xx_pcie_mac.h"
43 #include "t7xx_state_monitor.h"
44 #include "t7xx_port_proxy.h"
46 #define DRIVER_NAME "mtk_t7xx"
48 #define T7XX_PCI_IREG_BASE 0
49 #define T7XX_PCI_EREG_BASE 2
51 #define T7XX_INIT_TIMEOUT 20
52 #define PM_SLEEP_DIS_TIMEOUT_MS 20
53 #define PM_ACK_TIMEOUT_MS 1500
54 #define PM_AUTOSUSPEND_MS 5000
55 #define PM_RESOURCE_POLL_TIMEOUT_US 10000
56 #define PM_RESOURCE_POLL_STEP_US 100
58 static const char * const t7xx_mode_names[] = {
59 [T7XX_UNKNOWN] = "unknown",
60 [T7XX_READY] = "ready",
61 [T7XX_RESET] = "reset",
62 [T7XX_FASTBOOT_SWITCHING] = "fastboot_switching",
63 [T7XX_FASTBOOT_DOWNLOAD] = "fastboot_download",
64 [T7XX_FASTBOOT_DUMP] = "fastboot_dump",
67 static_assert(ARRAY_SIZE(t7xx_mode_names) == T7XX_MODE_LAST);
69 static ssize_t t7xx_mode_store(struct device *dev,
70 struct device_attribute *attr,
71 const char *buf, size_t count)
73 struct t7xx_pci_dev *t7xx_dev;
78 pdev = to_pci_dev(dev);
79 t7xx_dev = pci_get_drvdata(pdev);
83 mode = READ_ONCE(t7xx_dev->mode);
85 index = sysfs_match_string(t7xx_mode_names, buf);
89 if (index == T7XX_FASTBOOT_SWITCHING) {
90 if (mode == T7XX_FASTBOOT_DOWNLOAD)
93 WRITE_ONCE(t7xx_dev->mode, T7XX_FASTBOOT_SWITCHING);
94 pm_runtime_resume(dev);
95 t7xx_reset_device(t7xx_dev, FASTBOOT);
96 } else if (index == T7XX_RESET) {
97 pm_runtime_resume(dev);
98 t7xx_reset_device(t7xx_dev, PLDR);
104 static ssize_t t7xx_mode_show(struct device *dev,
105 struct device_attribute *attr,
108 enum t7xx_mode mode = T7XX_UNKNOWN;
109 struct t7xx_pci_dev *t7xx_dev;
110 struct pci_dev *pdev;
112 pdev = to_pci_dev(dev);
113 t7xx_dev = pci_get_drvdata(pdev);
117 mode = READ_ONCE(t7xx_dev->mode);
118 if (mode < T7XX_MODE_LAST)
119 return sysfs_emit(buf, "%s\n", t7xx_mode_names[mode]);
121 return sysfs_emit(buf, "%s\n", t7xx_mode_names[T7XX_UNKNOWN]);
124 static DEVICE_ATTR_RW(t7xx_mode);
126 static ssize_t t7xx_debug_ports_store(struct device *dev,
127 struct device_attribute *attr,
128 const char *buf, size_t count)
130 struct t7xx_pci_dev *t7xx_dev;
131 struct pci_dev *pdev;
135 pdev = to_pci_dev(dev);
136 t7xx_dev = pci_get_drvdata(pdev);
140 ret = kstrtobool(buf, &show);
144 t7xx_proxy_debug_ports_show(t7xx_dev, show);
145 WRITE_ONCE(t7xx_dev->debug_ports_show, show);
150 static ssize_t t7xx_debug_ports_show(struct device *dev,
151 struct device_attribute *attr,
154 struct t7xx_pci_dev *t7xx_dev;
155 struct pci_dev *pdev;
158 pdev = to_pci_dev(dev);
159 t7xx_dev = pci_get_drvdata(pdev);
163 show = READ_ONCE(t7xx_dev->debug_ports_show);
165 return sysfs_emit(buf, "%d\n", show);
168 static DEVICE_ATTR_RW(t7xx_debug_ports);
170 static struct attribute *t7xx_attr[] = {
171 &dev_attr_t7xx_mode.attr,
172 &dev_attr_t7xx_debug_ports.attr,
176 static const struct attribute_group t7xx_attribute_group = {
180 void t7xx_mode_update(struct t7xx_pci_dev *t7xx_dev, enum t7xx_mode mode)
185 WRITE_ONCE(t7xx_dev->mode, mode);
186 sysfs_notify(&t7xx_dev->pdev->dev.kobj, NULL, "t7xx_mode");
191 MTK_PM_INIT, /* Device initialized, but handshake not completed */
196 static void t7xx_dev_set_sleep_capability(struct t7xx_pci_dev *t7xx_dev, bool enable)
198 void __iomem *ctrl_reg = IREG_BASE(t7xx_dev) + T7XX_PCIE_MISC_CTRL;
201 value = ioread32(ctrl_reg);
204 value &= ~T7XX_PCIE_MISC_MAC_SLEEP_DIS;
206 value |= T7XX_PCIE_MISC_MAC_SLEEP_DIS;
208 iowrite32(value, ctrl_reg);
211 static int t7xx_wait_pm_config(struct t7xx_pci_dev *t7xx_dev)
215 ret = read_poll_timeout(ioread32, val,
216 (val & T7XX_PCIE_RESOURCE_STS_MSK) == T7XX_PCIE_RESOURCE_STS_MSK,
217 PM_RESOURCE_POLL_STEP_US, PM_RESOURCE_POLL_TIMEOUT_US, true,
218 IREG_BASE(t7xx_dev) + T7XX_PCIE_RESOURCE_STATUS);
219 if (ret == -ETIMEDOUT)
220 dev_err(&t7xx_dev->pdev->dev, "PM configuration timed out\n");
225 static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
227 struct pci_dev *pdev = t7xx_dev->pdev;
229 INIT_LIST_HEAD(&t7xx_dev->md_pm_entities);
230 mutex_init(&t7xx_dev->md_pm_entity_mtx);
231 spin_lock_init(&t7xx_dev->md_pm_lock);
232 init_completion(&t7xx_dev->sleep_lock_acquire);
233 init_completion(&t7xx_dev->pm_sr_ack);
234 init_completion(&t7xx_dev->init_done);
235 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_INIT);
237 device_init_wakeup(&pdev->dev, true);
238 dev_pm_set_driver_flags(&pdev->dev, pdev->dev.power.driver_flags |
239 DPM_FLAG_NO_DIRECT_COMPLETE);
241 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
242 pm_runtime_set_autosuspend_delay(&pdev->dev, PM_AUTOSUSPEND_MS);
243 pm_runtime_use_autosuspend(&pdev->dev);
248 void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_dev)
250 /* Enable the PCIe resource lock only after MD deep sleep is done */
251 t7xx_mhccif_mask_clr(t7xx_dev,
252 D2H_INT_DS_LOCK_ACK |
253 D2H_INT_SUSPEND_ACK |
255 D2H_INT_SUSPEND_ACK_AP |
256 D2H_INT_RESUME_ACK_AP);
257 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
258 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_RESUMED);
260 pm_runtime_mark_last_busy(&t7xx_dev->pdev->dev);
261 pm_runtime_allow(&t7xx_dev->pdev->dev);
262 pm_runtime_put_noidle(&t7xx_dev->pdev->dev);
263 complete_all(&t7xx_dev->init_done);
266 static int t7xx_pci_pm_reinit(struct t7xx_pci_dev *t7xx_dev)
268 /* The device is kept in FSM re-init flow
269 * so just roll back PM setting to the init setting.
271 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_INIT);
273 pm_runtime_get_noresume(&t7xx_dev->pdev->dev);
275 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
276 return t7xx_wait_pm_config(t7xx_dev);
279 void t7xx_pci_pm_exp_detected(struct t7xx_pci_dev *t7xx_dev)
281 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
282 t7xx_wait_pm_config(t7xx_dev);
283 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_EXCEPTION);
286 int t7xx_pci_pm_entity_register(struct t7xx_pci_dev *t7xx_dev, struct md_pm_entity *pm_entity)
288 struct md_pm_entity *entity;
290 mutex_lock(&t7xx_dev->md_pm_entity_mtx);
291 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
292 if (entity->id == pm_entity->id) {
293 mutex_unlock(&t7xx_dev->md_pm_entity_mtx);
298 list_add_tail(&pm_entity->entity, &t7xx_dev->md_pm_entities);
299 mutex_unlock(&t7xx_dev->md_pm_entity_mtx);
303 int t7xx_pci_pm_entity_unregister(struct t7xx_pci_dev *t7xx_dev, struct md_pm_entity *pm_entity)
305 struct md_pm_entity *entity, *tmp_entity;
307 mutex_lock(&t7xx_dev->md_pm_entity_mtx);
308 list_for_each_entry_safe(entity, tmp_entity, &t7xx_dev->md_pm_entities, entity) {
309 if (entity->id == pm_entity->id) {
310 list_del(&pm_entity->entity);
311 mutex_unlock(&t7xx_dev->md_pm_entity_mtx);
316 mutex_unlock(&t7xx_dev->md_pm_entity_mtx);
321 int t7xx_pci_sleep_disable_complete(struct t7xx_pci_dev *t7xx_dev)
323 struct device *dev = &t7xx_dev->pdev->dev;
326 ret = wait_for_completion_timeout(&t7xx_dev->sleep_lock_acquire,
327 msecs_to_jiffies(PM_SLEEP_DIS_TIMEOUT_MS));
329 dev_err_ratelimited(dev, "Resource wait complete timed out\n");
335 * t7xx_pci_disable_sleep() - Disable deep sleep capability.
336 * @t7xx_dev: MTK device.
338 * Lock the deep sleep capability, note that the device can still go into deep sleep
339 * state while device is in D0 state, from the host's point-of-view.
341 * If device is in deep sleep state, wake up the device and disable deep sleep capability.
343 void t7xx_pci_disable_sleep(struct t7xx_pci_dev *t7xx_dev)
347 spin_lock_irqsave(&t7xx_dev->md_pm_lock, flags);
348 t7xx_dev->sleep_disable_count++;
349 if (atomic_read(&t7xx_dev->md_pm_state) < MTK_PM_RESUMED)
350 goto unlock_and_complete;
352 if (t7xx_dev->sleep_disable_count == 1) {
355 reinit_completion(&t7xx_dev->sleep_lock_acquire);
356 t7xx_dev_set_sleep_capability(t7xx_dev, false);
358 status = ioread32(IREG_BASE(t7xx_dev) + T7XX_PCIE_RESOURCE_STATUS);
359 if (status & T7XX_PCIE_RESOURCE_STS_MSK)
360 goto unlock_and_complete;
362 t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_DS_LOCK);
364 spin_unlock_irqrestore(&t7xx_dev->md_pm_lock, flags);
368 spin_unlock_irqrestore(&t7xx_dev->md_pm_lock, flags);
369 complete_all(&t7xx_dev->sleep_lock_acquire);
373 * t7xx_pci_enable_sleep() - Enable deep sleep capability.
374 * @t7xx_dev: MTK device.
376 * After enabling deep sleep, device can enter into deep sleep state.
378 void t7xx_pci_enable_sleep(struct t7xx_pci_dev *t7xx_dev)
382 spin_lock_irqsave(&t7xx_dev->md_pm_lock, flags);
383 t7xx_dev->sleep_disable_count--;
384 if (atomic_read(&t7xx_dev->md_pm_state) < MTK_PM_RESUMED)
387 if (t7xx_dev->sleep_disable_count == 0)
388 t7xx_dev_set_sleep_capability(t7xx_dev, true);
391 spin_unlock_irqrestore(&t7xx_dev->md_pm_lock, flags);
394 static int t7xx_send_pm_request(struct t7xx_pci_dev *t7xx_dev, u32 request)
396 unsigned long wait_ret;
398 reinit_completion(&t7xx_dev->pm_sr_ack);
399 t7xx_mhccif_h2d_swint_trigger(t7xx_dev, request);
400 wait_ret = wait_for_completion_timeout(&t7xx_dev->pm_sr_ack,
401 msecs_to_jiffies(PM_ACK_TIMEOUT_MS));
408 static int __t7xx_pci_pm_suspend(struct pci_dev *pdev)
410 enum t7xx_pm_id entity_id = PM_ENTITY_ID_INVALID;
411 struct t7xx_pci_dev *t7xx_dev;
412 struct md_pm_entity *entity;
415 t7xx_dev = pci_get_drvdata(pdev);
416 if (atomic_read(&t7xx_dev->md_pm_state) <= MTK_PM_INIT ||
417 READ_ONCE(t7xx_dev->mode) != T7XX_READY) {
418 dev_err(&pdev->dev, "[PM] Exiting suspend, modem in invalid state\n");
422 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
423 ret = t7xx_wait_pm_config(t7xx_dev);
425 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
429 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_SUSPENDED);
430 t7xx_pcie_mac_clear_int(t7xx_dev, SAP_RGU_INT);
431 t7xx_dev->rgu_pci_irq_en = false;
433 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
434 if (!entity->suspend)
437 ret = entity->suspend(t7xx_dev, entity->entity_param);
439 entity_id = entity->id;
440 dev_err(&pdev->dev, "[PM] Suspend error: %d, id: %d\n", ret, entity_id);
445 ret = t7xx_send_pm_request(t7xx_dev, H2D_CH_SUSPEND_REQ);
447 dev_err(&pdev->dev, "[PM] MD suspend error: %d\n", ret);
451 ret = t7xx_send_pm_request(t7xx_dev, H2D_CH_SUSPEND_REQ_AP);
453 t7xx_send_pm_request(t7xx_dev, H2D_CH_RESUME_REQ);
454 dev_err(&pdev->dev, "[PM] SAP suspend error: %d\n", ret);
458 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
459 if (entity->suspend_late)
460 entity->suspend_late(t7xx_dev, entity->entity_param);
463 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
467 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
468 if (entity_id == entity->id)
472 entity->resume(t7xx_dev, entity->entity_param);
475 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
476 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_RESUMED);
477 t7xx_pcie_mac_set_int(t7xx_dev, SAP_RGU_INT);
481 static void t7xx_pcie_interrupt_reinit(struct t7xx_pci_dev *t7xx_dev)
483 t7xx_pcie_set_mac_msix_cfg(t7xx_dev, EXT_INT_NUM);
485 /* Disable interrupt first and let the IPs enable them */
486 iowrite32(MSIX_MSK_SET_ALL, IREG_BASE(t7xx_dev) + IMASK_HOST_MSIX_CLR_GRP0_0);
488 /* Device disables PCIe interrupts during resume and
489 * following function will re-enable PCIe interrupts.
491 t7xx_pcie_mac_interrupts_en(t7xx_dev);
492 t7xx_pcie_mac_set_int(t7xx_dev, MHCCIF_INT);
495 static int t7xx_pcie_reinit(struct t7xx_pci_dev *t7xx_dev, bool is_d3)
499 ret = pcim_enable_device(t7xx_dev->pdev);
503 t7xx_pcie_mac_atr_init(t7xx_dev);
504 t7xx_pcie_interrupt_reinit(t7xx_dev);
507 t7xx_mhccif_init(t7xx_dev);
508 t7xx_pci_pm_reinit(t7xx_dev);
514 static int t7xx_send_fsm_command(struct t7xx_pci_dev *t7xx_dev, u32 event)
516 struct t7xx_fsm_ctl *fsm_ctl = t7xx_dev->md->fsm_ctl;
517 struct device *dev = &t7xx_dev->pdev->dev;
522 ret = t7xx_fsm_append_cmd(fsm_ctl, FSM_CMD_STOP, FSM_CMD_FLAG_WAIT_FOR_COMPLETION);
526 t7xx_pcie_mac_clear_int(t7xx_dev, SAP_RGU_INT);
527 t7xx_pcie_mac_clear_int_status(t7xx_dev, SAP_RGU_INT);
528 t7xx_dev->rgu_pci_irq_en = true;
529 t7xx_pcie_mac_set_int(t7xx_dev, SAP_RGU_INT);
530 ret = t7xx_fsm_append_cmd(fsm_ctl, FSM_CMD_START, 0);
538 dev_err(dev, "Failure handling FSM command %u, %d\n", event, ret);
543 int t7xx_pci_reprobe_early(struct t7xx_pci_dev *t7xx_dev)
545 enum t7xx_mode mode = READ_ONCE(t7xx_dev->mode);
548 if (mode == T7XX_FASTBOOT_DOWNLOAD)
549 pm_runtime_put_noidle(&t7xx_dev->pdev->dev);
551 ret = t7xx_send_fsm_command(t7xx_dev, FSM_CMD_STOP);
558 int t7xx_pci_reprobe(struct t7xx_pci_dev *t7xx_dev, bool boot)
562 ret = t7xx_pcie_reinit(t7xx_dev, boot);
566 t7xx_clear_rgu_irq(t7xx_dev);
567 return t7xx_send_fsm_command(t7xx_dev, FSM_CMD_START);
570 static int __t7xx_pci_pm_resume(struct pci_dev *pdev, bool state_check)
572 struct t7xx_pci_dev *t7xx_dev;
573 struct md_pm_entity *entity;
577 t7xx_dev = pci_get_drvdata(pdev);
578 if (atomic_read(&t7xx_dev->md_pm_state) <= MTK_PM_INIT) {
579 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
583 t7xx_pcie_mac_interrupts_en(t7xx_dev);
584 prev_state = ioread32(IREG_BASE(t7xx_dev) + T7XX_PCIE_PM_RESUME_STATE);
587 /* For D3/L3 resume, the device could boot so quickly that the
588 * initial value of the dummy register might be overwritten.
589 * Identify new boots if the ATR source address register is not initialized.
591 u32 atr_reg_val = ioread32(IREG_BASE(t7xx_dev) +
592 ATR_PCIE_WIN0_T0_ATR_PARAM_SRC_ADDR);
593 if (prev_state == PM_RESUME_REG_STATE_L3 ||
594 (prev_state == PM_RESUME_REG_STATE_INIT &&
595 atr_reg_val == ATR_SRC_ADDR_INVALID)) {
596 ret = t7xx_pci_reprobe_early(t7xx_dev);
600 return t7xx_pci_reprobe(t7xx_dev, true);
603 if (prev_state == PM_RESUME_REG_STATE_EXP ||
604 prev_state == PM_RESUME_REG_STATE_L2_EXP) {
605 if (prev_state == PM_RESUME_REG_STATE_L2_EXP) {
606 ret = t7xx_pcie_reinit(t7xx_dev, false);
611 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_SUSPENDED);
612 t7xx_dev->rgu_pci_irq_en = true;
613 t7xx_pcie_mac_set_int(t7xx_dev, SAP_RGU_INT);
615 t7xx_mhccif_mask_clr(t7xx_dev,
616 D2H_INT_EXCEPTION_INIT |
617 D2H_INT_EXCEPTION_INIT_DONE |
618 D2H_INT_EXCEPTION_CLEARQ_DONE |
619 D2H_INT_EXCEPTION_ALLQ_RESET |
625 if (prev_state == PM_RESUME_REG_STATE_L2) {
626 ret = t7xx_pcie_reinit(t7xx_dev, false);
630 } else if (prev_state != PM_RESUME_REG_STATE_L1 &&
631 prev_state != PM_RESUME_REG_STATE_INIT) {
632 ret = t7xx_send_fsm_command(t7xx_dev, FSM_CMD_STOP);
636 t7xx_clear_rgu_irq(t7xx_dev);
637 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_SUSPENDED);
642 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
643 t7xx_wait_pm_config(t7xx_dev);
645 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
646 if (entity->resume_early)
647 entity->resume_early(t7xx_dev, entity->entity_param);
650 ret = t7xx_send_pm_request(t7xx_dev, H2D_CH_RESUME_REQ);
652 dev_err(&pdev->dev, "[PM] MD resume error: %d\n", ret);
654 ret = t7xx_send_pm_request(t7xx_dev, H2D_CH_RESUME_REQ_AP);
656 dev_err(&pdev->dev, "[PM] SAP resume error: %d\n", ret);
658 list_for_each_entry(entity, &t7xx_dev->md_pm_entities, entity) {
659 if (entity->resume) {
660 ret = entity->resume(t7xx_dev, entity->entity_param);
662 dev_err(&pdev->dev, "[PM] Resume entry ID: %d error: %d\n",
667 t7xx_dev->rgu_pci_irq_en = true;
668 t7xx_pcie_mac_set_int(t7xx_dev, SAP_RGU_INT);
669 iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + ENABLE_ASPM_LOWPWR);
670 pm_runtime_mark_last_busy(&pdev->dev);
671 atomic_set(&t7xx_dev->md_pm_state, MTK_PM_RESUMED);
676 static int t7xx_pci_pm_resume_noirq(struct device *dev)
678 struct pci_dev *pdev = to_pci_dev(dev);
679 struct t7xx_pci_dev *t7xx_dev;
681 t7xx_dev = pci_get_drvdata(pdev);
682 t7xx_pcie_mac_interrupts_dis(t7xx_dev);
687 static void t7xx_pci_shutdown(struct pci_dev *pdev)
689 __t7xx_pci_pm_suspend(pdev);
692 static int t7xx_pci_pm_prepare(struct device *dev)
694 struct pci_dev *pdev = to_pci_dev(dev);
695 struct t7xx_pci_dev *t7xx_dev;
697 t7xx_dev = pci_get_drvdata(pdev);
698 if (!wait_for_completion_timeout(&t7xx_dev->init_done, T7XX_INIT_TIMEOUT * HZ)) {
699 dev_warn(dev, "Not ready for system sleep.\n");
706 static int t7xx_pci_pm_suspend(struct device *dev)
708 return __t7xx_pci_pm_suspend(to_pci_dev(dev));
711 static int t7xx_pci_pm_resume(struct device *dev)
713 return __t7xx_pci_pm_resume(to_pci_dev(dev), true);
716 static int t7xx_pci_pm_thaw(struct device *dev)
718 return __t7xx_pci_pm_resume(to_pci_dev(dev), false);
721 static int t7xx_pci_pm_runtime_suspend(struct device *dev)
723 return __t7xx_pci_pm_suspend(to_pci_dev(dev));
726 static int t7xx_pci_pm_runtime_resume(struct device *dev)
728 return __t7xx_pci_pm_resume(to_pci_dev(dev), true);
731 static const struct dev_pm_ops t7xx_pci_pm_ops = {
732 .prepare = t7xx_pci_pm_prepare,
733 .suspend = t7xx_pci_pm_suspend,
734 .resume = t7xx_pci_pm_resume,
735 .resume_noirq = t7xx_pci_pm_resume_noirq,
736 .freeze = t7xx_pci_pm_suspend,
737 .thaw = t7xx_pci_pm_thaw,
738 .poweroff = t7xx_pci_pm_suspend,
739 .restore = t7xx_pci_pm_resume,
740 .restore_noirq = t7xx_pci_pm_resume_noirq,
741 .runtime_suspend = t7xx_pci_pm_runtime_suspend,
742 .runtime_resume = t7xx_pci_pm_runtime_resume
745 static int t7xx_request_irq(struct pci_dev *pdev)
747 struct t7xx_pci_dev *t7xx_dev;
750 t7xx_dev = pci_get_drvdata(pdev);
752 for (i = 0; i < EXT_INT_NUM; i++) {
753 const char *irq_descr;
756 if (!t7xx_dev->intr_handler[i])
759 irq_descr = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_%d",
760 dev_driver_string(&pdev->dev), i);
766 irq_vec = pci_irq_vector(pdev, i);
767 ret = request_threaded_irq(irq_vec, t7xx_dev->intr_handler[i],
768 t7xx_dev->intr_thread[i], 0, irq_descr,
769 t7xx_dev->callback_param[i]);
771 dev_err(&pdev->dev, "Failed to request IRQ: %d\n", ret);
778 if (!t7xx_dev->intr_handler[i])
781 free_irq(pci_irq_vector(pdev, i), t7xx_dev->callback_param[i]);
788 static int t7xx_setup_msix(struct t7xx_pci_dev *t7xx_dev)
790 struct pci_dev *pdev = t7xx_dev->pdev;
793 /* Only using 6 interrupts, but HW-design requires power-of-2 IRQs allocation */
794 ret = pci_alloc_irq_vectors(pdev, EXT_INT_NUM, EXT_INT_NUM, PCI_IRQ_MSIX);
796 dev_err(&pdev->dev, "Failed to allocate MSI-X entry: %d\n", ret);
800 ret = t7xx_request_irq(pdev);
802 pci_free_irq_vectors(pdev);
806 t7xx_pcie_set_mac_msix_cfg(t7xx_dev, EXT_INT_NUM);
810 static int t7xx_interrupt_init(struct t7xx_pci_dev *t7xx_dev)
814 if (!t7xx_dev->pdev->msix_cap)
817 ret = t7xx_setup_msix(t7xx_dev);
821 /* IPs enable interrupts when ready */
822 for (i = 0; i < EXT_INT_NUM; i++)
823 t7xx_pcie_mac_set_int(t7xx_dev, i);
828 static void t7xx_pci_infracfg_ao_calc(struct t7xx_pci_dev *t7xx_dev)
830 t7xx_dev->base_addr.infracfg_ao_base = t7xx_dev->base_addr.pcie_ext_reg_base +
831 INFRACFG_AO_DEV_CHIP -
832 t7xx_dev->base_addr.pcie_dev_reg_trsl_addr;
835 static int t7xx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
837 struct t7xx_pci_dev *t7xx_dev;
841 t7xx_dev = devm_kzalloc(&pdev->dev, sizeof(*t7xx_dev), GFP_KERNEL);
845 pci_set_drvdata(pdev, t7xx_dev);
846 t7xx_dev->pdev = pdev;
848 ret = pcim_enable_device(pdev);
852 pci_set_master(pdev);
854 iomem = pcim_iomap_region(pdev, T7XX_PCI_IREG_BASE, DRIVER_NAME);
855 ret = PTR_ERR_OR_ZERO(iomem);
857 dev_err(&pdev->dev, "Could not request IREG BAR: %d\n", ret);
860 IREG_BASE(t7xx_dev) = iomem;
862 iomem = pcim_iomap_region(pdev, T7XX_PCI_EREG_BASE, DRIVER_NAME);
863 ret = PTR_ERR_OR_ZERO(iomem);
865 dev_err(&pdev->dev, "Could not request EREG BAR: %d\n", ret);
868 t7xx_dev->base_addr.pcie_ext_reg_base = iomem;
870 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
872 dev_err(&pdev->dev, "Could not set PCI DMA mask: %d\n", ret);
876 ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
878 dev_err(&pdev->dev, "Could not set consistent PCI DMA mask: %d\n", ret);
882 ret = t7xx_pci_pm_init(t7xx_dev);
886 t7xx_pcie_mac_atr_init(t7xx_dev);
887 t7xx_pci_infracfg_ao_calc(t7xx_dev);
888 t7xx_mhccif_init(t7xx_dev);
890 ret = t7xx_md_init(t7xx_dev);
894 t7xx_pcie_mac_interrupts_dis(t7xx_dev);
896 ret = sysfs_create_group(&t7xx_dev->pdev->dev.kobj,
897 &t7xx_attribute_group);
901 ret = t7xx_interrupt_init(t7xx_dev);
903 goto err_remove_group;
906 t7xx_pcie_mac_set_int(t7xx_dev, MHCCIF_INT);
907 t7xx_pcie_mac_interrupts_en(t7xx_dev);
912 sysfs_remove_group(&t7xx_dev->pdev->dev.kobj,
913 &t7xx_attribute_group);
916 t7xx_md_exit(t7xx_dev);
920 static void t7xx_pci_remove(struct pci_dev *pdev)
922 struct t7xx_pci_dev *t7xx_dev;
925 t7xx_dev = pci_get_drvdata(pdev);
927 sysfs_remove_group(&t7xx_dev->pdev->dev.kobj,
928 &t7xx_attribute_group);
929 t7xx_md_exit(t7xx_dev);
931 for (i = 0; i < EXT_INT_NUM; i++) {
932 if (!t7xx_dev->intr_handler[i])
935 free_irq(pci_irq_vector(pdev, i), t7xx_dev->callback_param[i]);
938 pci_free_irq_vectors(t7xx_dev->pdev);
941 static const struct pci_device_id t7xx_pci_table[] = {
942 { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x4d75) },
943 { PCI_DEVICE(0x14c0, 0x4d75) }, // Dell DW5933e
946 MODULE_DEVICE_TABLE(pci, t7xx_pci_table);
948 static struct pci_driver t7xx_pci_driver = {
950 .id_table = t7xx_pci_table,
951 .probe = t7xx_pci_probe,
952 .remove = t7xx_pci_remove,
953 .driver.pm = &t7xx_pci_pm_ops,
954 .shutdown = t7xx_pci_shutdown,
957 module_pci_driver(t7xx_pci_driver);
959 MODULE_AUTHOR("MediaTek Inc");
960 MODULE_DESCRIPTION("MediaTek PCIe 5G WWAN modem T7xx driver");
961 MODULE_LICENSE("GPL");