mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
MMC highlights for 3.15:
Core: - CONFIG_MMC_UNSAFE_RESUME=y is now default behavior. - DT bindings for SDHCI UHS, eMMC HS200, high-speed DDR, at 1.8/1.2V. - Add GPIO descriptor based slot-gpio card detect API. Drivers: - dw_mmc: Refactor SOCFPGA support as a variant inside dw_mmc-pltfm.c. - mmci: Support HW busy detection on ux500. - omap: Support MMC_ERASE. - omap_hsmmc: Support MMC_PM_KEEP_POWER, MMC_PM_WAKE_SDIO_IRQ, (a)cmd23. - rtsx: Support pre-req/post-req async. - sdhci: Add support for Realtek RTS5250 controllers. - sdhci-acpi: Add support for 80860F16, fix 80860F14/SDIO card detect. - sdhci-msm: Add new driver for Qualcomm SDHCI chipset support. - sdhci-pxav3: Add support for Marvell Armada 380 and 385 SoCs. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) iQIcBAABAgAGBQJTRLHLAAoJEHNBYZ7TNxYMoqEQAOULXl1SHt0aHn5I0cfdVnRm J3i56MqarwXQOse/qJrg8/uKsggAu0ivTlQ7x1h6bpXmzHqvOtZhSoO9BqGEvxOU WNeA9ouaKMx3gCpIAwl9Odox+d2E+91nRfxU3fZTDITy554fREXmIpWiidjFPR7n 2oHT0yvGuLjunTC8MhxSB0OsggoIDXDTVPxrcf2k+AcAZAMlCMDNirN9+JbhiVM9 PNESapMyQAbFy18BGzCt5lO2o6aRileaSdX4BFTW4lx2LSPryUVV3cnfIH4zlytW joVDWyU5kAtQgfhoEhTsWJld+cwHsMUrl/FOfhMvBWbPMxLJnbFx8b459nKJDM5j NUo29KQxxHgWblGYx+F5SYuTloqWtX5iQWsez9g38Z/3UtjHR++o3+auwTFsZFRe 7EusZqsXdKggx1iiW/5afgb+tFOiCe5WOOQv29YdqWurPhaSK2Nr1aprD4RRiMeT IG9qBLhHFLl8Pv0nTdEGbJHhAhihja6w2ul+i/8JSaDOYAGFbEn47MC8JfrKAnpw WovxkSqMroMhjI+51cwJnVtdczQWx5kpjqDY0VaJlKvOfcwyOuyTU+s2vrHVDMZS a0HgaXeVxr5IcDTz2zo1f6UbM4k2z/Ka0LOOSPqyOYOpFuT6VkXhgOVq6fsRpnaN /9CUirULwF5ej0oz38hk =6S8w -----END PGP SIGNATURE----- Merge tag 'mmc-updates-for-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc Pull MMC updates from Chris Ball: "MMC highlights for 3.15: Core: - CONFIG_MMC_UNSAFE_RESUME=y is now default behavior - DT bindings for SDHCI UHS, eMMC HS200, high-speed DDR, at 1.8/1.2V - Add GPIO descriptor based slot-gpio card detect API Drivers: - dw_mmc: Refactor SOCFPGA support as a variant inside dw_mmc-pltfm.c - mmci: Support HW busy detection on ux500 - omap: Support MMC_ERASE - omap_hsmmc: Support MMC_PM_KEEP_POWER, MMC_PM_WAKE_SDIO_IRQ, (a)cmd23 - rtsx: Support pre-req/post-req async - sdhci: Add support for Realtek RTS5250 controllers - sdhci-acpi: Add support for 80860F16, fix 80860F14/SDIO card detect - sdhci-msm: Add new driver for Qualcomm SDHCI chipset support - sdhci-pxav3: Add support for Marvell Armada 380 and 385 SoCs" * tag 'mmc-updates-for-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc: (102 commits) mmc: sdhci-acpi: Intel SDIO has broken card detect mmc: sdhci-pxav3: add support for the Armada 38x SDHCI controller mmc: sdhci-msm: Add platform_execute_tuning implementation mmc: sdhci-msm: Initial support for Qualcomm chipsets mmc: sdhci-msm: Qualcomm SDHCI binding documentation sdhci: only reprogram retuning timer when flag is set mmc: rename ARCH_BCM to ARCH_BCM_MOBILE mmc: sdhci: Allow for irq being shared mmc: sdhci-acpi: Add device id 80860F16 mmc: sdhci-acpi: Fix broken card detect for ACPI HID 80860F14 mmc: slot-gpio: Add GPIO descriptor based CD GPIO API mmc: slot-gpio: Split out CD IRQ request into a separate function mmc: slot-gpio: Record GPIO descriptors instead of GPIO numbers Revert "dts: socfpga: Add support for SD/MMC on the SOCFPGA platform" mmc: sdhci-spear: use generic card detection gpio support mmc: sdhci-spear: remove support for power gpio mmc: sdhci-spear: simplify resource handling mmc: sdhci-spear: fix platform_data usage mmc: sdhci-spear: fix error handling paths for DT mmc: sdhci-bcm-kona: fix build errors when built-in ...
This commit is contained in:
commit
97e18dc007
63 changed files with 2577 additions and 1166 deletions
|
|
@ -338,58 +338,28 @@ int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
|
|||
int num_sg, bool read, int timeout)
|
||||
{
|
||||
struct completion trans_done;
|
||||
u8 dir;
|
||||
int err = 0, i, count;
|
||||
int err = 0, count;
|
||||
long timeleft;
|
||||
unsigned long flags;
|
||||
struct scatterlist *sg;
|
||||
enum dma_data_direction dma_dir;
|
||||
u32 val;
|
||||
dma_addr_t addr;
|
||||
unsigned int len;
|
||||
|
||||
dev_dbg(&(pcr->pci->dev), "--> %s: num_sg = %d\n", __func__, num_sg);
|
||||
|
||||
/* don't transfer data during abort processing */
|
||||
if (pcr->remove_pci)
|
||||
return -EINVAL;
|
||||
|
||||
if ((sglist == NULL) || (num_sg <= 0))
|
||||
return -EINVAL;
|
||||
|
||||
if (read) {
|
||||
dir = DEVICE_TO_HOST;
|
||||
dma_dir = DMA_FROM_DEVICE;
|
||||
} else {
|
||||
dir = HOST_TO_DEVICE;
|
||||
dma_dir = DMA_TO_DEVICE;
|
||||
}
|
||||
|
||||
count = dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
|
||||
count = rtsx_pci_dma_map_sg(pcr, sglist, num_sg, read);
|
||||
if (count < 1) {
|
||||
dev_err(&(pcr->pci->dev), "scatterlist map failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count);
|
||||
|
||||
val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE;
|
||||
pcr->sgi = 0;
|
||||
for_each_sg(sglist, sg, count, i) {
|
||||
addr = sg_dma_address(sg);
|
||||
len = sg_dma_len(sg);
|
||||
rtsx_pci_add_sg_tbl(pcr, addr, len, i == count - 1);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pcr->lock, flags);
|
||||
|
||||
pcr->done = &trans_done;
|
||||
pcr->trans_result = TRANS_NOT_READY;
|
||||
init_completion(&trans_done);
|
||||
rtsx_pci_writel(pcr, RTSX_HDBAR, pcr->host_sg_tbl_addr);
|
||||
rtsx_pci_writel(pcr, RTSX_HDBCTLR, val);
|
||||
|
||||
spin_unlock_irqrestore(&pcr->lock, flags);
|
||||
|
||||
rtsx_pci_dma_transfer(pcr, sglist, count, read);
|
||||
|
||||
timeleft = wait_for_completion_interruptible_timeout(
|
||||
&trans_done, msecs_to_jiffies(timeout));
|
||||
if (timeleft <= 0) {
|
||||
|
|
@ -413,7 +383,7 @@ out:
|
|||
pcr->done = NULL;
|
||||
spin_unlock_irqrestore(&pcr->lock, flags);
|
||||
|
||||
dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
|
||||
rtsx_pci_dma_unmap_sg(pcr, sglist, num_sg, read);
|
||||
|
||||
if ((err < 0) && (err != -ENODEV))
|
||||
rtsx_pci_stop_cmd(pcr);
|
||||
|
|
@ -425,6 +395,73 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data);
|
||||
|
||||
int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
|
||||
int num_sg, bool read)
|
||||
{
|
||||
enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
|
||||
|
||||
if (pcr->remove_pci)
|
||||
return -EINVAL;
|
||||
|
||||
if ((sglist == NULL) || num_sg < 1)
|
||||
return -EINVAL;
|
||||
|
||||
return dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dir);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtsx_pci_dma_map_sg);
|
||||
|
||||
int rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
|
||||
int num_sg, bool read)
|
||||
{
|
||||
enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
|
||||
|
||||
if (pcr->remove_pci)
|
||||
return -EINVAL;
|
||||
|
||||
if (sglist == NULL || num_sg < 1)
|
||||
return -EINVAL;
|
||||
|
||||
dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dir);
|
||||
return num_sg;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtsx_pci_dma_unmap_sg);
|
||||
|
||||
int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist,
|
||||
int sg_count, bool read)
|
||||
{
|
||||
struct scatterlist *sg;
|
||||
dma_addr_t addr;
|
||||
unsigned int len;
|
||||
int i;
|
||||
u32 val;
|
||||
u8 dir = read ? DEVICE_TO_HOST : HOST_TO_DEVICE;
|
||||
unsigned long flags;
|
||||
|
||||
if (pcr->remove_pci)
|
||||
return -EINVAL;
|
||||
|
||||
if ((sglist == NULL) || (sg_count < 1))
|
||||
return -EINVAL;
|
||||
|
||||
val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE;
|
||||
pcr->sgi = 0;
|
||||
for_each_sg(sglist, sg, sg_count, i) {
|
||||
addr = sg_dma_address(sg);
|
||||
len = sg_dma_len(sg);
|
||||
rtsx_pci_add_sg_tbl(pcr, addr, len, i == sg_count - 1);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pcr->lock, flags);
|
||||
|
||||
rtsx_pci_writel(pcr, RTSX_HDBAR, pcr->host_sg_tbl_addr);
|
||||
rtsx_pci_writel(pcr, RTSX_HDBCTLR, val);
|
||||
|
||||
spin_unlock_irqrestore(&pcr->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtsx_pci_dma_transfer);
|
||||
|
||||
int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len)
|
||||
{
|
||||
int err;
|
||||
|
|
@ -836,6 +873,8 @@ static irqreturn_t rtsx_pci_isr(int irq, void *dev_id)
|
|||
int_reg = rtsx_pci_readl(pcr, RTSX_BIPR);
|
||||
/* Clear interrupt flag */
|
||||
rtsx_pci_writel(pcr, RTSX_BIPR, int_reg);
|
||||
dev_dbg(&pcr->pci->dev, "=========== BIPR 0x%8x ==========\n", int_reg);
|
||||
|
||||
if ((int_reg & pcr->bier) == 0) {
|
||||
spin_unlock(&pcr->lock);
|
||||
return IRQ_NONE;
|
||||
|
|
@ -866,17 +905,28 @@ static irqreturn_t rtsx_pci_isr(int irq, void *dev_id)
|
|||
}
|
||||
|
||||
if (int_reg & (NEED_COMPLETE_INT | DELINK_INT)) {
|
||||
if (int_reg & (TRANS_FAIL_INT | DELINK_INT)) {
|
||||
if (int_reg & (TRANS_FAIL_INT | DELINK_INT))
|
||||
pcr->trans_result = TRANS_RESULT_FAIL;
|
||||
if (pcr->done)
|
||||
complete(pcr->done);
|
||||
} else if (int_reg & TRANS_OK_INT) {
|
||||
else if (int_reg & TRANS_OK_INT)
|
||||
pcr->trans_result = TRANS_RESULT_OK;
|
||||
if (pcr->done)
|
||||
complete(pcr->done);
|
||||
|
||||
if (pcr->done)
|
||||
complete(pcr->done);
|
||||
|
||||
if (int_reg & SD_EXIST) {
|
||||
struct rtsx_slot *slot = &pcr->slots[RTSX_SD_CARD];
|
||||
if (slot && slot->done_transfer)
|
||||
slot->done_transfer(slot->p_dev);
|
||||
}
|
||||
|
||||
if (int_reg & MS_EXIST) {
|
||||
struct rtsx_slot *slot = &pcr->slots[RTSX_SD_CARD];
|
||||
if (slot && slot->done_transfer)
|
||||
slot->done_transfer(slot->p_dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (pcr->card_inserted || pcr->card_removed)
|
||||
schedule_delayed_work(&pcr->carddet_work,
|
||||
msecs_to_jiffies(200));
|
||||
|
|
|
|||
Loading…
Reference in a new issue