提交 da7806f9 编写于 作者: L Linus Torvalds

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
...@@ -69,6 +69,8 @@ void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd) ...@@ -69,6 +69,8 @@ void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd)
writel(DMOV_CONFIG_IRQ_EN, DMOV_CONFIG(id)); writel(DMOV_CONFIG_IRQ_EN, DMOV_CONFIG(id));
} }
#endif #endif
if (cmd->execute_func)
cmd->execute_func(cmd);
PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status); PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status);
list_add_tail(&cmd->list, &active_commands[id]); list_add_tail(&cmd->list, &active_commands[id]);
if (!channel_active) if (!channel_active)
...@@ -116,6 +118,7 @@ int msm_dmov_exec_cmd(unsigned id, unsigned int cmdptr) ...@@ -116,6 +118,7 @@ int msm_dmov_exec_cmd(unsigned id, unsigned int cmdptr)
cmd.dmov_cmd.cmdptr = cmdptr; cmd.dmov_cmd.cmdptr = cmdptr;
cmd.dmov_cmd.complete_func = dmov_exec_cmdptr_complete_func; cmd.dmov_cmd.complete_func = dmov_exec_cmdptr_complete_func;
cmd.dmov_cmd.execute_func = NULL;
cmd.id = id; cmd.id = id;
init_completion(&cmd.complete); init_completion(&cmd.complete);
...@@ -221,6 +224,8 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id) ...@@ -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); cmd = list_entry(ready_commands[id].next, typeof(*cmd), list);
list_del(&cmd->list); list_del(&cmd->list);
list_add_tail(&cmd->list, &active_commands[id]); 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); PRINT_FLOW("msm_datamover_irq_handler id %d, start command\n", id);
writel(cmd->cmdptr, DMOV_CMD_PTR(id)); writel(cmd->cmdptr, DMOV_CMD_PTR(id));
} }
......
...@@ -28,6 +28,8 @@ struct msm_dmov_cmd { ...@@ -28,6 +28,8 @@ struct msm_dmov_cmd {
void (*complete_func)(struct msm_dmov_cmd *cmd, void (*complete_func)(struct msm_dmov_cmd *cmd,
unsigned int result, unsigned int result,
struct msm_dmov_errdata *err); 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); void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd);
......
此差异已折叠。
...@@ -171,6 +171,7 @@ struct msmsdcc_dma_data { ...@@ -171,6 +171,7 @@ struct msmsdcc_dma_data {
int channel; int channel;
struct msmsdcc_host *host; struct msmsdcc_host *host;
int busy; /* Set if DM is busy */ int busy; /* Set if DM is busy */
int active;
}; };
struct msmsdcc_pio_data { struct msmsdcc_pio_data {
...@@ -213,7 +214,7 @@ struct msmsdcc_host { ...@@ -213,7 +214,7 @@ struct msmsdcc_host {
struct clk *clk; /* main MMC bus clock */ struct clk *clk; /* main MMC bus clock */
struct clk *pclk; /* SDCC peripheral bus clock */ struct clk *pclk; /* SDCC peripheral bus clock */
unsigned int clks_on; /* set if clocks are enabled */ unsigned int clks_on; /* set if clocks are enabled */
struct timer_list command_timer; struct timer_list busclk_timer;
unsigned int eject; /* eject state */ unsigned int eject; /* eject state */
...@@ -233,6 +234,18 @@ struct msmsdcc_host { ...@@ -233,6 +234,18 @@ struct msmsdcc_host {
struct msmsdcc_pio_data pio; struct msmsdcc_pio_data pio;
int cmdpoll; int cmdpoll;
struct msmsdcc_stats stats; 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 #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册