From: Pavel Machek <pavel@ucw.cz> To: pali.rohar@gmail.com, sre@kernel.org, "kernel list" <linux-kernel@vger.kernel.org>, linux-arm-kernel <linux-arm-kernel@lists.infradead.org>, linux-omap@vger.kernel.org, tony@atomide.com, khilman@kernel.org, aaro.koskinen@iki.fi, ivo.g.dimitrov.75@gmail.com, patrikbachan@gmail.com, serge@hallyn.com, abcloriens@gmail.com, clayton@craftyguy.net, martijn@brixit.nl, sakari.ailus@linux.intel.com, arnd@arndb.de, "Filip Matijević" <filip.matijevic.pz@gmail.com> Subject: bh1770 hacks: get it to work on n950 Date: Thu, 16 Nov 2017 12:57:03 +0100 [thread overview] Message-ID: <20171116115703.GA26735@amd> (raw) [-- Attachment #1: Type: text/plain, Size: 5018 bytes --] Hi! Ok, not for application, but I can get light sensor to work. Signed-off-by: Pavel Machek <pavel@ucw.cz> 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 #2: Digital signature --] [-- Type: application/pgp-signature, Size: 181 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: pavel@ucw.cz (Pavel Machek) To: linux-arm-kernel@lists.infradead.org Subject: bh1770 hacks: get it to work on n950 Date: Thu, 16 Nov 2017 12:57:03 +0100 [thread overview] Message-ID: <20171116115703.GA26735@amd> (raw) Hi! Ok, not for application, but I can get light sensor to work. Signed-off-by: Pavel Machek <pavel@ucw.cz> 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 at 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 at 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 -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171116/6fc4da15/attachment.sig>
next reply other threads:[~2017-11-16 11:57 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-11-16 11:57 Pavel Machek [this message] 2017-11-16 11:57 ` bh1770 hacks: get it to work on n950 Pavel Machek 2017-11-17 11:35 ` Sebastian Reichel 2017-11-17 11:35 ` Sebastian Reichel 2017-11-19 12:41 ` Pavel Machek 2017-11-19 12:41 ` Pavel Machek 2017-11-19 14:12 ` Ladislav Michl 2017-11-19 14:12 ` Ladislav Michl 2017-11-19 15:07 ` Pavel Machek 2017-11-19 15:07 ` Pavel Machek 2017-11-19 21:10 ` Sebastian Reichel 2017-11-19 21:10 ` Sebastian Reichel
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20171116115703.GA26735@amd \ --to=pavel@ucw.cz \ --cc=aaro.koskinen@iki.fi \ --cc=abcloriens@gmail.com \ --cc=arnd@arndb.de \ --cc=clayton@craftyguy.net \ --cc=filip.matijevic.pz@gmail.com \ --cc=ivo.g.dimitrov.75@gmail.com \ --cc=khilman@kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-omap@vger.kernel.org \ --cc=martijn@brixit.nl \ --cc=pali.rohar@gmail.com \ --cc=patrikbachan@gmail.com \ --cc=sakari.ailus@linux.intel.com \ --cc=serge@hallyn.com \ --cc=sre@kernel.org \ --cc=tony@atomide.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.