1/* 2 * BCM47XX NAND flash driver 3 * 4 * Copyright (C) 2012 Rafa�� Mi��ecki <zajec5@gmail.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 */ 11 12#include "bcm47xxnflash.h" 13 14#include <linux/module.h> 15#include <linux/kernel.h> 16#include <linux/slab.h> 17#include <linux/platform_device.h> 18#include <linux/bcma/bcma.h> 19 20MODULE_DESCRIPTION("NAND flash driver for BCMA bus"); 21MODULE_LICENSE("GPL"); 22MODULE_AUTHOR("Rafa�� Mi��ecki"); 23 24static const char *probes[] = { "bcm47xxpart", NULL }; 25 26static int bcm47xxnflash_probe(struct platform_device *pdev) 27{ 28 struct bcma_nflash *nflash = dev_get_platdata(&pdev->dev); 29 struct bcm47xxnflash *b47n; 30 int err = 0; 31 32 b47n = devm_kzalloc(&pdev->dev, sizeof(*b47n), GFP_KERNEL); 33 if (!b47n) 34 return -ENOMEM; 35 36 b47n->nand_chip.priv = b47n; 37 b47n->mtd.dev.parent = &pdev->dev; 38 b47n->mtd.priv = &b47n->nand_chip; /* Required */ 39 b47n->cc = container_of(nflash, struct bcma_drv_cc, nflash); 40 41 if (b47n->cc->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) { 42 err = bcm47xxnflash_ops_bcm4706_init(b47n); 43 } else { 44 pr_err("Device not supported\n"); 45 err = -ENOTSUPP; 46 } 47 if (err) { 48 pr_err("Initialization failed: %d\n", err); 49 return err; 50 } 51 52 err = mtd_device_parse_register(&b47n->mtd, probes, NULL, NULL, 0); 53 if (err) { 54 pr_err("Failed to register MTD device: %d\n", err); 55 return err; 56 } 57 58 return 0; 59} 60 61static int bcm47xxnflash_remove(struct platform_device *pdev) 62{ 63 struct bcma_nflash *nflash = dev_get_platdata(&pdev->dev); 64 65 if (nflash->mtd) 66 mtd_device_unregister(nflash->mtd); 67 68 return 0; 69} 70 71static struct platform_driver bcm47xxnflash_driver = { 72 .probe = bcm47xxnflash_probe, 73 .remove = bcm47xxnflash_remove, 74 .driver = { 75 .name = "bcma_nflash", 76 }, 77}; 78 79module_platform_driver(bcm47xxnflash_driver); 80