mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
pwm: pca9685: Disable unused alternative addresses
The PCA9685 supports listening to 1 or more alternative I2C chip addresses for some special features that this driver does not support. By default the LED ALLCALL address is active (default 0x70), which causes this chip to respond to address 0x70 in addition to its main address (0x41). This is not desireable if there is another device on the same bus that uses this address (like a TMP103 for example). Since this feature is not supported by this driver, it is best to disable these addresses in the chip to avoid unsuspected bus collisions. Signed-off-by: David Jander <david@protonic.nl> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
e1057a8df1
commit
bce5436694
@ -58,6 +58,10 @@
|
||||
#define PCA9685_MAXCHAN 0x10
|
||||
|
||||
#define LED_FULL BIT(4)
|
||||
#define MODE1_ALLCALL BIT(0)
|
||||
#define MODE1_SUB3 BIT(1)
|
||||
#define MODE1_SUB2 BIT(2)
|
||||
#define MODE1_SUB1 BIT(3)
|
||||
#define MODE1_SLEEP BIT(4)
|
||||
#define MODE2_INVRT BIT(4)
|
||||
#define MODE2_OUTDRV BIT(2)
|
||||
@ -443,8 +447,8 @@ static int pca9685_pwm_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct pca9685 *pca;
|
||||
unsigned int reg;
|
||||
int ret;
|
||||
int mode2;
|
||||
|
||||
pca = devm_kzalloc(&client->dev, sizeof(*pca), GFP_KERNEL);
|
||||
if (!pca)
|
||||
@ -461,19 +465,24 @@ static int pca9685_pwm_probe(struct i2c_client *client,
|
||||
|
||||
i2c_set_clientdata(client, pca);
|
||||
|
||||
regmap_read(pca->regmap, PCA9685_MODE2, &mode2);
|
||||
regmap_read(pca->regmap, PCA9685_MODE2, ®);
|
||||
|
||||
if (device_property_read_bool(&client->dev, "invert"))
|
||||
mode2 |= MODE2_INVRT;
|
||||
reg |= MODE2_INVRT;
|
||||
else
|
||||
mode2 &= ~MODE2_INVRT;
|
||||
reg &= ~MODE2_INVRT;
|
||||
|
||||
if (device_property_read_bool(&client->dev, "open-drain"))
|
||||
mode2 &= ~MODE2_OUTDRV;
|
||||
reg &= ~MODE2_OUTDRV;
|
||||
else
|
||||
mode2 |= MODE2_OUTDRV;
|
||||
reg |= MODE2_OUTDRV;
|
||||
|
||||
regmap_write(pca->regmap, PCA9685_MODE2, mode2);
|
||||
regmap_write(pca->regmap, PCA9685_MODE2, reg);
|
||||
|
||||
/* Disable all LED ALLCALL and SUBx addresses to avoid bus collisions */
|
||||
regmap_read(pca->regmap, PCA9685_MODE1, ®);
|
||||
reg &= ~(MODE1_ALLCALL | MODE1_SUB1 | MODE1_SUB2 | MODE1_SUB3);
|
||||
regmap_write(pca->regmap, PCA9685_MODE1, reg);
|
||||
|
||||
/* Clear all "full off" bits */
|
||||
regmap_write(pca->regmap, PCA9685_ALL_LED_OFF_L, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user