Loading drivers/mmc/core/quirks.c +22 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 }; Loading drivers/mmc/core/sdio.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading include/linux/mmc/card.h +12 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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)) Loading Loading
drivers/mmc/core/quirks.c +22 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 }; Loading
drivers/mmc/core/sdio.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
include/linux/mmc/card.h +12 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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)) Loading