1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <device/pci.h>
4 #include <device/pci_ids.h>
5 #include <console/console.h>
6 #include <intelblocks/cfg.h>
7 #include <intelblocks/mmc.h>
9 static int mmc_write_dll_reg(void *bar
, uint32_t reg
, uint32_t val
)
13 write32(bar
+ reg
, val
);
19 int set_mmc_dll(void *bar
)
21 const struct soc_intel_common_config
*common_config
;
22 const struct mmc_dll_params
*dll_params
;
25 common_config
= chip_get_common_soc_structure();
26 dll_params
= &common_config
->emmc_dll
;
28 override
|= mmc_write_dll_reg(bar
, EMMC_TX_CMD_CNTL_OFFSET
,
29 dll_params
->emmc_tx_cmd_cntl
);
31 override
|= mmc_write_dll_reg(bar
, EMMC_TX_DATA_CNTL1_OFFSET
,
32 dll_params
->emmc_tx_data_cntl1
);
34 override
|= mmc_write_dll_reg(bar
, EMMC_TX_DATA_CNTL2_OFFSET
,
35 dll_params
->emmc_tx_data_cntl2
);
37 override
|= mmc_write_dll_reg(bar
, EMMC_RX_CMD_DATA_CNTL1_OFFSET
,
38 dll_params
->emmc_rx_cmd_data_cntl1
);
40 override
|= mmc_write_dll_reg(bar
, EMMC_RX_STROBE_CNTL_OFFSET
,
41 dll_params
->emmc_rx_strobe_cntl
);
43 override
|= mmc_write_dll_reg(bar
, EMMC_RX_CMD_DATA_CNTL2_OFFSET
,
44 dll_params
->emmc_rx_cmd_data_cntl2
);
47 printk(BIOS_INFO
, "Skip Emmc dll value programming\n");
54 static void mmc_soc_init(struct device
*dev
)
56 const struct resource
*res
;
58 if (!CONFIG(SOC_INTEL_COMMON_MMC_OVERRIDE
))
61 res
= find_resource(dev
, PCI_BASE_ADDRESS_0
);
62 set_mmc_dll((void *)(uintptr_t)(res
->base
));
65 static struct device_operations dev_ops
= {
66 .read_resources
= pci_dev_read_resources
,
67 .set_resources
= pci_dev_set_resources
,
68 .enable_resources
= pci_dev_enable_resources
,
70 .ops_pci
= &pci_dev_ops_pci
,
73 static const unsigned short pci_device_ids
[] = {
74 PCI_DID_INTEL_CMP_EMMC
,
75 PCI_DID_INTEL_JSP_EMMC
,
76 PCI_DID_INTEL_ADP_EMMC
,
80 static const struct pci_driver pch_sd __pci_driver
= {
82 .vendor
= PCI_VID_INTEL
,
83 .devices
= pci_device_ids
,