diff options
Diffstat (limited to 'drivers/misc/enclosure.c')
-rw-r--r-- | drivers/misc/enclosure.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c index 2cf2bbc0b927..180a5442fd4b 100644 --- a/drivers/misc/enclosure.c +++ b/drivers/misc/enclosure.c | |||
@@ -187,6 +187,7 @@ void enclosure_unregister(struct enclosure_device *edev) | |||
187 | EXPORT_SYMBOL_GPL(enclosure_unregister); | 187 | EXPORT_SYMBOL_GPL(enclosure_unregister); |
188 | 188 | ||
189 | #define ENCLOSURE_NAME_SIZE 64 | 189 | #define ENCLOSURE_NAME_SIZE 64 |
190 | #define COMPONENT_NAME_SIZE 64 | ||
190 | 191 | ||
191 | static void enclosure_link_name(struct enclosure_component *cdev, char *name) | 192 | static void enclosure_link_name(struct enclosure_component *cdev, char *name) |
192 | { | 193 | { |
@@ -246,6 +247,29 @@ static void enclosure_component_release(struct device *dev) | |||
246 | put_device(dev->parent); | 247 | put_device(dev->parent); |
247 | } | 248 | } |
248 | 249 | ||
250 | static struct enclosure_component * | ||
251 | enclosure_component_find_by_name(struct enclosure_device *edev, | ||
252 | const char *name) | ||
253 | { | ||
254 | int i; | ||
255 | const char *cname; | ||
256 | struct enclosure_component *ecomp; | ||
257 | |||
258 | if (!edev || !name || !name[0]) | ||
259 | return NULL; | ||
260 | |||
261 | for (i = 0; i < edev->components; i++) { | ||
262 | ecomp = &edev->component[i]; | ||
263 | cname = dev_name(&ecomp->cdev); | ||
264 | if (ecomp->number != -1 && | ||
265 | cname && cname[0] && | ||
266 | !strcmp(cname, name)) | ||
267 | return ecomp; | ||
268 | } | ||
269 | |||
270 | return NULL; | ||
271 | } | ||
272 | |||
249 | static const struct attribute_group *enclosure_component_groups[]; | 273 | static const struct attribute_group *enclosure_component_groups[]; |
250 | 274 | ||
251 | /** | 275 | /** |
@@ -269,7 +293,8 @@ enclosure_component_register(struct enclosure_device *edev, | |||
269 | { | 293 | { |
270 | struct enclosure_component *ecomp; | 294 | struct enclosure_component *ecomp; |
271 | struct device *cdev; | 295 | struct device *cdev; |
272 | int err; | 296 | int err, i; |
297 | char newname[COMPONENT_NAME_SIZE]; | ||
273 | 298 | ||
274 | if (number >= edev->components) | 299 | if (number >= edev->components) |
275 | return ERR_PTR(-EINVAL); | 300 | return ERR_PTR(-EINVAL); |
@@ -283,9 +308,20 @@ enclosure_component_register(struct enclosure_device *edev, | |||
283 | ecomp->number = number; | 308 | ecomp->number = number; |
284 | cdev = &ecomp->cdev; | 309 | cdev = &ecomp->cdev; |
285 | cdev->parent = get_device(&edev->edev); | 310 | cdev->parent = get_device(&edev->edev); |
286 | if (name && name[0]) | 311 | |
287 | dev_set_name(cdev, "%s", name); | 312 | if (name && name[0]) { |
288 | else | 313 | /* Some hardware (e.g. enclosure in RX300 S6) has components |
314 | * with non unique names. Registering duplicates in sysfs | ||
315 | * will lead to warnings during bootup. So make the names | ||
316 | * unique by appending consecutive numbers -1, -2, ... */ | ||
317 | i = 1; | ||
318 | snprintf(newname, COMPONENT_NAME_SIZE, | ||
319 | "%s", name); | ||
320 | while (enclosure_component_find_by_name(edev, newname)) | ||
321 | snprintf(newname, COMPONENT_NAME_SIZE, | ||
322 | "%s-%i", name, i++); | ||
323 | dev_set_name(cdev, "%s", newname); | ||
324 | } else | ||
289 | dev_set_name(cdev, "%u", number); | 325 | dev_set_name(cdev, "%u", number); |
290 | 326 | ||
291 | cdev->release = enclosure_component_release; | 327 | cdev->release = enclosure_component_release; |