diff mbox series

hwmon: (pmbus/tda38640) Add driver for Infineon TDA38640 Voltage Regulator

Message ID 20230124110111.3965317-1-Naresh.Solanki@9elements.com (mailing list archive)
State Superseded
Headers show
Series hwmon: (pmbus/tda38640) Add driver for Infineon TDA38640 Voltage Regulator | expand

Commit Message

Naresh Solanki Jan. 24, 2023, 11:01 a.m. UTC
From: Patrick Rudolph <patrick.rudolph@9elements.com>

Add the pmbus driver for the Infineon TDA38640 voltage regulator.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
---
 .../devicetree/bindings/trivial-devices.yaml  |  2 +
 drivers/hwmon/pmbus/Kconfig                   | 16 ++++
 drivers/hwmon/pmbus/Makefile                  |  1 +
 drivers/hwmon/pmbus/tda38640.c                | 78 +++++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 drivers/hwmon/pmbus/tda38640.c


base-commit: 4d891f76a30d3be4194a805c5e4277786140ef05

Comments

Krzysztof Kozlowski Jan. 24, 2023, 11:10 a.m. UTC | #1
On 24/01/2023 12:01, Naresh Solanki wrote:
> From: Patrick Rudolph <patrick.rudolph@9elements.com>
> 
> Add the pmbus driver for the Infineon TDA38640 voltage regulator.
> 
> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
> ---
>  .../devicetree/bindings/trivial-devices.yaml  |  2 +

Split bindings from driver code.

>  drivers/hwmon/pmbus/Kconfig                   | 16 ++++
>  drivers/hwmon/pmbus/Makefile                  |  1 +
>  drivers/hwmon/pmbus/tda38640.c                | 78 +++++++++++++++++++
>  4 files changed, 97 insertions(+)
>  create mode 100644 drivers/hwmon/pmbus/tda38640.c
> 
> diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
> index f5c0a6283e61..a28b02036489 100644
> --- a/Documentation/devicetree/bindings/trivial-devices.yaml
> +++ b/Documentation/devicetree/bindings/trivial-devices.yaml
> @@ -141,6 +141,8 @@ properties:
>            - infineon,slb9645tt
>              # Infineon SLB9673 I2C TPM 2.0
>            - infineon,slb9673
> +            # Infineon TDA38640 Voltage Regulator
> +          - infineon,tda38640
>              # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
>            - infineon,tlv493d-a1b6
>              # Infineon Multi-phase Digital VR Controller xdpe11280
> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
> index 30448e049486..9f4bbb9c487a 100644
> --- a/drivers/hwmon/pmbus/Kconfig
> +++ b/drivers/hwmon/pmbus/Kconfig
> @@ -395,6 +395,22 @@ config SENSORS_STPDDC60
>  	  This driver can also be built as a module. If so, the module will
>  	  be called stpddc60.
>  
> +config SENSORS_TDA38640
> +	tristate "Infineon TDA38640"
> +	help
> +	  If you say yes here you get hardware monitoring support for Infineon
> +	  TDA38640.
> +
> +	  This driver can also be built as a module. If so, the module will
> +	  be called tda38640.
> +
> +config SENSORS_TDA38640_REGULATOR
> +	bool "Regulator support for TDA38640 and compatibles"
> +	depends on SENSORS_TDA38640 && REGULATOR
> +	help
> +	  If you say yes here you get regulator support for Infineon
> +	  TDA38640 as regulator.

Drop entire option, why is it needed?

> +
>  config SENSORS_TPS40422
>  	tristate "TI TPS40422"
>  	help
> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
> index d9d2fa4bd6f7..3ae019916267 100644
> --- a/drivers/hwmon/pmbus/Makefile
> +++ b/drivers/hwmon/pmbus/Makefile
> @@ -40,6 +40,7 @@ obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
>  obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
>  obj-$(CONFIG_SENSORS_Q54SJ108A2)	+= q54sj108a2.o
>  obj-$(CONFIG_SENSORS_STPDDC60)	+= stpddc60.o
> +obj-$(CONFIG_SENSORS_TDA38640)	+= tda38640.o
>  obj-$(CONFIG_SENSORS_TPS40422)	+= tps40422.o
>  obj-$(CONFIG_SENSORS_TPS53679)	+= tps53679.o
>  obj-$(CONFIG_SENSORS_TPS546D24)	+= tps546d24.o
> diff --git a/drivers/hwmon/pmbus/tda38640.c b/drivers/hwmon/pmbus/tda38640.c
> new file mode 100644
> index 000000000000..31e17a936b8c
> --- /dev/null
> +++ b/drivers/hwmon/pmbus/tda38640.c
> @@ -0,0 +1,78 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Hardware monitoring driver for Infineon TDA38640
> + *
> + * Copyright (c) 2023 9elements GmbH
> + *
> + */
> +
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/regulator/driver.h>
> +#include "pmbus.h"
> +
> +#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
> +static const struct regulator_desc tda38640_reg_desc[] = {
> +	PMBUS_REGULATOR("vout", 0),
> +};
> +#endif /* CONFIG_SENSORS_TDA38640_REGULATOR */
> +
> +static struct pmbus_driver_info tda38640_info = {
> +	.pages = 1,
> +	.format[PSC_VOLTAGE_IN] = linear,
> +	.format[PSC_VOLTAGE_OUT] = linear,
> +	.format[PSC_CURRENT_OUT] = linear,
> +	.format[PSC_CURRENT_IN] = linear,
> +	.format[PSC_POWER] = linear,
> +	.format[PSC_TEMPERATURE] = linear,
> +
> +	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
> +	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
> +	    | PMBUS_HAVE_IIN
> +	    | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
> +	    | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
> +	    | PMBUS_HAVE_POUT | PMBUS_HAVE_PIN,
> +#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
> +	.num_regulators = 1,
> +	.reg_desc = tda38640_reg_desc,
> +#endif
> +};
> +
> +static int tda38640_probe(struct i2c_client *client)
> +{
> +	return pmbus_do_probe(client, &tda38640_info);
> +}
> +
> +static const struct i2c_device_id tda38640_id[] = {
> +	{"tda38640", 0},
> +	{}
> +};
> +

Drop blank line

> +MODULE_DEVICE_TABLE(i2c, tda38640_id);
> +
> +#ifdef CONFIG_OF

Drop ifdefs and use __maybe_unused

> +static const struct of_device_id tda38640_of_match[] = {
> +	{ .compatible = "infineon,tda38640"},
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(of, tda38640_of_match);

Where is it used? You miss the user.

> +#endif
> +
> +/* This is the driver that will be inserted */
> +static struct i2c_driver tda38640_driver = {
> +	.driver = {
> +		   .name = "tda38640",
> +		   },
> +	.probe_new = tda38640_probe,
> +	.id_table = tda38640_id,
> +};

Best regards,
Krzysztof
Naresh Solanki Jan. 24, 2023, 11:45 a.m. UTC | #2
Hi

On 24-01-2023 04:40 pm, Krzysztof Kozlowski wrote:
> On 24/01/2023 12:01, Naresh Solanki wrote:
>> From: Patrick Rudolph <patrick.rudolph@9elements.com>
>>
>> Add the pmbus driver for the Infineon TDA38640 voltage regulator.
>>
>> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
>> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
>> ---
>>   .../devicetree/bindings/trivial-devices.yaml  |  2 +
> 
> Split bindings from driver code.
Sure
> 
>>   drivers/hwmon/pmbus/Kconfig                   | 16 ++++
>>   drivers/hwmon/pmbus/Makefile                  |  1 +
>>   drivers/hwmon/pmbus/tda38640.c                | 78 +++++++++++++++++++
>>   4 files changed, 97 insertions(+)
>>   create mode 100644 drivers/hwmon/pmbus/tda38640.c
>>
>> diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
>> index f5c0a6283e61..a28b02036489 100644
>> --- a/Documentation/devicetree/bindings/trivial-devices.yaml
>> +++ b/Documentation/devicetree/bindings/trivial-devices.yaml
>> @@ -141,6 +141,8 @@ properties:
>>             - infineon,slb9645tt
>>               # Infineon SLB9673 I2C TPM 2.0
>>             - infineon,slb9673
>> +            # Infineon TDA38640 Voltage Regulator
>> +          - infineon,tda38640
>>               # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
>>             - infineon,tlv493d-a1b6
>>               # Infineon Multi-phase Digital VR Controller xdpe11280
>> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
>> index 30448e049486..9f4bbb9c487a 100644
>> --- a/drivers/hwmon/pmbus/Kconfig
>> +++ b/drivers/hwmon/pmbus/Kconfig
>> @@ -395,6 +395,22 @@ config SENSORS_STPDDC60
>>   	  This driver can also be built as a module. If so, the module will
>>   	  be called stpddc60.
>>   
>> +config SENSORS_TDA38640
>> +	tristate "Infineon TDA38640"
>> +	help
>> +	  If you say yes here you get hardware monitoring support for Infineon
>> +	  TDA38640.
>> +
>> +	  This driver can also be built as a module. If so, the module will
>> +	  be called tda38640.
>> +
>> +config SENSORS_TDA38640_REGULATOR
>> +	bool "Regulator support for TDA38640 and compatibles"
>> +	depends on SENSORS_TDA38640 && REGULATOR
>> +	help
>> +	  If you say yes here you get regulator support for Infineon
>> +	  TDA38640 as regulator.
> 
> Drop entire option, why is it needed?
You mean regulator option ?
This is how other pmbus regulator devices have provided option.
> 
>> +
>>   config SENSORS_TPS40422
>>   	tristate "TI TPS40422"
>>   	help
>> diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
>> index d9d2fa4bd6f7..3ae019916267 100644
>> --- a/drivers/hwmon/pmbus/Makefile
>> +++ b/drivers/hwmon/pmbus/Makefile
>> @@ -40,6 +40,7 @@ obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
>>   obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
>>   obj-$(CONFIG_SENSORS_Q54SJ108A2)	+= q54sj108a2.o
>>   obj-$(CONFIG_SENSORS_STPDDC60)	+= stpddc60.o
>> +obj-$(CONFIG_SENSORS_TDA38640)	+= tda38640.o
>>   obj-$(CONFIG_SENSORS_TPS40422)	+= tps40422.o
>>   obj-$(CONFIG_SENSORS_TPS53679)	+= tps53679.o
>>   obj-$(CONFIG_SENSORS_TPS546D24)	+= tps546d24.o
>> diff --git a/drivers/hwmon/pmbus/tda38640.c b/drivers/hwmon/pmbus/tda38640.c
>> new file mode 100644
>> index 000000000000..31e17a936b8c
>> --- /dev/null
>> +++ b/drivers/hwmon/pmbus/tda38640.c
>> @@ -0,0 +1,78 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Hardware monitoring driver for Infineon TDA38640
>> + *
>> + * Copyright (c) 2023 9elements GmbH
>> + *
>> + */
>> +
>> +#include <linux/err.h>
>> +#include <linux/i2c.h>
>> +#include <linux/init.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +#include <linux/regulator/driver.h>
>> +#include "pmbus.h"
>> +
>> +#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
>> +static const struct regulator_desc tda38640_reg_desc[] = {
>> +	PMBUS_REGULATOR("vout", 0),
>> +};
>> +#endif /* CONFIG_SENSORS_TDA38640_REGULATOR */
>> +
>> +static struct pmbus_driver_info tda38640_info = {
>> +	.pages = 1,
>> +	.format[PSC_VOLTAGE_IN] = linear,
>> +	.format[PSC_VOLTAGE_OUT] = linear,
>> +	.format[PSC_CURRENT_OUT] = linear,
>> +	.format[PSC_CURRENT_IN] = linear,
>> +	.format[PSC_POWER] = linear,
>> +	.format[PSC_TEMPERATURE] = linear,
>> +
>> +	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
>> +	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
>> +	    | PMBUS_HAVE_IIN
>> +	    | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
>> +	    | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
>> +	    | PMBUS_HAVE_POUT | PMBUS_HAVE_PIN,
>> +#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
>> +	.num_regulators = 1,
>> +	.reg_desc = tda38640_reg_desc,
>> +#endif
>> +};
>> +
>> +static int tda38640_probe(struct i2c_client *client)
>> +{
>> +	return pmbus_do_probe(client, &tda38640_info);
>> +}
>> +
>> +static const struct i2c_device_id tda38640_id[] = {
>> +	{"tda38640", 0},
>> +	{}
>> +};
>> +
> 
> Drop blank line
Sure
> 
>> +MODULE_DEVICE_TABLE(i2c, tda38640_id);
>> +
>> +#ifdef CONFIG_OF
> 
> Drop ifdefs and use __maybe_unused
> 
>> +static const struct of_device_id tda38640_of_match[] = {
>> +	{ .compatible = "infineon,tda38640"},
>> +	{ },
>> +};
>> +MODULE_DEVICE_TABLE(of, tda38640_of_match);
> 
> Where is it used? You miss the user.
I'm not sure if I get your question right.
This chip is used in sbp1 board to power CPU rails.
> 
>> +#endif
>> +
>> +/* This is the driver that will be inserted */
>> +static struct i2c_driver tda38640_driver = {
>> +	.driver = {
>> +		   .name = "tda38640",
>> +		   },
>> +	.probe_new = tda38640_probe,
>> +	.id_table = tda38640_id,
>> +};
> 
> Best regards,
> Krzysztof
> 

Best regards,
Naresh
Krzysztof Kozlowski Jan. 24, 2023, 12:05 p.m. UTC | #3
On 24/01/2023 12:45, Naresh Solanki wrote:
> Hi
> 
> On 24-01-2023 04:40 pm, Krzysztof Kozlowski wrote:
>> On 24/01/2023 12:01, Naresh Solanki wrote:
>>> From: Patrick Rudolph <patrick.rudolph@9elements.com>
>>>
>>> Add the pmbus driver for the Infineon TDA38640 voltage regulator.
>>>
>>> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
>>> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
>>> ---
>>>   .../devicetree/bindings/trivial-devices.yaml  |  2 +
>>
>> Split bindings from driver code.
> Sure
>>
>>>   drivers/hwmon/pmbus/Kconfig                   | 16 ++++
>>>   drivers/hwmon/pmbus/Makefile                  |  1 +
>>>   drivers/hwmon/pmbus/tda38640.c                | 78 +++++++++++++++++++
>>>   4 files changed, 97 insertions(+)
>>>   create mode 100644 drivers/hwmon/pmbus/tda38640.c
>>>
>>> diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
>>> index f5c0a6283e61..a28b02036489 100644
>>> --- a/Documentation/devicetree/bindings/trivial-devices.yaml
>>> +++ b/Documentation/devicetree/bindings/trivial-devices.yaml
>>> @@ -141,6 +141,8 @@ properties:
>>>             - infineon,slb9645tt
>>>               # Infineon SLB9673 I2C TPM 2.0
>>>             - infineon,slb9673
>>> +            # Infineon TDA38640 Voltage Regulator
>>> +          - infineon,tda38640
>>>               # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
>>>             - infineon,tlv493d-a1b6
>>>               # Infineon Multi-phase Digital VR Controller xdpe11280
>>> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
>>> index 30448e049486..9f4bbb9c487a 100644
>>> --- a/drivers/hwmon/pmbus/Kconfig
>>> +++ b/drivers/hwmon/pmbus/Kconfig
>>> @@ -395,6 +395,22 @@ config SENSORS_STPDDC60
>>>   	  This driver can also be built as a module. If so, the module will
>>>   	  be called stpddc60.
>>>   
>>> +config SENSORS_TDA38640
>>> +	tristate "Infineon TDA38640"
>>> +	help
>>> +	  If you say yes here you get hardware monitoring support for Infineon
>>> +	  TDA38640.
>>> +
>>> +	  This driver can also be built as a module. If so, the module will
>>> +	  be called tda38640.
>>> +
>>> +config SENSORS_TDA38640_REGULATOR
>>> +	bool "Regulator support for TDA38640 and compatibles"
>>> +	depends on SENSORS_TDA38640 && REGULATOR
>>> +	help
>>> +	  If you say yes here you get regulator support for Infineon
>>> +	  TDA38640 as regulator.
>>
>> Drop entire option, why is it needed?
> You mean regulator option ?
> This is how other pmbus regulator devices have provided option.

Hmmm... I wonder why this is of any use.

>>
>>> +
>>>   config SENSORS_TPS40422
>>>   	tristate "TI TPS40422"
>>>   	help

(...)

>>
>>> +static const struct of_device_id tda38640_of_match[] = {
>>> +	{ .compatible = "infineon,tda38640"},
>>> +	{ },
>>> +};
>>> +MODULE_DEVICE_TABLE(of, tda38640_of_match);
>>
>> Where is it used? You miss the user.
> I'm not sure if I get your question right.
> This chip is used in sbp1 board to power CPU rails.

No, where is the data structure used (except module autoloading)?

Best regards,
Krzysztof
Naresh Solanki Jan. 24, 2023, 12:19 p.m. UTC | #4
Hi

On 24-01-2023 05:35 pm, Krzysztof Kozlowski wrote:
> On 24/01/2023 12:45, Naresh Solanki wrote:
>> Hi
>>
>> On 24-01-2023 04:40 pm, Krzysztof Kozlowski wrote:
>>> On 24/01/2023 12:01, Naresh Solanki wrote:
>>>> From: Patrick Rudolph <patrick.rudolph@9elements.com>
>>>>
>>>> Add the pmbus driver for the Infineon TDA38640 voltage regulator.
>>>>
>>>> Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
>>>> Signed-off-by: Naresh Solanki <Naresh.Solanki@9elements.com>
>>>> ---
>>>>    .../devicetree/bindings/trivial-devices.yaml  |  2 +
>>>
>>> Split bindings from driver code.
>> Sure
>>>
>>>>    drivers/hwmon/pmbus/Kconfig                   | 16 ++++
>>>>    drivers/hwmon/pmbus/Makefile                  |  1 +
>>>>    drivers/hwmon/pmbus/tda38640.c                | 78 +++++++++++++++++++
>>>>    4 files changed, 97 insertions(+)
>>>>    create mode 100644 drivers/hwmon/pmbus/tda38640.c
>>>>
>>>> diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
>>>> index f5c0a6283e61..a28b02036489 100644
>>>> --- a/Documentation/devicetree/bindings/trivial-devices.yaml
>>>> +++ b/Documentation/devicetree/bindings/trivial-devices.yaml
>>>> @@ -141,6 +141,8 @@ properties:
>>>>              - infineon,slb9645tt
>>>>                # Infineon SLB9673 I2C TPM 2.0
>>>>              - infineon,slb9673
>>>> +            # Infineon TDA38640 Voltage Regulator
>>>> +          - infineon,tda38640
>>>>                # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
>>>>              - infineon,tlv493d-a1b6
>>>>                # Infineon Multi-phase Digital VR Controller xdpe11280
>>>> diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
>>>> index 30448e049486..9f4bbb9c487a 100644
>>>> --- a/drivers/hwmon/pmbus/Kconfig
>>>> +++ b/drivers/hwmon/pmbus/Kconfig
>>>> @@ -395,6 +395,22 @@ config SENSORS_STPDDC60
>>>>    	  This driver can also be built as a module. If so, the module will
>>>>    	  be called stpddc60.
>>>>    
>>>> +config SENSORS_TDA38640
>>>> +	tristate "Infineon TDA38640"
>>>> +	help
>>>> +	  If you say yes here you get hardware monitoring support for Infineon
>>>> +	  TDA38640.
>>>> +
>>>> +	  This driver can also be built as a module. If so, the module will
>>>> +	  be called tda38640.
>>>> +
>>>> +config SENSORS_TDA38640_REGULATOR
>>>> +	bool "Regulator support for TDA38640 and compatibles"
>>>> +	depends on SENSORS_TDA38640 && REGULATOR
>>>> +	help
>>>> +	  If you say yes here you get regulator support for Infineon
>>>> +	  TDA38640 as regulator.
>>>
>>> Drop entire option, why is it needed?
>> You mean regulator option ?
>> This is how other pmbus regulator devices have provided option.
> 
> Hmmm... I wonder why this is of any use.
 From what I can think of. Chip also provide pin to control regulator 
enable. If that is used in the design then the regulator option may not 
be needed.
> 
>>>
>>>> +
>>>>    config SENSORS_TPS40422
>>>>    	tristate "TI TPS40422"
>>>>    	help
> 
> (...)
Yes this doesn't has regulator support in driver.
> 
>>>
>>>> +static const struct of_device_id tda38640_of_match[] = {
>>>> +	{ .compatible = "infineon,tda38640"},
>>>> +	{ },
>>>> +};
>>>> +MODULE_DEVICE_TABLE(of, tda38640_of_match);
>>>
>>> Where is it used? You miss the user.
>> I'm not sure if I get your question right.
>> This chip is used in sbp1 board to power CPU rails.
> 
> No, where is the data structure used (except module autoloading)?
My use case is loading the driver base on DT. Not sure of other uses.
> 
> Best regards,
> Krzysztof
> 
Best Regards,
Naresh
Krzysztof Kozlowski Jan. 24, 2023, 12:23 p.m. UTC | #5
On 24/01/2023 13:19, Naresh Solanki wrote:
>>>>
>>>>> +static const struct of_device_id tda38640_of_match[] = {
>>>>> +	{ .compatible = "infineon,tda38640"},
>>>>> +	{ },
>>>>> +};
>>>>> +MODULE_DEVICE_TABLE(of, tda38640_of_match);
>>>>
>>>> Where is it used? You miss the user.
>>> I'm not sure if I get your question right.
>>> This chip is used in sbp1 board to power CPU rails.
>>
>> No, where is the data structure used (except module autoloading)?
> My use case is loading the driver base on DT. Not sure of other uses.

Where is it used in the code?

Best regards,
Krzysztof
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Documentation/devicetree/bindings/trivial-devices.yaml
index f5c0a6283e61..a28b02036489 100644
--- a/Documentation/devicetree/bindings/trivial-devices.yaml
+++ b/Documentation/devicetree/bindings/trivial-devices.yaml
@@ -141,6 +141,8 @@  properties:
           - infineon,slb9645tt
             # Infineon SLB9673 I2C TPM 2.0
           - infineon,slb9673
+            # Infineon TDA38640 Voltage Regulator
+          - infineon,tda38640
             # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
           - infineon,tlv493d-a1b6
             # Infineon Multi-phase Digital VR Controller xdpe11280
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 30448e049486..9f4bbb9c487a 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -395,6 +395,22 @@  config SENSORS_STPDDC60
 	  This driver can also be built as a module. If so, the module will
 	  be called stpddc60.
 
+config SENSORS_TDA38640
+	tristate "Infineon TDA38640"
+	help
+	  If you say yes here you get hardware monitoring support for Infineon
+	  TDA38640.
+
+	  This driver can also be built as a module. If so, the module will
+	  be called tda38640.
+
+config SENSORS_TDA38640_REGULATOR
+	bool "Regulator support for TDA38640 and compatibles"
+	depends on SENSORS_TDA38640 && REGULATOR
+	help
+	  If you say yes here you get regulator support for Infineon
+	  TDA38640 as regulator.
+
 config SENSORS_TPS40422
 	tristate "TI TPS40422"
 	help
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index d9d2fa4bd6f7..3ae019916267 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -40,6 +40,7 @@  obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
 obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
 obj-$(CONFIG_SENSORS_Q54SJ108A2)	+= q54sj108a2.o
 obj-$(CONFIG_SENSORS_STPDDC60)	+= stpddc60.o
+obj-$(CONFIG_SENSORS_TDA38640)	+= tda38640.o
 obj-$(CONFIG_SENSORS_TPS40422)	+= tps40422.o
 obj-$(CONFIG_SENSORS_TPS53679)	+= tps53679.o
 obj-$(CONFIG_SENSORS_TPS546D24)	+= tps546d24.o
diff --git a/drivers/hwmon/pmbus/tda38640.c b/drivers/hwmon/pmbus/tda38640.c
new file mode 100644
index 000000000000..31e17a936b8c
--- /dev/null
+++ b/drivers/hwmon/pmbus/tda38640.c
@@ -0,0 +1,78 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Hardware monitoring driver for Infineon TDA38640
+ *
+ * Copyright (c) 2023 9elements GmbH
+ *
+ */
+
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/regulator/driver.h>
+#include "pmbus.h"
+
+#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
+static const struct regulator_desc tda38640_reg_desc[] = {
+	PMBUS_REGULATOR("vout", 0),
+};
+#endif /* CONFIG_SENSORS_TDA38640_REGULATOR */
+
+static struct pmbus_driver_info tda38640_info = {
+	.pages = 1,
+	.format[PSC_VOLTAGE_IN] = linear,
+	.format[PSC_VOLTAGE_OUT] = linear,
+	.format[PSC_CURRENT_OUT] = linear,
+	.format[PSC_CURRENT_IN] = linear,
+	.format[PSC_POWER] = linear,
+	.format[PSC_TEMPERATURE] = linear,
+
+	.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
+	    | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
+	    | PMBUS_HAVE_IIN
+	    | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
+	    | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
+	    | PMBUS_HAVE_POUT | PMBUS_HAVE_PIN,
+#if IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR)
+	.num_regulators = 1,
+	.reg_desc = tda38640_reg_desc,
+#endif
+};
+
+static int tda38640_probe(struct i2c_client *client)
+{
+	return pmbus_do_probe(client, &tda38640_info);
+}
+
+static const struct i2c_device_id tda38640_id[] = {
+	{"tda38640", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(i2c, tda38640_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id tda38640_of_match[] = {
+	{ .compatible = "infineon,tda38640"},
+	{ },
+};
+MODULE_DEVICE_TABLE(of, tda38640_of_match);
+#endif
+
+/* This is the driver that will be inserted */
+static struct i2c_driver tda38640_driver = {
+	.driver = {
+		   .name = "tda38640",
+		   },
+	.probe_new = tda38640_probe,
+	.id_table = tda38640_id,
+};
+
+module_i2c_driver(tda38640_driver);
+
+MODULE_AUTHOR("Patrick Rudolph <patrick.rudolph@9elements.com>");
+MODULE_DESCRIPTION("PMBus driver for Infineon TDA38640");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(PMBUS);