bh1770 hacks: get it to work on n950

From: Pavel Machek
Date: Thu Nov 16 2017 - 06:57:34 EST


Hi!

Ok, not for application, but I can get light sensor to work.

Signed-off-by: Pavel Machek <pavel@xxxxxx>



diff --git a/arch/arm/boot/dts/omap3-n950.dts b/arch/arm/boot/dts/omap3-n950.dts
index 50c4fc6..15841f7 100644
--- a/arch/arm/boot/dts/omap3-n950.dts
+++ b/arch/arm/boot/dts/omap3-n950.dts
@@ -150,6 +150,23 @@
};
};

+ bh1770@38 {
+ compatible = "bh1770glc";
+ reg = <0x38>;
+
+ vdd-supply = <&vaux1>;
+ leds-supply = <&vaux1>; /* FIXME: really on vbat */
+
+ /* GPIO 83 on n950.
+ .leds = BHSFH_LED1,
+ .led_max_curr = BHSFH_LED_100mA,
+ .led_def_curr = BHSFH_LED_50mA,
+ .glass_attenuation = (16384 * 385) / 100, ... about 3.85x filtering
+ */
+ };
+
+ /* Also TLV320DAC33 and TPA6130A2 */
+
touch@4b {
compatible = "atmel,maxtouch";
reg = <0x4b>;
diff --git a/drivers/misc/bh1770glc.c b/drivers/misc/bh1770glc.c
index 9c62bf0..f08df29 100644
--- a/drivers/misc/bh1770glc.c
+++ b/drivers/misc/bh1770glc.c
@@ -22,6 +22,7 @@
*
*/

+#define DEBUG
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/i2c.h>
@@ -525,16 +526,22 @@ static int bh1770_detect(struct bh1770_chip *chip)
s32 ret;
u8 manu, part;

+ printk("Detect...\n");
+
ret = i2c_smbus_read_byte_data(client, BH1770_MANUFACT_ID);
if (ret < 0)
goto error;
manu = (u8)ret;

+ printk("Detect... manufact\n");
+
ret = i2c_smbus_read_byte_data(client, BH1770_PART_ID);
if (ret < 0)
goto error;
part = (u8)ret;

+ printk("Detect... part ... got %x %x\n", manu, part);
+
chip->revision = (part & BH1770_REV_MASK) >> BH1770_REV_SHIFT;
chip->prox_coef = BH1770_COEF_SCALER;
chip->prox_const = 0;
@@ -1179,6 +1186,8 @@ static const struct attribute_group bh1770_attribute_group = {
.attrs = sysfs_attrs
};

+struct bh1770_platform_data def = {};
+
static int bh1770_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1189,6 +1198,8 @@ static int bh1770_probe(struct i2c_client *client,
if (!chip)
return -ENOMEM;

+ printk("bh1770: probe\n");
+
i2c_set_clientdata(client, chip);
chip->client = client;

@@ -1198,10 +1209,12 @@ static int bh1770_probe(struct i2c_client *client,

if (client->dev.platform_data == NULL) {
dev_err(&client->dev, "platform data is mandatory\n");
- return -EINVAL;
+ //return -EINVAL;
}

chip->pdata = client->dev.platform_data;
+ if (!chip->pdata)
+ chip->pdata = &def;
chip->lux_calib = BH1770_LUX_NEUTRAL_CALIB_VALUE;
chip->lux_rate_index = BH1770_LUX_DEFAULT_RATE;
chip->lux_threshold_lo = BH1770_LUX_DEF_THRES;
@@ -1220,6 +1233,8 @@ static int bh1770_probe(struct i2c_client *client,
chip->prox_rate = BH1770_PROX_DEFAULT_RATE;
chip->prox_data = 0;

+ printk("bh1770: regulators\n");
+
chip->regs[0].supply = reg_vcc;
chip->regs[1].supply = reg_vleds;

@@ -1227,14 +1242,12 @@ static int bh1770_probe(struct i2c_client *client,
ARRAY_SIZE(chip->regs), chip->regs);
if (err < 0) {
dev_err(&client->dev, "Cannot get regulators\n");
- return err;
}

err = regulator_bulk_enable(ARRAY_SIZE(chip->regs),
chip->regs);
if (err < 0) {
dev_err(&client->dev, "Cannot enable regulators\n");
- return err;
}

usleep_range(BH1770_STARTUP_DELAY, BH1770_STARTUP_DELAY * 2);
@@ -1242,6 +1255,8 @@ static int bh1770_probe(struct i2c_client *client,
if (err < 0)
goto fail0;

+ printk("bh1770: detected\n");
+
/* Start chip */
bh1770_chip_on(chip);
pm_runtime_set_active(&client->dev);
@@ -1269,6 +1284,8 @@ static int bh1770_probe(struct i2c_client *client,
goto fail1;
}

+ printk("bh1770: sysfs ok\n");
+
/*
* Chip needs level triggered interrupt to work. However,
* level triggering doesn't work always correctly with power
@@ -1282,8 +1299,12 @@ static int bh1770_probe(struct i2c_client *client,
if (err) {
dev_err(&client->dev, "could not get IRQ %d\n",
client->irq);
- goto fail2;
+ //goto fail2;
}
+
+ printk("bh1770: irq ok, all done\n");
+ err = 0;
+
regulator_bulk_disable(ARRAY_SIZE(chip->regs), chip->regs);
return err;
fail2:
@@ -1393,10 +1414,18 @@ static const struct dev_pm_ops bh1770_pm_ops = {
SET_RUNTIME_PM_OPS(bh1770_runtime_suspend, bh1770_runtime_resume, NULL)
};

+#ifdef CONFIG_OF
+static const struct of_device_id bh1770_of_match_table[] = {
+ { .compatible = "bq27200" },
+};
+MODULE_DEVICE_TABLE(of, bh1770_of_match_table);
+#endif
+
static struct i2c_driver bh1770_driver = {
.driver = {
.name = "bh1770glc",
.pm = &bh1770_pm_ops,
+ .of_match_table = of_match_ptr(bh1770_of_match_table),
},
.probe = bh1770_probe,
.remove = bh1770_remove,


--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

Attachment: signature.asc
Description: Digital signature