diff mbox series

[v2,10/12] sun5i: add support for DIP detection to CHIP board

Message ID 20210302095813.3273-11-kory.maincent@bootlin.com
State Superseded
Delegated to: Tom Rini
Headers show
Series Add support for extension boards detection and DT overlays application | expand

Commit Message

Kory Maincent March 2, 2021, 9:58 a.m. UTC
Add the extension_board_scan specific function to scan the information
of the EEPROM on one-wire and fill the extension struct.

Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---
 arch/arm/mach-sunxi/Kconfig |   2 +
 board/sunxi/Makefile        |   1 +
 board/sunxi/chip.c          | 104 ++++++++++++++++++++++++++++++++++++
 3 files changed, 107 insertions(+)
 create mode 100644 board/sunxi/chip.c

Comments

Maxime Ripard March 2, 2021, 4:05 p.m. UTC | #1
Hi,

On Tue, Mar 02, 2021 at 10:58:11AM +0100, Kory Maincent wrote:
> Add the extension_board_scan specific function to scan the information
> of the EEPROM on one-wire and fill the extension struct.
> 
> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
> ---
>  arch/arm/mach-sunxi/Kconfig |   2 +
>  board/sunxi/Makefile        |   1 +
>  board/sunxi/chip.c          | 104 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 107 insertions(+)
>  create mode 100644 board/sunxi/chip.c
> 
> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> index 4160d52501..2b6ba873ff 100644
> --- a/arch/arm/mach-sunxi/Kconfig
> +++ b/arch/arm/mach-sunxi/Kconfig
> @@ -1020,7 +1020,9 @@ endif
>  
>  config CHIP_DIP_SCAN
>  	bool "Enable DIPs detection for CHIP board"
> +	select SUPPORT_EXTENSION_SCAN
>  	select W1
>  	select W1_GPIO
>  	select W1_EEPROM
>  	select W1_EEPROM_DS24XXX
> +	imply CMD_EXTENSION
> diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
> index c4e13f8c38..d96b7897b6 100644
> --- a/board/sunxi/Makefile
> +++ b/board/sunxi/Makefile
> @@ -11,3 +11,4 @@ obj-$(CONFIG_SUN7I_GMAC)	+= gmac.o
>  obj-$(CONFIG_MACH_SUN4I)	+= dram_sun4i_auto.o
>  obj-$(CONFIG_MACH_SUN5I)	+= dram_sun5i_auto.o
>  obj-$(CONFIG_MACH_SUN7I)	+= dram_sun5i_auto.o
> +obj-$(CONFIG_CHIP_DIP_SCAN)	+= chip.o

The split of that patch and the previous one is weird: you're adding a
Kconfig symbol doing close to nothing in patch 9, and you add the logic
behind it here

It would be more natural to have the Kconfig option and the code here,
and 

> diff --git a/board/sunxi/chip.c b/board/sunxi/chip.c
> new file mode 100644
> index 0000000000..fc3d14e497
> --- /dev/null
> +++ b/board/sunxi/chip.c
> @@ -0,0 +1,104 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2021
> + * Köry Maincent, Bootlin, <kory.maincent@bootlin.com>
> + * Based on initial code from Maxime Ripard
> + */
> +
> +#include <common.h>
> +#include <malloc.h>
> +#include <dm.h>
> +#include <w1.h>
> +#include <w1-eeprom.h>
> +#include <dm/device-internal.h>
> +
> +#include <asm/arch/gpio.h>
> +
> +#include <extension_board.h>
> +
> +#ifdef CONFIG_CMD_EXTENSION
> +
> +#define for_each_1w_device(b, d) \
> +	for (device_find_first_child(b, d); *d; device_find_next_child(d))

The name is inconsistent with the rest of the 1-wire acronyms in the
file (1w vs w1)

Also, reusing macro arguments is fairly dangerous but since it's used
only once we don't really need that macro?

Maxime
Kory Maincent March 2, 2021, 4:14 p.m. UTC | #2
Hello Maxime,

Thanks for your review.

On Tue, 2 Mar 2021 17:05:38 +0100
Maxime Ripard <maxime@cerno.tech> wrote:
 
> The split of that patch and the previous one is weird: you're adding a
> Kconfig symbol doing close to nothing in patch 9, and you add the logic
> behind it here
> 
> It would be more natural to have the Kconfig option and the code here,
> and 

Ok I will merge them into one commit.

> 
> > diff --git a/board/sunxi/chip.c b/board/sunxi/chip.c
> > new file mode 100644
> > index 0000000000..fc3d14e497
> > --- /dev/null
> > +++ b/board/sunxi/chip.c
> > @@ -0,0 +1,104 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * (C) Copyright 2021
> > + * Köry Maincent, Bootlin, <kory.maincent@bootlin.com>
> > + * Based on initial code from Maxime Ripard
> > + */
> > +
> > +#include <common.h>
> > +#include <malloc.h>
> > +#include <dm.h>
> > +#include <w1.h>
> > +#include <w1-eeprom.h>
> > +#include <dm/device-internal.h>
> > +
> > +#include <asm/arch/gpio.h>
> > +
> > +#include <extension_board.h>
> > +
> > +#ifdef CONFIG_CMD_EXTENSION
> > +
> > +#define for_each_1w_device(b, d) \
> > +	for (device_find_first_child(b, d); *d;
> > device_find_next_child(d))  
> 
> The name is inconsistent with the rest of the 1-wire acronyms in the
> file (1w vs w1)

Yes, I didn't notice this.

> 
> Also, reusing macro arguments is fairly dangerous but since it's used
> only once we don't really need that macro?

It was to increase the readability of the loop, but if you judge it not
pertinent I can remove it.
Maxime Ripard March 2, 2021, 4:16 p.m. UTC | #3
On Tue, Mar 02, 2021 at 05:14:44PM +0100, Köry Maincent wrote:
> Hello Maxime,
> 
> Thanks for your review.
> 
> On Tue, 2 Mar 2021 17:05:38 +0100
> Maxime Ripard <maxime@cerno.tech> wrote:
>  
> > The split of that patch and the previous one is weird: you're adding a
> > Kconfig symbol doing close to nothing in patch 9, and you add the logic
> > behind it here
> > 
> > It would be more natural to have the Kconfig option and the code here,
> > and 
> 
> Ok I will merge them into one commit.

Sorry my sentence was incomplete, I meant to say

and enable the Kconfig symbol in another patch

Maxime
diff mbox series

Patch

diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
index 4160d52501..2b6ba873ff 100644
--- a/arch/arm/mach-sunxi/Kconfig
+++ b/arch/arm/mach-sunxi/Kconfig
@@ -1020,7 +1020,9 @@  endif
 
 config CHIP_DIP_SCAN
 	bool "Enable DIPs detection for CHIP board"
+	select SUPPORT_EXTENSION_SCAN
 	select W1
 	select W1_GPIO
 	select W1_EEPROM
 	select W1_EEPROM_DS24XXX
+	imply CMD_EXTENSION
diff --git a/board/sunxi/Makefile b/board/sunxi/Makefile
index c4e13f8c38..d96b7897b6 100644
--- a/board/sunxi/Makefile
+++ b/board/sunxi/Makefile
@@ -11,3 +11,4 @@  obj-$(CONFIG_SUN7I_GMAC)	+= gmac.o
 obj-$(CONFIG_MACH_SUN4I)	+= dram_sun4i_auto.o
 obj-$(CONFIG_MACH_SUN5I)	+= dram_sun5i_auto.o
 obj-$(CONFIG_MACH_SUN7I)	+= dram_sun5i_auto.o
+obj-$(CONFIG_CHIP_DIP_SCAN)	+= chip.o
diff --git a/board/sunxi/chip.c b/board/sunxi/chip.c
new file mode 100644
index 0000000000..fc3d14e497
--- /dev/null
+++ b/board/sunxi/chip.c
@@ -0,0 +1,104 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2021
+ * Köry Maincent, Bootlin, <kory.maincent@bootlin.com>
+ * Based on initial code from Maxime Ripard
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <dm.h>
+#include <w1.h>
+#include <w1-eeprom.h>
+#include <dm/device-internal.h>
+
+#include <asm/arch/gpio.h>
+
+#include <extension_board.h>
+
+#ifdef CONFIG_CMD_EXTENSION
+
+#define for_each_1w_device(b, d) \
+	for (device_find_first_child(b, d); *d; device_find_next_child(d))
+
+#define dip_convert(field)						\
+	(								\
+		(sizeof(field) == 1) ? field :				\
+		(sizeof(field) == 2) ? be16_to_cpu(field) :		\
+		(sizeof(field) == 4) ? be32_to_cpu(field) :		\
+		-1							\
+	)
+
+#define DIP_MAGIC	0x50494843	/* CHIP */
+
+struct dip_w1_header {
+	u32     magic;                  /* CHIP */
+	u8      version;                /* spec version */
+	u32     vendor_id;
+	u16     product_id;
+	u8      product_version;
+	char    vendor_name[32];
+	char    product_name[32];
+	u8      rsvd[36];               /* rsvd for future spec versions */
+	u8      data[16];               /* user data, per-dip specific */
+} __packed;
+
+int extension_board_scan(struct list_head *extension_list)
+{
+	struct extension *dip;
+	struct dip_w1_header w1_header;
+	struct udevice *bus, *dev;
+	u32 vid;
+	u16 pid;
+	int ret;
+
+	int num_dip = 0;
+
+	sunxi_gpio_set_pull(SUNXI_GPD(2), SUNXI_GPIO_PULL_UP);
+
+	ret = w1_get_bus(0, &bus);
+	if (ret) {
+		printf("one wire interface not found\n");
+		return 0;
+	}
+
+	for_each_1w_device(bus, &dev) {
+		if (w1_get_device_family(dev) != W1_FAMILY_DS2431)
+			continue;
+
+		ret = device_probe(dev);
+		if (ret) {
+			printf("Couldn't probe device %s: error %d",
+			       dev->name, ret);
+			continue;
+		}
+
+		w1_eeprom_read_buf(dev, 0, (u8 *)&w1_header, sizeof(w1_header));
+
+		if (w1_header.magic != DIP_MAGIC)
+			continue;
+
+		vid = dip_convert(w1_header.vendor_id);
+		pid = dip_convert(w1_header.product_id);
+
+		printf("DIP: %s (0x%x) from %s (0x%x)\n",
+		       w1_header.product_name, pid,
+		       w1_header.vendor_name, vid);
+
+		dip = calloc(1, sizeof(struct extension));
+		if (!dip) {
+			printf("Error in memory allocation\n");
+			return num_dip;
+		}
+
+		snprintf(dip->overlay, sizeof(dip->overlay), "dip-%x-%x.dtbo",
+			 vid, pid);
+		strncpy(dip->name, w1_header.product_name, 32);
+		strncpy(dip->owner, w1_header.vendor_name, 32);
+		list_add_tail(&dip->list, extension_list);
+		num_dip++;
+	}
+	return num_dip;
+}
+
+#endif /* CONFIG_CMD_EXTENSION */