diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2014-09-02 03:55:07 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-09-02 19:12:41 -0400 |
commit | ff8c1af5e7ebfdf2da5d2063ee34e16a8d05643c (patch) | |
tree | 329bb8cee0fcabe919fcf5af864d01376534bdce /drivers/acpi | |
parent | 69e273c0b0a3c337a521d083374c918dc52c666f (diff) |
ACPI / LPSS: introduce flags
Replace the booleans with a single flags member variable.
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/acpi_lpss.c | 79 |
1 files changed, 29 insertions, 50 deletions
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 9dfec48dd4e5..4723a0e8335a 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
@@ -54,6 +54,13 @@ ACPI_MODULE_NAME("acpi_lpss"); | |||
54 | 54 | ||
55 | #define LPSS_PRV_REG_COUNT 9 | 55 | #define LPSS_PRV_REG_COUNT 9 |
56 | 56 | ||
57 | /* LPSS Flags */ | ||
58 | #define LPSS_CLK BIT(0) | ||
59 | #define LPSS_CLK_GATE BIT(1) | ||
60 | #define LPSS_CLK_DIVIDER BIT(2) | ||
61 | #define LPSS_LTR BIT(3) | ||
62 | #define LPSS_SAVE_CTX BIT(4) | ||
63 | |||
57 | struct lpss_shared_clock { | 64 | struct lpss_shared_clock { |
58 | const char *name; | 65 | const char *name; |
59 | unsigned long rate; | 66 | unsigned long rate; |
@@ -63,21 +70,17 @@ struct lpss_shared_clock { | |||
63 | struct lpss_private_data; | 70 | struct lpss_private_data; |
64 | 71 | ||
65 | struct lpss_device_desc { | 72 | struct lpss_device_desc { |
66 | bool clk_required; | ||
67 | const char *clkdev_name; | 73 | const char *clkdev_name; |
68 | bool ltr_required; | 74 | unsigned int flags; |
69 | unsigned int prv_offset; | 75 | unsigned int prv_offset; |
70 | size_t prv_size_override; | 76 | size_t prv_size_override; |
71 | bool clk_divider; | ||
72 | bool clk_gate; | ||
73 | bool save_ctx; | ||
74 | struct lpss_shared_clock *shared_clock; | 77 | struct lpss_shared_clock *shared_clock; |
75 | void (*setup)(struct lpss_private_data *pdata); | 78 | void (*setup)(struct lpss_private_data *pdata); |
76 | }; | 79 | }; |
77 | 80 | ||
78 | static struct lpss_device_desc lpss_dma_desc = { | 81 | static struct lpss_device_desc lpss_dma_desc = { |
79 | .clk_required = true, | ||
80 | .clkdev_name = "hclk", | 82 | .clkdev_name = "hclk", |
83 | .flags = LPSS_CLK, | ||
81 | }; | 84 | }; |
82 | 85 | ||
83 | struct lpss_private_data { | 86 | struct lpss_private_data { |
@@ -113,42 +116,26 @@ static void lpss_i2c_setup(struct lpss_private_data *pdata) | |||
113 | writel(val, pdata->mmio_base + offset); | 116 | writel(val, pdata->mmio_base + offset); |
114 | } | 117 | } |
115 | 118 | ||
116 | static struct lpss_device_desc wpt_dev_desc = { | ||
117 | .clk_required = true, | ||
118 | .prv_offset = 0x800, | ||
119 | .ltr_required = true, | ||
120 | .clk_divider = true, | ||
121 | .clk_gate = true, | ||
122 | }; | ||
123 | |||
124 | static struct lpss_device_desc lpt_dev_desc = { | 119 | static struct lpss_device_desc lpt_dev_desc = { |
125 | .clk_required = true, | 120 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, |
126 | .prv_offset = 0x800, | 121 | .prv_offset = 0x800, |
127 | .ltr_required = true, | ||
128 | .clk_divider = true, | ||
129 | .clk_gate = true, | ||
130 | }; | 122 | }; |
131 | 123 | ||
132 | static struct lpss_device_desc lpt_i2c_dev_desc = { | 124 | static struct lpss_device_desc lpt_i2c_dev_desc = { |
133 | .clk_required = true, | 125 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR, |
134 | .prv_offset = 0x800, | 126 | .prv_offset = 0x800, |
135 | .ltr_required = true, | ||
136 | .clk_gate = true, | ||
137 | }; | 127 | }; |
138 | 128 | ||
139 | static struct lpss_device_desc lpt_uart_dev_desc = { | 129 | static struct lpss_device_desc lpt_uart_dev_desc = { |
140 | .clk_required = true, | 130 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, |
141 | .prv_offset = 0x800, | 131 | .prv_offset = 0x800, |
142 | .ltr_required = true, | ||
143 | .clk_divider = true, | ||
144 | .clk_gate = true, | ||
145 | .setup = lpss_uart_setup, | 132 | .setup = lpss_uart_setup, |
146 | }; | 133 | }; |
147 | 134 | ||
148 | static struct lpss_device_desc lpt_sdio_dev_desc = { | 135 | static struct lpss_device_desc lpt_sdio_dev_desc = { |
136 | .flags = LPSS_LTR, | ||
149 | .prv_offset = 0x1000, | 137 | .prv_offset = 0x1000, |
150 | .prv_size_override = 0x1018, | 138 | .prv_size_override = 0x1018, |
151 | .ltr_required = true, | ||
152 | }; | 139 | }; |
153 | 140 | ||
154 | static struct lpss_shared_clock pwm_clock = { | 141 | static struct lpss_shared_clock pwm_clock = { |
@@ -157,30 +144,23 @@ static struct lpss_shared_clock pwm_clock = { | |||
157 | }; | 144 | }; |
158 | 145 | ||
159 | static struct lpss_device_desc byt_pwm_dev_desc = { | 146 | static struct lpss_device_desc byt_pwm_dev_desc = { |
160 | .clk_required = true, | 147 | .flags = LPSS_CLK | LPSS_SAVE_CTX, |
161 | .save_ctx = true, | ||
162 | .shared_clock = &pwm_clock, | 148 | .shared_clock = &pwm_clock, |
163 | }; | 149 | }; |
164 | 150 | ||
165 | static struct lpss_device_desc byt_uart_dev_desc = { | 151 | static struct lpss_device_desc byt_uart_dev_desc = { |
166 | .clk_required = true, | 152 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
167 | .prv_offset = 0x800, | 153 | .prv_offset = 0x800, |
168 | .clk_divider = true, | ||
169 | .clk_gate = true, | ||
170 | .save_ctx = true, | ||
171 | .setup = lpss_uart_setup, | 154 | .setup = lpss_uart_setup, |
172 | }; | 155 | }; |
173 | 156 | ||
174 | static struct lpss_device_desc byt_spi_dev_desc = { | 157 | static struct lpss_device_desc byt_spi_dev_desc = { |
175 | .clk_required = true, | 158 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
176 | .prv_offset = 0x400, | 159 | .prv_offset = 0x400, |
177 | .clk_divider = true, | ||
178 | .clk_gate = true, | ||
179 | .save_ctx = true, | ||
180 | }; | 160 | }; |
181 | 161 | ||
182 | static struct lpss_device_desc byt_sdio_dev_desc = { | 162 | static struct lpss_device_desc byt_sdio_dev_desc = { |
183 | .clk_required = true, | 163 | .flags = LPSS_CLK, |
184 | }; | 164 | }; |
185 | 165 | ||
186 | static struct lpss_shared_clock i2c_clock = { | 166 | static struct lpss_shared_clock i2c_clock = { |
@@ -189,9 +169,8 @@ static struct lpss_shared_clock i2c_clock = { | |||
189 | }; | 169 | }; |
190 | 170 | ||
191 | static struct lpss_device_desc byt_i2c_dev_desc = { | 171 | static struct lpss_device_desc byt_i2c_dev_desc = { |
192 | .clk_required = true, | 172 | .flags = LPSS_CLK | LPSS_SAVE_CTX, |
193 | .prv_offset = 0x800, | 173 | .prv_offset = 0x800, |
194 | .save_ctx = true, | ||
195 | .shared_clock = &i2c_clock, | 174 | .shared_clock = &i2c_clock, |
196 | .setup = lpss_i2c_setup, | 175 | .setup = lpss_i2c_setup, |
197 | }; | 176 | }; |
@@ -202,8 +181,7 @@ static struct lpss_shared_clock bsw_pwm_clock = { | |||
202 | }; | 181 | }; |
203 | 182 | ||
204 | static struct lpss_device_desc bsw_pwm_dev_desc = { | 183 | static struct lpss_device_desc bsw_pwm_dev_desc = { |
205 | .clk_required = true, | 184 | .flags = LPSS_CLK | LPSS_SAVE_CTX, |
206 | .save_ctx = true, | ||
207 | .shared_clock = &bsw_pwm_clock, | 185 | .shared_clock = &bsw_pwm_clock, |
208 | }; | 186 | }; |
209 | 187 | ||
@@ -251,7 +229,8 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = { | |||
251 | { "INT3436", LPSS_ADDR(lpt_sdio_dev_desc) }, | 229 | { "INT3436", LPSS_ADDR(lpt_sdio_dev_desc) }, |
252 | { "INT3437", }, | 230 | { "INT3437", }, |
253 | 231 | ||
254 | { "INT3438", LPSS_ADDR(wpt_dev_desc) }, | 232 | /* Wildcat Point LPSS devices */ |
233 | { "INT3438", LPSS_ADDR(lpt_dev_desc) }, | ||
255 | 234 | ||
256 | { } | 235 | { } |
257 | }; | 236 | }; |
@@ -314,13 +293,13 @@ static int register_device_clock(struct acpi_device *adev, | |||
314 | parent = shared_clock->name; | 293 | parent = shared_clock->name; |
315 | } | 294 | } |
316 | 295 | ||
317 | if (dev_desc->clk_gate) { | 296 | if (dev_desc->flags & LPSS_CLK_GATE) { |
318 | clk = clk_register_gate(NULL, devname, parent, 0, | 297 | clk = clk_register_gate(NULL, devname, parent, 0, |
319 | prv_base, 0, 0, NULL); | 298 | prv_base, 0, 0, NULL); |
320 | parent = devname; | 299 | parent = devname; |
321 | } | 300 | } |
322 | 301 | ||
323 | if (dev_desc->clk_divider) { | 302 | if (dev_desc->flags & LPSS_CLK_DIVIDER) { |
324 | /* Prevent division by zero */ | 303 | /* Prevent division by zero */ |
325 | if (!readl(prv_base)) | 304 | if (!readl(prv_base)) |
326 | writel(LPSS_CLK_DIVIDER_DEF_MASK, prv_base); | 305 | writel(LPSS_CLK_DIVIDER_DEF_MASK, prv_base); |
@@ -392,7 +371,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
392 | 371 | ||
393 | pdata->dev_desc = dev_desc; | 372 | pdata->dev_desc = dev_desc; |
394 | 373 | ||
395 | if (dev_desc->clk_required) { | 374 | if (dev_desc->flags & LPSS_CLK) { |
396 | ret = register_device_clock(adev, pdata); | 375 | ret = register_device_clock(adev, pdata); |
397 | if (ret) { | 376 | if (ret) { |
398 | /* Skip the device, but continue the namespace scan. */ | 377 | /* Skip the device, but continue the namespace scan. */ |
@@ -693,19 +672,19 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb, | |||
693 | 672 | ||
694 | switch (action) { | 673 | switch (action) { |
695 | case BUS_NOTIFY_BOUND_DRIVER: | 674 | case BUS_NOTIFY_BOUND_DRIVER: |
696 | if (pdata->dev_desc->save_ctx) | 675 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
697 | pdev->dev.pm_domain = &acpi_lpss_pm_domain; | 676 | pdev->dev.pm_domain = &acpi_lpss_pm_domain; |
698 | break; | 677 | break; |
699 | case BUS_NOTIFY_UNBOUND_DRIVER: | 678 | case BUS_NOTIFY_UNBOUND_DRIVER: |
700 | if (pdata->dev_desc->save_ctx) | 679 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
701 | pdev->dev.pm_domain = NULL; | 680 | pdev->dev.pm_domain = NULL; |
702 | break; | 681 | break; |
703 | case BUS_NOTIFY_ADD_DEVICE: | 682 | case BUS_NOTIFY_ADD_DEVICE: |
704 | if (pdata->dev_desc->ltr_required) | 683 | if (pdata->dev_desc->flags & LPSS_LTR) |
705 | return sysfs_create_group(&pdev->dev.kobj, | 684 | return sysfs_create_group(&pdev->dev.kobj, |
706 | &lpss_attr_group); | 685 | &lpss_attr_group); |
707 | case BUS_NOTIFY_DEL_DEVICE: | 686 | case BUS_NOTIFY_DEL_DEVICE: |
708 | if (pdata->dev_desc->ltr_required) | 687 | if (pdata->dev_desc->flags & LPSS_LTR) |
709 | sysfs_remove_group(&pdev->dev.kobj, &lpss_attr_group); | 688 | sysfs_remove_group(&pdev->dev.kobj, &lpss_attr_group); |
710 | default: | 689 | default: |
711 | break; | 690 | break; |
@@ -722,7 +701,7 @@ static void acpi_lpss_bind(struct device *dev) | |||
722 | { | 701 | { |
723 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | 702 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); |
724 | 703 | ||
725 | if (!pdata || !pdata->mmio_base || !pdata->dev_desc->ltr_required) | 704 | if (!pdata || !pdata->mmio_base || !(pdata->dev_desc->flags & LPSS_LTR)) |
726 | return; | 705 | return; |
727 | 706 | ||
728 | if (pdata->mmio_size >= pdata->dev_desc->prv_offset + LPSS_LTR_SIZE) | 707 | if (pdata->mmio_size >= pdata->dev_desc->prv_offset + LPSS_LTR_SIZE) |