aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2014-09-02 03:55:07 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-09-02 19:12:41 -0400
commitff8c1af5e7ebfdf2da5d2063ee34e16a8d05643c (patch)
tree329bb8cee0fcabe919fcf5af864d01376534bdce /drivers/acpi
parent69e273c0b0a3c337a521d083374c918dc52c666f (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.c79
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
57struct lpss_shared_clock { 64struct 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 {
63struct lpss_private_data; 70struct lpss_private_data;
64 71
65struct lpss_device_desc { 72struct 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
78static struct lpss_device_desc lpss_dma_desc = { 81static 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
83struct lpss_private_data { 86struct 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
116static 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
124static struct lpss_device_desc lpt_dev_desc = { 119static 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
132static struct lpss_device_desc lpt_i2c_dev_desc = { 124static 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
139static struct lpss_device_desc lpt_uart_dev_desc = { 129static 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
148static struct lpss_device_desc lpt_sdio_dev_desc = { 135static 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
154static struct lpss_shared_clock pwm_clock = { 141static struct lpss_shared_clock pwm_clock = {
@@ -157,30 +144,23 @@ static struct lpss_shared_clock pwm_clock = {
157}; 144};
158 145
159static struct lpss_device_desc byt_pwm_dev_desc = { 146static 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
165static struct lpss_device_desc byt_uart_dev_desc = { 151static 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
174static struct lpss_device_desc byt_spi_dev_desc = { 157static 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
182static struct lpss_device_desc byt_sdio_dev_desc = { 162static struct lpss_device_desc byt_sdio_dev_desc = {
183 .clk_required = true, 163 .flags = LPSS_CLK,
184}; 164};
185 165
186static struct lpss_shared_clock i2c_clock = { 166static struct lpss_shared_clock i2c_clock = {
@@ -189,9 +169,8 @@ static struct lpss_shared_clock i2c_clock = {
189}; 169};
190 170
191static struct lpss_device_desc byt_i2c_dev_desc = { 171static 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
204static struct lpss_device_desc bsw_pwm_dev_desc = { 183static 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)