linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC][PATCH] ssb: add place for serial flash driver
@ 2012-12-25 18:23 Rafał Miłecki
  2012-12-26 10:37 ` Hauke Mehrtens
  0 siblings, 1 reply; 6+ messages in thread
From: Rafał Miłecki @ 2012-12-25 18:23 UTC (permalink / raw)
  To: linux-wireless, Hauke Mehrtens; +Cc: Rafał Miłecki


Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/ssb/Kconfig                       |    5 +++++
 drivers/ssb/Makefile                      |    1 +
 drivers/ssb/driver_chipcommon_sflash.c    |   22 ++++++++++++++++++++++
 drivers/ssb/driver_mipscore.c             |    3 ++-
 drivers/ssb/ssb_private.h                 |   11 +++++++++++
 include/linux/ssb/ssb_driver_chipcommon.h |   10 ++++++++++
 6 files changed, 51 insertions(+), 1 deletions(-)
 create mode 100644 drivers/ssb/driver_chipcommon_sflash.c

diff --git a/drivers/ssb/Kconfig b/drivers/ssb/Kconfig
index fad7a10..ea099e1 100644
--- a/drivers/ssb/Kconfig
+++ b/drivers/ssb/Kconfig
@@ -137,6 +137,11 @@ config SSB_DRIVER_MIPS
 
 	  If unsure, say N
 
+config SSB_SFLASH
+	bool "SSB serial flash support"
+	depends on SSB_DRIVER_MIPS && BROKEN
+	default y
+
 # Assumption: We are on embedded, if we compile the MIPS core.
 config SSB_EMBEDDED
 	bool
diff --git a/drivers/ssb/Makefile b/drivers/ssb/Makefile
index 9159ba7..b1ddc11 100644
--- a/drivers/ssb/Makefile
+++ b/drivers/ssb/Makefile
@@ -11,6 +11,7 @@ ssb-$(CONFIG_SSB_SDIOHOST)		+= sdio.o
 # built-in drivers
 ssb-y					+= driver_chipcommon.o
 ssb-y					+= driver_chipcommon_pmu.o
+ssb-$(CONFIG_SSB_SFLASH)		+= driver_chipcommon_sflash.o
 ssb-$(CONFIG_SSB_DRIVER_MIPS)		+= driver_mipscore.o
 ssb-$(CONFIG_SSB_DRIVER_EXTIF)		+= driver_extif.o
 ssb-$(CONFIG_SSB_DRIVER_PCICORE)	+= driver_pcicore.o
diff --git a/drivers/ssb/driver_chipcommon_sflash.c b/drivers/ssb/driver_chipcommon_sflash.c
new file mode 100644
index 0000000..9803e02
--- /dev/null
+++ b/drivers/ssb/driver_chipcommon_sflash.c
@@ -0,0 +1,22 @@
+/*
+ * Sonics Silicon Backplane
+ * ChipCommon serial flash interface
+ *
+ * Licensed under the GNU/GPL. See COPYING for details.
+ */
+
+#include <linux/ssb/ssb.h>
+
+#include "ssb_private.h"
+
+/* Initialize serial flash access */
+int ssb_sflash_init(struct ssb_chipcommon *cc)
+{
+	struct ssb_sflash *sflash = &cc->sflash;
+
+	pr_err("Serial flash support is not implemented yet!\n");
+
+	sflash->present = true;
+
+	return -ENOTSUPP;
+}
diff --git a/drivers/ssb/driver_mipscore.c b/drivers/ssb/driver_mipscore.c
index 5bd05b1..2a7684c 100644
--- a/drivers/ssb/driver_mipscore.c
+++ b/drivers/ssb/driver_mipscore.c
@@ -203,7 +203,8 @@ static void ssb_mips_flash_detect(struct ssb_mipscore *mcore)
 	switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) {
 	case SSB_CHIPCO_FLASHT_STSER:
 	case SSB_CHIPCO_FLASHT_ATSER:
-		pr_err("Serial flash not supported\n");
+		pr_debug("Found serial flash\n");
+		ssb_sflash_init(&bus->chipco);
 		break;
 	case SSB_CHIPCO_FLASHT_PARA:
 		pr_debug("Found parallel flash\n");
diff --git a/drivers/ssb/ssb_private.h b/drivers/ssb/ssb_private.h
index 6c10b66..77d9426 100644
--- a/drivers/ssb/ssb_private.h
+++ b/drivers/ssb/ssb_private.h
@@ -217,6 +217,17 @@ extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
 					     u32 ticks);
 extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
 
+/* driver_chipcommon_sflash.c */
+#ifdef CONFIG_SSB_SFLASH
+int ssb_sflash_init(struct ssb_chipcommon *cc);
+#else
+static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
+{
+	pr_err("Serial flash not supported\n");
+	return 0;
+}
+#endif /* CONFIG_SSB_SFLASH */
+
 #ifdef CONFIG_SSB_DRIVER_EXTIF
 extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
 extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h
index 9e492be..052e9de 100644
--- a/include/linux/ssb/ssb_driver_chipcommon.h
+++ b/include/linux/ssb/ssb_driver_chipcommon.h
@@ -584,6 +584,12 @@ struct ssb_chipcommon_pmu {
 	u32 crystalfreq;	/* The active crystal frequency (in kHz) */
 };
 
+#ifdef CONFIG_SSB_SFLASH
+struct ssb_sflash {
+	bool present;
+};
+#endif
+
 struct ssb_chipcommon {
 	struct ssb_device *dev;
 	u32 capabilities;
@@ -594,6 +600,10 @@ struct ssb_chipcommon {
 	struct ssb_chipcommon_pmu pmu;
 	u32 ticks_per_ms;
 	u32 max_timer_ms;
+
+#ifdef CONFIG_SSB_SFLASH
+	struct ssb_sflash sflash;
+#endif
 };
 
 static inline bool ssb_chipco_available(struct ssb_chipcommon *cc)
-- 
1.7.7


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [RFC][PATCH] ssb: add place for serial flash driver
  2012-12-25 18:23 [RFC][PATCH] ssb: add place for serial flash driver Rafał Miłecki
@ 2012-12-26 10:37 ` Hauke Mehrtens
  2012-12-26 10:46   ` Rafał Miłecki
  0 siblings, 1 reply; 6+ messages in thread
From: Hauke Mehrtens @ 2012-12-26 10:37 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless

On 12/25/2012 07:23 PM, Rafał Miłecki wrote:
> 
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
> ---
>  drivers/ssb/Kconfig                       |    5 +++++
>  drivers/ssb/Makefile                      |    1 +
>  drivers/ssb/driver_chipcommon_sflash.c    |   22 ++++++++++++++++++++++
>  drivers/ssb/driver_mipscore.c             |    3 ++-
>  drivers/ssb/ssb_private.h                 |   11 +++++++++++
>  include/linux/ssb/ssb_driver_chipcommon.h |   10 ++++++++++
>  6 files changed, 51 insertions(+), 1 deletions(-)
>  create mode 100644 drivers/ssb/driver_chipcommon_sflash.c
> 
> diff --git a/drivers/ssb/Kconfig b/drivers/ssb/Kconfig
> index fad7a10..ea099e1 100644
> --- a/drivers/ssb/Kconfig
> +++ b/drivers/ssb/Kconfig
> @@ -137,6 +137,11 @@ config SSB_DRIVER_MIPS
>  
>  	  If unsure, say N
>  
> +config SSB_SFLASH
> +	bool "SSB serial flash support"
> +	depends on SSB_DRIVER_MIPS && BROKEN
> +	default y
> +
>  # Assumption: We are on embedded, if we compile the MIPS core.
>  config SSB_EMBEDDED
>  	bool
> diff --git a/drivers/ssb/Makefile b/drivers/ssb/Makefile
> index 9159ba7..b1ddc11 100644
> --- a/drivers/ssb/Makefile
> +++ b/drivers/ssb/Makefile
> @@ -11,6 +11,7 @@ ssb-$(CONFIG_SSB_SDIOHOST)		+= sdio.o
>  # built-in drivers
>  ssb-y					+= driver_chipcommon.o
>  ssb-y					+= driver_chipcommon_pmu.o
> +ssb-$(CONFIG_SSB_SFLASH)		+= driver_chipcommon_sflash.o
>  ssb-$(CONFIG_SSB_DRIVER_MIPS)		+= driver_mipscore.o
>  ssb-$(CONFIG_SSB_DRIVER_EXTIF)		+= driver_extif.o
>  ssb-$(CONFIG_SSB_DRIVER_PCICORE)	+= driver_pcicore.o
> diff --git a/drivers/ssb/driver_chipcommon_sflash.c b/drivers/ssb/driver_chipcommon_sflash.c
> new file mode 100644
> index 0000000..9803e02
> --- /dev/null
> +++ b/drivers/ssb/driver_chipcommon_sflash.c
> @@ -0,0 +1,22 @@
> +/*
> + * Sonics Silicon Backplane
> + * ChipCommon serial flash interface
> + *
> + * Licensed under the GNU/GPL. See COPYING for details.
> + */
> +
> +#include <linux/ssb/ssb.h>
> +
> +#include "ssb_private.h"
> +
> +/* Initialize serial flash access */
> +int ssb_sflash_init(struct ssb_chipcommon *cc)
> +{
> +	struct ssb_sflash *sflash = &cc->sflash;
> +
> +	pr_err("Serial flash support is not implemented yet!\n");
> +
> +	sflash->present = true;
> +
> +	return -ENOTSUPP;
> +}
> diff --git a/drivers/ssb/driver_mipscore.c b/drivers/ssb/driver_mipscore.c
> index 5bd05b1..2a7684c 100644
> --- a/drivers/ssb/driver_mipscore.c
> +++ b/drivers/ssb/driver_mipscore.c
> @@ -203,7 +203,8 @@ static void ssb_mips_flash_detect(struct ssb_mipscore *mcore)
>  	switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) {
>  	case SSB_CHIPCO_FLASHT_STSER:
>  	case SSB_CHIPCO_FLASHT_ATSER:
> -		pr_err("Serial flash not supported\n");
> +		pr_debug("Found serial flash\n");
> +		ssb_sflash_init(&bus->chipco);
>  		break;
>  	case SSB_CHIPCO_FLASHT_PARA:
>  		pr_debug("Found parallel flash\n");
> diff --git a/drivers/ssb/ssb_private.h b/drivers/ssb/ssb_private.h
> index 6c10b66..77d9426 100644
> --- a/drivers/ssb/ssb_private.h
> +++ b/drivers/ssb/ssb_private.h
> @@ -217,6 +217,17 @@ extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt,
>  					     u32 ticks);
>  extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
>  
> +/* driver_chipcommon_sflash.c */
> +#ifdef CONFIG_SSB_SFLASH
> +int ssb_sflash_init(struct ssb_chipcommon *cc);
> +#else
> +static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
> +{
> +	pr_err("Serial flash not supported\n");
> +	return 0;
> +}
> +#endif /* CONFIG_SSB_SFLASH */
> +
>  #ifdef CONFIG_SSB_DRIVER_EXTIF
>  extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
>  extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
> diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h
> index 9e492be..052e9de 100644
> --- a/include/linux/ssb/ssb_driver_chipcommon.h
> +++ b/include/linux/ssb/ssb_driver_chipcommon.h
> @@ -584,6 +584,12 @@ struct ssb_chipcommon_pmu {
>  	u32 crystalfreq;	/* The active crystal frequency (in kHz) */
>  };
>  
> +#ifdef CONFIG_SSB_SFLASH
> +struct ssb_sflash {
> +	bool present;
> +};
> +#endif

I assume you want to share some of the code for the serial flash driver
between bcma and ssb. You should create a file with the structure in
include/linux/platform_data/ and share that between bcma and ssb.

> +
>  struct ssb_chipcommon {
>  	struct ssb_device *dev;
>  	u32 capabilities;
> @@ -594,6 +600,10 @@ struct ssb_chipcommon {
>  	struct ssb_chipcommon_pmu pmu;
>  	u32 ticks_per_ms;
>  	u32 max_timer_ms;
> +
> +#ifdef CONFIG_SSB_SFLASH
> +	struct ssb_sflash sflash;
> +#endif
>  };
>  
>  static inline bool ssb_chipco_available(struct ssb_chipcommon *cc)
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC][PATCH] ssb: add place for serial flash driver
  2012-12-26 10:37 ` Hauke Mehrtens
@ 2012-12-26 10:46   ` Rafał Miłecki
  2012-12-26 10:59     ` Hauke Mehrtens
  0 siblings, 1 reply; 6+ messages in thread
From: Rafał Miłecki @ 2012-12-26 10:46 UTC (permalink / raw)
  To: Hauke Mehrtens; +Cc: linux-wireless

2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
> On 12/25/2012 07:23 PM, Rafał Miłecki wrote:
>> +#ifdef CONFIG_SSB_SFLASH
>> +struct ssb_sflash {
>> +     bool present;
>> +};
>> +#endif
>
> I assume you want to share some of the code for the serial flash driver
> between bcma and ssb. You should create a file with the structure in
> include/linux/platform_data/ and share that between bcma and ssb.

It's a small struct having about 5 trivial fields. We don't share
sturcts for any other drivers (chipcommon/mips/pcie) so I think they
should stay separated here as well.

Plus the mtd driver will have to implement bus abstraction anyway.

-- 
Rafał

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC][PATCH] ssb: add place for serial flash driver
  2012-12-26 10:46   ` Rafał Miłecki
@ 2012-12-26 10:59     ` Hauke Mehrtens
  2012-12-26 12:11       ` Rafał Miłecki
  0 siblings, 1 reply; 6+ messages in thread
From: Hauke Mehrtens @ 2012-12-26 10:59 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless

On 12/26/2012 11:46 AM, Rafał Miłecki wrote:
> 2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
>> On 12/25/2012 07:23 PM, Rafał Miłecki wrote:
>>> +#ifdef CONFIG_SSB_SFLASH
>>> +struct ssb_sflash {
>>> +     bool present;
>>> +};
>>> +#endif
>>
>> I assume you want to share some of the code for the serial flash driver
>> between bcma and ssb. You should create a file with the structure in
>> include/linux/platform_data/ and share that between bcma and ssb.
> 
> It's a small struct having about 5 trivial fields. We don't share
> sturcts for any other drivers (chipcommon/mips/pcie) so I think they
> should stay separated here as well.

When this structure is just used in ssb or bcma and in the nvram code of
arch/mips/bcm47x I would also prefer two structures one for bcma and one
for ssb.

> Plus the mtd driver will have to implement bus abstraction anyway.

If you have a structure describing the needs of the serial flash driver
in drivers/mtd/ you could write the flash driver without any ifdef
BCMA_* or SSB_* and if does not have to include linux/ssb/ssb.h or
linu/bcma/bcma.h, like I did this with the watchdog driver
include/linux/bcm47xx_wdt.h

Hauke

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC][PATCH] ssb: add place for serial flash driver
  2012-12-26 10:59     ` Hauke Mehrtens
@ 2012-12-26 12:11       ` Rafał Miłecki
  2012-12-26 12:24         ` Rafał Miłecki
  0 siblings, 1 reply; 6+ messages in thread
From: Rafał Miłecki @ 2012-12-26 12:11 UTC (permalink / raw)
  To: Hauke Mehrtens; +Cc: linux-wireless

2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
> On 12/26/2012 11:46 AM, Rafał Miłecki wrote:
>> 2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
>>> On 12/25/2012 07:23 PM, Rafał Miłecki wrote:
>>>> +#ifdef CONFIG_SSB_SFLASH
>>>> +struct ssb_sflash {
>>>> +     bool present;
>>>> +};
>>>> +#endif
>>>
>>> I assume you want to share some of the code for the serial flash driver
>>> between bcma and ssb. You should create a file with the structure in
>>> include/linux/platform_data/ and share that between bcma and ssb.
>>
>> It's a small struct having about 5 trivial fields. We don't share
>> sturcts for any other drivers (chipcommon/mips/pcie) so I think they
>> should stay separated here as well.
>
> When this structure is just used in ssb or bcma and in the nvram code of
> arch/mips/bcm47x I would also prefer two structures one for bcma and one
> for ssb.
>
>> Plus the mtd driver will have to implement bus abstraction anyway.
>
> If you have a structure describing the needs of the serial flash driver
> in drivers/mtd/ you could write the flash driver without any ifdef
> BCMA_* or SSB_* and if does not have to include linux/ssb/ssb.h or
> linu/bcma/bcma.h, like I did this with the watchdog driver
> include/linux/bcm47xx_wdt.h

OK, I've analyzed your bcm47xx_wdt. I can see you abstract bus here
and implement some simple ops.

We could add similar extra layer for sflash, but I wonder what we
could put in that. For full sflash support we need 2 things:
1) Hardware info (u32 window, u32 blocksize, u16 numblocks)
2) Chipcommon access (read32, write32)

In total that are only ~5 fields in some struct. I wonder if it makes
sense to move that abstracting code to an extra layer? Maybe we can
just do that in bcm47xxsflash with few ifdefs?

-- 
Rafał

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC][PATCH] ssb: add place for serial flash driver
  2012-12-26 12:11       ` Rafał Miłecki
@ 2012-12-26 12:24         ` Rafał Miłecki
  0 siblings, 0 replies; 6+ messages in thread
From: Rafał Miłecki @ 2012-12-26 12:24 UTC (permalink / raw)
  To: Hauke Mehrtens; +Cc: linux-wireless

2012/12/26 Rafał Miłecki <zajec5@gmail.com>:
> 2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
>> On 12/26/2012 11:46 AM, Rafał Miłecki wrote:
>>> 2012/12/26 Hauke Mehrtens <hauke@hauke-m.de>:
>>>> On 12/25/2012 07:23 PM, Rafał Miłecki wrote:
>>>>> +#ifdef CONFIG_SSB_SFLASH
>>>>> +struct ssb_sflash {
>>>>> +     bool present;
>>>>> +};
>>>>> +#endif
>>>>
>>>> I assume you want to share some of the code for the serial flash driver
>>>> between bcma and ssb. You should create a file with the structure in
>>>> include/linux/platform_data/ and share that between bcma and ssb.
>>>
>>> It's a small struct having about 5 trivial fields. We don't share
>>> sturcts for any other drivers (chipcommon/mips/pcie) so I think they
>>> should stay separated here as well.
>>
>> When this structure is just used in ssb or bcma and in the nvram code of
>> arch/mips/bcm47x I would also prefer two structures one for bcma and one
>> for ssb.
>>
>>> Plus the mtd driver will have to implement bus abstraction anyway.
>>
>> If you have a structure describing the needs of the serial flash driver
>> in drivers/mtd/ you could write the flash driver without any ifdef
>> BCMA_* or SSB_* and if does not have to include linux/ssb/ssb.h or
>> linu/bcma/bcma.h, like I did this with the watchdog driver
>> include/linux/bcm47xx_wdt.h
>
> OK, I've analyzed your bcm47xx_wdt. I can see you abstract bus here
> and implement some simple ops.
>
> We could add similar extra layer for sflash, but I wonder what we
> could put in that. For full sflash support we need 2 things:
> 1) Hardware info (u32 window, u32 blocksize, u16 numblocks)
> 2) Chipcommon access (read32, write32)
>
> In total that are only ~5 fields in some struct. I wonder if it makes
> sense to move that abstracting code to an extra layer? Maybe we can
> just do that in bcm47xxsflash with few ifdefs?

Hm, the advantage is that we could fill that struct directly instead
copying values in bcm47xxsflash probe function. Still not sure which
path to follow.

-- 
Rafał

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-12-26 12:24 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-25 18:23 [RFC][PATCH] ssb: add place for serial flash driver Rafał Miłecki
2012-12-26 10:37 ` Hauke Mehrtens
2012-12-26 10:46   ` Rafał Miłecki
2012-12-26 10:59     ` Hauke Mehrtens
2012-12-26 12:11       ` Rafał Miłecki
2012-12-26 12:24         ` Rafał Miłecki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).