|
@@ -18,6 +18,12 @@
|
|
|
#include <linux/uaccess.h>
|
|
|
#include <linux/err.h>
|
|
|
|
|
|
+/*
|
|
|
+ * workaround: some registers needed by pm805 are defined in pm800, so
|
|
|
+ * need to use this global variable to maintain the relation between
|
|
|
+ * pm800 and pm805. would remove it after HW chip fixes the issue.
|
|
|
+ */
|
|
|
+static struct pm80x_chip *g_pm80x_chip;
|
|
|
|
|
|
const struct regmap_config pm80x_regmap_config = {
|
|
|
.reg_bits = 8,
|
|
@@ -61,6 +67,19 @@ int __devinit pm80x_init(struct i2c_client *client,
|
|
|
|
|
|
device_init_wakeup(&client->dev, 1);
|
|
|
|
|
|
+ /*
|
|
|
+ * workaround: set g_pm80x_chip to the first probed chip. if the
|
|
|
+ * second chip is probed, just point to the companion to each
|
|
|
+ * other so that pm805 can access those specific register. would
|
|
|
+ * remove it after HW chip fixes the issue.
|
|
|
+ */
|
|
|
+ if (!g_pm80x_chip)
|
|
|
+ g_pm80x_chip = chip;
|
|
|
+ else {
|
|
|
+ chip->companion = g_pm80x_chip->client;
|
|
|
+ g_pm80x_chip->companion = chip->client;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_chip_id:
|
|
@@ -75,6 +94,15 @@ int __devexit pm80x_deinit(struct i2c_client *client)
|
|
|
{
|
|
|
struct pm80x_chip *chip = i2c_get_clientdata(client);
|
|
|
|
|
|
+ /*
|
|
|
+ * workaround: clear the dependency between pm800 and pm805.
|
|
|
+ * would remove it after HW chip fixes the issue.
|
|
|
+ */
|
|
|
+ if (g_pm80x_chip->companion)
|
|
|
+ g_pm80x_chip->companion = NULL;
|
|
|
+ else
|
|
|
+ g_pm80x_chip = NULL;
|
|
|
+
|
|
|
regmap_exit(chip->regmap);
|
|
|
devm_kfree(&client->dev, chip);
|
|
|
|