diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2009-05-29 09:26:23 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-05-29 09:32:39 -0400 |
commit | 81933046ef2a615031c46171013bde2c5225ee69 (patch) | |
tree | 98948086a1713cf0ce57162d53d77a3724e87874 /drivers/mtd | |
parent | 9fd1e8f92ad17b3bc94245fee9b4e4bfea0dba0e (diff) |
mtd: Fix handling of mtdname in txx9ndfmc.c
As pointed out by Kay Sievers, the name size limit is gone
from the driver-core, and BUS_ID_SIZE is obsolescent.
Rather than just papering over the problem by replacing the mtdname
array size with an arbitrary '20 + 2', fix the problem properly and
handle arbitrary name sizes.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/nand/txx9ndfmc.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c index 812479264896..5f919e63b29b 100644 --- a/drivers/mtd/nand/txx9ndfmc.c +++ b/drivers/mtd/nand/txx9ndfmc.c | |||
@@ -64,7 +64,7 @@ struct txx9ndfmc_priv { | |||
64 | struct nand_chip chip; | 64 | struct nand_chip chip; |
65 | struct mtd_info mtd; | 65 | struct mtd_info mtd; |
66 | int cs; | 66 | int cs; |
67 | char mtdname[BUS_ID_SIZE + 2]; | 67 | const char *mtdname; |
68 | }; | 68 | }; |
69 | 69 | ||
70 | #define MAX_TXX9NDFMC_DEV 4 | 70 | #define MAX_TXX9NDFMC_DEV 4 |
@@ -334,11 +334,17 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) | |||
334 | 334 | ||
335 | if (plat->ch_mask != 1) { | 335 | if (plat->ch_mask != 1) { |
336 | txx9_priv->cs = i; | 336 | txx9_priv->cs = i; |
337 | sprintf(txx9_priv->mtdname, "%s.%u", | 337 | txx9_priv->mtdname = kasprintf(GFP_KERNEL, "%s.%u", |
338 | dev_name(&dev->dev), i); | 338 | dev_name(&dev->dev), i); |
339 | if (!txx9_priv->mtdname) { | ||
340 | kfree(txx9_priv); | ||
341 | dev_err(&dev->dev, | ||
342 | "Unable to allocate TXx9 NDFMC MTD device name.\n"); | ||
343 | continue; | ||
344 | } | ||
339 | } else { | 345 | } else { |
340 | txx9_priv->cs = -1; | 346 | txx9_priv->cs = -1; |
341 | strcpy(txx9_priv->mtdname, dev_name(&dev->dev)); | 347 | txx9_priv->mtdname = dev_name(&dev->dev); |
342 | } | 348 | } |
343 | if (plat->wide_mask & (1 << i)) | 349 | if (plat->wide_mask & (1 << i)) |
344 | chip->options |= NAND_BUSWIDTH_16; | 350 | chip->options |= NAND_BUSWIDTH_16; |
@@ -385,6 +391,8 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) | |||
385 | kfree(drvdata->parts[i]); | 391 | kfree(drvdata->parts[i]); |
386 | #endif | 392 | #endif |
387 | del_mtd_device(mtd); | 393 | del_mtd_device(mtd); |
394 | if (txx9_priv->mtdname != dev_name(&dev->dev)) | ||
395 | kfree(txx9_priv->mtdname); | ||
388 | kfree(txx9_priv); | 396 | kfree(txx9_priv); |
389 | } | 397 | } |
390 | return 0; | 398 | return 0; |