Skip to contentSkip to conversation

ARM: dts: Add gyro and accel to APQ8060 Dragonboard

PATCH Superseded Linus Walleij 2 participants 5 messages Oct 26, 2016 – Nov 3, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 6c0038398ef2..1d76b7415f08 100644
@@ -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
#1 lore raw

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

---
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 +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

#2 lore raw

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

#3 lore raw

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

#4 lore raw

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