/* * 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 #include #include #include #include #include #include #include #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; }