lin
2025-08-21 57113df3a0e2be01232281fad9a5f2c060567981
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Copyright (C) 2021 Seekwave Tech Inc.
 *
 * Filename : skw_sdio_host.c
 * Abstract : This file is a implementation for Seekwave sdio  function
 *
 * Authors    :skw BSP team
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */
 
#include <linux/delay.h>
#include <linux/version.h>
#include <linux/mmc/card.h>
#include <linux/mmc/core.h>
#include <linux/mmc/host.h>
#include <linux/mmc/sdio.h>
#include <linux/mmc/sdio_func.h>
#include <linux/printk.h>
#include "skw_sdio.h"
#include "skw_sdio_log.h"
#include "skw_sdio_host.h"
#include "../skwutil/boot_config.h"
//#define CONFIG_SKW_HOST_PLATFORM_FULLHAN
 
extern int sdio_reset_comm(struct mmc_card *card);
int skw_sdio_mmc_scan(int sd_id)
{
   int ret = 0;
   pr_info("%s:[%d]\n", __func__, sd_id);
#if defined(CONFIG_SKW_HOST_PLATFORM_AMLOGIC)
   //如果定义了CONFIG_SKW_HOST_PLATFORM_AMLOGIC,则调用extern_wifi_set_enable(1)函数
   extern_wifi_set_enable(1);
#elif defined(CONFIG_SKW_HOST_PLATFORM_FULLHAN)
   pr_info("%s:[mmc%d:card init]\n", __func__, sd_id);
   fh_sdio_card_scan(sd_id); //fullhan sdio card scan
#elif defined(CONFIG_SKW_HOST_PLATFORM_ALLWINER)
   sunxi_wlan_set_power(1);
   msleep(100);
   sunxi_mmc_rescan_card(1); //allwiner sdio card rescan
#elif defined(CONFIG_SKW_HOST_PLATFORM_ROCKCHIP)
   rockchip_wifi_power(1);
   msleep(150);
   rockchip_wifi_set_carddetect(1);
#else
   pr_info("%s: no need skw self scan!!\n", __func__);
#endif
   pr_info("%s:[-]\n", __func__);
   return ret;
}
 
int skw_sdio_mmc_rescan(int sd_id)
{
   int ret = 0;
#if defined(CONFIG_SKW_HOST_PLATFORM_AMLOGIC)
   //如果定义了CONFIG_SKW_HOST_PLATFORM_AMLOGIC,则调用extern_wifi_set_enable(1)函数
   //extern_wifi_set_enable(1);
#elif defined(CONFIG_SKW_HOST_PLATFORM_FULLHAN)
   skw_chip_power_reset();
   fh_sdio_card_scan(sd_id); //fullhan sdio card scan
#elif defined(CONFIG_SKW_HOST_PLATFORM_ALLWINER)
   skw_chip_power_reset();
   msleep(100);
   sunxi_mmc_rescan_card(1); //allwiner sdio card rescan
#elif defined(CONFIG_SKW_HOST_PLATFORM_ROCKCHIP)
   rockchip_wifi_set_carddetect(0);
   msleep(150);
   skw_chip_power_reset();
   msleep(150);
   rockchip_wifi_set_carddetect(1);
#else
   struct skw_sdio_data_t *skw_sdio = skw_sdio_get_data();
   if (skw_sdio) {
#if (KERNEL_VERSION(4, 18, 0) <= LINUX_VERSION_CODE &&                         \
     LINUX_VERSION_CODE <= KERNEL_VERSION(5, 18, 19))
       if (skw_sdio->sdio_dev_host) {
           sdio_claim_host(skw_sdio->sdio_func[FUNC_1]);
           skw_chip_power_reset();
           msleep(100);
           ret = mmc_sw_reset(skw_sdio->sdio_dev_host);
           sdio_release_host(skw_sdio->sdio_func[FUNC_1]);
       } else {
           return -EINVAL;
       }
#elif (KERNEL_VERSION(5, 19, 0) <= LINUX_VERSION_CODE)
       if (skw_sdio->sdio_dev_host && skw_sdio->sdio_dev_host->card) {
           sdio_claim_host(skw_sdio->sdio_func[FUNC_1]);
           skw_chip_power_reset();
           msleep(100);
           ret = mmc_sw_reset(skw_sdio->sdio_dev_host->card);
           sdio_release_host(skw_sdio->sdio_func[FUNC_1]);
       } else {
           return -EINVAL;
       }
#else
       if (skw_sdio->sdio_dev_host && skw_sdio->sdio_dev_host->card) {
           sdio_claim_host(skw_sdio->sdio_func[FUNC_1]);
           skw_chip_power_reset();
           msleep(100);
           ret = mmc_hw_reset((skw_sdio->sdio_dev_host));
           //ret = sdio_reset_comm((skw_sdio->sdio_dev_host->card));
           sdio_release_host(skw_sdio->sdio_func[FUNC_1]);
       } else {
           return -EINVAL;
       }
#endif
   } else {
       skw_sdio_warn("sdio_dev_host is null\n");
   }
#endif
   skw_sdio_info("[-]");
   return ret;
}