blob: ee3ac1820de4323b8643fe63f8b3b46fe17e5dc4 [file] [log] [blame]
Simon Glassac0cce52016-03-11 22:07:23 -07001/*
2 * Copyright (c) 2016 Google, Inc
3 *
4 * From coreboot broadwell support
5 *
6 * SPDX-License-Identifier: GPL-2.0
7 */
8
9#include <common.h>
10#include <dm.h>
11#include <pch.h>
12#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};