diff mbox

[v2] i2c:at91: Add device tree property to set clock-frequency

Message ID 1393293045-31849-1-git-send-email-mark.roszko@gmail.com
State Changes Requested
Headers show

Commit Message

Marek Roszko Feb. 25, 2014, 1:50 a.m. UTC
This adds the ability to set "clock-frequency" in the device tree for the i2c bus following
the naming of other i2c bus implementations. If the property is not set, the clock
frequency will default to the previously used define of 100KHz.

Signed-off-by: Marek Roszko <mark.roszko@gmail.com>
---
v2:
	-fixed return code usage and check to not compare agaisnt less than zero

---
 Documentation/devicetree/bindings/i2c/i2c-at91.txt |    2 ++
 drivers/i2c/busses/i2c-at91.c                      |   10 ++++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

Comments

ludovic.desroches@atmel.com Feb. 28, 2014, 11:05 a.m. UTC | #1
On Mon, Feb 24, 2014 at 08:50:45PM -0500, Marek Roszko wrote:
> This adds the ability to set "clock-frequency" in the device tree for the i2c bus following
> the naming of other i2c bus implementations. If the property is not set, the clock
> frequency will default to the previously used define of 100KHz.
> 
> Signed-off-by: Marek Roszko <mark.roszko@gmail.com>

Acked-by: Ludovic Desroches <ludovic.desroches@atmel.com>

Thanks

> ---
> v2:
> 	-fixed return code usage and check to not compare agaisnt less than zero
> 
> ---
>  Documentation/devicetree/bindings/i2c/i2c-at91.txt |    2 ++
>  drivers/i2c/busses/i2c-at91.c                      |   10 ++++++++--
>  2 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-at91.txt b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
> index 4fade84..388f0a2 100644
> --- a/Documentation/devicetree/bindings/i2c/i2c-at91.txt
> +++ b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
> @@ -12,6 +12,7 @@ Required properties :
>  - clocks: phandles to input clocks.
>  
>  Optional properties:
> +- clock-frequency: Desired I2C bus frequency in Hz, otherwise defaults to 100000
>  - Child nodes conforming to i2c bus binding
>  
>  Examples :
> @@ -23,6 +24,7 @@ i2c0: i2c@fff84000 {
>  	#address-cells = <1>;
>  	#size-cells = <0>;
>  	clocks = <&twi0_clk>;
> +	clock-frequency = <400000>;
>  
>  	24c512@50 {
>  		compatible = "24c512";
> diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
> index 843d012..a407050 100644
> --- a/drivers/i2c/busses/i2c-at91.c
> +++ b/drivers/i2c/busses/i2c-at91.c
> @@ -32,7 +32,7 @@
>  #include <linux/slab.h>
>  #include <linux/platform_data/dma-atmel.h>
>  
> -#define TWI_CLK_HZ		100000			/* max 400 Kbits/s */
> +#define DEFAULT_TWI_CLK_HZ		100000		/* max 400 Kbits/s */
>  #define AT91_I2C_TIMEOUT	msecs_to_jiffies(100)	/* transfer timeout */
>  #define AT91_I2C_DMA_THRESHOLD	8			/* enable DMA if transfer size is bigger than this threshold */
>  
> @@ -711,6 +711,7 @@ static int at91_twi_probe(struct platform_device *pdev)
>  	struct resource *mem;
>  	int rc;
>  	u32 phy_addr;
> +	int bus_clk_rate;
>  
>  	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
>  	if (!dev)
> @@ -756,7 +757,12 @@ static int at91_twi_probe(struct platform_device *pdev)
>  			dev->use_dma = true;
>  	}
>  
> -	at91_calc_twi_clock(dev, TWI_CLK_HZ);
> +	rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",
> +			&bus_clk_rate);
> +	if (rc)
> +		bus_clk_rate = DEFAULT_TWI_CLK_HZ;
> +
> +	at91_calc_twi_clock(dev, bus_clk_rate);
>  	at91_init_twi_bus(dev);
>  
>  	snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91");
> -- 
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Marek Roszko March 6, 2014, 1:48 p.m. UTC | #2
CCing the subsystem maintainer because I left him out on the initial send.

On Fri, Feb 28, 2014 at 6:05 AM, Ludovic Desroches
<ludovic.desroches@atmel.com> wrote:
> On Mon, Feb 24, 2014 at 08:50:45PM -0500, Marek Roszko wrote:
>> This adds the ability to set "clock-frequency" in the device tree for the i2c bus following
>> the naming of other i2c bus implementations. If the property is not set, the clock
>> frequency will default to the previously used define of 100KHz.
>>
>> Signed-off-by: Marek Roszko <mark.roszko@gmail.com>
>
> Acked-by: Ludovic Desroches <ludovic.desroches@atmel.com>
>
> Thanks
>
>> ---
>> v2:
>>       -fixed return code usage and check to not compare agaisnt less than zero
>>
>> ---
>>  Documentation/devicetree/bindings/i2c/i2c-at91.txt |    2 ++
>>  drivers/i2c/busses/i2c-at91.c                      |   10 ++++++++--
>>  2 files changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/i2c/i2c-at91.txt b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>> index 4fade84..388f0a2 100644
>> --- a/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>> +++ b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>> @@ -12,6 +12,7 @@ Required properties :
>>  - clocks: phandles to input clocks.
>>
>>  Optional properties:
>> +- clock-frequency: Desired I2C bus frequency in Hz, otherwise defaults to 100000
>>  - Child nodes conforming to i2c bus binding
>>
>>  Examples :
>> @@ -23,6 +24,7 @@ i2c0: i2c@fff84000 {
>>       #address-cells = <1>;
>>       #size-cells = <0>;
>>       clocks = <&twi0_clk>;
>> +     clock-frequency = <400000>;
>>
>>       24c512@50 {
>>               compatible = "24c512";
>> diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
>> index 843d012..a407050 100644
>> --- a/drivers/i2c/busses/i2c-at91.c
>> +++ b/drivers/i2c/busses/i2c-at91.c
>> @@ -32,7 +32,7 @@
>>  #include <linux/slab.h>
>>  #include <linux/platform_data/dma-atmel.h>
>>
>> -#define TWI_CLK_HZ           100000                  /* max 400 Kbits/s */
>> +#define DEFAULT_TWI_CLK_HZ           100000          /* max 400 Kbits/s */
>>  #define AT91_I2C_TIMEOUT     msecs_to_jiffies(100)   /* transfer timeout */
>>  #define AT91_I2C_DMA_THRESHOLD       8                       /* enable DMA if transfer size is bigger than this threshold */
>>
>> @@ -711,6 +711,7 @@ static int at91_twi_probe(struct platform_device *pdev)
>>       struct resource *mem;
>>       int rc;
>>       u32 phy_addr;
>> +     int bus_clk_rate;
>>
>>       dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
>>       if (!dev)
>> @@ -756,7 +757,12 @@ static int at91_twi_probe(struct platform_device *pdev)
>>                       dev->use_dma = true;
>>       }
>>
>> -     at91_calc_twi_clock(dev, TWI_CLK_HZ);
>> +     rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",
>> +                     &bus_clk_rate);
>> +     if (rc)
>> +             bus_clk_rate = DEFAULT_TWI_CLK_HZ;
>> +
>> +     at91_calc_twi_clock(dev, bus_clk_rate);
>>       at91_init_twi_bus(dev);
>>
>>       snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91");
>> --
>> 1.7.10.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jean-Christophe PLAGNIOL-VILLARD March 7, 2014, 3:51 a.m. UTC | #3
I never like that

the  clock-frequency = <400000>; need to be set on each i2c device
and then the i2c subsystem need to choose the slowest

Best Regards,
J.
On Mar 6, 2014, at 9:48 PM, Mark Roszko <mark.roszko@gmail.com> wrote:

> CCing the subsystem maintainer because I left him out on the initial send.
> 
> On Fri, Feb 28, 2014 at 6:05 AM, Ludovic Desroches
> <ludovic.desroches@atmel.com> wrote:
>> On Mon, Feb 24, 2014 at 08:50:45PM -0500, Marek Roszko wrote:
>>> This adds the ability to set "clock-frequency" in the device tree for the i2c bus following
>>> the naming of other i2c bus implementations. If the property is not set, the clock
>>> frequency will default to the previously used define of 100KHz.
>>> 
>>> Signed-off-by: Marek Roszko <mark.roszko@gmail.com>
>> 
>> Acked-by: Ludovic Desroches <ludovic.desroches@atmel.com>
>> 
>> Thanks
>> 
>>> ---
>>> v2:
>>>      -fixed return code usage and check to not compare agaisnt less than zero
>>> 
>>> ---
>>> Documentation/devicetree/bindings/i2c/i2c-at91.txt |    2 ++
>>> drivers/i2c/busses/i2c-at91.c                      |   10 ++++++++--
>>> 2 files changed, 10 insertions(+), 2 deletions(-)
>>> 
>>> diff --git a/Documentation/devicetree/bindings/i2c/i2c-at91.txt b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>>> index 4fade84..388f0a2 100644
>>> --- a/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>>> +++ b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
>>> @@ -12,6 +12,7 @@ Required properties :
>>> - clocks: phandles to input clocks.
>>> 
>>> Optional properties:
>>> +- clock-frequency: Desired I2C bus frequency in Hz, otherwise defaults to 100000
>>> - Child nodes conforming to i2c bus binding
>>> 
>>> Examples :
>>> @@ -23,6 +24,7 @@ i2c0: i2c@fff84000 {
>>>      #address-cells = <1>;
>>>      #size-cells = <0>;
>>>      clocks = <&twi0_clk>;
>>> +     clock-frequency = <400000>;
>>> 
>>>      24c512@50 {
>>>              compatible = "24c512";
>>> diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
>>> index 843d012..a407050 100644
>>> --- a/drivers/i2c/busses/i2c-at91.c
>>> +++ b/drivers/i2c/busses/i2c-at91.c
>>> @@ -32,7 +32,7 @@
>>> #include <linux/slab.h>
>>> #include <linux/platform_data/dma-atmel.h>
>>> 
>>> -#define TWI_CLK_HZ           100000                  /* max 400 Kbits/s */
>>> +#define DEFAULT_TWI_CLK_HZ           100000          /* max 400 Kbits/s */
>>> #define AT91_I2C_TIMEOUT     msecs_to_jiffies(100)   /* transfer timeout */
>>> #define AT91_I2C_DMA_THRESHOLD       8                       /* enable DMA if transfer size is bigger than this threshold */
>>> 
>>> @@ -711,6 +711,7 @@ static int at91_twi_probe(struct platform_device *pdev)
>>>      struct resource *mem;
>>>      int rc;
>>>      u32 phy_addr;
>>> +     int bus_clk_rate;
>>> 
>>>      dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
>>>      if (!dev)
>>> @@ -756,7 +757,12 @@ static int at91_twi_probe(struct platform_device *pdev)
>>>                      dev->use_dma = true;
>>>      }
>>> 
>>> -     at91_calc_twi_clock(dev, TWI_CLK_HZ);
>>> +     rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",
>>> +                     &bus_clk_rate);
>>> +     if (rc)
>>> +             bus_clk_rate = DEFAULT_TWI_CLK_HZ;
>>> +
>>> +     at91_calc_twi_clock(dev, bus_clk_rate);
>>>      at91_init_twi_bus(dev);
>>> 
>>>      snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91");
>>> --
>>> 1.7.10.4
>>> 
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
> 
> -- 
> Mark
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Marek Roszko March 7, 2014, 4:26 a.m. UTC | #4
Unless I'm misunderstanding your reply, it doesn't need to be set on
each i2c device. It's meant to be an option to override the currently
hardcoded 100khz for all the at91 devices.
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jean-Christophe PLAGNIOL-VILLARD March 7, 2014, 5:08 a.m. UTC | #5
On Mar 7, 2014, at 12:26 PM, Mark Roszko <mark.roszko@gmail.com> wrote:

> Unless I'm misunderstanding your reply, it doesn't need to be set on
> each i2c device. It's meant to be an option to override the currently
> hardcoded 100khz for all the at91 devices.

yes you do need to set it on each device

as in the DT you describe the hw you set the speed of each device and then the bus
based on the present device will use the appropriate one

Best Regards,
J.
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Marek Roszko March 7, 2014, 5:30 a.m. UTC | #6
Ah, you are talking about the individual slave devices within an
device tree i2c bus like the i2c eeproms? Yea, it would be nicer if
one could define it as such to deal with having slave devices that
can't handle certain speeds such as I have. This patch does work
though nicely for my needs with an SAMA5 with three i2c buses running
at 50kHz, 100kHz and 400kHz separately.
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang March 10, 2014, 4:29 p.m. UTC | #7
> @@ -711,6 +711,7 @@ static int at91_twi_probe(struct platform_device *pdev)
>  	struct resource *mem;
>  	int rc;
>  	u32 phy_addr;
> +	int bus_clk_rate;
>  
>  	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
>  	if (!dev)
> @@ -756,7 +757,12 @@ static int at91_twi_probe(struct platform_device *pdev)
>  			dev->use_dma = true;
>  	}
>  
> -	at91_calc_twi_clock(dev, TWI_CLK_HZ);
> +	rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",
> +			&bus_clk_rate);

The function is named read_u32, so the variable used should be u32.
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/i2c/i2c-at91.txt b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
index 4fade84..388f0a2 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-at91.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-at91.txt
@@ -12,6 +12,7 @@  Required properties :
 - clocks: phandles to input clocks.
 
 Optional properties:
+- clock-frequency: Desired I2C bus frequency in Hz, otherwise defaults to 100000
 - Child nodes conforming to i2c bus binding
 
 Examples :
@@ -23,6 +24,7 @@  i2c0: i2c@fff84000 {
 	#address-cells = <1>;
 	#size-cells = <0>;
 	clocks = <&twi0_clk>;
+	clock-frequency = <400000>;
 
 	24c512@50 {
 		compatible = "24c512";
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index 843d012..a407050 100644
--- a/drivers/i2c/busses/i2c-at91.c
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -32,7 +32,7 @@ 
 #include <linux/slab.h>
 #include <linux/platform_data/dma-atmel.h>
 
-#define TWI_CLK_HZ		100000			/* max 400 Kbits/s */
+#define DEFAULT_TWI_CLK_HZ		100000		/* max 400 Kbits/s */
 #define AT91_I2C_TIMEOUT	msecs_to_jiffies(100)	/* transfer timeout */
 #define AT91_I2C_DMA_THRESHOLD	8			/* enable DMA if transfer size is bigger than this threshold */
 
@@ -711,6 +711,7 @@  static int at91_twi_probe(struct platform_device *pdev)
 	struct resource *mem;
 	int rc;
 	u32 phy_addr;
+	int bus_clk_rate;
 
 	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
 	if (!dev)
@@ -756,7 +757,12 @@  static int at91_twi_probe(struct platform_device *pdev)
 			dev->use_dma = true;
 	}
 
-	at91_calc_twi_clock(dev, TWI_CLK_HZ);
+	rc = of_property_read_u32(dev->dev->of_node, "clock-frequency",
+			&bus_clk_rate);
+	if (rc)
+		bus_clk_rate = DEFAULT_TWI_CLK_HZ;
+
+	at91_calc_twi_clock(dev, bus_clk_rate);
 	at91_init_twi_bus(dev);
 
 	snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91");