Skip to content

Commit

Permalink
mfd: Add companion chip in 88pm80x
Browse files Browse the repository at this point in the history
in hw design, 800 is mainly for pmic control, while 805 for audio.
but there are 3 registers which controls class D speaker property,
and they are defined in 800 i2c client domain. so 805 codec driver
needs to use 800 i2c client to access class D speaker reg for
audio path management. so add this workaround for the purpose to
let 805 access 800 i2c in some scenario.

Signed-off-by: Qiao Zhou <zhouqiao@marvell.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Qiao Zhou authored and Samuel Ortiz committed Jul 9, 2012
1 parent 70c6cce commit 5500e39
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
28 changes: 28 additions & 0 deletions drivers/mfd/88pm80x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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:
Expand All @@ -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);

Expand Down
1 change: 1 addition & 0 deletions include/linux/mfd/88pm80x.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ struct pm80x_chip {
struct pm80x_subchip *subchip;
struct device *dev;
struct i2c_client *client;
struct i2c_client *companion;
struct regmap *regmap;
struct regmap_irq_chip *regmap_irq_chip;
struct regmap_irq_chip_data *irq_data;
Expand Down

0 comments on commit 5500e39

Please sign in to comment.