From: David Brownell <[EMAIL PROTECTED]>

Remove the two (!) legacy GPIO expander modules for DaVinci U35,
and provide standard GPIO framework support for that chip ... but
without any particular intelligence.

Make the EVM support in the musb driver use GPIO calls to access
that signal.

This breaks the build for the RTC drivers ... both the obsolete
non-framework one (separate patch removes it) and the newer one.
That drivers/rtc/rtc-davinci-evm.c code talks to the msp430 like
a few other drivers should; prbably they should switch to MFD.

Needs tweaking yet, notably reset/initial values and the signal
names used to reserve the various signals.

Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Kevin Hilman <[EMAIL PROTECTED]>
---
 arch/arm/mach-davinci/Kconfig                   |    9 --
 arch/arm/mach-davinci/Makefile                  |    1 -
 arch/arm/mach-davinci/board-evm.c               |   71 ++++++++--
 arch/arm/mach-davinci/i2c-client.c              |  166 -----------------------
 arch/arm/mach-davinci/include/mach/i2c-client.h |   34 -----
 drivers/i2c/chips/Kconfig                       |    6 -
 drivers/i2c/chips/Makefile                      |    1 -
 drivers/i2c/chips/gpio_expander_davinci.c       |  143 -------------------
 drivers/usb/musb/davinci.c                      |    8 +-
 9 files changed, 60 insertions(+), 379 deletions(-)
 delete mode 100644 arch/arm/mach-davinci/i2c-client.c
 delete mode 100644 arch/arm/mach-davinci/include/mach/i2c-client.h
 delete mode 100644 drivers/i2c/chips/gpio_expander_davinci.c

diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig
index 4a95c60..fd3f8bd 100644
--- a/arch/arm/mach-davinci/Kconfig
+++ b/arch/arm/mach-davinci/Kconfig
@@ -14,19 +14,10 @@ config MACH_DAVINCI_EVM
        bool "TI DaVinci EVM"
        default y
        depends on ARCH_DAVINCI644x
-       select GPIOEXPANDER_DAVINCI
        help
          Configure this option to specify the whether the board used
          for development is a DaVinci EVM
 
-config DAVINCI_I2C_EXPANDER
-       bool "TI DaVinci I2C Expander"
-       default y
-       depends on I2C && ARCH_DAVINCI644x
-       help
-         Configure this option to specify whether the board used
-         has I2C exapnder with ATA, USB, CF.
-
 config DAVINCI_MCBSP
        bool
         prompt "DaVinci McBSP Driver" if SOUND_DAVINCI=n
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile
index 7428e48..945ee80 100644
--- a/arch/arm/mach-davinci/Makefile
+++ b/arch/arm/mach-davinci/Makefile
@@ -10,4 +10,3 @@ obj-y                         := time.o irq.o clock.o 
serial.o io.o id.o psc.o \
 # Board specific
 obj-$(CONFIG_MACH_DAVINCI_EVM)         += board-evm.o
 obj-$(CONFIG_DAVINCI_MCBSP)            += mcbsp.o
-obj-$(CONFIG_DAVINCI_I2C_EXPANDER)     += i2c-client.o
diff --git a/arch/arm/mach-davinci/board-evm.c 
b/arch/arm/mach-davinci/board-evm.c
index 670c642..4295665 100644
--- a/arch/arm/mach-davinci/board-evm.c
+++ b/arch/arm/mach-davinci/board-evm.c
@@ -327,11 +327,61 @@ static struct pcf857x_platform_data pcf_data_u18 = {
 
 /* U35 - various I/O signals used to manage USB, CF, ATA, etc */
 
-#if 0
+static int
+evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+{
+       /* REVISIT -- get polarity of these right; active low == 'n' prefix */
+
+       /* p0 = nDRV_VBUS */
+       gpio_request(gpio + 0, "nDRV_VBUS");
+       gpio_direction_output(gpio + 0, 1);
+
+       /* p1 = VDDIMX_EN */
+       gpio_request(gpio + 1, "VDDIMX_EN");
+       gpio_direction_output(gpio + 1, 1);
+
+       /* p2 = VLYNQ_EN */
+       gpio_request(gpio + 2, "VLYNQ_EN");
+       gpio_direction_output(gpio + 2, 1);
+
+       /* p3 = n3V3_CF_RESET */
+       gpio_request(gpio + 3, "nCF_RESET");
+       gpio_direction_output(gpio + 3, 0);
+
+       /* (p4 unused) */
+
+       /* p5 = 1V8_WLAN_RESET */
+       gpio_request(gpio + 5, "WLAN_RESET");
+       gpio_direction_output(gpio + 5, 1);
+
+       /* p6 = ATA_SEL */
+       gpio_request(gpio + 6, "ATA_SEL");
+       gpio_direction_output(gpio + 6, 1);
+
+       /* p7 = CFn_SEL */
+       gpio_request(gpio + 7, "CF_SEL");
+       gpio_direction_output(gpio + 7, 0);
+
+       return 0;
+}
+
+static int
+evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c)
+{
+       gpio_free(gpio + 0);
+
+       return 0;
+}
+
 static struct pcf857x_platform_data pcf_data_u35 = {
-       .gpio_base = PCF_Uxx_BASE(2),
+       .gpio_base      = PCF_Uxx_BASE(2),
+       /* leave ATA (not CF) active, CF and WLAN in reset,
+        * enable VLYNQ and IMX, don't drive VBUS.
+        */
+       .n_latch        = (1 << 7) | (1 << 3),
+       .setup          = evm_u35_setup,
+       .teardown       = evm_u35_teardown,
 };
-#endif
 
 /*----------------------------------------------------------------------*/
 
@@ -385,26 +435,17 @@ EXPORT_SYMBOL(dm6446evm_eeprom_write);
 
 static struct i2c_board_info __initdata i2c_info[] =  {
        {
-               I2C_BOARD_INFO("pcf857x", 0x38),
-               .type           = "pcf8574",
+               I2C_BOARD_INFO("pcf8574", 0x38),
                .platform_data  = &pcf_data_u2,
        },
        {
-               I2C_BOARD_INFO("pcf857x", 0x39),
-               .type           = "pcf8574",
+               I2C_BOARD_INFO("pcf8574", 0x39),
                .platform_data  = &pcf_data_u18,
        },
-#if 0
-/* don't clash with mach-davinci/i2c-client.c
- * or drivers/i2c/chips/gpio_expander_davinci.c
- * ... eventually both should vanish
- */
        {
-               I2C_BOARD_INFO("pcf857x", 0x3a),
-               .type           = "pcf8574a",
+               I2C_BOARD_INFO("pcf8574", 0x3a),
                .platform_data  = &pcf_data_u35,
        },
-#endif
        {
                I2C_BOARD_INFO("24c256", 0x50),
                .platform_data  = &eeprom_info,
diff --git a/arch/arm/mach-davinci/i2c-client.c 
b/arch/arm/mach-davinci/i2c-client.c
deleted file mode 100644
index 43b406f..0000000
--- a/arch/arm/mach-davinci/i2c-client.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  linux/drivers/davinci/i2c-davinci-client.c
- *
- * Copyright (C) 2006 Texas Instruments Inc
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/vmalloc.h>
-#include <linux/slab.h>
-#include <linux/proc_fs.h>
-#include <linux/ctype.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/clk.h>
-#include <linux/semaphore.h>
-
-#include <mach/i2c-client.h>
-
-static DEFINE_MUTEX(expander_lock);
-static struct i2c_client *client_handle;
-
-/* This function is used for internal initialization */
-int davinci_i2c_read(u8 size, u8 * val, u16 client_addr)
-{
-       int err;
-       struct i2c_client *client = client_handle;
-
-       struct i2c_msg msg[1];
-
-       if (!client->adapter)
-               return -ENODEV;
-
-       msg->addr = client_addr;
-       msg->flags = I2C_M_RD;
-       msg->len = size;
-       msg->buf = val;
-
-       err = i2c_transfer(client->adapter, msg, 1);
-
-       if (err >= 0) {
-               return 0;
-       }
-
-       return err;
-}
-
-EXPORT_SYMBOL(davinci_i2c_read);
-
-/* This function is used for internal initialization */
-int davinci_i2c_write(u8 size, u8 * val, u16 client_addr)
-{
-       int err;
-       struct i2c_client *client = client_handle;
-
-       struct i2c_msg msg[1];
-
-       if (!client->adapter)
-               return -ENODEV;
-
-       msg->addr = client_addr;
-       msg->flags = 0;
-       msg->len = size;
-       msg->buf = val;
-
-       err = i2c_transfer(client->adapter, msg, 1);
-       if (err >= 0)
-               return 0;
-
-       return err;
-}
-
-EXPORT_SYMBOL(davinci_i2c_write);
-
-static struct i2c_driver davinci_i2c_client_driver;
-
-static int davinci_i2c_attach_client(struct i2c_adapter *adap, int addr)
-{
-       struct i2c_client *client;
-       int err;
-       u8 data_to_u35 = 0xf6;
-
-       if (!(client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL))) {
-               err = -ENOMEM;
-               goto exit;
-       }
-       client_handle = client;
-
-       if (client->adapter)
-               return -EBUSY;  /* our client is already attached */
-
-       client->addr = addr;
-       client->flags = 0;
-       client->driver = &davinci_i2c_client_driver;
-       client->adapter = adap;
-       strlcpy(client->name, client->driver->driver.name, I2C_NAME_SIZE);
-
-       err = i2c_attach_client(client);
-       if (err) {
-               client->adapter = NULL;
-               goto exit_kfree;
-       }
-
-       err = davinci_i2c_write(1, &data_to_u35, 0x3A);
-
-       return 0;
-
- exit_kfree:
-       kfree(client);
- exit:
-       return err;
-}
-
-static int davinci_i2c_detach_client(struct i2c_client *client)
-{
-       int err;
-
-       if (!client->adapter)
-               return -ENODEV; /* our client isn't attached */
-
-       err = i2c_detach_client(client);
-       client->adapter = NULL;
-       return err;
-}
-
-static int davinci_i2c_probe_adapter(struct i2c_adapter *adap)
-{
-       return davinci_i2c_attach_client(adap, 0x3A);
-}
-
-/* This is the driver that will be inserted */
-static struct i2c_driver davinci_i2c_client_driver = {
-       .driver = {
-               /* there are 3 expanders, one is leds-only ... */
-               .name   = "davinci_evm_expander1",
-       },
-       .attach_adapter = davinci_i2c_probe_adapter,
-       .detach_client  = davinci_i2c_detach_client,
-};
-
-static int __init davinci_i2c_client_init(void)
-{
-       return i2c_add_driver(&davinci_i2c_client_driver);
-}
-
-static void __exit davinci_i2c_client_exit(void)
-{
-       i2c_del_driver(&davinci_i2c_client_driver);
-}
-
-module_init(davinci_i2c_client_init);
-module_exit(davinci_i2c_client_exit);
diff --git a/arch/arm/mach-davinci/include/mach/i2c-client.h 
b/arch/arm/mach-davinci/include/mach/i2c-client.h
deleted file mode 100644
index 3619546..0000000
--- a/arch/arm/mach-davinci/include/mach/i2c-client.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  include/asm-arm/arch-davinci/i2c-client.h
- *
- * Copyright (C) 2006 Texas Instruments Inc
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-/* i2c-client.h */
-
-typedef enum {
-        USB_DRVVBUS = 0,
-        VDDIMX_EN = 1,
-        VLYNQ_ON = 2,
-        CF_RESET = 3,
-        WLAN_RESET = 4,
-        ATA_SEL = 5,
-        CF_SEL = 6
-} u35_expander_ops;
-
-int davinci_i2c_expander_op (u16 client_addr, u35_expander_ops pin, u8 val);
-int davinci_i2c_write(u8 size, u8 * val, u16 client_addr);
-int davinci_i2c_read(u8 size, u8 * val, u16 client_addr);
diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
index 7377bb8..1c6e714 100644
--- a/drivers/i2c/chips/Kconfig
+++ b/drivers/i2c/chips/Kconfig
@@ -267,10 +267,4 @@ config MENELAUS
          and other features that are often used in portable devices like
          cell phones and PDAs.
 
-config GPIOEXPANDER_DAVINCI
-        bool "GPIO Expander for DaVinci"
-        depends on I2C && ARCH_DAVINCI
-        help
-          If you say yes here you get support for I/O expander calls
-
 endmenu
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
index bdf004d..418a3b9 100644
--- a/drivers/i2c/chips/Makefile
+++ b/drivers/i2c/chips/Makefile
@@ -31,7 +31,6 @@ obj-$(CONFIG_TWL4030_POWEROFF)        += twl4030-poweroff.o
 obj-$(CONFIG_TWL4030_PWRBUTTON)        += twl4030-pwrbutton.o
 obj-$(CONFIG_TWL4030_MADC)     += twl4030-madc.o
 obj-$(CONFIG_RTC_X1205_I2C)    += x1205.o
-obj-$(CONFIG_GPIOEXPANDER_DAVINCI) += gpio_expander_davinci.o
 
 ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
 EXTRA_CFLAGS += -DDEBUG
diff --git a/drivers/i2c/chips/gpio_expander_davinci.c 
b/drivers/i2c/chips/gpio_expander_davinci.c
deleted file mode 100644
index c2aa7ac..0000000
--- a/drivers/i2c/chips/gpio_expander_davinci.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * drivers/i2c/chips/gpio_expander_davinci.c
- *
- * Author: Vladimir Barinov, MontaVista Software, Inc. <[EMAIL PROTECTED]>
- *
- * Copyright (C) 2006 Texas Instruments Inc
- *
- * 2007 (c) MontaVista Software, Inc. This file is licensed under
- * the terms of the GNU General Public License version 2. This program
- * is licensed "as is" without any warranty of any kind, whether express
- * or implied.
- */
-
-#include <linux/types.h>
-#include <linux/i2c.h>
-#include <linux/errno.h>
-#include <linux/mutex.h>
-
-#include <mach/i2c-client.h>
-
-static DEFINE_MUTEX(expander_lock);
-
-static int davinci_i2c_expander_read(u8 size, u8 * val, u16 addr)
-{
-       struct i2c_adapter *adap;
-       int err;
-       struct i2c_msg msg[1];
-
-       adap = i2c_get_adapter(1);
-       if (!adap)
-               return -ENODEV;
-
-       msg->addr = addr;
-       msg->flags = I2C_M_RD;
-       msg->len = size;
-       msg->buf = val;
-
-       err = i2c_transfer(adap, msg, 1);
-       if (err >= 0)
-               return 0;
-
-       return err;
-}
-
-static int davinci_i2c_expander_write(u8 size, u8 * val, u16 addr)
-{
-       struct i2c_adapter *adap;
-       int err;
-       struct i2c_msg msg[1];
-
-       adap = i2c_get_adapter(1);
-       if (!adap)
-               return -ENODEV;
-
-       msg->addr = addr;
-       msg->flags = 0;
-       msg->len = size;
-       msg->buf = val;
-
-       err = i2c_transfer(adap, msg, 1);
-       if (err >= 0)
-               return 0;
-
-       return err;
-}
-
-int davinci_i2c_expander_op(u16 client_addr, u35_expander_ops pin, u8 val)
-{
-       int err = 0;
-       char cmd[4] = { 4, 6, 0x00, 0x09 };
-       u8 data_to_u35 = 0;
-
-       if (val > 1)
-               return -1;
-
-       mutex_lock(&expander_lock);
-
-       err = davinci_i2c_expander_read(1, &data_to_u35, 0x3A);
-       if (err < 0)
-               goto out;
-
-       if (client_addr == 0x3A) {
-               switch (pin) {
-               case USB_DRVVBUS:
-                       if (val)
-                               data_to_u35 |= val;
-                       else
-                               data_to_u35 &= (val | 0xFE);
-                       break;
-               case VDDIMX_EN:
-                       if (val)
-                               data_to_u35 |= (val << 1);
-                       else
-                               data_to_u35 &= (val | 0xFD);
-                       break;
-               case VLYNQ_ON:
-                       if (val)
-                               data_to_u35 |= (val << 2);
-                       else
-                               data_to_u35 &= (val | 0xFB);
-                       break;
-               case CF_RESET:
-                       if (val)
-                               data_to_u35 |= (val << 3);
-                       else
-                               data_to_u35 &= (val | 0xF7);
-                       break;
-               case WLAN_RESET:
-                       if (val)
-                               data_to_u35 |= (val << 5);
-                       else
-                               data_to_u35 &= (val | 0xDF);
-                       break;
-               case ATA_SEL:
-                       if (val)
-                               data_to_u35 |= (val << 6);
-                       else
-                               data_to_u35 &= (val | 0xBF);
-                       break;
-               case CF_SEL:
-                       davinci_i2c_expander_write(4, cmd, 0x23);
-                       if (val)
-                               data_to_u35 |= (val << 7);
-                       else
-                               data_to_u35 &= (val | 0x7F);
-                       break;
-               default:
-                       break;
-               }
-       } else {
-               printk("Only IO Expander at address 0x3A is supported\n");
-               err = -EINVAL;
-               goto out;
-       }
-
-       err = davinci_i2c_expander_write(1, &data_to_u35, 0x3A);
-
-out:
-       mutex_unlock(&expander_lock);
-
-       return err;
-}
-EXPORT_SYMBOL(davinci_i2c_expander_op);
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index ec9e09e..496224d 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -30,16 +30,16 @@
 #include <linux/delay.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
 
 #include <mach/hardware.h>
 #include <mach/memory.h>
-#include <mach/gpio.h>
 #include <asm/mach-types.h>
 
 #include "musb_core.h"
 
 #ifdef CONFIG_MACH_DAVINCI_EVM
-#include <mach/i2c-client.h>
+#define GPIO_nVBUS_DRV         87
 #endif
 
 #include "davinci.h"
@@ -145,7 +145,7 @@ static int vbus_state = -1;
  */
 static void evm_deferred_drvvbus(struct work_struct *ignored)
 {
-       davinci_i2c_expander_op(0x3a, USB_DRVVBUS, vbus_state);
+       gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
        vbus_state = !vbus_state;
 }
 static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
@@ -164,7 +164,7 @@ static void davinci_source_power(struct musb *musb, int 
is_on, int immediate)
 #ifdef CONFIG_MACH_DAVINCI_EVM
        if (machine_is_davinci_evm()) {
                if (immediate)
-                       davinci_i2c_expander_op(0x3a, USB_DRVVBUS, !is_on);
+                       gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
                else
                        schedule_work(&evm_vbus_work);
        }
-- 
1.5.6.4


_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to