diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index dd1ce12aa386..c7db42d6b3bc 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
@@ -59,6 +59,7 @@ struct spi_imx_data; | |||
59 | 59 | ||
60 | struct spi_imx_devtype_data { | 60 | struct spi_imx_devtype_data { |
61 | void (*intctrl)(struct spi_imx_data *, int); | 61 | void (*intctrl)(struct spi_imx_data *, int); |
62 | int (*prepare_message)(struct spi_imx_data *, struct spi_message *); | ||
62 | int (*config)(struct spi_device *); | 63 | int (*config)(struct spi_device *); |
63 | void (*trigger)(struct spi_imx_data *); | 64 | void (*trigger)(struct spi_imx_data *); |
64 | int (*rx_available)(struct spi_imx_data *); | 65 | int (*rx_available)(struct spi_imx_data *); |
@@ -486,6 +487,12 @@ static void mx51_ecspi_disable(struct spi_imx_data *spi_imx) | |||
486 | writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); | 487 | writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); |
487 | } | 488 | } |
488 | 489 | ||
490 | static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx, | ||
491 | struct spi_message *msg) | ||
492 | { | ||
493 | return 0; | ||
494 | } | ||
495 | |||
489 | static int mx51_ecspi_config(struct spi_device *spi) | 496 | static int mx51_ecspi_config(struct spi_device *spi) |
490 | { | 497 | { |
491 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 498 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
@@ -659,6 +666,12 @@ static void mx31_trigger(struct spi_imx_data *spi_imx) | |||
659 | writel(reg, spi_imx->base + MXC_CSPICTRL); | 666 | writel(reg, spi_imx->base + MXC_CSPICTRL); |
660 | } | 667 | } |
661 | 668 | ||
669 | static int mx31_prepare_message(struct spi_imx_data *spi_imx, | ||
670 | struct spi_message *msg) | ||
671 | { | ||
672 | return 0; | ||
673 | } | ||
674 | |||
662 | static int mx31_config(struct spi_device *spi) | 675 | static int mx31_config(struct spi_device *spi) |
663 | { | 676 | { |
664 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 677 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
@@ -755,6 +768,12 @@ static void mx21_trigger(struct spi_imx_data *spi_imx) | |||
755 | writel(reg, spi_imx->base + MXC_CSPICTRL); | 768 | writel(reg, spi_imx->base + MXC_CSPICTRL); |
756 | } | 769 | } |
757 | 770 | ||
771 | static int mx21_prepare_message(struct spi_imx_data *spi_imx, | ||
772 | struct spi_message *msg) | ||
773 | { | ||
774 | return 0; | ||
775 | } | ||
776 | |||
758 | static int mx21_config(struct spi_device *spi) | 777 | static int mx21_config(struct spi_device *spi) |
759 | { | 778 | { |
760 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 779 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
@@ -824,6 +843,12 @@ static void mx1_trigger(struct spi_imx_data *spi_imx) | |||
824 | writel(reg, spi_imx->base + MXC_CSPICTRL); | 843 | writel(reg, spi_imx->base + MXC_CSPICTRL); |
825 | } | 844 | } |
826 | 845 | ||
846 | static int mx1_prepare_message(struct spi_imx_data *spi_imx, | ||
847 | struct spi_message *msg) | ||
848 | { | ||
849 | return 0; | ||
850 | } | ||
851 | |||
827 | static int mx1_config(struct spi_device *spi) | 852 | static int mx1_config(struct spi_device *spi) |
828 | { | 853 | { |
829 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 854 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
@@ -858,6 +883,7 @@ static void mx1_reset(struct spi_imx_data *spi_imx) | |||
858 | 883 | ||
859 | static struct spi_imx_devtype_data imx1_cspi_devtype_data = { | 884 | static struct spi_imx_devtype_data imx1_cspi_devtype_data = { |
860 | .intctrl = mx1_intctrl, | 885 | .intctrl = mx1_intctrl, |
886 | .prepare_message = mx1_prepare_message, | ||
861 | .config = mx1_config, | 887 | .config = mx1_config, |
862 | .trigger = mx1_trigger, | 888 | .trigger = mx1_trigger, |
863 | .rx_available = mx1_rx_available, | 889 | .rx_available = mx1_rx_available, |
@@ -871,6 +897,7 @@ static struct spi_imx_devtype_data imx1_cspi_devtype_data = { | |||
871 | 897 | ||
872 | static struct spi_imx_devtype_data imx21_cspi_devtype_data = { | 898 | static struct spi_imx_devtype_data imx21_cspi_devtype_data = { |
873 | .intctrl = mx21_intctrl, | 899 | .intctrl = mx21_intctrl, |
900 | .prepare_message = mx21_prepare_message, | ||
874 | .config = mx21_config, | 901 | .config = mx21_config, |
875 | .trigger = mx21_trigger, | 902 | .trigger = mx21_trigger, |
876 | .rx_available = mx21_rx_available, | 903 | .rx_available = mx21_rx_available, |
@@ -885,6 +912,7 @@ static struct spi_imx_devtype_data imx21_cspi_devtype_data = { | |||
885 | static struct spi_imx_devtype_data imx27_cspi_devtype_data = { | 912 | static struct spi_imx_devtype_data imx27_cspi_devtype_data = { |
886 | /* i.mx27 cspi shares the functions with i.mx21 one */ | 913 | /* i.mx27 cspi shares the functions with i.mx21 one */ |
887 | .intctrl = mx21_intctrl, | 914 | .intctrl = mx21_intctrl, |
915 | .prepare_message = mx21_prepare_message, | ||
888 | .config = mx21_config, | 916 | .config = mx21_config, |
889 | .trigger = mx21_trigger, | 917 | .trigger = mx21_trigger, |
890 | .rx_available = mx21_rx_available, | 918 | .rx_available = mx21_rx_available, |
@@ -898,6 +926,7 @@ static struct spi_imx_devtype_data imx27_cspi_devtype_data = { | |||
898 | 926 | ||
899 | static struct spi_imx_devtype_data imx31_cspi_devtype_data = { | 927 | static struct spi_imx_devtype_data imx31_cspi_devtype_data = { |
900 | .intctrl = mx31_intctrl, | 928 | .intctrl = mx31_intctrl, |
929 | .prepare_message = mx31_prepare_message, | ||
901 | .config = mx31_config, | 930 | .config = mx31_config, |
902 | .trigger = mx31_trigger, | 931 | .trigger = mx31_trigger, |
903 | .rx_available = mx31_rx_available, | 932 | .rx_available = mx31_rx_available, |
@@ -912,6 +941,7 @@ static struct spi_imx_devtype_data imx31_cspi_devtype_data = { | |||
912 | static struct spi_imx_devtype_data imx35_cspi_devtype_data = { | 941 | static struct spi_imx_devtype_data imx35_cspi_devtype_data = { |
913 | /* i.mx35 and later cspi shares the functions with i.mx31 one */ | 942 | /* i.mx35 and later cspi shares the functions with i.mx31 one */ |
914 | .intctrl = mx31_intctrl, | 943 | .intctrl = mx31_intctrl, |
944 | .prepare_message = mx31_prepare_message, | ||
915 | .config = mx31_config, | 945 | .config = mx31_config, |
916 | .trigger = mx31_trigger, | 946 | .trigger = mx31_trigger, |
917 | .rx_available = mx31_rx_available, | 947 | .rx_available = mx31_rx_available, |
@@ -925,6 +955,7 @@ static struct spi_imx_devtype_data imx35_cspi_devtype_data = { | |||
925 | 955 | ||
926 | static struct spi_imx_devtype_data imx51_ecspi_devtype_data = { | 956 | static struct spi_imx_devtype_data imx51_ecspi_devtype_data = { |
927 | .intctrl = mx51_ecspi_intctrl, | 957 | .intctrl = mx51_ecspi_intctrl, |
958 | .prepare_message = mx51_ecspi_prepare_message, | ||
928 | .config = mx51_ecspi_config, | 959 | .config = mx51_ecspi_config, |
929 | .trigger = mx51_ecspi_trigger, | 960 | .trigger = mx51_ecspi_trigger, |
930 | .rx_available = mx51_ecspi_rx_available, | 961 | .rx_available = mx51_ecspi_rx_available, |
@@ -940,6 +971,7 @@ static struct spi_imx_devtype_data imx51_ecspi_devtype_data = { | |||
940 | 971 | ||
941 | static struct spi_imx_devtype_data imx53_ecspi_devtype_data = { | 972 | static struct spi_imx_devtype_data imx53_ecspi_devtype_data = { |
942 | .intctrl = mx51_ecspi_intctrl, | 973 | .intctrl = mx51_ecspi_intctrl, |
974 | .prepare_message = mx51_ecspi_prepare_message, | ||
943 | .config = mx51_ecspi_config, | 975 | .config = mx51_ecspi_config, |
944 | .trigger = mx51_ecspi_trigger, | 976 | .trigger = mx51_ecspi_trigger, |
945 | .rx_available = mx51_ecspi_rx_available, | 977 | .rx_available = mx51_ecspi_rx_available, |
@@ -1492,7 +1524,13 @@ spi_imx_prepare_message(struct spi_master *master, struct spi_message *msg) | |||
1492 | return ret; | 1524 | return ret; |
1493 | } | 1525 | } |
1494 | 1526 | ||
1495 | return 0; | 1527 | ret = spi_imx->devtype_data->prepare_message(spi_imx, msg); |
1528 | if (ret) { | ||
1529 | clk_disable(spi_imx->clk_ipg); | ||
1530 | clk_disable(spi_imx->clk_per); | ||
1531 | } | ||
1532 | |||
1533 | return ret; | ||
1496 | } | 1534 | } |
1497 | 1535 | ||
1498 | static int | 1536 | static int |