1*4882a593Smuzhiyun======================== 2*4882a593SmuzhiyunKernel driver i2c-ocores 3*4882a593Smuzhiyun======================== 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunSupported adapters: 6*4882a593Smuzhiyun * OpenCores.org I2C controller by Richard Herveille (see datasheet link) 7*4882a593Smuzhiyun https://opencores.org/project/i2c/overview 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunAuthor: Peter Korsgaard <peter@korsgaard.com> 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunDescription 12*4882a593Smuzhiyun----------- 13*4882a593Smuzhiyun 14*4882a593Smuzhiyuni2c-ocores is an i2c bus driver for the OpenCores.org I2C controller 15*4882a593SmuzhiyunIP core by Richard Herveille. 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunUsage 18*4882a593Smuzhiyun----- 19*4882a593Smuzhiyun 20*4882a593Smuzhiyuni2c-ocores uses the platform bus, so you need to provide a struct 21*4882a593Smuzhiyunplatform_device with the base address and interrupt number. The 22*4882a593Smuzhiyundev.platform_data of the device should also point to a struct 23*4882a593Smuzhiyunocores_i2c_platform_data (see linux/platform_data/i2c-ocores.h) describing the 24*4882a593Smuzhiyundistance between registers and the input clock speed. 25*4882a593SmuzhiyunThere is also a possibility to attach a list of i2c_board_info which 26*4882a593Smuzhiyunthe i2c-ocores driver will add to the bus upon creation. 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunE.G. something like:: 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun static struct resource ocores_resources[] = { 31*4882a593Smuzhiyun [0] = { 32*4882a593Smuzhiyun .start = MYI2C_BASEADDR, 33*4882a593Smuzhiyun .end = MYI2C_BASEADDR + 8, 34*4882a593Smuzhiyun .flags = IORESOURCE_MEM, 35*4882a593Smuzhiyun }, 36*4882a593Smuzhiyun [1] = { 37*4882a593Smuzhiyun .start = MYI2C_IRQ, 38*4882a593Smuzhiyun .end = MYI2C_IRQ, 39*4882a593Smuzhiyun .flags = IORESOURCE_IRQ, 40*4882a593Smuzhiyun }, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* optional board info */ 44*4882a593Smuzhiyun struct i2c_board_info ocores_i2c_board_info[] = { 45*4882a593Smuzhiyun { 46*4882a593Smuzhiyun I2C_BOARD_INFO("tsc2003", 0x48), 47*4882a593Smuzhiyun .platform_data = &tsc2003_platform_data, 48*4882a593Smuzhiyun .irq = TSC_IRQ 49*4882a593Smuzhiyun }, 50*4882a593Smuzhiyun { 51*4882a593Smuzhiyun I2C_BOARD_INFO("adv7180", 0x42 >> 1), 52*4882a593Smuzhiyun .irq = ADV_IRQ 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun static struct ocores_i2c_platform_data myi2c_data = { 57*4882a593Smuzhiyun .regstep = 2, /* two bytes between registers */ 58*4882a593Smuzhiyun .clock_khz = 50000, /* input clock of 50MHz */ 59*4882a593Smuzhiyun .devices = ocores_i2c_board_info, /* optional table of devices */ 60*4882a593Smuzhiyun .num_devices = ARRAY_SIZE(ocores_i2c_board_info), /* table size */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun static struct platform_device myi2c = { 64*4882a593Smuzhiyun .name = "ocores-i2c", 65*4882a593Smuzhiyun .dev = { 66*4882a593Smuzhiyun .platform_data = &myi2c_data, 67*4882a593Smuzhiyun }, 68*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(ocores_resources), 69*4882a593Smuzhiyun .resource = ocores_resources, 70*4882a593Smuzhiyun }; 71