All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.