ARM: dts: Add gyro and accel to APQ8060 Dragonboard
Subsystems (2)
PATCH v3 1/1 ARM: dts: Add gyro and accel to APQ8060 Dragonboard
This adds the MPU-3050 gyroscope and the KXSD9 accelerometer to the Qualcomm APQ8060 Dragonboard. The KXSD9 is mounted beyond the MPU-3050 and appear as a subdevice beyond it. We set up the required GPIO and interrupt lines to make the devices work.
---
ChangeLog v2->v3:
- Should be fine to apply now: all bindings and requirements are merged.
ChangeLog v1->v2:
- Use the new I2C mux gate bindings from Peter Rosin (merged to the I2C subsystem)
--- arch/arm/boot/dts/qcom-apq8060-dragonboard.dts | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +53 -0
@@ -167,6 +167,14 @@ bias-pull-up; }; }; + + /* Interrupt line for the KXSD9 accelerometer */ + dragon_kxsd9_gpios: kxsd9 { + irq { + pins = "gpio57"; /* IRQ line */ + bias-pull-up; + }; + }; }; qcom,ssbi at 500000 {
@@ -210,6 +218,15 @@ power-source = <PM8058_GPIO_S3>; }; }; + dragon_mpu3050_gpios: mpu3050-gpios { + pinconf { + pins = "gpio17"; + function = "normal"; + input-enable; + bias-disable; + power-source = <PM8058_GPIO_S3>; + }; + }; dragon_sdcc3_gpios: sdcc3-gpios { pinconf { pins = "gpio22";
@@ -319,6 +336,42 @@ vddd-supply = <&pm8058_lvs0>; // 1.8V vdda-supply = <&pm8058_l14>; // 2.85V }; + mpu3050 at 68 { + compatible = "invensense,mpu3050"; + reg = <0x68>; + /* + * GPIO17 has interrupt 208 on the + * PM8058, it is pulled high by a 10k + * resistor to VLOGIC so needs to be + * active low/falling edge. + */ + interrupt-parent = <&pm8058_gpio>; + interrupts = <208 IRQ_TYPE_EDGE_FALLING>; + pinctrl-names = "default"; + pinctrl-0 = <&dragon_mpu3050_gpios>; + vlogic-supply = <&pm8058_lvs0>; // 1.8V + vdd-supply = <&pm8058_l14>; // 2.85V + + /* + * The MPU-3050 acts as a hub for the + * accelerometer. + */ + i2c-gate { + #address-cells = <1>; + #size-cells = <0>; + + kxsd9 at 18 { + compatible = "kionix,kxsd9"; + reg = <0x18>; + interrupt-parent = <&tlmm>; + interrupts = <57 IRQ_TYPE_EDGE_FALLING>; + pinctrl-names = "default"; + pinctrl-0 = <&dragon_kxsd9_gpios>; + iovdd-supply = <&pm8058_lvs0>; // 1.8V + vdd-supply = <&pm8058_l14>; // 2.85V + }; + }; + }; }; };
Signature · 1 line
2.7.4
PATCH v3 1/1 ARM: dts: Add gyro and accel to APQ8060 Dragonboard
Quoted 5 lines · Linus Walleij
This adds the MPU-3050 gyroscope and the KXSD9 accelerometer to the Qualcomm APQ8060 Dragonboard. The KXSD9 is mounted beyond the MPU-3050 and appear as a subdevice beyond it. We set up the required GPIO and interrupt lines to make the devices work.
I'm concerned about the interrupt below, but apart from that
Quoted 13 lines
Signed-off-by Linus Walleij <[email protected]>---
ChangeLogv2->v3:
- Should be fine to apply now: all bindings and requirements are merged.
ChangeLogv1->v2:
- Use the new I2C mux gate bindings from Peter Rosin (merged to the I2C subsystem)--- arch/arm/boot/dts/qcom-apq8060-dragonboard.dts | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +0
-0
[..]
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts line 349
Quoted 11 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +11
-0+ mpu3050 at 68 { + compatible = "invensense,mpu3050"; + reg = <0x68>; + /* + * GPIO17 has interrupt 208 on the + * PM8058, it is pulled high by a 10k + * resistor to VLOGIC so needs to be + * active low/falling edge. + */ + interrupt-parent = <&pm8058_gpio>; + interrupts = <208 IRQ_TYPE_EDGE_FALLING>;
To remove the need of resetting the interrupt-parent in each child you can use the following form:
interrupts-extended = <&pm8058_gpio 208 IRQ_TYPE_EDGE_FALLING>;
But, if we correct the ssbi gpio driver then this would no longer be interrupt 208 in this parent, right?. I believe that if you say <&pmicintc 208 IRQ_TYPE_EDGE_FALLING> instead, which should work even after we correct the gpio translation.
(Which probably means we need to get that redesigned, before we introduce to many of these)
Quoted 15 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +15
-0+ pinctrl-names = "default"; + pinctrl-0 = <&dragon_mpu3050_gpios>; + vlogic-supply = <&pm8058_lvs0>; // 1.8V + vdd-supply = <&pm8058_l14>; // 2.85V + + /* + * The MPU-3050 acts as a hub for the + * accelerometer. + */ + i2c-gate { + #address-cells = <1>; + #size-cells = <0>; + + kxsd9 at 18 { + compatible = "kionix,kxsd9";
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts line 374
Quoted 10 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +10
-0+ reg = <0x18>; + interrupt-parent = <&tlmm>; + interrupts = <57 IRQ_TYPE_EDGE_FALLING>; + pinctrl-names = "default"; + pinctrl-0 = <&dragon_kxsd9_gpios>; + iovdd-supply = <&pm8058_lvs0>; // 1.8V + vdd-supply = <&pm8058_l14>; // 2.85V + }; + }; + };
Regards,
Bjorn
PATCH v3 1/1 ARM: dts: Add gyro and accel to APQ8060 Dragonboard
Quoted 6 lines · Bjorn Andersson
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts line 349
Quoted 2 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +2
-0+ interrupt-parent = <&pm8058_gpio>; + interrupts = <208 IRQ_TYPE_EDGE_FALLING>;To remove the need of resetting the interrupt-parent in each child you can use the following form:
Quoted 6 lines
interrupts-extended = <&pm8058_gpio 208 IRQ_TYPE_EDGE_FALLING>;But, if we correct the ssbi gpio driver then this would no longer be interrupt 208 in this parent, right?. I believe that if you say <&pmicintc 208
IRQ_TYPE_EDGE_FALLING> instead, which should work even after we correct the gpio translation.
Yes. It should be fixed everywhere but is not related to this patch. But I can do a two-patch series first fixing this and then adding the gyro+accelerometer on top referencing the MFD pmicintc as parent.
Quoted 2 lines
(Which probably means we need to get that redesigned, before we introduce to many of these)
What needs to happen is for the SSBI and SPMI GPIO to use a hierarchical irqdomain so their GPIO local line offset and hwirq are the same. Then we can reference the GPIO IRQ lines directly in a correct manner.
You are not alone with this mess. A lot of hierarchical GPIOs are wrong. My fail as GPIO maintainer I guess, ouch.
Yours,
Linus Walleij
PATCH v3 1/1 ARM: dts: Add gyro and accel to APQ8060 Dragonboard
Quoted 16 lines · Linus Walleij
Quoted 6 lines · Bjorn Andersson
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts line 349
Quoted 2 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +2
-0+ interrupt-parent = <&pm8058_gpio>; + interrupts = <208 IRQ_TYPE_EDGE_FALLING>;To remove the need of resetting the interrupt-parent in each child you can use the following form:
Quoted 6 lines
interrupts-extended = <&pm8058_gpio 208 IRQ_TYPE_EDGE_FALLING>;But, if we correct the ssbi gpio driver then this would no longer be interrupt 208 in this parent, right?. I believe that if you say <&pmicintc 208
IRQ_TYPE_EDGE_FALLING> instead, which should work even after we correct the gpio translation.
Quoted 5 lines
Yes. It should be fixed everywhere but is not related to this patch. But I can do a two-patch series first fixing this and then adding the gyro+accelerometer on top referencing the MFD pmicintc as parent.
Sorry, I'm not sure I'm following.
What I tried to say was that before the correction of the GPIO block's window this particular IRQ would be #208 in &pmicintc and #208 in &pm8058_gpio. After the correction of the window the IRQ is #208 in &pmicintc and #17 in &pm8058_gpio.
As such, using #208 from &pmicintc would make this work through the correction of the GPIO driver. Perhaps I'm wrong about this?
Either way, it's no big deal. I'm fine with either path.
Quoted 8 lines
Quoted 2 lines
(Which probably means we need to get that redesigned, before we introduce to many of these)
What needs to happen is for the SSBI and SPMI GPIO to use a hierarchical irqdomain so their GPIO local line offset and hwirq are the same. Then we can reference the GPIO IRQ lines directly in a correct manner.
Right. Do you have any example of drivers getting this right? I did take a quick look but didn't find one.
Regards,
Bjorn
PATCH v3 1/1 ARM: dts: Add gyro and accel to APQ8060 Dragonboard
[CC Quan who made a nice hierarchical domain]
Quoted 26 lines · Bjorn Andersson
Quoted 16 lines · Linus Walleij
Quoted 6 lines · Bjorn Andersson
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts line 349
Quoted 2 lines
arch/arm/boot/dts/qcom-apq8060-dragonboard.dts +2
-0+ interrupt-parent = <&pm8058_gpio>; + interrupts = <208 IRQ_TYPE_EDGE_FALLING>;To remove the need of resetting the interrupt-parent in each child you can use the following form:
Quoted 6 lines
interrupts-extended = <&pm8058_gpio 208 IRQ_TYPE_EDGE_FALLING>;But, if we correct the ssbi gpio driver then this would no longer be interrupt 208 in this parent, right?. I believe that if you say <&pmicintc 208
IRQ_TYPE_EDGE_FALLING> instead, which should work even after we correct the gpio translation.Quoted 5 lines
Yes. It should be fixed everywhere but is not related to this patch. But I can do a two-patch series first fixing this and then adding the gyro+accelerometer on top referencing the MFD pmicintc as parent.
Sorry, I'm not sure I'm following.
Quoted 7 lines
What I tried to say was that before the correction of the GPIO block's window this particular IRQ would be #208 in &pmicintc and #208 in
&pm8058_gpio. After the correction of the window the IRQ is #208 in &pmicintc and #17 in&pm8058_gpio.As such, using #208 from &pmicintc would make this work through the correction of the GPIO driver. Perhaps I'm wrong about this?
No that is exactly what I mean. I just mean I should not use the pm8058_gpio as interrupt parent at all for now.
(You will see in my patch set, cooking it.)
Quoted 7 lines
Quoted 4 lines
What needs to happen is for the SSBI and SPMI GPIO to use a hierarchical irqdomain so their GPIO local line offset and hwirq are the same. Then we can reference the GPIO IRQ lines directly in a correct manner.
Right. Do you have any example of drivers getting this right? I did take a quick look but didn't find one.
It seems drivers/gpio/gpio-xgene-sb.c is doing something like what we want. See for example how it picks out the parent domain and hangs a new domain off it.
If possible, I would like to add infrastructure for this to gpiolib, if it can be made generic and make sense.
Yours,
Linus Walleij