You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'msm-mmc_sdcc' of git://codeaurora.org/quic/kernel/dwalker/linux-msm
* 'msm-mmc_sdcc' of git://codeaurora.org/quic/kernel/dwalker/linux-msm: drivers: mmc: msm_sdcc: Add EMBEDDED_SDIO support mmc: msm_sdcc: Fix issue where clocks could be disabled mid transaction mmc: msm_sdcc: Fix the dma exec function to use the proper delays mmc: msm_sdcc: Don't set host->curr.mrq until after we're sure the busclk timer won't fire mmc: msm_sdcc: Enable busclk idle timer for power savings mmc: msm_sdcc: Don't disable interrupts while suspending mmc: msm_sdcc: Fix issue where we might not end a sucessfull request mmc: msm_sdcc: Featurize busclock power save and disable it by default mmc: msm_sdcc: Fix bug where busclk expiry timer was not properly disabled mmc: msm_sdcc: Reduce command timeouts and improve reliability. mmc: msm_sdcc: Schedule clock disable after probe mmc: msm_sdcc: Wrap readl/writel calls with appropriate clk delays mmc: msm_sdcc: Driver clocking/irq improvements msm: Add 'execute' datamover callback mmc: msm_sdcc: Snoop SDIO_CCCR_ABORT register mmc: msm_sdcc: Clean up clock management and add a 10us delay after enabling clocks
This commit is contained in:
@@ -69,6 +69,8 @@ void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd)
|
||||
writel(DMOV_CONFIG_IRQ_EN, DMOV_CONFIG(id));
|
||||
}
|
||||
#endif
|
||||
if (cmd->execute_func)
|
||||
cmd->execute_func(cmd);
|
||||
PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status);
|
||||
list_add_tail(&cmd->list, &active_commands[id]);
|
||||
if (!channel_active)
|
||||
@@ -116,6 +118,7 @@ int msm_dmov_exec_cmd(unsigned id, unsigned int cmdptr)
|
||||
|
||||
cmd.dmov_cmd.cmdptr = cmdptr;
|
||||
cmd.dmov_cmd.complete_func = dmov_exec_cmdptr_complete_func;
|
||||
cmd.dmov_cmd.execute_func = NULL;
|
||||
cmd.id = id;
|
||||
init_completion(&cmd.complete);
|
||||
|
||||
@@ -221,6 +224,8 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
|
||||
cmd = list_entry(ready_commands[id].next, typeof(*cmd), list);
|
||||
list_del(&cmd->list);
|
||||
list_add_tail(&cmd->list, &active_commands[id]);
|
||||
if (cmd->execute_func)
|
||||
cmd->execute_func(cmd);
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, start command\n", id);
|
||||
writel(cmd->cmdptr, DMOV_CMD_PTR(id));
|
||||
}
|
||||
|
||||
@@ -28,6 +28,8 @@ struct msm_dmov_cmd {
|
||||
void (*complete_func)(struct msm_dmov_cmd *cmd,
|
||||
unsigned int result,
|
||||
struct msm_dmov_errdata *err);
|
||||
void (*execute_func)(struct msm_dmov_cmd *cmd);
|
||||
void *data;
|
||||
};
|
||||
|
||||
void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd);
|
||||
|
||||
+287
-185
File diff suppressed because it is too large
Load Diff
@@ -171,6 +171,7 @@ struct msmsdcc_dma_data {
|
||||
int channel;
|
||||
struct msmsdcc_host *host;
|
||||
int busy; /* Set if DM is busy */
|
||||
int active;
|
||||
};
|
||||
|
||||
struct msmsdcc_pio_data {
|
||||
@@ -213,7 +214,7 @@ struct msmsdcc_host {
|
||||
struct clk *clk; /* main MMC bus clock */
|
||||
struct clk *pclk; /* SDCC peripheral bus clock */
|
||||
unsigned int clks_on; /* set if clocks are enabled */
|
||||
struct timer_list command_timer;
|
||||
struct timer_list busclk_timer;
|
||||
|
||||
unsigned int eject; /* eject state */
|
||||
|
||||
@@ -233,6 +234,18 @@ struct msmsdcc_host {
|
||||
struct msmsdcc_pio_data pio;
|
||||
int cmdpoll;
|
||||
struct msmsdcc_stats stats;
|
||||
|
||||
#ifdef CONFIG_MMC_MSM7X00A_RESUME_IN_WQ
|
||||
struct work_struct resume_task;
|
||||
#endif
|
||||
|
||||
/* Command parameters */
|
||||
unsigned int cmd_timeout;
|
||||
unsigned int cmd_pio_irqmask;
|
||||
unsigned int cmd_datactrl;
|
||||
struct mmc_command *cmd_cmd;
|
||||
u32 cmd_c;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user