/* This returns a nice name for a new directory; for example lm78-isa-0310 (for a LM78 chip on the ISA bus at port 0x310), or lm75-i2c-3-4e (for a LM75 chip on the third i2c bus at address 0x4e). name is allocated first. */ int i2c_create_name(char **name, const char *prefix, struct i2c_adapter *adapter, int addr) { char name_buffer[50]; int id; if (i2c_is_isa_adapter(adapter)) sprintf(name_buffer, "%s-isa-%04x", prefix, addr); else { if ((id = i2c_adapter_id(adapter)) < 0) return -ENOENT; sprintf(name_buffer, "%s-i2c-%d-%02x", prefix, id, addr); } *name = kmalloc(strlen(name_buffer) + 1, GFP_KERNEL); strcpy(*name, name_buffer); return 0; }
/* This function is called by i2c_detect */ int ltc1710_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int i; struct i2c_client *new_client; struct ltc1710_data *data; int err = 0; const char *type_name, *client_name; /* Make sure we aren't probing the ISA bus!! This is just a safety check at this moment; i2c_detect really won't call us. */ #ifdef DEBUG if (i2c_is_isa_adapter(adapter)) { printk ("ltc1710.o: ltc1710_detect called for an ISA bus adapter?!?\n"); return 0; } #endif if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) goto ERROR0; /* OK. For now, we presume we have a valid client. We now create the client structure, even though we cannot fill it completely yet. But it allows us to access ltc1710_{read,write}_value. */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct ltc1710_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct ltc1710_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = <c1710_driver; new_client->flags = 0; /* Now, we would do the remaining detection. But the LTC1710 is plainly impossible to detect! Stupid chip. */ /* Determine the chip type - only one kind supported! */ if (kind <= 0) kind = ltc1710; if (kind == ltc1710) { type_name = "ltc1710"; client_name = "LTC1710 chip"; } else { #ifdef DEBUG printk("ltc1710.o: Internal error: unknown kind (%d)?!?", kind); #endif goto ERROR1; } /* Fill in the remaining client fields and put it into the global list */ strcpy(new_client->name, client_name); new_client->id = ltc1710_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry(new_client, type_name, ltc1710_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; return 0; /* OK, this is not exactly good programming practice, usually. But it is very code-efficient in this case. */ ERROR4: i2c_detach_client(new_client); ERROR3: ERROR1: kfree(new_client); ERROR0: return err; }
/* Very inefficient for ISA detects, and won't work for 10-bit addresses! */ int i2c_detect(struct i2c_adapter *adapter, struct i2c_address_data *address_data, i2c_found_addr_proc * found_proc) { int addr, i, found, j, err; struct i2c_force_data *this_force; int is_isa = i2c_is_isa_adapter(adapter); int adapter_id = is_isa ? SENSORS_ISA_BUS : i2c_adapter_id(adapter); /* Forget it if we can't probe using SMBUS_QUICK */ if ((!is_isa) && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) return -1; for (addr = 0x00; addr <= (is_isa ? 0xffff : 0x7f); addr++) { if ((is_isa && check_region(addr, 1)) || (!is_isa && i2c_check_addr(adapter, addr))) continue; /* If it is in one of the force entries, we don't do any detection at all */ found = 0; for (i = 0; !found && (this_force = address_data->forces + i, this_force->force); i++) { for (j = 0; !found && (this_force->force[j] != SENSORS_I2C_END); j += 2) { if ( ((adapter_id == this_force->force[j]) || ((this_force-> force[j] == SENSORS_ANY_I2C_BUS) && !is_isa)) && (addr == this_force->force[j + 1])) { #ifdef DEBUG printk ("i2c-proc.o: found force parameter for adapter %d, addr %04x\n", adapter_id, addr); #endif if ( (err = found_proc(adapter, addr, 0, this_force-> kind))) return err; found = 1; } } } if (found) continue; /* If this address is in one of the ignores, we can forget about it right now */ for (i = 0; !found && (address_data->ignore[i] != SENSORS_I2C_END); i += 2) { if ( ((adapter_id == address_data->ignore[i]) || ((address_data-> ignore[i] == SENSORS_ANY_I2C_BUS) && !is_isa)) && (addr == address_data->ignore[i + 1])) { #ifdef DEBUG printk ("i2c-proc.o: found ignore parameter for adapter %d, " "addr %04x\n", adapter_id, addr); #endif found = 1; } } for (i = 0; !found && (address_data->ignore_range[i] != SENSORS_I2C_END); i += 3) { if ( ((adapter_id == address_data->ignore_range[i]) || ((address_data-> ignore_range[i] == SENSORS_ANY_I2C_BUS) & !is_isa)) && (addr >= address_data->ignore_range[i + 1]) && (addr <= address_data->ignore_range[i + 2])) { #ifdef DEBUG printk ("i2c-proc.o: found ignore_range parameter for adapter %d, " "addr %04x\n", adapter_id, addr); #endif found = 1; } } if (found) continue; /* Now, we will do a detection, but only if it is in the normal or probe entries */ if (is_isa) { for (i = 0; !found && (address_data->normal_isa[i] != SENSORS_ISA_END); i += 1) { if (addr == address_data->normal_isa[i]) { #ifdef DEBUG printk ("i2c-proc.o: found normal isa entry for adapter %d, " "addr %04x\n", adapter_id, addr); #endif found = 1; } } for (i = 0; !found && (address_data->normal_isa_range[i] != SENSORS_ISA_END); i += 3) { if ((addr >= address_data->normal_isa_range[i]) && (addr <= address_data->normal_isa_range[i + 1]) && ((addr - address_data->normal_isa_range[i]) % address_data->normal_isa_range[i + 2] == 0)) { #ifdef DEBUG printk ("i2c-proc.o: found normal isa_range entry for adapter %d, " "addr %04x", adapter_id, addr); #endif found = 1; } } } else { for (i = 0; !found && (address_data->normal_i2c[i] != SENSORS_I2C_END); i += 1) { if (addr == address_data->normal_i2c[i]) { found = 1; #ifdef DEBUG printk ("i2c-proc.o: found normal i2c entry for adapter %d, " "addr %02x", adapter_id, addr); #endif } } for (i = 0; !found && (address_data->normal_i2c_range[i] != SENSORS_I2C_END); i += 2) { if ((addr >= address_data->normal_i2c_range[i]) && (addr <= address_data->normal_i2c_range[i + 1])) { #ifdef DEBUG printk ("i2c-proc.o: found normal i2c_range entry for adapter %d, " "addr %04x\n", adapter_id, addr); #endif found = 1; } } } for (i = 0; !found && (address_data->probe[i] != SENSORS_I2C_END); i += 2) { if (((adapter_id == address_data->probe[i]) || ((address_data-> probe[i] == SENSORS_ANY_I2C_BUS) & !is_isa)) && (addr == address_data->probe[i + 1])) { #ifdef DEBUG printk ("i2c-proc.o: found probe parameter for adapter %d, " "addr %04x\n", adapter_id, addr); #endif found = 1; } } for (i = 0; !found && (address_data->probe_range[i] != SENSORS_I2C_END); i += 3) { if ( ((adapter_id == address_data->probe_range[i]) || ((address_data->probe_range[i] == SENSORS_ANY_I2C_BUS) & !is_isa)) && (addr >= address_data->probe_range[i + 1]) && (addr <= address_data->probe_range[i + 2])) { found = 1; #ifdef DEBUG printk ("i2c-proc.o: found probe_range parameter for adapter %d, " "addr %04x\n", adapter_id, addr); #endif } } if (!found) continue; /* OK, so we really should examine this address. First check whether there is some client here at all! */ if (is_isa || (i2c_smbus_xfer (adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) >= 0)) if ((err = found_proc(adapter, addr, 0, -1))) return err; } return 0; }
int mtp008_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { const char *type_name = ""; const char *client_name = ""; int is_isa, err, sysid; struct i2c_client *new_client; struct mtp008_data *data; err = 0; is_isa = i2c_is_isa_adapter(adapter); if (is_isa || !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) goto ERROR0; /* * We presume we have a valid client. We now create the client * structure, even though we cannot fill it completely yet. But it * allows us to use mtp008_(read|write)_value(). */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct mtp008_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct mtp008_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &mtp008_driver; new_client->flags = 0; /* * Remaining detection. */ if (kind < 0) { if (mtp008_read_value(new_client, MTP008_REG_CHIPID) != 0xac) goto ERROR1; } /* * Fill in the remaining client fields and put it into the global list. */ type_name = "mtp008"; client_name = "MTP008 chip"; strcpy(new_client->name, client_name); data->type = kind; new_client->id = mtp008_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* * Tell the I2C layer that a new client has arrived. */ if ((err = i2c_attach_client(new_client))) goto ERROR1; /* * Register a new directory entry with the sensors module. */ if ((sysid = i2c_register_entry(new_client, type_name, mtp008_dir_table_template, THIS_MODULE)) < 0) { err = sysid; goto ERROR2; } data->sysctl_id = sysid; /* * Initialize the MTP008 chip. */ mtp008_init_client(new_client); return 0; /* * Error handling. Bad programming practise but very code efficient. */ ERROR2: i2c_detach_client(new_client); ERROR1: kfree(new_client); ERROR0: return err; }
int sis5595_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int i; struct i2c_client *new_client; struct sis5595_data *data; int err = 0; const char *type_name = "sis5595"; const char *client_name = "SIS5595 chip"; char val; u16 a; /* Make sure we are probing the ISA bus!! */ if (!i2c_is_isa_adapter(adapter)) { printk ("sis5595.o: sis5595_detect called for an I2C bus adapter?!?\n"); return 0; } if(force_addr) address = force_addr & ~(SIS5595_EXTENT - 1); if (check_region(address, SIS5595_EXTENT)) { printk("sis5595.o: region 0x%x already in use!\n", address); return -ENODEV; } if(force_addr) { printk("sis5595.o: forcing ISA address 0x%04X\n", address); if (PCIBIOS_SUCCESSFUL != pci_write_config_word(s_bridge, SIS5595_BASE_REG, address)) return -ENODEV; if (PCIBIOS_SUCCESSFUL != pci_read_config_word(s_bridge, SIS5595_BASE_REG, &a)) return -ENODEV; if ((a & ~(SIS5595_EXTENT - 1)) != address) { /* doesn't work for some chips? */ printk("sis5595.o: force address failed\n"); return -ENODEV; } } if (PCIBIOS_SUCCESSFUL != pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val)) return -ENODEV; if((val & 0x80) == 0) { printk("sis5595.o: enabling sensors\n"); if (PCIBIOS_SUCCESSFUL != pci_write_config_byte(s_bridge, SIS5595_ENABLE_REG, val | 0x80)) return -ENODEV; if (PCIBIOS_SUCCESSFUL != pci_read_config_byte(s_bridge, SIS5595_ENABLE_REG, &val)) return -ENODEV; if((val & 0x80) == 0) { /* doesn't work for some chips! */ printk("sis5595.o: sensors enable failed - not supported?\n"); return -ENODEV; } } if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct sis5595_data), GFP_KERNEL))) { return -ENOMEM; } data = (struct sis5595_data *) (new_client + 1); new_client->addr = address; init_MUTEX(&data->lock); new_client->data = data; new_client->adapter = adapter; new_client->driver = &sis5595_driver; new_client->flags = 0; /* Reserve the ISA region */ request_region(address, SIS5595_EXTENT, type_name); /* Check revision and pin registers to determine whether 3 or 4 voltages */ pci_read_config_byte(s_bridge, SIS5595_REVISION_REG, &(data->revision)); if(data->revision < REV2MIN) { data->maxins = 3; } else { pci_read_config_byte(s_bridge, SIS5595_PIN_REG, &val); if(val & 0x80) /* 3 voltages, 1 temp */ data->maxins = 3; else /* 4 voltages, no temps */ data->maxins = 4; } /* Fill in the remaining client fields and put it into the global list */ strcpy(new_client->name, client_name); new_client->id = sis5595_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry((struct i2c_client *) new_client, type_name, sis5595_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; /* Initialize the SIS5595 chip */ sis5595_init_client(new_client); return 0; ERROR4: i2c_detach_client(new_client); ERROR3: release_region(address, SIS5595_EXTENT); kfree(new_client); return err; }
/* This function is called by i2c_detect */ int icspll_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int err, i; struct i2c_client *new_client; struct icspll_data *data; err = 0; /* Make sure we aren't probing the ISA bus!! */ if (i2c_is_isa_adapter(adapter)) return 0; if (address != ADDRESS) return 0; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { printk("icspll.o: Adapter does not support SMBus writes and Block reads\n"); goto ERROR0; } /* Allocate space for a new client structure */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct icspll_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } /* Fill the new client structure with data */ data = (struct icspll_data *) (new_client + 1); new_client->data = data; new_client->id = icspll_id++; new_client->addr = address; new_client->adapter = adapter; new_client->driver = &icspll_driver; new_client->flags = 0; strcpy(new_client->name, "Clock chip"); data->valid = 0; init_MUTEX(&data->update_lock); /* use write-quick for detection */ if (i2c_smbus_write_quick(new_client, 0x00) < 0) { printk("icspll.o: No device found at 0x%X\n", address); goto ERROR1; } /* fill data structure so unknown registers are 0xFF */ data->data[0] = ICSPLL_SIZE; for (i = 1; i <= ICSPLL_SIZE; i++) data->data[i] = 0xFF; /* Tell i2c-core a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR2; /* Register a new directory entry with module sensors */ if ((err = i2c_register_entry(new_client, "icspll", icspll_dir_table_template, THIS_MODULE)) < 0) goto ERROR3; data->sysctl_id = err; err = 0; ERROR3: i2c_detach_client(new_client); ERROR2: ERROR1: kfree(new_client); ERROR0: return err; }
/* * The following function does more than just detection. If detection * succeeds, it also registers the new chip. */ static int max1619_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { struct i2c_client *new_client; struct max1619_data *data; int err = 0; const char *type_name = ""; const char *client_name = ""; #ifdef DEBUG if (i2c_is_isa_adapter(adapter)) { printk(KERN_DEBUG "max1619.o: Called for an ISA bus " "adapter, aborting.\n"); return 0; } #endif if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { #ifdef DEBUG printk(KERN_DEBUG "max1619.o: I2C bus doesn't support " "byte read mode, skipping.\n"); #endif return 0; } if (!(data = kmalloc(sizeof(struct max1619_data), GFP_KERNEL))) { printk(KERN_ERR "max1619.o: Out of memory in " "max1619_detect (new_client).\n"); return -ENOMEM; } /* * The common I2C client data is placed right before the * MAX1619-specific data. The MAX1619-specific data is pointed to * by the data field from the I2C client da1ta. */ new_client = &data->client; new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &max1619_driver; new_client->flags = 0; /* * Now we do the remaining detection. A negative kind means that * the driver was loaded with no force parameter (default), so we * must both detect and identify the chip. A zero kind means that * the driver was loaded with the force parameter, the detection * step shall be skipped. A positive kind means that the driver * was loaded with the force parameter and a given kind of chip is * requested, so both the detection and the identification steps * are skipped. */ if (kind < 0) { u8 reg_config, reg_convrate, reg_status; reg_config = i2c_smbus_read_byte_data(new_client, MAX1619_REG_R_CONFIG); reg_convrate = i2c_smbus_read_byte_data(new_client, MAX1619_REG_R_CONVRATE); reg_status = i2c_smbus_read_byte_data(new_client, MAX1619_REG_R_STATUS); if ((reg_config & 0x03) != 0x00 || reg_convrate > 0x07 || (reg_status & 0x61) != 0x00) { #ifdef DEBUG printk(KERN_DEBUG "max1619.o: Detection failed at " "0x%02x.\n", address); #endif goto ERROR1; } } if (kind <= 0) { u8 man_id, chip_id; man_id = i2c_smbus_read_byte_data(new_client, MAX1619_REG_R_MAN_ID); chip_id = i2c_smbus_read_byte_data(new_client, MAX1619_REG_R_CHIP_ID); if ((man_id == 0x4D) && (chip_id == 0x04)) { kind = max1619; } } if (kind <= 0) { printk(KERN_INFO "max1619.o: Unsupported chip.\n"); goto ERROR1; } if (kind == max1619) { type_name = "max1619"; client_name = "MAX1619 chip"; } else { printk(KERN_ERR "max1619.o: Unknown kind %d.\n", kind); goto ERROR1; } /* * OK, we got a valid chip so we can fill in the remaining client * fields. */ strcpy(new_client->name, client_name); data->valid = 0; init_MUTEX(&data->update_lock); /* * Tell the I2C layer a new client has arrived. */ if ((err = i2c_attach_client(new_client))) { printk(KERN_ERR "max1619.o: Failed attaching client.\n"); goto ERROR1; } /* * Register a new directory entry. */ if ((err = i2c_register_entry(new_client, type_name, max1619_dir_table_template, THIS_MODULE)) < 0) { printk(KERN_ERR "max1619.o: Failed registering directory " "entry.\n"); goto ERROR2; } data->sysctl_id = err; /* * Initialize the MAX1619 chip. */ max1619_init_client(new_client); return 0; ERROR2: i2c_detach_client(new_client); ERROR1: kfree(data); return err; }
static int adm1025_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int i; struct i2c_client *new_client; struct adm1025_data *data; int err = 0; const char *type_name = ""; const char *client_name = ""; /* Make sure we aren't probing the ISA bus!! This is just a safety check at this moment; i2c_detect really won't call us. */ #ifdef DEBUG if (i2c_is_isa_adapter(adapter)) { printk ("adm1025.o: adm1025_detect called for an ISA bus adapter?!?\n"); return 0; } #endif if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) goto ERROR0; /* OK. For now, we presume we have a valid client. We now create the client structure, even though we cannot fill it completely yet. But it allows us to access adm1025_{read,write}_value. */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct adm1025_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct adm1025_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &adm1025_driver; new_client->flags = 0; /* Now, we do the remaining detection. */ if (kind < 0) { if((adm1025_read_value(new_client,ADM1025_REG_CONFIG) & 0x80) != 0x00) goto ERROR1; } /* Determine the chip type. */ if (kind <= 0) { i = adm1025_read_value(new_client, ADM1025_REG_COMPANY_ID); if (i == 0x41) kind = adm1025; else { if (kind == 0) printk ("adm1025.o: Ignoring 'force' parameter for unknown chip at " "adapter %d, address 0x%02x\n", i2c_adapter_id(adapter), address); goto ERROR1; } } if (kind == adm1025) { type_name = "adm1025"; client_name = "ADM1025 chip"; } else { #ifdef DEBUG printk("adm1025.o: Internal error: unknown kind (%d)?!?", kind); #endif goto ERROR1; } /* Fill in the remaining client fields and put it into the global list */ strcpy(new_client->name, client_name); data->type = kind; new_client->id = adm1025_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry(new_client, type_name, adm1025_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; /* Initialize the ADM1025 chip */ adm1025_init_client(new_client); return 0; /* OK, this is not exactly good programming practice, usually. But it is very code-efficient in this case. */ ERROR4: i2c_detach_client(new_client); ERROR3: ERROR1: kfree(new_client); ERROR0: return err; }
/* This function is called by i2c_detect */ int pcf8591t_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int err = 0, i; struct i2c_client *new_client; struct pcf8591t_data *data; const char *type_name, *client_name; if (i2c_is_isa_adapter(adapter)) { printk(MSG_HEAD "bu9929_detect called for an ISA bus adapter?!?\n"); return 0; } if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) goto ERROR0; /* OK. For now, we presume we have a valid client. We now create the client structure, even though we cannot fill it completely yet. But it allows us to access ddcmon_{read,write}_value. */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct pcf8591t_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct pcf8591t_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &pcf8591t_driver; new_client->flags = 0; if (kind < 0) kind = PCF8591T; if (kind == PCF8591T) { type_name = "pcf8591t"; client_name = "PCF8591T A/D converter"; } else { #ifdef DEBUG printk(MSG_HEAD "Internal error: unknown kind (%d)?!?", kind); #endif goto ERROR1; } /* Fill in the remaining client fields and put it in the global list */ strcpy(new_client->name, client_name); new_client->id = pcf8591t_id; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry(new_client, type_name, pcf8591t_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; g_client = new_client; return 0; ERROR4: i2c_detach_client(new_client); ERROR3: ERROR1: kfree(new_client); ERROR0: return err; }
/* Very inefficient for ISA detects, and won't work for 10-bit addresses! */ int i2c_detect(struct i2c_adapter *adapter, struct i2c_address_data *address_data, int (*found_proc) (struct i2c_adapter *, int, int)) { int addr, i, found, j, err; struct i2c_force_data *this_force; int is_isa = i2c_is_isa_adapter(adapter); int adapter_id = is_isa ? ANY_I2C_ISA_BUS : i2c_adapter_id(adapter); unsigned short *normal_i2c; unsigned int *normal_isa; unsigned short *probe; unsigned short *ignore; /* Forget it if we can't probe using SMBUS_QUICK */ if ((!is_isa) && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_QUICK)) return -1; /* Use default "empty" list if the adapter doesn't specify any */ normal_i2c = probe = ignore = empty; normal_isa = empty_isa; if (address_data->normal_i2c) normal_i2c = address_data->normal_i2c; if (address_data->normal_isa) normal_isa = address_data->normal_isa; if (address_data->probe) probe = address_data->probe; if (address_data->ignore) ignore = address_data->ignore; for (addr = 0x00; addr <= (is_isa ? 0xffff : 0x7f); addr++) { if (!is_isa && i2c_check_addr(adapter, addr)) continue; /* If it is in one of the force entries, we don't do any detection at all */ found = 0; for (i = 0; !found && (this_force = address_data->forces + i, this_force->force); i++) { for (j = 0; !found && (this_force->force[j] != I2C_CLIENT_END); j += 2) { if ( ((adapter_id == this_force->force[j]) || ((this_force->force[j] == ANY_I2C_BUS) && !is_isa)) && (addr == this_force->force[j + 1]) ) { dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", adapter_id, addr); if ((err = found_proc(adapter, addr, this_force->kind))) return err; found = 1; } } } if (found) continue; /* If this address is in one of the ignores, we can forget about it right now */ for (i = 0; !found && (ignore[i] != I2C_CLIENT_END); i += 2) { if ( ((adapter_id == ignore[i]) || ((ignore[i] == ANY_I2C_BUS) && !is_isa)) && (addr == ignore[i + 1])) { dev_dbg(&adapter->dev, "found ignore parameter for adapter %d, addr %04x\n", adapter_id, addr); found = 1; } } if (found) continue; /* Now, we will do a detection, but only if it is in the normal or probe entries */ if (is_isa) { for (i = 0; !found && (normal_isa[i] != I2C_CLIENT_ISA_END); i += 1) { if (addr == normal_isa[i]) { dev_dbg(&adapter->dev, "found normal isa entry for adapter %d, addr %04x\n", adapter_id, addr); found = 1; } } } else { for (i = 0; !found && (normal_i2c[i] != I2C_CLIENT_END); i += 1) { if (addr == normal_i2c[i]) { found = 1; dev_dbg(&adapter->dev, "found normal i2c entry for adapter %d, addr %02x\n", adapter_id, addr); } } } for (i = 0; !found && (probe[i] != I2C_CLIENT_END); i += 2) { if (((adapter_id == probe[i]) || ((probe[i] == ANY_I2C_BUS) && !is_isa)) && (addr == probe[i + 1])) { dev_dbg(&adapter->dev, "found probe parameter for adapter %d, addr %04x\n", adapter_id, addr); found = 1; } } if (!found) continue; /* OK, so we really should examine this address. First check whether there is some client here at all! */ if (is_isa || (i2c_smbus_xfer (adapter, addr, 0, 0, 0, I2C_SMBUS_QUICK, NULL) >= 0)) if ((err = found_proc(adapter, addr, -1))) return err; } return 0; }
/* This function is called by i2c_detect */ int matorb_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind) { int i, cur; struct i2c_client *new_client; struct matorb_data *data; int err = 0; const char *type_name = "matorb"; const char *client_name = "matorb"; /* Make sure we aren't probing the ISA bus!! This is just a safety check at this moment; i2c_detect really won't call us. */ #ifdef DEBUG if (i2c_is_isa_adapter(adapter)) { printk ("matorb.o: matorb_detect called for an ISA bus adapter?!?\n"); return 0; } #endif if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) goto ERROR0; /* OK. For now, we presume we have a valid client. We now create the client structure, even though we cannot fill it completely yet. But it allows us to access matorb_{read,write}_value. */ if (!(new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct matorb_data), GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } data = (struct matorb_data *) (new_client + 1); new_client->addr = address; new_client->data = data; new_client->adapter = adapter; new_client->driver = &matorb_driver; new_client->flags = 0; /* Now, we do the remaining detection. It is lousy. */ cur = i2c_smbus_write_byte_data(new_client, 0x0FE, 0x58); /* clear screen */ printk("matorb.o: debug detect 0x%X\n", cur); /* Fill in the remaining client fields and put it into the global list */ strcpy(new_client->name, client_name); new_client->id = matorb_id++; data->valid = 0; init_MUTEX(&data->update_lock); /* Tell the I2C layer a new client has arrived */ if ((err = i2c_attach_client(new_client))) goto ERROR3; /* Register a new directory entry with module sensors */ if ((i = i2c_register_entry(new_client, type_name, matorb_dir_table_template, THIS_MODULE)) < 0) { err = i; goto ERROR4; } data->sysctl_id = i; matorb_init_client(new_client); return 0; /* OK, this is not exactly good programming practice, usually. But it is very code-efficient in this case. */ ERROR4: i2c_detach_client(new_client); ERROR3: kfree(new_client); ERROR0: return err; }