diff mbox series

[v1,2/2] misc: adps990x: convert to OF

Message ID 20230731110239.107086-3-clamor95@gmail.com (mailing list archive)
State Changes Requested
Headers show
Series Update APDS990x ALS to support device trees | expand

Commit Message

Svyatoslav Ryhel July 31, 2023, 11:02 a.m. UTC
Add ability to use device tree bindings keeping existing setup.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 drivers/misc/apds990x.c | 55 +++++++++++++++++++++++++++++++++++------
 1 file changed, 48 insertions(+), 7 deletions(-)

Comments

Arnd Bergmann July 31, 2023, 1:18 p.m. UTC | #1
On Mon, Jul 31, 2023, at 13:02, Svyatoslav Ryhel wrote:
> Add ability to use device tree bindings keeping existing setup.

I see that there are no more in-tree users of the old
apds990x_platform_data, so I think it would be best to completely
remove that codepath and merge that structure into struct
apds990x_chip, to simplify the probing and avoid the extra
allocation.

   Arnd
Svyatoslav Ryhel July 31, 2023, 2:58 p.m. UTC | #2
31 липня 2023 р. 16:18:16 GMT+03:00, Arnd Bergmann <arnd@arndb.de> написав(-ла):
>On Mon, Jul 31, 2023, at 13:02, Svyatoslav Ryhel wrote:
>> Add ability to use device tree bindings keeping existing setup.
>
>I see that there are no more in-tree users of the old
>apds990x_platform_data, so I think it would be best to completely
>remove that codepath and merge that structure into struct
>apds990x_chip, to simplify the probing and avoid the extra
>allocation.

Thank you very much for your review, but is it mandatory to drop pdata in this particular patch set? To be honest this driver needs serious upgrades and refactoring, and I have no dedication to invest my time into refactoring it, moreover, I am not a maintainer of this driver, nor a full time kernel maintainer of any kind. I am doing what I am doing only because one of my devices uses this als but it is not something crucial.

Best regards,
Svyatoslav R.

>   Arnd
Arnd Bergmann July 31, 2023, 3:38 p.m. UTC | #3
On Mon, Jul 31, 2023, at 16:58, Svyatoslav Ryhel wrote:
> 31 липня 2023 р. 16:18:16 GMT+03:00, Arnd Bergmann <arnd@arndb.de> написав(-ла):
>>On Mon, Jul 31, 2023, at 13:02, Svyatoslav Ryhel wrote:
>>> Add ability to use device tree bindings keeping existing setup.
>>
>>I see that there are no more in-tree users of the old
>>apds990x_platform_data, so I think it would be best to completely
>>remove that codepath and merge that structure into struct
>>apds990x_chip, to simplify the probing and avoid the extra
>>allocation.
>
> Thank you very much for your review, but is it mandatory to drop pdata 
> in this particular patch set? To be honest this driver needs serious 
> upgrades and refactoring, and I have no dedication to invest my time 
> into refactoring it, moreover, I am not a maintainer of this driver, 
> nor a full time kernel maintainer of any kind. I am doing what I am 
> doing only because one of my devices uses this als but it is not 
> something crucial.

We have a lot of drivers that are lacking the cleanup I'm asking
for, so I don't think I'd mandate it at this point, but I don't
actually expect the patch to be any more complicated in the end,
so just try it out.

I think at the minimum, please remove the include/platform_data
header and move the contents into the driver itself, I'd be fine
with that. If you can easily do further cleanup by dropping
the separate allocation and folding the apds990x_fw_probe()
function back into apds990x_probe(), please do that, just stop
at the point where you feel it gets too complicated.

    Arnd
Jonathan Cameron Aug. 1, 2023, 6:10 p.m. UTC | #4
On Mon, 31 Jul 2023 17:38:59 +0200
"Arnd Bergmann" <arnd@arndb.de> wrote:

> On Mon, Jul 31, 2023, at 16:58, Svyatoslav Ryhel wrote:
> > 31 липня 2023 р. 16:18:16 GMT+03:00, Arnd Bergmann <arnd@arndb.de> написав(-ла):  
> >>On Mon, Jul 31, 2023, at 13:02, Svyatoslav Ryhel wrote:  
> >>> Add ability to use device tree bindings keeping existing setup.  
> >>
> >>I see that there are no more in-tree users of the old
> >>apds990x_platform_data, so I think it would be best to completely
> >>remove that codepath and merge that structure into struct
> >>apds990x_chip, to simplify the probing and avoid the extra
> >>allocation.  
> >
> > Thank you very much for your review, but is it mandatory to drop pdata 
> > in this particular patch set? To be honest this driver needs serious 
> > upgrades and refactoring, and I have no dedication to invest my time 
> > into refactoring it, moreover, I am not a maintainer of this driver, 
> > nor a full time kernel maintainer of any kind. I am doing what I am 
> > doing only because one of my devices uses this als but it is not 
> > something crucial.  
> 
> We have a lot of drivers that are lacking the cleanup I'm asking
> for, so I don't think I'd mandate it at this point, but I don't
> actually expect the patch to be any more complicated in the end,
> so just try it out.
> 
> I think at the minimum, please remove the include/platform_data
> header and move the contents into the driver itself, I'd be fine
> with that. If you can easily do further cleanup by dropping
> the separate allocation and folding the apds990x_fw_probe()
> function back into apds990x_probe(), please do that, just stop
> at the point where you feel it gets too complicated.
> 

It's a long shot, but this looks pretty close in register map to
the apds9960 in IIO.

Maybe try adding the ID to that driver and cross your fingers?

There is some stuff going on around the register address / commands
that I haven't figured out but it looks similar for the byte access
path and that may be all the IIO driver is using.

If you are fine testing, it's possible someone else might do the
leg work (if me I'll emulate just enough to convince myself I didn't
break it too badly). Won't be high on my list, but maybe I'll get
a boring wet weekend sometime...

Jonathan

>     Arnd
Svyatoslav Ryhel Aug. 1, 2023, 6:13 p.m. UTC | #5
1 серпня 2023 р. 21:10:26 GMT+03:00, Jonathan Cameron <jic23@kernel.org> написав(-ла):
>On Mon, 31 Jul 2023 17:38:59 +0200
>"Arnd Bergmann" <arnd@arndb.de> wrote:
>
>> On Mon, Jul 31, 2023, at 16:58, Svyatoslav Ryhel wrote:
>> > 31 липня 2023 р. 16:18:16 GMT+03:00, Arnd Bergmann <arnd@arndb.de> написав(-ла):  
>> >>On Mon, Jul 31, 2023, at 13:02, Svyatoslav Ryhel wrote:  
>> >>> Add ability to use device tree bindings keeping existing setup.  
>> >>
>> >>I see that there are no more in-tree users of the old
>> >>apds990x_platform_data, so I think it would be best to completely
>> >>remove that codepath and merge that structure into struct
>> >>apds990x_chip, to simplify the probing and avoid the extra
>> >>allocation.  
>> >
>> > Thank you very much for your review, but is it mandatory to drop pdata 
>> > in this particular patch set? To be honest this driver needs serious 
>> > upgrades and refactoring, and I have no dedication to invest my time 
>> > into refactoring it, moreover, I am not a maintainer of this driver, 
>> > nor a full time kernel maintainer of any kind. I am doing what I am 
>> > doing only because one of my devices uses this als but it is not 
>> > something crucial.  
>> 
>> We have a lot of drivers that are lacking the cleanup I'm asking
>> for, so I don't think I'd mandate it at this point, but I don't
>> actually expect the patch to be any more complicated in the end,
>> so just try it out.
>> 
>> I think at the minimum, please remove the include/platform_data
>> header and move the contents into the driver itself, I'd be fine
>> with that. If you can easily do further cleanup by dropping
>> the separate allocation and folding the apds990x_fw_probe()
>> function back into apds990x_probe(), please do that, just stop
>> at the point where you feel it gets too complicated.
>> 
>
>It's a long shot, but this looks pretty close in register map to
>the apds9960 in IIO.
>
>Maybe try adding the ID to that driver and cross your fingers?

If you pay me for a broken phone or repair if smth goes wrong, sure, why not.

>There is some stuff going on around the register address / commands
>that I haven't figured out but it looks similar for the byte access
>path and that may be all the IIO driver is using.
>
>If you are fine testing, it's possible someone else might do the
>leg work (if me I'll emulate just enough to convince myself I didn't
>break it too badly). Won't be high on my list, but maybe I'll get
>a boring wet weekend sometime...
>
>Jonathan
>
>>     Arnd
>
diff mbox series

Patch

diff --git a/drivers/misc/apds990x.c b/drivers/misc/apds990x.c
index 0024503ea6db..cf56d68c938a 100644
--- a/drivers/misc/apds990x.c
+++ b/drivers/misc/apds990x.c
@@ -1051,6 +1051,37 @@  static const struct attribute_group apds990x_attribute_group[] = {
 	{.attrs = sysfs_attrs_ctrl },
 };
 
+static int apds990x_fw_probe(struct i2c_client *client,
+			     struct apds990x_chip *chip)
+{
+	struct apds990x_platform_data *pdata;
+	u32 ret, val;
+
+	pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata)
+		return -ENOMEM;
+
+	ret = device_property_read_u32(&client->dev, "avago,pdrive", &val);
+	if (ret)
+		return dev_err_probe(&client->dev, ret,
+				     "pdrive property is missing\n");
+	pdata->pdrive = val;
+
+	ret = device_property_read_u32(&client->dev, "avago,ppcount", &val);
+	if (ret)
+		return dev_err_probe(&client->dev, ret,
+				     "ppcount property is missing\n");
+	pdata->ppcount = val;
+
+	chip->pdata = pdata;
+
+	/* set regulator names which fit device tree entries */
+	chip->regs[0].supply = "vdd";
+	chip->regs[1].supply = "vled";
+
+	return 0;
+}
+
 static int apds990x_probe(struct i2c_client *client)
 {
 	struct apds990x_chip *chip;
@@ -1065,12 +1096,12 @@  static int apds990x_probe(struct i2c_client *client)
 
 	init_waitqueue_head(&chip->wait);
 	mutex_init(&chip->mutex);
-	chip->pdata	= client->dev.platform_data;
 
-	if (chip->pdata == NULL) {
-		dev_err(&client->dev, "platform data is mandatory\n");
-		err = -EINVAL;
-		goto fail1;
+	chip->pdata = client->dev.platform_data;
+	if (!chip->pdata) {
+		err = apds990x_fw_probe(client, chip);
+		if (err)
+			return err;
 	}
 
 	if (chip->pdata->cf.ga == 0) {
@@ -1111,8 +1142,11 @@  static int apds990x_probe(struct i2c_client *client)
 	chip->prox_persistence = APDS_DEFAULT_PROX_PERS;
 	chip->prox_continuous_mode = false;
 
-	chip->regs[0].supply = reg_vcc;
-	chip->regs[1].supply = reg_vled;
+	if (!chip->regs[0].supply)
+		chip->regs[0].supply = reg_vcc;
+
+	if (!chip->regs[1].supply)
+		chip->regs[1].supply = reg_vled;
 
 	err = regulator_bulk_get(&client->dev,
 				 ARRAY_SIZE(chip->regs), chip->regs);
@@ -1252,6 +1286,12 @@  static int apds990x_runtime_resume(struct device *dev)
 
 #endif
 
+static const struct of_device_id apds990x_match_table[] = {
+	{ .compatible = "avago,apds990x" },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, apds990x_match_table);
+
 static const struct i2c_device_id apds990x_id[] = {
 	{"apds990x", 0 },
 	{}
@@ -1270,6 +1310,7 @@  static struct i2c_driver apds990x_driver = {
 	.driver	 = {
 		.name	= "apds990x",
 		.pm	= &apds990x_pm_ops,
+		.of_match_table = apds990x_match_table,
 	},
 	.probe_new = apds990x_probe,
 	.remove	  = apds990x_remove,