Skip to contentSkip to conversation

rockchip: Add support for Asus Chromebit

PATCH Superseded Simon Glass 3 participants 23 messages Oct 31, 2016 – Nov 4, 2016

Subsystems (7)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

cover rockchip: Add support for Asus Chromebit

This series adds support for 'mickey', the Asus Chromebit based on Rockchip RK3288.

Some refactoring is included to jerry also. The intent is that all RK3288-based Chromebooks will use the 'veyron' board, with everything common except the device tree. SPI is used to boot, and we move jerry to use of-platdata to save space.

At present there are few boards in U-Boot with two displays. Jerry supports both its internal EDP display and HDMI. The current driver can get confused if both HDMI and EDP try to use the same video-out device (VOP). Some adjustments are made to fix this.

Currently there is an option to increase the CPU speed in SPL. This does not seem necessary with mickey, so instead, this is done in U-Boot proper.

Additionally some bugs have crept in as part of the clock API conversion and other work, so this series fixes those.

Simon Glass (20):
rockchip: video: Correct HDMI data source selection
rockchip: video: Correct VOP clock selection
rockchip: Allow jerry to use of-platdata
dm: core: Handle global_data moving in SPL
stdio: Correct code style nits
stdio: Correct numbering logic in stdio_probe_device()
spi: Add of-platdata support to SPI and SPI flash
rockchip: spi: Add support for of-platdata
rockchip: spi: Honour the deactivation delay
spi: Add error checking for invalid bus widths
spi: Add a debug() on bind failure
video: Use cache-alignment in video_sync()
video: Track whether a display is in use
rockchip: video: Check for device in use
rockchip: Move jerry to use of-platdata
rockchip: Rename jerry files to veyron
rockchip: Move jerry SDRAM settings into its own .dts file
rockchip: clk: Support setting ACLK
rockchip: veyron: Adjust ARM clock after relocation
rockchip: Add support for veyron-mickey (Chromebit)

 arch/arm/dts/Makefile                              |   3 +-
 arch/arm/dts/rk3288-veyron-chromebook.dtsi         |   2 +
 .../{rk3288-jerry.dts => rk3288-veyron-jerry.dts}  |  16 +-
 arch/arm/dts/rk3288-veyron-mickey.dts              | 265 +++++++++++++++++++++
 arch/arm/dts/rk3288-veyron.dtsi                    |   8 -
 arch/arm/mach-rockchip/rk3288-board-spl.c          |   3 +
 arch/arm/mach-rockchip/rk3288-board.c              |  44 ++++
 arch/arm/mach-rockchip/rk3288/Kconfig              |  11 +-
 board/google/chromebook_jerry/Kconfig              |  15 --
 board/google/chromebook_jerry/MAINTAINERS          |   6 -
 board/google/veyron/Kconfig                        |  31 +++
 board/google/veyron/MAINTAINERS                    |  13 +
 board/google/{chromebook_jerry => veyron}/Makefile |   2 +-
 .../{chromebook_jerry/jerry.c => veyron/veyron.c}  |   0
 common/spl/spl.c                                   |   3 +
 common/stdio.c                                     |   9 +-
 configs/chromebit_mickey_defconfig                 |  84 +++++++
 configs/chromebook_jerry_defconfig                 |  10 +-
 drivers/clk/rockchip/clk_rk3288.c                  |   7 +
 drivers/core/root.c                                |   7 +
 drivers/mtd/spi/spi_flash.c                        |   2 +-
 drivers/spi/rk_spi.c                               |  44 +++-
 drivers/spi/spi-uclass.c                           |  26 +-
 drivers/video/display-uclass.c                     |  18 +-
 drivers/video/rockchip/rk_hdmi.c                   |   3 +-
 drivers/video/rockchip/rk_vop.c                    |  16 +-
 drivers/video/video-uclass.c                       |   3 +-
 include/configs/{chromebook_jerry.h => veyron.h}   |   0
 include/display.h                                  |  10 +
 include/dm/root.h                                  |  10 +
 30 files changed, 608 insertions(+), 63 deletions(-)
 rename arch/arm/dts/{rk3288-jerry.dts => rk3288-veyron-jerry.dts} (92%)
 create mode 100644 arch/arm/dts/rk3288-veyron-mickey.dts
 delete mode 100644 board/google/chromebook_jerry/Kconfig
 delete mode 100644 board/google/chromebook_jerry/MAINTAINERS
 create mode 100644 board/google/veyron/Kconfig
 create mode 100644 board/google/veyron/MAINTAINERS
 rename board/google/{chromebook_jerry => veyron}/Makefile (81%)
 rename board/google/{chromebook_jerry/jerry.c => veyron/veyron.c} (100%)
 create mode 100644 configs/chromebit_mickey_defconfig
 rename include/configs/{chromebook_jerry.h => veyron.h} (100%)
Signature · 1 line
2.8.0.rc3.226.g39d4020
#1 lore raw

PATCH 1/20 rockchip: video: Correct HDMI data source selection

This code currently always selects the second source. It only worked because both sources are set up.

With the change to only init video devices that are present in the stdout environment variable, this fails. Fix it.

---

 drivers/video/rockchip/rk_hdmi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/rockchip/rk_hdmi.c +2 -1
index 7976c5e..72142dc 100644
@@ -899,7 +899,8 @@ static int rk_hdmi_probe(struct udevice *dev)
 	rk_setreg(&priv->grf->soc_con6, 1 << 15);
 
 	/* hdmi data from vop id */
-	rk_setreg(&priv->grf->soc_con6, (vop_id == 1) ? (1 << 4) : (1 << 4));
+	rk_clrsetreg(&priv->grf->soc_con6, 1 << 4,
+		     (vop_id == 1) ? (1 << 4) : 0);
 
 	ret = hdmi_wait_for_hpd(priv->regs);
 	if (ret < 0) {
Signature · 1 line
2.8.0.rc3.226.g39d4020
#2 lore raw

PATCH 1/20 rockchip: video: Correct HDMI data source selection

Quoted 17 lines · Simon Glass

This code currently always selects the second source. It only worked because both sources are set up.

With the change to only init video devices that are present in the stdout environment variable, this fails. Fix it.

---

 drivers/video/rockchip/rk_hdmi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/rockchip/rk_hdmi.c +0 -0
index 7976c5e..72142dc 100644

drivers/video/rockchip/rk_hdmi.c static int rk_hdmi_probe(struct udevice *dev) · line 903

Quoted 6 lines
drivers/video/rockchip/rk_hdmi.c +2 -1
@@ -899,7 +899,8 @@ static int rk_hdmi_probe(struct udevice *dev)
 	rk_setreg(&priv->grf->soc_con6, 1 << 15);
 
 	/* hdmi data from vop id */
-	rk_setreg(&priv->grf->soc_con6, (vop_id == 1) ? (1 << 4) : (1 << 4));
+	rk_clrsetreg(&priv->grf->soc_con6, 1 << 4,
+		     (vop_id == 1) ? (1 << 4) : 0);

Magic numbers, could this get fixed to:

#define CON6_SOMETHING bit(4)

same for other bits if anyone knows what they do.

Quoted 4 lines
drivers/video/rockchip/rk_hdmi.c +0 -0
 	ret = hdmi_wait_for_hpd(priv->regs);
 	if (ret < 0) {
 
#3 lore raw

PATCH 2/20 rockchip: video: Correct VOP clock selection

In reply to Simon Glass

This code incorrectly uses the oscillator. It should use the clock selected in the device tree.

Fixes 135aa95 (clk: convert API to match reset/mailbox style)

---

 drivers/video/rockchip/rk_vop.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/video/rockchip/rk_vop.c +1 -6
index c6d88d9..130dace 100644
@@ -195,7 +195,6 @@ int rk_display_init(struct udevice *dev, ulong fbbase,
 	struct udevice *disp;
 	int ret, remote, i, offset;
 	struct display_plat *disp_uc_plat;
-	struct udevice *dev_clk;
 	struct clk clk;
 
 	vop_id = fdtdec_get_int(blob, ep_node, "reg", -1);
@@ -238,11 +237,7 @@ int rk_display_init(struct udevice *dev, ulong fbbase,
 		return ret;
 	}
 
-	ret = rockchip_get_clk(&dev_clk);
-	if (!ret) {
-		clk.id = DCLK_VOP0 + remote_vop_id;
-		ret = clk_request(dev_clk, &clk);
-	}
+	ret = clk_get_by_index(dev, 1, &clk);
 	if (!ret)
 		ret = clk_set_rate(&clk, timing.pixelclock.typ);
 	if (ret) {
Signature · 1 line
2.8.0.rc3.226.g39d4020
#4 lore raw

PATCH 3/20 rockchip: Allow jerry to use of-platdata

In reply to Simon Glass

This board always boots from SPI, so update the code to support that with of-platdata. The boot source is not currently available with of-platdata.

---

 arch/arm/mach-rockchip/rk3288-board-spl.c | 2 ++
 1 file changed, 2 insertions(+)
arch/arm/mach-rockchip/rk3288-board-spl.c +2 -0
index 0f40351..185b5fd 100644
@@ -64,6 +64,8 @@ u32 spl_boot_device(void)
 	}
 
 fallback:
+#elif defined(CONFIG_TARGET_CHROMEBOOK_JERRY)
+	return BOOT_DEVICE_SPI;
 #endif
 	return BOOT_DEVICE_MMC1;
 }
Signature · 1 line
2.8.0.rc3.226.g39d4020
#5 lore raw

PATCH 4/20 dm: core: Handle global_data moving in SPL

In reply to Simon Glass

When CONFIG_SPL_STACK_R is enabled, and spl_init() is called before board_init_r(), spl_relocate_stack_gd() will move global_data to a new place in memory. This affects driver model since it uses a list for the uclasses. Unless this is updated the list will become invalid. When looking for a non-existent uclass, such as when adding a new one, the loop in uclass_find() may continue forever, thus causing a hang.

Add a function to correct this rather obscure bug.

---

 common/spl/spl.c    |  3 +++
 drivers/core/root.c |  7 +++++++
 include/dm/root.h   | 10 ++++++++++
 3 files changed, 20 insertions(+)
common/spl/spl.c +3 -0
index bdb165a..9dc9e22 100644
@@ -511,6 +511,9 @@ ulong spl_relocate_stack_gd(void)
 	ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
 	new_gd = (gd_t *)ptr;
 	memcpy(new_gd, (void *)gd, sizeof(gd_t));
+#if CONFIG_IS_ENABLED(CONFIG_DM)
+	dm_fixup_for_gd_move(new_gd);
+#endif
 #if !defined(CONFIG_ARM)
 	gd = new_gd;
 #endif
drivers/core/root.c +7 -0
index 33dc9c0..9edfc1e 100644
@@ -41,6 +41,13 @@ struct udevice *dm_root(void)
 	return gd->dm_root;
 }
 
+void dm_fixup_for_gd_move(struct global_data *new_gd)
+{
+	/* The sentinel node has moved, so update things that point to it */
+	new_gd->uclass_root.next->prev = &new_gd->uclass_root;
+	new_gd->uclass_root.prev->next = &new_gd->uclass_root;
+}
+
 fdt_addr_t dm_get_translation_offset(void)
 {
 	struct udevice *root = dm_root();
include/dm/root.h +10 -0
index c7f0c1d..3cf730d 100644
@@ -21,6 +21,16 @@ struct udevice;
  */
 struct udevice *dm_root(void);
 
+struct global_data;
+/**
+ * dm_fixup_for_gd_move() - Handle global_data moving to a new place
+ *
+ * The uclass list is part of global_data. Due to the way lists work, moving
+ * the list will cause it to become invalid. This function fixes that up so
+ * that the uclass list will work correctly.
+ */
+void dm_fixup_for_gd_move(struct global_data *new_gd);
+
 /**
  * dm_scan_platdata() - Scan all platform data and bind drivers
  *
Signature · 1 line
2.8.0.rc3.226.g39d4020
#6 lore raw

PATCH 5/20 stdio: Correct code style nits

In reply to Simon Glass

Fix a few code style nits in stdio_get_by_name().

---

 common/stdio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
common/stdio.c +2 -2
index 8e4a9be..a7d016b 100644
@@ -173,12 +173,12 @@ static int stdio_probe_device(const char *name, enum uclass_id id,
 }
 #endif
 
-struct stdio_dev* stdio_get_by_name(const char *name)
+struct stdio_dev *stdio_get_by_name(const char *name)
 {
 	struct list_head *pos;
 	struct stdio_dev *sdev;
 
-	if(!name)
+	if (!name)
 		return NULL;
 
 	list_for_each(pos, &(devs.list)) {
Signature · 1 line
2.8.0.rc3.226.g39d4020
#7 lore raw

PATCH 6/20 stdio: Correct numbering logic in stdio_probe_device()

In reply to Simon Glass

The current code assumes that the devices are ordered corresponding to their alias value. But (for example) video1 can come before video0 in the device tree.

Correct this, by always looking for device 0 first. After that we can fall back to finding the first available device.

---

 common/stdio.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
common/stdio.c +3 -2
index a7d016b..4d30017 100644
@@ -151,9 +151,10 @@ static int stdio_probe_device(const char *name, enum uclass_id id,
 	*sdevp = NULL;
 	seq = trailing_strtoln(name, NULL);
 	if (seq == -1)
+		seq = 0;
+	ret = uclass_get_device_by_seq(id, seq, &dev);
+	if (ret == -ENODEV)
 		ret = uclass_first_device_err(id, &dev);
-	else
-		ret = uclass_get_device_by_seq(id, seq, &dev);
 	if (ret) {
 		debug("No %s device for seq %d (%s)\n", uclass_get_name(id),
 		      seq, name);
Signature · 1 line
2.8.0.rc3.226.g39d4020
#8 lore raw

PATCH 7/20 spi: Add of-platdata support to SPI and SPI flash

In reply to Simon Glass

Some boards may want to use these subsystems with of-platdata in SPL. Add support for this by avoiding any device tree access in this case.

---

 drivers/mtd/spi/spi_flash.c |  2 +-
 drivers/spi/spi-uclass.c    | 13 ++++++++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)
drivers/mtd/spi/spi_flash.c +1 -1
index 7f6e9ae..6571f86 100644
@@ -1228,7 +1228,7 @@ int spi_flash_scan(struct spi_flash *flash)
 		return ret;
 #endif
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 	ret = spi_flash_decode_fdt(gd->fdt_blob, flash);
 	if (ret) {
 		debug("SF: FDT decode error\n");
drivers/spi/spi-uclass.c +12 -1
index d9c49e4..26eada2 100644
@@ -108,6 +108,7 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
 	return dm_spi_xfer(slave->dev, bitlen, dout, din, flags);
 }
 
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 static int spi_child_post_bind(struct udevice *dev)
 {
 	struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
@@ -117,14 +118,16 @@ static int spi_child_post_bind(struct udevice *dev)
 
 	return spi_slave_ofdata_to_platdata(gd->fdt_blob, dev->of_offset, plat);
 }
+#endif
 
 static int spi_post_probe(struct udevice *bus)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	struct dm_spi_bus *spi = dev_get_uclass_priv(bus);
 
 	spi->max_hz = fdtdec_get_int(gd->fdt_blob, bus->of_offset,
 				     "spi-max-frequency", 0);
-
+#endif
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
 	struct dm_spi_ops *ops = spi_get_ops(bus);
 
@@ -274,7 +277,11 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
 	bool created = false;
 	int ret;
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	ret = uclass_first_device_err(UCLASS_SPI, &bus);
+#else
 	ret = uclass_get_device_by_seq(UCLASS_SPI, busnum, &bus);
+#endif
 	if (ret) {
 		printf("Invalid bus %d (err=%d)\n", busnum, ret);
 		return ret;
@@ -436,14 +443,18 @@ UCLASS_DRIVER(spi) = {
 	.id		= UCLASS_SPI,
 	.name		= "spi",
 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	.post_bind	= dm_scan_fdt_dev,
+#endif
 	.post_probe	= spi_post_probe,
 	.child_pre_probe = spi_child_pre_probe,
 	.per_device_auto_alloc_size = sizeof(struct dm_spi_bus),
 	.per_child_auto_alloc_size = sizeof(struct spi_slave),
 	.per_child_platdata_auto_alloc_size =
 			sizeof(struct dm_spi_slave_platdata),
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
 	.child_post_bind = spi_child_post_bind,
+#endif
 };
 
 UCLASS_DRIVER(spi_generic) = {
Signature · 1 line
2.8.0.rc3.226.g39d4020
#9 lore raw

PATCH 8/20 rockchip: spi: Add support for of-platdata

In reply to Simon Glass

Allow this driver to be used with of-platdata on rk3288.

---

 drivers/spi/rk_spi.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
drivers/spi/rk_spi.c +35 -1
index 105ee4a..8d64249 100644
@@ -12,6 +12,7 @@
 #include <common.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <errno.h>
 #include <spi.h>
 #include <linux/errno.h>
@@ -27,6 +28,9 @@ DECLARE_GLOBAL_DATA_PTR;
 #define DEBUG_RK_SPI	0
 
 struct rockchip_spi_platdata {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct dtd_rockchip_rk3288_spi of_plat;
+#endif
 	s32 frequency;		/* Default clock frequency, -1 for none */
 	fdt_addr_t base;
 	uint deactivate_delay_us;	/* Delay to wait after deactivate */
@@ -127,9 +131,29 @@ static void spi_cs_deactivate(struct udevice *dev, uint cs)
 		priv->last_transaction_us = timer_get_us();
 }
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+static int conv_of_platdata(struct udevice *dev)
+{
+	struct rockchip_spi_platdata *plat = dev->platdata;
+	struct dtd_rockchip_rk3288_spi *dtplat = &plat->of_plat;
+	struct rockchip_spi_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	plat->base = dtplat->reg[0];
+	plat->frequency = 20000000;
+	ret = clk_get_by_index_platdata(dev, 0, dtplat->clocks, &priv->clk);
+	if (ret < 0)
+		return ret;
+	dev->req_seq = 0;
+
+	return 0;
+}
+#endif
+
 static int rockchip_spi_ofdata_to_platdata(struct udevice *bus)
 {
-	struct rockchip_spi_platdata *plat = bus->platdata;
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	struct rockchip_spi_platdata *plat = dev_get_platdata(bus);
 	struct rockchip_spi_priv *priv = dev_get_priv(bus);
 	const void *blob = gd->fdt_blob;
 	int node = bus->of_offset;
@@ -153,6 +177,7 @@ static int rockchip_spi_ofdata_to_platdata(struct udevice *bus)
 	debug("%s: base=%x, max-frequency=%d, deactivate_delay=%d\n",
 	      __func__, (uint)plat->base, plat->frequency,
 	      plat->deactivate_delay_us);
+#endif
 
 	return 0;
 }
@@ -164,6 +189,11 @@ static int rockchip_spi_probe(struct udevice *bus)
 	int ret;
 
 	debug("%s: probe\n", __func__);
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	ret = conv_of_platdata(bus);
+	if (ret)
+		return ret;
+#endif
 	priv->regs = (struct rockchip_spi *)plat->base;
 
 	priv->last_transaction_us = timer_get_us();
@@ -369,7 +399,11 @@ static const struct udevice_id rockchip_spi_ids[] = {
 };
 
 U_BOOT_DRIVER(rockchip_spi) = {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+	.name	= "rockchip_rk3288_spi",
+#else
 	.name	= "rockchip_spi",
+#endif
 	.id	= UCLASS_SPI,
 	.of_match = rockchip_spi_ids,
 	.ops	= &rockchip_spi_ops,
Signature · 1 line
2.8.0.rc3.226.g39d4020
#10 lore raw

PATCH 9/20 rockchip: spi: Honour the deactivation delay

In reply to Simon Glass

This is not currently implemented. Add support for this so that the Chrome OS EC can be used on jerry.

---

 drivers/spi/rk_spi.c | 8 ++++++++
 1 file changed, 8 insertions(+)
drivers/spi/rk_spi.c +8 -0
index 8d64249..15cf0bd 100644
@@ -110,6 +110,14 @@ static void spi_cs_activate(struct udevice *dev, uint cs)
 	struct rockchip_spi_priv *priv = dev_get_priv(bus);
 	struct rockchip_spi *regs = priv->regs;
 
+	/* If it's too soon to do another transaction, wait */
+	if (plat->deactivate_delay_us && priv->last_transaction_us) {
+		ulong delay_us;		/* The delay completed so far */
+		delay_us = timer_get_us() - priv->last_transaction_us;
+		if (delay_us < plat->deactivate_delay_us)
+			udelay(plat->deactivate_delay_us - delay_us);
+	}
+
 	debug("activate cs%u\n", cs);
 	writel(1 << cs, &regs->ser);
 	if (plat->activate_delay_us)
Signature · 1 line
2.8.0.rc3.226.g39d4020
#11 lore raw

PATCH 10/20 spi: Add error checking for invalid bus widths

In reply to Simon Glass

At present an invalid bus width prints a message but does not return an error. This is the opposite of the correct behaviour. Adjust it to avoid code bloat in the common case, and avoid hard-to-debug failure in the uncommon case.

---

 drivers/spi/spi-uclass.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/spi/spi-uclass.c +4 -4
index 26eada2..358e229 100644
@@ -415,8 +415,8 @@ int spi_slave_ofdata_to_platdata(const void *blob, int node,
 		mode |= SPI_TX_QUAD;
 		break;
 	default:
-		error("spi-tx-bus-width %d not supported\n", value);
-		break;
+		debug("spi-tx-bus-width %d not supported\n", value);
+		return -EPROTONOSUPPORT;
 	}
 
 	value = fdtdec_get_uint(blob, node, "spi-rx-bus-width", 1);
@@ -430,8 +430,8 @@ int spi_slave_ofdata_to_platdata(const void *blob, int node,
 		mode |= SPI_RX_QUAD;
 		break;
 	default:
-		error("spi-rx-bus-width %d not supported\n", value);
-		break;
+		debug("spi-rx-bus-width %d not supported\n", value);
+		return -EPROTONOSUPPORT;
 	}
 
 	plat->mode = mode;
Signature · 1 line
2.8.0.rc3.226.g39d4020
#12 lore raw

PATCH 11/20 spi: Add a debug() on bind failure

In reply to Simon Glass

This is an uncommon error but we may as well have a debug() message when it happens.

---

 drivers/spi/spi-uclass.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/spi/spi-uclass.c +4 -1
index 358e229..b251442 100644
@@ -297,8 +297,11 @@ int spi_get_bus_and_cs(int busnum, int cs, int speed, int mode,
 		debug("%s: Binding new device '%s', busnum=%d, cs=%d, driver=%s\n",
 		      __func__, dev_name, busnum, cs, drv_name);
 		ret = device_bind_driver(bus, drv_name, dev_name, &dev);
-		if (ret)
+		if (ret) {
+			debug("%s: Unable to bind driver (ret=%d)\n", __func__,
+			      ret);
 			return ret;
+		}
 		plat = dev_get_parent_platdata(dev);
 		plat->cs = cs;
 		plat->max_hz = speed;
Signature · 1 line
2.8.0.rc3.226.g39d4020
#13 lore raw

PATCH 12/20 video: Use cache-alignment in video_sync()

In reply to Simon Glass

Sometimes the frame buffer is not a multiple of the cache line size. Adjust the cache-flushing code to avoid cache warnings/errors in this case.

---

 drivers/video/video-uclass.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/video-uclass.c +2 -1
index 11ca793..3036e3a 100644
@@ -117,7 +117,8 @@ void video_sync(struct udevice *vid)
 
 	if (priv->flush_dcache) {
 		flush_dcache_range((ulong)priv->fb,
-				   (ulong)priv->fb + priv->fb_size);
+				   ALIGN((ulong)priv->fb + priv->fb_size,
+					 CONFIG_SYS_CACHELINE_SIZE));
 	}
 #elif defined(CONFIG_VIDEO_SANDBOX_SDL)
 	struct video_priv *priv = dev_get_uclass_priv(vid);
Signature · 1 line
2.8.0.rc3.226.g39d4020
#14 lore raw

PATCH 13/20 video: Track whether a display is in use

In reply to Simon Glass

Mark a display as in use when display_enable() is called. This can avoid a display being used by multiple video-output devices.

---

 drivers/video/display-uclass.c | 18 +++++++++++++++++-
 include/display.h              | 10 ++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
drivers/video/display-uclass.c +17 -1
index e4763de..e752eb0 100644
@@ -23,10 +23,19 @@ int display_enable(struct udevice *dev, int panel_bpp,
 			const struct display_timing *timing)
 {
 	struct dm_display_ops *ops = display_get_ops(dev);
+	struct display_plat *disp_uc_plat;
+	int ret;
 
 	if (!ops || !ops->enable)
 		return -ENOSYS;
-	return ops->enable(dev, panel_bpp, timing);
+	ret = ops->enable(dev, panel_bpp, timing);
+	if (ret)
+		return ret;
+
+	disp_uc_plat = dev_get_uclass_platdata(dev);
+	disp_uc_plat->in_use = true;
+
+	return 0;
 }
 
 int display_read_timing(struct udevice *dev, struct display_timing *timing)
@@ -48,6 +57,13 @@ int display_read_timing(struct udevice *dev, struct display_timing *timing)
 	return edid_get_timing(buf, ret, timing, &panel_bits_per_colour);
 }
 
+bool display_in_use(struct udevice *dev)
+{
+	struct display_plat *disp_uc_plat = dev_get_uclass_platdata(dev);
+
+	return disp_uc_plat->in_use;
+}
+
 UCLASS_DRIVER(display) = {
 	.id		= UCLASS_DISPLAY,
 	.name		= "display",
include/display.h +10 -0
index b1c4766..d0a08d4 100644
@@ -16,10 +16,12 @@ struct display_timing;
  * @source_id:	ID for the source of the display data, typically a video
  * controller
  * @src_dev:	Source device providing the video
+ * @in_use:	Display is being used
  */
 struct display_plat {
 	int source_id;
 	struct udevice *src_dev;
+	bool in_use;
 };
 
 /**
@@ -41,6 +43,14 @@ int display_read_timing(struct udevice *dev, struct display_timing *timing);
 int display_enable(struct udevice *dev, int panel_bpp,
 		   const struct display_timing *timing);
 
+/**
+ * display_in_use() - Check if a display is in use by any device
+ *
+ * @return true if the device is in use (display_enable() has been called
+ * successfully), else false
+ */
+bool display_in_use(struct udevice *dev);
+
 struct dm_display_ops {
 	/**
 	 * read_timing() - Read information directly
Signature · 1 line
2.8.0.rc3.226.g39d4020
#15 lore raw

PATCH 14/20 rockchip: video: Check for device in use

In reply to Simon Glass

Check whether a display device is in use before using it. Add a comment as to why two displays cannot currently be used at the same time.

This allows us to remove the device-tree change that disables vopb on jerry.

---

 arch/arm/dts/rk3288-jerry.dts              | 5 -----
 arch/arm/dts/rk3288-veyron-chromebook.dtsi | 2 ++
 drivers/video/rockchip/rk_vop.c            | 9 +++++++++
 3 files changed, 11 insertions(+), 5 deletions(-)
arch/arm/dts/rk3288-jerry.dts +0 -5
index 2aa3b9f..da37ea8 100644
@@ -108,11 +108,6 @@
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
-&vopb {
-	/* Disable this so that we use vopl */
-	status = "disabled";
-};
-
 &edp {
 	pinctrl-names = "default";
 	pinctrl-0 = <&edp_hpd>;
arch/arm/dts/rk3288-veyron-chromebook.dtsi +2 -0
index bbbc2f4..f88a868 100644
@@ -13,6 +13,8 @@
 / {
 	aliases {
 		i2c20 = &i2c_tunnel;
+		video0 = &vopl;
+		video1 = &vopb;
 	};
 
 	gpio_keys: gpio-keys {
drivers/video/rockchip/rk_vop.c +9 -0
index 130dace..eab5486 100644
@@ -221,6 +221,11 @@ int rk_display_init(struct udevice *dev, ulong fbbase,
 
 	disp_uc_plat = dev_get_uclass_platdata(disp);
 	debug("Found device '%s', disp_uc_priv=%p\n", disp->name, disp_uc_plat);
+	if (display_in_use(disp)) {
+		debug("   - device in use\n");
+		return -EBUSY;
+	}
+
 	disp_uc_plat->source_id = remote_vop_id;
 	disp_uc_plat->src_dev = dev;
 
@@ -311,6 +316,10 @@ static int rk_vop_probe(struct udevice *dev)
 	/*
 	 * Try all the ports until we find one that works. In practice this
 	 * tries EDP first if available, then HDMI.
+	 *
+	 * Note that rockchip_vop_set_clk() always uses NPLL as the source
+	 * clock so it is currently not possible to use more than one display
+	 * device simultaneously.
 	 */
 	port = fdt_subnode_offset(blob, dev->of_offset, "port");
 	if (port < 0)
Signature · 1 line
2.8.0.rc3.226.g39d4020
#16 lore raw

PATCH 15/20 rockchip: Move jerry to use of-platdata

In reply to Simon Glass

Adjust jerry to use of-platdata like other rk3288 boards. This reduces the SPL size enough that it boots again.

---

 configs/chromebook_jerry_defconfig | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
configs/chromebook_jerry_defconfig +4 -4
index 876adc4..6f4ae18 100644
@@ -1,12 +1,9 @@
 CONFIG_ARM=y
 CONFIG_ARCH_ROCKCHIP=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
-CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_MMC_SUPPORT is not set
-CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_ROCKCHIP_RK3288=y
 CONFIG_TARGET_CHROMEBOOK_JERRY=y
-CONFIG_ROCKCHIP_FAST_SPL=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_SPL_STACK_R_ADDR=0x80000
@@ -36,7 +33,7 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_OF_CONTROL=y
-CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent"
+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_REGMAP=y
 CONFIG_SPL_REGMAP=y
 CONFIG_SYSCON=y
@@ -71,6 +68,7 @@ CONFIG_DEBUG_UART_BASE=0xff690000
 CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
+CONFIG_ROCKCHIP_SERIAL=y
 CONFIG_ROCKCHIP_SPI=y
 CONFIG_SYSRESET=y
 CONFIG_DM_VIDEO=y
@@ -80,3 +78,5 @@ CONFIG_CONSOLE_SCROLL_LINES=10
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_CMD_DHRYSTONE=y
 CONFIG_ERRNO_STR=y
+CONFIG_SPL_OF_PLATDATA=y
+# CONFIG_SPL_OF_LIBFDT is not set
Signature · 1 line
2.8.0.rc3.226.g39d4020
#17 lore raw

PATCH 16/20 rockchip: Rename jerry files to veyron

In reply to Simon Glass

At present we have a single rk3288-based Chromebook: chromebook_jerry. But all such Chromebooks can use the same binary with only device-tree differences. The family name is 'veyron', so rename the files accordingly.

Also update the device-tree filename since this currently differs from Linux.

---

 arch/arm/dts/Makefile                                      | 2 +-
 arch/arm/dts/{rk3288-jerry.dts => rk3288-veyron-jerry.dts} | 0
 arch/arm/mach-rockchip/rk3288/Kconfig                      | 2 +-
 board/google/{chromebook_jerry => veyron}/Kconfig          | 4 ++--
 board/google/{chromebook_jerry => veyron}/MAINTAINERS      | 4 ++--
 board/google/{chromebook_jerry => veyron}/Makefile         | 2 +-
 board/google/{chromebook_jerry/jerry.c => veyron/veyron.c} | 0
 configs/chromebook_jerry_defconfig                         | 2 +-
 include/configs/{chromebook_jerry.h => veyron.h}           | 0
 9 files changed, 8 insertions(+), 8 deletions(-)
 rename arch/arm/dts/{rk3288-jerry.dts => rk3288-veyron-jerry.dts} (100%)
 rename board/google/{chromebook_jerry => veyron}/Kconfig (74%)
 rename board/google/{chromebook_jerry => veyron}/MAINTAINERS (60%)
 rename board/google/{chromebook_jerry => veyron}/Makefile (81%)
 rename board/google/{chromebook_jerry/jerry.c => veyron/veyron.c} (100%)
 rename include/configs/{chromebook_jerry.h => veyron.h} (100%)
arch/arm/dts/Makefile +1 -1
index 836a8c4..af8b0de 100644
@@ -29,7 +29,7 @@ dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \
 dtb-$(CONFIG_EXYNOS7420) += exynos7420-espresso7420.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rk3288-firefly.dtb \
-	rk3288-jerry.dtb \
+	rk3288-veyron-jerry.dtb \
 	rk3288-rock2-square.dtb \
 	rk3288-evb.dtb \
 	rk3288-fennec.dtb \
arch/arm/dts/rk3288-veyron-jerry.dts renamed from arch/arm/dts/rk3288-jerry.dts +0 -0
similarity index 100%
rename from arch/arm/dts/rk3288-jerry.dts
rename to arch/arm/dts/rk3288-veyron-jerry.dts
arch/arm/mach-rockchip/rk3288/Kconfig +1 -1
index c53d2e2..30c557b 100644
@@ -88,7 +88,7 @@ source "board/chipspark/popmetal_rk3288/Kconfig"
 
 source "board/firefly/firefly-rk3288/Kconfig"
 
-source "board/google/chromebook_jerry/Kconfig"
+source "board/google/veyron/Kconfig"
 
 source "board/radxa/rock2/Kconfig"
 
board/google/veyron/Kconfig renamed from board/google/chromebook_jerry/Kconfig +2 -2
similarity index 74%
rename from board/google/chromebook_jerry/Kconfig
rename to board/google/veyron/Kconfig
index 3640513..b1f51ce 100644
@@ -1,13 +1,13 @@
 if TARGET_CHROMEBOOK_JERRY
 
 config SYS_BOARD
-	default "chromebook_jerry"
+	default "veyron"
 
 config SYS_VENDOR
 	default "google"
 
 config SYS_CONFIG_NAME
-	default "chromebook_jerry"
+	default "veyron"
 
 config BOARD_SPECIFIC_OPTIONS # dummy
 	def_bool y
board/google/veyron/MAINTAINERS renamed from board/google/chromebook_jerry/MAINTAINERS +2 -2
similarity index 60%
rename from board/google/chromebook_jerry/MAINTAINERS
rename to board/google/veyron/MAINTAINERS
index b01b6cd..d641eed 100644
@@ -1,6 +1,6 @@
 CHROMEBOOK JERRY BOARD
 M:	Simon Glass <[email protected]>
 S:	Maintained
-F:	board/google/chromebook_jerry/
-F:	include/configs/chromebook_jerry.h
+F:	board/google/veyron/
+F:	include/configs/veyron.h
 F:	configs/chromebook_jerry_defconfig
board/google/veyron/Makefile renamed from board/google/chromebook_jerry/Makefile +1 -1
similarity index 81%
rename from board/google/chromebook_jerry/Makefile
rename to board/google/veyron/Makefile
index d29a063..9868357 100644
@@ -4,4 +4,4 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y	+= jerry.o
+obj-y	+= veyron.o
board/google/veyron/veyron.c renamed from board/google/chromebook_jerry/jerry.c +0 -0
similarity index 100%
rename from board/google/chromebook_jerry/jerry.c
rename to board/google/veyron/veyron.c
configs/chromebook_jerry_defconfig +1 -1
index 6f4ae18..46df1a6 100644
@@ -7,7 +7,7 @@ CONFIG_TARGET_CHROMEBOOK_JERRY=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_SPL_STACK_R_ADDR=0x80000
-CONFIG_DEFAULT_DEVICE_TREE="rk3288-jerry"
+CONFIG_DEFAULT_DEVICE_TREE="rk3288-veyron-jerry"
 CONFIG_SILENT_CONSOLE=y
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_SPL_STACK_R=y
include/configs/veyron.h renamed from include/configs/chromebook_jerry.h +0 -0
similarity index 100%
rename from include/configs/chromebook_jerry.h
rename to include/configs/veyron.h
Signature · 1 line
2.8.0.rc3.226.g39d4020
#18 lore raw

PATCH 17/20 rockchip: Move jerry SDRAM settings into its own .dts file

In reply to Simon Glass

The SDRAM settings are not common across all veyron models. Move the current settings into Jerry's file.

---

 arch/arm/dts/rk3288-veyron-jerry.dts | 11 +++++++++++
 arch/arm/dts/rk3288-veyron.dtsi      |  8 --------
 2 files changed, 11 insertions(+), 8 deletions(-)
arch/arm/dts/rk3288-veyron-jerry.dts +11 -0
index da37ea8..8aab607 100644
@@ -55,6 +55,17 @@
 	};
 };
 
+&dmc {
+	rockchip,pctl-timing = <0x29a 0xc8 0x1f4 0x42 0x4e 0x4 0xea 0xa
+		0x5 0x0 0xa 0x7 0x19 0x24 0xa 0x7
+		0x5 0xa 0x5 0x200 0x5 0x10 0x40 0x0
+		0x1 0x7 0x7 0x4 0xc 0x43 0x100 0x0
+		0x5 0x0>;
+	rockchip,phy-timing = <0x48f9aab4 0xea0910 0x1002c200
+		0xa60 0x40 0x10 0x0>;
+	rockchip,sdram-params = <0x30B25564 0x627 3 666000000 3 9 1>;
+};
+
 &gpio_keys {
 	power {
 		gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
arch/arm/dts/rk3288-veyron.dtsi +0 -8
index 2ffe39c..a314058 100644
@@ -245,14 +245,6 @@
 		533000 1150000
 		666000 1200000
 	>;
-	rockchip,pctl-timing = <0x29a 0xc8 0x1f4 0x42 0x4e 0x4 0xea 0xa
-		0x5 0x0 0xa 0x7 0x19 0x24 0xa 0x7
-		0x5 0xa 0x5 0x200 0x5 0x10 0x40 0x0
-		0x1 0x7 0x7 0x4 0xc 0x43 0x100 0x0
-		0x5 0x0>;
-	rockchip,phy-timing = <0x48f9aab4 0xea0910 0x1002c200
-		0xa60 0x40 0x10 0x0>;
-	rockchip,sdram-params = <0x30B25564 0x627 3 666000000 3 9 1>;
 };
 
 &efuse {
Signature · 1 line
2.8.0.rc3.226.g39d4020
#19 lore raw

PATCH 18/20 rockchip: clk: Support setting ACLK

In reply to Simon Glass

Add basic support for setting the ARM clock, since this allows us to run at maximum speed in U-Boot. Currently only a single speed is supported (1.8GHz).

---

 drivers/clk/rockchip/clk_rk3288.c | 7 +++++++
 1 file changed, 7 insertions(+)
drivers/clk/rockchip/clk_rk3288.c +7 -0
index ed97e87..d15504c 100644
@@ -691,6 +691,13 @@ static ulong rk3288_clk_set_rate(struct clk *clk, ulong rate)
 
 	gclk_rate = rkclk_pll_get_rate(priv->cru, CLK_GENERAL);
 	switch (clk->id) {
+	case PLL_APLL:
+		/* We only support a fixed rate here */
+		if (rate != 1800000000)
+			return -EINVAL;
+		rk3288_clk_configure_cpu(priv->cru, priv->grf);
+		new_rate = rate;
+		break;
 	case CLK_DDR:
 		new_rate = rkclk_configure_ddr(priv->cru, priv->grf, rate);
 		break;
Signature · 1 line
2.8.0.rc3.226.g39d4020
#20 lore raw

PATCH 18/20 rockchip: clk: Support setting ACLK

Hi Simon,

Quoted 18 lines · Simon Glass

Add basic support for setting the ARM clock, since this allows us to run at maximum speed in U-Boot. Currently only a single speed is supported (1.8GHz).

---

  drivers/clk/rockchip/clk_rk3288.c | 7 +++++++
  1 file changed, 7 insertions(+)
drivers/clk/rockchip/clk_rk3288.c +0 -0
index ed97e87..d15504c 100644
@@ -691,6 +691,13 @@ static ulong rk3288_clk_set_rate(struct clk *clk, ulong rate)
 
  	gclk_rate = rkclk_pll_get_rate(priv->cru, CLK_GENERAL);
  	switch (clk->id) {

drivers/clk/rockchip/clk_rk3288.c static ulong rk3288_clk_set_rate(struct clk *clk, ulong rate) · line 703

Quoted 10 lines
drivers/clk/rockchip/clk_rk3288.c +7 -0
+	case PLL_APLL:
+		/* We only support a fixed rate here */
+		if (rate != 1800000000)
+			return -EINVAL;
+		rk3288_clk_configure_cpu(priv->cru, priv->grf);
+		new_rate = rate;
+		break;
  	case CLK_DDR:
  		new_rate = rkclk_configure_ddr(priv->cru, priv->grf, rate);
  		break;

Thanks,
- Kever

#21 lore raw

PATCH 19/20 rockchip: veyron: Adjust ARM clock after relocation

In reply to Simon Glass

Update board_init() to increase the ARM clock to the maximum speed on veyron boards. This makes quite a large difference in performance. With this change, speed goes from about 750 DMIPS to 2720 DMIPs.

---

 arch/arm/mach-rockchip/rk3288-board.c | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
arch/arm/mach-rockchip/rk3288-board.c +44 -0
index baf9522..bca6075 100644
@@ -16,6 +16,8 @@
 #include <asm/arch/boot_mode.h>
 #include <asm/gpio.h>
 #include <dm/pinctrl.h>
+#include <dt-bindings/clock/rk3288-cru.h>
+#include <power/regulator.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -56,6 +58,39 @@ int board_late_init(void)
 	return rk_board_late_init();
 }
 
+#ifndef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
+static int veyron_init(void)
+{
+	struct udevice *dev;
+	struct clk clk;
+	int ret;
+
+	ret = regulator_get_by_platname("vdd_arm", &dev);
+	if (ret)
+		return ret;
+
+	/* Slowly raise to max CPU voltage to prevent overshoot */
+	ret = regulator_set_value(dev, 1200000);
+	if (ret)
+		return ret;
+	udelay(175); /* Must wait for voltage to stabilize, 2mV/us */
+	ret = regulator_set_value(dev, 1400000);
+	if (ret)
+		return ret;
+	udelay(100); /* Must wait for voltage to stabilize, 2mV/us */
+
+	ret = rockchip_get_clk(&clk.dev);
+	if (ret)
+		return ret;
+	clk.id = PLL_APLL;
+	ret = clk_set_rate(&clk, 1800000000);
+	if (IS_ERR_VALUE(ret))
+		return ret;
+
+	return 0;
+}
+#endif
+
 int board_init(void)
 {
 #ifdef CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
@@ -87,6 +122,15 @@ err:
 
 	return -1;
 #else
+	int ret;
+
+	/* We do some SoC one time setting here */
+	if (!fdt_node_check_compatible(gd->fdt_blob, 0, "google,veyron")) {
+		ret = veyron_init();
+		if (ret)
+			return ret;
+	}
+
 	return 0;
 #endif
 }
Signature · 1 line
2.8.0.rc3.226.g39d4020
#22 lore raw

PATCH 20/20 rockchip: Add support for veyron-mickey (Chromebit)

In reply to Simon Glass

This adds support for the Asus Chromebit, and RK3288-based device designed to plug directly into an HDMI monitor. The device tree file comes from Linux v4.8.

---

 arch/arm/dts/Makefile                     |   1 +
 arch/arm/dts/rk3288-veyron-mickey.dts     | 265 ++++++++++++++++++++++++++++++
 arch/arm/mach-rockchip/rk3288-board-spl.c |   3 +-
 arch/arm/mach-rockchip/rk3288/Kconfig     |   9 +
 board/google/veyron/Kconfig               |  16 ++
 board/google/veyron/MAINTAINERS           |   7 +
 configs/chromebit_mickey_defconfig        |  84 ++++++++++
 7 files changed, 384 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/rk3288-veyron-mickey.dts
 create mode 100644 configs/chromebit_mickey_defconfig
arch/arm/dts/Makefile +1 -0
index af8b0de..5723c1b 100644
@@ -30,6 +30,7 @@ dtb-$(CONFIG_EXYNOS7420) += exynos7420-espresso7420.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rk3288-firefly.dtb \
 	rk3288-veyron-jerry.dtb \
+	rk3288-veyron-mickey.dtb \
 	rk3288-rock2-square.dtb \
 	rk3288-evb.dtb \
 	rk3288-fennec.dtb \
arch/arm/dts/rk3288-veyron-mickey.dts new file +265 -0

265 lines not on this page · raw message

arch/arm/mach-rockchip/rk3288-board-spl.c +2 -1
index 185b5fd..03ac0b4 100644
@@ -64,7 +64,8 @@ u32 spl_boot_device(void)
 	}
 
 fallback:
-#elif defined(CONFIG_TARGET_CHROMEBOOK_JERRY)
+#elif defined(CONFIG_TARGET_CHROMEBOOK_JERRY) || \
+		defined(CONFIG_TARGET_CHROMEBIT_MICKEY)
 	return BOOT_DEVICE_SPI;
 #endif
 	return BOOT_DEVICE_MMC1;
arch/arm/mach-rockchip/rk3288/Kconfig +9 -0
index 30c557b..204c1c7 100644
@@ -49,6 +49,15 @@ config TARGET_CHROMEBOOK_JERRY
 	  WiFi. It includes a Chrome OS EC (Cortex-M3) to provide access to
 	  the keyboard and battery functions.
 
+config TARGET_CHROMEBIT_MICKEY
+	bool "Google/Rockchip Veyron-Mickey Chromebit"
+	help
+	  Mickey is a small RK3288-based device with one USB 3.0 port, HDMI
+	  and WiFi. It has a separate power port and is designed to connect
+	  to the HDMI input of a monitor or TV. It has no internal battery.
+	  Typically a USB hub or wireless keyboard/touchpad is used to get
+	  keyboard and mouse access.
+
 config TARGET_ROCK2
 	bool "Radxa Rock 2"
 	help
board/google/veyron/Kconfig +16 -0
index b1f51ce..a99190f 100644
@@ -13,3 +13,19 @@ config BOARD_SPECIFIC_OPTIONS # dummy
 	def_bool y
 
 endif
+
+if TARGET_CHROMEBIT_MICKEY
+
+config SYS_BOARD
+	default "veyron"
+
+config SYS_VENDOR
+	default "google"
+
+config SYS_CONFIG_NAME
+	default "veyron"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+	def_bool y
+
+endif
board/google/veyron/MAINTAINERS +7 -0
index d641eed..e44e1a9 100644
@@ -4,3 +4,10 @@ S:	Maintained
 F:	board/google/veyron/
 F:	include/configs/veyron.h
 F:	configs/chromebook_jerry_defconfig
+
+CHROMEBIT MICKEY BOARD
+M:	Simon Glass <[email protected]>
+S:	Maintained
+F:	board/google/veyron/
+F:	include/configs/veyron.h
+F:	configs/chromebit_mickey_defconfig
configs/chromebit_mickey_defconfig new file +84 -0

84 lines not on this page · raw message

Signature · 1 line
2.8.0.rc3.226.g39d4020