All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] ARM: mx6: Add support for Kosagi Novena
Date: Sat, 27 Sep 2014 22:19:44 +0200	[thread overview]
Message-ID: <201409272219.44607.marex@denx.de> (raw)
In-Reply-To: <5422F7E2.8060108@kosagi.com>

On Wednesday, September 24, 2014 at 06:57:06 PM, Sean Cross wrote:

[...]
> 
> > +
> > +int drv_keyboard_init(void)
> > +{
> > +	int error;
> > +	struct stdio_dev dev = {
> > +		.name	= "button",
> > +		.flags	= DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM,
> > +		.start	= novena_gpio_button_init,
> > +		.getc	= novena_gpio_button_getc,
> > +		.tstc	= novena_gpio_button_tstc,
> > +	};
> > +
> > +	error = input_init(&button_input, 0);
> > +	if (error) {
> > +		debug("%s: Cannot set up input\n", __func__);
> > +		return -1;
> > +	}
> > +	button_input.read_keys = novena_gpio_button_read_keys;
> > +
> > +	/* Register the device. init_tegra_keyboard() will be called soon */
> 
> This may have been answered already, but will the function named
> init_tegra_keyboard() be called?  Or is there some more generic name?

This was addressed already, yes.

> > +	error = input_stdio_register(&dev);
> > +	if (error)
> > +		return error;
> > +
> > +	return 0;
> > +}
> > +#endif
> > +
> 
> [...]
> 
> > +int board_early_init_f(void)
> > +{
> > +#if defined(CONFIG_VIDEO_IPUV3)
> > +	setup_display();
> > +#endif
> 
> If board_early_init_f() gets called early, then this is where you should
> set DISP0_DAT13 (GPIO5 IO13) to low, in order to ensure the FPGA is in
> reset, so it isn't pulling the DDR3 I2C lines low.

Actually, this can be done in the SPL.

> This would also be a good time to bring the sound chip out of reset, by
> driving GPIO5 IO17 high,  When the sound chip is in reset, the EEPROM
> cannot be read.

This is already done in the SPL.

[...]

> > +/* setup board specific PMIC */
> > +int power_init_board(void)
> > +{
> > +	struct pmic *p;
> > +	u32 reg;
> > +	int ret;
> > +
> > +	power_pfuze100_init(1);
> > +	p = pmic_get("PFUZE100_PMIC");
> > +	if (!p)
> > +		return -EINVAL;
> > +
> > +	ret = pmic_probe(p);
> > +	if (ret)
> > +		return ret;
> > +
> > +	pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
> > +	printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
> > +
> > +	/* Set VGEN1 to 1.5V and enable */
> 
> VGEN1 is unused in this system.  VGEN5 is, however, hooked up to the
> power LED.  It defaults to ON, which allows for software to turn the
> power LED off once the system is booted.  You can leave everything alone
> except for SWBST, which is required for USB.

Removed the VGEN1 enabling.

[...]

> > +#define NOVENA_AUDIO_PWRON		IMX_GPIO_NR(5, 17)
> > +#define NOVENA_HDMI_GHOST_HPD		IMX_GPIO_NR(5, 4)
> > +#define NOVENA_PCIE_RESET_GPIO		IMX_GPIO_NR(3, 29)
> > +#define NOVENA_PCIE_POWER_ON_GPIO	IMX_GPIO_NR(7, 12)
> > +#define NOVENA_PCIE_WAKE_UP_GPIO	IMX_GPIO_NR(3, 22)
> > +#define NOVENA_PCIE_DISABLE_GPIO	IMX_GPIO_NR(2, 16)
> 
> Add NOVENA_FPGA_RESET_N_GPIO IMX_GPIO_NR(5, 7).  If the FPGA has a
> program loaded that doesn't let the I2C pins float, then the DDR3 SPD
> will be unable to be read.

Added and I am now setting this GPIO to 0 so the FPGA is in reset throughout the 
SPL operation. It can be brought out of reset in U-Boot itself and only when 
it's actually used, right ?

> > +
> > +/*
> > + * Audio
> > + */
> > +static iomux_v3_cfg_t audio_pads[] = {
> > +	/* AUD_PWRON */
> > +	MX6_PAD_DISP0_DAT23__GPIO5_IO17 | MUX_PAD_CTRL(NO_PAD_CTRL),
> > +};
> > +
> > +static void novena_spl_setup_iomux_audio(void)
> > +{
> > +	imx_iomux_v3_setup_multiple_pads(audio_pads, ARRAY_SIZE(audio_pads));
> > +	gpio_direction_output(NOVENA_AUDIO_PWRON, 1);
> > +}
> > +
> > +/*
> > + * ENET
> > + */
> > +static iomux_v3_cfg_t enet_pads1[] = {
> > +	MX6_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TXC__RGMII_TXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TD0__RGMII_TD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TD1__RGMII_TD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TD2__RGMII_TD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TD3__RGMII_TD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	/* pin 35 - 1 (PHY_AD2) on reset */
> > +	MX6_PAD_RGMII_RXC__GPIO6_IO30		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 32 - 1 - (MODE0) all */
> > +	MX6_PAD_RGMII_RD0__GPIO6_IO25		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 31 - 1 - (MODE1) all */
> > +	MX6_PAD_RGMII_RD1__GPIO6_IO27		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 28 - 1 - (MODE2) all */
> > +	MX6_PAD_RGMII_RD2__GPIO6_IO28		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 27 - 1 - (MODE3) all */
> > +	MX6_PAD_RGMII_RD3__GPIO6_IO29		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
> > +	MX6_PAD_RGMII_RX_CTL__GPIO6_IO24	| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +	/* pin 42 PHY nRST */
> > +	MX6_PAD_EIM_D23__GPIO3_IO23		| MUX_PAD_CTRL(NO_PAD_CTRL),
> > +};
> > +
> > +static iomux_v3_cfg_t enet_pads2[] = {
> > +	MX6_PAD_RGMII_RXC__RGMII_RXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_RD0__RGMII_RD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_RD1__RGMII_RD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_RD2__RGMII_RD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_RD3__RGMII_RD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +	MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
> > +};
> > +
> > +static void novena_spl_setup_iomux_enet(void)
> > +{
> > +	imx_iomux_v3_setup_multiple_pads(enet_pads1, ARRAY_SIZE(enet_pads1));
> > +	imx_iomux_v3_setup_multiple_pads(enet_pads2, ARRAY_SIZE(enet_pads2));
> > +
> > +	gpio_direction_output(IMX_GPIO_NR(3, 23), 0);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 30), 1);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
> > +	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
> > +}
> > +
> > +/*
> > + * GPIO Button
> > + */
> > +static iomux_v3_cfg_t button_pads[] = {
> > +	/* Debug */
> > +	MX6_PAD_KEY_COL4__GPIO4_IO14 | MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> > +};
> > +
> > +static void novena_spl_setup_iomux_buttons(void)
> > +{
> > +	imx_iomux_v3_setup_multiple_pads(button_pads, ARRAY_SIZE(button_pads));
> > +}
> > +
> > +/*
> > + * I2C
> > + */
> > +/* I2C1, RAM */
> 
> This bus also contains an unused touchscreen controller, as well as an
> accelerometer, the battery board, and an RTC in the final version.

All I2C comments should be fixed.

[...]

> > +static void novena_spl_setup_iomux_spi(void)
> > +{
> > +	imx_iomux_v3_setup_multiple_pads(ecspi1_pads, ARRAY_SIZE(ecspi1_pads));
> > +	gpio_direction_output(CONFIG_SF_DEFAULT_CS, 1);
> > +}
> > +#else
> > +static void novena_spl_setup_iomux_spi(void) {}
> > +#endif
> 
> It may be interesting to mux ECSPI3 here, in order to be able to blast a
> configuration file at the FPGA at boot time.  But correct, ECSPI1 is not
> used in Novena as a SPI bus.

Done.

> > +
> > +/*
> > + * UART
> > + */
> > +static iomux_v3_cfg_t const uart1_pads[] = {
> > +	MX6_PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> > +	MX6_PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> > +};
> > +
> > +static iomux_v3_cfg_t const uart2_pads[] = {
> > +	MX6_PAD_EIM_D26__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> > +	MX6_PAD_EIM_D27__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
> > +};
> > +
> > +static void novena_spl_setup_iomux_uart(void)
> > +{
> > +	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
> > +	imx_iomux_v3_setup_multiple_pads(uart2_pads, ARRAY_SIZE(uart2_pads));
> > +}
> > +
> 
> Novena uses uart2, uart3, and uart4.  uart2_pads is correct. uart3_pads
> should map EIM_D24 to UART3_TX_DATA and EIM_D25 to UART3_RX_DATA.
> KEY_COL0 maps to UART4_TX_DATA and KEY_ROW0 maps to UART4_RX_DATA.
> Optionally, CSI0_DAT16 maps to UART4_RTS and CSI0_DAT17 maps to UART4_CTS.

Fixed.

[...]
> > +	/* Setup IOMUX and configure basics. */
> > +	novena_spl_setup_iomux_audio();
> > +	novena_spl_setup_iomux_buttons();
> > +	novena_spl_setup_iomux_enet();
> > +	novena_spl_setup_iomux_i2c();
> > +	novena_spl_setup_iomux_pcie();
> > +	novena_spl_setup_iomux_sdhc();
> > +	novena_spl_setup_iomux_spi();
> > +	novena_spl_setup_iomux_uart();
> > +	novena_spl_setup_iomux_usb();
> > +	novena_spl_setup_iomux_video();
> 
> Should also set up the FPGA here, driving its reset pin low.

Done.

> > +
> > +	/* UART clocks enabled and gd valid - init serial console */
> > +	preloader_console_init();
> > +
> > +	/* Start the DDR DRAM */
> > +	mx6dq_dram_iocfg(64, &novena_ddr_ioregs, &novena_grp_ioregs);
> > +	mx6_dram_cfg(&novena_ddr_info, &novena_mmdc_calib, &elpida_4gib_1600);
> > +
> > +	/* Clear the BSS. */
> > +	memset(__bss_start, 0, __bss_end - __bss_start);
> > +
> > +	/* load/boot image from boot device */
> > +	board_init_r(NULL, 0);
> > +}
> > +
> > +void reset_cpu(ulong addr)
> > +{
> > +}
> 
> [...]
> 
> We just received final boards on Monday.  I will try this out and report
> back.

You should try one of the never patches .

  reply	other threads:[~2014-09-27 20:19 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-29  9:30 [U-Boot] [PATCH] ARM: mx6: Add support for Kosagi Novena Marek Vasut
2014-08-29 15:58 ` Stephen Warren
2014-08-29 16:24   ` Marek Vasut
2014-08-29 16:46 ` Nikolay Dimitrov
2014-08-29 16:50   ` Marek Vasut
2014-08-29 17:08 ` Fabio Estevam
2014-08-30 12:40   ` Marek Vasut
2014-08-30 13:55     ` Fabio Estevam
2014-08-30 14:20       ` Marek Vasut
2014-09-16 11:00         ` Stefano Babic
2014-09-21 13:45           ` Marek Vasut
2014-08-30 14:12 ` Fabio Estevam
2014-08-30 14:22   ` Marek Vasut
2014-08-30 15:20     ` Fabio Estevam
2014-08-30 16:34       ` Marek Vasut
2014-08-30 16:50         ` Fabio Estevam
2014-09-24 16:57 ` Sean Cross
2014-09-27 20:19   ` Marek Vasut [this message]
2014-10-02  6:16     ` Sean Cross
2014-10-10  0:02       ` Marek Vasut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201409272219.44607.marex@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.