root/trunk/patches/2.6.22/14-eeprom-new-notifier.patch
| Revision 852, 6.4 kB (checked in by blaster8, 3 years ago) |
|---|
-
linux-2.6.22-rc1-arm/drivers/i2c/chips/eeprom.c
old new 33 33 #include <linux/jiffies.h> 34 34 #include <linux/i2c.h> 35 35 #include <linux/mutex.h> 36 #include <linux/notifier.h> 37 #include <linux/eeprom.h> 36 38 37 39 /* Addresses to scan */ 38 40 static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, … … 41 43 /* Insmod parameters */ 42 44 I2C_CLIENT_INSMOD_1(eeprom); 43 45 44 45 /* Size of EEPROM in bytes */ 46 #define EEPROM_SIZE 256 47 48 /* possible types of eeprom devices */ 49 enum eeprom_nature { 50 UNKNOWN, 51 VAIO, 52 }; 53 54 /* Each client has this additional data */ 55 struct eeprom_data { 56 struct i2c_client client; 57 struct mutex update_lock; 58 u8 valid; /* bitfield, bit!=0 if slice is valid */ 59 unsigned long last_updated[8]; /* In jiffies, 8 slices */ 60 u8 data[EEPROM_SIZE]; /* Register values */ 61 enum eeprom_nature nature; 62 }; 63 46 ATOMIC_NOTIFIER_HEAD(eeprom_chain); 64 47 65 48 static int eeprom_attach_adapter(struct i2c_adapter *adapter); 66 49 static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind); … … 189 172 data->valid = 0; 190 173 mutex_init(&data->update_lock); 191 174 data->nature = UNKNOWN; 175 data->attr = &eeprom_attr; 192 176 193 177 /* Tell the I2C layer a new client has arrived */ 194 178 if ((err = i2c_attach_client(new_client))) … … 212 196 if (err) 213 197 goto exit_detach; 214 198 199 /* call the notifier chain */ 200 atomic_notifier_call_chain(&eeprom_chain, EEPROM_REGISTER, data); 201 215 202 return 0; 216 203 217 204 exit_detach: … … 237 224 return 0; 238 225 } 239 226 227 /** 228 * register_eeprom_notifier - register a 'user' of EEPROM devices. 229 * @nb: pointer to notifier info structure 230 * 231 * Registers a callback function to be called upon detection 232 * of an EEPROM device. Detection invokes the 'add' callback 233 * with the kobj of the mutex and a bin_attribute which allows 234 * read from the EEPROM. The intention is that the notifier 235 * will be able to read system configuration from the notifier. 236 * 237 * Only EEPROMs detected *after* the addition of the notifier 238 * are notified. I.e. EEPROMs already known to the system 239 * will not be notified - add the notifier from board level 240 * code! 241 */ 242 int register_eeprom_notifier(struct notifier_block *nb) 243 { 244 return atomic_notifier_chain_register(&eeprom_chain, nb); 245 } 246 247 /** 248 * unregister_eeprom_notifier - unregister a 'user' of EEPROM devices. 249 * @old: pointer to notifier info structure 250 * 251 * Removes a callback function from the list of 'users' to be 252 * notified upon detection of EEPROM devices. 253 */ 254 int unregister_eeprom_notifier(struct notifier_block *nb) 255 { 256 return atomic_notifier_chain_unregister(&eeprom_chain, nb); 257 } 258 259 EXPORT_SYMBOL_GPL(register_eeprom_notifier); 260 EXPORT_SYMBOL_GPL(unregister_eeprom_notifier); 261 240 262 static int __init eeprom_init(void) 241 263 { 242 264 return i2c_add_driver(&eeprom_driver); -
/dev/null
old new 1 #ifndef _LINUX_EEPROM_H 2 #define _LINUX_EEPROM_H 3 /* 4 * EEPROM notifier header 5 * 6 * Copyright (C) 2006 John Bowler 7 */ 8 9 /* 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 */ 24 25 #ifndef __KERNEL__ 26 #error This is a kernel header 27 #endif 28 29 #include <linux/list.h> 30 #include <linux/kobject.h> 31 #include <linux/sysfs.h> 32 33 /* Size of EEPROM in bytes */ 34 #define EEPROM_SIZE 256 35 36 /* possible types of eeprom devices */ 37 enum eeprom_nature { 38 UNKNOWN, 39 VAIO, 40 }; 41 42 /* Each client has this additional data */ 43 struct eeprom_data { 44 struct i2c_client client; 45 struct mutex update_lock; 46 u8 valid; /* bitfield, bit!=0 if slice is valid */ 47 unsigned long last_updated[8]; /* In jiffies, 8 slices */ 48 u8 data[EEPROM_SIZE]; /* Register values */ 49 enum eeprom_nature nature; 50 struct bin_attribute *attr; 51 }; 52 53 /* 54 * This is very basic. 55 * 56 * If an EEPROM is detected on the I2C bus (this only works for 57 * I2C EEPROMs) the notifier chain is called with 58 * both the I2C information and the kobject for the sysfs 59 * device which has been registers. It is then possible to 60 * read from the device via the bin_attribute::read method 61 * to extract configuration information. 62 * 63 * Register the notifier in the board level code, there is no 64 * need to unregister it but you can if you want (it will save 65 * a little bit or kernel memory to do so). 66 */ 67 68 extern int register_eeprom_notifier(struct notifier_block *nb); 69 extern int unregister_eeprom_notifier(struct notifier_block *nb); 70 71 #endif /* _LINUX_EEPROM_H */ -
linux-2.6.22-rc1-arm/include/linux/notifier.h
old new 209 209 #define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN) 210 210 #define CPU_DEAD_FROZEN (CPU_DEAD | CPU_TASKS_FROZEN) 211 211 212 /* eeprom notifier chain */ 213 #define EEPROM_REGISTER 0x0001 214 212 215 #endif /* __KERNEL__ */ 213 216 #endif /* _LINUX_NOTIFIER_H */
Note: See TracBrowser for help on using the browser.
