Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
intel_msic.c
Go to the documentation of this file.
1 /*
2  * Driver for Intel MSIC
3  *
4  * Copyright (C) 2011, Intel Corporation
5  * Author: Mika Westerberg <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 
12 #include <linux/gpio.h>
13 #include <linux/io.h>
14 #include <linux/module.h>
15 #include <linux/mfd/core.h>
16 #include <linux/mfd/intel_msic.h>
17 #include <linux/platform_device.h>
18 #include <linux/slab.h>
19 
20 #include <asm/intel_scu_ipc.h>
21 
22 #define MSIC_VENDOR(id) ((id >> 6) & 3)
23 #define MSIC_VERSION(id) (id & 0x3f)
24 #define MSIC_MAJOR(id) ('A' + ((id >> 3) & 7))
25 #define MSIC_MINOR(id) (id & 7)
26 
27 /*
28  * MSIC interrupt tree is readable from SRAM at INTEL_MSIC_IRQ_PHYS_BASE.
29  * Since IRQ block starts from address 0x002 we need to substract that from
30  * the actual IRQ status register address.
31  */
32 #define MSIC_IRQ_STATUS(x) (INTEL_MSIC_IRQ_PHYS_BASE + ((x) - 2))
33 #define MSIC_IRQ_STATUS_ACCDET MSIC_IRQ_STATUS(INTEL_MSIC_ACCDET)
34 
35 /*
36  * The SCU hardware has limitation of 16 bytes per read/write buffer on
37  * Medfield.
38  */
39 #define SCU_IPC_RWBUF_LIMIT 16
40 
48 struct intel_msic {
50  unsigned vendor;
51  unsigned version;
53 };
54 
55 static struct resource msic_touch_resources[] = {
56  {
57  .flags = IORESOURCE_IRQ,
58  },
59 };
60 
61 static struct resource msic_adc_resources[] = {
62  {
63  .flags = IORESOURCE_IRQ,
64  },
65 };
66 
67 static struct resource msic_battery_resources[] = {
68  {
69  .flags = IORESOURCE_IRQ,
70  },
71 };
72 
73 static struct resource msic_gpio_resources[] = {
74  {
75  .flags = IORESOURCE_IRQ,
76  },
77 };
78 
79 static struct resource msic_audio_resources[] = {
80  {
81  .name = "IRQ",
82  .flags = IORESOURCE_IRQ,
83  },
84  /*
85  * We will pass IRQ_BASE to the driver now but this can be removed
86  * when/if the driver starts to use intel_msic_irq_read().
87  */
88  {
89  .name = "IRQ_BASE",
90  .flags = IORESOURCE_MEM,
91  .start = MSIC_IRQ_STATUS_ACCDET,
93  },
94 };
95 
96 static struct resource msic_hdmi_resources[] = {
97  {
98  .flags = IORESOURCE_IRQ,
99  },
100 };
101 
102 static struct resource msic_thermal_resources[] = {
103  {
104  .flags = IORESOURCE_IRQ,
105  },
106 };
107 
108 static struct resource msic_power_btn_resources[] = {
109  {
110  .flags = IORESOURCE_IRQ,
111  },
112 };
113 
114 static struct resource msic_ocd_resources[] = {
115  {
116  .flags = IORESOURCE_IRQ,
117  },
118 };
119 
120 /*
121  * Devices that are part of the MSIC and are available via firmware
122  * populated SFI DEVS table.
123  */
124 static struct mfd_cell msic_devs[] = {
126  .name = "msic_touch",
127  .num_resources = ARRAY_SIZE(msic_touch_resources),
128  .resources = msic_touch_resources,
129  },
131  .name = "msic_adc",
132  .num_resources = ARRAY_SIZE(msic_adc_resources),
133  .resources = msic_adc_resources,
134  },
136  .name = "msic_battery",
137  .num_resources = ARRAY_SIZE(msic_battery_resources),
138  .resources = msic_battery_resources,
139  },
141  .name = "msic_gpio",
142  .num_resources = ARRAY_SIZE(msic_gpio_resources),
143  .resources = msic_gpio_resources,
144  },
146  .name = "msic_audio",
147  .num_resources = ARRAY_SIZE(msic_audio_resources),
148  .resources = msic_audio_resources,
149  },
151  .name = "msic_hdmi",
152  .num_resources = ARRAY_SIZE(msic_hdmi_resources),
153  .resources = msic_hdmi_resources,
154  },
156  .name = "msic_thermal",
157  .num_resources = ARRAY_SIZE(msic_thermal_resources),
158  .resources = msic_thermal_resources,
159  },
161  .name = "msic_power_btn",
162  .num_resources = ARRAY_SIZE(msic_power_btn_resources),
163  .resources = msic_power_btn_resources,
164  },
166  .name = "msic_ocd",
167  .num_resources = ARRAY_SIZE(msic_ocd_resources),
168  .resources = msic_ocd_resources,
169  },
170 };
171 
172 /*
173  * Other MSIC related devices which are not directly available via SFI DEVS
174  * table. These can be pseudo devices, regulators etc. which are needed for
175  * different purposes.
176  *
177  * These devices appear only after the MSIC driver itself is initialized so
178  * we can guarantee that the SCU IPC interface is ready.
179  */
180 static struct mfd_cell msic_other_devs[] = {
181  /* Audio codec in the MSIC */
182  {
183  .id = -1,
184  .name = "sn95031",
185  },
186 };
187 
198 int intel_msic_reg_read(unsigned short reg, u8 *val)
199 {
200  return intel_scu_ipc_ioread8(reg, val);
201 }
203 
214 int intel_msic_reg_write(unsigned short reg, u8 val)
215 {
216  return intel_scu_ipc_iowrite8(reg, val);
217 }
219 
233 int intel_msic_reg_update(unsigned short reg, u8 val, u8 mask)
234 {
235  return intel_scu_ipc_update_register(reg, val, mask);
236 }
238 
253 int intel_msic_bulk_read(unsigned short *reg, u8 *buf, size_t count)
254 {
255  if (WARN_ON(count > SCU_IPC_RWBUF_LIMIT))
256  return -EINVAL;
257 
258  return intel_scu_ipc_readv(reg, buf, count);
259 }
261 
274 int intel_msic_bulk_write(unsigned short *reg, u8 *buf, size_t count)
275 {
276  if (WARN_ON(count > SCU_IPC_RWBUF_LIMIT))
277  return -EINVAL;
278 
279  return intel_scu_ipc_writev(reg, buf, count);
280 }
282 
299 int intel_msic_irq_read(struct intel_msic *msic, unsigned short reg, u8 *val)
300 {
302  return -EINVAL;
303 
304  *val = readb(msic->irq_base + (reg - INTEL_MSIC_IRQLVL1));
305  return 0;
306 }
308 
309 static int __devinit intel_msic_init_devices(struct intel_msic *msic)
310 {
311  struct platform_device *pdev = msic->pdev;
312  struct intel_msic_platform_data *pdata = pdev->dev.platform_data;
313  int ret, i;
314 
315  if (pdata->gpio) {
316  struct mfd_cell *cell = &msic_devs[INTEL_MSIC_BLOCK_GPIO];
317 
318  cell->platform_data = pdata->gpio;
319  cell->pdata_size = sizeof(*pdata->gpio);
320  }
321 
322  if (pdata->ocd) {
323  unsigned gpio = pdata->ocd->gpio;
324 
325  ret = gpio_request_one(gpio, GPIOF_IN, "ocd_gpio");
326  if (ret) {
327  dev_err(&pdev->dev, "failed to register OCD GPIO\n");
328  return ret;
329  }
330 
331  ret = gpio_to_irq(gpio);
332  if (ret < 0) {
333  dev_err(&pdev->dev, "no IRQ number for OCD GPIO\n");
334  gpio_free(gpio);
335  return ret;
336  }
337 
338  /* Update the IRQ number for the OCD */
339  pdata->irq[INTEL_MSIC_BLOCK_OCD] = ret;
340  }
341 
342  for (i = 0; i < ARRAY_SIZE(msic_devs); i++) {
343  if (!pdata->irq[i])
344  continue;
345 
346  ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL,
347  pdata->irq[i], NULL);
348  if (ret)
349  goto fail;
350  }
351 
352  ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs,
353  ARRAY_SIZE(msic_other_devs), NULL, 0, NULL);
354  if (ret)
355  goto fail;
356 
357  return 0;
358 
359 fail:
360  mfd_remove_devices(&pdev->dev);
361  if (pdata->ocd)
362  gpio_free(pdata->ocd->gpio);
363 
364  return ret;
365 }
366 
367 static void __devexit intel_msic_remove_devices(struct intel_msic *msic)
368 {
369  struct platform_device *pdev = msic->pdev;
370  struct intel_msic_platform_data *pdata = pdev->dev.platform_data;
371 
372  mfd_remove_devices(&pdev->dev);
373 
374  if (pdata->ocd)
375  gpio_free(pdata->ocd->gpio);
376 }
377 
378 static int __devinit intel_msic_probe(struct platform_device *pdev)
379 {
380  struct intel_msic_platform_data *pdata = pdev->dev.platform_data;
381  struct intel_msic *msic;
382  struct resource *res;
383  u8 id0, id1;
384  int ret;
385 
386  if (!pdata) {
387  dev_err(&pdev->dev, "no platform data passed\n");
388  return -EINVAL;
389  }
390 
391  /* First validate that we have an MSIC in place */
393  if (ret) {
394  dev_err(&pdev->dev, "failed to identify the MSIC chip (ID0)\n");
395  return -ENXIO;
396  }
397 
399  if (ret) {
400  dev_err(&pdev->dev, "failed to identify the MSIC chip (ID1)\n");
401  return -ENXIO;
402  }
403 
404  if (MSIC_VENDOR(id0) != MSIC_VENDOR(id1)) {
405  dev_err(&pdev->dev, "invalid vendor ID: %x, %x\n", id0, id1);
406  return -ENXIO;
407  }
408 
409  msic = devm_kzalloc(&pdev->dev, sizeof(*msic), GFP_KERNEL);
410  if (!msic)
411  return -ENOMEM;
412 
413  msic->vendor = MSIC_VENDOR(id0);
414  msic->version = MSIC_VERSION(id0);
415  msic->pdev = pdev;
416 
417  /*
418  * Map in the MSIC interrupt tree area in SRAM. This is exposed to
419  * the clients via intel_msic_irq_read().
420  */
421  res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
422  if (!res) {
423  dev_err(&pdev->dev, "failed to get SRAM iomem resource\n");
424  return -ENODEV;
425  }
426 
427  msic->irq_base = devm_request_and_ioremap(&pdev->dev, res);
428  if (!msic->irq_base) {
429  dev_err(&pdev->dev, "failed to map SRAM memory\n");
430  return -ENOMEM;
431  }
432 
433  platform_set_drvdata(pdev, msic);
434 
435  ret = intel_msic_init_devices(msic);
436  if (ret) {
437  dev_err(&pdev->dev, "failed to initialize MSIC devices\n");
438  return ret;
439  }
440 
441  dev_info(&pdev->dev, "Intel MSIC version %c%d (vendor %#x)\n",
442  MSIC_MAJOR(msic->version), MSIC_MINOR(msic->version),
443  msic->vendor);
444 
445  return 0;
446 }
447 
448 static int __devexit intel_msic_remove(struct platform_device *pdev)
449 {
450  struct intel_msic *msic = platform_get_drvdata(pdev);
451 
452  intel_msic_remove_devices(msic);
453  platform_set_drvdata(pdev, NULL);
454 
455  return 0;
456 }
457 
458 static struct platform_driver intel_msic_driver = {
459  .probe = intel_msic_probe,
460  .remove = __devexit_p(intel_msic_remove),
461  .driver = {
462  .name = "intel_msic",
463  .owner = THIS_MODULE,
464  },
465 };
466 
467 module_platform_driver(intel_msic_driver);
468 
469 MODULE_DESCRIPTION("Driver for Intel MSIC");
470 MODULE_AUTHOR("Mika Westerberg <[email protected]>");
471 MODULE_LICENSE("GPL");