mbox series

[0/5] i2c: meson-axg: add I2C controller driver

Message ID 20171117080236.32504-1-yixun.lan@amlogic.com
Headers show
Series i2c: meson-axg: add I2C controller driver | expand

Message

Yixun Lan Nov. 17, 2017, 8:02 a.m. UTC
This patch set try to add I2C controller driver for
the Amlogic's Meson-AXG SoC.

Jian Hu (5):
  dt-bindings: i2c: update documentation for the Meson-AXG
  i2c: meson: add configurable divider factors
  ARM64: dts: meson-axg: add I2C DT info for Meson-AXG SoC
  ARM64: dts: meson-axg: describe pin DT info for I2C controller
  ARM64: dts: meson-axg: enable I2C Master-1 for the audio speaker

 .../devicetree/bindings/i2c/i2c-meson.txt          |   1 +
 arch/arm64/boot/dts/amlogic/meson-axg-s400.dts     |   6 +
 arch/arm64/boot/dts/amlogic/meson-axg.dtsi         | 123 +++++++++++++++++++++
 drivers/i2c/busses/i2c-meson.c                     |  32 +++++-
 4 files changed, 158 insertions(+), 4 deletions(-)

Comments

Neil Armstrong Nov. 17, 2017, 1:02 p.m. UTC | #1
On 17/11/2017 09:02, Yixun Lan wrote:
> From: Jian Hu <jian.hu@amlogic.com>
> 
> This patch try to add support for I2C controller in Meson-AXG SoC,
> Due to the IP changes between I2C controller, we need to introduce
> a compatible data to make the divider factor configurable.
> 
> Signed-off-by: Jian Hu <jian.hu@amlogic.com>
> Signed-off-by: Yixun Lan <yixun.lan@amlogic.com>
> ---
>  drivers/i2c/busses/i2c-meson.c | 32 ++++++++++++++++++++++++++++----
>  1 file changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c
> index 88d15b92ec35..517f2cddeff3 100644
> --- a/drivers/i2c/busses/i2c-meson.c
> +++ b/drivers/i2c/busses/i2c-meson.c
> @@ -16,6 +16,7 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/types.h>
>  
> @@ -57,6 +58,10 @@ enum {
>  	STATE_WRITE,
>  };
>  
> +struct meson_i2c_data {
> +	unsigned char div_factor;
> +};
> +
>  /**
>   * struct meson_i2c - Meson I2C device private data
>   *
> @@ -93,6 +98,8 @@ struct meson_i2c {
>  	struct completion	done;
>  	u32			tokens[2];
>  	int			num_tokens;
> +
> +	struct meson_i2c_data *data;
>  };
>  
>  static void meson_i2c_set_mask(struct meson_i2c *i2c, int reg, u32 mask,
> @@ -128,7 +135,7 @@ static void meson_i2c_set_clk_div(struct meson_i2c *i2c, unsigned int freq)
>  	unsigned long clk_rate = clk_get_rate(i2c->clk);
>  	unsigned int div;
>  
> -	div = DIV_ROUND_UP(clk_rate, freq * 4);
> +	div = DIV_ROUND_UP(clk_rate, freq * i2c->data->div_factor);
>  
>  	/* clock divider has 12 bits */
>  	if (div >= (1 << 12)) {
> @@ -376,6 +383,9 @@ static int meson_i2c_probe(struct platform_device *pdev)
>  	spin_lock_init(&i2c->lock);
>  	init_completion(&i2c->done);
>  
> +	i2c->data = (struct meson_i2c_data *)
> +		of_device_get_match_data(&pdev->dev);
> +
>  	i2c->clk = devm_clk_get(&pdev->dev, NULL);
>  	if (IS_ERR(i2c->clk)) {
>  		dev_err(&pdev->dev, "can't get device clock\n");
> @@ -440,11 +450,25 @@ static int meson_i2c_remove(struct platform_device *pdev)
>  	return 0;
>  }
>  
> +static const struct meson_i2c_data i2c_meson6_data = {
> +	.div_factor = 4,
> +};
> +
> +static const struct meson_i2c_data i2c_gxbb_data = {
> +	.div_factor = 4,
> +};
> +
> +static const struct meson_i2c_data i2c_axg_data = {
> +	.div_factor = 3,
> +};
> +
>  static const struct of_device_id meson_i2c_match[] = {
> -	{ .compatible = "amlogic,meson6-i2c" },
> -	{ .compatible = "amlogic,meson-gxbb-i2c" },
> -	{ },
> +	{ .compatible = "amlogic,meson6-i2c", .data = &i2c_meson6_data },
> +	{ .compatible = "amlogic,meson-gxbb-i2c", .data = &i2c_gxbb_data },
> +	{ .compatible = "amlogic,meson-axg-i2c", .data = &i2c_axg_data },
> +	{},
>  };
> +
>  MODULE_DEVICE_TABLE(of, meson_i2c_match);
>  
>  static struct platform_driver meson_i2c_driver = {
> 

Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Neil Armstrong Nov. 17, 2017, 1:05 p.m. UTC | #2
Hi Yixun, Jian,

On 17/11/2017 09:02, Yixun Lan wrote:
> From: Jian Hu <jian.hu@amlogic.com>
> 
> There are four I2C masters in EE domain, and one I2C Master in
> AO domain, the DT info here should describe them all.
> 
> Signed-off-by: Jian Hu <jian.hu@amlogic.com>
> Signed-off-by: Yixun Lan <yixun.lan@amlogic.com>
> ---
>  arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 59 ++++++++++++++++++++++++++++++
>  1 file changed, 59 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> index 57faaa9d8013..99e967aff439 100644
> --- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> +++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> @@ -129,6 +129,54 @@
>  				#reset-cells = <1>;
>  			};
>  
> +			i2c_m0: i2c@1f000 {

Can you use a more simple "i2c0" phandle naming instead ? or get back to the "i2c_A/B/C/D" naming like in meson_gx to keep consistency ?

[...]

> +			};
> +
> +			i2c_m1: i2c@1e000 {

[...]

> +			};
> +
> +			i2c_m2: i2c@1d000 {

[...]

> +			};
> +
> +			i2c_m3: i2c@1c000 {

[...]

> +			};
> +
>  			uart_A: serial@24000 {
>  				compatible = "amlogic,meson-gx-uart", "amlogic,meson-uart";
>  				reg = <0x0 0x24000 0x0 0x14>;
> @@ -312,6 +360,17 @@
>  				};
>  			};
>  
> +			i2c_ao: i2c@5000 {

Can you keep the same "i2c_AO" as in meson-gx ?


[...]

> +			};
> +
>  			uart_AO: serial@3000 {
>  				compatible = "amlogic,meson-gx-uart", "amlogic,meson-ao-uart";
>  				reg = <0x0 0x3000 0x0 0x18>;
> 

Neil
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Neil Armstrong Nov. 17, 2017, 1:06 p.m. UTC | #3
On 17/11/2017 09:02, Yixun Lan wrote:
> From: Jian Hu <jian.hu@amlogic.com>
> 
> Describe all the pin mux for the I2C controller which found in
> Meson-AXG SoC.
> 
> Signed-off-by: Jian Hu <jian.hu@amlogic.com>
> Signed-off-by: Yixun Lan <yixun.lan@amlogic.com>
> ---
>  arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 64 ++++++++++++++++++++++++++++++
>  1 file changed, 64 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> index 99e967aff439..edbfd6022078 100644
> --- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> +++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
> @@ -304,6 +304,70 @@
>  						function = "eth";
>  					};
>  				};
> +
> +				i2c_m0_pins: i2c_m0 {
> +					mux {
> +						groups = "i2c_sck_m0",
> +							"i2c_sda_m0";
> +						function = "i2c_m0";
> +					};
> +				};
> +
> +				i2c_m1_z_pins: i2c_m1_z {
> +					mux {
> +						groups = "i2c_sck_m1_z",
> +							"i2c_sda_m1_z";
> +						function = "i2c_m1";
> +					};
> +				};
> +
> +				i2c_m1_x_pins: i2c_m1_x {
> +					mux {
> +						groups = "i2c_sck_m1_x",
> +							"i2c_sda_m1_x";
> +						function = "i2c_m1";
> +					};
> +				};
> +
> +				i2c_m2_x_pins: i2c_m2_x {
> +					mux {
> +						groups = "i2c_sck_m2_x",
> +							"i2c_sda_m2_x";
> +						function = "i2c_m2";
> +					};
> +				};
> +
> +				i2c_m2_a_pins: i2c_m2_a {
> +					mux {
> +						groups = "i2c_sck_m2_a",
> +							"i2c_sda_m2_a";
> +						function = "i2c_m2";
> +					};
> +				};
> +
> +				i2c_m3_a6_pins: i2c_m3_a6 {
> +					mux {
> +						groups = "i2c_sda_m3_a6",
> +							"i2c_sck_m3_a7";
> +						function = "i2c_m3";
> +					};
> +				};
> +
> +				i2c_m3_a12_pins: i2c_m3_a12 {
> +					mux {
> +						groups = "i2c_sda_m3_a12",
> +							"i2c_sck_m3_a13";
> +						function = "i2c_m3";
> +					};
> +				};
> +
> +				i2c_m3_a19_pins: i2c_m3_a19 {
> +					mux {
> +						groups = "i2c_sda_m3_a19",
> +							"i2c_sck_m3_a20";
> +						function = "i2c_m3";
> +					};
> +				};
>  			};
>  		};
>  
> 

Same here fore the naming of the i2c nodes.

Neil
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yixun Lan Nov. 17, 2017, 2:02 p.m. UTC | #4
Hi Neil

see my comments in line

On 11/17/17 21:05, Neil Armstrong wrote:
> Hi Yixun, Jian,
> 
> On 17/11/2017 09:02, Yixun Lan wrote:
>> From: Jian Hu <jian.hu@amlogic.com>
>>
>> There are four I2C masters in EE domain, and one I2C Master in
>> AO domain, the DT info here should describe them all.
>>
>> Signed-off-by: Jian Hu <jian.hu@amlogic.com>
>> Signed-off-by: Yixun Lan <yixun.lan@amlogic.com>
>> ---
>>  arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 59 ++++++++++++++++++++++++++++++
>>  1 file changed, 59 insertions(+)
>>
>> diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
>> index 57faaa9d8013..99e967aff439 100644
>> --- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
>> +++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
>> @@ -129,6 +129,54 @@
>>  				#reset-cells = <1>;
>>  			};
>>  
>> +			i2c_m0: i2c@1f000 {
> 
> Can you use a more simple "i2c0" phandle naming instead ? or get back to the "i2c_A/B/C/D" naming like in meson_gx to keep consistency ?
> 
Ok, I would prefer to use 'i2c0' then

we had a internal discussion about the inconsistent naming of the I2C
controller, and reach a consensus to name them as:
 the EE domain: ee_i2c_m0, ee_i2c_m1 ..
 the AO domain: ao_i2c_m0, ao_i2c_s0
in the future datasheet.

note: 'ee' means the EE domain, m0 mean the master 0, s0 mean the I2C
slave 0


> [...]
> 
>> +			};
>> +
>> +			i2c_m1: i2c@1e000 {
> 
> [...]
> 
>> +			};
>> +
>> +			i2c_m2: i2c@1d000 {
> 
> [...]
> 
>> +			};
>> +
>> +			i2c_m3: i2c@1c000 {
> 
> [...]
> 
>> +			};
>> +
>>  			uart_A: serial@24000 {
>>  				compatible = "amlogic,meson-gx-uart", "amlogic,meson-uart";
>>  				reg = <0x0 0x24000 0x0 0x14>;
>> @@ -312,6 +360,17 @@
>>  				};
>>  			};
>>  
>> +			i2c_ao: i2c@5000 {
> 
> Can you keep the same "i2c_AO" as in meson-gx ?
> 
> 
sure, can do

> [...]
> 
>> +			};
>> +
>>  			uart_AO: serial@3000 {
>>  				compatible = "amlogic,meson-gx-uart", "amlogic,meson-ao-uart";
>>  				reg = <0x0 0x3000 0x0 0x18>;
>>
> 
> Neil
> 
> .
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Martin Blumenstingl Nov. 17, 2017, 8:32 p.m. UTC | #5
On Fri, Nov 17, 2017 at 9:02 AM, Yixun Lan <yixun.lan@amlogic.com> wrote:
> From: Jian Hu <jian.hu@amlogic.com>
>
> This patch try to add support for I2C controller in Meson-AXG SoC,
> Due to the IP changes between I2C controller, we need to introduce
> a compatible data to make the divider factor configurable.
>
> Signed-off-by: Jian Hu <jian.hu@amlogic.com>
> Signed-off-by: Yixun Lan <yixun.lan@amlogic.com>
> ---
>  drivers/i2c/busses/i2c-meson.c | 32 ++++++++++++++++++++++++++++----
>  1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c
> index 88d15b92ec35..517f2cddeff3 100644
> --- a/drivers/i2c/busses/i2c-meson.c
> +++ b/drivers/i2c/busses/i2c-meson.c
> @@ -16,6 +16,7 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
> +#include <linux/of_device.h>
>  #include <linux/platform_device.h>
>  #include <linux/types.h>
>
> @@ -57,6 +58,10 @@ enum {
>         STATE_WRITE,
>  };
>
> +struct meson_i2c_data {
> +       unsigned char div_factor;
> +};
> +
>  /**
>   * struct meson_i2c - Meson I2C device private data
>   *
> @@ -93,6 +98,8 @@ struct meson_i2c {
>         struct completion       done;
>         u32                     tokens[2];
>         int                     num_tokens;
> +
> +       struct meson_i2c_data *data;
shouldn't this be const (like the definitions below)?

>  };
>
>  static void meson_i2c_set_mask(struct meson_i2c *i2c, int reg, u32 mask,
> @@ -128,7 +135,7 @@ static void meson_i2c_set_clk_div(struct meson_i2c *i2c, unsigned int freq)
>         unsigned long clk_rate = clk_get_rate(i2c->clk);
>         unsigned int div;
>
> -       div = DIV_ROUND_UP(clk_rate, freq * 4);
> +       div = DIV_ROUND_UP(clk_rate, freq * i2c->data->div_factor);
>
>         /* clock divider has 12 bits */
>         if (div >= (1 << 12)) {
> @@ -376,6 +383,9 @@ static int meson_i2c_probe(struct platform_device *pdev)
>         spin_lock_init(&i2c->lock);
>         init_completion(&i2c->done);
>
> +       i2c->data = (struct meson_i2c_data *)
> +               of_device_get_match_data(&pdev->dev);
> +
>         i2c->clk = devm_clk_get(&pdev->dev, NULL);
>         if (IS_ERR(i2c->clk)) {
>                 dev_err(&pdev->dev, "can't get device clock\n");
> @@ -440,11 +450,25 @@ static int meson_i2c_remove(struct platform_device *pdev)
>         return 0;
>  }
>
> +static const struct meson_i2c_data i2c_meson6_data = {
> +       .div_factor = 4,
> +};
> +
> +static const struct meson_i2c_data i2c_gxbb_data = {
> +       .div_factor = 4,
> +};
> +
> +static const struct meson_i2c_data i2c_axg_data = {
> +       .div_factor = 3,
> +};
> +
>  static const struct of_device_id meson_i2c_match[] = {
> -       { .compatible = "amlogic,meson6-i2c" },
> -       { .compatible = "amlogic,meson-gxbb-i2c" },
> -       { },
> +       { .compatible = "amlogic,meson6-i2c", .data = &i2c_meson6_data },
> +       { .compatible = "amlogic,meson-gxbb-i2c", .data = &i2c_gxbb_data },
> +       { .compatible = "amlogic,meson-axg-i2c", .data = &i2c_axg_data },
> +       {},
>  };
> +
>  MODULE_DEVICE_TABLE(of, meson_i2c_match);
>
>  static struct platform_driver meson_i2c_driver = {
> --
> 2.14.1
>
>
> _______________________________________________
> linux-amlogic mailing list
> linux-amlogic@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-amlogic
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html