2 * Driver for Intel MSIC
4 * Copyright (C) 2011, Intel Corporation
5 * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
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.
12 #include <linux/gpio.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>
20 #include <asm/intel_scu_ipc.h>
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)
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.
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)
36 * The SCU hardware has limitation of 16 bytes per read/write buffer on
39 #define SCU_IPC_RWBUF_LIMIT 16
42 * struct intel_msic - an MSIC MFD instance
43 * @pdev: pointer to the platform device
45 * @version: chip version
46 * @irq_base: base address of the mapped MSIC SRAM interrupt tree
49 struct platform_device
*pdev
;
52 void __iomem
*irq_base
;
55 static struct resource msic_touch_resources
[] = {
57 .flags
= IORESOURCE_IRQ
,
61 static struct resource msic_adc_resources
[] = {
63 .flags
= IORESOURCE_IRQ
,
67 static struct resource msic_battery_resources
[] = {
69 .flags
= IORESOURCE_IRQ
,
73 static struct resource msic_gpio_resources
[] = {
75 .flags
= IORESOURCE_IRQ
,
79 static struct resource msic_audio_resources
[] = {
82 .flags
= IORESOURCE_IRQ
,
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().
90 .flags
= IORESOURCE_MEM
,
91 .start
= MSIC_IRQ_STATUS_ACCDET
,
92 .end
= MSIC_IRQ_STATUS_ACCDET
,
96 static struct resource msic_hdmi_resources
[] = {
98 .flags
= IORESOURCE_IRQ
,
102 static struct resource msic_thermal_resources
[] = {
104 .flags
= IORESOURCE_IRQ
,
108 static struct resource msic_power_btn_resources
[] = {
110 .flags
= IORESOURCE_IRQ
,
114 static struct resource msic_ocd_resources
[] = {
116 .flags
= IORESOURCE_IRQ
,
121 * Devices that are part of the MSIC and are available via firmware
122 * populated SFI DEVS table.
124 static struct mfd_cell msic_devs
[] = {
125 [INTEL_MSIC_BLOCK_TOUCH
] = {
126 .name
= "msic_touch",
127 .num_resources
= ARRAY_SIZE(msic_touch_resources
),
128 .resources
= msic_touch_resources
,
130 [INTEL_MSIC_BLOCK_ADC
] = {
132 .num_resources
= ARRAY_SIZE(msic_adc_resources
),
133 .resources
= msic_adc_resources
,
135 [INTEL_MSIC_BLOCK_BATTERY
] = {
136 .name
= "msic_battery",
137 .num_resources
= ARRAY_SIZE(msic_battery_resources
),
138 .resources
= msic_battery_resources
,
140 [INTEL_MSIC_BLOCK_GPIO
] = {
142 .num_resources
= ARRAY_SIZE(msic_gpio_resources
),
143 .resources
= msic_gpio_resources
,
145 [INTEL_MSIC_BLOCK_AUDIO
] = {
146 .name
= "msic_audio",
147 .num_resources
= ARRAY_SIZE(msic_audio_resources
),
148 .resources
= msic_audio_resources
,
150 [INTEL_MSIC_BLOCK_HDMI
] = {
152 .num_resources
= ARRAY_SIZE(msic_hdmi_resources
),
153 .resources
= msic_hdmi_resources
,
155 [INTEL_MSIC_BLOCK_THERMAL
] = {
156 .name
= "msic_thermal",
157 .num_resources
= ARRAY_SIZE(msic_thermal_resources
),
158 .resources
= msic_thermal_resources
,
160 [INTEL_MSIC_BLOCK_POWER_BTN
] = {
161 .name
= "msic_power_btn",
162 .num_resources
= ARRAY_SIZE(msic_power_btn_resources
),
163 .resources
= msic_power_btn_resources
,
165 [INTEL_MSIC_BLOCK_OCD
] = {
167 .num_resources
= ARRAY_SIZE(msic_ocd_resources
),
168 .resources
= msic_ocd_resources
,
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.
177 * These devices appear only after the MSIC driver itself is initialized so
178 * we can guarantee that the SCU IPC interface is ready.
180 static struct mfd_cell msic_other_devs
[] = {
181 /* Audio codec in the MSIC */
189 * intel_msic_reg_read - read a single MSIC register
190 * @reg: register to read
191 * @val: register value is placed here
193 * Read a single register from MSIC. Returns %0 on success and negative
194 * errno in case of failure.
196 * Function may sleep.
198 int intel_msic_reg_read(unsigned short reg
, u8
*val
)
200 return intel_scu_ipc_ioread8(reg
, val
);
202 EXPORT_SYMBOL_GPL(intel_msic_reg_read
);
205 * intel_msic_reg_write - write a single MSIC register
206 * @reg: register to write
207 * @val: value to write to that register
209 * Write a single MSIC register. Returns 0 on success and negative
210 * errno in case of failure.
212 * Function may sleep.
214 int intel_msic_reg_write(unsigned short reg
, u8 val
)
216 return intel_scu_ipc_iowrite8(reg
, val
);
218 EXPORT_SYMBOL_GPL(intel_msic_reg_write
);
221 * intel_msic_reg_update - update a single MSIC register
222 * @reg: register to update
223 * @val: value to write to the register
224 * @mask: specifies which of the bits are updated (%0 = don't update,
227 * Perform an update to a register @reg. @mask is used to specify which
228 * bits are updated. Returns %0 in case of success and negative errno in
231 * Function may sleep.
233 int intel_msic_reg_update(unsigned short reg
, u8 val
, u8 mask
)
235 return intel_scu_ipc_update_register(reg
, val
, mask
);
237 EXPORT_SYMBOL_GPL(intel_msic_reg_update
);
240 * intel_msic_bulk_read - read an array of registers
241 * @reg: array of register addresses to read
242 * @buf: array where the read values are placed
243 * @count: number of registers to read
245 * Function reads @count registers from the MSIC using addresses passed in
246 * @reg. Read values are placed in @buf. Reads are performed atomically
249 * Returns %0 in case of success and negative errno in case of failure.
251 * Function may sleep.
253 int intel_msic_bulk_read(unsigned short *reg
, u8
*buf
, size_t count
)
255 if (WARN_ON(count
> SCU_IPC_RWBUF_LIMIT
))
258 return intel_scu_ipc_readv(reg
, buf
, count
);
260 EXPORT_SYMBOL_GPL(intel_msic_bulk_read
);
263 * intel_msic_bulk_write - write an array of values to the MSIC registers
264 * @reg: array of registers to write
265 * @buf: values to write to each register
266 * @count: number of registers to write
268 * Function writes @count registers in @buf to MSIC. Writes are performed
269 * atomically wrt MSIC. Returns %0 in case of success and negative errno in
272 * Function may sleep.
274 int intel_msic_bulk_write(unsigned short *reg
, u8
*buf
, size_t count
)
276 if (WARN_ON(count
> SCU_IPC_RWBUF_LIMIT
))
279 return intel_scu_ipc_writev(reg
, buf
, count
);
281 EXPORT_SYMBOL_GPL(intel_msic_bulk_write
);
284 * intel_msic_irq_read - read a register from an MSIC interrupt tree
285 * @msic: MSIC instance
286 * @reg: interrupt register (between %INTEL_MSIC_IRQLVL1 and
287 * %INTEL_MSIC_RESETIRQ2)
288 * @val: value of the register is placed here
290 * This function can be used by an MSIC subdevice interrupt handler to read
291 * a register value from the MSIC interrupt tree. In this way subdevice
292 * drivers don't have to map in the interrupt tree themselves but can just
293 * call this function instead.
295 * Function doesn't sleep and is callable from interrupt context.
297 * Returns %-EINVAL if @reg is outside of the allowed register region.
299 int intel_msic_irq_read(struct intel_msic
*msic
, unsigned short reg
, u8
*val
)
301 if (WARN_ON(reg
< INTEL_MSIC_IRQLVL1
|| reg
> INTEL_MSIC_RESETIRQ2
))
304 *val
= readb(msic
->irq_base
+ (reg
- INTEL_MSIC_IRQLVL1
));
307 EXPORT_SYMBOL_GPL(intel_msic_irq_read
);
309 static int __devinit
intel_msic_init_devices(struct intel_msic
*msic
)
311 struct platform_device
*pdev
= msic
->pdev
;
312 struct intel_msic_platform_data
*pdata
= pdev
->dev
.platform_data
;
316 struct mfd_cell
*cell
= &msic_devs
[INTEL_MSIC_BLOCK_GPIO
];
318 cell
->platform_data
= pdata
->gpio
;
319 cell
->pdata_size
= sizeof(*pdata
->gpio
);
323 unsigned gpio
= pdata
->ocd
->gpio
;
325 ret
= gpio_request_one(gpio
, GPIOF_IN
, "ocd_gpio");
327 dev_err(&pdev
->dev
, "failed to register OCD GPIO\n");
331 ret
= gpio_to_irq(gpio
);
333 dev_err(&pdev
->dev
, "no IRQ number for OCD GPIO\n");
338 /* Update the IRQ number for the OCD */
339 pdata
->irq
[INTEL_MSIC_BLOCK_OCD
] = ret
;
342 for (i
= 0; i
< ARRAY_SIZE(msic_devs
); i
++) {
346 ret
= mfd_add_devices(&pdev
->dev
, -1, &msic_devs
[i
], 1, NULL
,
352 ret
= mfd_add_devices(&pdev
->dev
, 0, msic_other_devs
,
353 ARRAY_SIZE(msic_other_devs
), NULL
, 0);
360 mfd_remove_devices(&pdev
->dev
);
362 gpio_free(pdata
->ocd
->gpio
);
367 static void __devexit
intel_msic_remove_devices(struct intel_msic
*msic
)
369 struct platform_device
*pdev
= msic
->pdev
;
370 struct intel_msic_platform_data
*pdata
= pdev
->dev
.platform_data
;
372 mfd_remove_devices(&pdev
->dev
);
375 gpio_free(pdata
->ocd
->gpio
);
378 static int __devinit
intel_msic_probe(struct platform_device
*pdev
)
380 struct intel_msic_platform_data
*pdata
= pdev
->dev
.platform_data
;
381 struct intel_msic
*msic
;
382 struct resource
*res
;
387 dev_err(&pdev
->dev
, "no platform data passed\n");
391 /* First validate that we have an MSIC in place */
392 ret
= intel_scu_ipc_ioread8(INTEL_MSIC_ID0
, &id0
);
394 dev_err(&pdev
->dev
, "failed to identify the MSIC chip (ID0)\n");
398 ret
= intel_scu_ipc_ioread8(INTEL_MSIC_ID1
, &id1
);
400 dev_err(&pdev
->dev
, "failed to identify the MSIC chip (ID1)\n");
404 if (MSIC_VENDOR(id0
) != MSIC_VENDOR(id1
)) {
405 dev_err(&pdev
->dev
, "invalid vendor ID: %x, %x\n", id0
, id1
);
409 msic
= kzalloc(sizeof(*msic
), GFP_KERNEL
);
413 msic
->vendor
= MSIC_VENDOR(id0
);
414 msic
->version
= MSIC_VERSION(id0
);
418 * Map in the MSIC interrupt tree area in SRAM. This is exposed to
419 * the clients via intel_msic_irq_read().
421 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
423 dev_err(&pdev
->dev
, "failed to get SRAM iomem resource\n");
428 res
= request_mem_region(res
->start
, resource_size(res
), pdev
->name
);
434 msic
->irq_base
= ioremap_nocache(res
->start
, resource_size(res
));
435 if (!msic
->irq_base
) {
436 dev_err(&pdev
->dev
, "failed to map SRAM memory\n");
438 goto fail_release_region
;
441 platform_set_drvdata(pdev
, msic
);
443 ret
= intel_msic_init_devices(msic
);
445 dev_err(&pdev
->dev
, "failed to initialize MSIC devices\n");
449 dev_info(&pdev
->dev
, "Intel MSIC version %c%d (vendor %#x)\n",
450 MSIC_MAJOR(msic
->version
), MSIC_MINOR(msic
->version
),
456 iounmap(msic
->irq_base
);
458 release_mem_region(res
->start
, resource_size(res
));
465 static int __devexit
intel_msic_remove(struct platform_device
*pdev
)
467 struct intel_msic
*msic
= platform_get_drvdata(pdev
);
468 struct resource
*res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
470 intel_msic_remove_devices(msic
);
471 platform_set_drvdata(pdev
, NULL
);
472 iounmap(msic
->irq_base
);
473 release_mem_region(res
->start
, resource_size(res
));
479 static struct platform_driver intel_msic_driver
= {
480 .probe
= intel_msic_probe
,
481 .remove
= __devexit_p(intel_msic_remove
),
483 .name
= "intel_msic",
484 .owner
= THIS_MODULE
,
488 module_platform_driver(intel_msic_driver
);
490 MODULE_DESCRIPTION("Driver for Intel MSIC");
491 MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
492 MODULE_LICENSE("GPL");