diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-pxa.c')
-rw-r--r-- | drivers/i2c/busses/i2c-pxa.c | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 6426a61f8d4d..da3ecf5c591b 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -840,6 +840,32 @@ static const struct i2c_algorithm i2c_pxa_algorithm = { | |||
840 | .functionality = i2c_pxa_functionality, | 840 | .functionality = i2c_pxa_functionality, |
841 | }; | 841 | }; |
842 | 842 | ||
843 | static void i2c_pxa_enable(struct platform_device *dev) | ||
844 | { | ||
845 | if (cpu_is_pxa27x()) { | ||
846 | switch (dev->id) { | ||
847 | case 0: | ||
848 | pxa_gpio_mode(GPIO117_I2CSCL_MD); | ||
849 | pxa_gpio_mode(GPIO118_I2CSDA_MD); | ||
850 | break; | ||
851 | case 1: | ||
852 | local_irq_disable(); | ||
853 | PCFR |= PCFR_PI2CEN; | ||
854 | local_irq_enable(); | ||
855 | break; | ||
856 | } | ||
857 | } | ||
858 | } | ||
859 | |||
860 | static void i2c_pxa_disable(struct platform_device *dev) | ||
861 | { | ||
862 | if (cpu_is_pxa27x() && dev->id == 1) { | ||
863 | local_irq_disable(); | ||
864 | PCFR &= ~PCFR_PI2CEN; | ||
865 | local_irq_enable(); | ||
866 | } | ||
867 | } | ||
868 | |||
843 | #define res_len(r) ((r)->end - (r)->start + 1) | 869 | #define res_len(r) ((r)->end - (r)->start + 1) |
844 | static int i2c_pxa_probe(struct platform_device *dev) | 870 | static int i2c_pxa_probe(struct platform_device *dev) |
845 | { | 871 | { |
@@ -899,25 +925,13 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
899 | #endif | 925 | #endif |
900 | 926 | ||
901 | clk_enable(i2c->clk); | 927 | clk_enable(i2c->clk); |
902 | #ifdef CONFIG_PXA27x | 928 | i2c_pxa_enable(dev); |
903 | switch (dev->id) { | ||
904 | case 0: | ||
905 | pxa_gpio_mode(GPIO117_I2CSCL_MD); | ||
906 | pxa_gpio_mode(GPIO118_I2CSDA_MD); | ||
907 | break; | ||
908 | case 1: | ||
909 | local_irq_disable(); | ||
910 | PCFR |= PCFR_PI2CEN; | ||
911 | local_irq_enable(); | ||
912 | } | ||
913 | #endif | ||
914 | 929 | ||
915 | ret = request_irq(irq, i2c_pxa_handler, IRQF_DISABLED, | 930 | ret = request_irq(irq, i2c_pxa_handler, IRQF_DISABLED, |
916 | i2c->adap.name, i2c); | 931 | i2c->adap.name, i2c); |
917 | if (ret) | 932 | if (ret) |
918 | goto ereqirq; | 933 | goto ereqirq; |
919 | 934 | ||
920 | |||
921 | i2c_pxa_reset(i2c); | 935 | i2c_pxa_reset(i2c); |
922 | 936 | ||
923 | i2c->adap.algo_data = i2c; | 937 | i2c->adap.algo_data = i2c; |
@@ -955,14 +969,7 @@ eadapt: | |||
955 | free_irq(irq, i2c); | 969 | free_irq(irq, i2c); |
956 | ereqirq: | 970 | ereqirq: |
957 | clk_disable(i2c->clk); | 971 | clk_disable(i2c->clk); |
958 | 972 | i2c_pxa_disable(dev); | |
959 | #ifdef CONFIG_PXA27x | ||
960 | if (dev->id == 1) { | ||
961 | local_irq_disable(); | ||
962 | PCFR &= ~PCFR_PI2CEN; | ||
963 | local_irq_enable(); | ||
964 | } | ||
965 | #endif | ||
966 | eremap: | 973 | eremap: |
967 | clk_put(i2c->clk); | 974 | clk_put(i2c->clk); |
968 | eclk: | 975 | eclk: |
@@ -983,14 +990,7 @@ static int i2c_pxa_remove(struct platform_device *dev) | |||
983 | 990 | ||
984 | clk_disable(i2c->clk); | 991 | clk_disable(i2c->clk); |
985 | clk_put(i2c->clk); | 992 | clk_put(i2c->clk); |
986 | 993 | i2c_pxa_disable(dev); | |
987 | #ifdef CONFIG_PXA27x | ||
988 | if (dev->id == 1) { | ||
989 | local_irq_disable(); | ||
990 | PCFR &= ~PCFR_PI2CEN; | ||
991 | local_irq_enable(); | ||
992 | } | ||
993 | #endif | ||
994 | 994 | ||
995 | release_mem_region(i2c->iobase, i2c->iosize); | 995 | release_mem_region(i2c->iobase, i2c->iosize); |
996 | kfree(i2c); | 996 | kfree(i2c); |