Changeset 9244


Ignore:
Timestamp:
2007-10-10T16:14:34+02:00 (9 years ago)
Author:
juhosg
Message:

[adm5120] enhance the custom i2c-gpio driver (supports 4 buses from now on), update kernel configuration

Location:
trunk/target/linux/adm5120
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/adm5120/files/drivers/i2c/busses/i2c-gpio-custom.c

    r9218 r9244  
    77 *  it under the terms of the GNU General Public License version 2 as 
    88 *  published by the Free Software Foundation. 
     9 * 
     10 * --------------------------------------------------------------------------- 
     11 * 
     12 *  The behaviour of this driver can be altered by setting some parameters 
     13 *  from the insmod command line. 
     14 * 
     15 *  The following parameters are adjustable: 
     16 * 
     17 *      bus0    These four arguments can be arrays of 
     18 *      bus1    1-8 unsigned integers as follows: 
     19 *      bus2 
     20 *      bus3    <id>,<sda>,<scl>,<udelay>,<timeout>,<sda_od>,<scl_od>,<scl_oo> 
     21 * 
     22 *  where: 
     23 * 
     24 *  <id>        ID to used as device_id for the corresponding bus (required) 
     25 *  <sda>       GPIO pin ID to used for SDA (required) 
     26 *  <scl>       GPIO pin ID to used for SCL (required) 
     27 *  <udelay>    signal toggle delay. 
     28 *  <timeout>   clock stretching timeout. 
     29 *  <sda_od>    SDA is configured as open drain. 
     30 *  <scl_od>    SCL is configured as open drain. 
     31 *  <scl_oo>    SCL output drivers cannot be turned off. 
     32 * 
     33 *  See include/i2c-gpio.h for more information about the parameters. 
     34 * 
     35 *  If this driver is built into the kernel, you can use the following kernel 
     36 *  command line parameters, with the same values as the corresponding module 
     37 *  parameters listed above: 
     38 * 
     39 *      i2c-gpio-custom.bus0 
     40 *      i2c-gpio-custom.bus1 
     41 *      i2c-gpio-custom.bus2 
     42 *      i2c-gpio-custom.bus3 
    943 */ 
    1044 
     
    1751 
    1852#define DRV_NAME        "i2c-gpio-custom" 
    19 #define DRV_DESC        "Custom GPIO I2C device driver" 
     53#define DRV_DESC        "Custom GPIO-based I2C driver" 
     54#define DRV_VERSION     "0.1.0" 
    2055 
    21 static unsigned int sda = CONFIG_I2C_GPIO_CUSTOM_SDA; 
    22 static unsigned int scl = CONFIG_I2C_GPIO_CUSTOM_SCL; 
    23 static int id = CONFIG_I2C_GPIO_CUSTOM_DEVICE_ID; 
     56#define PFX             DRV_NAME ": " 
    2457 
    25 module_param(sda, uint, S_IRUGO); 
    26 MODULE_PARM_DESC(sda, "GPIO pin for SDA"); 
     58#define BUS_PARAM_ID            0 
     59#define BUS_PARAM_SDA           1 
     60#define BUS_PARAM_SCL           2 
     61#define BUS_PARAM_UDELAY        3 
     62#define BUS_PARAM_TIMEOUT       4 
     63#define BUS_PARAM_SDA_OD        5 
     64#define BUS_PARAM_SCL_OD        6 
     65#define BUS_PARAM_SCL_OO        7 
    2766 
    28 module_param(scl, uint, S_IRUGO); 
    29 MODULE_PARM_DESC(scl, "GPIO pin for SCL"); 
     67#define BUS_PARAM_REQUIRED      3 
     68#define BUS_PARAM_COUNT         8 
     69#define BUS_COUNT_MAX           4 
    3070 
    31 module_param(id, int, S_IRUGO); 
    32 MODULE_PARM_DESC(id, "device id of the i2c-gpio device"); 
     71static unsigned int bus0[BUS_PARAM_COUNT] __initdata; 
     72static unsigned int bus1[BUS_PARAM_COUNT] __initdata; 
     73static unsigned int bus2[BUS_PARAM_COUNT] __initdata; 
     74static unsigned int bus3[BUS_PARAM_COUNT] __initdata; 
    3375 
    34 static struct i2c_gpio_platform_data i2c_data; 
    35 static struct platform_device i2c_device; 
     76static unsigned int bus_nump[BUS_COUNT_MAX] __initdata; 
    3677 
    37 static void i2c_gpio_custom_release(struct platform_device *pdev) 
     78#define BUS_PARM_DESC \ 
     79        " config -> id,sda,scl[,udelay,timeout,sda_od,scl_od,scl_oo]" 
     80 
     81module_param_array(bus0, uint, &bus_nump[0], 0); 
     82MODULE_PARM_DESC(bus0, "bus0" BUS_PARM_DESC); 
     83module_param_array(bus1, uint, &bus_nump[1], 0); 
     84MODULE_PARM_DESC(bus1, "bus1" BUS_PARM_DESC); 
     85module_param_array(bus2, uint, &bus_nump[2], 0); 
     86MODULE_PARM_DESC(bus2, "bus2" BUS_PARM_DESC); 
     87module_param_array(bus3, uint, &bus_nump[3], 0); 
     88MODULE_PARM_DESC(bus3, "bus3" BUS_PARM_DESC); 
     89 
     90static struct platform_device *devices[BUS_COUNT_MAX]; 
     91static unsigned int nr_devices; 
     92 
     93static void i2c_gpio_custom_cleanup(void) 
    3894{ 
    39         /* nothing to do */ 
     95        int i; 
     96 
     97        for (i = 0; i < nr_devices; i++) 
     98                if (devices[i]) 
     99                        platform_device_unregister(devices[i]); 
     100} 
     101 
     102static int __init i2c_gpio_custom_add_one(unsigned int id, unsigned int *params) 
     103{ 
     104        struct platform_device *pdev; 
     105        struct i2c_gpio_platform_data pdata; 
     106        int err; 
     107 
     108        if (!bus_nump[id]) 
     109                return 0; 
     110 
     111        if (bus_nump[id] < BUS_PARAM_REQUIRED) { 
     112                printk(KERN_ERR PFX "not enough parameters for bus%d\n", id); 
     113                err = -EINVAL; 
     114                goto err; 
     115        } 
     116 
     117        pdev = platform_device_alloc("i2c-gpio", params[BUS_PARAM_ID]); 
     118        if (!pdev) { 
     119                err = -ENOMEM; 
     120                goto err; 
     121        } 
     122 
     123        devices[nr_devices++] = pdev; 
     124 
     125        pdata.sda_pin = params[BUS_PARAM_SDA]; 
     126        pdata.scl_pin = params[BUS_PARAM_SCL]; 
     127        pdata.udelay = params[BUS_PARAM_UDELAY]; 
     128        pdata.timeout = params[BUS_PARAM_TIMEOUT]; 
     129        pdata.sda_is_open_drain = params[BUS_PARAM_SDA_OD] != 0; 
     130        pdata.scl_is_open_drain = params[BUS_PARAM_SCL_OD] != 0; 
     131        pdata.scl_is_output_only = params[BUS_PARAM_SCL_OO] != 0; 
     132 
     133        err = platform_device_add_data(pdev, &pdata, sizeof(pdata)); 
     134        if (err) 
     135                goto err; 
     136 
     137        err = platform_device_register(pdev); 
     138        if (err) 
     139                goto err; 
     140 
     141        return 0; 
     142 
     143err: 
     144        return err; 
    40145} 
    41146 
     
    44149        int err; 
    45150 
    46         i2c_data.sda_pin = sda; 
    47         i2c_data.scl_pin = scl; 
     151        printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n"); 
    48152 
    49         i2c_device.name = "i2c-gpio"; 
    50         i2c_device.id   = id; 
     153        err = i2c_gpio_custom_add_one(0, bus0); 
     154        if (err) goto err; 
    51155 
    52         i2c_device.dev.platform_data    = &i2c_data, 
    53         i2c_device.dev.release          = i2c_gpio_custom_release, 
     156        err = i2c_gpio_custom_add_one(1, bus1); 
     157        if (err) goto err; 
    54158 
    55         err = platform_device_register(&i2c_device); 
     159        err = i2c_gpio_custom_add_one(2, bus2); 
     160        if (err) goto err; 
    56161 
     162        err = i2c_gpio_custom_add_one(3, bus3); 
     163        if (err) goto err; 
     164 
     165        if (!nr_devices) { 
     166                printk(KERN_ERR PFX "no bus parameter(s) specified\n"); 
     167                err = -ENODEV; 
     168                goto err; 
     169        } 
     170 
     171        return 0; 
     172 
     173err: 
     174        i2c_gpio_custom_cleanup(); 
    57175        return err; 
    58176} 
     177module_init(i2c_gpio_custom_init); 
    59178 
    60179static void __exit i2c_gpio_custom_exit(void) 
    61180{ 
    62         platform_device_unregister(&i2c_device); 
     181        i2c_gpio_custom_cleanup(); 
    63182} 
     183module_exit(i2c_gpio_custom_exit); 
    64184 
    65 module_init(i2c_gpio_custom_init); 
    66 module_exit(i2c_gpio_custom_exit); 
    67185 
    68186MODULE_LICENSE("GPL v2"); 
    69187MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org >"); 
    70188MODULE_DESCRIPTION(DRV_DESC); 
     189MODULE_VERSION(DRV_VERSION); 
    71190 
  • trunk/target/linux/adm5120/patches-2.6.22/300-i2c_gpio_custom.patch

    r9218 r9244  
    11--- linux-2.6.22.4.orig/drivers/i2c/busses/Kconfig      2007-08-21 06:33:06.000000000 +0200 
    22+++ linux-2.6.22.4/drivers/i2c/busses/Kconfig   2007-10-09 12:53:13.000000000 +0200 
    3 @@ -125,6 +125,40 @@ 
     3@@ -125,6 +125,17 @@ 
    44          This is a very simple bitbanging I2C driver utilizing the 
    55          arch-neutral GPIO API to control the SCL and SDA lines. 
    66  
    77+config I2C_GPIO_CUSTOM 
    8 +       tristate "Custom GPIO-based I2C device" 
     8+       tristate "Custom GPIO-based I2C driver" 
    99+       depends on GENERIC_GPIO 
    1010+       select I2C_GPIO 
    1111+       help 
    12 +         This is an I2C driver to register a custom i2c-gpio device. 
     12+         This is an I2C driver to register 1 to 4 custom I2C buses using  
     13+         GPIO lines. 
    1314+ 
    1415+         This support is also available as a module.  If so, the module 
    15 +         will be called i2c-gpio-dev. 
    16 + 
    17 +config I2C_GPIO_CUSTOM_SDA 
    18 +       int "Custom GPIO pin for SDA" 
    19 +       depends on I2C_GPIO_CUSTOM 
    20 +       default "0" 
    21 +       help 
    22 +         Enter the GPIO pin number used for the SDA signal.  This value can 
    23 +         also be specified with a module parameter. 
    24 + 
    25 +config I2C_GPIO_CUSTOM_SCL 
    26 +       int "Custom GPIO pin for SCL" 
    27 +       depends on I2C_GPIO_CUSTOM 
    28 +       default "1" 
    29 +       help 
    30 +         Enter the GPIO pin number used for the SCL signal.  This value can 
    31 +         also be specified with a module parameter. 
    32 + 
    33 +config I2C_GPIO_CUSTOM_DEVICE_ID 
    34 +       int "Custom GPIO device id" 
    35 +       depends on I2C_GPIO_CUSTOM 
    36 +       default "0" 
    37 +       help 
    38 +         Enter the number used for the device id of the custom i2c-gpio device. 
    39 +         This value can also be specified with a module parameter. 
     16+         will be called i2c-gpio-custom. 
    4017+ 
    4118 config I2C_HYDRA 
  • trunk/target/linux/adm5120/router_be/config-2.6.22

    r9220 r9244  
    7474# CONFIG_HZ_100 is not set 
    7575CONFIG_HZ_250=y 
    76 CONFIG_I2C=m 
    77 CONFIG_I2C_ALGOBIT=m 
    78 CONFIG_I2C_BOARDINFO=y 
    79 CONFIG_I2C_CHARDEV=m 
    80 CONFIG_I2C_GPIO=m 
    81 CONFIG_I2C_GPIO_CUSTOM=m 
    82 CONFIG_I2C_GPIO_CUSTOM_DEVICE_ID=0 
    83 CONFIG_I2C_GPIO_CUSTOM_SCL=1 
    84 CONFIG_I2C_GPIO_CUSTOM_SDA=0 
     76# CONFIG_I2C is not set 
    8577# CONFIG_IDE is not set 
    8678CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m 
     
    197189CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y 
    198190CONFIG_SCSI_WAIT_SCAN=m 
    199 # CONFIG_SENSORS_PC87360 is not set 
    200191# CONFIG_SERIAL_8250 is not set 
    201192# CONFIG_SERIAL_ADM5120 is not set 
  • trunk/target/linux/adm5120/router_le/config-2.6.22

    r9220 r9244  
    7474# CONFIG_HZ_100 is not set 
    7575CONFIG_HZ_250=y 
    76 CONFIG_I2C=m 
    77 CONFIG_I2C_ALGOBIT=m 
    78 CONFIG_I2C_BOARDINFO=y 
    79 CONFIG_I2C_CHARDEV=m 
    80 CONFIG_I2C_GPIO=m 
    81 CONFIG_I2C_GPIO_CUSTOM=m 
    82 CONFIG_I2C_GPIO_CUSTOM_DEVICE_ID=0 
    83 CONFIG_I2C_GPIO_CUSTOM_SCL=1 
    84 CONFIG_I2C_GPIO_CUSTOM_SDA=0 
     76# CONFIG_I2C is not set 
    8577# CONFIG_IDE is not set 
    8678CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m 
     
    207199CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y 
    208200CONFIG_SCSI_WAIT_SCAN=m 
    209 # CONFIG_SENSORS_PC87360 is not set 
    210201# CONFIG_SERIAL_8250 is not set 
    211202# CONFIG_SERIAL_ADM5120 is not set 
Note: See TracChangeset for help on using the changeset viewer.