Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c65b9585 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Add support for genoa sdio"

parents 4b981b7b e5b2b112
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ cnss2-y += bus.o
cnss2-y += debug.o
cnss2-y += pci.o
cnss2-y += usb.o
cnss2-$(CONFIG_SDIO_QCN) += sdio.o
cnss2-y += power.o
cnss2-y += qmi.o
cnss2-y += wlan_firmware_service_v01.o
+30 −9
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include "debug.h"
#include "pci.h"
#include "usb.h"
#include "sdio.h"

enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
{
@@ -27,6 +28,8 @@ enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
		return CNSS_BUS_PCI;
	else if (memcmp(dev->bus->name, "usb", 3) == 0)
		return CNSS_BUS_USB;
	else if (memcmp(dev->bus->name, "sdio", 4) == 0)
		return CNSS_BUS_SDIO;
	else
		return CNSS_BUS_NONE;
}
@@ -44,20 +47,14 @@ enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id)
	case QCN7605_VER20_STANDALONE_DEVICE_ID:
	case QCN7605_VER20_COMPOSITE_DEVICE_ID:
		return CNSS_BUS_USB;
	case QCN7605_SDIO_DEVICE_ID:
		return CNSS_BUS_SDIO;
	default:
		cnss_pr_err("Unknown device_id: 0x%lx\n", device_id);
		return CNSS_BUS_NONE;
	}
}

bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv)
{
	if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB)
		return false;
	else
		return true;
}

void *cnss_bus_dev_to_bus_priv(struct device *dev)
{
	if (!dev)
@@ -89,6 +86,8 @@ struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev)
		return cnss_pci_priv_to_plat_priv(bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_priv_to_plat_priv(bus_priv);
	case CNSS_BUS_SDIO:
		return cnss_get_plat_priv(NULL);
	default:
		return NULL;
	}
@@ -104,6 +103,8 @@ int cnss_bus_init(struct cnss_plat_data *plat_priv)
		return cnss_pci_init(plat_priv);
	case CNSS_BUS_USB:
		return cnss_usb_init(plat_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_init(plat_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -119,13 +120,18 @@ void cnss_bus_deinit(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		cnss_pci_deinit(plat_priv);
		break;
	case CNSS_BUS_USB:
		cnss_usb_deinit(plat_priv);
		break;
	case CNSS_BUS_SDIO:
		cnss_sdio_deinit(plat_priv);
		break;
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
		return;
	}
	return;
}

int cnss_bus_load_m3(struct cnss_plat_data *plat_priv)
@@ -200,6 +206,8 @@ void cnss_bus_fw_boot_timeout_hdlr(unsigned long data)
		return cnss_pci_fw_boot_timeout_hdlr(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_fw_boot_timeout_hdlr(plat_priv->bus_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_fw_boot_timeout_hdlr(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -240,6 +248,8 @@ int cnss_bus_call_driver_probe(struct cnss_plat_data *plat_priv)
		return cnss_pci_call_driver_probe(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_call_driver_probe(plat_priv->bus_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_call_driver_probe(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -257,6 +267,8 @@ int cnss_bus_call_driver_remove(struct cnss_plat_data *plat_priv)
		return cnss_pci_call_driver_remove(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_call_driver_remove(plat_priv->bus_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_call_driver_remove(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -274,6 +286,8 @@ int cnss_bus_dev_powerup(struct cnss_plat_data *plat_priv)
		return cnss_pci_dev_powerup(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_dev_powerup(plat_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_dev_powerup(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -291,6 +305,8 @@ int cnss_bus_dev_shutdown(struct cnss_plat_data *plat_priv)
		return cnss_pci_dev_shutdown(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return 0;
	case CNSS_BUS_SDIO:
		return cnss_sdio_dev_shutdown(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -338,6 +354,9 @@ int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data)
		return cnss_pci_register_driver_hdlr(plat_priv->bus_priv, data);
	case CNSS_BUS_USB:
		return cnss_usb_register_driver_hdlr(plat_priv->bus_priv, data);
	case CNSS_BUS_SDIO:
		return cnss_sdio_register_driver_hdlr(plat_priv->bus_priv,
						      data);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -355,6 +374,8 @@ int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv)
		return cnss_pci_unregister_driver_hdlr(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_unregister_driver_hdlr(plat_priv->bus_priv);
	case CNSS_BUS_SDIO:
		return cnss_sdio_unregister_driver_hdlr(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
+2 −1
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@
#define QCA6290_EMULATION_DEVICE_ID	0xABCD
#define QCN7605_VENDOR_ID		0x17CB
#define QCN7605_DEVICE_ID		0x1102
#define QCN7605_SDIO_VENDOR_ID		0x70
#define QCN7605_SDIO_DEVICE_ID		0x400B

#define QCN7605_USB_VENDOR_ID             0x05C6
#define QCN7605_COMPOSITE_DEVICE_ID     QCN7605_COMPOSITE_PRODUCT_ID
@@ -62,5 +64,4 @@ int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv);
int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
				      int modem_current_status);
int cnss_bus_recovery_update_status(struct cnss_plat_data *plat_priv);
bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv);
#endif /* _CNSS_BUS_H */
+32 −6
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ int cnss_wlan_enable(struct device *dev,
		     enum cnss_driver_mode mode,
		     const char *host_version)
{
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL);
	struct wlfw_wlan_cfg_req_msg_v01 req;
	u32 i, ce_id, num_vectors, user_base_data, base_vector;
	int ret = 0;
@@ -293,7 +293,8 @@ int cnss_wlan_enable(struct device *dev,
	if (qmi_bypass)
		return 0;

	if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB)
	if (plat_priv->bus_type == CNSS_BUS_USB ||
	    plat_priv->bus_type == CNSS_BUS_SDIO)
		goto skip_cfg;

	if (!config || !host_version) {
@@ -398,7 +399,7 @@ EXPORT_SYMBOL(cnss_wlan_enable);

int cnss_wlan_disable(struct device *dev, enum cnss_driver_mode mode)
{
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(NULL);

	if (plat_priv->device_id == QCA6174_DEVICE_ID)
		return 0;
@@ -1288,7 +1289,8 @@ static int cnss_wlfw_server_arrive_hdlr(struct cnss_plat_data *plat_priv)
	if (ret)
		goto out;

	if (!cnss_bus_req_mem_ind_valid(plat_priv)) {
	if (plat_priv->bus_type == CNSS_BUS_USB ||
	    plat_priv->bus_type == CNSS_BUS_SDIO) {
		ret = cnss_wlfw_tgt_cap_send_sync(plat_priv);
		if (ret)
			goto out;
@@ -1308,7 +1310,7 @@ static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv)
	if (test_bit(CNSS_DEV_REMOVED, &plat_priv->driver_state))
		pwr_up_reqd = true;

	if (pwr_up_reqd || plat_priv->bus_type != CNSS_BUS_USB)
	if (pwr_up_reqd || plat_priv->bus_type == CNSS_BUS_PCI)
		ret = cnss_bus_dev_powerup(plat_priv);

	if (ret)
@@ -1467,6 +1469,7 @@ int cnss_register_subsys(struct cnss_plat_data *plat_priv)
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_VER20_STANDALONE_DEVICE_ID:
	case QCN7605_VER20_COMPOSITE_DEVICE_ID:
	case QCN7605_SDIO_DEVICE_ID:
		subsys_info->subsys_desc.name = "QCN7605";
		break;
	default:
@@ -1803,6 +1806,18 @@ static ssize_t cnss_fs_ready_store(struct device *dev,
	return count;
}

#ifdef CONFIG_SDIO_QCN
static void cnss_set_card_state(bool state)
{
	qcn_sdio_card_state(state);
}
#else
static void cnss_set_card_state(bool state)
{
	/* no op */
}
#endif

static DEVICE_ATTR(fs_ready, 0220, NULL, cnss_fs_ready_store);

static ssize_t cnss_wl_pwr_on(struct device *dev,
@@ -1823,12 +1838,14 @@ static ssize_t cnss_wl_pwr_on(struct device *dev,
	timeout = cnss_get_qmi_timeout();
	if (pwr_state) {
		cnss_power_on_device(plat_priv);
		cnss_set_card_state(true);
		if (timeout) {
			mod_timer(&plat_priv->fw_boot_timer,
				  jiffies + msecs_to_jiffies(timeout));
		}
	} else {
		cnss_power_off_device(plat_priv);
		cnss_set_card_state(false);
		del_timer(&plat_priv->fw_boot_timer);
	}
	return count;
@@ -1921,6 +1938,7 @@ static const struct platform_device_id cnss_platform_id_table[] = {
	{ .name = "qca6174", .driver_data = QCA6174_DEVICE_ID, },
	{ .name = "qca6290", .driver_data = QCA6290_DEVICE_ID, },
	{ .name = "qcn7605", .driver_data = QCN7605_DEVICE_ID, },
	{ .name = "qcn7605_sdio", .driver_data = QCN7605_SDIO_DEVICE_ID, },
};

static const struct of_device_id cnss_of_match_table[] = {
@@ -1930,6 +1948,12 @@ static const struct of_device_id cnss_of_match_table[] = {
	{
		.compatible = "qcom,cnss-qca6290",
		.data = (void *)&cnss_platform_id_table[1]},
	{
		.compatible = "qcom,cnss",
		.data = (void *)&cnss_platform_id_table[2]},
	{
		.compatible = "qcom,cnss-sdio",
		.data = (void *)&cnss_platform_id_table[3]},
	{ },
};
MODULE_DEVICE_TABLE(of, cnss_of_match_table);
@@ -1980,7 +2004,9 @@ static int cnss_probe(struct platform_device *plat_dev)
			goto free_res;

		ret = cnss_bus_init(plat_priv);
		if (ret)
		if (ret == -EPROBE_DEFER)
			goto free_res;
		else if (ret)
			goto power_off;
	}

+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ enum cnss_dev_bus_type {
	CNSS_BUS_NONE = -1,
	CNSS_BUS_PCI,
	CNSS_BUS_USB,
	CNSS_BUS_SDIO,
};

struct cnss_vreg_info {
Loading