struct spi_imx_devtype_data {
        void (*intctrl)(struct spi_imx_data *, int);
+       int (*prepare_message)(struct spi_imx_data *, struct spi_message *);
        int (*config)(struct spi_device *);
        void (*trigger)(struct spi_imx_data *);
        int (*rx_available)(struct spi_imx_data *);
        writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
 }
 
+static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
+                                     struct spi_message *msg)
+{
+       return 0;
+}
+
 static int mx51_ecspi_config(struct spi_device *spi)
 {
        struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
        writel(reg, spi_imx->base + MXC_CSPICTRL);
 }
 
+static int mx31_prepare_message(struct spi_imx_data *spi_imx,
+                               struct spi_message *msg)
+{
+       return 0;
+}
+
 static int mx31_config(struct spi_device *spi)
 {
        struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
        writel(reg, spi_imx->base + MXC_CSPICTRL);
 }
 
+static int mx21_prepare_message(struct spi_imx_data *spi_imx,
+                               struct spi_message *msg)
+{
+       return 0;
+}
+
 static int mx21_config(struct spi_device *spi)
 {
        struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
        writel(reg, spi_imx->base + MXC_CSPICTRL);
 }
 
+static int mx1_prepare_message(struct spi_imx_data *spi_imx,
+                              struct spi_message *msg)
+{
+       return 0;
+}
+
 static int mx1_config(struct spi_device *spi)
 {
        struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
 
 static struct spi_imx_devtype_data imx1_cspi_devtype_data = {
        .intctrl = mx1_intctrl,
+       .prepare_message = mx1_prepare_message,
        .config = mx1_config,
        .trigger = mx1_trigger,
        .rx_available = mx1_rx_available,
 
 static struct spi_imx_devtype_data imx21_cspi_devtype_data = {
        .intctrl = mx21_intctrl,
+       .prepare_message = mx21_prepare_message,
        .config = mx21_config,
        .trigger = mx21_trigger,
        .rx_available = mx21_rx_available,
 static struct spi_imx_devtype_data imx27_cspi_devtype_data = {
        /* i.mx27 cspi shares the functions with i.mx21 one */
        .intctrl = mx21_intctrl,
+       .prepare_message = mx21_prepare_message,
        .config = mx21_config,
        .trigger = mx21_trigger,
        .rx_available = mx21_rx_available,
 
 static struct spi_imx_devtype_data imx31_cspi_devtype_data = {
        .intctrl = mx31_intctrl,
+       .prepare_message = mx31_prepare_message,
        .config = mx31_config,
        .trigger = mx31_trigger,
        .rx_available = mx31_rx_available,
 static struct spi_imx_devtype_data imx35_cspi_devtype_data = {
        /* i.mx35 and later cspi shares the functions with i.mx31 one */
        .intctrl = mx31_intctrl,
+       .prepare_message = mx31_prepare_message,
        .config = mx31_config,
        .trigger = mx31_trigger,
        .rx_available = mx31_rx_available,
 
 static struct spi_imx_devtype_data imx51_ecspi_devtype_data = {
        .intctrl = mx51_ecspi_intctrl,
+       .prepare_message = mx51_ecspi_prepare_message,
        .config = mx51_ecspi_config,
        .trigger = mx51_ecspi_trigger,
        .rx_available = mx51_ecspi_rx_available,
 
 static struct spi_imx_devtype_data imx53_ecspi_devtype_data = {
        .intctrl = mx51_ecspi_intctrl,
+       .prepare_message = mx51_ecspi_prepare_message,
        .config = mx51_ecspi_config,
        .trigger = mx51_ecspi_trigger,
        .rx_available = mx51_ecspi_rx_available,
                return ret;
        }
 
-       return 0;
+       ret = spi_imx->devtype_data->prepare_message(spi_imx, msg);
+       if (ret) {
+               clk_disable(spi_imx->clk_ipg);
+               clk_disable(spi_imx->clk_per);
+       }
+
+       return ret;
 }
 
 static int