]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ssi/omap-tsc2101.c
h63xx: mux and microwire configurations.
[linux-2.6-omap-h63xx.git] / drivers / ssi / omap-tsc2101.c
index 5dfe994001a094ec21aac422752631ebd3c8b3bb..d95af74513257aeb35117350b4f66b6c8ede7aba 100644 (file)
 #include <asm/arch/hardware.h>
 #include <asm/hardware/tsc2101.h>
 #include <asm/arch/gpioexpander.h>
+#include <asm/arch/gpio.h>
 
 #include "omap-tsc2101.h"
 
-#if CONFIG_ARCH_OMAP16XX
+#if CONFIG_ARCH_OMAP1
 #include <../drivers/ssi/omap-uwire.h>
 #else
 #error "Unsupported configuration"
@@ -66,27 +67,28 @@ int omap_tsc2101_enable(void)
        if (count++ == 0) {
                int ret = 0;
                /* set the Mux to provide MCLK to TSC2101 */
-               if (machine_is_omap_h3()) {
+               if (machine_is_omap_h3())
                        ret = omap_cfg_reg(V5_1710_MCLK_ON);
-               } else {
-                       if (machine_is_omap_h2()) {
-                               ret = omap_cfg_reg(R10_1610_MCLK_ON);
+               else if (machine_is_omap_h2())
+                       ret = omap_cfg_reg(R10_1610_MCLK_ON);
+               else if (machine_is_omap_h6300())
+                       ret = omap_cfg_reg(R10_1510_MCLK_ON);
+
+               if (!cpu_is_omap1510 ()) {
+                       /* Get the MCLK */
+                       tsc2101_mclk_ck = clk_get(NULL, "mclk");
+                       if (NULL == tsc2101_mclk_ck) {
+                               printk(KERN_ERR "Unable to get the clock MCLK!!!\n");;
+                               ret = -EPERM;
+                               goto done;
                        }
-               }
-
-               /* Get the MCLK */
-               tsc2101_mclk_ck = clk_get(NULL, "mclk");
-               if (NULL == tsc2101_mclk_ck) {
-                       printk(KERN_ERR "Unable to get the clock MCLK!!!\n");;
-                       ret = -EPERM;
-                       goto done;
-               }
-               if (clk_set_rate(tsc2101_mclk_ck, 12000000)) {
-                       printk(KERN_ERR "Unable to set rate to the MCLK!!!\n");;
-                       ret = -EPERM;
-                       goto done;
-               }
-               clk_enable(tsc2101_mclk_ck);
+                       if (clk_set_rate(tsc2101_mclk_ck, 12000000)) {
+                               printk(KERN_ERR "Unable to set rate to the MCLK!!!\n");;
+                               ret = -EPERM;
+                               goto done;
+                       }
+                       clk_enable(tsc2101_mclk_ck);
+               } /* if (!cpu_is_omap1510 ()) */
 
                ret = omap_tsc2101_configure();
 
@@ -116,10 +118,16 @@ void omap_tsc2101_disable(void)
                        }
                }
 
-               /* Release the MCLK */
-               clk_disable(tsc2101_mclk_ck);
-               clk_put(tsc2101_mclk_ck);
-               tsc2101_mclk_ck = NULL;
+               if (!cpu_is_omap1510 ()) {
+                       /* Release the MCLK */
+                       clk_disable(tsc2101_mclk_ck);
+                       clk_put(tsc2101_mclk_ck);
+                       tsc2101_mclk_ck = NULL;
+               }
+
+#if defined(CONFIG_MACH_OMAP_H6300)
+               omap_free_gpio(8);
+#endif
 
                module_put(THIS_MODULE);
        }
@@ -150,7 +158,10 @@ void omap_tsc2101_write(int page, u8 address, u16 data)
                        return;
                }
        }
-       if (machine_is_omap_h3()) {
+       if (machine_is_omap_h3() || machine_is_omap_h6300()) {
+
+               if (machine_is_omap_h6300())
+                       omap_set_gpio_dataout (8, 0);
 
                ret =
                    omap_uwire_data_transfer(0, ((page << 11) | (address << 5)),
@@ -159,6 +170,8 @@ void omap_tsc2101_write(int page, u8 address, u16 data)
                        printk(KERN_ERR
                               "uwire-write returned error for address %x\n",
                               address);
+               if (machine_is_omap_h6300())
+                       omap_set_gpio_dataout (8, 1);
                        return;
                }
                ret = omap_uwire_data_transfer(0, data, 16, 0, NULL, 0);
@@ -166,10 +179,14 @@ void omap_tsc2101_write(int page, u8 address, u16 data)
                        printk(KERN_ERR
                               "uwire-write returned error for address %x\n",
                               address);
+                       if (machine_is_omap_h6300())
+                               omap_set_gpio_dataout (8, 1);
                        return;
                }
-       }
 
+               if (machine_is_omap_h6300())
+                       omap_set_gpio_dataout (8, 1);
+       }
 }
 
 void omap_tsc2101_reads(int page, u8 startaddress, u16 * data, int numregs)
@@ -178,9 +195,13 @@ void omap_tsc2101_reads(int page, u8 startaddress, u16 * data, int numregs)
        if (machine_is_omap_h2()) {
                cs = 1;
        }
-       if (machine_is_omap_h3()) {
+       if (machine_is_omap_h3() || machine_is_omap_h6300()) {
                cs = 0;
        }
+
+       if (machine_is_omap_h6300())
+               omap_set_gpio_dataout(8, 0);
+
        (void)omap_uwire_data_transfer(cs, (0x8000 | (page << 11)
                                            | (startaddress << 5)),
                                       16, 0, NULL, 1);
@@ -188,6 +209,9 @@ void omap_tsc2101_reads(int page, u8 startaddress, u16 * data, int numregs)
                omap_uwire_data_transfer(cs, 0, 0, 16, data, 1);
        }
        omap_uwire_data_transfer(cs, 0, 0, 16, data, 0);
+
+       if (machine_is_omap_h6300())
+               omap_set_gpio_dataout(8, 1);
 }
 
 u16 omap_tsc2101_read(int page, u8 address)
@@ -228,9 +252,24 @@ static int omap_tsc2101_configure(void)
                omap_cfg_reg(N14_1610_UWIRE_CS0);
                omap_uwire_configure_mode(0, uwire_flags);
        }
+       if (machine_is_omap_h6300()) {
+               uwire_flags = UWIRE_READ_RISING_EDGE | UWIRE_WRITE_RISING_EDGE;
+               omap_cfg_reg(N14_1510_UWIRE_CS0);
+               omap_uwire_configure_mode(0, uwire_flags);
+
+               omap_request_gpio(8);
+               omap_set_gpio_dataout(8, 0);
+               omap_set_gpio_direction (8, 0);
+       }
 
        /* Configure MCLK enable */
-       omap_writel(omap_readl(PU_PD_SEL_2) | (1 << 22), PU_PD_SEL_2);  
+       if (cpu_is_omap16xx() || cpu_is_omap1710())
+               omap_writel(omap_readl(PU_PD_SEL_2) | (1 << 22), PU_PD_SEL_2);  
+       if (machine_is_omap_h6300()) {
+               omap_cfg_reg(V19_1510_UWIRE_SCLK);
+               omap_cfg_reg(W21_1510_UWIRE_SDO);
+               omap_cfg_reg(U18_1510_UWIRE_SDI);
+       }
 
        return 0;
 }