Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, 11 Jul 2018 09:00:07 -0400 Brian Masney wrote: > On Wed, Jul 11, 2018 at 12:29:33PM +, Jean-Baptiste Maneyrol wrote: > > Hello, > > > > I really don't like the idea to have regulator handled inside the > > driver. I know this was done like that before for Nexus 5, but I > > think now this is something that can be done using dts only. Does > > anyone know if there is a way with dts to handle regulator > > automatically and prevent the use in the driver? That would be a > > good idea to search how this handled for other drivers. > > > > Anyway, you are enforcing regulator use in your code. It doesn't > > seem the code will work when there is no regulator declared in the > > dts, which is the case for the majority of configurations. We > > should at least make it optional. > > > > Thanks for the contribution. > > My understanding of devm_regulator_get_optional() is that a stub > regulator will be returned if one is not configured. See the comment > above regulator_get_optional() for where I got this information. > > https://elixir.bootlin.com/linux/v4.17/source/drivers/regulator/core.c#L1750 Quite the opposite (though the text is perhaps less than crystal clear) - reread that comment really carefully. * This is intended for use by consumers for devices which can have * some supplies unconnected in normal use, such as some MMC devices. * It can allow the regulator core to provide stub supplies for other * supplies requested using normal regulator_get() calls without * disrupting the operation of drivers that can handle absent * supplies. So in it allows normal path (non "optional") one to return stubs, but when optional versions are used, it will return an error if they aren't there - thus letting the driver decide what to do about it. > > I agree that it would be better if this could be handled exclusively in > dts if possible, although I'm not sure how. I looked at other drivers > and commits from the last year or so and this appears to be the current > recommended approach. I'm open to other approaches to doing this. In the general case it is very hard to do. Many devices have fairly complex regulator setups and need to enable them in particular orders and can power down subsets etc. The case here of just providing a power supply is very simplistic and it may well be that down the line we want to do finer grained control in the driver. Only a driver can know what the effect of turning a particular power supply to a device off actually is. Jonathan > > Brian > > > > > > > > From: Brian Masney > > Sent: Wednesday, July 11, 2018 03:09 > > To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; > > andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; > > devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; > > linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org > > Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; > > l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; > > fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; > > masn...@onstation.org > > Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework > > > > > > CAUTION: This email originated from outside of the organization. Please > > make sure the sender is who they say they are and do not click links or > > open attachments unless you recognize the sender and know the content is > > safe. > > > > > > This patch adds support for the regulator framework to the mpu6050 > > driver. > > > > Signed-off-by: Brian Masney > > Signed-off-by: Jonathan Marek > > --- > > This is a variation of Jonathan Marek's patch from postmarketOS > > https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 > > with the following changes: > > > > - Stripped out 6515 variant code. (See my previous patch in this series) > > - Add the regulator to the mpu core instead of only the i2c variant. > > - Add error handling. > > - Release the regulator on suspend, device remove, etc. > > - Device tree documentation. > > > > .../bindings/iio/imu/inv_mpu6050.txt | 1 + > > drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- > > drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- > > drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + > > drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ > > 5 files changed, 66 insertions(+), 6 deletions(-) > > > > diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > > b/Document
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, 11 Jul 2018 09:00:07 -0400 Brian Masney wrote: > On Wed, Jul 11, 2018 at 12:29:33PM +, Jean-Baptiste Maneyrol wrote: > > Hello, > > > > I really don't like the idea to have regulator handled inside the > > driver. I know this was done like that before for Nexus 5, but I > > think now this is something that can be done using dts only. Does > > anyone know if there is a way with dts to handle regulator > > automatically and prevent the use in the driver? That would be a > > good idea to search how this handled for other drivers. > > > > Anyway, you are enforcing regulator use in your code. It doesn't > > seem the code will work when there is no regulator declared in the > > dts, which is the case for the majority of configurations. We > > should at least make it optional. > > > > Thanks for the contribution. > > My understanding of devm_regulator_get_optional() is that a stub > regulator will be returned if one is not configured. See the comment > above regulator_get_optional() for where I got this information. > > https://elixir.bootlin.com/linux/v4.17/source/drivers/regulator/core.c#L1750 Quite the opposite (though the text is perhaps less than crystal clear) - reread that comment really carefully. * This is intended for use by consumers for devices which can have * some supplies unconnected in normal use, such as some MMC devices. * It can allow the regulator core to provide stub supplies for other * supplies requested using normal regulator_get() calls without * disrupting the operation of drivers that can handle absent * supplies. So in it allows normal path (non "optional") one to return stubs, but when optional versions are used, it will return an error if they aren't there - thus letting the driver decide what to do about it. > > I agree that it would be better if this could be handled exclusively in > dts if possible, although I'm not sure how. I looked at other drivers > and commits from the last year or so and this appears to be the current > recommended approach. I'm open to other approaches to doing this. In the general case it is very hard to do. Many devices have fairly complex regulator setups and need to enable them in particular orders and can power down subsets etc. The case here of just providing a power supply is very simplistic and it may well be that down the line we want to do finer grained control in the driver. Only a driver can know what the effect of turning a particular power supply to a device off actually is. Jonathan > > Brian > > > > > > > > From: Brian Masney > > Sent: Wednesday, July 11, 2018 03:09 > > To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; > > andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; > > devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; > > linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org > > Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; > > l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; > > fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; > > masn...@onstation.org > > Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework > > > > > > CAUTION: This email originated from outside of the organization. Please > > make sure the sender is who they say they are and do not click links or > > open attachments unless you recognize the sender and know the content is > > safe. > > > > > > This patch adds support for the regulator framework to the mpu6050 > > driver. > > > > Signed-off-by: Brian Masney > > Signed-off-by: Jonathan Marek > > --- > > This is a variation of Jonathan Marek's patch from postmarketOS > > https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 > > with the following changes: > > > > - Stripped out 6515 variant code. (See my previous patch in this series) > > - Add the regulator to the mpu core instead of only the i2c variant. > > - Add error handling. > > - Release the regulator on suspend, device remove, etc. > > - Device tree documentation. > > > > .../bindings/iio/imu/inv_mpu6050.txt | 1 + > > drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- > > drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- > > drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + > > drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ > > 5 files changed, 66 insertions(+), 6 deletions(-) > > > > diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > > b/Document
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 12:29:33PM +, Jean-Baptiste Maneyrol wrote: > Hello, > > I really don't like the idea to have regulator handled inside the driver. I > know this was done like that before for Nexus 5, but I think now this is > something that can be done using dts only. > Does anyone know if there is a way with dts to handle regulator automatically > and prevent the use in the driver? That would be a good idea to search how > this handled for other drivers. > > Anyway, you are enforcing regulator use in your code. It doesn't seem the > code will work when there is no regulator declared in the dts, which is the > case for the majority of configurations. We should at least make it optional. > > Thanks for the contribution. My understanding of devm_regulator_get_optional() is that a stub regulator will be returned if one is not configured. See the comment above regulator_get_optional() for where I got this information. https://elixir.bootlin.com/linux/v4.17/source/drivers/regulator/core.c#L1750 I agree that it would be better if this could be handled exclusively in dts if possible, although I'm not sure how. I looked at other drivers and commits from the last year or so and this appears to be the current recommended approach. I'm open to other approaches to doing this. Brian > > > From: Brian Masney > Sent: Wednesday, July 11, 2018 03:09 > To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; > andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; > devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org > Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; > l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; > fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; > masn...@onstation.org > Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework > > > CAUTION: This email originated from outside of the organization. Please make > sure the sender is who they say they are and do not click links or open > attachments unless you recognize the sender and know the content is safe. > > > This patch adds support for the regulator framework to the mpu6050 > driver. > > Signed-off-by: Brian Masney > Signed-off-by: Jonathan Marek > --- > This is a variation of Jonathan Marek's patch from postmarketOS > https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 > with the following changes: > > - Stripped out 6515 variant code. (See my previous patch in this series) > - Add the regulator to the mpu core instead of only the i2c variant. > - Add error handling. > - Release the regulator on suspend, device remove, etc. > - Device tree documentation. > > .../bindings/iio/imu/inv_mpu6050.txt | 1 + > drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- > drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- > drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + > drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ > 5 files changed, 66 insertions(+), 6 deletions(-) > > diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > index b7def51c8ad9..d39907b12a46 100644 > --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > @@ -21,6 +21,7 @@ Required properties: > bindings. > > Optional properties: > + - vddio-supply: regulator phandle for VDDIO supply > - mount-matrix: an optional 3x3 mounting rotation matrix > - i2c-gate node. These devices also support an auxiliary i2c bus. This is > simple enough to be described using the i2c-gate binding. See > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > index 12c1b9507007..ec276b7bcc69 100644 > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > @@ -23,6 +23,7 @@ > #include > #include > #include > +#include > #include "inv_mpu_iio.h" > > /* > @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct > inv_mpu6050_state *st) > return result; > } > > +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) > +{ > + int result; > + > + result = regulator_enable(st->vddio_supply); > + if (result == 0) { > + /* Give the device a little bit of time to start up. */ > + usleep_range(35000, 7); > + } > + > + return result; > +} > + > int inv_mpu_
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 12:29:33PM +, Jean-Baptiste Maneyrol wrote: > Hello, > > I really don't like the idea to have regulator handled inside the driver. I > know this was done like that before for Nexus 5, but I think now this is > something that can be done using dts only. > Does anyone know if there is a way with dts to handle regulator automatically > and prevent the use in the driver? That would be a good idea to search how > this handled for other drivers. > > Anyway, you are enforcing regulator use in your code. It doesn't seem the > code will work when there is no regulator declared in the dts, which is the > case for the majority of configurations. We should at least make it optional. > > Thanks for the contribution. My understanding of devm_regulator_get_optional() is that a stub regulator will be returned if one is not configured. See the comment above regulator_get_optional() for where I got this information. https://elixir.bootlin.com/linux/v4.17/source/drivers/regulator/core.c#L1750 I agree that it would be better if this could be handled exclusively in dts if possible, although I'm not sure how. I looked at other drivers and commits from the last year or so and this appears to be the current recommended approach. I'm open to other approaches to doing this. Brian > > > From: Brian Masney > Sent: Wednesday, July 11, 2018 03:09 > To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; > andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; > devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; > linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org > Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; > l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; > fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; > masn...@onstation.org > Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework > > > CAUTION: This email originated from outside of the organization. Please make > sure the sender is who they say they are and do not click links or open > attachments unless you recognize the sender and know the content is safe. > > > This patch adds support for the regulator framework to the mpu6050 > driver. > > Signed-off-by: Brian Masney > Signed-off-by: Jonathan Marek > --- > This is a variation of Jonathan Marek's patch from postmarketOS > https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 > with the following changes: > > - Stripped out 6515 variant code. (See my previous patch in this series) > - Add the regulator to the mpu core instead of only the i2c variant. > - Add error handling. > - Release the regulator on suspend, device remove, etc. > - Device tree documentation. > > .../bindings/iio/imu/inv_mpu6050.txt | 1 + > drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- > drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- > drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + > drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ > 5 files changed, 66 insertions(+), 6 deletions(-) > > diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > index b7def51c8ad9..d39907b12a46 100644 > --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt > @@ -21,6 +21,7 @@ Required properties: > bindings. > > Optional properties: > + - vddio-supply: regulator phandle for VDDIO supply > - mount-matrix: an optional 3x3 mounting rotation matrix > - i2c-gate node. These devices also support an auxiliary i2c bus. This is > simple enough to be described using the i2c-gate binding. See > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > index 12c1b9507007..ec276b7bcc69 100644 > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c > @@ -23,6 +23,7 @@ > #include > #include > #include > +#include > #include "inv_mpu_iio.h" > > /* > @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct > inv_mpu6050_state *st) > return result; > } > > +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) > +{ > + int result; > + > + result = regulator_enable(st->vddio_supply); > + if (result == 0) { > + /* Give the device a little bit of time to start up. */ > + usleep_range(35000, 7); > + } > + > + return result; > +} > + > int inv_mpu_
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hello, I really don't like the idea to have regulator handled inside the driver. I know this was done like that before for Nexus 5, but I think now this is something that can be done using dts only. Does anyone know if there is a way with dts to handle regulator automatically and prevent the use in the driver? That would be a good idea to search how this handled for other drivers. Anyway, you are enforcing regulator use in your code. It doesn't seem the code will work when there is no regulator declared in the dts, which is the case for the majority of configurations. We should at least make it optional. Thanks for the contribution. JB From: Brian Masney Sent: Wednesday, July 11, 2018 03:09 To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; masn...@onstation.org Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe. This patch adds support for the regulator framework to the mpu6050 driver. Signed-off-by: Brian Masney Signed-off-by: Jonathan Marek --- This is a variation of Jonathan Marek's patch from postmarketOS https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 with the following changes: - Stripped out 6515 variant code. (See my previous patch in this series) - Add the regulator to the mpu core instead of only the i2c variant. - Add error handling. - Release the regulator on suspend, device remove, etc. - Device tree documentation. .../bindings/iio/imu/inv_mpu6050.txt | 1 + drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt index b7def51c8ad9..d39907b12a46 100644 --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt @@ -21,6 +21,7 @@ Required properties: bindings. Optional properties: + - vddio-supply: regulator phandle for VDDIO supply - mount-matrix: an optional 3x3 mounting rotation matrix - i2c-gate node. These devices also support an auxiliary i2c bus. This is simple enough to be described using the i2c-gate binding. See diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 12c1b9507007..ec276b7bcc69 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "inv_mpu_iio.h" /* @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st) return result; } +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) +{ + int result; + + result = regulator_enable(st->vddio_supply); + if (result == 0) { + /* Give the device a little bit of time to start up. */ + usleep_range(35000, 7); + } + + return result; +} + int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type) { @@ -990,15 +1004,28 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, return -EINVAL; } + st->vddio_supply = devm_regulator_get_optional(dev, "vddio"); + if (IS_ERR(st->vddio_supply)) { + if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER) + dev_err(dev, "Failed to get vddio regulator %d\n", + (int)PTR_ERR(st->vddio_supply)); + + return PTR_ERR(st->vddio_supply); + } + + result = inv_mpu_core_enable_regulator(st); + if (result) + return result; + /* power is turned on inside check chip type*/ result = inv_check_and_setup_chip(st); if (result) - return result; + goto out_disable_regulator; result = inv_mpu6050_init_config(indio_dev); if (result) { dev_err(dev, "Could not initialize device.\n&q
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hello, I really don't like the idea to have regulator handled inside the driver. I know this was done like that before for Nexus 5, but I think now this is something that can be done using dts only. Does anyone know if there is a way with dts to handle regulator automatically and prevent the use in the driver? That would be a good idea to search how this handled for other drivers. Anyway, you are enforcing regulator use in your code. It doesn't seem the code will work when there is no regulator declared in the dts, which is the case for the majority of configurations. We should at least make it optional. Thanks for the contribution. JB From: Brian Masney Sent: Wednesday, July 11, 2018 03:09 To: ji...@kernel.org; robh...@kernel.org; mark.rutl...@arm.com; andy.gr...@linaro.org; david.br...@linaro.org; linux-...@vger.kernel.org; devicet...@vger.kernel.org; linux-kernel@vger.kernel.org; linux-arm-...@vger.kernel.org; linux-...@vger.kernel.org Cc: jonat...@marek.ca; Jean-Baptiste Maneyrol; knaac...@gmx.de; l...@metafoo.de; pme...@pmeerw.net; mke...@xevo.com; fischerdougl...@gmail.com; bs...@kde.org; ctatlo...@gmail.com; masn...@onstation.org Subject: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe. This patch adds support for the regulator framework to the mpu6050 driver. Signed-off-by: Brian Masney Signed-off-by: Jonathan Marek --- This is a variation of Jonathan Marek's patch from postmarketOS https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 with the following changes: - Stripped out 6515 variant code. (See my previous patch in this series) - Add the regulator to the mpu core instead of only the i2c variant. - Add error handling. - Release the regulator on suspend, device remove, etc. - Device tree documentation. .../bindings/iio/imu/inv_mpu6050.txt | 1 + drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 57 +-- drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt index b7def51c8ad9..d39907b12a46 100644 --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt @@ -21,6 +21,7 @@ Required properties: bindings. Optional properties: + - vddio-supply: regulator phandle for VDDIO supply - mount-matrix: an optional 3x3 mounting rotation matrix - i2c-gate node. These devices also support an auxiliary i2c bus. This is simple enough to be described using the i2c-gate binding. See diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 12c1b9507007..ec276b7bcc69 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "inv_mpu_iio.h" /* @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st) return result; } +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) +{ + int result; + + result = regulator_enable(st->vddio_supply); + if (result == 0) { + /* Give the device a little bit of time to start up. */ + usleep_range(35000, 7); + } + + return result; +} + int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type) { @@ -990,15 +1004,28 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, return -EINVAL; } + st->vddio_supply = devm_regulator_get_optional(dev, "vddio"); + if (IS_ERR(st->vddio_supply)) { + if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER) + dev_err(dev, "Failed to get vddio regulator %d\n", + (int)PTR_ERR(st->vddio_supply)); + + return PTR_ERR(st->vddio_supply); + } + + result = inv_mpu_core_enable_regulator(st); + if (result) + return result; + /* power is turned on inside check chip type*/ result = inv_check_and_setup_chip(st); if (result) - return result; + goto out_disable_regulator; result = inv_mpu6050_init_config(indio_dev); if (result) { dev_err(dev, "Could not initialize device.\n&q
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 03:34:43PM +0530, Himanshu Jha wrote: > Hi Brain, > > On Tue, Jul 10, 2018 at 09:09:31PM -0400, Brian Masney wrote: > > This patch adds support for the regulator framework to the mpu6050 > > driver. > > > > Signed-off-by: Brian Masney > > Signed-off-by: Jonathan Marek > > --- > > } > > EXPORT_SYMBOL_GPL(inv_mpu_core_probe); > > > > +int inv_mpu_core_remove(struct inv_mpu6050_state *st) > > +{ > > + return regulator_disable(st->vddio_supply); > > +} > EXPORT_SYMBOL_GPL(inv_mpu_core_remove); ? > > This is causing 0-day test build failure perhaps. You are right. It compiles if I have CONFIG_INV_MPU6050_IIO built into the kernel, which is what I'm using to boot the board, but fails when compiled as a module. Good catch 0-day! The patch won't apply to Linus's current master branch and I assumed that iio/togreg didn't have the required changes as well. Sorry about the noise. I'll send a v2 before the weekend. Brian
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 03:34:43PM +0530, Himanshu Jha wrote: > Hi Brain, > > On Tue, Jul 10, 2018 at 09:09:31PM -0400, Brian Masney wrote: > > This patch adds support for the regulator framework to the mpu6050 > > driver. > > > > Signed-off-by: Brian Masney > > Signed-off-by: Jonathan Marek > > --- > > } > > EXPORT_SYMBOL_GPL(inv_mpu_core_probe); > > > > +int inv_mpu_core_remove(struct inv_mpu6050_state *st) > > +{ > > + return regulator_disable(st->vddio_supply); > > +} > EXPORT_SYMBOL_GPL(inv_mpu_core_remove); ? > > This is causing 0-day test build failure perhaps. You are right. It compiles if I have CONFIG_INV_MPU6050_IIO built into the kernel, which is what I'm using to boot the board, but fails when compiled as a module. Good catch 0-day! The patch won't apply to Linus's current master branch and I assumed that iio/togreg didn't have the required changes as well. Sorry about the noise. I'll send a v2 before the weekend. Brian
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hi Brain, On Tue, Jul 10, 2018 at 09:09:31PM -0400, Brian Masney wrote: > This patch adds support for the regulator framework to the mpu6050 > driver. > > Signed-off-by: Brian Masney > Signed-off-by: Jonathan Marek > --- > } > EXPORT_SYMBOL_GPL(inv_mpu_core_probe); > > +int inv_mpu_core_remove(struct inv_mpu6050_state *st) > +{ > + return regulator_disable(st->vddio_supply); > +} EXPORT_SYMBOL_GPL(inv_mpu_core_remove); ? This is causing 0-day test build failure perhaps. -- Himanshu Jha Undergraduate Student Department of Electronics & Communication Guru Tegh Bahadur Institute of Technology
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hi Brain, On Tue, Jul 10, 2018 at 09:09:31PM -0400, Brian Masney wrote: > This patch adds support for the regulator framework to the mpu6050 > driver. > > Signed-off-by: Brian Masney > Signed-off-by: Jonathan Marek > --- > } > EXPORT_SYMBOL_GPL(inv_mpu_core_probe); > > +int inv_mpu_core_remove(struct inv_mpu6050_state *st) > +{ > + return regulator_disable(st->vddio_supply); > +} EXPORT_SYMBOL_GPL(inv_mpu_core_remove); ? This is causing 0-day test build failure perhaps. -- Himanshu Jha Undergraduate Student Department of Electronics & Communication Guru Tegh Bahadur Institute of Technology
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 04:50:22PM +0800, kbuild test robot wrote: > Hi Brian, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on iio/togreg] > [also build test ERROR on next-20180710] > [cannot apply to v4.18-rc4] > [if your patch is applied to the wrong git tree, please drop us a note to > help improve the system] > > url: > https://github.com/0day-ci/linux/commits/Brian-Masney/iio-imu-mpu6050-add-support-for-6515-variant/20180711-092023 > base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg > config: x86_64-allmodconfig (attached as .config) > compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > All errors (new ones prefixed by >>): > > >> ERROR: "inv_mpu_core_remove" > >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-spi.ko] undefined! > >> ERROR: "inv_mpu_core_remove" > >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-i2c.ko] undefined! This patch applies cleanly against the iio/testing branch. https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git/log/?h=testing Brian
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
On Wed, Jul 11, 2018 at 04:50:22PM +0800, kbuild test robot wrote: > Hi Brian, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on iio/togreg] > [also build test ERROR on next-20180710] > [cannot apply to v4.18-rc4] > [if your patch is applied to the wrong git tree, please drop us a note to > help improve the system] > > url: > https://github.com/0day-ci/linux/commits/Brian-Masney/iio-imu-mpu6050-add-support-for-6515-variant/20180711-092023 > base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg > config: x86_64-allmodconfig (attached as .config) > compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > All errors (new ones prefixed by >>): > > >> ERROR: "inv_mpu_core_remove" > >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-spi.ko] undefined! > >> ERROR: "inv_mpu_core_remove" > >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-i2c.ko] undefined! This patch applies cleanly against the iio/testing branch. https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git/log/?h=testing Brian
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hi Brian, Thank you for the patch! Yet something to improve: [auto build test ERROR on iio/togreg] [also build test ERROR on next-20180710] [cannot apply to v4.18-rc4] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Brian-Masney/iio-imu-mpu6050-add-support-for-6515-variant/20180711-092023 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg config: x86_64-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): >> ERROR: "inv_mpu_core_remove" >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-spi.ko] undefined! >> ERROR: "inv_mpu_core_remove" >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-i2c.ko] undefined! --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip
Re: [PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
Hi Brian, Thank you for the patch! Yet something to improve: [auto build test ERROR on iio/togreg] [also build test ERROR on next-20180710] [cannot apply to v4.18-rc4] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Brian-Masney/iio-imu-mpu6050-add-support-for-6515-variant/20180711-092023 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg config: x86_64-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): >> ERROR: "inv_mpu_core_remove" >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-spi.ko] undefined! >> ERROR: "inv_mpu_core_remove" >> [drivers/iio/imu/inv_mpu6050/inv-mpu6050-i2c.ko] undefined! --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip
[PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
This patch adds support for the regulator framework to the mpu6050 driver. Signed-off-by: Brian Masney Signed-off-by: Jonathan Marek --- This is a variation of Jonathan Marek's patch from postmarketOS https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 with the following changes: - Stripped out 6515 variant code. (See my previous patch in this series) - Add the regulator to the mpu core instead of only the i2c variant. - Add error handling. - Release the regulator on suspend, device remove, etc. - Device tree documentation. .../bindings/iio/imu/inv_mpu6050.txt | 1 + drivers/iio/imu/inv_mpu6050/inv_mpu_core.c| 57 +-- drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt index b7def51c8ad9..d39907b12a46 100644 --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt @@ -21,6 +21,7 @@ Required properties: bindings. Optional properties: + - vddio-supply: regulator phandle for VDDIO supply - mount-matrix: an optional 3x3 mounting rotation matrix - i2c-gate node. These devices also support an auxiliary i2c bus. This is simple enough to be described using the i2c-gate binding. See diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 12c1b9507007..ec276b7bcc69 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "inv_mpu_iio.h" /* @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st) return result; } +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) +{ + int result; + + result = regulator_enable(st->vddio_supply); + if (result == 0) { + /* Give the device a little bit of time to start up. */ + usleep_range(35000, 7); + } + + return result; +} + int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type) { @@ -990,15 +1004,28 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, return -EINVAL; } + st->vddio_supply = devm_regulator_get_optional(dev, "vddio"); + if (IS_ERR(st->vddio_supply)) { + if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER) + dev_err(dev, "Failed to get vddio regulator %d\n", + (int)PTR_ERR(st->vddio_supply)); + + return PTR_ERR(st->vddio_supply); + } + + result = inv_mpu_core_enable_regulator(st); + if (result) + return result; + /* power is turned on inside check chip type*/ result = inv_check_and_setup_chip(st); if (result) - return result; + goto out_disable_regulator; result = inv_mpu6050_init_config(indio_dev); if (result) { dev_err(dev, "Could not initialize device.\n"); - return result; + goto out_disable_regulator; } if (inv_mpu_bus_setup) @@ -1023,24 +1050,34 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, NULL); if (result) { dev_err(dev, "configure buffer fail %d\n", result); - return result; + goto out_disable_regulator; } result = inv_mpu6050_probe_trigger(indio_dev, irq_type); if (result) { dev_err(dev, "trigger probe fail %d\n", result); - return result; + goto out_disable_regulator; } result = devm_iio_device_register(dev, indio_dev); if (result) { dev_err(dev, "IIO register fail %d\n", result); - return result; + goto out_disable_regulator; } return 0; + +out_disable_regulator: + regulator_disable(st->vddio_supply); + return result; + } EXPORT_SYMBOL_GPL(inv_mpu_core_probe); +int inv_mpu_core_remove(struct inv_mpu6050_state *st) +{ + return regulator_disable(st->vddio_supply); +} + #ifdef CONFIG_PM_SLEEP static int inv_mpu_resume(struct device *dev) @@ -1050,6 +1087,11 @@ static int inv_mpu_resume(struct device *dev) mutex_lock(>lock); result = inv_mpu6050_set_power_itg(st, true); + if (result) + goto out_unlock; + + result = inv_mpu_core_enable_regulator(st); +out_unlock:
[PATCH 2/3] iio: imu: mpu6050: add support for regulator framework
This patch adds support for the regulator framework to the mpu6050 driver. Signed-off-by: Brian Masney Signed-off-by: Jonathan Marek --- This is a variation of Jonathan Marek's patch from postmarketOS https://gitlab.com/postmarketOS/linux-postmarketos/commit/b8ad1ec1859c8bbcbce94944b3f4dd68f8f9fc37 with the following changes: - Stripped out 6515 variant code. (See my previous patch in this series) - Add the regulator to the mpu core instead of only the i2c variant. - Add error handling. - Release the regulator on suspend, device remove, etc. - Device tree documentation. .../bindings/iio/imu/inv_mpu6050.txt | 1 + drivers/iio/imu/inv_mpu6050/inv_mpu_core.c| 57 +-- drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c | 2 +- drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h | 3 + drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c | 9 +++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt index b7def51c8ad9..d39907b12a46 100644 --- a/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt +++ b/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt @@ -21,6 +21,7 @@ Required properties: bindings. Optional properties: + - vddio-supply: regulator phandle for VDDIO supply - mount-matrix: an optional 3x3 mounting rotation matrix - i2c-gate node. These devices also support an auxiliary i2c bus. This is simple enough to be described using the i2c-gate binding. See diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 12c1b9507007..ec276b7bcc69 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "inv_mpu_iio.h" /* @@ -926,6 +927,19 @@ static int inv_check_and_setup_chip(struct inv_mpu6050_state *st) return result; } +static int inv_mpu_core_enable_regulator(struct inv_mpu6050_state *st) +{ + int result; + + result = regulator_enable(st->vddio_supply); + if (result == 0) { + /* Give the device a little bit of time to start up. */ + usleep_range(35000, 7); + } + + return result; +} + int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, int (*inv_mpu_bus_setup)(struct iio_dev *), int chip_type) { @@ -990,15 +1004,28 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, return -EINVAL; } + st->vddio_supply = devm_regulator_get_optional(dev, "vddio"); + if (IS_ERR(st->vddio_supply)) { + if (PTR_ERR(st->vddio_supply) != -EPROBE_DEFER) + dev_err(dev, "Failed to get vddio regulator %d\n", + (int)PTR_ERR(st->vddio_supply)); + + return PTR_ERR(st->vddio_supply); + } + + result = inv_mpu_core_enable_regulator(st); + if (result) + return result; + /* power is turned on inside check chip type*/ result = inv_check_and_setup_chip(st); if (result) - return result; + goto out_disable_regulator; result = inv_mpu6050_init_config(indio_dev); if (result) { dev_err(dev, "Could not initialize device.\n"); - return result; + goto out_disable_regulator; } if (inv_mpu_bus_setup) @@ -1023,24 +1050,34 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, NULL); if (result) { dev_err(dev, "configure buffer fail %d\n", result); - return result; + goto out_disable_regulator; } result = inv_mpu6050_probe_trigger(indio_dev, irq_type); if (result) { dev_err(dev, "trigger probe fail %d\n", result); - return result; + goto out_disable_regulator; } result = devm_iio_device_register(dev, indio_dev); if (result) { dev_err(dev, "IIO register fail %d\n", result); - return result; + goto out_disable_regulator; } return 0; + +out_disable_regulator: + regulator_disable(st->vddio_supply); + return result; + } EXPORT_SYMBOL_GPL(inv_mpu_core_probe); +int inv_mpu_core_remove(struct inv_mpu6050_state *st) +{ + return regulator_disable(st->vddio_supply); +} + #ifdef CONFIG_PM_SLEEP static int inv_mpu_resume(struct device *dev) @@ -1050,6 +1087,11 @@ static int inv_mpu_resume(struct device *dev) mutex_lock(>lock); result = inv_mpu6050_set_power_itg(st, true); + if (result) + goto out_unlock; + + result = inv_mpu_core_enable_regulator(st); +out_unlock: