15f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/*
25f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *  cb710/cb710.h
35f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
45f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *  Copyright by Michał Mirosław, 2008-2009
55f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
65f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * This program is free software; you can redistribute it and/or modify
75f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * it under the terms of the GNU General Public License version 2 as
85f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * published by the Free Software Foundation.
95f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław */
105f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#ifndef LINUX_CB710_DRIVER_H
115f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define LINUX_CB710_DRIVER_H
125f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
135f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/io.h>
145f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/interrupt.h>
155f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/spinlock.h>
165f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/pci.h>
175f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/platform_device.h>
185f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/mmc/host.h>
195f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
205f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstruct cb710_slot;
215f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
225f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławtypedef int (*cb710_irq_handler_t)(struct cb710_slot *);
235f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
245f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* per-virtual-slot structure */
255f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstruct cb710_slot {
265f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	struct platform_device	pdev;
275f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	void __iomem		*iobase;
285f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	cb710_irq_handler_t	irq_handler;
295f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław};
305f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
315f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* per-device structure */
325f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstruct cb710_chip {
335f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	struct pci_dev		*pdev;
345f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	void __iomem		*iobase;
355f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned		platform_id;
365f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#ifdef CONFIG_CB710_DEBUG_ASSUMPTIONS
375f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	atomic_t		slot_refs_count;
385f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#endif
395f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned		slot_mask;
405f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned		slots;
415f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	spinlock_t		irq_lock;
425f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	struct cb710_slot	slot[0];
435f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław};
445f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
455f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* NOTE: cb710_chip.slots is modified only during device init/exit and
465f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * they are all serialized wrt themselves */
475f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
485f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* cb710_chip.slot_mask values */
495f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_SLOT_MMC		1
505f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_SLOT_MS		2
515f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_SLOT_SM		4
525f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
535f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* slot port accessors - so the logic is more clear in the code */
545f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_PORT_ACCESSORS(t) \
555f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline void cb710_write_port_##t(struct cb710_slot *slot,	\
565f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned port, u##t value)					\
575f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{									\
585f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	iowrite##t(value, slot->iobase + port);				\
595f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}									\
605f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław									\
615f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline u##t cb710_read_port_##t(struct cb710_slot *slot,		\
625f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned port)							\
635f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{									\
645f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	return ioread##t(slot->iobase + port);				\
655f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}									\
665f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław									\
675f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline void cb710_modify_port_##t(struct cb710_slot *slot,	\
685f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	unsigned port, u##t set, u##t clear)				\
695f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{									\
705f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	iowrite##t(							\
715f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław		(ioread##t(slot->iobase + port) & ~clear)|set,		\
725f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław		slot->iobase + port);					\
735f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
745f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
755f5bac8272be791b67c7b7b411e7c8c5847e598aMichał MirosławCB710_PORT_ACCESSORS(8)
765f5bac8272be791b67c7b7b411e7c8c5847e598aMichał MirosławCB710_PORT_ACCESSORS(16)
775f5bac8272be791b67c7b7b411e7c8c5847e598aMichał MirosławCB710_PORT_ACCESSORS(32)
785f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
795f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławvoid cb710_pci_update_config_reg(struct pci_dev *pdev,
805f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	int reg, uint32_t and, uint32_t xor);
815f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławvoid cb710_set_irq_handler(struct cb710_slot *slot,
825f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	cb710_irq_handler_t handler);
835f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
845f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* some device struct walking */
855f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
865f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline struct cb710_slot *cb710_pdev_to_slot(
875f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	struct platform_device *pdev)
885f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
895f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	return container_of(pdev, struct cb710_slot, pdev);
905f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
915f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
925f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline struct cb710_chip *cb710_slot_to_chip(struct cb710_slot *slot)
935f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
945f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	return dev_get_drvdata(slot->pdev.dev.parent);
955f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
965f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
975f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline struct device *cb710_slot_dev(struct cb710_slot *slot)
985f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
995f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	return &slot->pdev.dev;
1005f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
1015f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1025f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline struct device *cb710_chip_dev(struct cb710_chip *chip)
1035f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
1045f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	return &chip->pdev->dev;
1055f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
1065f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1075f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/* debugging aids */
1085f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1095f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#ifdef CONFIG_CB710_DEBUG
1105f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławvoid cb710_dump_regs(struct cb710_chip *chip, unsigned dump);
1115f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#else
1125f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define cb710_dump_regs(c, d) do {} while (0)
1135f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#endif
1145f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1155f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_REGS_MMC	0x0F
1165f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_REGS_MS	0x30
1175f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_REGS_SM	0xC0
1185f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_REGS_ALL	0xFF
1195f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_REGS_MASK	0xFF
1205f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1215f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_ACCESS_8	0x100
1225f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_ACCESS_16	0x200
1235f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_ACCESS_32	0x400
1245f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_ACCESS_ALL	0x700
1255f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define CB710_DUMP_ACCESS_MASK	0x700
1265f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1275f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#endif /* LINUX_CB710_DRIVER_H */
1285f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/*
1295f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *  cb710/sgbuf2.h
1305f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1315f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *  Copyright by Michał Mirosław, 2008-2009
1325f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1335f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * This program is free software; you can redistribute it and/or modify
1345f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * it under the terms of the GNU General Public License version 2 as
1355f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * published by the Free Software Foundation.
1365f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław */
1375f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#ifndef LINUX_CB710_SG_H
1385f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#define LINUX_CB710_SG_H
1395f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1405f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/highmem.h>
1415f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#include <linux/scatterlist.h>
1425f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1435f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/*
1445f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * 32-bit PIO mapping sg iterator
1455f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1465f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Hides scatterlist access issues - fragment boundaries, alignment, page
1475f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * mapping - for drivers using 32-bit-word-at-a-time-PIO (ie. PCI devices
1485f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * without DMA support).
1495f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1505f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Best-case reading (transfer from device):
1514b2a108cd0d34880fe9d932258ca5b2ccebcd05eSebastian Andrzej Siewior *   sg_miter_start(, SG_MITER_TO_SG);
1525f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   cb710_sg_dwiter_write_from_io();
1534b2a108cd0d34880fe9d932258ca5b2ccebcd05eSebastian Andrzej Siewior *   sg_miter_stop();
1545f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1555f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Best-case writing (transfer to device):
1564b2a108cd0d34880fe9d932258ca5b2ccebcd05eSebastian Andrzej Siewior *   sg_miter_start(, SG_MITER_FROM_SG);
1575f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   cb710_sg_dwiter_read_to_io();
1585f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   sg_miter_stop();
1595f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław */
1605f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1615f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławuint32_t cb710_sg_dwiter_read_next_block(struct sg_mapping_iter *miter);
1625f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławvoid cb710_sg_dwiter_write_next_block(struct sg_mapping_iter *miter, uint32_t data);
1635f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1645f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/**
1655f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * cb710_sg_dwiter_write_from_io - transfer data to mapped buffer from 32-bit IO port
1665f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @miter: sg mapping iter
1675f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @port: PIO port - IO or MMIO address
1685f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @count: number of 32-bit words to transfer
1695f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1705f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Description:
1715f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   Reads @count 32-bit words from register @port and stores it in
1725f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   buffer iterated by @miter.  Data that would overflow the buffer
1735f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   is silently ignored.  Iterator is advanced by 4*@count bytes
1745f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   or to the buffer's end whichever is closer.
1755f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1765f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Context:
1775f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   IRQ disabled if the SG_MITER_ATOMIC is set.  Don't care otherwise.
1785f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław */
1795f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline void cb710_sg_dwiter_write_from_io(struct sg_mapping_iter *miter,
1805f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	void __iomem *port, size_t count)
1815f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
1825f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	while (count-- > 0)
1835f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław		cb710_sg_dwiter_write_next_block(miter, ioread32(port));
1845f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
1855f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
1865f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław/**
1875f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * cb710_sg_dwiter_read_to_io - transfer data to 32-bit IO port from mapped buffer
1885f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @miter: sg mapping iter
1895f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @port: PIO port - IO or MMIO address
1905f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * @count: number of 32-bit words to transfer
1915f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1925f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Description:
1935f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   Writes @count 32-bit words to register @port from buffer iterated
1945f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   through @miter.  If buffer ends before @count words are written
1955f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   missing data is replaced by zeroes. @miter is advanced by 4*@count
1965f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   bytes or to the buffer's end whichever is closer.
1975f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *
1985f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław * Context:
1995f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław *   IRQ disabled if the SG_MITER_ATOMIC is set.  Don't care otherwise.
2005f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław */
2015f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosławstatic inline void cb710_sg_dwiter_read_to_io(struct sg_mapping_iter *miter,
2025f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	void __iomem *port, size_t count)
2035f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław{
2045f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław	while (count-- > 0)
2055f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław		iowrite32(cb710_sg_dwiter_read_next_block(miter), port);
2065f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław}
2075f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław
2085f5bac8272be791b67c7b7b411e7c8c5847e598aMichał Mirosław#endif /* LINUX_CB710_SG_H */
209