* [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops
@ 2013-03-24 20:51 Rafał Miłecki
2013-03-24 20:51 ` [PATCH 2/2] mtd: bcm47xxsflash: implement polling chip status Rafał Miłecki
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Rafał Miłecki @ 2013-03-24 20:51 UTC (permalink / raw)
To: linux-mtd, Artem Bityutskiy, David Woodhouse
Cc: Hauke Mehrtens, Rafał Miłecki
They are needed for erasing/writing. Use a magic pointers and small
functions to preapre code for adding other buses suppoer in the future
(like SSB).
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
drivers/mtd/devices/bcm47xxsflash.c | 13 +++++++++++++
drivers/mtd/devices/bcm47xxsflash.h | 2 ++
2 files changed, 15 insertions(+)
diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
index 18e7761..d1f0dec 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -48,6 +48,17 @@ static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash *b47s)
* BCMA
**************************************************/
+static int bcm47xxsflash_bcma_cc_read(struct bcm47xxsflash *b47s, u16 offset)
+{
+ return bcma_cc_read32(b47s->bcma_cc, offset);
+}
+
+static void bcm47xxsflash_bcma_cc_write(struct bcm47xxsflash *b47s, u16 offset,
+ u32 value)
+{
+ bcma_cc_write32(b47s->bcma_cc, offset, value);
+}
+
static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
{
struct bcma_sflash *sflash = dev_get_platdata(&pdev->dev);
@@ -62,6 +73,8 @@ static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
sflash->priv = b47s;
b47s->bcma_cc = container_of(sflash, struct bcma_drv_cc, sflash);
+ b47s->cc_read = bcm47xxsflash_bcma_cc_read;
+ b47s->cc_write = bcm47xxsflash_bcma_cc_write;
switch (b47s->bcma_cc->capabilities & BCMA_CC_CAP_FLASHT) {
case BCMA_CC_FLASHT_STSER:
diff --git a/drivers/mtd/devices/bcm47xxsflash.h b/drivers/mtd/devices/bcm47xxsflash.h
index f22f8c4..fe93daf 100644
--- a/drivers/mtd/devices/bcm47xxsflash.h
+++ b/drivers/mtd/devices/bcm47xxsflash.h
@@ -60,6 +60,8 @@ enum bcm47xxsflash_type {
struct bcm47xxsflash {
struct bcma_drv_cc *bcma_cc;
+ int (*cc_read)(struct bcm47xxsflash *b47s, u16 offset);
+ void (*cc_write)(struct bcm47xxsflash *b47s, u16 offset, u32 value);
enum bcm47xxsflash_type type;
--
1.7.10.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] mtd: bcm47xxsflash: implement polling chip status
2013-03-24 20:51 [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
@ 2013-03-24 20:51 ` Rafał Miłecki
2013-03-24 20:53 ` [PATCH V2 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Rafał Miłecki @ 2013-03-24 20:51 UTC (permalink / raw)
To: linux-mtd, Artem Bityutskiy, David Woodhouse
Cc: Hauke Mehrtens, Rafał Miłecki
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
drivers/mtd/devices/bcm47xxsflash.c | 55 +++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
index d1f0dec..2060856 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -1,6 +1,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
+#include <linux/delay.h>
#include <linux/mtd/mtd.h>
#include <linux/platform_device.h>
#include <linux/bcma/bcma.h>
@@ -12,6 +13,57 @@ MODULE_DESCRIPTION("Serial flash driver for BCMA bus");
static const char * const probes[] = { "bcm47xxpart", NULL };
+/**************************************************
+ * Various helpers
+ **************************************************/
+
+static void bcm47xxsflash_cmd(struct bcm47xxsflash *b47s, u32 opcode)
+{
+ int i;
+
+ b47s->cc_write(b47s, BCMA_CC_FLASHCTL, BCMA_CC_FLASHCTL_START | opcode);
+ for (i = 0; i < 1000; i++) {
+ if (!(b47s->cc_read(b47s, BCMA_CC_FLASHCTL) &
+ BCMA_CC_FLASHCTL_BUSY))
+ return;
+ cpu_relax();
+ }
+ pr_err("Control command failed (timeout)!\n");
+}
+
+static int bcm47xxsflash_poll(struct bcm47xxsflash *b47s, int timeout)
+{
+ unsigned long deadline = jiffies + timeout;
+
+ do {
+ switch (b47s->type) {
+ case BCM47XXSFLASH_TYPE_ST:
+ bcm47xxsflash_cmd(b47s, OPCODE_ST_RDSR);
+ if (!(b47s->cc_read(b47s, BCMA_CC_FLASHDATA) &
+ SR_ST_WIP))
+ return 0;
+ break;
+ case BCM47XXSFLASH_TYPE_ATMEL:
+ bcm47xxsflash_cmd(b47s, OPCODE_AT_STATUS);
+ if (b47s->cc_read(b47s, BCMA_CC_FLASHDATA) &
+ SR_AT_READY)
+ return 0;
+ break;
+ }
+
+ cpu_relax();
+ udelay(1);
+ } while (!time_after_eq(jiffies, deadline));
+
+ pr_err("Timeout waiting for flash to be ready!\n");
+
+ return -EBUSY;
+}
+
+/**************************************************
+ * MTD ops
+ **************************************************/
+
static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf)
{
@@ -97,6 +149,9 @@ static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
goto err_dev_reg;
}
+ if (bcm47xxsflash_poll(b47s, HZ / 10))
+ pr_warn("Serial flash busy\n");
+
return 0;
err_dev_reg:
--
1.7.10.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V2 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops
2013-03-24 20:51 [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
2013-03-24 20:51 ` [PATCH 2/2] mtd: bcm47xxsflash: implement polling chip status Rafał Miłecki
@ 2013-03-24 20:53 ` Rafał Miłecki
2013-04-25 5:50 ` [PATCH " Rafał Miłecki
2013-05-10 11:48 ` Artem Bityutskiy
3 siblings, 0 replies; 5+ messages in thread
From: Rafał Miłecki @ 2013-03-24 20:53 UTC (permalink / raw)
To: linux-mtd, Artem Bityutskiy, David Woodhouse
Cc: Hauke Mehrtens, Rafał Miłecki
They are needed for erasing/writing. Use a magic pointers and small
functions to preapre code for adding other buses support in the future
(like SSB).
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
V2: fix typo in commit message
---
drivers/mtd/devices/bcm47xxsflash.c | 13 +++++++++++++
drivers/mtd/devices/bcm47xxsflash.h | 2 ++
2 files changed, 15 insertions(+)
diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
index 18e7761..d1f0dec 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -48,6 +48,17 @@ static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash *b47s)
* BCMA
**************************************************/
+static int bcm47xxsflash_bcma_cc_read(struct bcm47xxsflash *b47s, u16 offset)
+{
+ return bcma_cc_read32(b47s->bcma_cc, offset);
+}
+
+static void bcm47xxsflash_bcma_cc_write(struct bcm47xxsflash *b47s, u16 offset,
+ u32 value)
+{
+ bcma_cc_write32(b47s->bcma_cc, offset, value);
+}
+
static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
{
struct bcma_sflash *sflash = dev_get_platdata(&pdev->dev);
@@ -62,6 +73,8 @@ static int bcm47xxsflash_bcma_probe(struct platform_device *pdev)
sflash->priv = b47s;
b47s->bcma_cc = container_of(sflash, struct bcma_drv_cc, sflash);
+ b47s->cc_read = bcm47xxsflash_bcma_cc_read;
+ b47s->cc_write = bcm47xxsflash_bcma_cc_write;
switch (b47s->bcma_cc->capabilities & BCMA_CC_CAP_FLASHT) {
case BCMA_CC_FLASHT_STSER:
diff --git a/drivers/mtd/devices/bcm47xxsflash.h b/drivers/mtd/devices/bcm47xxsflash.h
index f22f8c4..fe93daf 100644
--- a/drivers/mtd/devices/bcm47xxsflash.h
+++ b/drivers/mtd/devices/bcm47xxsflash.h
@@ -60,6 +60,8 @@ enum bcm47xxsflash_type {
struct bcm47xxsflash {
struct bcma_drv_cc *bcma_cc;
+ int (*cc_read)(struct bcm47xxsflash *b47s, u16 offset);
+ void (*cc_write)(struct bcm47xxsflash *b47s, u16 offset, u32 value);
enum bcm47xxsflash_type type;
--
1.7.10.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops
2013-03-24 20:51 [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
2013-03-24 20:51 ` [PATCH 2/2] mtd: bcm47xxsflash: implement polling chip status Rafał Miłecki
2013-03-24 20:53 ` [PATCH V2 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
@ 2013-04-25 5:50 ` Rafał Miłecki
2013-05-10 11:48 ` Artem Bityutskiy
3 siblings, 0 replies; 5+ messages in thread
From: Rafał Miłecki @ 2013-04-25 5:50 UTC (permalink / raw)
To: linux-mtd, Artem Bityutskiy, David Woodhouse; +Cc: Hauke Mehrtens
2013/3/24 Rafał Miłecki <zajec5@gmail.com>:
> They are needed for erasing/writing. Use a magic pointers and small
> functions to preapre code for adding other buses suppoer in the future
> (like SSB).
David: is there a chance for picking up that 2 patches for 3.10?
--
Rafał
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops
2013-03-24 20:51 [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
` (2 preceding siblings ...)
2013-04-25 5:50 ` [PATCH " Rafał Miłecki
@ 2013-05-10 11:48 ` Artem Bityutskiy
3 siblings, 0 replies; 5+ messages in thread
From: Artem Bityutskiy @ 2013-05-10 11:48 UTC (permalink / raw)
To: Rafał Miłecki; +Cc: Hauke Mehrtens, linux-mtd, David Woodhouse
On Sun, 2013-03-24 at 21:51 +0100, Rafał Miłecki wrote:
> They are needed for erasing/writing. Use a magic pointers and small
> functions to preapre code for adding other buses suppoer in the future
> (like SSB).
>
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Pushed to l2-mtd.git, thanks!
--
Best Regards,
Artem Bityutskiy
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-05-10 11:46 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-24 20:51 [PATCH 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
2013-03-24 20:51 ` [PATCH 2/2] mtd: bcm47xxsflash: implement polling chip status Rafał Miłecki
2013-03-24 20:53 ` [PATCH V2 1/2] mtd: bcm47xxsflash: implement ChipCommon R/W ops Rafał Miłecki
2013-04-25 5:50 ` [PATCH " Rafał Miłecki
2013-05-10 11:48 ` Artem Bityutskiy
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.