drivers: misc: therm_est: Add timer trip support
[linux-2.6.git] / drivers / misc / a2220.c
index cf36c8f..7eacbe6 100644 (file)
@@ -2,6 +2,8 @@
  *
  * Copyright (C) 2009 HTC Corporation.
  *
+ * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
+ *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
  * may be copied, distributed, and modified under those terms.
@@ -201,7 +203,10 @@ static ssize_t a2220_hw_reset(struct a2220img *img)
 
        while (retry--) {
                /* Reset A2220 chip */
-               gpio_set_value(pdata->gpio_a2220_reset, 0);
+               if (pdata->gpio_a2220_reset)
+                       gpio_set_value(pdata->gpio_a2220_reset, 0);
+               else
+                       gpio_set_value(VP_RESET, 1);
 
                /* Enable A2220 clock */
                if (control_a2220_clk)
@@ -209,7 +214,10 @@ static ssize_t a2220_hw_reset(struct a2220img *img)
                mdelay(1);
 
                /* Take out of reset */
-               gpio_set_value(pdata->gpio_a2220_reset, 1);
+               if (pdata->gpio_a2220_reset)
+                       gpio_set_value(pdata->gpio_a2220_reset, 1);
+               else
+                       gpio_set_value(VP_RESET, 0);
 
                msleep(50);     /* Delay before send I2C command */
 
@@ -297,13 +305,10 @@ static int hpt_longCmd_execute(unsigned char *i2c_cmds, int size)
 }
 #endif
 
-static ssize_t a2220_bootup_init(struct a2220img *pImg)
+static int a2220_set_boot_mode()
 {
-       struct a2220img *vp = pImg;
-       int rc, pass = 0;
-       int remaining;
+       int rc;
        int retry = RETRY_CNT;
-       unsigned char *index;
        char buf[2];
 
        mdelay(100);
@@ -327,19 +332,39 @@ static ssize_t a2220_bootup_init(struct a2220img *pImg)
                buf[1] = A2220_msg_BOOT & 0xff;
                rc = a2220_i2c_write(buf, 2);
                if (rc < 0) {
-                       printk(KERN_ERR "%s: set boot mode error (%d retries left)\n",
+                       printk(KERN_ERR "%s: write error (%d retries left)\n",
                               __func__, retry);
-                       continue;
+                       if (retry > 0)
+                               continue;
+                       else
+                               return rc;
                }
 
                mdelay(1);
                rc = a2220_i2c_read(buf, 1);
 
                if (rc < 0) {
-                       printk(KERN_ERR "%s: boot mode ack error (%d retries left)\n",
+                       printk(KERN_ERR "%s: ack error (%d retries left)\n",
                               __func__, retry);
                        continue;
                }
+       }
+
+       return rc;
+}
+
+static ssize_t a2220_bootup_init(struct a2220img *pImg)
+{
+       struct a2220img *vp = pImg;
+       int rc, pass = 0;
+       int remaining;
+       int retry = RETRY_CNT;
+       unsigned char *index;
+       char buf[2];
+
+       mdelay(10);
+
+       while (retry--) {
                remaining = vp->img_size / 32;
                index = vp->buf;
                pr_info("%s: starting to load image (%d passes)...\n",
@@ -1255,18 +1280,20 @@ static int a2220_probe(struct i2c_client *client,
                }
        }
 
-       rc = gpio_request(pdata->gpio_a2220_reset, "a2220");
-       if (rc < 0) {
-               printk(KERN_ERR "%s: gpio request reset pin failed\n",
+       if (pdata->gpio_a2220_reset) {
+               rc = gpio_request(pdata->gpio_a2220_reset, "a2220");
+               if (rc < 0) {
+                       printk(KERN_ERR "%s: gpio request reset pin failed\n",
                        __func__);
-               goto err_free_gpio;
-       }
+                       goto err_free_gpio;
+               }
 
-       rc = gpio_direction_output(pdata->gpio_a2220_reset, 1);
-       if (rc < 0) {
-               printk(KERN_ERR "%s: request reset gpio direction failed\n",
+               rc = gpio_direction_output(pdata->gpio_a2220_reset, 1);
+               if (rc < 0) {
+                       printk(KERN_ERR "%s: request reset gpio direction failed\n",
                        __func__);
-               goto err_free_gpio_all;
+                       goto err_free_gpio_all;
+               }
        }
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
@@ -1299,7 +1326,8 @@ static int a2220_probe(struct i2c_client *client,
 #endif
        }
 
-       gpio_set_value(pdata->gpio_a2220_reset, 1);
+       if (pdata->gpio_a2220_reset)
+               gpio_set_value(pdata->gpio_a2220_reset, 1);
 
        if (pdata->gpio_a2220_audience_chip_sel)
                gpio_set_value(pdata->gpio_a2220_audience_chip_sel, 1);
@@ -1310,13 +1338,21 @@ static int a2220_probe(struct i2c_client *client,
                goto err_free_gpio_all;
        }
 
+       /* send boot msg */
+       rc = a2220_set_boot_mode();
+       if (rc < 0) {
+               printk(KERN_ERR "%s: failed %d\n", __func__, rc);
+               goto err_free_gpio_all;
+       }
+
        /* A2220 firmware download start .. */
        a2220_ioctl2(A2220_BOOTUP_INIT, 0);
 
        return 0;
 
  err_free_gpio_all:
-       gpio_free(pdata->gpio_a2220_reset);
+       if (pdata->gpio_a2220_reset)
+               gpio_free(pdata->gpio_a2220_reset);
  err_free_gpio:
        if (pdata->gpio_a2220_wakeup) {
 #ifdef CONFIG_USA_MODEL_SGH_T989
@@ -1339,7 +1375,7 @@ static int a2220_probe(struct i2c_client *client,
        if (pdata->gpio_a2220_micsel)
                gpio_free(pdata->gpio_a2220_micsel);
  err_free_gpio_clk:
-       if (control_a2220_clk)
+       if (pdata->gpio_a2220_clk)
                gpio_free(pdata->gpio_a2220_clk);
  err_alloc_data_failed: