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

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

Merge "mmc: core: Card specific custom settings for SDIO"

parents df397e20 af510f99
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -63,6 +63,23 @@
#define SDIO_DEVICE_ID_MSM_QCA_AR6004_2	0x401
#endif

#ifndef SDIO_VENDOR_ID_QCA6574
#define SDIO_VENDOR_ID_QCA6574		0x271
#endif

#ifndef SDIO_DEVICE_ID_QCA6574
#define SDIO_DEVICE_ID_QCA6574		0x50a
#endif

#ifndef SDIO_VENDOR_ID_QCA9377
#define SDIO_VENDOR_ID_QCA9377		0x271
#endif

#ifndef SDIO_DEVICE_ID_QCA9377
#define SDIO_DEVICE_ID_QCA9377		0x701
#endif


/*
 * This hook just adds a quirk for all sdio devices
 */
@@ -109,6 +126,11 @@ static const struct mmc_fixup mmc_fixup_methods[] = {
	SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_F0,
		   add_quirk, MMC_QUIRK_BROKEN_IRQ_POLLING),

	SDIO_FIXUP(SDIO_VENDOR_ID_QCA6574, SDIO_DEVICE_ID_QCA6574,
		   add_quirk, MMC_QUIRK_QCA6574_SETTINGS),

	SDIO_FIXUP(SDIO_VENDOR_ID_QCA9377, SDIO_DEVICE_ID_QCA9377,
		add_quirk, MMC_QUIRK_QCA9377_SETTINGS),
	END_FIXUP
};

+51 −0
Original line number Diff line number Diff line
@@ -222,6 +222,54 @@ out:
	return ret;
}

static void sdio_enable_vendor_specific_settings(struct mmc_card *card)
{
	int ret;
	u8 settings;

	if (mmc_enable_qca6574_settings(card) ||
		mmc_enable_qca9377_settings(card)) {
		ret = mmc_io_rw_direct(card, 1, 0, 0xF2, 0x0F, NULL);
		if (ret) {
			pr_crit("%s: failed to write to fn 0xf2 %d\n",
					mmc_hostname(card->host), ret);
			goto out;
		}

		ret = mmc_io_rw_direct(card, 0, 0, 0xF1, 0, &settings);
		if (ret) {
			pr_crit("%s: failed to read fn 0xf1 %d\n",
					mmc_hostname(card->host), ret);
			goto out;
		}

		settings |= 0x80;
		ret = mmc_io_rw_direct(card, 1, 0, 0xF1, settings, NULL);
		if (ret) {
			pr_crit("%s: failed to write to fn 0xf1 %d\n",
					mmc_hostname(card->host), ret);
			goto out;
		}

		ret = mmc_io_rw_direct(card, 0, 0, 0xF0, 0, &settings);
		if (ret) {
			pr_crit("%s: failed to read fn 0xf0 %d\n",
					mmc_hostname(card->host), ret);
			goto out;
		}

		settings |= 0x20;
		ret = mmc_io_rw_direct(card, 1, 0, 0xF0, settings, NULL);
		if (ret) {
			pr_crit("%s: failed to write to fn 0xf0 %d\n",
					mmc_hostname(card->host), ret);
			goto out;
		}
	}
out:
	return;
}

static int sdio_enable_wide(struct mmc_card *card)
{
	int ret;
@@ -545,6 +593,9 @@ static int sdio_set_bus_speed_mode(struct mmc_card *card)
	if (err)
		return err;

	/* Vendor specific settings based on card quirks */
	sdio_enable_vendor_specific_settings(card);

	speed &= ~SDIO_SPEED_BSS_MASK;
	speed |= bus_speed;
	err = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_SPEED, speed, NULL);
+12 −0
Original line number Diff line number Diff line
@@ -380,6 +380,8 @@ struct mmc_card {
#define MMC_QUIRK_BROKEN_HPI (1 << 13)		/* For devices which gets */
						/* broken due to HPI feature */
#define MMC_QUIRK_CACHE_DISABLE (1 << 14)	/* prevent cache enable */
#define MMC_QUIRK_QCA6574_SETTINGS (1 << 15)	/* QCA6574 card settings*/
#define MMC_QUIRK_QCA9377_SETTINGS (1 << 16)	/* QCA9377 card settings*/

	unsigned int		erase_size;	/* erase size in sectors */
 	unsigned int		erase_shift;	/* if erase unit is power 2 */
@@ -671,6 +673,16 @@ static inline bool mmc_card_configured_auto_bkops(const struct mmc_card *c)
	return c->ext_csd.bkops_en & EXT_CSD_BKOPS_AUTO_EN;
}

static inline bool mmc_enable_qca6574_settings(const struct mmc_card *c)
{
	return c->quirks & MMC_QUIRK_QCA6574_SETTINGS;
}

static inline bool mmc_enable_qca9377_settings(const struct mmc_card *c)
{
	return c->quirks & MMC_QUIRK_QCA9377_SETTINGS;
}

#define mmc_card_name(c)	((c)->cid.prod_name)
#define mmc_card_id(c)		(dev_name(&(c)->dev))