Lines Matching refs:ipa
22 #include "ipa.h"
103 * @ipa: IPA pointer
112 int ipa_setup(struct ipa *ipa)
116 struct device *dev = &ipa->pdev->dev;
119 ret = gsi_setup(&ipa->gsi);
123 ret = ipa_power_setup(ipa);
127 ipa_endpoint_setup(ipa);
132 command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
137 ret = ipa_mem_setup(ipa); /* No matching teardown required */
141 ret = ipa_table_setup(ipa); /* No matching teardown required */
148 exception_endpoint = ipa->name_map[IPA_ENDPOINT_AP_LAN_RX];
153 ipa_endpoint_default_route_set(ipa, exception_endpoint->endpoint_id);
156 ret = ipa_qmi_setup(ipa);
160 ipa->setup_complete = true;
167 ipa_endpoint_default_route_clear(ipa);
172 ipa_endpoint_teardown(ipa);
173 ipa_power_teardown(ipa);
175 gsi_teardown(&ipa->gsi);
182 * @ipa: IPA pointer
184 static void ipa_teardown(struct ipa *ipa)
190 ipa->setup_complete = false;
192 ipa_qmi_teardown(ipa);
193 ipa_endpoint_default_route_clear(ipa);
194 exception_endpoint = ipa->name_map[IPA_ENDPOINT_AP_LAN_RX];
196 command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
198 ipa_endpoint_teardown(ipa);
199 ipa_power_teardown(ipa);
200 gsi_teardown(&ipa->gsi);
204 ipa_hardware_config_bcr(struct ipa *ipa, const struct ipa_data *data)
210 if (ipa->version >= IPA_VERSION_4_5)
213 reg = ipa_reg(ipa, IPA_BCR);
215 iowrite32(val, ipa->reg_virt + reg_offset(reg));
218 static void ipa_hardware_config_tx(struct ipa *ipa)
220 enum ipa_version version = ipa->version;
229 reg = ipa_reg(ipa, IPA_TX_CFG);
232 val = ioread32(ipa->reg_virt + offset);
236 iowrite32(val, ipa->reg_virt + offset);
239 static void ipa_hardware_config_clkon(struct ipa *ipa)
241 enum ipa_version version = ipa->version;
252 reg = ipa_reg(ipa, CLKON_CFG);
262 iowrite32(val, ipa->reg_virt + reg_offset(reg));
266 static void ipa_hardware_config_comp(struct ipa *ipa)
273 if (ipa->version < IPA_VERSION_4_0)
276 reg = ipa_reg(ipa, COMP_CFG);
279 val = ioread32(ipa->reg_virt + offset);
281 if (ipa->version == IPA_VERSION_4_0) {
285 } else if (ipa->version < IPA_VERSION_4_5) {
294 iowrite32(val, ipa->reg_virt + offset);
299 ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)
312 reg = ipa_reg(ipa, QSB_MAX_WRITES);
318 iowrite32(val, ipa->reg_virt + reg_offset(reg));
321 reg = ipa_reg(ipa, QSB_MAX_READS);
324 if (ipa->version >= IPA_VERSION_4_0)
329 if (ipa->version >= IPA_VERSION_4_0)
334 iowrite32(val, ipa->reg_virt + reg_offset(reg));
368 static void ipa_qtime_config(struct ipa *ipa)
375 reg = ipa_reg(ipa, TIMERS_XO_CLK_DIV_CFG);
376 iowrite32(0, ipa->reg_virt + reg_offset(reg));
378 reg = ipa_reg(ipa, QTIME_TIMESTAMP_CFG);
386 iowrite32(val, ipa->reg_virt + reg_offset(reg));
389 reg = ipa_reg(ipa, TIMERS_PULSE_GRAN_CFG);
392 if (ipa->version >= IPA_VERSION_5_0) {
399 iowrite32(val, ipa->reg_virt + reg_offset(reg));
402 reg = ipa_reg(ipa, TIMERS_XO_CLK_DIV_CFG);
407 iowrite32(val, ipa->reg_virt + offset);
412 iowrite32(val, ipa->reg_virt + offset);
416 static void ipa_hardware_config_counter(struct ipa *ipa)
422 reg = ipa_reg(ipa, COUNTER_CFG);
425 iowrite32(val, ipa->reg_virt + reg_offset(reg));
428 static void ipa_hardware_config_timing(struct ipa *ipa)
430 if (ipa->version < IPA_VERSION_4_5)
431 ipa_hardware_config_counter(ipa);
433 ipa_qtime_config(ipa);
436 static void ipa_hardware_config_hashing(struct ipa *ipa)
445 if (ipa->version != IPA_VERSION_4_2)
449 reg = ipa_reg(ipa, FILT_ROUT_HASH_EN);
454 iowrite32(0, ipa->reg_virt + reg_offset(reg));
457 static void ipa_idle_indication_cfg(struct ipa *ipa,
464 if (ipa->version < IPA_VERSION_3_5_1)
467 reg = ipa_reg(ipa, IDLE_INDICATION_CFG);
473 iowrite32(val, ipa->reg_virt + reg_offset(reg));
478 * @ipa: IPA pointer
484 static void ipa_hardware_dcd_config(struct ipa *ipa)
487 ipa_idle_indication_cfg(ipa, 256, false);
490 static void ipa_hardware_dcd_deconfig(struct ipa *ipa)
493 ipa_idle_indication_cfg(ipa, 0, true);
498 * @ipa: IPA pointer
501 static void ipa_hardware_config(struct ipa *ipa, const struct ipa_data *data)
503 ipa_hardware_config_bcr(ipa, data);
504 ipa_hardware_config_tx(ipa);
505 ipa_hardware_config_clkon(ipa);
506 ipa_hardware_config_comp(ipa);
507 ipa_hardware_config_qsb(ipa, data);
508 ipa_hardware_config_timing(ipa);
509 ipa_hardware_config_hashing(ipa);
510 ipa_hardware_dcd_config(ipa);
515 * @ipa: IPA pointer
519 static void ipa_hardware_deconfig(struct ipa *ipa)
522 ipa_hardware_dcd_deconfig(ipa);
527 * @ipa: IPA pointer
532 static int ipa_config(struct ipa *ipa, const struct ipa_data *data)
536 ipa_hardware_config(ipa, data);
538 ret = ipa_mem_config(ipa);
542 ipa->interrupt = ipa_interrupt_config(ipa);
543 if (IS_ERR(ipa->interrupt)) {
544 ret = PTR_ERR(ipa->interrupt);
545 ipa->interrupt = NULL;
549 ipa_uc_config(ipa);
551 ret = ipa_endpoint_config(ipa);
555 ipa_table_config(ipa); /* No deconfig required */
558 ret = ipa_resource_config(ipa, data->resource_data);
562 ret = ipa_modem_config(ipa);
569 ipa_endpoint_deconfig(ipa);
571 ipa_uc_deconfig(ipa);
572 ipa_interrupt_deconfig(ipa->interrupt);
573 ipa->interrupt = NULL;
575 ipa_mem_deconfig(ipa);
577 ipa_hardware_deconfig(ipa);
584 * @ipa: IPA pointer
586 static void ipa_deconfig(struct ipa *ipa)
588 ipa_modem_deconfig(ipa);
589 ipa_endpoint_deconfig(ipa);
590 ipa_uc_deconfig(ipa);
591 ipa_interrupt_deconfig(ipa->interrupt);
592 ipa->interrupt = NULL;
593 ipa_mem_deconfig(ipa);
594 ipa_hardware_deconfig(ipa);
660 .compatible = "qcom,msm8998-ipa",
664 .compatible = "qcom,sdm845-ipa",
668 .compatible = "qcom,sc7180-ipa",
672 .compatible = "qcom,sdx55-ipa",
676 .compatible = "qcom,sm6350-ipa",
680 .compatible = "qcom,sm8350-ipa",
684 .compatible = "qcom,sc7280-ipa",
688 .compatible = "qcom,sdx65-ipa",
807 struct ipa *ipa;
843 ipa = kzalloc(sizeof(*ipa), GFP_KERNEL);
844 if (!ipa) {
849 ipa->pdev = pdev;
850 dev_set_drvdata(dev, ipa);
851 ipa->power = power;
852 ipa->version = data->version;
853 ipa->modem_route_count = data->modem_route_count;
854 init_completion(&ipa->completion);
856 ret = ipa_reg_init(ipa);
860 ret = ipa_mem_init(ipa, data->mem_data);
864 ret = gsi_init(&ipa->gsi, pdev, ipa->version, data->endpoint_count,
870 ret = ipa_endpoint_init(ipa, data->endpoint_count, data->endpoint_data);
874 ret = ipa_table_init(ipa);
878 ret = ipa_smp2p_init(ipa, loader == IPA_LOADER_MODEM);
887 ret = ipa_config(ipa, data);
907 ret = ipa_setup(ipa);
917 ipa_deconfig(ipa);
920 ipa_smp2p_exit(ipa);
922 ipa_table_exit(ipa);
924 ipa_endpoint_exit(ipa);
926 gsi_exit(&ipa->gsi);
928 ipa_mem_exit(ipa);
930 ipa_reg_exit(ipa);
932 kfree(ipa);
941 struct ipa *ipa = dev_get_drvdata(&pdev->dev);
942 struct ipa_power *power = ipa->power;
949 ipa_smp2p_irq_disable_setup(ipa);
955 if (ipa->setup_complete) {
956 ret = ipa_modem_stop(ipa);
960 ret = ipa_modem_stop(ipa);
965 ipa_teardown(ipa);
968 ipa_deconfig(ipa);
971 ipa_smp2p_exit(ipa);
972 ipa_table_exit(ipa);
973 ipa_endpoint_exit(ipa);
974 gsi_exit(&ipa->gsi);
975 ipa_mem_exit(ipa);
976 ipa_reg_exit(ipa);
977 kfree(ipa);
1007 .name = "ipa",