On 2019-07-08 13:08, Marc Gonzalez wrote:
> Hello everyone,

*snip*

Focusing on #2...

> PROBLEM #2
> 
> The tuner (si2157) is not on the i2c5 bus, instead it is on a private
> i2c bus *behind* si2168, which routes requests to the proper client.
> For the time being, I don't know how to model this relationship in DT.
> (TODO: check i2c_slave_cb_t slave_cb in struct i2c_client)
> I have initialized si2157 in the si2168 driver, but this doesn't feel
> right. (Though it seems all(?) users pair 2168 with 2157.)
> 
> 
> It would really help if I could get some guidance from media and i2c
> people for these two issues. (I'd like to upstream the driver in time
> for 5.3)
> 
> Regards.
> 
> 
> 
> diff --git a/arch/arm64/boot/dts/qcom/apq8098-batfish.dts 
> b/arch/arm64/boot/dts/qcom/apq8098-batfish.dts
> index 29d59ecad138..9353e62375a7 100644
> --- a/arch/arm64/boot/dts/qcom/apq8098-batfish.dts
> +++ b/arch/arm64/boot/dts/qcom/apq8098-batfish.dts
> @@ -30,6 +30,28 @@
>       status = "ok";
>  };
>  
> +&blsp1_i2c5 {
> +     status = "ok";
> +     clock-frequency = <100000>;
> +     pinctrl-names = "default";
> +     pinctrl-0 = <&i2c5_default>;
> +
> +     dvb_demod: si2168@64 {
> +             compatible = "silabs,si2168";
> +             reg = <0x64>;
> +             reset-gpios = <&tlmm 84 GPIO_ACTIVE_LOW>;


In principle, I think you should be able to add something like this here:

                i2c-gate {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        tuner@60 {
                                compatible = "silabs,si2157";
                                reg = <0x60>;
                                /* whatever else is needed */
                        };
                };

But in practice, I don't know if the si2157 driver understands that or
if there is anything else that gets in the way. Totally untested...

The i2c-gate child node is examined when you call i2c_mux_add_adapter
if you have provided the correct struct device in the second argument
when you called i2c_mux_alloc (I think that is already the case). You
also need to set the I2C_MUX_GATE flag in the i2c_mux_alloc call, but
I do not see a problem with that since I think only one child adapter
is added. If it is a problem to add the I2C_MUX_GATE flag, then you
can just adjust the above i2c-gate node according to the bindings in
Documentation/devicetree/bindings/i2c/i2c-mux.txt. I.e. add this
instead of the above i2c-gate node:

                i2c-mux {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        i2c@0 {
                                #address-cells = <1>;
                                #size-cells = <0>;
                                reg = <0>;

                                tuner@60 {
                                        compatible = "silabs,si2157";
                                        reg = <0x60>;
                                        /* whatever else is needed */
                                };
                        };
                };

But it feels *right* to add the I2C_MUX_GATE flag, because a gate is
what you have. I think?

Cheers,
Peter

> +     };
> +};
> +
> +&tsif {
> +     demod = <&dvb_demod>;
> +};
> +
> +&i2c5_default {
> +     drive-strength = <2>;
> +     bias-disable;
> +};
> +
>  &qusb2phy {
>       status = "ok";
>       vdda-pll-supply = <&vreg_l12a_1p8>;

Reply via email to