1/* 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}; 78