rockchip: Add support for Asus Chromebit
Subsystems (7)
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
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
@@ -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
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.
Signed-off-by Simon Glass <[email protected]>---
drivers/video/rockchip/rk_hdmi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)drivers/video/rockchip/rk_hdmi.c +0
-0
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
-0ret =hdmi_wait_for_hpd (priv->regs);if (ret <0 ) {
PATCH 2/20 rockchip: video: Correct VOP clock selection
In reply to Simon GlassThis code incorrectly uses the oscillator. It should use the clock selected in the device tree.
---
drivers/video/rockchip/rk_vop.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/video/rockchip/rk_vop.c +1 -6
@@ -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
PATCH 3/20 rockchip: Allow jerry to use of-platdata
In reply to Simon GlassThis 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
@@ -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
PATCH 4/20 dm: core: Handle global_data moving in SPL
In reply to Simon GlassWhen 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
@@ -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
@@ -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
@@ -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
PATCH 5/20 stdio: Correct code style nits
In reply to Simon GlassFix 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
@@ -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
PATCH 6/20 stdio: Correct numbering logic in stdio_probe_device()
In reply to Simon GlassThe 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
@@ -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
PATCH 7/20 spi: Add of-platdata support to SPI and SPI flash
In reply to Simon GlassSome 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
@@ -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
@@ -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
PATCH 8/20 rockchip: spi: Add support for of-platdata
In reply to Simon GlassAllow 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
@@ -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 0struct 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
PATCH 9/20 rockchip: spi: Honour the deactivation delay
In reply to Simon GlassThis 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
@@ -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, ®s->ser);if (plat->activate_delay_us)
Signature · 1 line
2.8.0.rc3.226.g39d4020
PATCH 10/20 spi: Add error checking for invalid bus widths
In reply to Simon GlassAt 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
@@ -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
PATCH 11/20 spi: Add a debug() on bind failure
In reply to Simon GlassThis 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
@@ -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
PATCH 12/20 video: Use cache-alignment in video_sync()
In reply to Simon GlassSometimes 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
@@ -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
PATCH 13/20 video: Track whether a display is in use
In reply to Simon GlassMark 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
@@ -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
@@ -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
PATCH 14/20 rockchip: video: Check for device in use
In reply to Simon GlassCheck 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
@@ -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
@@ -13,6 +13,8 @@ / { aliases { i2c20 = &i2c_tunnel; + video0 = &vopl; + video1 = &vopb; }; gpio_keys: gpio-keys {
drivers/video/rockchip/rk_vop.c +9 -0
@@ -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
PATCH 15/20 rockchip: Move jerry to use of-platdata
In reply to Simon GlassAdjust 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
@@ -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
PATCH 16/20 rockchip: Rename jerry files to veyron
In reply to Simon GlassAt 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
@@ -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
arch/arm/mach-rockchip/rk3288/Kconfig +1 -1
@@ -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
@@ -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
@@ -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
@@ -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
configs/chromebook_jerry_defconfig +1 -1
@@ -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
Signature · 1 line
2.8.0.rc3.226.g39d4020
PATCH 17/20 rockchip: Move jerry SDRAM settings into its own .dts file
In reply to Simon GlassThe 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
@@ -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
@@ -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
PATCH 18/20 rockchip: clk: Support setting ACLK
In reply to Simon GlassAdd 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
@@ -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
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).
Signed-off-by Simon Glass <[email protected]>---
drivers/clk/rockchip/clk_rk3288.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/clk/rockchip/clk_rk3288.c +0
-0@@ -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
PATCH 19/20 rockchip: veyron: Adjust ARM clock after relocation
In reply to Simon GlassUpdate 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
@@ -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
PATCH 20/20 rockchip: Add support for veyron-mickey (Chromebit)
In reply to Simon GlassThis 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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