diff options
| -rw-r--r-- | drivers/acpi/acpi_apd.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c index d553b0087947..2664452fa112 100644 --- a/drivers/acpi/acpi_apd.c +++ b/drivers/acpi/acpi_apd.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/clk-provider.h> | 13 | #include <linux/clk-provider.h> |
| 14 | #include <linux/platform_data/clk-st.h> | ||
| 14 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 15 | #include <linux/pm_domain.h> | 16 | #include <linux/pm_domain.h> |
| 16 | #include <linux/clkdev.h> | 17 | #include <linux/clkdev.h> |
| @@ -72,6 +73,47 @@ static int acpi_apd_setup(struct apd_private_data *pdata) | |||
| 72 | } | 73 | } |
| 73 | 74 | ||
| 74 | #ifdef CONFIG_X86_AMD_PLATFORM_DEVICE | 75 | #ifdef CONFIG_X86_AMD_PLATFORM_DEVICE |
| 76 | |||
| 77 | static int misc_check_res(struct acpi_resource *ares, void *data) | ||
| 78 | { | ||
| 79 | struct resource res; | ||
| 80 | |||
| 81 | return !acpi_dev_resource_memory(ares, &res); | ||
| 82 | } | ||
| 83 | |||
| 84 | static int st_misc_setup(struct apd_private_data *pdata) | ||
| 85 | { | ||
| 86 | struct acpi_device *adev = pdata->adev; | ||
| 87 | struct platform_device *clkdev; | ||
| 88 | struct st_clk_data *clk_data; | ||
| 89 | struct resource_entry *rentry; | ||
| 90 | struct list_head resource_list; | ||
| 91 | int ret; | ||
| 92 | |||
| 93 | clk_data = devm_kzalloc(&adev->dev, sizeof(*clk_data), GFP_KERNEL); | ||
| 94 | if (!clk_data) | ||
| 95 | return -ENOMEM; | ||
| 96 | |||
| 97 | INIT_LIST_HEAD(&resource_list); | ||
| 98 | ret = acpi_dev_get_resources(adev, &resource_list, misc_check_res, | ||
| 99 | NULL); | ||
| 100 | if (ret < 0) | ||
| 101 | return -ENOENT; | ||
| 102 | |||
| 103 | list_for_each_entry(rentry, &resource_list, node) { | ||
| 104 | clk_data->base = devm_ioremap(&adev->dev, rentry->res->start, | ||
| 105 | resource_size(rentry->res)); | ||
| 106 | break; | ||
| 107 | } | ||
| 108 | |||
| 109 | acpi_dev_free_resource_list(&resource_list); | ||
| 110 | |||
| 111 | clkdev = platform_device_register_data(&adev->dev, "clk-st", | ||
| 112 | PLATFORM_DEVID_NONE, clk_data, | ||
| 113 | sizeof(*clk_data)); | ||
| 114 | return PTR_ERR_OR_ZERO(clkdev); | ||
| 115 | } | ||
| 116 | |||
| 75 | static const struct apd_device_desc cz_i2c_desc = { | 117 | static const struct apd_device_desc cz_i2c_desc = { |
| 76 | .setup = acpi_apd_setup, | 118 | .setup = acpi_apd_setup, |
| 77 | .fixed_clk_rate = 133000000, | 119 | .fixed_clk_rate = 133000000, |
| @@ -94,6 +136,10 @@ static const struct apd_device_desc cz_uart_desc = { | |||
| 94 | .fixed_clk_rate = 48000000, | 136 | .fixed_clk_rate = 48000000, |
| 95 | .properties = uart_properties, | 137 | .properties = uart_properties, |
| 96 | }; | 138 | }; |
| 139 | |||
| 140 | static const struct apd_device_desc st_misc_desc = { | ||
| 141 | .setup = st_misc_setup, | ||
| 142 | }; | ||
| 97 | #endif | 143 | #endif |
| 98 | 144 | ||
| 99 | #ifdef CONFIG_ARM64 | 145 | #ifdef CONFIG_ARM64 |
| @@ -179,6 +225,7 @@ static const struct acpi_device_id acpi_apd_device_ids[] = { | |||
| 179 | { "AMD0020", APD_ADDR(cz_uart_desc) }, | 225 | { "AMD0020", APD_ADDR(cz_uart_desc) }, |
| 180 | { "AMDI0020", APD_ADDR(cz_uart_desc) }, | 226 | { "AMDI0020", APD_ADDR(cz_uart_desc) }, |
| 181 | { "AMD0030", }, | 227 | { "AMD0030", }, |
| 228 | { "AMD0040", APD_ADDR(st_misc_desc)}, | ||
| 182 | #endif | 229 | #endif |
| 183 | #ifdef CONFIG_ARM64 | 230 | #ifdef CONFIG_ARM64 |
| 184 | { "APMC0D0F", APD_ADDR(xgene_i2c_desc) }, | 231 | { "APMC0D0F", APD_ADDR(xgene_i2c_desc) }, |
