blob: b945693f1cf9e1d2fc3450e071aec94981f65237 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0
Simon Glassac0cce52016-03-11 22:07:23 -07002/*
3 * Copyright (c) 2016 Google, Inc
4 *
5 * From coreboot broadwell support
Simon Glassac0cce52016-03-11 22:07:23 -07006 */
7
Simon Glassac0cce52016-03-11 22:07:23 -07008#include <dm.h>
Simon Glass0f2af882020-05-10 11:40:05 -06009#include <log.h>
Simon Glassac0cce52016-03-11 22:07:23 -070010#include <pch.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060011#include <asm/global_data.h>
Simon Glassac0cce52016-03-11 22:07:23 -070012#include <asm/intel_regs.h>
13#include <asm/io.h>
14#include <asm/lpc_common.h>
15#include <asm/arch/pch.h>
16#include <asm/arch/spi.h>
17
18static void set_spi_speed(void)
19{
20 u32 fdod;
21 u8 ssfc;
22
23 /* Observe SPI Descriptor Component Section 0 */
24 writel(0x1000, SPI_REG(SPIBAR_FDOC));
25
26 /* Extract the Write/Erase SPI Frequency from descriptor */
27 fdod = readl(SPI_REG(SPIBAR_FDOD));
28 fdod >>= 24;
29 fdod &= 7;
30
31 /* Set Software Sequence frequency to match */
32 ssfc = readb(SPI_REG(SPIBAR_SSFC + 2));
33 ssfc &= ~7;
34 ssfc |= fdod;
35 writeb(ssfc, SPI_REG(SPIBAR_SSFC + 2));
36}
37
38static int broadwell_lpc_early_init(struct udevice *dev)
39{
40 set_spi_speed();
41
42 return 0;
43}
44
45static int lpc_init_extra(struct udevice *dev)
46{
47 return 0;
48}
49
50static int broadwell_lpc_probe(struct udevice *dev)
51{
52 int ret;
53
54 if (!(gd->flags & GD_FLG_RELOC)) {
55 ret = lpc_common_early_init(dev);
56 if (ret) {
57 debug("%s: lpc_early_init() failed\n", __func__);
58 return ret;
59 }
60
61 return broadwell_lpc_early_init(dev);
62 }
63
64 return lpc_init_extra(dev);
65}
66
67static const struct udevice_id broadwell_lpc_ids[] = {
68 { .compatible = "intel,broadwell-lpc" },
69 { }
70};
71
72U_BOOT_DRIVER(broadwell_lpc_drv) = {
73 .name = "lpc",
74 .id = UCLASS_LPC,
75 .of_match = broadwell_lpc_ids,
76 .probe = broadwell_lpc_probe,
77};