linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Need to use a I2C EEPROM on normal x86 architecture
@ 2011-06-21 11:54 Christian Gmeiner
       [not found] ` <BANLkTimfbe4ntzzTu0SXJothK1N56m1ghA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Christian Gmeiner @ 2011-06-21 11:54 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi community,

I am working on an embedded x86 device, which has an at24 based
eeprom. I am using
the i2c_eg20t driver to access the i2c bus. To be able to access the
eeprom in a separated
driver I did this:

/* technical description of our used EEPROM */
static struct at24_platform_data custom_i2c_eeprom_info = {
	.byte_len	= EEPROM_BYTE_LEN,
	.page_size	= 16,
	.flags		= 0,
	.setup		= content_read,
	.context	= NULL,
};

/* EEPROM at24 */
static struct i2c_board_info __initdata i2c_info[] =  {
	{
		I2C_BOARD_INFO("24c04", 0x50),
		.platform_data	= &custom_i2c_eeprom_info,
	},
};

In the init function of my custom driver I do this:

	/* register known devices on i2c bus */
	status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info))

Now I run in some troubles... see
http://www.spinics.net/lists/linux-i2c/msg02022.html

What options do I have to get this running? I could use
i2c_add_numbered_adapter, but I don''t
want to touch too much from mainline kernel sources.

Thanks
--
Christian Gmeiner, MSc

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Need to use a I2C EEPROM on normal x86 architecture
       [not found] ` <BANLkTimfbe4ntzzTu0SXJothK1N56m1ghA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2011-06-23  9:10   ` Jean Delvare
       [not found]     ` <20110623111016.368a7ca5-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Jean Delvare @ 2011-06-23  9:10 UTC (permalink / raw)
  To: Christian Gmeiner; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi Christian,

On Tue, 21 Jun 2011 13:54:52 +0200, Christian Gmeiner wrote:
> Hi community,
> 
> I am working on an embedded x86 device, which has an at24 based
> eeprom. I am using
> the i2c_eg20t driver to access the i2c bus. To be able to access the
> eeprom in a separated
> driver I did this:
> 
> /* technical description of our used EEPROM */
> static struct at24_platform_data custom_i2c_eeprom_info = {
> 	.byte_len	= EEPROM_BYTE_LEN,
> 	.page_size	= 16,
> 	.flags		= 0,

Note that you don't have to mention struct members with value 0 (or
NULL), as this is the default.

> 	.setup		= content_read,
> 	.context	= NULL,
> };
> 
> /* EEPROM at24 */
> static struct i2c_board_info __initdata i2c_info[] =  {
> 	{
> 		I2C_BOARD_INFO("24c04", 0x50),
> 		.platform_data	= &custom_i2c_eeprom_info,
> 	},
> };
> 
> In the init function of my custom driver I do this:
> 
> 	/* register known devices on i2c bus */
> 	status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info))

Out of curiosity, where did you put this code? Does x86 finally support
per-machine initialization as e.g. arm does?

> 
> Now I run in some troubles... see
> http://www.spinics.net/lists/linux-i2c/msg02022.html

I see that I already replied to this post...

> What options do I have to get this running? I could use
> i2c_add_numbered_adapter, but I don't
> want to touch too much from mainline kernel sources.

It seems difficult to use i2c_add_numbered_adapter() unconditionally, as
i2c-eg20t is a PCI driver so you don't get to pass platform data to it.
Furthermore, i2c_add_numbered_adapter() is only suitable if machine
setup code could be run before any device driver is initialized;
otherwise odds are that another driver will have picked the i2c bus
number you wanted. I am unsure if this is possible at all on x86 at the
moment.

The way I would do it is from i2c-eg20t itself. Take a look at i2c-i801
for an example: at the end of the probe function, there is
hardware-specific code to instantiate a few I2C devices. If you have a
way to uniquely, reliably detect that you are running on your specific
target system, you can do the same.

I don't think it is particularly nice, BTW, but this is the only way I
found so far with what the i2c subsystem core offers. If anyone has
suggestions how to improve this, please speak up.

If you want to be able to use i2c_add_numbered_adapter() conditionally
without the help of platform data, then you need a hint from i2c-core.
Would the following patch help you? If it does, and others show
interest, and there are no objections, this could go upstream in kernel
3.1.

---
 drivers/i2c/busses/i2c-eg20t.c |    7 ++++++-
 drivers/i2c/i2c-boardinfo.c    |   20 ++++++++++++++++++++
 include/linux/i2c.h            |    5 +++++
 3 files changed, 31 insertions(+), 1 deletion(-)

--- linux-3.0-rc4.orig/drivers/i2c/i2c-boardinfo.c	2011-05-20 10:42:40.000000000 +0200
+++ linux-3.0-rc4/drivers/i2c/i2c-boardinfo.c	2011-06-23 10:15:56.000000000 +0200
@@ -90,3 +90,23 @@ i2c_register_board_info(int busnum,
 
 	return status;
 }
+
+/**
+ * i2c_adapter_is_static - let drivers know if their bus is static
+ * @busnum: identifies the bus
+ *
+ * After calling this function, i2c bus drivers can decide whether
+ * to call i2c_add_adapter or i2c_add_numbered_adapter.
+ */
+int
+i2c_adapter_is_static(int busnum)
+{
+	int is_static;
+
+	down_write(&__i2c_board_lock);
+	is_static = busnum < __i2c_first_dynamic_bus_num;
+	up_write(&__i2c_board_lock);
+
+	return is_static;
+}
+EXPORT_SYMBOL_GPL(i2c_adapter_is_static);
--- linux-3.0-rc4.orig/include/linux/i2c.h	2011-06-21 10:32:32.000000000 +0200
+++ linux-3.0-rc4/include/linux/i2c.h	2011-06-23 09:58:21.000000000 +0200
@@ -306,6 +306,7 @@ extern void i2c_unregister_device(struct
 extern int
 i2c_register_board_info(int busnum, struct i2c_board_info const *info,
 			unsigned n);
+extern int i2c_adapter_is_static(int busnum);
 #else
 static inline int
 i2c_register_board_info(int busnum, struct i2c_board_info const *info,
@@ -313,6 +314,10 @@ i2c_register_board_info(int busnum, stru
 {
 	return 0;
 }
+static inline int i2c_adapter_is_static(int busnum)
+{
+	return 0;
+}
 #endif /* I2C_BOARDINFO */
 
 /*
--- linux-3.0-rc4.orig/drivers/i2c/busses/i2c-eg20t.c	2011-05-30 20:45:09.000000000 +0200
+++ linux-3.0-rc4/drivers/i2c/busses/i2c-eg20t.c	2011-06-23 10:48:26.000000000 +0200
@@ -787,7 +787,12 @@ static int __devinit pch_i2c_probe(struc
 
 		pch_adap->dev.parent = &pdev->dev;
 
-		ret = i2c_add_adapter(pch_adap);
+		if (i2c_adapter_is_static(i)) {
+			/* We assume that a single PCI device is present */
+			pch_adap->nr = i;
+			ret = i2c_add_numbered_adapter(pch_adap);
+		} else
+			ret = i2c_add_adapter(pch_adap);
 		if (ret) {
 			pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i);
 			goto err_i2c_add_adapter;



-- 
Jean Delvare

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Need to use a I2C EEPROM on normal x86 architecture
       [not found]     ` <20110623111016.368a7ca5-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
@ 2011-06-27 11:50       ` Christian Gmeiner
       [not found]         ` <BANLkTimT_Sb4f6qC55uFUr6MfHzEd3wrGQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Christian Gmeiner @ 2011-06-27 11:50 UTC (permalink / raw)
  To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

2011/6/23 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>:
> Hi Christian,
>
> On Tue, 21 Jun 2011 13:54:52 +0200, Christian Gmeiner wrote:
>> Hi community,
>>
>> I am working on an embedded x86 device, which has an at24 based
>> eeprom. I am using
>> the i2c_eg20t driver to access the i2c bus. To be able to access the
>> eeprom in a separated
>> driver I did this:
>>
>> /* technical description of our used EEPROM */
>> static struct at24_platform_data custom_i2c_eeprom_info = {
>>       .byte_len       = EEPROM_BYTE_LEN,
>>       .page_size      = 16,
>>       .flags          = 0,
>
> Note that you don't have to mention struct members with value 0 (or
> NULL), as this is the default.
>

Thanks for this hint.

>>       .setup          = content_read,
>>       .context        = NULL,
>> };
>>
>> /* EEPROM at24 */
>> static struct i2c_board_info __initdata i2c_info[] =  {
>>       {
>>               I2C_BOARD_INFO("24c04", 0x50),
>>               .platform_data  = &custom_i2c_eeprom_info,
>>       },
>> };
>>
>> In the init function of my custom driver I do this:
>>
>>       /* register known devices on i2c bus */
>>       status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info))
>
> Out of curiosity, where did you put this code? Does x86 finally support
> per-machine initialization as e.g. arm does?
>

I have an other x86 based target machine, which runs a 2.6.36.4
kernel, where I created
a new driver under drivers/misc called custom_eeprom.c. The driver is
used to access
some special values stored in eeprom easily from userspace via /proc.

static int __init custom_eeprom_init(void)
{

    ...

	/* register known devices on i2c bus */
	status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info));

	/* create procfs entries */

	...
	
	return ret;
}

It is AMD LX800 based an I use the scx200_acb i2c driver, modified to
use i2c_add_numbered_adapter().
I did a small test with 3.0-rc4 on the LX800 target, but it get an
oops.. so there seems to be some changes in the involved subsystems.

>>
>> Now I run in some troubles... see
>> http://www.spinics.net/lists/linux-i2c/msg02022.html
>
> I see that I already replied to this post...
>
>> What options do I have to get this running? I could use
>> i2c_add_numbered_adapter, but I don't
>> want to touch too much from mainline kernel sources.
>
> It seems difficult to use i2c_add_numbered_adapter() unconditionally, as
> i2c-eg20t is a PCI driver so you don't get to pass platform data to it.
> Furthermore, i2c_add_numbered_adapter() is only suitable if machine
> setup code could be run before any device driver is initialized;
> otherwise odds are that another driver will have picked the i2c bus
> number you wanted. I am unsure if this is possible at all on x86 at the
> moment.
>
> The way I would do it is from i2c-eg20t itself. Take a look at i2c-i801
> for an example: at the end of the probe function, there is
> hardware-specific code to instantiate a few I2C devices. If you have a
> way to uniquely, reliably detect that you are running on your specific
> target system, you can do the same.
>
> I don't think it is particularly nice, BTW, but this is the only way I
> found so far with what the i2c subsystem core offers. If anyone has
> suggestions how to improve this, please speak up.
>
> If you want to be able to use i2c_add_numbered_adapter() conditionally
> without the help of platform data, then you need a hint from i2c-core.
> Would the following patch help you? If it does, and others show
> interest, and there are no objections, this could go upstream in kernel
> 3.1.
>

I get an oops quite early in kernel bootup... I will try to catch it
and if you are
interested I will post it here.

> ---
>  drivers/i2c/busses/i2c-eg20t.c |    7 ++++++-
>  drivers/i2c/i2c-boardinfo.c    |   20 ++++++++++++++++++++
>  include/linux/i2c.h            |    5 +++++
>  3 files changed, 31 insertions(+), 1 deletion(-)
>
> --- linux-3.0-rc4.orig/drivers/i2c/i2c-boardinfo.c      2011-05-20 10:42:40.000000000 +0200
> +++ linux-3.0-rc4/drivers/i2c/i2c-boardinfo.c   2011-06-23 10:15:56.000000000 +0200
> @@ -90,3 +90,23 @@ i2c_register_board_info(int busnum,
>
>        return status;
>  }
> +
> +/**
> + * i2c_adapter_is_static - let drivers know if their bus is static
> + * @busnum: identifies the bus
> + *
> + * After calling this function, i2c bus drivers can decide whether
> + * to call i2c_add_adapter or i2c_add_numbered_adapter.
> + */
> +int
> +i2c_adapter_is_static(int busnum)
> +{
> +       int is_static;
> +
> +       down_write(&__i2c_board_lock);
> +       is_static = busnum < __i2c_first_dynamic_bus_num;
> +       up_write(&__i2c_board_lock);
> +
> +       return is_static;
> +}
> +EXPORT_SYMBOL_GPL(i2c_adapter_is_static);
> --- linux-3.0-rc4.orig/include/linux/i2c.h      2011-06-21 10:32:32.000000000 +0200
> +++ linux-3.0-rc4/include/linux/i2c.h   2011-06-23 09:58:21.000000000 +0200
> @@ -306,6 +306,7 @@ extern void i2c_unregister_device(struct
>  extern int
>  i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>                        unsigned n);
> +extern int i2c_adapter_is_static(int busnum);
>  #else
>  static inline int
>  i2c_register_board_info(int busnum, struct i2c_board_info const *info,
> @@ -313,6 +314,10 @@ i2c_register_board_info(int busnum, stru
>  {
>        return 0;
>  }
> +static inline int i2c_adapter_is_static(int busnum)
> +{
> +       return 0;
> +}
>  #endif /* I2C_BOARDINFO */
>
>  /*
> --- linux-3.0-rc4.orig/drivers/i2c/busses/i2c-eg20t.c   2011-05-30 20:45:09.000000000 +0200
> +++ linux-3.0-rc4/drivers/i2c/busses/i2c-eg20t.c        2011-06-23 10:48:26.000000000 +0200
> @@ -787,7 +787,12 @@ static int __devinit pch_i2c_probe(struc
>
>                pch_adap->dev.parent = &pdev->dev;
>
> -               ret = i2c_add_adapter(pch_adap);
> +               if (i2c_adapter_is_static(i)) {
> +                       /* We assume that a single PCI device is present */
> +                       pch_adap->nr = i;
> +                       ret = i2c_add_numbered_adapter(pch_adap);
> +               } else
> +                       ret = i2c_add_adapter(pch_adap);
>                if (ret) {
>                        pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i);
>                        goto err_i2c_add_adapter;
>
>
>
> --
> Jean Delvare
>

--
Christian Gmeiner, MSc

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Need to use a I2C EEPROM on normal x86 architecture
       [not found]         ` <BANLkTimT_Sb4f6qC55uFUr6MfHzEd3wrGQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2011-07-02 16:36           ` Christian Gmeiner
  0 siblings, 0 replies; 5+ messages in thread
From: Christian Gmeiner @ 2011-07-02 16:36 UTC (permalink / raw)
  To: Jean Delvare; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

2011/6/27 Christian Gmeiner <christian.gmeiner-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
> 2011/6/23 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>:
>> Hi Christian,
>>
>> On Tue, 21 Jun 2011 13:54:52 +0200, Christian Gmeiner wrote:
>>> Hi community,
>>>
>>> I am working on an embedded x86 device, which has an at24 based
>>> eeprom. I am using
>>> the i2c_eg20t driver to access the i2c bus. To be able to access the
>>> eeprom in a separated
>>> driver I did this:
>>>
>>> /* technical description of our used EEPROM */
>>> static struct at24_platform_data custom_i2c_eeprom_info = {
>>>       .byte_len       = EEPROM_BYTE_LEN,
>>>       .page_size      = 16,
>>>       .flags          = 0,
>>
>> Note that you don't have to mention struct members with value 0 (or
>> NULL), as this is the default.
>>
>
> Thanks for this hint.
>
>>>       .setup          = content_read,
>>>       .context        = NULL,
>>> };
>>>
>>> /* EEPROM at24 */
>>> static struct i2c_board_info __initdata i2c_info[] =  {
>>>       {
>>>               I2C_BOARD_INFO("24c04", 0x50),
>>>               .platform_data  = &custom_i2c_eeprom_info,
>>>       },
>>> };
>>>
>>> In the init function of my custom driver I do this:
>>>
>>>       /* register known devices on i2c bus */
>>>       status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info))
>>
>> Out of curiosity, where did you put this code? Does x86 finally support
>> per-machine initialization as e.g. arm does?
>>
>
> I have an other x86 based target machine, which runs a 2.6.36.4
> kernel, where I created
> a new driver under drivers/misc called custom_eeprom.c. The driver is
> used to access
> some special values stored in eeprom easily from userspace via /proc.
>
> static int __init custom_eeprom_init(void)
> {
>
>    ...
>
>        /* register known devices on i2c bus */
>        status = i2c_register_board_info(0, i2c_info, ARRAY_SIZE(i2c_info));
>
>        /* create procfs entries */
>
>        ...
>
>        return ret;
> }
>
> It is AMD LX800 based an I use the scx200_acb i2c driver, modified to
> use i2c_add_numbered_adapter().
> I did a small test with 3.0-rc4 on the LX800 target, but it get an
> oops.. so there seems to be some changes in the involved subsystems.
>
>>>
>>> Now I run in some troubles... see
>>> http://www.spinics.net/lists/linux-i2c/msg02022.html
>>
>> I see that I already replied to this post...
>>
>>> What options do I have to get this running? I could use
>>> i2c_add_numbered_adapter, but I don't
>>> want to touch too much from mainline kernel sources.
>>
>> It seems difficult to use i2c_add_numbered_adapter() unconditionally, as
>> i2c-eg20t is a PCI driver so you don't get to pass platform data to it.
>> Furthermore, i2c_add_numbered_adapter() is only suitable if machine
>> setup code could be run before any device driver is initialized;
>> otherwise odds are that another driver will have picked the i2c bus
>> number you wanted. I am unsure if this is possible at all on x86 at the
>> moment.
>>
>> The way I would do it is from i2c-eg20t itself. Take a look at i2c-i801
>> for an example: at the end of the probe function, there is
>> hardware-specific code to instantiate a few I2C devices. If you have a
>> way to uniquely, reliably detect that you are running on your specific
>> target system, you can do the same.
>>
>> I don't think it is particularly nice, BTW, but this is the only way I
>> found so far with what the i2c subsystem core offers. If anyone has
>> suggestions how to improve this, please speak up.
>>
>> If you want to be able to use i2c_add_numbered_adapter() conditionally
>> without the help of platform data, then you need a hint from i2c-core.
>> Would the following patch help you? If it does, and others show
>> interest, and there are no objections, this could go upstream in kernel
>> 3.1.
>>
>
> I get an oops quite early in kernel bootup... I will try to catch it
> and if you are
> interested I will post it here.
>
>> ---
>>  drivers/i2c/busses/i2c-eg20t.c |    7 ++++++-
>>  drivers/i2c/i2c-boardinfo.c    |   20 ++++++++++++++++++++
>>  include/linux/i2c.h            |    5 +++++
>>  3 files changed, 31 insertions(+), 1 deletion(-)
>>
>> --- linux-3.0-rc4.orig/drivers/i2c/i2c-boardinfo.c      2011-05-20 10:42:40.000000000 +0200
>> +++ linux-3.0-rc4/drivers/i2c/i2c-boardinfo.c   2011-06-23 10:15:56.000000000 +0200
>> @@ -90,3 +90,23 @@ i2c_register_board_info(int busnum,
>>
>>        return status;
>>  }
>> +
>> +/**
>> + * i2c_adapter_is_static - let drivers know if their bus is static
>> + * @busnum: identifies the bus
>> + *
>> + * After calling this function, i2c bus drivers can decide whether
>> + * to call i2c_add_adapter or i2c_add_numbered_adapter.
>> + */
>> +int
>> +i2c_adapter_is_static(int busnum)
>> +{
>> +       int is_static;
>> +
>> +       down_write(&__i2c_board_lock);
>> +       is_static = busnum < __i2c_first_dynamic_bus_num;
>> +       up_write(&__i2c_board_lock);
>> +
>> +       return is_static;
>> +}
>> +EXPORT_SYMBOL_GPL(i2c_adapter_is_static);
>> --- linux-3.0-rc4.orig/include/linux/i2c.h      2011-06-21 10:32:32.000000000 +0200
>> +++ linux-3.0-rc4/include/linux/i2c.h   2011-06-23 09:58:21.000000000 +0200
>> @@ -306,6 +306,7 @@ extern void i2c_unregister_device(struct
>>  extern int
>>  i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>>                        unsigned n);
>> +extern int i2c_adapter_is_static(int busnum);
>>  #else
>>  static inline int
>>  i2c_register_board_info(int busnum, struct i2c_board_info const *info,
>> @@ -313,6 +314,10 @@ i2c_register_board_info(int busnum, stru
>>  {
>>        return 0;
>>  }
>> +static inline int i2c_adapter_is_static(int busnum)
>> +{
>> +       return 0;
>> +}
>>  #endif /* I2C_BOARDINFO */
>>
>>  /*
>> --- linux-3.0-rc4.orig/drivers/i2c/busses/i2c-eg20t.c   2011-05-30 20:45:09.000000000 +0200
>> +++ linux-3.0-rc4/drivers/i2c/busses/i2c-eg20t.c        2011-06-23 10:48:26.000000000 +0200
>> @@ -787,7 +787,12 @@ static int __devinit pch_i2c_probe(struc
>>
>>                pch_adap->dev.parent = &pdev->dev;
>>
>> -               ret = i2c_add_adapter(pch_adap);
>> +               if (i2c_adapter_is_static(i)) {
>> +                       /* We assume that a single PCI device is present */
>> +                       pch_adap->nr = i;
>> +                       ret = i2c_add_numbered_adapter(pch_adap);
>> +               } else
>> +                       ret = i2c_add_adapter(pch_adap);
>>                if (ret) {
>>                        pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i);
>>                        goto err_i2c_add_adapter;
>>
>>
>>

I played for some hours with the i2c subsystem an my problem. I got it
working somehow, but I have some questions :)

When does a driver gets loaded during kernel init? It looks like, if I
put a driver into drivers/misc it gets loaded before a driver
in dirvers/platform/x86.

If this is true in every case, I can not use i2c_register_board_info,
as the i2c driver gets loaded before my driver.
I think I will also run into problems using platform_add_devices...
hmmm.. not so easy to solve my problem and get
the driver flying.

I need to make a driver that does the following:

1) search an 24c04 eeprom at defined i2c addresses (0x50 and 0x52).
2) read model informations from eeprom
3) call platform_add_devices depending on model

This is what I get:

[    0.110652] i2c-core: driver [dummy] registered
[    1.497886] i2c-core: driver [at24] registered
[    3.076437] i2c /dev entries driver
[    3.087607] i2c_eg20t 0000:02:0c.2: PCI INT C -> GSI 18 (level,
low) -> IRQ 18
[    3.110134] i2c_adapter_is_static: busnum 0 -> is static 0
[    3.121981] i2c-dev: adapter [i2c_eg20t] registered as minor 0
[    3.122161] i2c i2c-0: adapter [i2c_eg20t] registered
[    3.122173] i2c-eg20t: i2c_add_adapter
[    3.178255] i2c_register_board_info for busnum 0
[    3.189125] i2c_register_board_info for busnum 0
[    3.199581] bachmann-ot: i2c_register 0

based on this module_init()

static int __init bachmann_ot_init(void)
{
        int ret;
        struct i2c_adapter *adap = NULL;
        struct i2c_client *e = NULL;

        /* declare the I2C devices by bus number */
        ret = i2c_register_board_info(0, eeprom_board_info,
ARRAY_SIZE(eeprom_board_info));
        printk(KERN_INFO "bachmann-ot: i2c_register %d\n", ret);

        /* instantiate the devices explicitly */
        adap = i2c_get_adapter(0);
        if (adap == NULL) {
                printk(KERN_ERR "bachmann-ot: failed to get i2c adapter\n");
                return -ENODEV;
        }

        i2c_put_adapter(adap);
        e = i2c_new_device(adap, &eeprom_board_info[0]);

        if (e == NULL) {
                printk(KERN_ERR "bachmann-ot: failed to eeprom device\n");
                return -ENODEV;
        }

        return 0;
}


If I do not use i2c_new_device, the at24 driver never gets registered
and the eeprom never gets
read.

--
Christian Gmeiner, MSc

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Need to use a I2C EEPROM on normal x86 architecture
@ 2014-06-25 13:51 Vijai Kumar
  0 siblings, 0 replies; 5+ messages in thread
From: Vijai Kumar @ 2014-06-25 13:51 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi Christian,
             I am facing the same issue with at24 driver. Can I know what 
patches you did to the driver. I tried the above changes but still I was not 
able to R/W the eeprom. Can you provide the full source code??

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-06-25 13:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-25 13:51 Need to use a I2C EEPROM on normal x86 architecture Vijai Kumar
  -- strict thread matches above, loose matches on Subject: below --
2011-06-21 11:54 Christian Gmeiner
     [not found] ` <BANLkTimfbe4ntzzTu0SXJothK1N56m1ghA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-06-23  9:10   ` Jean Delvare
     [not found]     ` <20110623111016.368a7ca5-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-06-27 11:50       ` Christian Gmeiner
     [not found]         ` <BANLkTimT_Sb4f6qC55uFUr6MfHzEd3wrGQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-07-02 16:36           ` Christian Gmeiner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).