|
@@ -1,9 +1,9 @@
|
|
|
/*
|
|
|
* R-Car Generation 2 da9063/da9210 regulator quirk
|
|
|
*
|
|
|
- * The r8a7790/lager and r8a7791/koelsch development boards have da9063 and
|
|
|
- * da9210 regulators. Both regulators have their interrupt request lines tied
|
|
|
- * to the same interrupt pin (IRQ2) on the SoC.
|
|
|
+ * Certain Gen2 development boards have an da9063 and one or more da9210
|
|
|
+ * regulators. All of these regulators have their interrupt request lines
|
|
|
+ * tied to the same interrupt pin (IRQ2) on the SoC.
|
|
|
*
|
|
|
* After cold boot or da9063-induced restart, both the da9063 and da9210 seem
|
|
|
* to assert their interrupt request lines. Hence as soon as one driver
|
|
@@ -50,7 +50,7 @@ static void __iomem *irqc;
|
|
|
static u8 da9063_irq_clr[] = { DA9063_REG_IRQ_MASK_A, 0xff, 0xff, 0xff, 0xff };
|
|
|
static u8 da9210_irq_clr[] = { DA9210_REG_MASK_A, 0xff, 0xff };
|
|
|
|
|
|
-static struct i2c_msg da9xxx_msgs[2] = {
|
|
|
+static struct i2c_msg da9xxx_msgs[3] = {
|
|
|
{
|
|
|
.addr = 0x58,
|
|
|
.len = ARRAY_SIZE(da9063_irq_clr),
|
|
@@ -59,6 +59,10 @@ static struct i2c_msg da9xxx_msgs[2] = {
|
|
|
.addr = 0x68,
|
|
|
.len = ARRAY_SIZE(da9210_irq_clr),
|
|
|
.buf = da9210_irq_clr,
|
|
|
+ }, {
|
|
|
+ .addr = 0x70,
|
|
|
+ .len = ARRAY_SIZE(da9210_irq_clr),
|
|
|
+ .buf = da9210_irq_clr,
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -85,11 +89,15 @@ static int regulator_quirk_notify(struct notifier_block *nb,
|
|
|
dev_dbg(dev, "Detected %s\n", client->name);
|
|
|
|
|
|
if ((client->addr == 0x58 && !strcmp(client->name, "da9063")) ||
|
|
|
- (client->addr == 0x68 && !strcmp(client->name, "da9210"))) {
|
|
|
- int ret;
|
|
|
+ (client->addr == 0x68 && !strcmp(client->name, "da9210")) ||
|
|
|
+ (client->addr == 0x70 && !strcmp(client->name, "da9210"))) {
|
|
|
+ int ret, len;
|
|
|
+
|
|
|
+ /* There are two DA9210 on Stout, one on the other boards. */
|
|
|
+ len = of_machine_is_compatible("renesas,stout") ? 3 : 2;
|
|
|
|
|
|
dev_info(&client->dev, "clearing da9063/da9210 interrupts\n");
|
|
|
- ret = i2c_transfer(client->adapter, da9xxx_msgs, ARRAY_SIZE(da9xxx_msgs));
|
|
|
+ ret = i2c_transfer(client->adapter, da9xxx_msgs, len);
|
|
|
if (ret != ARRAY_SIZE(da9xxx_msgs))
|
|
|
dev_err(&client->dev, "i2c error %d\n", ret);
|
|
|
}
|
|
@@ -118,6 +126,7 @@ static int __init rcar_gen2_regulator_quirk(void)
|
|
|
|
|
|
if (!of_machine_is_compatible("renesas,koelsch") &&
|
|
|
!of_machine_is_compatible("renesas,lager") &&
|
|
|
+ !of_machine_is_compatible("renesas,stout") &&
|
|
|
!of_machine_is_compatible("renesas,gose"))
|
|
|
return -ENODEV;
|
|
|
|